@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,243 @@
1
+ import { linearCommentPath, linearIssuePath } from '../constants/linear';
2
+ import { assertInFactoryScope, isInFactoryScope } from '../safety/factory-scope';
3
+ import { asRecord, safePathSegment, stableHash, wrappedPayload } from './shared';
4
+ const issuePath = (issue) => issue.path || linearIssuePath(issue.key, issue.uuid);
5
+ export const linearCommentName = (issue, body) => `${issue.key}__factory-${stableHash(body)}`;
6
+ const linearCommentPayload = (issue, body) => ({
7
+ body,
8
+ issueId: issue.uuid,
9
+ });
10
+ const safetyFromConfig = (configOrStateIds) => {
11
+ const safety = asRecord(asRecord(configOrStateIds)?.safety);
12
+ if (safety) {
13
+ return {
14
+ requireTitlePrefix: typeof safety.requireTitlePrefix === 'string' && safety.requireTitlePrefix
15
+ ? safety.requireTitlePrefix
16
+ : '[factory-e2e]',
17
+ requireLabel: typeof safety.requireLabel === 'string'
18
+ ? safety.requireLabel
19
+ : 'factory',
20
+ requireTeamKey: typeof safety.requireTeamKey === 'string' && safety.requireTeamKey
21
+ ? safety.requireTeamKey
22
+ : 'AR',
23
+ };
24
+ }
25
+ return { requireTitlePrefix: '[factory-e2e]', requireLabel: 'factory', requireTeamKey: 'AR' };
26
+ };
27
+ const payloadInFactoryScope = (payload, safety) => {
28
+ return isInFactoryScope(scopeIssueFromPayload(payload, 'createIssue payload'), safety);
29
+ };
30
+ const readIssuePayloadForGuard = async (mount, issue) => {
31
+ const path = issuePath(issue);
32
+ try {
33
+ return wrappedPayload((await mount.readFile(path)).content);
34
+ }
35
+ catch {
36
+ throw new Error(`Refusing Linear writeback for ${issue.key}: unable to read guard fields from ${path}`);
37
+ }
38
+ };
39
+ const createIssuePath = (payload) => {
40
+ const id = typeof payload.id === 'string' && payload.id ? payload.id : undefined;
41
+ if (id)
42
+ return `/linear/issues/factory-create-${safePathSegment(id)}.json`;
43
+ const identifier = typeof payload.identifier === 'string' && payload.identifier ? payload.identifier : undefined;
44
+ if (identifier && !looksLikeProviderIssueIdentifier(identifier)) {
45
+ return `/linear/issues/${safePathSegment(identifier)}.json`;
46
+ }
47
+ throw new Error('Linear createIssue payload must include a non-provider id/clientId');
48
+ };
49
+ const looksLikeProviderIssueIdentifier = (value) => /^[A-Z][A-Z0-9]*-/u.test(value);
50
+ const confirmWriteback = async (mount, path, verify, logger) => {
51
+ await assertWritebackAcked(mount, path);
52
+ try {
53
+ if (!await verify()) {
54
+ logger.warn?.(`[factory-sdk] Linear writeback read-back verification failed for ${path}; treating getOp ack as success`);
55
+ }
56
+ }
57
+ catch (error) {
58
+ logger.warn?.(`[factory-sdk] Linear writeback read-back verification errored for ${path}; treating getOp ack as success`, error);
59
+ }
60
+ };
61
+ const assertWritebackAcked = async (mount, path) => {
62
+ const confirmation = await mount.confirmWrite(path, { timeoutMs: 90_000 });
63
+ if (confirmation !== 'acked') {
64
+ throw new Error(`Writeback not acked for ${path}: ${confirmation}`);
65
+ }
66
+ };
67
+ export const MountLinearWriteback = (mount, configOrStateIds) => {
68
+ const safety = safetyFromConfig(configOrStateIds);
69
+ const logger = asRecord(configOrStateIds)?.logger ?? console;
70
+ const canonicalByPath = new Map();
71
+ const seedCanonical = (path, payload) => {
72
+ if (!payloadInFactoryScope(payload, safety))
73
+ return undefined;
74
+ const canonical = {
75
+ payload: { ...payload },
76
+ writable: createIssueWritePayload(payload),
77
+ };
78
+ canonicalByPath.set(path, canonical);
79
+ return canonical;
80
+ };
81
+ const rawIssuePayload = (issue) => wrappedPayload(issue.raw);
82
+ const canonicalForIssue = async (issue) => {
83
+ const path = issuePath(issue);
84
+ const rawPayload = rawIssuePayload(issue);
85
+ let canonical = canonicalByPath.get(path);
86
+ if (payloadInFactoryScope(rawPayload, safety)) {
87
+ canonical = seedCanonical(path, rawPayload);
88
+ }
89
+ else if (!canonical) {
90
+ throw new Error(`Refusing Linear writeback for ${issue.key}: missing title-bearing canonical issue payload`);
91
+ }
92
+ if (!canonical) {
93
+ throw new Error(`Refusing Linear writeback for ${issue.key}: missing title-bearing canonical issue payload`);
94
+ }
95
+ const livePayload = await readIssuePayloadForGuard(mount, issue);
96
+ if (payloadInFactoryScope(livePayload, safety)) {
97
+ seedCanonical(path, livePayload);
98
+ return canonical;
99
+ }
100
+ if (isStateOnlyDraft(livePayload)) {
101
+ const cached = canonicalByPath.get(path);
102
+ if (cached)
103
+ return cached;
104
+ throw new Error(`Refusing Linear writeback for ${issue.key}: missing title-bearing canonical issue payload`);
105
+ }
106
+ assertInFactoryScope(scopeIssueFromPayload(livePayload, issue.key), safety);
107
+ throw new Error(`Refusing Linear writeback for ${issue.key}: missing title-bearing canonical issue payload`);
108
+ };
109
+ const updateCanonicalState = (path, issue, canonical, stateId) => {
110
+ const payload = { ...canonical.payload, stateId };
111
+ canonicalByPath.set(path, {
112
+ payload,
113
+ writable: { ...canonical.writable, stateId },
114
+ });
115
+ issue.stateId = stateId;
116
+ const rawPayload = asRecord(issue.raw.payload);
117
+ issue.raw = rawPayload
118
+ ? { ...issue.raw, payload: { ...rawPayload, stateId } }
119
+ : { ...issue.raw, stateId };
120
+ };
121
+ const adapter = {
122
+ async setState(issue, stateId) {
123
+ const path = issuePath(issue);
124
+ const canonical = await canonicalForIssue(issue);
125
+ assertInFactoryScope(scopeIssueFromPayload(canonical.payload, issue.key), safety);
126
+ await mount.writeFile(path, {
127
+ ...canonical.writable,
128
+ stateId,
129
+ }, { guarded: true });
130
+ updateCanonicalState(path, issue, canonical, stateId);
131
+ await confirmWriteback(mount, path, () => verifyStateReadback(mount, issue, stateId), logger);
132
+ },
133
+ async postComment(issue, body) {
134
+ const canonical = await canonicalForIssue(issue);
135
+ assertInFactoryScope(scopeIssueFromPayload(canonical.payload, issue.key), safety);
136
+ const name = linearCommentName(issue, body);
137
+ const path = linearCommentPath(issuePath(issue), name);
138
+ await mount.writeFile(path, linearCommentPayload(issue, body), { guarded: true });
139
+ await confirmWriteback(mount, path, () => verifyCommentReadback(mount, issue, name), logger);
140
+ },
141
+ async createIssue(payload) {
142
+ assertInFactoryScope(scopeIssueFromPayload(payload, 'createIssue payload'), safety, 'createIssue payload');
143
+ const path = createIssuePath(payload);
144
+ seedCanonical(path, payload);
145
+ await mount.writeFile(path, createIssueDraftPayload(payload), { guarded: true });
146
+ await confirmWriteback(mount, path, async () => {
147
+ try {
148
+ const written = wrappedPayload((await mount.readFile(path)).content);
149
+ return payloadInFactoryScope(written, safety);
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }, logger);
155
+ return { path };
156
+ },
157
+ async verify(issue, expect) {
158
+ if (expect.stateId) {
159
+ const path = issuePath(issue);
160
+ await assertWritebackAcked(mount, path);
161
+ return verifyStateReadback(mount, issue, expect.stateId);
162
+ }
163
+ if (expect.commentName) {
164
+ const path = linearCommentPath(issuePath(issue), expect.commentName);
165
+ await assertWritebackAcked(mount, path);
166
+ return verifyCommentReadback(mount, issue, expect.commentName);
167
+ }
168
+ return false;
169
+ },
170
+ };
171
+ return adapter;
172
+ };
173
+ const isStateOnlyDraft = (payload) => {
174
+ const keys = Object.keys(payload);
175
+ return keys.length === 1 && keys[0] === 'stateId' && typeof payload.stateId === 'string';
176
+ };
177
+ const verifyStateReadback = async (mount, issue, stateId) => {
178
+ try {
179
+ const { content } = await mount.readFile(issuePath(issue));
180
+ const payload = wrappedPayload(content);
181
+ return payload.stateId === stateId;
182
+ }
183
+ catch {
184
+ return false;
185
+ }
186
+ };
187
+ const verifyCommentReadback = async (mount, issue, commentName) => {
188
+ try {
189
+ const { content } = await mount.readFile(linearCommentPath(issuePath(issue), commentName));
190
+ const payload = wrappedPayload(content);
191
+ return payload.issueId === issue.uuid || payload.issue_id === issue.uuid;
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ };
197
+ const createIssueWritePayload = (payload) => {
198
+ const writable = {};
199
+ for (const key of [
200
+ 'title',
201
+ 'teamId',
202
+ 'stateId',
203
+ 'description',
204
+ 'priority',
205
+ 'assigneeId',
206
+ 'labelIds',
207
+ 'labels',
208
+ 'source',
209
+ 'parentId',
210
+ 'projectId',
211
+ 'estimate',
212
+ ]) {
213
+ const value = payload[key];
214
+ if (value !== undefined)
215
+ writable[key] = value;
216
+ }
217
+ const teamId = typeof payload.teamId === 'string'
218
+ ? payload.teamId
219
+ : typeof asRecord(payload.team)?.id === 'string'
220
+ ? asRecord(payload.team)?.id
221
+ : undefined;
222
+ if (teamId)
223
+ writable.teamId = teamId;
224
+ return writable;
225
+ };
226
+ // createIssue drafts (e.g. GitHub mirrors) only carry a team key, no teamId. The
227
+ // shared writable strips that, leaving the draft teamless. Re-attach the team
228
+ // object for creates only — existing issues already have their team assigned, so
229
+ // setState/postComment must not re-send it.
230
+ const createIssueDraftPayload = (payload) => {
231
+ const writable = createIssueWritePayload(payload);
232
+ if (writable.teamId === undefined && asRecord(payload.team)) {
233
+ writable.team = payload.team;
234
+ }
235
+ return writable;
236
+ };
237
+ const scopeIssueFromPayload = (payload, key) => ({
238
+ key,
239
+ title: typeof payload.title === 'string' ? payload.title : '',
240
+ team: typeof asRecord(payload.team)?.key === 'string' ? asRecord(payload.team)?.key : undefined,
241
+ raw: { payload },
242
+ });
243
+ //# sourceMappingURL=linear.js.map
@@ -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';
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';
2
+ import { safePathSegment, stableHash, trimToLines, wrappedPayload } from './shared';
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.1",
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,55 @@
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
+ "package.json",
24
+ "README.md"
21
25
  ],
26
+ "bin": {
27
+ "factory": "bin/factory.mjs"
28
+ },
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ },
34
+ "./testing": {
35
+ "types": "./dist/testing/index.d.ts",
36
+ "import": "./dist/testing/index.js"
37
+ },
38
+ "./writeback": {
39
+ "types": "./dist/writeback/index.d.ts",
40
+ "import": "./dist/writeback/index.js"
41
+ }
42
+ },
22
43
  "publishConfig": {
23
44
  "access": "public"
24
45
  },
25
46
  "scripts": {
26
- "build": "tsc -p tsconfig.build.json || true",
27
- "test": "true"
47
+ "build": "tsc -p tsconfig.build.json",
48
+ "test": "vitest run",
49
+ "factory-build": "factory-build/run-factory-build.sh"
50
+ },
51
+ "dependencies": {
52
+ "@agent-relay/cloud": "^8.7.2",
53
+ "@agent-relay/harness-driver": "^8.3.7",
54
+ "@relayfile/sdk": "^0.8.29",
55
+ "agent-relay": "^8.8.1",
56
+ "zod": "^3.25.76"
57
+ },
58
+ "devDependencies": {
59
+ "@relayflows/cli": "^1.0.3",
60
+ "@relayflows/core": "^1.0.3",
61
+ "@types/node": "^22.10.2",
62
+ "esbuild": "^0.24.2",
63
+ "typescript": "^5.7.0",
64
+ "vitest": "^4.1.8"
28
65
  }
29
66
  }
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 {};