@generacy-ai/generacy 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/cli/commands/cockpit/clarification-answer-marker.d.ts +8 -0
  2. package/dist/cli/commands/cockpit/clarification-answer-marker.d.ts.map +1 -0
  3. package/dist/cli/commands/cockpit/clarification-answer-marker.js +76 -0
  4. package/dist/cli/commands/cockpit/clarification-answer-marker.js.map +1 -0
  5. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts.map +1 -1
  6. package/dist/cli/commands/cockpit/clarification-comment-finder.js +33 -3
  7. package/dist/cli/commands/cockpit/clarification-comment-finder.js.map +1 -1
  8. package/dist/cli/commands/cockpit/clarify-relay.d.ts +38 -0
  9. package/dist/cli/commands/cockpit/clarify-relay.d.ts.map +1 -0
  10. package/dist/cli/commands/cockpit/clarify-relay.js +120 -0
  11. package/dist/cli/commands/cockpit/clarify-relay.js.map +1 -0
  12. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.d.ts +43 -0
  13. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.d.ts.map +1 -0
  14. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.js +72 -0
  15. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.js.map +1 -0
  16. package/dist/cli/commands/cockpit/doorbell/channel-discovery.d.ts +37 -0
  17. package/dist/cli/commands/cockpit/doorbell/channel-discovery.d.ts.map +1 -0
  18. package/dist/cli/commands/cockpit/doorbell/channel-discovery.js +92 -0
  19. package/dist/cli/commands/cockpit/doorbell/channel-discovery.js.map +1 -0
  20. package/dist/cli/commands/cockpit/doorbell/smee-source.d.ts +73 -0
  21. package/dist/cli/commands/cockpit/doorbell/smee-source.d.ts.map +1 -0
  22. package/dist/cli/commands/cockpit/doorbell/smee-source.js +362 -0
  23. package/dist/cli/commands/cockpit/doorbell/smee-source.js.map +1 -0
  24. package/dist/cli/commands/cockpit/doorbell/source-selector.d.ts +56 -0
  25. package/dist/cli/commands/cockpit/doorbell/source-selector.d.ts.map +1 -0
  26. package/dist/cli/commands/cockpit/doorbell/source-selector.js +182 -0
  27. package/dist/cli/commands/cockpit/doorbell/source-selector.js.map +1 -0
  28. package/dist/cli/commands/cockpit/doorbell/sse-parser.d.ts +15 -0
  29. package/dist/cli/commands/cockpit/doorbell/sse-parser.d.ts.map +1 -0
  30. package/dist/cli/commands/cockpit/doorbell/sse-parser.js +43 -0
  31. package/dist/cli/commands/cockpit/doorbell/sse-parser.js.map +1 -0
  32. package/dist/cli/commands/cockpit/doorbell/startup-retry.d.ts +55 -0
  33. package/dist/cli/commands/cockpit/doorbell/startup-retry.d.ts.map +1 -0
  34. package/dist/cli/commands/cockpit/doorbell/startup-retry.js +159 -0
  35. package/dist/cli/commands/cockpit/doorbell/startup-retry.js.map +1 -0
  36. package/dist/cli/commands/cockpit/doorbell/subscribe.d.ts +19 -0
  37. package/dist/cli/commands/cockpit/doorbell/subscribe.d.ts.map +1 -0
  38. package/dist/cli/commands/cockpit/doorbell/subscribe.js +54 -0
  39. package/dist/cli/commands/cockpit/doorbell/subscribe.js.map +1 -0
  40. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.d.ts +28 -0
  41. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.d.ts.map +1 -0
  42. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.js +159 -0
  43. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.js.map +1 -0
  44. package/dist/cli/commands/cockpit/doorbell.d.ts +58 -0
  45. package/dist/cli/commands/cockpit/doorbell.d.ts.map +1 -0
  46. package/dist/cli/commands/cockpit/doorbell.js +477 -0
  47. package/dist/cli/commands/cockpit/doorbell.js.map +1 -0
  48. package/dist/cli/commands/cockpit/index.d.ts +1 -0
  49. package/dist/cli/commands/cockpit/index.d.ts.map +1 -1
  50. package/dist/cli/commands/cockpit/index.js +3 -0
  51. package/dist/cli/commands/cockpit/index.js.map +1 -1
  52. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts +2 -1
  53. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts.map +1 -1
  54. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js +38 -9
  55. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js.map +1 -1
  56. package/dist/cli/commands/cockpit/mcp/schemas.d.ts +48 -0
  57. package/dist/cli/commands/cockpit/mcp/schemas.d.ts.map +1 -1
  58. package/dist/cli/commands/cockpit/mcp/schemas.js +28 -0
  59. package/dist/cli/commands/cockpit/mcp/schemas.js.map +1 -1
  60. package/dist/cli/commands/cockpit/mcp/server.d.ts.map +1 -1
  61. package/dist/cli/commands/cockpit/mcp/server.js +6 -1
  62. package/dist/cli/commands/cockpit/mcp/server.js.map +1 -1
  63. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.d.ts +45 -0
  64. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.d.ts.map +1 -0
  65. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.js +45 -0
  66. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.js.map +1 -0
  67. package/dist/cli/commands/cockpit/resume.d.ts +12 -6
  68. package/dist/cli/commands/cockpit/resume.d.ts.map +1 -1
  69. package/dist/cli/commands/cockpit/resume.js +27 -11
  70. package/dist/cli/commands/cockpit/resume.js.map +1 -1
  71. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts +2 -0
  72. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts.map +1 -1
  73. package/dist/cli/commands/cockpit/watch/poll-loop.js +38 -6
  74. package/dist/cli/commands/cockpit/watch/poll-loop.js.map +1 -1
  75. package/dist/cli/commands/cockpit/watch/pr-state.d.ts +15 -1
  76. package/dist/cli/commands/cockpit/watch/pr-state.d.ts.map +1 -1
  77. package/dist/cli/commands/cockpit/watch/pr-state.js +38 -0
  78. package/dist/cli/commands/cockpit/watch/pr-state.js.map +1 -1
  79. package/dist/cli/commands/cockpit/watch/snapshot.d.ts +6 -1
  80. package/dist/cli/commands/cockpit/watch/snapshot.d.ts.map +1 -1
  81. package/dist/cli/commands/cockpit/watch/snapshot.js +3 -1
  82. package/dist/cli/commands/cockpit/watch/snapshot.js.map +1 -1
  83. package/dist/cli/commands/cockpit/watch.d.ts +2 -1
  84. package/dist/cli/commands/cockpit/watch.d.ts.map +1 -1
  85. package/dist/cli/commands/cockpit/watch.js +25 -13
  86. package/dist/cli/commands/cockpit/watch.js.map +1 -1
  87. package/package.json +5 -5
