@agent-relay/factory 0.0.0 → 0.1.2

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 (235) hide show
  1. package/README.md +182 -23
  2. package/bin/factory.mjs +7 -0
  3. package/dist/cli/fleet.d.ts +81 -0
  4. package/dist/cli/fleet.d.ts.map +1 -0
  5. package/dist/cli/fleet.js +571 -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 +320 -0
  10. package/dist/config/schema.js.map +1 -0
  11. package/dist/constants/linear.d.ts +6 -0
  12. package/dist/constants/linear.d.ts.map +1 -0
  13. package/dist/constants/linear.js +21 -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 +52 -0
  20. package/dist/dispatch/templates.d.ts.map +1 -0
  21. package/dist/dispatch/templates.js +118 -0
  22. package/dist/dispatch/templates.js.map +1 -0
  23. package/dist/fleet/create-fleet.d.ts +14 -0
  24. package/dist/fleet/create-fleet.d.ts.map +1 -0
  25. package/dist/fleet/create-fleet.js +15 -0
  26. package/dist/fleet/create-fleet.js.map +1 -0
  27. package/dist/fleet/ensure-relay-broker.d.ts +24 -0
  28. package/dist/fleet/ensure-relay-broker.d.ts.map +1 -0
  29. package/dist/fleet/ensure-relay-broker.js +56 -0
  30. package/dist/fleet/ensure-relay-broker.js.map +1 -0
  31. package/dist/fleet/internal-fleet-client.d.ts +90 -0
  32. package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
  33. package/dist/fleet/internal-fleet-client.js +602 -0
  34. package/dist/fleet/internal-fleet-client.js.map +1 -0
  35. package/dist/fleet/relay-fleet-client.d.ts +105 -0
  36. package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
  37. package/dist/fleet/relay-fleet-client.js +509 -0
  38. package/dist/fleet/relay-fleet-client.js.map +1 -0
  39. package/dist/github/index.d.ts +5 -0
  40. package/dist/github/index.d.ts.map +1 -0
  41. package/dist/github/index.js +3 -0
  42. package/dist/github/index.js.map +1 -0
  43. package/dist/github/merge-gate.d.ts +47 -0
  44. package/dist/github/merge-gate.d.ts.map +1 -0
  45. package/dist/github/merge-gate.js +147 -0
  46. package/dist/github/merge-gate.js.map +1 -0
  47. package/dist/github/probe-closer.d.ts +15 -0
  48. package/dist/github/probe-closer.d.ts.map +1 -0
  49. package/dist/github/probe-closer.js +67 -0
  50. package/dist/github/probe-closer.js.map +1 -0
  51. package/dist/index.d.ts +36 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +20 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/issue-key-match.d.ts +3 -0
  56. package/dist/issue-key-match.d.ts.map +1 -0
  57. package/dist/issue-key-match.js +22 -0
  58. package/dist/issue-key-match.js.map +1 -0
  59. package/dist/linear/state-resolver.d.ts +26 -0
  60. package/dist/linear/state-resolver.d.ts.map +1 -0
  61. package/dist/linear/state-resolver.js +285 -0
  62. package/dist/linear/state-resolver.js.map +1 -0
  63. package/dist/mount/local-mount-preflight.d.ts +9 -0
  64. package/dist/mount/local-mount-preflight.d.ts.map +1 -0
  65. package/dist/mount/local-mount-preflight.js +149 -0
  66. package/dist/mount/local-mount-preflight.js.map +1 -0
  67. package/dist/mount/relayfile-binary.d.ts +9 -0
  68. package/dist/mount/relayfile-binary.d.ts.map +1 -0
  69. package/dist/mount/relayfile-binary.js +177 -0
  70. package/dist/mount/relayfile-binary.js.map +1 -0
  71. package/dist/mount/relayfile-cloud-mount-client.d.ts +123 -0
  72. package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -0
  73. package/dist/mount/relayfile-cloud-mount-client.js +427 -0
  74. package/dist/mount/relayfile-cloud-mount-client.js.map +1 -0
  75. package/dist/node/factory-node.d.ts +59 -0
  76. package/dist/node/factory-node.d.ts.map +1 -0
  77. package/dist/node/factory-node.js +351 -0
  78. package/dist/node/factory-node.js.map +1 -0
  79. package/dist/node/factory.node.d.ts +3 -0
  80. package/dist/node/factory.node.d.ts.map +1 -0
  81. package/dist/node/factory.node.js +5 -0
  82. package/dist/node/factory.node.js.map +1 -0
  83. package/dist/orchestrator/batch-tracker.d.ts +42 -0
  84. package/dist/orchestrator/batch-tracker.d.ts.map +1 -0
  85. package/dist/orchestrator/batch-tracker.js +125 -0
  86. package/dist/orchestrator/batch-tracker.js.map +1 -0
  87. package/dist/orchestrator/factory.d.ts +58 -0
  88. package/dist/orchestrator/factory.d.ts.map +1 -0
  89. package/dist/orchestrator/factory.js +4372 -0
  90. package/dist/orchestrator/factory.js.map +1 -0
  91. package/dist/orchestrator/index.d.ts +5 -0
  92. package/dist/orchestrator/index.d.ts.map +1 -0
  93. package/dist/orchestrator/index.js +4 -0
  94. package/dist/orchestrator/index.js.map +1 -0
  95. package/dist/orchestrator/process-identity.d.ts +23 -0
  96. package/dist/orchestrator/process-identity.d.ts.map +1 -0
  97. package/dist/orchestrator/process-identity.js +122 -0
  98. package/dist/orchestrator/process-identity.js.map +1 -0
  99. package/dist/orchestrator/reaper.d.ts +60 -0
  100. package/dist/orchestrator/reaper.d.ts.map +1 -0
  101. package/dist/orchestrator/reaper.js +293 -0
  102. package/dist/orchestrator/reaper.js.map +1 -0
  103. package/dist/ports/fleet.d.ts +101 -0
  104. package/dist/ports/fleet.d.ts.map +1 -0
  105. package/dist/ports/fleet.js +2 -0
  106. package/dist/ports/fleet.js.map +1 -0
  107. package/dist/ports/index.d.ts +5 -0
  108. package/dist/ports/index.d.ts.map +1 -0
  109. package/dist/ports/index.js +2 -0
  110. package/dist/ports/index.js.map +1 -0
  111. package/dist/ports/mount.d.ts +56 -0
  112. package/dist/ports/mount.d.ts.map +1 -0
  113. package/dist/ports/mount.js +2 -0
  114. package/dist/ports/mount.js.map +1 -0
  115. package/dist/ports/state.d.ts +61 -0
  116. package/dist/ports/state.d.ts.map +1 -0
  117. package/dist/ports/state.js +2 -0
  118. package/dist/ports/state.js.map +1 -0
  119. package/dist/ports/system.d.ts +15 -0
  120. package/dist/ports/system.d.ts.map +1 -0
  121. package/dist/ports/system.js +2 -0
  122. package/dist/ports/system.js.map +1 -0
  123. package/dist/ports/writeback.d.ts +25 -0
  124. package/dist/ports/writeback.d.ts.map +1 -0
  125. package/dist/ports/writeback.js +2 -0
  126. package/dist/ports/writeback.js.map +1 -0
  127. package/dist/safety/factory-scope.d.ts +16 -0
  128. package/dist/safety/factory-scope.d.ts.map +1 -0
  129. package/dist/safety/factory-scope.js +107 -0
  130. package/dist/safety/factory-scope.js.map +1 -0
  131. package/dist/state/in-memory-state-store.d.ts +31 -0
  132. package/dist/state/in-memory-state-store.d.ts.map +1 -0
  133. package/dist/state/in-memory-state-store.js +115 -0
  134. package/dist/state/in-memory-state-store.js.map +1 -0
  135. package/dist/state/index.d.ts +3 -0
  136. package/dist/state/index.d.ts.map +1 -0
  137. package/dist/state/index.js +2 -0
  138. package/dist/state/index.js.map +1 -0
  139. package/dist/state/store.d.ts +29 -0
  140. package/dist/state/store.d.ts.map +1 -0
  141. package/dist/state/store.js +26 -0
  142. package/dist/state/store.js.map +1 -0
  143. package/dist/subscriptions/common.d.ts +7 -0
  144. package/dist/subscriptions/common.d.ts.map +1 -0
  145. package/dist/subscriptions/common.js +59 -0
  146. package/dist/subscriptions/common.js.map +1 -0
  147. package/dist/subscriptions/event-client.d.ts +40 -0
  148. package/dist/subscriptions/event-client.d.ts.map +1 -0
  149. package/dist/subscriptions/event-client.js +234 -0
  150. package/dist/subscriptions/event-client.js.map +1 -0
  151. package/dist/subscriptions/globs.d.ts +5 -0
  152. package/dist/subscriptions/globs.d.ts.map +1 -0
  153. package/dist/subscriptions/globs.js +50 -0
  154. package/dist/subscriptions/globs.js.map +1 -0
  155. package/dist/subscriptions/index.d.ts +8 -0
  156. package/dist/subscriptions/index.d.ts.map +1 -0
  157. package/dist/subscriptions/index.js +5 -0
  158. package/dist/subscriptions/index.js.map +1 -0
  159. package/dist/subscriptions/linear-filter.d.ts +26 -0
  160. package/dist/subscriptions/linear-filter.d.ts.map +1 -0
  161. package/dist/subscriptions/linear-filter.js +143 -0
  162. package/dist/subscriptions/linear-filter.js.map +1 -0
  163. package/dist/subscriptions/specs.d.ts +44 -0
  164. package/dist/subscriptions/specs.d.ts.map +1 -0
  165. package/dist/subscriptions/specs.js +195 -0
  166. package/dist/subscriptions/specs.js.map +1 -0
  167. package/dist/testing/fakes.d.ts +114 -0
  168. package/dist/testing/fakes.d.ts.map +1 -0
  169. package/dist/testing/fakes.js +219 -0
  170. package/dist/testing/fakes.js.map +1 -0
  171. package/dist/testing/index.d.ts +2 -0
  172. package/dist/testing/index.d.ts.map +1 -0
  173. package/dist/testing/index.js +2 -0
  174. package/dist/testing/index.js.map +1 -0
  175. package/dist/triage/heuristic.d.ts +42 -0
  176. package/dist/triage/heuristic.d.ts.map +1 -0
  177. package/dist/triage/heuristic.js +326 -0
  178. package/dist/triage/heuristic.js.map +1 -0
  179. package/dist/triage/index.d.ts +7 -0
  180. package/dist/triage/index.d.ts.map +1 -0
  181. package/dist/triage/index.js +5 -0
  182. package/dist/triage/index.js.map +1 -0
  183. package/dist/triage/llm.d.ts +11 -0
  184. package/dist/triage/llm.d.ts.map +1 -0
  185. package/dist/triage/llm.js +48 -0
  186. package/dist/triage/llm.js.map +1 -0
  187. package/dist/triage/schema.d.ts +344 -0
  188. package/dist/triage/schema.d.ts.map +1 -0
  189. package/dist/triage/schema.js +37 -0
  190. package/dist/triage/schema.js.map +1 -0
  191. package/dist/triage/tiered.d.ts +8 -0
  192. package/dist/triage/tiered.d.ts.map +1 -0
  193. package/dist/triage/tiered.js +47 -0
  194. package/dist/triage/tiered.js.map +1 -0
  195. package/dist/types.d.ts +212 -0
  196. package/dist/types.d.ts.map +1 -0
  197. package/dist/types.js +2 -0
  198. package/dist/types.js.map +1 -0
  199. package/dist/webhook/handler.d.ts +22 -0
  200. package/dist/webhook/handler.d.ts.map +1 -0
  201. package/dist/webhook/handler.js +57 -0
  202. package/dist/webhook/handler.js.map +1 -0
  203. package/dist/webhook/index.d.ts +5 -0
  204. package/dist/webhook/index.d.ts.map +1 -0
  205. package/dist/webhook/index.js +3 -0
  206. package/dist/webhook/index.js.map +1 -0
  207. package/dist/webhook/registrar.d.ts +16 -0
  208. package/dist/webhook/registrar.d.ts.map +1 -0
  209. package/dist/webhook/registrar.js +50 -0
  210. package/dist/webhook/registrar.js.map +1 -0
  211. package/dist/writeback/github.d.ts +6 -0
  212. package/dist/writeback/github.d.ts.map +1 -0
  213. package/dist/writeback/github.js +48 -0
  214. package/dist/writeback/github.js.map +1 -0
  215. package/dist/writeback/index.d.ts +6 -0
  216. package/dist/writeback/index.d.ts.map +1 -0
  217. package/dist/writeback/index.js +4 -0
  218. package/dist/writeback/index.js.map +1 -0
  219. package/dist/writeback/linear.d.ts +41 -0
  220. package/dist/writeback/linear.d.ts.map +1 -0
  221. package/dist/writeback/linear.js +286 -0
  222. package/dist/writeback/linear.js.map +1 -0
  223. package/dist/writeback/shared.d.ts +7 -0
  224. package/dist/writeback/shared.d.ts.map +1 -0
  225. package/dist/writeback/shared.js +29 -0
  226. package/dist/writeback/shared.js.map +1 -0
  227. package/dist/writeback/slack.d.ts +16 -0
  228. package/dist/writeback/slack.d.ts.map +1 -0
  229. package/dist/writeback/slack.js +104 -0
  230. package/dist/writeback/slack.js.map +1 -0
  231. package/package.json +54 -9
  232. package/scripts/com.agentrelay.factory-canary.plist.example +53 -0
  233. package/scripts/factory-canary.sh +89 -0
  234. package/index.d.ts +0 -2
  235. package/index.js +0 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const parseJsonContent: (content: unknown) => unknown;
