@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.
- package/README.md +240 -22
- package/bin/factory.mjs +7 -0
- package/dist/cli/fleet.d.ts +77 -0
- package/dist/cli/fleet.d.ts.map +1 -0
- package/dist/cli/fleet.js +500 -0
- package/dist/cli/fleet.js.map +1 -0
- package/dist/config/schema.d.ts +1313 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +309 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants/linear.d.ts +4 -0
- package/dist/constants/linear.d.ts.map +1 -0
- package/dist/constants/linear.js +15 -0
- package/dist/constants/linear.js.map +1 -0
- package/dist/constants/slack.d.ts +3 -0
- package/dist/constants/slack.d.ts.map +1 -0
- package/dist/constants/slack.js +3 -0
- package/dist/constants/slack.js.map +1 -0
- package/dist/dispatch/templates.d.ts +36 -0
- package/dist/dispatch/templates.d.ts.map +1 -0
- package/dist/dispatch/templates.js +110 -0
- package/dist/dispatch/templates.js.map +1 -0
- package/dist/fleet/create-fleet.d.ts +13 -0
- package/dist/fleet/create-fleet.d.ts.map +1 -0
- package/dist/fleet/create-fleet.js +14 -0
- package/dist/fleet/create-fleet.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +85 -0
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
- package/dist/fleet/internal-fleet-client.js +575 -0
- package/dist/fleet/internal-fleet-client.js.map +1 -0
- package/dist/fleet/relay-fleet-client.d.ts +28 -0
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
- package/dist/fleet/relay-fleet-client.js +33 -0
- package/dist/fleet/relay-fleet-client.js.map +1 -0
- package/dist/github/index.d.ts +5 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +3 -0
- package/dist/github/index.js.map +1 -0
- package/dist/github/merge-gate.d.ts +47 -0
- package/dist/github/merge-gate.d.ts.map +1 -0
- package/dist/github/merge-gate.js +147 -0
- package/dist/github/merge-gate.js.map +1 -0
- package/dist/github/probe-closer.d.ts +15 -0
- package/dist/github/probe-closer.d.ts.map +1 -0
- package/dist/github/probe-closer.js +67 -0
- package/dist/github/probe-closer.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/issue-key-match.d.ts +3 -0
- package/dist/issue-key-match.d.ts.map +1 -0
- package/dist/issue-key-match.js +22 -0
- package/dist/issue-key-match.js.map +1 -0
- package/dist/linear/state-resolver.d.ts +25 -0
- package/dist/linear/state-resolver.d.ts.map +1 -0
- package/dist/linear/state-resolver.js +221 -0
- package/dist/linear/state-resolver.js.map +1 -0
- package/dist/mount/local-mount-preflight.d.ts +8 -0
- package/dist/mount/local-mount-preflight.d.ts.map +1 -0
- package/dist/mount/local-mount-preflight.js +97 -0
- package/dist/mount/local-mount-preflight.js.map +1 -0
- package/dist/mount/relayfile-binary.d.ts +7 -0
- package/dist/mount/relayfile-binary.d.ts.map +1 -0
- package/dist/mount/relayfile-binary.js +143 -0
- package/dist/mount/relayfile-binary.js.map +1 -0
- package/dist/mount/relayfile-cloud-mount-client.d.ts +123 -0
- package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -0
- package/dist/mount/relayfile-cloud-mount-client.js +427 -0
- package/dist/mount/relayfile-cloud-mount-client.js.map +1 -0
- package/dist/orchestrator/batch-tracker.d.ts +42 -0
- package/dist/orchestrator/batch-tracker.d.ts.map +1 -0
- package/dist/orchestrator/batch-tracker.js +125 -0
- package/dist/orchestrator/batch-tracker.js.map +1 -0
- package/dist/orchestrator/factory.d.ts +55 -0
- package/dist/orchestrator/factory.d.ts.map +1 -0
- package/dist/orchestrator/factory.js +4018 -0
- package/dist/orchestrator/factory.js.map +1 -0
- package/dist/orchestrator/index.d.ts +5 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +4 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/process-identity.d.ts +23 -0
- package/dist/orchestrator/process-identity.d.ts.map +1 -0
- package/dist/orchestrator/process-identity.js +122 -0
- package/dist/orchestrator/process-identity.js.map +1 -0
- package/dist/orchestrator/reaper.d.ts +60 -0
- package/dist/orchestrator/reaper.d.ts.map +1 -0
- package/dist/orchestrator/reaper.js +293 -0
- package/dist/orchestrator/reaper.js.map +1 -0
- package/dist/ports/fleet.d.ts +95 -0
- package/dist/ports/fleet.d.ts.map +1 -0
- package/dist/ports/fleet.js +2 -0
- package/dist/ports/fleet.js.map +1 -0
- package/dist/ports/index.d.ts +5 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/mount.d.ts +56 -0
- package/dist/ports/mount.d.ts.map +1 -0
- package/dist/ports/mount.js +2 -0
- package/dist/ports/mount.js.map +1 -0
- package/dist/ports/state.d.ts +61 -0
- package/dist/ports/state.d.ts.map +1 -0
- package/dist/ports/state.js +2 -0
- package/dist/ports/state.js.map +1 -0
- package/dist/ports/system.d.ts +15 -0
- package/dist/ports/system.d.ts.map +1 -0
- package/dist/ports/system.js +2 -0
- package/dist/ports/system.js.map +1 -0
- package/dist/ports/writeback.d.ts +25 -0
- package/dist/ports/writeback.d.ts.map +1 -0
- package/dist/ports/writeback.js +2 -0
- package/dist/ports/writeback.js.map +1 -0
- package/dist/safety/factory-scope.d.ts +16 -0
- package/dist/safety/factory-scope.d.ts.map +1 -0
- package/dist/safety/factory-scope.js +107 -0
- package/dist/safety/factory-scope.js.map +1 -0
- package/dist/state/in-memory-state-store.d.ts +31 -0
- package/dist/state/in-memory-state-store.d.ts.map +1 -0
- package/dist/state/in-memory-state-store.js +115 -0
- package/dist/state/in-memory-state-store.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +2 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/store.d.ts +29 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +26 -0
- package/dist/state/store.js.map +1 -0
- package/dist/subscriptions/common.d.ts +7 -0
- package/dist/subscriptions/common.d.ts.map +1 -0
- package/dist/subscriptions/common.js +59 -0
- package/dist/subscriptions/common.js.map +1 -0
- package/dist/subscriptions/event-client.d.ts +40 -0
- package/dist/subscriptions/event-client.d.ts.map +1 -0
- package/dist/subscriptions/event-client.js +234 -0
- package/dist/subscriptions/event-client.js.map +1 -0
- package/dist/subscriptions/globs.d.ts +5 -0
- package/dist/subscriptions/globs.d.ts.map +1 -0
- package/dist/subscriptions/globs.js +50 -0
- package/dist/subscriptions/globs.js.map +1 -0
- package/dist/subscriptions/index.d.ts +8 -0
- package/dist/subscriptions/index.d.ts.map +1 -0
- package/dist/subscriptions/index.js +5 -0
- package/dist/subscriptions/index.js.map +1 -0
- package/dist/subscriptions/linear-filter.d.ts +26 -0
- package/dist/subscriptions/linear-filter.d.ts.map +1 -0
- package/dist/subscriptions/linear-filter.js +143 -0
- package/dist/subscriptions/linear-filter.js.map +1 -0
- package/dist/subscriptions/specs.d.ts +44 -0
- package/dist/subscriptions/specs.d.ts.map +1 -0
- package/dist/subscriptions/specs.js +195 -0
- package/dist/subscriptions/specs.js.map +1 -0
- package/dist/testing/fakes.d.ts +114 -0
- package/dist/testing/fakes.d.ts.map +1 -0
- package/dist/testing/fakes.js +219 -0
- package/dist/testing/fakes.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/triage/heuristic.d.ts +38 -0
- package/dist/triage/heuristic.d.ts.map +1 -0
- package/dist/triage/heuristic.js +262 -0
- package/dist/triage/heuristic.js.map +1 -0
- package/dist/triage/index.d.ts +7 -0
- package/dist/triage/index.d.ts.map +1 -0
- package/dist/triage/index.js +5 -0
- package/dist/triage/index.js.map +1 -0
- package/dist/triage/llm.d.ts +11 -0
- package/dist/triage/llm.d.ts.map +1 -0
- package/dist/triage/llm.js +46 -0
- package/dist/triage/llm.js.map +1 -0
- package/dist/triage/schema.d.ts +240 -0
- package/dist/triage/schema.d.ts.map +1 -0
- package/dist/triage/schema.js +34 -0
- package/dist/triage/schema.js.map +1 -0
- package/dist/triage/tiered.d.ts +8 -0
- package/dist/triage/tiered.d.ts.map +1 -0
- package/dist/triage/tiered.js +40 -0
- package/dist/triage/tiered.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook/handler.d.ts +22 -0
- package/dist/webhook/handler.d.ts.map +1 -0
- package/dist/webhook/handler.js +57 -0
- package/dist/webhook/handler.js.map +1 -0
- package/dist/webhook/index.d.ts +5 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +3 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/registrar.d.ts +16 -0
- package/dist/webhook/registrar.d.ts.map +1 -0
- package/dist/webhook/registrar.js +50 -0
- package/dist/webhook/registrar.js.map +1 -0
- package/dist/writeback/github.d.ts +6 -0
- package/dist/writeback/github.d.ts.map +1 -0
- package/dist/writeback/github.js +48 -0
- package/dist/writeback/github.js.map +1 -0
- package/dist/writeback/index.d.ts +6 -0
- package/dist/writeback/index.d.ts.map +1 -0
- package/dist/writeback/index.js +4 -0
- package/dist/writeback/index.js.map +1 -0
- package/dist/writeback/linear.d.ts +41 -0
- package/dist/writeback/linear.d.ts.map +1 -0
- package/dist/writeback/linear.js +243 -0
- package/dist/writeback/linear.js.map +1 -0
- package/dist/writeback/shared.d.ts +7 -0
- package/dist/writeback/shared.d.ts.map +1 -0
- package/dist/writeback/shared.js +29 -0
- package/dist/writeback/shared.js.map +1 -0
- package/dist/writeback/slack.d.ts +16 -0
- package/dist/writeback/slack.d.ts.map +1 -0
- package/dist/writeback/slack.js +104 -0
- package/dist/writeback/slack.js.map +1 -0
- package/package.json +46 -9
- package/index.d.ts +0 -2
- 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.
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
16
|
-
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
17
20
|
"files": [
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
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
|
|
27
|
-
"test": "
|
|
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
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 {};
|