@agent-relay/factory 0.0.0 → 0.1.1

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 (221) hide show
  1. package/README.md +240 -22
  2. package/bin/factory.mjs +7 -0
  3. package/dist/cli/fleet.d.ts +77 -0
  4. package/dist/cli/fleet.d.ts.map +1 -0
  5. package/dist/cli/fleet.js +500 -0
  6. package/dist/cli/fleet.js.map +1 -0
  7. package/dist/config/schema.d.ts +1313 -0
  8. package/dist/config/schema.d.ts.map +1 -0
  9. package/dist/config/schema.js +309 -0
  10. package/dist/config/schema.js.map +1 -0
  11. package/dist/constants/linear.d.ts +4 -0
  12. package/dist/constants/linear.d.ts.map +1 -0
  13. package/dist/constants/linear.js +15 -0
  14. package/dist/constants/linear.js.map +1 -0
  15. package/dist/constants/slack.d.ts +3 -0
  16. package/dist/constants/slack.d.ts.map +1 -0
  17. package/dist/constants/slack.js +3 -0
  18. package/dist/constants/slack.js.map +1 -0
  19. package/dist/dispatch/templates.d.ts +36 -0
  20. package/dist/dispatch/templates.d.ts.map +1 -0
  21. package/dist/dispatch/templates.js +110 -0
  22. package/dist/dispatch/templates.js.map +1 -0
  23. package/dist/fleet/create-fleet.d.ts +13 -0
  24. package/dist/fleet/create-fleet.d.ts.map +1 -0
  25. package/dist/fleet/create-fleet.js +14 -0
  26. package/dist/fleet/create-fleet.js.map +1 -0
  27. package/dist/fleet/internal-fleet-client.d.ts +85 -0
  28. package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
  29. package/dist/fleet/internal-fleet-client.js +575 -0
  30. package/dist/fleet/internal-fleet-client.js.map +1 -0
  31. package/dist/fleet/relay-fleet-client.d.ts +28 -0
  32. package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
  33. package/dist/fleet/relay-fleet-client.js +33 -0
  34. package/dist/fleet/relay-fleet-client.js.map +1 -0
  35. package/dist/github/index.d.ts +5 -0
  36. package/dist/github/index.d.ts.map +1 -0
  37. package/dist/github/index.js +3 -0
  38. package/dist/github/index.js.map +1 -0
  39. package/dist/github/merge-gate.d.ts +47 -0
  40. package/dist/github/merge-gate.d.ts.map +1 -0
  41. package/dist/github/merge-gate.js +147 -0
  42. package/dist/github/merge-gate.js.map +1 -0
  43. package/dist/github/probe-closer.d.ts +15 -0
  44. package/dist/github/probe-closer.d.ts.map +1 -0
  45. package/dist/github/probe-closer.js +67 -0
  46. package/dist/github/probe-closer.js.map +1 -0
  47. package/dist/index.d.ts +32 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +18 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/issue-key-match.d.ts +3 -0
  52. package/dist/issue-key-match.d.ts.map +1 -0
  53. package/dist/issue-key-match.js +22 -0
  54. package/dist/issue-key-match.js.map +1 -0
  55. package/dist/linear/state-resolver.d.ts +25 -0
  56. package/dist/linear/state-resolver.d.ts.map +1 -0
  57. package/dist/linear/state-resolver.js +221 -0
  58. package/dist/linear/state-resolver.js.map +1 -0
  59. package/dist/mount/local-mount-preflight.d.ts +8 -0
  60. package/dist/mount/local-mount-preflight.d.ts.map +1 -0
  61. package/dist/mount/local-mount-preflight.js +97 -0
  62. package/dist/mount/local-mount-preflight.js.map +1 -0
  63. package/dist/mount/relayfile-binary.d.ts +7 -0
  64. package/dist/mount/relayfile-binary.d.ts.map +1 -0
  65. package/dist/mount/relayfile-binary.js +143 -0
  66. package/dist/mount/relayfile-binary.js.map +1 -0
  67. package/dist/mount/relayfile-cloud-mount-client.d.ts +123 -0
  68. package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -0
  69. package/dist/mount/relayfile-cloud-mount-client.js +427 -0
  70. package/dist/mount/relayfile-cloud-mount-client.js.map +1 -0
  71. package/dist/orchestrator/batch-tracker.d.ts +42 -0
  72. package/dist/orchestrator/batch-tracker.d.ts.map +1 -0
  73. package/dist/orchestrator/batch-tracker.js +125 -0
  74. package/dist/orchestrator/batch-tracker.js.map +1 -0
  75. package/dist/orchestrator/factory.d.ts +55 -0
  76. package/dist/orchestrator/factory.d.ts.map +1 -0
  77. package/dist/orchestrator/factory.js +4018 -0
  78. package/dist/orchestrator/factory.js.map +1 -0
  79. package/dist/orchestrator/index.d.ts +5 -0
  80. package/dist/orchestrator/index.d.ts.map +1 -0
  81. package/dist/orchestrator/index.js +4 -0
  82. package/dist/orchestrator/index.js.map +1 -0
  83. package/dist/orchestrator/process-identity.d.ts +23 -0
  84. package/dist/orchestrator/process-identity.d.ts.map +1 -0
  85. package/dist/orchestrator/process-identity.js +122 -0
  86. package/dist/orchestrator/process-identity.js.map +1 -0
  87. package/dist/orchestrator/reaper.d.ts +60 -0
  88. package/dist/orchestrator/reaper.d.ts.map +1 -0
  89. package/dist/orchestrator/reaper.js +293 -0
  90. package/dist/orchestrator/reaper.js.map +1 -0
  91. package/dist/ports/fleet.d.ts +95 -0
  92. package/dist/ports/fleet.d.ts.map +1 -0
  93. package/dist/ports/fleet.js +2 -0
  94. package/dist/ports/fleet.js.map +1 -0
  95. package/dist/ports/index.d.ts +5 -0
  96. package/dist/ports/index.d.ts.map +1 -0
  97. package/dist/ports/index.js +2 -0
  98. package/dist/ports/index.js.map +1 -0
  99. package/dist/ports/mount.d.ts +56 -0
  100. package/dist/ports/mount.d.ts.map +1 -0
  101. package/dist/ports/mount.js +2 -0
  102. package/dist/ports/mount.js.map +1 -0
  103. package/dist/ports/state.d.ts +61 -0
  104. package/dist/ports/state.d.ts.map +1 -0
  105. package/dist/ports/state.js +2 -0
  106. package/dist/ports/state.js.map +1 -0
  107. package/dist/ports/system.d.ts +15 -0
  108. package/dist/ports/system.d.ts.map +1 -0
  109. package/dist/ports/system.js +2 -0
  110. package/dist/ports/system.js.map +1 -0
  111. package/dist/ports/writeback.d.ts +25 -0
  112. package/dist/ports/writeback.d.ts.map +1 -0
  113. package/dist/ports/writeback.js +2 -0
  114. package/dist/ports/writeback.js.map +1 -0
  115. package/dist/safety/factory-scope.d.ts +16 -0
  116. package/dist/safety/factory-scope.d.ts.map +1 -0
  117. package/dist/safety/factory-scope.js +107 -0
  118. package/dist/safety/factory-scope.js.map +1 -0
  119. package/dist/state/in-memory-state-store.d.ts +31 -0
  120. package/dist/state/in-memory-state-store.d.ts.map +1 -0
  121. package/dist/state/in-memory-state-store.js +115 -0
  122. package/dist/state/in-memory-state-store.js.map +1 -0
  123. package/dist/state/index.d.ts +3 -0
  124. package/dist/state/index.d.ts.map +1 -0
  125. package/dist/state/index.js +2 -0
  126. package/dist/state/index.js.map +1 -0
  127. package/dist/state/store.d.ts +29 -0
  128. package/dist/state/store.d.ts.map +1 -0
  129. package/dist/state/store.js +26 -0
  130. package/dist/state/store.js.map +1 -0
  131. package/dist/subscriptions/common.d.ts +7 -0
  132. package/dist/subscriptions/common.d.ts.map +1 -0
  133. package/dist/subscriptions/common.js +59 -0
  134. package/dist/subscriptions/common.js.map +1 -0
  135. package/dist/subscriptions/event-client.d.ts +40 -0
  136. package/dist/subscriptions/event-client.d.ts.map +1 -0
  137. package/dist/subscriptions/event-client.js +234 -0
  138. package/dist/subscriptions/event-client.js.map +1 -0
  139. package/dist/subscriptions/globs.d.ts +5 -0
  140. package/dist/subscriptions/globs.d.ts.map +1 -0
  141. package/dist/subscriptions/globs.js +50 -0
  142. package/dist/subscriptions/globs.js.map +1 -0
  143. package/dist/subscriptions/index.d.ts +8 -0
  144. package/dist/subscriptions/index.d.ts.map +1 -0
  145. package/dist/subscriptions/index.js +5 -0
  146. package/dist/subscriptions/index.js.map +1 -0
  147. package/dist/subscriptions/linear-filter.d.ts +26 -0
  148. package/dist/subscriptions/linear-filter.d.ts.map +1 -0
  149. package/dist/subscriptions/linear-filter.js +143 -0
  150. package/dist/subscriptions/linear-filter.js.map +1 -0
  151. package/dist/subscriptions/specs.d.ts +44 -0
  152. package/dist/subscriptions/specs.d.ts.map +1 -0
  153. package/dist/subscriptions/specs.js +195 -0
  154. package/dist/subscriptions/specs.js.map +1 -0
  155. package/dist/testing/fakes.d.ts +114 -0
  156. package/dist/testing/fakes.d.ts.map +1 -0
  157. package/dist/testing/fakes.js +219 -0
  158. package/dist/testing/fakes.js.map +1 -0
  159. package/dist/testing/index.d.ts +2 -0
  160. package/dist/testing/index.d.ts.map +1 -0
  161. package/dist/testing/index.js +2 -0
  162. package/dist/testing/index.js.map +1 -0
  163. package/dist/triage/heuristic.d.ts +38 -0
  164. package/dist/triage/heuristic.d.ts.map +1 -0
  165. package/dist/triage/heuristic.js +262 -0
  166. package/dist/triage/heuristic.js.map +1 -0
  167. package/dist/triage/index.d.ts +7 -0
  168. package/dist/triage/index.d.ts.map +1 -0
  169. package/dist/triage/index.js +5 -0
  170. package/dist/triage/index.js.map +1 -0
  171. package/dist/triage/llm.d.ts +11 -0
  172. package/dist/triage/llm.d.ts.map +1 -0
  173. package/dist/triage/llm.js +46 -0
  174. package/dist/triage/llm.js.map +1 -0
  175. package/dist/triage/schema.d.ts +240 -0
  176. package/dist/triage/schema.d.ts.map +1 -0
  177. package/dist/triage/schema.js +34 -0
  178. package/dist/triage/schema.js.map +1 -0
  179. package/dist/triage/tiered.d.ts +8 -0
  180. package/dist/triage/tiered.d.ts.map +1 -0
  181. package/dist/triage/tiered.js +40 -0
  182. package/dist/triage/tiered.js.map +1 -0
  183. package/dist/types.d.ts +211 -0
  184. package/dist/types.d.ts.map +1 -0
  185. package/dist/types.js +2 -0
  186. package/dist/types.js.map +1 -0
  187. package/dist/webhook/handler.d.ts +22 -0
  188. package/dist/webhook/handler.d.ts.map +1 -0
  189. package/dist/webhook/handler.js +57 -0
  190. package/dist/webhook/handler.js.map +1 -0
  191. package/dist/webhook/index.d.ts +5 -0
  192. package/dist/webhook/index.d.ts.map +1 -0
  193. package/dist/webhook/index.js +3 -0
  194. package/dist/webhook/index.js.map +1 -0
  195. package/dist/webhook/registrar.d.ts +16 -0
  196. package/dist/webhook/registrar.d.ts.map +1 -0
  197. package/dist/webhook/registrar.js +50 -0
  198. package/dist/webhook/registrar.js.map +1 -0
  199. package/dist/writeback/github.d.ts +6 -0
  200. package/dist/writeback/github.d.ts.map +1 -0
  201. package/dist/writeback/github.js +48 -0
  202. package/dist/writeback/github.js.map +1 -0
  203. package/dist/writeback/index.d.ts +6 -0
  204. package/dist/writeback/index.d.ts.map +1 -0
  205. package/dist/writeback/index.js +4 -0
  206. package/dist/writeback/index.js.map +1 -0
  207. package/dist/writeback/linear.d.ts +41 -0
  208. package/dist/writeback/linear.d.ts.map +1 -0
  209. package/dist/writeback/linear.js +243 -0
  210. package/dist/writeback/linear.js.map +1 -0
  211. package/dist/writeback/shared.d.ts +7 -0
  212. package/dist/writeback/shared.d.ts.map +1 -0
  213. package/dist/writeback/shared.js +29 -0
  214. package/dist/writeback/shared.js.map +1 -0
  215. package/dist/writeback/slack.d.ts +16 -0
  216. package/dist/writeback/slack.d.ts.map +1 -0
  217. package/dist/writeback/slack.js +104 -0
  218. package/dist/writeback/slack.js.map +1 -0
  219. package/package.json +46 -9
  220. package/index.d.ts +0 -2
  221. package/index.js +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiered.d.ts","sourceRoot":"","sources":["../../src/triage/tiered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGxF,qBAAa,YAAa,YAAW,YAAY;;gBAInC,SAAS,GAAE,YAAoC,EAAE,GAAG,CAAC,EAAE,YAAY;IAKzE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAiB9E;AAED,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,cAAc,EACjC,WAAW,EAAE,cAAc,EAC3B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,GACjB,cAAc,CAchB"}