2
+ export declare const asRecord: (value: unknown) => Record<string, unknown> | undefined;
3
+ export declare const wrappedPayload: (content: unknown) => Record<string, unknown>;
4
+ export declare const stableHash: (input: string) => string;
5
+ export declare const safePathSegment: (input: string) => string;
6
+ export declare const trimToLines: (text: string, maxLines: number) => string;
7
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/writeback/shared.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,OAMnD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAGrD,CAAA;AAEf,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGvE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAQ1C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAMhC,CAAA;AAEhB,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACV,CAAA"}
@@ -0,0 +1,29 @@
1
+ export const parseJsonContent = (content) => {
2
+ if (typeof content !== 'string') {
3
+ return content;
4
+ }
5
+ return JSON.parse(content);
6
+ };
7
+ export const asRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value)
8
+ ? value
9
+ : undefined;
10
+ export const wrappedPayload = (content) => {
11
+ const record = asRecord(parseJsonContent(content)) ?? {};
12
+ return asRecord(record.payload) ?? record;
13
+ };
14
+ export const stableHash = (input) => {
15
+ let hash = 0x811c9dc5;
16
+ for (let index = 0; index < input.length; index += 1) {
17
+ hash ^= input.charCodeAt(index);
18
+ hash = Math.imul(hash, 0x01000193);
19
+ }
20
+ return (hash >>> 0).toString(36);
21
+ };
22
+ export const safePathSegment = (input) => input
23
+ .trim()
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9._-]+/g, '-')
26
+ .replace(/^-+|-+$/g, '')
27
+ || 'factory';
28
+ export const trimToLines = (text, maxLines) => text.split(/\r?\n/).slice(0, maxLines).join('\n');
29
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/writeback/shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAuC,EAAE,CAC9E,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAClE,CAAC,CAAC,KAAgC;IAClC,CAAC,CAAC,SAAS,CAAA;AAEf,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAA2B,EAAE;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IACxD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE;IAClD,IAAI,IAAI,GAAG,UAAU,CAAA;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CACvD,KAAK;KACF,IAAI,EAAE;KACN,WAAW,EAAE;KACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;KAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;OACrB,SAAS,CAAA;AAEhB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAU,EAAE,CACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { MountClient } from '../ports/index.js';
2
+ export interface MountSlackWritebackConfig {
3
+ channel?: string;
4
+ channelDir?: string;
5
+ clientIdPrefix?: string;
6
+ }
7
+ export declare const MountSlackWriteback: (mount: MountClient, slackCfg?: MountSlackWritebackConfig) => {
8
+ postThread(root: {
9
+ channel: string;
10
+ text: string;
11
+ }): Promise<{
12
+ threadId: string;
13
+ }>;
14
+ reply(threadId: string, text: string): Promise<void>;
15
+ };
16
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/writeback/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA0ED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,WAAW,EAClB,WAAU,yBAA8B;qBAWf;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;oBAsBlE,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B7D,CAAA"}
@@ -0,0 +1,104 @@
1
+ import { slackMessagePath, slackReplyPath } from '../constants/slack.js';
2
+ import { safePathSegment, stableHash, trimToLines, wrappedPayload } from './shared.js';
3
+ const channelIdFromDir = (channelDir) => channelDir.split('__')[0] ?? channelDir;
4
+ const channelSegment = (value) => {
5
+ const trimmed = value.trim().replace(/^#/u, '');
6
+ const match = trimmed.match(/(?:^|\/)slack\/channels\/([^/]+)/u);
7
+ return match?.[1] ?? trimmed.split('/')[0] ?? trimmed;
8
+ };
9
+ const channelAliases = (value) => {
10
+ const segment = typeof value === 'string' ? channelSegment(value) : '';
11
+ if (!segment)
12
+ return new Set();
13
+ const aliases = new Set();
14
+ const add = (candidate) => {
15
+ const normalized = candidate.trim().replace(/^#/u, '').toLowerCase();
16
+ if (normalized)
17
+ aliases.add(normalized);
18
+ };
19
+ add(segment);
20
+ const [id, name] = segment.split('__');
21
+ if (id)
22
+ add(id);
23
+ if (name)
24
+ add(name);
25
+ return aliases;
26
+ };
27
+ const assertSlackChannelAllowed = (configuredChannel, targetChannel, context) => {
28
+ const configured = channelAliases(configuredChannel);
29
+ const target = channelAliases(targetChannel);
30
+ if (configured.size === 0) {
31
+ throw new Error(`Refusing Slack writeback for ${context}: configured factory-e2e channel is required`);
32
+ }
33
+ if (target.size === 0 || ![...target].some((alias) => configured.has(alias))) {
34
+ throw new Error(`Refusing Slack writeback for ${context}: target channel must match configured factory-e2e channel`);
35
+ }
36
+ };
37
+ const pathTs = (threadTs) => threadTs.replace(/\./g, '_');
38
+ const payloadTs = (threadId) => threadId.replace(/_/g, '.');
39
+ const rootClientId = (prefix, channelDir, text) => `${safePathSegment(prefix)}-${safePathSegment(channelIdFromDir(channelDir))}-${stableHash(text)}`;
40
+ const replyClientId = (prefix, threadId, text) => `${safePathSegment(prefix)}-reply-${safePathSegment(threadId)}-${stableHash(text)}`;
41
+ const confirmPath = async (mount, path) => {
42
+ const confirmation = await mount.confirmWrite(path, { timeoutMs: 90_000 });
43
+ if (confirmation !== 'acked') {
44
+ throw new Error(`Writeback not acked for ${path}: ${confirmation}`);
45
+ }
46
+ return (await mount.readFile(path)).content;
47
+ };
48
+ const slackTsFromContent = (content) => {
49
+ const payload = wrappedPayload(content);
50
+ const ts = stringValue(payload.ts) ?? stringValue(payload.thread_ts);
51
+ return ts && /^\d+\.\d+$/u.test(ts) ? ts : undefined;
52
+ };
53
+ export const MountSlackWriteback = (mount, slackCfg = {}) => {
54
+ const threads = new Map();
55
+ const prefix = slackCfg.clientIdPrefix ?? 'factory';
56
+ const assertCloudWriteback = () => {
57
+ if (mount.writebackTransport !== 'relayfile-cloud' && mount.writebackTransport !== 'test') {
58
+ throw new Error('Slack writeback requires RelayfileCloudMountClient cloud writeback transport');
59
+ }
60
+ };
61
+ return {
62
+ async postThread(root) {
63
+ assertCloudWriteback();
64
+ const channelDir = slackCfg.channelDir ?? root.channel ?? slackCfg.channel;
65
+ assertSlackChannelAllowed(slackCfg.channel, root.channel, 'postThread');
66
+ assertSlackChannelAllowed(slackCfg.channel, channelDir, 'postThread path');
67
+ const text = trimToLines(root.text, 3);
68
+ const channelId = channelIdFromDir(channelDir);
69
+ const clientId = rootClientId(prefix, channelDir, text);
70
+ const path = slackMessagePath(channelDir, clientId);
71
+ await mount.writeFile(path, { channelId, text }, { guarded: true });
72
+ const content = await confirmPath(mount, path);
73
+ const threadTs = slackTsFromContent(content) ?? clientId;
74
+ threads.set(threadTs, { channelDir, channelId, threadTs });
75
+ if (threadTs !== clientId) {
76
+ threads.set(clientId, { channelDir, channelId, threadTs });
77
+ }
78
+ return { threadId: threadTs };
79
+ },
80
+ async reply(threadId, text) {
81
+ assertCloudWriteback();
82
+ const fallbackChannelDir = slackCfg.channelDir ?? slackCfg.channel;
83
+ assertSlackChannelAllowed(slackCfg.channel, fallbackChannelDir, 'reply');
84
+ const ref = threads.get(threadId) ?? (fallbackChannelDir
85
+ ? { channelDir: fallbackChannelDir, channelId: channelIdFromDir(fallbackChannelDir), threadTs: payloadTs(threadId) }
86
+ : undefined);
87
+ if (!ref) {
88
+ throw new Error(`Unknown Slack thread ${threadId}; provide channelDir in slack config`);
89
+ }
90
+ assertSlackChannelAllowed(slackCfg.channel, ref.channelDir, 'reply path');
91
+ const body = trimToLines(text, 3);
92
+ const clientId = replyClientId(prefix, threadId, body);
93
+ const path = slackReplyPath(ref.channelDir, pathTs(ref.threadTs), clientId);
94
+ await mount.writeFile(path, {
95
+ channelId: ref.channelId,
96
+ thread_ts: ref.threadTs,
97
+ text: body,
98
+ }, { guarded: true });
99
+ await confirmPath(mount, path);
100
+ },
101
+ };
102
+ };
103
+ const stringValue = (value) => typeof value === 'string' ? value : undefined;
104
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/writeback/slack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agent-relay/factory",
3
- "version": "0.0.0",
4
- "description": "Autonomous Linear-issue triage PR factory. Placeholder reservation; real package lands via the p4 extraction (pear/packages/factory-sdk → here).",
3
+ "version": "0.1.2",
4
+ "description": "Agent factory triage, dispatch, merge-gate for relayfile-driven workspaces",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -12,18 +12,63 @@
12
12
  "url": "https://github.com/AgentWorkforce/factory/issues"
13
13
  },
14
14
  "type": "module",
15
- "main": "index.js",
16
- "types": "index.d.ts",
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
17
20
  "files": [
18
- "index.js",
19
- "index.d.ts",
20
- "dist"
21
+ "dist",
22
+ "bin/factory.mjs",
23
+ "scripts/factory-canary.sh",
24
+ "scripts/com.agentrelay.factory-canary.plist.example",
25
+ "package.json",
26
+ "README.md"
21
27
  ],
28
+ "bin": {
29
+ "factory": "bin/factory.mjs"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./testing": {
37
+ "types": "./dist/testing/index.d.ts",
38
+ "import": "./dist/testing/index.js"
39
+ },
40
+ "./writeback": {
41
+ "types": "./dist/writeback/index.d.ts",
42
+ "import": "./dist/writeback/index.js"
43
+ },
44
+ "./node": {
45
+ "types": "./dist/node/factory.node.d.ts",
46
+ "import": "./dist/node/factory.node.js"
47
+ }
48
+ },
22
49
  "publishConfig": {
23
50
  "access": "public"
24
51
  },