@@ -0,0 +1,477 @@
1
+ /**
2
+ * `generacy cockpit doorbell` — wake sensor for `/cockpit:auto`.
3
+ *
4
+ * Owns its own in-process `acquireEpicBus()` call (Q1=C rationale: the
5
+ * cockpit MCP server is stdio-only and cannot accept a second client). On
6
+ * smee-live clusters, the doorbell subscribes to the smee.io SSE stream
7
+ * (real-time-first — revised FR-011, #978) with the poll bus as fallback.
8
+ * One process → one wake source at a time → one stdout line per event.
9
+ *
10
+ * Contract: `contracts/cli-surface.md`, `data-model.md`.
11
+ */
12
+ import { promises as fsPromises } from 'node:fs';
13
+ import { Command } from 'commander';
14
+ import { GhCliWrapper, createGhResponseCache, createRateLimitScheduler, nodeChildProcessRunner, } from '@generacy-ai/cockpit';
15
+ import { acquireEpicBus, } from './mcp/event-bus-registry.js';
16
+ import { subscribeAndEmit, lineForEvent } from './doorbell/subscribe.js';
17
+ import { discoverChannelUrl, DEFAULT_CHANNEL_FILE_PATH, } from './doorbell/channel-discovery.js';
18
+ import { SourceSelector } from './doorbell/source-selector.js';
19
+ import { SmeeDoorbellSource } from './doorbell/smee-source.js';
20
+ import { runStartupRetry } from './doorbell/startup-retry.js';
21
+ export function classifyForm(positional, options) {
22
+ const hasPositional = positional != null && positional.trim() !== '';
23
+ const hasTracking = options.tracking === true;
24
+ const hasNew = options.new != null && options.new.trim() !== '';
25
+ if (hasTracking && hasNew) {
26
+ return { kind: 'conflicting-flags', reason: 'tracking-with-new' };
27
+ }
28
+ if (hasNew) {
29
+ if (hasPositional) {
30
+ return { kind: 'conflicting-flags', reason: 'positional-with-new' };
31
+ }
32
+ return { kind: 'form-3', title: options.new };
33
+ }
34
+ if (!hasPositional) {
35
+ return { kind: 'missing-positional' };
36
+ }
37
+ if (hasTracking) {
38
+ return { kind: 'form-2', ref: positional };
39
+ }
40
+ return { kind: 'form-1', ref: positional };
41
+ }
42
+ function drainStdout(stdout) {
43
+ return new Promise((resolve) => {
44
+ stdout.write('', () => resolve());
45
+ });
46
+ }
47
+ function writeLine(stdout, line) {
48
+ return new Promise((resolve) => {
49
+ stdout.write(line, () => resolve());
50
+ });
51
+ }
52
+ /**
53
+ * Fallback scheduler for tests / callers that do not wire a real
54
+ * rate-limit-aware scheduler. Retry envelope treats absence as "sleep for
55
+ * 1s between attempts and do nothing else".
56
+ */
57
+ function noopScheduler() {
58
+ return {
59
+ getCurrentIntervalMs: () => 1_000,
60
+ probeNow: async () => null,
61
+ noteRetryAfter: () => undefined,
62
+ noteResponseHeaders: () => undefined,
63
+ start: () => undefined,
64
+ stop: () => undefined,
65
+ };
66
+ }
67
+ async function runPollMode(input) {
68
+ const acquire = input.deps.acquireBus ?? acquireEpicBus;
69
+ const acquireOptions = {
70
+ epicRef: input.ref,
71
+ logger: input.logger,
72
+ };
73
+ if (input.deps.runner != null)
74
+ acquireOptions.runner = input.deps.runner;
75
+ if (input.deps.gh != null)
76
+ acquireOptions.gh = input.deps.gh;
77
+ if (input.deps.rateLimitScheduler != null) {
78
+ acquireOptions.rateLimitScheduler = input.deps.rateLimitScheduler;
79
+ }
80
+ const outcome = await runStartupRetry({
81
+ task: () => acquire(acquireOptions),
82
+ label: 'acquireEpicBus',
83
+ rateLimitScheduler: input.deps.rateLimitScheduler ?? noopScheduler(),
84
+ abortSignal: input.retryAbortSignal,
85
+ stderr: input.stderr,
86
+ logger: input.logger,
87
+ });
88
+ if (outcome.kind === 'permanent') {
89
+ return { kind: 'permanent-exit' };
90
+ }
91
+ if (outcome.kind === 'aborted') {
92
+ return null;
93
+ }
94
+ const acquired = outcome.value;
95
+ const onEmit = (event) => {
96
+ if (input.options.exitOnEpicComplete === true &&
97
+ input.form.kind === 'form-1' &&
98
+ event.type === 'epic-complete') {
99
+ input.stop();
100
+ }
101
+ };
102
+ const unsubscribe = subscribeAndEmit(acquired.bus, { stdout: input.stdout, onEmit });
103
+ let released = false;
104
+ const release = () => {
105
+ if (released)
106
+ return;
107
+ released = true;
108
+ unsubscribe();
109
+ acquired.release();
110
+ };
111
+ return {
112
+ release,
113
+ waitForStop: () => input.stopPromise,
114
+ };
115
+ }
116
+ async function runSmeeMode(input) {
117
+ if (input.deps.gh == null) {
118
+ input.logger.warn('cockpit doorbell: smee-mode requires a gh wrapper; falling through');
119
+ return null;
120
+ }
121
+ const gh = input.deps.gh;
122
+ const onEvent = async (event) => {
123
+ await new Promise((resolve) => {
124
+ input.stdout.write(lineForEvent(event), () => resolve());
125
+ });
126
+ if (input.options.exitOnEpicComplete === true &&
127
+ input.form.kind === 'form-1' &&
128
+ event.type === 'epic-complete') {
129
+ input.stop();
130
+ }
131
+ };
132
+ const sourceOptions = {
133
+ channelUrl: input.channelUrl,
134
+ epicRef: input.ref,
135
+ gh,
136
+ logger: input.logger,
137
+ onEvent,
138
+ onReconnectAttempt: (n) => input.selector.onReconnectAttempt(n),
139
+ onReconnectSuccess: () => input.selector.onReconnectSuccess(),
140
+ };
141
+ if (input.deps.runner != null)
142
+ sourceOptions.runner = input.deps.runner;
143
+ const source = input.deps.smeeSourceFactory != null
144
+ ? input.deps.smeeSourceFactory(sourceOptions)
145
+ : new SmeeDoorbellSource(sourceOptions);
146
+ const outcome = await runStartupRetry({
147
+ task: async () => {
148
+ await source.start();
149
+ return null;
150
+ },
151
+ label: 'resolveEpic',
152
+ rateLimitScheduler: input.deps.rateLimitScheduler ?? noopScheduler(),
153
+ abortSignal: input.retryAbortSignal,
154
+ stderr: process.stderr,
155
+ logger: input.logger,
156
+ });
157
+ if (outcome.kind === 'permanent') {
158
+ return { kind: 'permanent-exit' };
159
+ }
160
+ if (outcome.kind === 'aborted') {
161
+ return null;
162
+ }
163
+ return { source };
164
+ }
165
+ export async function runDoorbell(positional, options, deps = {}) {
166
+ const stderr = process.stderr;
167
+ const stdout = deps.stdout ?? process.stdout;
168
+ const exit = deps.exit ??
169
+ ((code) => {
170
+ process.exit(code);
171
+ });
172
+ const form = classifyForm(positional, options);
173
+ if (form.kind === 'missing-positional') {
174
+ stderr.write('cockpit doorbell: parse issue: issue argument is required\n');
175
+ try {
176
+ exit(2);
177
+ }
178
+ catch {
179
+ /* test seam may throw; propagate return */
180
+ }
181
+ return 2;
182
+ }
183
+ if (form.kind === 'conflicting-flags') {
184
+ if (form.reason === 'positional-with-new') {
185
+ stderr.write('cockpit doorbell: --new does not accept a positional argument\n');
186
+ }
187
+ else {
188
+ stderr.write('cockpit doorbell: --tracking and --new are mutually exclusive\n');
189
+ }
190
+ try {
191
+ exit(2);
192
+ }
193
+ catch {
194
+ /* test seam may throw; propagate return */
195
+ }
196
+ return 2;
197
+ }
198
+ const logger = deps.logger ?? { warn: (msg) => process.stderr.write(`${msg}\n`) };
199
+ let stopResolve = () => undefined;
200
+ const stopPromise = new Promise((resolve) => {
201
+ stopResolve = resolve;
202
+ });
203
+ let stopped = false;
204
+ // Signal used to abort startup-retry sleeps promptly on shutdown.
205
+ const retryAbortController = new AbortController();
206
+ const stop = () => {
207
+ if (stopped)
208
+ return;
209
+ stopped = true;
210
+ retryAbortController.abort();
211
+ stopResolve();
212
+ };
213
+ const onSignal = () => {
214
+ stop();
215
+ };
216
+ process.once('SIGINT', onSignal);
217
+ process.once('SIGTERM', onSignal);
218
+ const cleanupSignals = () => {
219
+ process.off('SIGINT', onSignal);
220
+ process.off('SIGTERM', onSignal);
221
+ };
222
+ if (deps.abortSignal != null) {
223
+ if (deps.abortSignal.aborted) {
224
+ stop();
225
+ }
226
+ else {
227
+ deps.abortSignal.addEventListener('abort', onSignal, { once: true });
228
+ }
229
+ }
230
+ // `armed\n` written before source selection (Q5=A / spec-explicit
231
+ // "unconditional, before source selection"). Preserves the shipped
232
+ // contract with agency#431 — the FR-006 `source=…` line on stderr is the
233
+ // "which source settled" signal.
234
+ await writeLine(stdout, 'armed\n');
235
+ if (form.kind === 'form-3') {
236
+ await stopPromise;
237
+ await drainStdout(stdout);
238
+ cleanupSignals();
239
+ try {
240
+ exit(0);
241
+ }
242
+ catch {
243
+ /* test seam may throw */
244
+ }
245
+ return 0;
246
+ }
247
+ const discover = deps.discoverChannel ?? discoverChannelUrl;
248
+ const env = deps.env ?? process.env;
249
+ const fs = deps.fs ?? fsPromises;
250
+ const channelFilePath = deps.channelFilePath ?? DEFAULT_CHANNEL_FILE_PATH;
251
+ // Smee-mode needs a gh wrapper for ref-set resolution and aggregate refreshes.
252
+ // Without one, discovery is wasted work and the code must poll-fallback anyway.
253
+ let discovery = null;
254
+ if (deps.gh != null || deps.discoverChannel != null) {
255
+ try {
256
+ discovery = await discover({
257
+ env,
258
+ channelFilePath,
259
+ fs,
260
+ logger,
261
+ });
262
+ }
263
+ catch {
264
+ discovery = null;
265
+ }
266
+ }
267
+ const selectorOptions = {
268
+ initial: discovery == null ? 'poll-fallback' : 'smee-attempt',
269
+ stderr,
270
+ logger,
271
+ };
272
+ const selector = deps.sourceSelectorFactory != null
273
+ ? deps.sourceSelectorFactory(selectorOptions)
274
+ : new SourceSelector(selectorOptions);
275
+ let pollHandle = null;
276
+ let smeeHandle = null;
277
+ const tearDownActiveSource = async () => {
278
+ if (smeeHandle != null) {
279
+ const s = smeeHandle;
280
+ smeeHandle = null;
281
+ await s.source.stop();
282
+ }
283
+ if (pollHandle != null) {
284
+ const p = pollHandle;
285
+ pollHandle = null;
286
+ p.release();
287
+ }
288
+ };
289
+ const startPollMode = async () => {
290
+ if (pollHandle != null)
291
+ return 'ok';
292
+ const handle = await runPollMode({
293
+ ref: form.ref,
294
+ form,
295
+ options,
296
+ deps,
297
+ logger,
298
+ stdout,
299
+ stderr,
300
+ stopPromise,
301
+ stop,
302
+ retryAbortSignal: retryAbortController.signal,
303
+ });
304
+ if (handle == null)
305
+ return 'transient-fail';
306
+ if ('kind' in handle && handle.kind === 'permanent-exit')
307
+ return 'permanent-exit';
308
+ pollHandle = handle;
309
+ return 'ok';
310
+ };
311
+ const startSmeeMode = async (url) => {
312
+ if (smeeHandle != null)
313
+ return 'ok';
314
+ const handle = await runSmeeMode({
315
+ ref: form.ref,
316
+ form,
317
+ channelUrl: url,
318
+ options,
319
+ deps,
320
+ logger,
321
+ stdout,
322
+ selector,
323
+ stop,
324
+ retryAbortSignal: retryAbortController.signal,
325
+ });
326
+ if (handle == null)
327
+ return 'transient-fail';
328
+ if ('kind' in handle && handle.kind === 'permanent-exit')
329
+ return 'permanent-exit';
330
+ smeeHandle = handle;
331
+ return 'ok';
332
+ };
333
+ // Signals a permanent-error exit from a mode-change branch that runs
334
+ // fire-and-forget. Consumed once at the outer boundary.
335
+ let permanentExit = false;
336
+ selector.onModeChange((next) => {
337
+ if (next === 'poll-fallback') {
338
+ void (async () => {
339
+ if (smeeHandle != null) {
340
+ const s = smeeHandle;
341
+ smeeHandle = null;
342
+ await s.source.stop();
343
+ }
344
+ const outcome = await startPollMode();
345
+ if (outcome === 'permanent-exit') {
346
+ permanentExit = true;
347
+ stop();
348
+ }
349
+ else if (outcome === 'transient-fail')
350
+ stop();
351
+ })();
352
+ }
353
+ else if (next === 'smee-attempt' && discovery != null) {
354
+ void (async () => {
355
+ if (pollHandle != null) {
356
+ const p = pollHandle;
357
+ pollHandle = null;
358
+ p.release();
359
+ }
360
+ const outcome = await startSmeeMode(discovery.url);
361
+ if (outcome === 'permanent-exit') {
362
+ permanentExit = true;
363
+ stop();
364
+ }
365
+ else if (outcome === 'transient-fail') {
366
+ // smee-attempt failed → fall back to poll-mode immediately, without
367
+ // waiting for the demotion counter.
368
+ const pollOutcome = await startPollMode();
369
+ if (pollOutcome === 'permanent-exit') {
370
+ permanentExit = true;
371
+ stop();
372
+ }
373
+ else if (pollOutcome === 'transient-fail')
374
+ stop();
375
+ }
376
+ })();
377
+ }
378
+ });
379
+ if (discovery != null) {
380
+ const outcome = await startSmeeMode(discovery.url);
381
+ if (outcome === 'permanent-exit') {
382
+ selector.stop();
383
+ cleanupSignals();
384
+ try {
385
+ exit(3);
386
+ }
387
+ catch {
388
+ /* test seam may throw */
389
+ }
390
+ return 3;
391
+ }
392
+ if (outcome === 'transient-fail') {
393
+ const pollOutcome = await startPollMode();
394
+ if (pollOutcome === 'permanent-exit') {
395
+ selector.stop();
396
+ cleanupSignals();
397
+ try {
398
+ exit(3);
399
+ }
400
+ catch {
401
+ /* test seam may throw */
402
+ }
403
+ return 3;
404
+ }
405
+ if (pollOutcome === 'transient-fail' && !stopped) {
406
+ selector.stop();
407
+ cleanupSignals();
408
+ try {
409
+ exit(2);
410
+ }
411
+ catch {
412
+ /* test seam may throw */
413
+ }
414
+ return 2;
415
+ }
416
+ }
417
+ }
418
+ else {
419
+ const outcome = await startPollMode();
420
+ if (outcome === 'permanent-exit') {
421
+ selector.stop();
422
+ cleanupSignals();
423
+ try {
424
+ exit(3);
425
+ }
426
+ catch {
427
+ /* test seam may throw */
428
+ }
429
+ return 3;
430
+ }
431
+ if (outcome === 'transient-fail' && !stopped) {
432
+ selector.stop();
433
+ cleanupSignals();
434
+ try {
435
+ exit(2);
436
+ }
437
+ catch {
438
+ /* test seam may throw */
439
+ }
440
+ return 2;
441
+ }
442
+ }
443
+ await stopPromise;
444
+ await tearDownActiveSource();
445
+ selector.stop();
446
+ await drainStdout(stdout);
447
+ cleanupSignals();
448
+ const finalCode = permanentExit ? 3 : 0;
449
+ try {
450
+ exit(finalCode);
451
+ }
452
+ catch {
453
+ /* test seam may throw */
454
+ }
455
+ return finalCode;
456
+ }
457
+ export function doorbellCommand() {
458
+ return new Command('doorbell')
459
+ .description('Wake sensor for /cockpit:auto. Emits one stdout line per epic bus event.')
460
+ .argument('[epic-ref]', 'Epic ref (Form 1) or tracking-issue ref (Form 2). Omitted under --new.')
461
+ .option('--tracking', 'Positional is a tracking-issue ref; subscribe the tracking-ref bus.', false)
462
+ .option('--new <title>', 'No subscription; arm as a placeholder before the tracking issue exists.')
463
+ .option('--exit-on-epic-complete', 'Exit 0 after flushing the epic-complete line. Off by default.', false)
464
+ .action(async (epicRef, options) => {
465
+ const runner = nodeChildProcessRunner;
466
+ const cache = createGhResponseCache();
467
+ const rateLimitScheduler = createRateLimitScheduler({ runner });
468
+ const gh = new GhCliWrapper(runner, undefined, { cache, rateLimitScheduler });
469
+ const code = await runDoorbell(epicRef, options, {
470
+ runner,
471
+ gh,
472
+ rateLimitScheduler,
473
+ });
474
+ process.exit(code);
475
+ });
476
+ }
477
+ //# sourceMappingURL=doorbell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doorbell.js","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/doorbell.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Observability verbs (read-only) for Generacy epics and repos:
5
5
  * - watch — poll an epic's issues/PRs and emit cockpit events on state changes
