@generacy-ai/generacy 0.5.0 → 0.7.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 (105) 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 +0 -10
  6. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts.map +1 -1
  7. package/dist/cli/commands/cockpit/clarification-comment-finder.js +57 -4
  8. package/dist/cli/commands/cockpit/clarification-comment-finder.js.map +1 -1
  9. package/dist/cli/commands/cockpit/clarify-relay.d.ts +38 -0
  10. package/dist/cli/commands/cockpit/clarify-relay.d.ts.map +1 -0
  11. package/dist/cli/commands/cockpit/clarify-relay.js +120 -0
  12. package/dist/cli/commands/cockpit/clarify-relay.js.map +1 -0
  13. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.d.ts +43 -0
  14. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.d.ts.map +1 -0
  15. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.js +72 -0
  16. package/dist/cli/commands/cockpit/doorbell/aggregate-on-demand.js.map +1 -0
  17. package/dist/cli/commands/cockpit/doorbell/channel-discovery.d.ts +103 -0
  18. package/dist/cli/commands/cockpit/doorbell/channel-discovery.d.ts.map +1 -0
  19. package/dist/cli/commands/cockpit/doorbell/channel-discovery.js +168 -0
  20. package/dist/cli/commands/cockpit/doorbell/channel-discovery.js.map +1 -0
  21. package/dist/cli/commands/cockpit/doorbell/smee-source.d.ts +73 -0
  22. package/dist/cli/commands/cockpit/doorbell/smee-source.d.ts.map +1 -0
  23. package/dist/cli/commands/cockpit/doorbell/smee-source.js +405 -0
  24. package/dist/cli/commands/cockpit/doorbell/smee-source.js.map +1 -0
  25. package/dist/cli/commands/cockpit/doorbell/source-selector.d.ts +61 -0
  26. package/dist/cli/commands/cockpit/doorbell/source-selector.d.ts.map +1 -0
  27. package/dist/cli/commands/cockpit/doorbell/source-selector.js +208 -0
  28. package/dist/cli/commands/cockpit/doorbell/source-selector.js.map +1 -0
  29. package/dist/cli/commands/cockpit/doorbell/sse-parser.d.ts +15 -0
  30. package/dist/cli/commands/cockpit/doorbell/sse-parser.d.ts.map +1 -0
  31. package/dist/cli/commands/cockpit/doorbell/sse-parser.js +43 -0
  32. package/dist/cli/commands/cockpit/doorbell/sse-parser.js.map +1 -0
  33. package/dist/cli/commands/cockpit/doorbell/startup-retry.d.ts +55 -0
  34. package/dist/cli/commands/cockpit/doorbell/startup-retry.d.ts.map +1 -0
  35. package/dist/cli/commands/cockpit/doorbell/startup-retry.js +159 -0
  36. package/dist/cli/commands/cockpit/doorbell/startup-retry.js.map +1 -0
  37. package/dist/cli/commands/cockpit/doorbell/subscribe.d.ts +19 -0
  38. package/dist/cli/commands/cockpit/doorbell/subscribe.d.ts.map +1 -0
  39. package/dist/cli/commands/cockpit/doorbell/subscribe.js +54 -0
  40. package/dist/cli/commands/cockpit/doorbell/subscribe.js.map +1 -0
  41. package/dist/cli/commands/cockpit/doorbell/webhook-target-resolver.d.ts +20 -0
  42. package/dist/cli/commands/cockpit/doorbell/webhook-target-resolver.d.ts.map +1 -0
  43. package/dist/cli/commands/cockpit/doorbell/webhook-target-resolver.js +51 -0
  44. package/dist/cli/commands/cockpit/doorbell/webhook-target-resolver.js.map +1 -0
  45. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.d.ts +28 -0
  46. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.d.ts.map +1 -0
  47. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.js +162 -0
  48. package/dist/cli/commands/cockpit/doorbell/webhook-to-event.js.map +1 -0
  49. package/dist/cli/commands/cockpit/doorbell.d.ts +58 -0
  50. package/dist/cli/commands/cockpit/doorbell.d.ts.map +1 -0
  51. package/dist/cli/commands/cockpit/doorbell.js +519 -0
  52. package/dist/cli/commands/cockpit/doorbell.js.map +1 -0
  53. package/dist/cli/commands/cockpit/index.d.ts +1 -0
  54. package/dist/cli/commands/cockpit/index.d.ts.map +1 -1
  55. package/dist/cli/commands/cockpit/index.js +3 -0
  56. package/dist/cli/commands/cockpit/index.js.map +1 -1
  57. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts +3 -2
  58. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts.map +1 -1
  59. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js +41 -12
  60. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js.map +1 -1
  61. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts +6 -0
  62. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts.map +1 -1
  63. package/dist/cli/commands/cockpit/mcp/event-bus.js +7 -1
  64. package/dist/cli/commands/cockpit/mcp/event-bus.js.map +1 -1
  65. package/dist/cli/commands/cockpit/mcp/schemas.d.ts +48 -0
  66. package/dist/cli/commands/cockpit/mcp/schemas.d.ts.map +1 -1
  67. package/dist/cli/commands/cockpit/mcp/schemas.js +28 -0
  68. package/dist/cli/commands/cockpit/mcp/schemas.js.map +1 -1
  69. package/dist/cli/commands/cockpit/mcp/server.d.ts.map +1 -1
  70. package/dist/cli/commands/cockpit/mcp/server.js +6 -1
  71. package/dist/cli/commands/cockpit/mcp/server.js.map +1 -1
  72. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.d.ts +45 -0
  73. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.d.ts.map +1 -0
  74. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.js +45 -0
  75. package/dist/cli/commands/cockpit/mcp/tools/cockpit_relay_clarify_answers.js.map +1 -0
  76. package/dist/cli/commands/cockpit/resume.d.ts +12 -6
  77. package/dist/cli/commands/cockpit/resume.d.ts.map +1 -1
  78. package/dist/cli/commands/cockpit/resume.js +27 -11
  79. package/dist/cli/commands/cockpit/resume.js.map +1 -1
  80. package/dist/cli/commands/cockpit/watch/diff.d.ts +1 -0
  81. package/dist/cli/commands/cockpit/watch/diff.d.ts.map +1 -1
  82. package/dist/cli/commands/cockpit/watch/diff.js.map +1 -1
  83. package/dist/cli/commands/cockpit/watch/emit.d.ts +3 -0
  84. package/dist/cli/commands/cockpit/watch/emit.d.ts.map +1 -1
  85. package/dist/cli/commands/cockpit/watch/emit.js +1 -0
  86. package/dist/cli/commands/cockpit/watch/emit.js.map +1 -1
  87. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts +2 -0
  88. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts.map +1 -1
  89. package/dist/cli/commands/cockpit/watch/poll-loop.js +38 -6
  90. package/dist/cli/commands/cockpit/watch/poll-loop.js.map +1 -1
  91. package/dist/cli/commands/cockpit/watch/pr-state.d.ts +15 -1
  92. package/dist/cli/commands/cockpit/watch/pr-state.d.ts.map +1 -1
  93. package/dist/cli/commands/cockpit/watch/pr-state.js +38 -0
  94. package/dist/cli/commands/cockpit/watch/pr-state.js.map +1 -1
  95. package/dist/cli/commands/cockpit/watch/snapshot.d.ts +6 -1
  96. package/dist/cli/commands/cockpit/watch/snapshot.d.ts.map +1 -1
  97. package/dist/cli/commands/cockpit/watch/snapshot.js +3 -1
  98. package/dist/cli/commands/cockpit/watch/snapshot.js.map +1 -1
  99. package/dist/cli/commands/cockpit/watch/stream-event.d.ts +3 -0
  100. package/dist/cli/commands/cockpit/watch/stream-event.d.ts.map +1 -1
  101. package/dist/cli/commands/cockpit/watch.d.ts +2 -1
  102. package/dist/cli/commands/cockpit/watch.d.ts.map +1 -1
  103. package/dist/cli/commands/cockpit/watch.js +25 -13
  104. package/dist/cli/commands/cockpit/watch.js.map +1 -1
  105. package/package.json +6 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smee-source.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/smee-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `SourceSelector` — owns the runtime demotion/re-promotion state for the