25
52
  "scripts": {
26
- "build": "tsc -p tsconfig.build.json || true",
27
- "test": "true"
53
+ "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
54
+ "test": "vitest run",
55
+ "factory-build": "factory-build/run-factory-build.sh"
56
+ },
57
+ "dependencies": {
58
+ "@agent-relay/cloud": "^8.7.2",
59
+ "@agent-relay/harness-driver": "^8.3.7",
60
+ "@agent-relay/integration-prompts": "^8.8.3",
61
+ "@relayfile/sdk": "^0.8.29",
62
+ "agent-relay": "^8.8.1",
63
+ "zod": "^3.25.76"
64
+ },
65
+ "devDependencies": {
66
+ "@relayflows/cli": "^1.0.3",
67
+ "@relayflows/core": "^1.0.3",
68
+ "@types/node": "^22.10.2",
69
+ "esbuild": "^0.24.2",
70
+ "tsc-alias": "^1.8.17",
71
+ "typescript": "^5.7.0",
72
+ "vitest": "^4.1.8"
28
73
  }
29
74
  }
@@ -0,0 +1,53 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ launchd template for the factory sync-fidelity canary (see factory-canary.sh).
4
+
5
+ Install (macOS):
6
+ 1. Replace __FACTORY_WORKDIR__ with your factory deployment dir (the one with
7
+ factory.config.json), and __FACTORY_BIN__ with the path to factory.mjs
8
+ (e.g. node_modules/@agent-relay/factory/bin/factory.mjs). Set the issue key
9
+ and, optionally, FACTORY_CANARY_SLACK_WEBHOOK.
10
+ 2. cp scripts/com.agentrelay.factory-canary.plist.example \
11
+ ~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
12
+ 3. launchctl load ~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
13
+ 4. launchctl start com.agentrelay.factory-canary # run once now to verify
14
+
15
+ Runs every 6h (StartInterval 21600). Logs to <workdir>/.factory-canary.log.
16
+ Run from the deployment dir so the canary reuses the running relay broker.
17
+ -->
18
+ <plist version="1.0">
19
+ <dict>
20
+ <key>Label</key>
21
+ <string>com.agentrelay.factory-canary</string>
22
+
23
+ <key>ProgramArguments</key>
24
+ <array>
25
+ <string>/bin/bash</string>
26
+ <string>__FACTORY_WORKDIR__/scripts/factory-canary.sh</string>
27
+ </array>
28
+
29
+ <key>WorkingDirectory</key>
30
+ <string>__FACTORY_WORKDIR__</string>
31
+
32
+ <key>EnvironmentVariables</key>
33
+ <dict>
34
+ <key>FACTORY_CANARY_ISSUE</key>
35
+ <string>AR-305</string>
36
+ <key>FACTORY_WORKDIR</key>
37
+ <string>__FACTORY_WORKDIR__</string>
38
+ <key>FACTORY_BIN</key>
39
+ <string>__FACTORY_BIN__</string>
40
+ <key>FACTORY_CANARY_SLACK_WEBHOOK</key>
41
+ <string></string>
42
+ </dict>
43
+
44
+ <key>StartInterval</key>
45
+ <integer>21600</integer>
46
+ <key>RunAtLoad</key>
47
+ <true/>
48
+ <key>StandardOutPath</key>
49
+ <string>__FACTORY_WORKDIR__/.factory-canary.log</string>
50
+ <key>StandardErrorPath</key>
51
+ <string>__FACTORY_WORKDIR__/.factory-canary.log</string>
52
+ </dict>
53
+ </plist>
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # factory-canary.sh — scheduled sync-fidelity regression detector.
4
+ #
5
+ # Runs `factory canary <issue>` against the LIVE relayfile mount and asserts a
6
+ # known "Ready for Agent" issue is still classified dispatch-ready by the real
7
+ # triage path. If it ever flips to "skipped" (e.g. the Linear sync regresses to
8
+ # sparse records with no state.id), this exits non-zero and alerts — catching the
9
+ # regression before it silently blocks every factory dispatch.
10
+ #
11
+ # Run it on a schedule (cron/launchd) from your factory deployment directory —
12
+ # the one holding factory.config.json, where the relayfile mount + relay broker
13
+ # already live (so the canary reuses the running broker rather than spawning one).
14
+ # See scripts/com.agentrelay.factory-canary.plist.example for a launchd template.
15
+ #
16
+ # Config (env vars):
17
+ # FACTORY_CANARY_ISSUE Linear issue key to check (default: the first arg)
18
+ # FACTORY_WORKDIR deployment dir with factory.config.json (default: cwd)
19
+ # FACTORY_CONFIG config path, relative to FACTORY_WORKDIR (default: factory.config.json)
20
+ # FACTORY_BIN path to factory.mjs (default: this repo's bin/factory.mjs)
21
+ # FACTORY_BACKEND --backend value (default: internal)
22
+ # FACTORY_CANARY_TIMEOUT seconds before the canary is considered hung (default: 180)
23
+ # FACTORY_CANARY_SLACK_WEBHOOK optional Slack incoming-webhook URL for failure alerts
24
+ #
25
+ # Exit codes: 0 = dispatch-ready (healthy); 1 = NOT ready / error / hung.
26
+
27
+ set -uo pipefail
28
+
29
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
+ ISSUE="${FACTORY_CANARY_ISSUE:-${1:-}}"
31
+ WORKDIR="${FACTORY_WORKDIR:-$PWD}"
32
+ CONFIG="${FACTORY_CONFIG:-factory.config.json}"
33
+ BIN="${FACTORY_BIN:-$SCRIPT_DIR/../bin/factory.mjs}"
34
+ BACKEND="${FACTORY_BACKEND:-internal}"
35
+ TIMEOUT="${FACTORY_CANARY_TIMEOUT:-180}"
36
+ TS="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
37
+
38
+ if [[ -z "$ISSUE" ]]; then
39
+ echo "[$TS] factory-canary: no issue key (set FACTORY_CANARY_ISSUE or pass an arg)" >&2
40
+ exit 1
41
+ fi
42
+ if [[ ! -f "$BIN" ]]; then
43
+ echo "[$TS] factory-canary: factory bin not found at $BIN" >&2
44
+ exit 1
45
+ fi
46
+ cd "$WORKDIR" || { echo "[$TS] factory-canary: cannot cd to $WORKDIR" >&2; exit 1; }
47
+
48
+ # The canary runs the real dry-run triage path (no agents spawned) and prints a
49
+ # JSON verdict {ok,issue,status,reason}; exit code mirrors ok. A hung run
50
+ # (broker/mount wedge) is bounded by FACTORY_CANARY_TIMEOUT.
51
+ RUN=(node "$BIN" factory canary "$ISSUE" --config "$CONFIG" --backend "$BACKEND")
52
+ # A hung run (broker/mount wedge) MUST be bounded — an unbounded canary on a
53
+ # scheduler (launchd/cron) can wedge the slot forever and suppress later alerts.
54
+ # macOS has no `timeout` by default; coreutils ships it as `gtimeout`. If neither
55
+ # is present, fail closed rather than run without a deadline.
56
+ TIMEOUT_BIN=""
57
+ if command -v timeout >/dev/null 2>&1; then
58
+ TIMEOUT_BIN="timeout"
59
+ elif command -v gtimeout >/dev/null 2>&1; then
60
+ TIMEOUT_BIN="gtimeout"
61
+ fi
62
+ if [[ -z "$TIMEOUT_BIN" ]]; then
63
+ echo "[$TS] factory-canary: no timeout utility found (install coreutils for 'timeout'/'gtimeout'); refusing to run unbounded" >&2
64
+ exit 1
65
+ fi
66
+ OUT="$("$TIMEOUT_BIN" "$TIMEOUT" "${RUN[@]}" 2>/dev/null)"
67
+ CODE=$?
68
+ if [[ $CODE -eq 124 ]]; then
69
+ echo "[$TS] factory-canary: TIMED OUT after ${TIMEOUT}s (broker/mount may be wedged)" >&2
70
+ fi
71
+
72
+ # The CLI prints a pretty-printed (multi-line) JSON verdict, so parse the whole
73
+ # output — not just the last line (which is only the closing `}`).
74
+ echo "[$TS] factory-canary $ISSUE -> exit $CODE"
75
+ [[ $CODE -eq 0 ]] && exit 0
76
+
77
+ REASON="$(printf '%s' "$OUT" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const v=JSON.parse(s);console.log(`${v.status||"error"}: ${v.reason||"unknown"}`)}catch{console.log("unparseable verdict")}})' 2>/dev/null)"
78
+ MSG=":rotating_light: factory canary FAILED for ${ISSUE} — ${REASON}. Sync fidelity may have regressed (issue no longer dispatch-ready)."
79
+ echo "[$TS] $MSG" >&2
80
+
81
+ if [[ -n "${FACTORY_CANARY_SLACK_WEBHOOK:-}" ]]; then
82
+ curl -sS -m 15 -X POST -H 'Content-type: application/json' \
83
+ --data "$(node -e 'process.stdout.write(JSON.stringify({text:process.argv[1]}))' "$MSG")" \
84
+ "$FACTORY_CANARY_SLACK_WEBHOOK" >/dev/null 2>&1 \
85
+ && echo "[$TS] factory-canary: posted Slack alert" >&2 \
86
+ || echo "[$TS] factory-canary: Slack alert post failed" >&2
87
+ fi
88
+
89
+ exit 1
package/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- // @agent-relay/factory — placeholder reservation. Real types land via p4 extraction.
2
- export {};
package/index.js DELETED
@@ -1,7 +0,0 @@
1
- // @agent-relay/factory — placeholder reservation.
2
- //
3
- // The real package (orchestrator, triage, github merge-gate, fleet, state,
4
- // config) lands here via the p4 extraction of pear/packages/factory-sdk.
5
- // Until then this stub reserves the npm name and lets the publish workflow
6
- // + trusted-publisher setup land ahead of the real first release (0.1.0).
7
- export {};