@@ -0,0 +1,40 @@
1
+ import { buildDecision, HeuristicTriage, normalizeDecision } from './heuristic';
2
+ export class TieredTriage {
3
+ #heuristic;
4
+ #llm;
5
+ constructor(heuristic = new HeuristicTriage(), llm) {
6
+ this.#heuristic = heuristic;
7
+ this.#llm = llm;
8
+ }
9
+ async triage(issue, ctx) {
10
+ const heuristicDecision = await this.#heuristic.triage(issue, ctx);
11
+ if (!heuristicDecision.thin && heuristicDecision.confidence !== 'low') {
12
+ return heuristicDecision;
13
+ }
14
+ if (!this.#llm) {
15
+ return { ...heuristicDecision, confidence: 'low' };
16
+ }
17
+ try {
18
+ const llmDecision = await this.#llm.triage(issue, ctx);
19
+ return mergeDecisions(heuristicDecision, llmDecision, issue, ctx);
20
+ }
21
+ catch {
22
+ return { ...heuristicDecision, confidence: 'low' };
23
+ }
24
+ }
25
+ }
26
+ export function mergeDecisions(heuristicDecision, llmDecision, issue, ctx) {
27
+ const mergedRoutes = llmDecision.routes.length > 0 ? llmDecision.routes : heuristicDecision.routes;
28
+ const mergedScope = mergedRoutes.length >= 2 || llmDecision.scope === 'team' || heuristicDecision.scope === 'team' ? 'team' : 'single';
29
+ return normalizeDecision(buildDecision({
30
+ issue,
31
+ config: ctx.config,
32
+ routes: mergedRoutes,
33
+ scope: mergedScope,
34
+ thin: llmDecision.thin && heuristicDecision.thin,
35
+ confidence: mergedRoutes.length === 0 ? 'low' : llmDecision.confidence,
36
+ rationale: llmDecision.rationale || heuristicDecision.rationale,
37
+ scopeSlugs: llmDecision.implementers.map((implementer) => implementer.name.replace(/^ar-\d+-impl-?/, '')).filter(Boolean),
38
+ }), issue, ctx.config);
39
+ }
40
+ //# sourceMappingURL=tiered.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiered.js","sourceRoot":"","sources":["../../src/triage/tiered.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/E,MAAM,OAAO,YAAY;IACd,UAAU,CAAc;IACxB,IAAI,CAAe;IAE5B,YAAY,YAA0B,IAAI,eAAe,EAAE,EAAE,GAAkB;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,GAAkB;QACjD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAClE,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,iBAAiB,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACtE,OAAO,iBAAiB,CAAA;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACtD,OAAO,cAAc,CAAC,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;QACpD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAC5B,iBAAiC,EACjC,WAA2B,EAC3B,KAAkB,EAClB,GAAkB;IAElB,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAA;IAClG,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,KAAK,KAAK,MAAM,IAAI,iBAAiB,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEtI,OAAO,iBAAiB,CAAC,aAAa,CAAC;QACrC,KAAK;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI;QAChD,UAAU,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU;QACtE,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,iBAAiB,CAAC,SAAS;QAC/D,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1H,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC"}
@@ -0,0 +1,211 @@
1
+ import type { FactoryConfig } from './config/schema';
2
+ import type { FactoryStateResolution } from './linear/state-resolver';
3
+ import type { AgentSpec, FleetClient, GithubRead, LinearWriteback, MountClient, SlackWriteback } from './ports';
4
+ import type { StateStore } from './ports/state';
5
+ import type { Clock, Logger } from './ports/system';
6
+ import type { CloseProbePrInput, CloseProbePrResult } from './github/probe-closer';
7
+ import type { GhRunner, GithubMergeGate } from './github/merge-gate';
8
+ import type { AgentProcessFinder, ProcessIdentity } from './orchestrator/process-identity';
9
+ export interface FactoryPorts {
10
+ mount: MountClient;
11
+ fleet: FleetClient;
12
+ stateStore?: StateStore;
13
+ stateResolution?: FactoryStateResolution;
14
+ triage?: TriageEngine;
15
+ linear?: LinearWriteback;
16
+ slack?: SlackWriteback;
17
+ github?: GithubRead;
18
+ mergeGate?: GithubMergeGate;
19
+ probeCloser?: ProbeCloser;
20
+ probePrResolver?: ProbePrResolver;
21
+ probePrGhRunner?: GhRunner;
22
+ logger?: Logger;
23
+ clock?: Clock;
24
+ processIdentityReader?: (pid: number) => Promise<ProcessIdentity | undefined>;
25
+ processFinder?: AgentProcessFinder;
26
+ kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;
27
+ readChildPids?: (pid: number) => Promise<number[]>;
28
+ terminationGraceMs?: number;
29
+ }
30
+ export interface Factory {
31
+ start(opts?: FactoryStartOptions): Promise<void>;
32
+ stop(): Promise<void>;
33
+ dispose(): Promise<void>;
34
+ runOnce(opts?: {
35
+ dryRun?: boolean;
36
+ }): Promise<IterationReport>;
37
+ runLoop(opts?: FactoryLoopRunOptions): Promise<IterationReport[]>;
38
+ triageIssue(issue: LinearIssue): Promise<TriageDecision>;
39
+ dispatch(decision: TriageDecision, opts?: {
40
+ dryRun?: boolean;
41
+ }): Promise<DispatchResult>;
42
+ status(): FactoryStatus;
43
+ on(event: 'issue-queued' | 'dispatched' | 'issue-done' | 'writeback-verified' | 'error', listener: (payload: FactoryEventPayload) => void): () => void;
44
+ }
45
+ export interface FactoryStartOptions {
46
+ mode?: 'backfill-and-subscribe' | 'live';
47
+ liveSubscription?: Partial<FactoryLiveSubscriptionOptions>;
48
+ }
49
+ export interface FactoryLiveSubscriptionOptions {
50
+ transport: 'subscribe-and-poll' | 'subscribe' | 'poll';
51
+ pollIntervalMs: number;
52
+ eventLimit: number;
53
+ replaySkewMarginMs: number;
54
+ }
55
+ export interface FactoryLoopRunOptions {
56
+ dryRun?: boolean;
57
+ maxIterations?: number;
58
+ maxConsecutiveFailures?: number;
59
+ heartbeatPath?: string;
60
+ registryPath?: string;
61
+ }
62
+ export type FactoryLoopHeartbeatStatus = 'running' | 'idle' | 'stopping';
63
+ export interface FactoryLoopHeartbeat {
64
+ pid: number;
65
+ status: FactoryLoopHeartbeatStatus;
66
+ iteration: number;
67
+ maxIterations: number;
68
+ updatedAt: string;
69
+ updatedAtMs: number;
70
+ registryPath?: string;
71
+ }
72
+ export interface FactoryInFlightRegistryAgent {
73
+ name: string;
74
+ role?: AgentSpec['role'];
75
+ issue?: IssueRef;
76
+ sessionRef?: string;
77
+ pids: number[];
78
+ processes?: FactoryInFlightRegistryProcess[];
79
+ }
80
+ export interface FactoryInFlightRegistryProcess {
81
+ pid: number;
82
+ agentName: string;
83
+ cmdline: string;
84
+ startTime: string;
85
+ }
86
+ export interface FactoryInFlightRegistry {
87
+ pid: number;
88
+ heartbeatPath?: string;
89
+ updatedAt: string;
90
+ updatedAtMs: number;
91
+ agents: FactoryInFlightRegistryAgent[];
92
+ }
93
+ export interface FactoryLoopLiveness {
94
+ ok: boolean;
95
+ stale: boolean;
96
+ ageMs?: number;
97
+ heartbeat?: FactoryLoopHeartbeat;
98
+ reason?: string;
99
+ }
100
+ export interface LinearIssue {
101
+ uuid: string;
102
+ key: string;
103
+ title: string;
104
+ description: string;
105
+ stateId: string;
106
+ state?: {
107
+ name: string;
108
+ };
109
+ labels: string[];
110
+ project?: string;
111
+ team?: string;
112
+ assignee?: string;
113
+ path: string;
114
+ raw: Record<string, unknown>;
115
+ }
116
+ export interface IssueRef {
117
+ uuid: string;
118
+ key: string;
119
+ path: string;
120
+ }
121
+ export interface IterationReport {
122
+ pulled: IssueRef[];
123
+ triaged: TriageDecision[];
124
+ dispatched: DispatchResult[];
125
+ skipped: Array<{
126
+ issue: IssueRef;
127
+ reason: string;
128
+ }>;
129
+ dryRun: boolean;
130
+ slackDegraded?: boolean;
131
+ error?: {
132
+ message: string;
133
+ stack?: string;
134
+ };
135
+ }
136
+ export interface DispatchResult {
137
+ issue: IssueRef;
138
+ agents: Array<{
139
+ name: string;
140
+ role: AgentSpec['role'];
141
+ }>;
142
+ comments?: string[];
143
+ stateId?: string;
144
+ dryRun: boolean;
145
+ }
146
+ export interface FactoryStatus {
147
+ inFlight: IssueRef[];
148
+ queued: IssueRef[];
149
+ counters: Record<string, number>;
150
+ slackDegraded?: boolean;
151
+ slackDegradedReason?: string;
152
+ }
153
+ export type FactoryEventPayload = {
154
+ issue: IssueRef;
155
+ } | {
156
+ issue: IssueRef;
157
+ result: DispatchResult;
158
+ } | {
159
+ issue: IssueRef;
160
+ path: string;
161
+ } | {
162
+ error: unknown;
163
+ errorMessage: string;
164
+ errorStack?: string;
165
+ issue?: IssueRef;
166
+ };
167
+ export interface TriageEngine {
168
+ triage(issue: LinearIssue, ctx: TriageContext): Promise<TriageDecision>;
169
+ }
170
+ export interface TriageContext {
171
+ config: FactoryConfig;
172
+ repoMap: RepoMapEntry[];
173
+ }
174
+ export interface RepoMapEntry {
175
+ repo: string;
176
+ clonePath?: string;
177
+ source: 'label' | 'project' | 'keyword' | 'default';
178
+ key?: string;
179
+ }
180
+ export interface TriageDecision {
181
+ issue: IssueRef;
182
+ routes: Array<{
183
+ repo: string;
184
+ clonePath?: string;
185
+ rationale: string;
186
+ }>;
187
+ scope: 'single' | 'team';
188
+ implementers: AgentSpec[];
189
+ reviewer: AgentSpec;
190
+ thin: boolean;
191
+ confidence: 'high' | 'low';
192
+ rationale: string;
193
+ }
194
+ export interface PrSummary {
195
+ repo: string;
196
+ number: number;
197
+ title?: string;
198
+ url?: string;
199
+ /** Advisory only: mount snapshots can lag live GitHub state. Never use this for merge readiness. */
200
+ state?: string;
201
+ headRef?: string;
202
+ baseRef?: string;
203
+ author?: string;
204
+ filesChanged?: string[];
205
+ }
206
+ export type ProbePrRef = Pick<CloseProbePrInput, 'repo' | 'prNumber'> & {
207
+ draft?: boolean;
208
+ };
209
+ export type ProbePrResolver = (issue: LinearIssue) => Promise<ProbePrRef | undefined>;
210
+ export type ProbeCloser = (input: Pick<CloseProbePrInput, 'repo' | 'prNumber' | 'expectedIssueKey' | 'requireTitleMarker'>) => Promise<CloseProbePrResult>;
211
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ export interface WebhookEvent {
2
+ type: string;
3
+ path: string;
4
+ revision: string;
5
+ eventId: string;
6
+ contentHash?: string;
7
+ provider?: string;
8
+ correlationId?: string;
9
+ timestamp: string;
10
+ }
11
+ export interface WebhookHandlerConfig {
12
+ secret: string;
13
+ onLinearEvent: (event: WebhookEvent) => Promise<void>;
14
+ onSlackEvent: (event: WebhookEvent) => Promise<void>;
15
+ onGithubEvent: (event: WebhookEvent) => Promise<void>;
16
+ }
17
+ export declare class WebhookHandler {
18
+ #private;
19
+ constructor(config: WebhookHandlerConfig);
20
+ handle(request: Request): Promise<Response>;
21
+ }
22
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/webhook/handler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtD;AAED,qBAAa,cAAc;;gBAIb,MAAM,EAAE,oBAAoB;IAIlC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CA2ClD"}
@@ -0,0 +1,57 @@
1
+ import { createHmac, timingSafeEqual as cryptoTimingSafeEqual } from 'node:crypto';
2
+ export class WebhookHandler {
3
+ #config;
4
+ #seen = new Set();
5
+ constructor(config) {
6
+ this.#config = config;
7
+ }
8
+ async handle(request) {
9
+ const timestamp = request.headers.get('x-relay-timestamp') ?? '';
10
+ const signature = request.headers.get('x-relay-signature') ?? '';
11
+ const headerEventId = request.headers.get('x-relay-event-id') ?? '';
12
+ const rawBody = await request.text();
13
+ const expected = createHmac('sha256', this.#config.secret)
14
+ .update(`${timestamp}.${rawBody}`)
15
+ .digest('hex');
16
+ if (!timingSafeHexEqual(expected, signature)) {
17
+ return new Response('forbidden', { status: 403 });
18
+ }
19
+ let event;
20
+ try {
21
+ event = JSON.parse(rawBody);
22
+ }
23
+ catch {
24
+ return new Response('bad_request', { status: 400 });
25
+ }
26
+ const eventId = event.eventId || headerEventId;
27
+ if (eventId && this.#seen.has(eventId)) {
28
+ return new Response('ok', { status: 200 });
29
+ }
30
+ try {
31
+ if (event.path.startsWith('/linear/issues/')) {
32
+ await this.#config.onLinearEvent(event);
33
+ }
34
+ else if (event.path.startsWith('/slack/channels/')) {
35
+ await this.#config.onSlackEvent(event);
36
+ }
37
+ else if (event.path.startsWith('/github/repos/')) {
38
+ await this.#config.onGithubEvent(event);
39
+ }
40
+ }
41
+ catch {
42
+ return new Response('internal_error', { status: 500 });
43
+ }
44
+ if (eventId) {
45
+ this.#seen.add(eventId);
46
+ }
47
+ return new Response('ok', { status: 200 });
48
+ }
49
+ }
50
+ function timingSafeHexEqual(a, b) {
51
+ if (a.length !== b.length)
52
+ return false;
53
+ const bufA = Buffer.from(a, 'hex');
54
+ const bufB = Buffer.from(b, 'hex');
55
+ return bufA.length === bufB.length && cryptoTimingSafeEqual(bufA, bufB);
56
+ }
57
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/webhook/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { WebhookHandler } from './handler.js';
2
+ export type { WebhookHandlerConfig, WebhookEvent } from './handler.js';
3
+ export { WebhookRegistrar } from './registrar.js';
4
+ export type { WebhookRegistrarConfig } from './registrar.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { WebhookHandler } from './handler.js';
2
+ export { WebhookRegistrar } from './registrar.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { RelayFileClient } from '@relayfile/sdk';
2
+ export interface WebhookRegistrarConfig {
3
+ client: RelayFileClient;
4
+ workspaceId: string;
5
+ receiverUrl: string;
6
+ secret: string;
7
+ pathGlobs?: string[];
8
+ }
9
+ export declare class WebhookRegistrar {
10
+ #private;
11
+ constructor(config: WebhookRegistrarConfig);
12
+ register(): Promise<void>;
13
+ unregister(): Promise<void>;
14
+ get subscriptionId(): string | undefined;
15
+ }
16
+ //# sourceMappingURL=registrar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registrar.d.ts","sourceRoot":"","sources":["../../src/webhook/registrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,gBAAgB,CAAA;AAQ1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,qBAAa,gBAAgB;;gBAIf,MAAM,EAAE,sBAAsB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,cAAc,IAAI,MAAM,GAAG,SAAS,CAEvC;CASF"}
@@ -0,0 +1,50 @@
1
+ const DEFAULT_PATH_GLOBS = [
2
+ '/linear/issues/**',
3
+ '/slack/channels/**',
4
+ '/github/repos/**',
5
+ ];
6
+ export class WebhookRegistrar {
7
+ #config;
8
+ #subscriptionId;
9
+ constructor(config) {
10
+ this.#config = config;
11
+ }
12
+ async register() {
13
+ if (this.#subscriptionId)
14
+ return;
15
+ const pathGlobs = this.#config.pathGlobs ?? DEFAULT_PATH_GLOBS;
16
+ const existing = await this.#findExistingSubscription(pathGlobs);
17
+ if (existing) {
18
+ this.#subscriptionId = existing.id;
19
+ return;
20
+ }
21
+ const subscription = await this.#config.client.registerWebhook({
22
+ workspaceId: this.#config.workspaceId,
23
+ url: this.#config.receiverUrl,
24
+ pathGlobs,
25
+ secret: this.#config.secret,
26
+ });
27
+ this.#subscriptionId = subscription.subscriptionId;
28
+ }
29
+ async unregister() {
30
+ if (!this.#subscriptionId)
31
+ return;
32
+ await this.#config.client.deleteWebhook(this.#config.workspaceId, this.#subscriptionId);
33
+ this.#subscriptionId = undefined;
34
+ }
35
+ get subscriptionId() {
36
+ return this.#subscriptionId;
37
+ }
38
+ async #findExistingSubscription(pathGlobs) {
39
+ const subscriptions = await this.#config.client.listWebhooks(this.#config.workspaceId);
40
+ return subscriptions.find((subscription) => (subscription.url === this.#config.receiverUrl
41
+ && sameStringSet(subscription.pathGlobs, pathGlobs)));
42
+ }
43
+ }
44
+ function sameStringSet(a, b) {
45
+ if (a.length !== b.length)
46
+ return false;
47
+ const bSet = new Set(b);
48
+ return a.every((value) => bSet.has(value));
49
+ }
50
+ //# sourceMappingURL=registrar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registrar.js","sourceRoot":"","sources":["../../src/webhook/registrar.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG;IACzB,mBAAmB;IACnB,oBAAoB;IACpB,kBAAkB;CACnB,CAAA;AAUD,MAAM,OAAO,gBAAgB;IAClB,OAAO,CAAwB;IACxC,eAAe,CAAS;IAExB,YAAY,MAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,eAAe;YAAE,OAAM;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,EAAE,CAAA;YAClC,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;YAC7D,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YAC7B,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,cAAc,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAM;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CACrC,IAAI,CAAC,OAAO,CAAC,WAAW,EACxB,IAAI,CAAC,eAAe,CACrB,CAAA;QACD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;IAClC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,SAAmB;QACjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACtF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAC1C,YAAY,CAAC,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW;eAC1C,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CACpD,CAAC,CAAA;IACJ,CAAC;CACF;AAED,SAAS,aAAa,CAAC,CAAW,EAAE,CAAW;IAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { MountClient } from '../ports';
2
+ import type { PrSummary } from '../types';
3
+ export declare const MountGithubRead: (mount: MountClient) => {
4
+ getPr(repo: string, number: number): Promise<PrSummary>;
5
+ };
6
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/writeback/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAmBzC,eAAO,MAAM,eAAe,GAAI,OAAO,WAAW;gBAC9B,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAgB7D,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { asRecord, wrappedPayload } from './shared';
2
+ const repoDir = (repo) => {
3
+ if (repo.includes('__')) {
4
+ return repo;
5
+ }
6
+ const [owner, name] = repo.split('/');
7
+ if (!owner || !name) {
8
+ throw new Error(`GitHub repo must be owner/repo or owner__repo: ${repo}`);
9
+ }
10
+ return `${owner}__${name}`;
11
+ };
12
+ const prPath = (repo, number) => `/github/repos/${repoDir(repo)}/pulls/by-id/${number}.json`;
13
+ export const MountGithubRead = (mount) => ({
14
+ async getPr(repo, number) {
15
+ const { content } = await mount.readFile(prPath(repo, number));
16
+ const payload = wrappedPayload(content);
17
+ return {
18
+ repo,
19
+ number: numberValue(payload.number) ?? number,
20
+ title: typeof payload.title === 'string' ? payload.title : undefined,
21
+ url: typeof payload.url === 'string' ? payload.url : undefined,
22
+ state: typeof payload.state === 'string' ? payload.state : undefined,
23
+ headRef: refName(payload.headRef) ?? refName(payload.head) ?? stringValue(payload.head_ref),
24
+ baseRef: refName(payload.baseRef) ?? refName(payload.base) ?? stringValue(payload.base_ref),
25
+ author: refName(payload.author) ?? stringValue(payload.user),
26
+ filesChanged: filesChanged(payload.files_changed ?? payload.filesChanged ?? payload.files),
27
+ };
28
+ },
29
+ });
30
+ const stringValue = (value) => typeof value === 'string' ? value : undefined;
31
+ const numberValue = (value) => typeof value === 'number' ? value : undefined;
32
+ const refName = (value) => {
33
+ if (typeof value === 'string') {
34
+ return value;
35
+ }
36
+ const record = asRecord(value);
37
+ return stringValue(record?.name) ?? stringValue(record?.ref) ?? stringValue(record?.login);
38
+ };
39
+ const filesChanged = (value) => {
40
+ if (!Array.isArray(value)) {
41
+ return undefined;
42
+ }
43
+ const files = value
44
+ .map((entry) => typeof entry === 'string' ? entry : stringValue(asRecord(entry)?.path) ?? stringValue(asRecord(entry)?.filename))
45
+ .filter((entry) => Boolean(entry));
46
+ return files.length > 0 ? files : undefined;
47
+ };
48
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/writeback/github.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEnD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE;IACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,GAAG,KAAK,KAAK,IAAI,EAAE,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE,CACtD,iBAAiB,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,OAAO,CAAA;AAE7D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAkB,EAAE,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,MAAc;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;QAEvC,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM;YAC7C,KAAK,EAAE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACpE,GAAG,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YAC9D,KAAK,EAAE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3F,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3F,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5D,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;SAC3F,CAAA;IACH,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAE/C,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAE/C,MAAM,OAAO,GAAG,CAAC,KAAc,EAAsB,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC5F,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,KAAc,EAAwB,EAAE;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;SAChI,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACrD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { linearCommentName, MountLinearWriteback, } from './linear';
2
+ export type { LinearCommentPayload, LinearCreateIssuePayload, LinearStateIds, MountLinearWritebackConfig, } from './linear';
3
+ export { MountSlackWriteback, } from './slack';
4
+ export type { MountSlackWritebackConfig, } from './slack';
5
+ export { MountGithubRead, } from './github';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writeback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACd,0BAA0B,GAC3B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,yBAAyB,GAC1B,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,eAAe,GAChB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { linearCommentName, MountLinearWriteback, } from './linear';
2
+ export { MountSlackWriteback, } from './slack';
3
+ export { MountGithubRead, } from './github';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writeback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAA;AAOjB,OAAO,EACL,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAIhB,OAAO,EACL,eAAe,GAChB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,41 @@
1
+ import type { MountClient } from '../ports';
2
+ import type { Logger } from '../ports/system';
3
+ import type { LinearIssue } from '../types';
4
+ export interface LinearStateIds {
5
+ [name: string]: string;
6
+ }
7
+ export interface LinearCommentPayload {
8
+ body: string;
9
+ issueId: string;
10
+ }
11
+ export interface MountLinearWritebackConfig {
12
+ stateIds?: LinearStateIds;
13
+ safety?: {
14
+ requireTitlePrefix?: string;
15
+ requireLabel?: string;
16
+ requireTeamKey?: string;
17
+ };
18
+ logger?: Pick<Logger, 'warn'>;
19
+ }
20
+ export interface LinearCreateIssuePayload extends Record<string, unknown> {
21
+ id?: string;
22
+ identifier?: string;
23
+ title?: string;
24
+ teamId?: string;
25
+ team?: unknown;
26
+ labels?: unknown;
27
+ source?: unknown;
28
+ }
29
+ export declare const linearCommentName: (issue: LinearIssue, body: string) => string;
30
+ export declare const MountLinearWriteback: (mount: MountClient, configOrStateIds?: LinearStateIds | MountLinearWritebackConfig) => {
31
+ setState(issue: LinearIssue, stateId: string): Promise<void>;
32
+ postComment(issue: LinearIssue, body: string): Promise<void>;
33
+ createIssue(payload: LinearCreateIssuePayload): Promise<{
34
+ path: string;
35
+ }>;
36
+ verify(issue: LinearIssue, expect: {
37
+ stateId?: string;
38
+ commentName?: string;
39
+ }): Promise<boolean>;
40
+ };
41
+ //# sourceMappingURL=linear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE;QACP,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAKD,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,MAAM,MAAM,KAAG,MACxB,CAAA;AAwF7C,eAAO,MAAM,oBAAoB,GAC/B,OAAO,WAAW,EAClB,mBAAmB,cAAc,GAAG,0BAA0B;oBAsEtC,WAAW,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;uBAYzC,WAAW,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBASvC,wBAAwB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;kBAiBtE,WAAW,UACV;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,OAAO,CAAC;CAkBtB,CAAA"}