3
+ * doorbell's wake source (Q3=D policy). Emits exactly one FR-006 `source=…`
4
+ * stderr line per transition.
5
+ *
6
+ * Contract: `specs/978-summary-generacy-cockpit/contracts/source-selector.md`.
7
+ */
8
+ export type SourceMode = 'smee-attempt' | 'smee-active' | 'poll-fallback';
9
+ export type SourceReason = 'startup-no-channel' | 'startup-smee-selected' | 'startup-smee-failed' | 'smee-runtime-lost' | 'smee-re-promoted';
10
+ export interface SourceSelectorOptions {
11
+ initial: 'smee-attempt' | 'poll-fallback';
12
+ stderr: {
13
+ write(chunk: string): boolean | void;
14
+ };
15
+ logger?: {
16
+ warn: (msg: string) => void;
17
+ info?: (msg: string) => void;
18
+ };
19
+ demoteAfterConsecutiveFailures?: number;
20
+ demoteAfterMsWithoutSuccess?: number;
21
+ rePromoteIntervalMs?: number;
22
+ now?: () => number;
23
+ }
24
+ export type ModeChangeCallback = (next: SourceMode, reason: SourceReason) => void;
25
+ export declare const DEFAULT_DEMOTE_AFTER_FAILURES = 5;
26
+ export declare const DEFAULT_DEMOTE_AFTER_MS_WITHOUT_SUCCESS = 90000;
27
+ export declare const DEFAULT_RE_PROMOTE_INTERVAL_MS = 300000;
28
+ export declare class SourceSelector {
29
+ private _current;
30
+ private consecutiveReconnectFailures;
31
+ private lastSuccessfulConnectAt;
32
+ private demotedAt;
33
+ private rePromoteTimer;
34
+ private elapsedTicker;
35
+ private modeChangeCbs;
36
+ private stopped;
37
+ private readonly initialWasSmee;
38
+ private readonly demoteAfterFailures;
39
+ private readonly demoteAfterMsWithoutSuccess;
40
+ private readonly rePromoteIntervalMs;
41
+ private readonly now;
42
+ private readonly stderr;
43
+ private readonly logger?;
44
+ private pendingRePromoteEmit;
45
+ constructor(options: SourceSelectorOptions);
46
+ get currentSource(): SourceMode;
47
+ onModeChange(cb: ModeChangeCallback): void;
48
+ onReconnectAttempt(failedAttempts: number): void;
49
+ onReconnectSuccess(): void;
50
+ /** Refresh liveness on inbound SSE bytes (keepalive comments or payloads). */
51
+ onSseBytes(): void;
52
+ /** Startup `startSmeeMode` returned `transient-fail`: transition to the live
53
+ * poll-fallback bridge so `rePromoteTimer` arms and stdout keeps flowing. */
54
+ markStartupSmeeFailed(): void;
55
+ observeElapsed(): void;
56
+ stop(): void;
57
+ private transition;
58
+ private tickRePromote;
59
+ private writeLine;
60
+ }
61
+ //# sourceMappingURL=source-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-selector.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/source-selector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG,eAAe,CAAC;AAE1E,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,GAAG,eAAe,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,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,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AAElF,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAC9D,eAAO,MAAM,8BAA8B,SAAU,CAAC;AAQtD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,4BAA4B,CAAK;IACzC,OAAO,CAAC,uBAAuB,CAAuB;IACtD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAgE;IACxF,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,OAAO,EAAE,qBAAqB;IAuB1C,IAAI,aAAa,IAAI,UAAU,CAE9B;IAED,YAAY,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI;IAI1C,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAShD,kBAAkB,IAAI,IAAI;IA8B1B,8EAA8E;IAC9E,UAAU,IAAI,IAAI;IAMlB;iFAC6E;IAC7E,qBAAqB,IAAI,IAAI;IAM7B,cAAc,IAAI,IAAI;IAUtB,IAAI,IAAI,IAAI;IAaZ,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,SAAS;CAOlB"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * `SourceSelector` — owns the runtime demotion/re-promotion state for the
3
+ * doorbell's wake source (Q3=D policy). Emits exactly one FR-006 `source=…`
4
+ * stderr line per transition.
5
+ *
6
+ * Contract: `specs/978-summary-generacy-cockpit/contracts/source-selector.md`.
7
+ */
8
+ export const DEFAULT_DEMOTE_AFTER_FAILURES = 5;
9
+ export const DEFAULT_DEMOTE_AFTER_MS_WITHOUT_SUCCESS = 90_000;
10
+ export const DEFAULT_RE_PROMOTE_INTERVAL_MS = 300_000;
11
+ const ELAPSED_TICKER_INTERVAL_MS = 1_000;
12
+ function formatLine(next, reason) {
13
+ const label = next === 'poll-fallback' ? 'poll-fallback' : 'smee';
14
+ return `cockpit doorbell: source=${label} reason=${reason}\n`;
15
+ }
16
+ export class SourceSelector {
17
+ _current;
18
+ consecutiveReconnectFailures = 0;
19
+ lastSuccessfulConnectAt = null;
20
+ demotedAt = null;
21
+ rePromoteTimer = null;
22
+ elapsedTicker = null;
23
+ modeChangeCbs = [];
24
+ stopped = false;
25
+ initialWasSmee;
26
+ demoteAfterFailures;
27
+ demoteAfterMsWithoutSuccess;
28
+ rePromoteIntervalMs;
29
+ now;
30
+ stderr;
31
+ logger;
32
+ pendingRePromoteEmit = false;
33
+ constructor(options) {
34
+ this.initialWasSmee = options.initial === 'smee-attempt';
35
+ this.demoteAfterFailures =
36
+ options.demoteAfterConsecutiveFailures ?? DEFAULT_DEMOTE_AFTER_FAILURES;
37
+ this.demoteAfterMsWithoutSuccess =
38
+ options.demoteAfterMsWithoutSuccess ?? DEFAULT_DEMOTE_AFTER_MS_WITHOUT_SUCCESS;
39
+ this.rePromoteIntervalMs =
40
+ options.rePromoteIntervalMs ?? DEFAULT_RE_PROMOTE_INTERVAL_MS;
41
+ this.now = options.now ?? (() => Date.now());
42
+ this.stderr = options.stderr;
43
+ if (options.logger != null)
44
+ this.logger = options.logger;
45
+ this._current = options.initial;
46
+ const startupReason = options.initial === 'smee-attempt' ? 'startup-smee-selected' : 'startup-no-channel';
47
+ this.writeLine(this._current, startupReason);
48
+ if (this.initialWasSmee) {
49
+ this.elapsedTicker = setInterval(() => this.observeElapsed(), ELAPSED_TICKER_INTERVAL_MS);
50
+ if (typeof this.elapsedTicker.unref === 'function')
51
+ this.elapsedTicker.unref();
52
+ }
53
+ }
54
+ get currentSource() {
55
+ return this._current;
56
+ }
57
+ onModeChange(cb) {
58
+ this.modeChangeCbs.push(cb);
59
+ }
60
+ onReconnectAttempt(failedAttempts) {
61
+ if (this.stopped)
62
+ return;
63
+ this.consecutiveReconnectFailures = failedAttempts;
64
+ if (this._current !== 'smee-active' && this._current !== 'smee-attempt')
65
+ return;
66
+ if (failedAttempts >= this.demoteAfterFailures && this._current === 'smee-active') {
67
+ this.transition('poll-fallback', 'smee-runtime-lost');
68
+ }
69
+ }
70
+ onReconnectSuccess() {
71
+ if (this.stopped)
72
+ return;
73
+ this.consecutiveReconnectFailures = 0;
74
+ this.lastSuccessfulConnectAt = this.now();
75
+ if (this._current === 'smee-attempt') {
76
+ const shouldEmit = this.pendingRePromoteEmit;
77
+ this.pendingRePromoteEmit = false;
78
+ if (shouldEmit) {
79
+ this.transition('smee-active', 'smee-re-promoted');
80
+ }
81
+ else {
82
+ this._current = 'smee-active';
83
+ for (const cb of this.modeChangeCbs) {
84
+ try {
85
+ cb('smee-active', 'startup-smee-selected');
86
+ }
87
+ catch {
88
+ /* callback errors are swallowed */
89
+ }
90
+ }
91
+ }
92
+ }
93
+ else if (this._current === 'poll-fallback') {
94
+ // Runtime bridge exit: background smee reconnect succeeded → jump
95
+ // directly back to smee-active, skipping smee-attempt.
96
+ if (this.rePromoteTimer != null) {
97
+ clearInterval(this.rePromoteTimer);
98
+ this.rePromoteTimer = null;
99
+ }
100
+ this.transition('smee-active', 'smee-re-promoted');
101
+ }
102
+ }
103
+ /** Refresh liveness on inbound SSE bytes (keepalive comments or payloads). */
104
+ onSseBytes() {
105
+ if (this.stopped)
106
+ return;
107
+ if (this._current !== 'smee-active')
108
+ return;
109
+ this.lastSuccessfulConnectAt = this.now();
110
+ }
111
+ /** Startup `startSmeeMode` returned `transient-fail`: transition to the live
112
+ * poll-fallback bridge so `rePromoteTimer` arms and stdout keeps flowing. */
113
+ markStartupSmeeFailed() {
114
+ if (this.stopped)
115
+ return;
116
+ if (this._current !== 'smee-attempt')
117
+ return;
118
+ this.transition('poll-fallback', 'startup-smee-failed');
119
+ }
120
+ observeElapsed() {
121
+ if (this.stopped)
122
+ return;
123
+ if (this._current !== 'smee-active')
124
+ return;
125
+ if (this.lastSuccessfulConnectAt == null)
126
+ return;
127
+ const elapsed = this.now() - this.lastSuccessfulConnectAt;
128
+ if (elapsed > this.demoteAfterMsWithoutSuccess) {
129
+ this.transition('poll-fallback', 'smee-runtime-lost');
130
+ }
131
+ }
132
+ stop() {
133
+ if (this.stopped)
134
+ return;
135
+ this.stopped = true;
136
+ if (this.elapsedTicker != null) {
137
+ clearInterval(this.elapsedTicker);
138
+ this.elapsedTicker = null;
139
+ }
140
+ if (this.rePromoteTimer != null) {
141
+ clearInterval(this.rePromoteTimer);
142
+ this.rePromoteTimer = null;
143
+ }
144
+ }
145
+ transition(next, reason) {
146
+ if (this._current === next)
147
+ return;
148
+ const prev = this._current;
149
+ this._current = next;
150
+ if (next === 'poll-fallback') {
151
+ this.demotedAt = this.now();
152
+ if (this.initialWasSmee && this.rePromoteTimer == null) {
153
+ this.rePromoteTimer = setInterval(() => this.tickRePromote(), this.rePromoteIntervalMs);
154
+ if (typeof this.rePromoteTimer.unref === 'function')
155
+ this.rePromoteTimer.unref();
156
+ }
157
+ }
158
+ else if (next === 'smee-attempt' && prev === 'poll-fallback') {
159
+ // moving out of poll-fallback via the re-promote timer
160
+ if (this.rePromoteTimer != null) {
161
+ clearInterval(this.rePromoteTimer);
162
+ this.rePromoteTimer = null;
163
+ }
164
+ }
165
+ for (const cb of this.modeChangeCbs) {
166
+ try {
167
+ cb(next, reason);
168
+ }
169
+ catch {
170
+ /* callback errors are swallowed */
171
+ }
172
+ }
173
+ this.writeLine(next, reason);
174
+ }
175
+ tickRePromote() {
176
+ if (this.stopped)
177
+ return;
178
+ if (this._current !== 'poll-fallback')
179
+ return;
180
+ // Silent transition to smee-attempt; the eventual line is emitted only if
181
+ // the reconnect succeeds (smee-re-promoted).
182
+ if (this.rePromoteTimer != null) {
183
+ clearInterval(this.rePromoteTimer);
184
+ this.rePromoteTimer = null;
185
+ }
186
+ this._current = 'smee-attempt';
187
+ this.pendingRePromoteEmit = true;
188
+ this.consecutiveReconnectFailures = 0;
189
+ this.demotedAt = null;
190
+ for (const cb of this.modeChangeCbs) {
191
+ try {
192
+ cb('smee-attempt', 'smee-re-promoted');
193
+ }
194
+ catch {
195
+ /* callback errors are swallowed */
196
+ }
197
+ }
198
+ }
199
+ writeLine(next, reason) {
200
+ try {
201
+ this.stderr.write(formatLine(next, reason));
202
+ }
203
+ catch {
204
+ /* stderr write failures are swallowed */
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=source-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-selector.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/source-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `parseSseEventBlock` — parses one SSE frame block from smee.io.
3
+ *
4
+ * Matches the inline parser in
5
+ * `packages/orchestrator/src/services/smee-receiver.ts`. Extracts the
6
+ * `x-github-event` and `body.action` discriminators plus the full body object,
7
+ * dropping `ready`/`ping` heartbeat frames silently. Malformed JSON → null.
8
+ */
9
+ export interface NormalizedPayload {
10
+ githubEvent: string;
11
+ action: string;
12
+ body: Record<string, unknown>;
13
+ }
14
+ export declare function parseSseEventBlock(text: string): NormalizedPayload | null;
15
+ //# sourceMappingURL=sse-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parser.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/sse-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAoCzE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `parseSseEventBlock` — parses one SSE frame block from smee.io.
3
+ *
4
+ * Matches the inline parser in
5
+ * `packages/orchestrator/src/services/smee-receiver.ts`. Extracts the
6
+ * `x-github-event` and `body.action` discriminators plus the full body object,
7
+ * dropping `ready`/`ping` heartbeat frames silently. Malformed JSON → null.
8
+ */
9
+ export function parseSseEventBlock(text) {
10
+ let eventType = '';
11
+ const dataLines = [];
12
+ for (const line of text.split('\n')) {
13
+ if (line.startsWith('event:')) {
14
+ eventType = line.slice(6).trim();
15
+ }
16
+ else if (line.startsWith('data:')) {
17
+ dataLines.push(line.slice(5).trim());
18
+ }
19
+ }
20
+ if (eventType !== 'message' && eventType !== '') {
21
+ return null;
22
+ }
23
+ const dataStr = dataLines.join('\n');
24
+ if (!dataStr)
25
+ return null;
26
+ let data;
27
+ try {
28
+ data = JSON.parse(dataStr);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ const githubEvent = data['x-github-event'];
34
+ if (typeof githubEvent !== 'string' || githubEvent === '')
35
+ return null;
36
+ const rawBody = data['body'];
37
+ if (rawBody == null || typeof rawBody !== 'object')
38
+ return null;
39
+ const body = rawBody;
40
+ const action = typeof body['action'] === 'string' ? body['action'] : '';
41
+ return { githubEvent, action, body };
42
+ }
43
+ //# sourceMappingURL=sse-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parser.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/sse-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAEvE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,OAAkC,CAAC;IAEhD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,QAAQ,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `runStartupRetry` — envelope around a Promise-returning startup task that
3
+ * survives transient failures and exits distinctively on permanent ones.
4
+ * Replaces the doorbell's silent `exit(2)` on first-hiccup failure.
5
+ *
6
+ * Contract: `specs/980-summary-978-shipped-working/contracts/startup-retry.md`.
7
+ */
8
+ import type { RateLimitScheduler } from '@generacy-ai/cockpit';
9
+ export type GhErrorClass = {
10
+ kind: 'retriable';
11
+ hint: string;
12
+ } | {
13
+ kind: 'permanent';
14
+ reason: string;
15
+ };
16
+ export type StartupRetryLabel = 'acquireEpicBus' | 'resolveEpic';
17
+ export interface StartupRetryOptions<T> {
18
+ task: () => Promise<T>;
19
+ label: StartupRetryLabel;
20
+ rateLimitScheduler: RateLimitScheduler;
21
+ abortSignal: AbortSignal;
22
+ stderr: {
23
+ write(chunk: string): boolean | void;
24
+ };
25
+ logger: {
26
+ warn: (msg: string) => void;
27
+ info?: (msg: string) => void;
28
+ };
29
+ now?: () => number;
30
+ sleep?: (ms: number, signal: AbortSignal) => Promise<void>;
31
+ classify?: (err: unknown) => GhErrorClass;
32
+ initialWindowMs?: number;
33
+ lateWindowIntervalMs?: number;
34
+ }
35
+ export type StartupRetryOutcome<T> = {
36
+ kind: 'success';
37
+ value: T;
38
+ } | {
39
+ kind: 'permanent';
40
+ reason: string;
41
+ } | {
42
+ kind: 'aborted';
43
+ };
44
+ /**
45
+ * Deterministic mapping from a raw `gh`-call error to `GhErrorClass`.
46
+ *
47
+ * Retriable rules are evaluated first (node error codes → socket-hang-up →
48
+ * HTTP 429/5xx). Permanent rules follow (401/Bad credentials → 403 SAML/
49
+ * scope → 404 not-found → JSON-parse failure). Default: permanent/unknown.
50
+ *
51
+ * See `contracts/startup-retry.md § Error classifier` for full rationale.
52
+ */
53
+ export declare function classifyGhError(err: unknown): GhErrorClass;
54
+ export declare function runStartupRetry<T>(opts: StartupRetryOptions<T>): Promise<StartupRetryOutcome<T>>;
55
+ //# sourceMappingURL=startup-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-retry.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/startup-retry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAEjE,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,iBAAiB,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACtE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,YAAY,CAAC;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAyBxB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAyD1D;AAoBD,wBAAsB,eAAe,CAAC,CAAC,EACrC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAqFjC"}
@@ -0,0 +1,159 @@
1
+ const DEFAULT_INITIAL_WINDOW_MS = 2 * 60_000;
2
+ const DEFAULT_LATE_WINDOW_INTERVAL_MS = 5 * 60_000;
3
+ function errMessage(err) {
4
+ if (err == null)
5
+ return '';
6
+ if (err instanceof Error)
7
+ return err.message;
8
+ return String(err);
9
+ }
10
+ function errCode(err) {
11
+ if (err == null || typeof err !== 'object')
12
+ return undefined;
13
+ const code = err.code;
14
+ return typeof code === 'string' ? code : undefined;
15
+ }
16
+ const RETRIABLE_NODE_CODES = new Set([
17
+ 'ECONNRESET',
18
+ 'ETIMEDOUT',
19
+ 'ENOTFOUND',
20
+ 'ECONNREFUSED',
21
+ 'EPIPE',
22
+ ]);
23
+ /**
24
+ * Deterministic mapping from a raw `gh`-call error to `GhErrorClass`.
25
+ *
26
+ * Retriable rules are evaluated first (node error codes → socket-hang-up →
27
+ * HTTP 429/5xx). Permanent rules follow (401/Bad credentials → 403 SAML/
28
+ * scope → 404 not-found → JSON-parse failure). Default: permanent/unknown.
29
+ *
30
+ * See `contracts/startup-retry.md § Error classifier` for full rationale.
31
+ */
32
+ export function classifyGhError(err) {
33
+ const message = errMessage(err);
34
+ const code = errCode(err);
35
+ // Retriable: node error codes.
36
+ if (code != null && RETRIABLE_NODE_CODES.has(code)) {
37
+ return { kind: 'retriable', hint: code.toLowerCase() };
38
+ }
39
+ // Retriable: socket hang up.
40
+ if (/socket hang up/i.test(message)) {
41
+ return { kind: 'retriable', hint: 'socket-hang-up' };
42
+ }
43
+ // Retriable: HTTP 429 / 5xx.
44
+ const retriableHttp = message.match(/\bHTTP\s+(429|500|502|503|504)\b/);
45
+ if (retriableHttp) {
46
+ return { kind: 'retriable', hint: `http-${retriableHttp[1]}` };
47
+ }
48
+ // Retriable: GitHub primary/secondary rate limits. These do NOT reliably
49
+ // surface as "HTTP 429" — the GraphQL primary limit arrives as plain text
50
+ // ("API rate limit exceeded" / "...rate limit already exceeded...") with no
51
+ // HTTP status, and the secondary/abuse limit arrives as HTTP 403. They MUST
52
+ // be matched here, before the permanent 401/403 rules below, or a
53
+ // rate-limited `gh` call is misclassified as permanent and the doorbell
54
+ // exit(3)s instead of retrying — the exact failure this envelope exists to
55
+ // prevent, since rate-limiting is the dominant transient `gh` failure.
56
+ if (/rate limit (?:already )?exceeded/i.test(message) ||
57
+ /secondary rate limit/i.test(message) ||
58
+ /abuse detection/i.test(message)) {
59
+ return { kind: 'retriable', hint: 'rate-limit' };
60
+ }
61
+ // Permanent: 401 / Bad credentials.
62
+ if (/\bHTTP\s+401\b/.test(message) || /Bad credentials/i.test(message)) {
63
+ return { kind: 'permanent', reason: 'bad-credentials' };
64
+ }
65
+ // Permanent: 403 / SAML / scope.
66
+ if (/\bHTTP\s+403\b/.test(message) ||
67
+ /SAML|scope|not accessible by/i.test(message)) {
68
+ return { kind: 'permanent', reason: 'scope-or-sso' };
69
+ }
70
+ // Permanent: 404 / not-found.
71
+ if (/\bHTTP\s+404\b/.test(message) ||
72
+ /Could not resolve to (an Issue|a Repository)/i.test(message)) {
73
+ return { kind: 'permanent', reason: 'not-found' };
74
+ }
75
+ // Permanent: malformed output.
76
+ if (/parsing|expected JSON|invalid character/i.test(message)) {
77
+ return { kind: 'permanent', reason: 'malformed-output' };
78
+ }
79
+ return { kind: 'permanent', reason: 'unknown' };
80
+ }
81
+ function defaultSleep(ms, signal) {
82
+ return new Promise((resolve) => {
83
+ if (signal.aborted) {
84
+ resolve();
85
+ return;
86
+ }
87
+ const timer = setTimeout(() => {
88
+ signal.removeEventListener('abort', onAbort);
89
+ resolve();
90
+ }, ms);
91
+ const onAbort = () => {
92
+ clearTimeout(timer);
93
+ resolve();
94
+ };
95
+ signal.addEventListener('abort', onAbort, { once: true });
96
+ });
97
+ }
98
+ export async function runStartupRetry(opts) {
99
+ const { task, label, rateLimitScheduler, abortSignal, stderr, logger, now = () => Date.now(), sleep = defaultSleep, classify = classifyGhError, initialWindowMs = DEFAULT_INITIAL_WINDOW_MS, lateWindowIntervalMs = DEFAULT_LATE_WINDOW_INTERVAL_MS, } = opts;
100
+ const startedAt = now();
101
+ let attempt = 0;
102
+ let firstRetriableEmitted = false;
103
+ let phase = 'initial';
104
+ let recoveredFromLate = false;
105
+ for (;;) {
106
+ if (abortSignal.aborted)
107
+ return { kind: 'aborted' };
108
+ attempt += 1;
109
+ try {
110
+ const value = await task();
111
+ if (recoveredFromLate) {
112
+ stderr.write(`cockpit doorbell: startup-retry-recovered label=${label}\n`);
113
+ }
114
+ return { kind: 'success', value };
115
+ }
116
+ catch (err) {
117
+ const cls = classify(err);
118
+ if (cls.kind === 'permanent') {
119
+ stderr.write(`cockpit doorbell: permanent-error label=${label} reason=${cls.reason}\n`);
120
+ return { kind: 'permanent', reason: cls.reason };
121
+ }
122
+ // Retriable branch.
123
+ if (phase === 'initial') {
124
+ if (!firstRetriableEmitted) {
125
+ stderr.write(`cockpit doorbell: startup-retry label=${label} reason=${cls.hint} attempt=${attempt}\n`);
126
+ firstRetriableEmitted = true;
127
+ }
128
+ else {
129
+ logger.info?.(`cockpit doorbell: startup-retry label=${label} reason=${cls.hint} attempt=${attempt}`);
130
+ }
131
+ }
132
+ else {
133
+ logger.info?.(`cockpit doorbell: startup-retry-late label=${label} reason=${cls.hint} attempt=${attempt}`);
134
+ }
135
+ if (phase === 'initial' && now() - startedAt >= initialWindowMs) {
136
+ stderr.write(`cockpit doorbell: startup-retry-exhausted label=${label} transitioning to late-startup retry\n`);
137
+ phase = 'late';
138
+ recoveredFromLate = true;
139
+ }
140
+ const sleepMs = phase === 'initial'
141
+ ? rateLimitScheduler.getCurrentIntervalMs()
142
+ : lateWindowIntervalMs;
143
+ await sleep(sleepMs, abortSignal);
144
+ if (abortSignal.aborted)
145
+ return { kind: 'aborted' };
146
+ // Best-effort hook so the scheduler's watermark logic advances between
147
+ // attempts. Failures are swallowed — the scheduler is defensive.
148
+ if (phase === 'initial') {
149
+ try {
150
+ rateLimitScheduler.noteResponseHeaders({});
151
+ }
152
+ catch {
153
+ /* best-effort */
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ //# sourceMappingURL=startup-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-retry.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/startup-retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `subscribeAndEmit` — drives a `bus.waitFor` loop and writes one stdout line
3
+ * per emitted event to the caller-supplied stdout target. Pure translator
4
+ * lives in `lineForEvent`.
5
+ *
6
+ * Contract: `contracts/subscribe-and-emit.md`.
7
+ */
8
+ import type { EpicEventBus } from '../mcp/event-bus.js';
9
+ import type { CockpitStreamEvent } from '../watch/stream-event.js';
10
+ export interface SubscribeEmitOptions {
11
+ stdout: {
12
+ write(chunk: string, cb?: () => void): boolean | void;
13
+ };
14
+ onEmit?: (event: CockpitStreamEvent) => void;
15
+ }
16
+ export type SubscribeUnsubscribe = () => void;
17
+ export declare function lineForEvent(event: CockpitStreamEvent): string;
18
+ export declare function subscribeAndEmit(bus: EpicEventBus, options: SubscribeEmitOptions): SubscribeUnsubscribe;
19
+ //# sourceMappingURL=subscribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/doorbell/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IAClE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC;AAM9C,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAE9D;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CA6CtB"}