6
+ * - doorbell — wake sensor for /cockpit:auto; one stdout line per epic bus event
6
7
  * - status — render a grouped, colorized table of the epic's current state
7
8
  *
8
9
  * Single-issue verbs that inspect and drive workflow state for one issue:
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,cAAc,IAAI,OAAO,CAexC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,cAAc,IAAI,OAAO,CAgBxC"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Observability verbs (read-only) for Generacy epics and repos:
5
5
  * - watch — poll an epic's issues/PRs and emit cockpit events on state changes
6
+ * - doorbell — wake sensor for /cockpit:auto; one stdout line per epic bus event
6
7
  * - status — render a grouped, colorized table of the epic's current state
7
8
  *
8
9
  * Single-issue verbs that inspect and drive workflow state for one issue:
@@ -17,6 +18,7 @@
17
18
  */
18
19
  import { Command } from 'commander';
19
20
  import { watchCommand } from './watch.js';
21
+ import { doorbellCommand } from './doorbell.js';
20
22
  import { statusCommand } from './status.js';
21
23
  import { advanceCommand } from './advance.js';
22
24
  import { contextCommand } from './context.js';
@@ -29,6 +31,7 @@ export function cockpitCommand() {
29
31
  const command = new Command('cockpit');
30
32
  command.description('Cockpit — inspect and drive workflow state for Generacy epics and issues.');
31
33
  command.addCommand(watchCommand());
34
+ command.addCommand(doorbellCommand());
32
35
  command.addCommand(statusCommand());
33
36
  command.addCommand(advanceCommand());
34
37
  command.addCommand(contextCommand());
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,WAAW,CAAC,2EAA2E,CAAC,CAAC;IAEjG,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,WAAW,CAAC,2EAA2E,CAAC,CAAC;IAEjG,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -17,13 +17,14 @@
17
17
  * `COCKPIT_MCP_BUS_IDLE_TTL_MS` — idle-TTL for refcount-0 buses (default 600_000).
18
18
  * `COCKPIT_MCP_BUS_MAX` — soft cap on live buses (default 100).
19
19
  */
20
- import { type CommandRunner, type GhWrapper } from '@generacy-ai/cockpit';
20
+ import { type CommandRunner, type GhWrapper, type RateLimitScheduler } from '@generacy-ai/cockpit';
21
21
  import { EpicEventBus } from './event-bus.js';
22
22
  export interface AcquireOptions {
23
23
  epicRef: string;
24
24
  runner?: CommandRunner;
25
25
  gh?: GhWrapper;
26
26
  intervalMs?: number;
27
+ rateLimitScheduler?: RateLimitScheduler;
27
28
  logger?: {
28
29
  warn: (msg: string) => void;
29
30
  info?: (msg: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus-registry.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/mcp/event-bus-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EAEf,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAgD9C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvE;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,YAAY,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkJ/E;AA2JD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}
1
+ {"version":3,"file":"event-bus-registry.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/mcp/event-bus-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,kBAAkB,EAExB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoD9C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvE;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,YAAY,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6J/E;AA8KD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}