@generacy-ai/generacy 0.3.3 → 0.4.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 (219) hide show
  1. package/README.md +153 -0
  2. package/dist/cli/commands/cluster/scaffolder.d.ts.map +1 -1
  3. package/dist/cli/commands/cluster/scaffolder.js +2 -0
  4. package/dist/cli/commands/cluster/scaffolder.js.map +1 -1
  5. package/dist/cli/commands/cockpit/advance.d.ts +42 -0
  6. package/dist/cli/commands/cockpit/advance.d.ts.map +1 -0
  7. package/dist/cli/commands/cockpit/advance.js +136 -0
  8. package/dist/cli/commands/cockpit/advance.js.map +1 -0
  9. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts +13 -0
  10. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts.map +1 -0
  11. package/dist/cli/commands/cockpit/clarification-comment-finder.js +31 -0
  12. package/dist/cli/commands/cockpit/clarification-comment-finder.js.map +1 -0
  13. package/dist/cli/commands/cockpit/code-references.d.ts +27 -0
  14. package/dist/cli/commands/cockpit/code-references.d.ts.map +1 -0
  15. package/dist/cli/commands/cockpit/code-references.js +48 -0
  16. package/dist/cli/commands/cockpit/code-references.js.map +1 -0
  17. package/dist/cli/commands/cockpit/context.d.ts +90 -0
  18. package/dist/cli/commands/cockpit/context.d.ts.map +1 -0
  19. package/dist/cli/commands/cockpit/context.js +280 -0
  20. package/dist/cli/commands/cockpit/context.js.map +1 -0
  21. package/dist/cli/commands/cockpit/exit.d.ts +12 -0
  22. package/dist/cli/commands/cockpit/exit.d.ts.map +1 -0
  23. package/dist/cli/commands/cockpit/exit.js +18 -0
  24. package/dist/cli/commands/cockpit/exit.js.map +1 -0
  25. package/dist/cli/commands/cockpit/gate-vocabulary.d.ts +48 -0
  26. package/dist/cli/commands/cockpit/gate-vocabulary.d.ts.map +1 -0
  27. package/dist/cli/commands/cockpit/gate-vocabulary.js +96 -0
  28. package/dist/cli/commands/cockpit/gate-vocabulary.js.map +1 -0
  29. package/dist/cli/commands/cockpit/index.d.ts +20 -0
  30. package/dist/cli/commands/cockpit/index.d.ts.map +1 -0
  31. package/dist/cli/commands/cockpit/index.js +40 -0
  32. package/dist/cli/commands/cockpit/index.js.map +1 -0
  33. package/dist/cli/commands/cockpit/manual-advance-marker.d.ts +18 -0
  34. package/dist/cli/commands/cockpit/manual-advance-marker.d.ts.map +1 -0
  35. package/dist/cli/commands/cockpit/manual-advance-marker.js +43 -0
  36. package/dist/cli/commands/cockpit/manual-advance-marker.js.map +1 -0
  37. package/dist/cli/commands/cockpit/mcp/errors.d.ts +54 -0
  38. package/dist/cli/commands/cockpit/mcp/errors.d.ts.map +1 -0
  39. package/dist/cli/commands/cockpit/mcp/errors.js +190 -0
  40. package/dist/cli/commands/cockpit/mcp/errors.js.map +1 -0
  41. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts +59 -0
  42. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts.map +1 -0
  43. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js +305 -0
  44. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js.map +1 -0
  45. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts +82 -0
  46. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts.map +1 -0
  47. package/dist/cli/commands/cockpit/mcp/event-bus.js +230 -0
  48. package/dist/cli/commands/cockpit/mcp/event-bus.js.map +1 -0
  49. package/dist/cli/commands/cockpit/mcp/index.d.ts +17 -0
  50. package/dist/cli/commands/cockpit/mcp/index.d.ts.map +1 -0
  51. package/dist/cli/commands/cockpit/mcp/index.js +37 -0
  52. package/dist/cli/commands/cockpit/mcp/index.js.map +1 -0
  53. package/dist/cli/commands/cockpit/mcp/ref-input.d.ts +52 -0
  54. package/dist/cli/commands/cockpit/mcp/ref-input.d.ts.map +1 -0
  55. package/dist/cli/commands/cockpit/mcp/ref-input.js +132 -0
  56. package/dist/cli/commands/cockpit/mcp/ref-input.js.map +1 -0
  57. package/dist/cli/commands/cockpit/mcp/schemas.d.ts +287 -0
  58. package/dist/cli/commands/cockpit/mcp/schemas.d.ts.map +1 -0
  59. package/dist/cli/commands/cockpit/mcp/schemas.js +84 -0
  60. package/dist/cli/commands/cockpit/mcp/schemas.js.map +1 -0
  61. package/dist/cli/commands/cockpit/mcp/server.d.ts +17 -0
  62. package/dist/cli/commands/cockpit/mcp/server.d.ts.map +1 -0
  63. package/dist/cli/commands/cockpit/mcp/server.js +62 -0
  64. package/dist/cli/commands/cockpit/mcp/server.js.map +1 -0
  65. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts +42 -0
  66. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts.map +1 -0
  67. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js +73 -0
  68. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js.map +1 -0
  69. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts +34 -0
  70. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts.map +1 -0
  71. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js +115 -0
  72. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js.map +1 -0
  73. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts +21 -0
  74. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts.map +1 -0
  75. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js +35 -0
  76. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js.map +1 -0
  77. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts +43 -0
  78. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts.map +1 -0
  79. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js +99 -0
  80. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js.map +1 -0
  81. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts +43 -0
  82. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts.map +1 -0
  83. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js +68 -0
  84. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js.map +1 -0
  85. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts +38 -0
  86. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts.map +1 -0
  87. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js +79 -0
  88. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js.map +1 -0
  89. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts +21 -0
  90. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts.map +1 -0
  91. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js +59 -0
  92. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js.map +1 -0
  93. package/dist/cli/commands/cockpit/merge.d.ts +42 -0
  94. package/dist/cli/commands/cockpit/merge.d.ts.map +1 -0
  95. package/dist/cli/commands/cockpit/merge.js +360 -0
  96. package/dist/cli/commands/cockpit/merge.js.map +1 -0
  97. package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts +30 -0
  98. package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts.map +1 -0
  99. package/dist/cli/commands/cockpit/plan-dependency-extractor.js +135 -0
  100. package/dist/cli/commands/cockpit/plan-dependency-extractor.js.map +1 -0
  101. package/dist/cli/commands/cockpit/queue.d.ts +85 -0
  102. package/dist/cli/commands/cockpit/queue.d.ts.map +1 -0
  103. package/dist/cli/commands/cockpit/queue.js +438 -0
  104. package/dist/cli/commands/cockpit/queue.js.map +1 -0
  105. package/dist/cli/commands/cockpit/resolver.d.ts +70 -0
  106. package/dist/cli/commands/cockpit/resolver.d.ts.map +1 -0
  107. package/dist/cli/commands/cockpit/resolver.js +117 -0
  108. package/dist/cli/commands/cockpit/resolver.js.map +1 -0
  109. package/dist/cli/commands/cockpit/resume.d.ts +38 -0
  110. package/dist/cli/commands/cockpit/resume.d.ts.map +1 -0
  111. package/dist/cli/commands/cockpit/resume.js +167 -0
  112. package/dist/cli/commands/cockpit/resume.js.map +1 -0
  113. package/dist/cli/commands/cockpit/shared/classify-issue.d.ts +12 -0
  114. package/dist/cli/commands/cockpit/shared/classify-issue.d.ts.map +1 -0
  115. package/dist/cli/commands/cockpit/shared/classify-issue.js +10 -0
  116. package/dist/cli/commands/cockpit/shared/classify-issue.js.map +1 -0
  117. package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts +53 -0
  118. package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts.map +1 -0
  119. package/dist/cli/commands/cockpit/shared/failing-check-json.js +170 -0
  120. package/dist/cli/commands/cockpit/shared/failing-check-json.js.map +1 -0
  121. package/dist/cli/commands/cockpit/shared/identity.d.ts +54 -0
  122. package/dist/cli/commands/cockpit/shared/identity.d.ts.map +1 -0
  123. package/dist/cli/commands/cockpit/shared/identity.js +65 -0
  124. package/dist/cli/commands/cockpit/shared/identity.js.map +1 -0
  125. package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts +16 -0
  126. package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts.map +1 -0
  127. package/dist/cli/commands/cockpit/shared/is-done-snapshot.js +17 -0
  128. package/dist/cli/commands/cockpit/shared/is-done-snapshot.js.map +1 -0
  129. package/dist/cli/commands/cockpit/shared/pagination.d.ts +17 -0
  130. package/dist/cli/commands/cockpit/shared/pagination.d.ts.map +1 -0
  131. package/dist/cli/commands/cockpit/shared/pagination.js +50 -0
  132. package/dist/cli/commands/cockpit/shared/pagination.js.map +1 -0
  133. package/dist/cli/commands/cockpit/shared/pr-link.d.ts +8 -0
  134. package/dist/cli/commands/cockpit/shared/pr-link.d.ts.map +1 -0
  135. package/dist/cli/commands/cockpit/shared/pr-link.js +15 -0
  136. package/dist/cli/commands/cockpit/shared/pr-link.js.map +1 -0
  137. package/dist/cli/commands/cockpit/shared/required-checks.d.ts +17 -0
  138. package/dist/cli/commands/cockpit/shared/required-checks.d.ts.map +1 -0
  139. package/dist/cli/commands/cockpit/shared/required-checks.js +38 -0
  140. package/dist/cli/commands/cockpit/shared/required-checks.js.map +1 -0
  141. package/dist/cli/commands/cockpit/shared/review-context-json.d.ts +29 -0
  142. package/dist/cli/commands/cockpit/shared/review-context-json.d.ts.map +1 -0
  143. package/dist/cli/commands/cockpit/shared/review-context-json.js +28 -0
  144. package/dist/cli/commands/cockpit/shared/review-context-json.js.map +1 -0
  145. package/dist/cli/commands/cockpit/status/color.d.ts +11 -0
  146. package/dist/cli/commands/cockpit/status/color.d.ts.map +1 -0
  147. package/dist/cli/commands/cockpit/status/color.js +33 -0
  148. package/dist/cli/commands/cockpit/status/color.js.map +1 -0
  149. package/dist/cli/commands/cockpit/status/group.d.ts +8 -0
  150. package/dist/cli/commands/cockpit/status/group.d.ts.map +1 -0
  151. package/dist/cli/commands/cockpit/status/group.js +35 -0
  152. package/dist/cli/commands/cockpit/status/group.js.map +1 -0
  153. package/dist/cli/commands/cockpit/status/render-table.d.ts +24 -0
  154. package/dist/cli/commands/cockpit/status/render-table.d.ts.map +1 -0
  155. package/dist/cli/commands/cockpit/status/render-table.js +71 -0
  156. package/dist/cli/commands/cockpit/status/render-table.js.map +1 -0
  157. package/dist/cli/commands/cockpit/status/row.d.ts +18 -0
  158. package/dist/cli/commands/cockpit/status/row.d.ts.map +1 -0
  159. package/dist/cli/commands/cockpit/status/row.js +17 -0
  160. package/dist/cli/commands/cockpit/status/row.js.map +1 -0
  161. package/dist/cli/commands/cockpit/status.d.ts +18 -0
  162. package/dist/cli/commands/cockpit/status.d.ts.map +1 -0
  163. package/dist/cli/commands/cockpit/status.js +138 -0
  164. package/dist/cli/commands/cockpit/status.js.map +1 -0
  165. package/dist/cli/commands/cockpit/watch/actionable.d.ts +15 -0
  166. package/dist/cli/commands/cockpit/watch/actionable.d.ts.map +1 -0
  167. package/dist/cli/commands/cockpit/watch/actionable.js +32 -0
  168. package/dist/cli/commands/cockpit/watch/actionable.js.map +1 -0
  169. package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts +107 -0
  170. package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts.map +1 -0
  171. package/dist/cli/commands/cockpit/watch/aggregate-emit.js +41 -0
  172. package/dist/cli/commands/cockpit/watch/aggregate-emit.js.map +1 -0
  173. package/dist/cli/commands/cockpit/watch/aggregate.d.ts +25 -0
  174. package/dist/cli/commands/cockpit/watch/aggregate.d.ts.map +1 -0
  175. package/dist/cli/commands/cockpit/watch/aggregate.js +67 -0
  176. package/dist/cli/commands/cockpit/watch/aggregate.js.map +1 -0
  177. package/dist/cli/commands/cockpit/watch/check-rollup.d.ts +9 -0
  178. package/dist/cli/commands/cockpit/watch/check-rollup.d.ts.map +1 -0
  179. package/dist/cli/commands/cockpit/watch/check-rollup.js +22 -0
  180. package/dist/cli/commands/cockpit/watch/check-rollup.js.map +1 -0
  181. package/dist/cli/commands/cockpit/watch/diff.d.ts +29 -0
  182. package/dist/cli/commands/cockpit/watch/diff.d.ts.map +1 -0
  183. package/dist/cli/commands/cockpit/watch/diff.js +85 -0
  184. package/dist/cli/commands/cockpit/watch/diff.js.map +1 -0
  185. package/dist/cli/commands/cockpit/watch/emit.d.ts +58 -0
  186. package/dist/cli/commands/cockpit/watch/emit.d.ts.map +1 -0
  187. package/dist/cli/commands/cockpit/watch/emit.js +30 -0
  188. package/dist/cli/commands/cockpit/watch/emit.js.map +1 -0
  189. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts +29 -0
  190. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts.map +1 -0
  191. package/dist/cli/commands/cockpit/watch/poll-loop.js +81 -0
  192. package/dist/cli/commands/cockpit/watch/poll-loop.js.map +1 -0
  193. package/dist/cli/commands/cockpit/watch/pr-state.d.ts +17 -0
  194. package/dist/cli/commands/cockpit/watch/pr-state.d.ts.map +1 -0
  195. package/dist/cli/commands/cockpit/watch/pr-state.js +33 -0
  196. package/dist/cli/commands/cockpit/watch/pr-state.js.map +1 -0
  197. package/dist/cli/commands/cockpit/watch/snapshot.d.ts +33 -0
  198. package/dist/cli/commands/cockpit/watch/snapshot.d.ts.map +1 -0
  199. package/dist/cli/commands/cockpit/watch/snapshot.js +30 -0
  200. package/dist/cli/commands/cockpit/watch/snapshot.js.map +1 -0
  201. package/dist/cli/commands/cockpit/watch/stream-event.d.ts +82 -0
  202. package/dist/cli/commands/cockpit/watch/stream-event.d.ts.map +1 -0
  203. package/dist/cli/commands/cockpit/watch/stream-event.js +9 -0
  204. package/dist/cli/commands/cockpit/watch/stream-event.js.map +1 -0
  205. package/dist/cli/commands/cockpit/watch.d.ts +22 -0
  206. package/dist/cli/commands/cockpit/watch.d.ts.map +1 -0
  207. package/dist/cli/commands/cockpit/watch.js +186 -0
  208. package/dist/cli/commands/cockpit/watch.js.map +1 -0
  209. package/dist/cli/commands/setup/build.d.ts.map +1 -1
  210. package/dist/cli/commands/setup/build.js +59 -0
  211. package/dist/cli/commands/setup/build.js.map +1 -1
  212. package/dist/cli/index.d.ts.map +1 -1
  213. package/dist/cli/index.js +2 -0
  214. package/dist/cli/index.js.map +1 -1
  215. package/dist/index.d.ts +2 -0
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +2 -0
  218. package/dist/index.js.map +1 -1
  219. package/package.json +11 -5
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `formatManualAdvanceComment` — renders the structured issue comment posted
3
+ * by `cockpit advance` per AD-1 / D-R5.
4
+ *
5
+ * Inputs are regex-validated before interpolation so a malformed `gate`,
6
+ * `actor`, or `ts` cannot inject HTML/markdown into the marker body.
7
+ *
8
+ * `actor` is optional: when `undefined` or empty, the `actor=` attribute is
9
+ * omitted from the HTML comment and the ` by **@<actor>**` clause is dropped
10
+ * from the sentence (contract: FR-003, `contracts/manual-advance-marker.md`).
11
+ */
12
+ export interface ManualAdvanceMarker {
13
+ gate: string;
14
+ actor?: string;
15
+ ts: string;
16
+ }
17
+ export declare function formatManualAdvanceComment(marker: ManualAdvanceMarker): string;
18
+ //# sourceMappingURL=manual-advance-marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-advance-marker.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/manual-advance-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAW9E"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `formatManualAdvanceComment` — renders the structured issue comment posted
3
+ * by `cockpit advance` per AD-1 / D-R5.
4
+ *
5
+ * Inputs are regex-validated before interpolation so a malformed `gate`,
6
+ * `actor`, or `ts` cannot inject HTML/markdown into the marker body.
7
+ *
8
+ * `actor` is optional: when `undefined` or empty, the `actor=` attribute is
9
+ * omitted from the HTML comment and the ` by **@<actor>**` clause is dropped
10
+ * from the sentence (contract: FR-003, `contracts/manual-advance-marker.md`).
11
+ */
12
+ const GATE_REGEX = /^[a-z][a-z0-9-]*$/;
13
+ const ACTOR_REGEX = /^[A-Za-z0-9-]+$/;
14
+ export function formatManualAdvanceComment(marker) {
15
+ validate(marker);
16
+ const { gate, actor, ts } = marker;
17
+ const hasActor = typeof actor === 'string' && actor.length > 0;
18
+ const commentPrelude = hasActor
19
+ ? `<!-- generacy-cockpit:manual-advance gate=${gate} actor=${actor} ts=${ts} -->`
20
+ : `<!-- generacy-cockpit:manual-advance gate=${gate} ts=${ts} -->`;
21
+ const sentence = hasActor
22
+ ? `Marked \`completed:${gate}\` by **@${actor}** — \`waiting-for:${gate}\` left in place for the worker to clear on resume.`
23
+ : `Marked \`completed:${gate}\` — \`waiting-for:${gate}\` left in place for the worker to clear on resume.`;
24
+ return `${commentPrelude}\n\n${sentence}`;
25
+ }
26
+ function validate(marker) {
27
+ if (!GATE_REGEX.test(marker.gate)) {
28
+ throw new Error(`formatManualAdvanceComment: invalid gate name "${marker.gate}"`);
29
+ }
30
+ if (typeof marker.actor === 'string' && marker.actor.length > 0) {
31
+ if (!ACTOR_REGEX.test(marker.actor)) {
32
+ throw new Error(`formatManualAdvanceComment: invalid actor login "${marker.actor}"`);
33
+ }
34
+ }
35
+ if (typeof marker.ts !== 'string' || marker.ts === '') {
36
+ throw new Error('formatManualAdvanceComment: ts must be a non-empty ISO-8601 string');
37
+ }
38
+ const parsed = new Date(marker.ts);
39
+ if (Number.isNaN(parsed.getTime()) || parsed.toISOString() !== marker.ts) {
40
+ throw new Error(`formatManualAdvanceComment: ts "${marker.ts}" is not round-trip ISO-8601`);
41
+ }
42
+ }
43
+ //# sourceMappingURL=manual-advance-marker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-advance-marker.js","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/manual-advance-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAQtC,MAAM,UAAU,0BAA0B,CAAC,MAA2B;IACpE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,QAAQ;QAC7B,CAAC,CAAC,6CAA6C,IAAI,UAAU,KAAK,OAAO,EAAE,MAAM;QACjF,CAAC,CAAC,6CAA6C,IAAI,OAAO,EAAE,MAAM,CAAC;IACrE,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,sBAAsB,IAAI,YAAY,KAAK,sBAAsB,IAAI,qDAAqD;QAC5H,CAAC,CAAC,sBAAsB,IAAI,sBAAsB,IAAI,qDAAqD,CAAC;IAC9G,OAAO,GAAG,cAAc,OAAO,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAC,MAA2B;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oDAAoD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Typed error results for the cockpit MCP tool boundary.
3
+ *
4
+ * Every tool returns `ToolResult<T>` — either `ToolOkResult<T>` (status: 'ok')
5
+ * or `ToolErrorResult` (status: 'error'). Bare thrown exceptions never reach
6
+ * the JSON-RPC transport; `wrapToolBoundary` converts them into an
7
+ * `internal`-class error result.
8
+ *
9
+ * `mapCockpitExitToToolError` translates the `CockpitExit` codes used by the
10
+ * CLI verbs (1 = transport, 2 = argument/parse, 3 = gate refusal) into
11
+ * discriminated tool-error classes.
12
+ */
13
+ import { type CockpitExit } from '../exit.js';
14
+ export type ErrorClass = 'invalid-args' | 'wrong-kind' | 'unknown-gate' | 'not-an-epic' | 'gate-refusal' | 'transport' | 'invalid-cursor' | 'not-worker' | 'internal';
15
+ export interface ToolOkResult<T> {
16
+ status: 'ok';
17
+ data: T;
18
+ }
19
+ export interface ToolErrorResult {
20
+ status: 'error';
21
+ class: ErrorClass;
22
+ detail: string;
23
+ hint?: string;
24
+ }
25
+ export type ToolResult<T> = ToolOkResult<T> | ToolErrorResult;
26
+ /** Map a `CockpitExit` from the CLI verb into a typed tool-error result. */
27
+ export declare function mapCockpitExitToToolError(exit: CockpitExit): ToolErrorResult;
28
+ /**
29
+ * Wrap a tool handler so that any thrown Error (including `CockpitExit`)
30
+ * becomes a typed `ToolErrorResult`. The MCP transport never sees an
31
+ * uncaught throw from a wrapped handler.
32
+ */
33
+ export declare function wrapToolBoundary<T>(fn: () => Promise<ToolResult<T>>): Promise<ToolResult<T>>;
34
+ /**
35
+ * #928 — Envelope-mapping helper.
36
+ *
37
+ * Translates the CLI verb's `RunMergeResult` (`{ exitCode, stdout }`) into the
38
+ * MCP `ToolResult<T>` envelope. THIS TABLE IS THE TRANSPORT CONTRACT (Q4 → B):
39
+ * any new `reason` string introduced in `runMerge` must appear here, or fall
40
+ * through to `class: 'invalid-args'` (which is loud enough for tests to catch).
41
+ *
42
+ * Mapping (see data-model.md §toMcpResult):
43
+ * exit=0 → ok, data: parsed
44
+ * exit=2 + reason='pr-number' → wrong-kind (with `hint`)
45
+ * exit=2 + reason∈{unresolved, ambiguous-resolution, pr-is-draft, checks-failing}
46
+ * → gate-refusal
47
+ * exit=2 + other/missing reason → invalid-args
48
+ * exit=3 → gate-refusal
49
+ * exit=1 → transport
50
+ * exit≥4 → internal
51
+ * non-JSON stdout → internal
52
+ */
53
+ export declare function toMcpResult<T>(cliJsonStdout: string, exitCode: number): ToolResult<T>;
54
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/mcp/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,UAAU,GAClB,cAAc,GACd,YAAY,GACZ,cAAc,GACd,aAAa,GACb,cAAc,GACd,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;AAE9D,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAY5E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAUxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,UAAU,CAAC,CAAC,CAAC,CA8Ff"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Typed error results for the cockpit MCP tool boundary.
3
+ *
4
+ * Every tool returns `ToolResult<T>` — either `ToolOkResult<T>` (status: 'ok')
5
+ * or `ToolErrorResult` (status: 'error'). Bare thrown exceptions never reach
6
+ * the JSON-RPC transport; `wrapToolBoundary` converts them into an
7
+ * `internal`-class error result.
8
+ *
9
+ * `mapCockpitExitToToolError` translates the `CockpitExit` codes used by the
10
+ * CLI verbs (1 = transport, 2 = argument/parse, 3 = gate refusal) into
11
+ * discriminated tool-error classes.
12
+ */
13
+ import { isCockpitExit } from '../exit.js';
14
+ /** Map a `CockpitExit` from the CLI verb into a typed tool-error result. */
15
+ export function mapCockpitExitToToolError(exit) {
16
+ const detail = exit.message;
17
+ switch (exit.code) {
18
+ case 1:
19
+ return { status: 'error', class: 'transport', detail };
20
+ case 2:
21
+ return { status: 'error', class: 'invalid-args', detail };
22
+ case 3:
23
+ return { status: 'error', class: 'gate-refusal', detail };
24
+ default:
25
+ return { status: 'error', class: 'internal', detail };
26
+ }
27
+ }
28
+ /**
29
+ * Wrap a tool handler so that any thrown Error (including `CockpitExit`)
30
+ * becomes a typed `ToolErrorResult`. The MCP transport never sees an
31
+ * uncaught throw from a wrapped handler.
32
+ */
33
+ export async function wrapToolBoundary(fn) {
34
+ try {
35
+ return await fn();
36
+ }
37
+ catch (err) {
38
+ if (isCockpitExit(err)) {
39
+ return mapCockpitExitToToolError(err);
40
+ }
41
+ const detail = err instanceof Error ? err.message : String(err);
42
+ return { status: 'error', class: 'internal', detail };
43
+ }
44
+ }
45
+ /**
46
+ * #928 — Envelope-mapping helper.
47
+ *
48
+ * Translates the CLI verb's `RunMergeResult` (`{ exitCode, stdout }`) into the
49
+ * MCP `ToolResult<T>` envelope. THIS TABLE IS THE TRANSPORT CONTRACT (Q4 → B):
50
+ * any new `reason` string introduced in `runMerge` must appear here, or fall
51
+ * through to `class: 'invalid-args'` (which is loud enough for tests to catch).
52
+ *
53
+ * Mapping (see data-model.md §toMcpResult):
54
+ * exit=0 → ok, data: parsed
55
+ * exit=2 + reason='pr-number' → wrong-kind (with `hint`)
56
+ * exit=2 + reason∈{unresolved, ambiguous-resolution, pr-is-draft, checks-failing}
57
+ * → gate-refusal
58
+ * exit=2 + other/missing reason → invalid-args
59
+ * exit=3 → gate-refusal
60
+ * exit=1 → transport
61
+ * exit≥4 → internal
62
+ * non-JSON stdout → internal
63
+ */
64
+ export function toMcpResult(cliJsonStdout, exitCode) {
65
+ let parsed = null;
66
+ let parseFailed = false;
67
+ try {
68
+ parsed = cliJsonStdout.trim().length === 0 ? null : JSON.parse(cliJsonStdout);
69
+ }
70
+ catch {
71
+ parseFailed = true;
72
+ }
73
+ if (exitCode === 0) {
74
+ if (parseFailed) {
75
+ return {
76
+ status: 'error',
77
+ class: 'internal',
78
+ detail: 'CLI produced non-JSON stdout on success exit',
79
+ };
80
+ }
81
+ return { status: 'ok', data: parsed };
82
+ }
83
+ const detailFallback = firstLineOr(cliJsonStdout, 'CLI reported an error');
84
+ if (exitCode === 1) {
85
+ // Legacy: several cockpit verbs (notably `runMerge`) still use exit-1
86
+ // for resolver-driven gate refusals. Distinguish by the presence of a
87
+ // red-payload JSON with a known refusal `reason` — that's a gate
88
+ // refusal, not a transport error.
89
+ if (!parseFailed) {
90
+ const reason = extractString(parsed, 'reason');
91
+ if (reason !== null && isKnownGateRefusalReason(reason)) {
92
+ return {
93
+ status: 'error',
94
+ class: 'gate-refusal',
95
+ detail: describeGateRefusal(parsed, reason),
96
+ };
97
+ }
98
+ }
99
+ return { status: 'error', class: 'transport', detail: detailFallback };
100
+ }
101
+ if (exitCode === 2) {
102
+ if (parseFailed) {
103
+ return {
104
+ status: 'error',
105
+ class: 'internal',
106
+ detail: 'CLI produced non-JSON stdout on error exit',
107
+ };
108
+ }
109
+ const reason = extractString(parsed, 'reason');
110
+ if (reason === 'pr-number') {
111
+ const hint = extractString(parsed, 'hint') ?? undefined;
112
+ const err = {
113
+ status: 'error',
114
+ class: 'wrong-kind',
115
+ detail: hint ?? `input is a pull request; pass the issue number`,
116
+ };
117
+ if (hint !== undefined)
118
+ err.hint = hint;
119
+ return err;
120
+ }
121
+ if (reason === 'unresolved' ||
122
+ reason === 'ambiguous-resolution' ||
123
+ reason === 'pr-is-draft' ||
124
+ reason === 'checks-failing' ||
125
+ reason === 'missing-label' ||
126
+ reason === 'pr-flag-linkage-refused' ||
127
+ reason === 'pr-flag-closed-unmerged') {
128
+ return {
129
+ status: 'error',
130
+ class: 'gate-refusal',
131
+ detail: describeGateRefusal(parsed, reason),
132
+ };
133
+ }
134
+ return {
135
+ status: 'error',
136
+ class: 'invalid-args',
137
+ detail: describeInvalidArgs(parsed, detailFallback),
138
+ };
139
+ }
140
+ if (exitCode === 3) {
141
+ if (parseFailed) {
142
+ return { status: 'error', class: 'gate-refusal', detail: detailFallback };
143
+ }
144
+ const reason = extractString(parsed, 'reason');
145
+ return {
146
+ status: 'error',
147
+ class: 'gate-refusal',
148
+ detail: reason !== null ? describeGateRefusal(parsed, reason) : detailFallback,
149
+ };
150
+ }
151
+ return { status: 'error', class: 'internal', detail: detailFallback };
152
+ }
153
+ function firstLineOr(stdout, fallback) {
154
+ const trimmed = stdout.trim();
155
+ if (trimmed.length === 0)
156
+ return fallback;
157
+ const first = trimmed.split('\n')[0];
158
+ return first != null && first.length > 0 ? first : fallback;
159
+ }
160
+ function extractString(raw, field) {
161
+ if (raw == null || typeof raw !== 'object')
162
+ return null;
163
+ const value = raw[field];
164
+ return typeof value === 'string' ? value : null;
165
+ }
166
+ function describeGateRefusal(raw, reason) {
167
+ const message = extractString(raw, 'message');
168
+ if (message !== null)
169
+ return message;
170
+ return reason;
171
+ }
172
+ function isKnownGateRefusalReason(reason) {
173
+ return (reason === 'unresolved' ||
174
+ reason === 'ambiguous-resolution' ||
175
+ reason === 'pr-is-draft' ||
176
+ reason === 'checks-failing' ||
177
+ reason === 'missing-label' ||
178
+ reason === 'pr-flag-linkage-refused' ||
179
+ reason === 'pr-flag-closed-unmerged');
180
+ }
181
+ function describeInvalidArgs(raw, fallback) {
182
+ const detail = extractString(raw, 'detail');
183
+ if (detail !== null)
184
+ return detail;
185
+ const message = extractString(raw, 'message');
186
+ if (message !== null)
187
+ return message;
188
+ return fallback;
189
+ }
190
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/cli/commands/cockpit/mcp/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AA2B7D,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CAAC,IAAiB;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACzD,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAC5D,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAC5D;YACE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAgC;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,yBAAyB,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CACzB,aAAqB,EACrB,QAAgB;IAEhB,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,8CAA8C;aACvD,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAW,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;IAE3E,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,sEAAsE;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,kCAAkC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM,KAAK,IAAI,IAAI,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxD,OAAO;oBACL,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,cAAc;oBACrB,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;iBAC5C,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,4CAA4C;aACrD,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC;YACxD,MAAM,GAAG,GAAoB;gBAC3B,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,IAAI,IAAI,gDAAgD;aACjE,CAAC;YACF,IAAI,IAAI,KAAK,SAAS;gBAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YACxC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IACE,MAAM,KAAK,YAAY;YACvB,MAAM,KAAK,sBAAsB;YACjC,MAAM,KAAK,aAAa;YACxB,MAAM,KAAK,gBAAgB;YAC3B,MAAM,KAAK,eAAe;YAC1B,MAAM,KAAK,yBAAyB;YACpC,MAAM,KAAK,yBAAyB,EACpC,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;aAC5C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC5E,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc;SAC/E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,QAAgB;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,GAAY,EAAE,KAAa;IAChD,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,KAAK,GAAI,GAA+B,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY,EAAE,MAAc;IACvD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,OAAO,CACL,MAAM,KAAK,YAAY;QACvB,MAAM,KAAK,sBAAsB;QACjC,MAAM,KAAK,aAAa;QACxB,MAAM,KAAK,gBAAgB;QAC3B,MAAM,KAAK,eAAe;QAC1B,MAAM,KAAK,yBAAyB;QACpC,MAAM,KAAK,yBAAyB,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY,EAAE,QAAgB;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Per-orchestrator-process registry of `EpicEventBus` instances, keyed by
3
+ * epic-ref string (`"owner/repo#number"`).
4
+ *
5
+ * Each bus is driven by a private poller — mirrors `watch.ts` but emits into
6
+ * the bus instead of stdout NDJSON. Multiple concurrent `cockpit_await_events`
7
+ * callers against the same epic share the subscriber; refcounted via
8
+ * `acquire` / `release`.
9
+ *
10
+ * Bus lifetime is decoupled from call lifetime (#924): `release()` at
11
+ * refcount 0 pauses the poller and arms an idle-TTL timer instead of tearing
12
+ * down the bus. The next `acquire()` disarms the timer, resumes the poller,
13
+ * and runs a synchronous catch-up poll so between-call events are captured.
14
+ * A soft cap on live buses evicts the least-recently-active on overflow.
15
+ *
16
+ * Env knobs:
17
+ * `COCKPIT_MCP_BUS_IDLE_TTL_MS` — idle-TTL for refcount-0 buses (default 600_000).
18
+ * `COCKPIT_MCP_BUS_MAX` — soft cap on live buses (default 100).
19
+ */
20
+ import { type CommandRunner, type GhWrapper } from '@generacy-ai/cockpit';
21
+ import { EpicEventBus } from './event-bus.js';
22
+ export interface AcquireOptions {
23
+ epicRef: string;
24
+ runner?: CommandRunner;
25
+ gh?: GhWrapper;
26
+ intervalMs?: number;
27
+ logger?: {
28
+ warn: (msg: string) => void;
29
+ info?: (msg: string) => void;
30
+ };
31
+ /**
32
+ * Injection seam for tests: build an event bus without starting a poll
33
+ * loop. Callers use the returned bus's `emit()` directly.
34
+ */
35
+ noPoll?: boolean;
36
+ /** Test seam: wall-clock provider (drives `lastActiveAt`). */
37
+ now?: () => number;
38
+ /** Test seam: override the idle-TTL for this and subsequent acquires. */
39
+ idleTtlMs?: number;
40
+ /** Test seam: override the LRU soft cap for this and subsequent acquires. */
41
+ maxBuses?: number;
42
+ /**
43
+ * Test seam: replace the entire poll cycle (resolveEpic + runOnePoll +
44
+ * computeAggregateEvents). Called from both the poll loop and
45
+ * `catchUpPoll()`. Used to drive between-call event emission
46
+ * deterministically in unit tests.
47
+ */
48
+ runCycle?: (bus: EpicEventBus) => Promise<void>;
49
+ }
50
+ export interface Acquired {
51
+ bus: EpicEventBus;
52
+ release: () => void;
53
+ }
54
+ export declare function acquireEpicBus(options: AcquireOptions): Promise<Acquired>;
55
+ /**
56
+ * Test-only: forcibly release all subscriptions. Use in test `afterEach`.
57
+ */
58
+ export declare function _resetRegistryForTests(): void;
59
+ //# sourceMappingURL=event-bus-registry.d.ts.map
@@ -0,0 +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"}