@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.
- package/README.md +182 -23
- package/bin/factory.mjs +7 -0
- package/dist/cli/fleet.d.ts +81 -0
- package/dist/cli/fleet.d.ts.map +1 -0
- package/dist/cli/fleet.js +571 -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 +320 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants/linear.d.ts +6 -0
- package/dist/constants/linear.d.ts.map +1 -0
- package/dist/constants/linear.js +21 -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 +52 -0
- package/dist/dispatch/templates.d.ts.map +1 -0
- package/dist/dispatch/templates.js +118 -0
- package/dist/dispatch/templates.js.map +1 -0
- package/dist/fleet/create-fleet.d.ts +14 -0
- package/dist/fleet/create-fleet.d.ts.map +1 -0
- package/dist/fleet/create-fleet.js +15 -0
- package/dist/fleet/create-fleet.js.map +1 -0
- package/dist/fleet/ensure-relay-broker.d.ts +24 -0
- package/dist/fleet/ensure-relay-broker.d.ts.map +1 -0
- package/dist/fleet/ensure-relay-broker.js +56 -0
- package/dist/fleet/ensure-relay-broker.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +90 -0
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
- package/dist/fleet/internal-fleet-client.js +602 -0
- package/dist/fleet/internal-fleet-client.js.map +1 -0
- package/dist/fleet/relay-fleet-client.d.ts +105 -0
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
- package/dist/fleet/relay-fleet-client.js +509 -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 +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -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 +26 -0
- package/dist/linear/state-resolver.d.ts.map +1 -0
- package/dist/linear/state-resolver.js +285 -0
- package/dist/linear/state-resolver.js.map +1 -0
- package/dist/mount/local-mount-preflight.d.ts +9 -0
- package/dist/mount/local-mount-preflight.d.ts.map +1 -0
- package/dist/mount/local-mount-preflight.js +149 -0
- package/dist/mount/local-mount-preflight.js.map +1 -0
- package/dist/mount/relayfile-binary.d.ts +9 -0
- package/dist/mount/relayfile-binary.d.ts.map +1 -0
- package/dist/mount/relayfile-binary.js +177 -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/node/factory-node.d.ts +59 -0
- package/dist/node/factory-node.d.ts.map +1 -0
- package/dist/node/factory-node.js +351 -0
- package/dist/node/factory-node.js.map +1 -0
- package/dist/node/factory.node.d.ts +3 -0
- package/dist/node/factory.node.d.ts.map +1 -0
- package/dist/node/factory.node.js +5 -0
- package/dist/node/factory.node.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 +58 -0
- package/dist/orchestrator/factory.d.ts.map +1 -0
- package/dist/orchestrator/factory.js +4372 -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 +101 -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 +42 -0
- package/dist/triage/heuristic.d.ts.map +1 -0
- package/dist/triage/heuristic.js +326 -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 +48 -0
- package/dist/triage/llm.js.map +1 -0
- package/dist/triage/schema.d.ts +344 -0
- package/dist/triage/schema.d.ts.map +1 -0
- package/dist/triage/schema.js +37 -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 +47 -0
- package/dist/triage/tiered.js.map +1 -0
- package/dist/types.d.ts +212 -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 +286 -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 +54 -9
- package/scripts/com.agentrelay.factory-canary.plist.example +53 -0
- package/scripts/factory-canary.sh +89 -0
- package/index.d.ts +0 -2
- package/index.js +0 -7
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { FACTORY_STATE_ROLES } from '../config/schema.js';
|
|
2
|
+
// Roles the factory cannot operate without; humanReview is optional (the
|
|
3
|
+
// terminalState falls back to `done` when it is unset).
|
|
4
|
+
const REQUIRED_ROLES = [
|
|
5
|
+
'readyForAgent',
|
|
6
|
+
'agentImplementing',
|
|
7
|
+
'inPlanning',
|
|
8
|
+
'done',
|
|
9
|
+
];
|
|
10
|
+
const STATES_INDEX_PATH = '/linear/states/_index.json';
|
|
11
|
+
const stateCanonicalPath = (id) => `/linear/states/${id}.json`;
|
|
12
|
+
// Cap concurrent canonical-record reads so a large states catalog can't flood a
|
|
13
|
+
// remote/cloud mount (rate limits, timeouts, fd exhaustion).
|
|
14
|
+
const CATALOG_READ_CONCURRENCY = 10;
|
|
15
|
+
// Build a resolution from explicit, already-known UUIDs (no mount reads). Used
|
|
16
|
+
// as the back-compat / test path when names aren't configured: the global ids
|
|
17
|
+
// apply to every team. Lenient — unresolved roles only throw when used.
|
|
18
|
+
export function stateResolutionFromIds(stateIds, stateNames = {}) {
|
|
19
|
+
const roleById = new Map();
|
|
20
|
+
const idByName = new Map();
|
|
21
|
+
for (const role of FACTORY_STATE_ROLES) {
|
|
22
|
+
const id = stateIds[role];
|
|
23
|
+
if (id)
|
|
24
|
+
roleById.set(id, role);
|
|
25
|
+
const name = stateNames[role];
|
|
26
|
+
if (id && name)
|
|
27
|
+
idByName.set(norm(name), id);
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
idFor(_teamToken, role) {
|
|
31
|
+
const id = stateIds[role];
|
|
32
|
+
if (!id)
|
|
33
|
+
throw new Error(`No resolved Linear state for role "${role}".`);
|
|
34
|
+
return id;
|
|
35
|
+
},
|
|
36
|
+
optionalIdFor(_teamToken, role) {
|
|
37
|
+
return stateIds[role];
|
|
38
|
+
},
|
|
39
|
+
roleOf(stateId) {
|
|
40
|
+
return stateId ? roleById.get(stateId) : undefined;
|
|
41
|
+
},
|
|
42
|
+
isRole(stateId, role) {
|
|
43
|
+
return Boolean(stateId) && roleById.get(stateId) === role;
|
|
44
|
+
},
|
|
45
|
+
idForName(stateName) {
|
|
46
|
+
return stateName ? idByName.get(norm(stateName)) : undefined;
|
|
47
|
+
},
|
|
48
|
+
hasHumanReview() {
|
|
49
|
+
return Boolean(stateIds.humanReview);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const norm = (value) => (value ?? '').trim().toLowerCase();
|
|
54
|
+
const asArray = (value) => {
|
|
55
|
+
if (Array.isArray(value))
|
|
56
|
+
return value;
|
|
57
|
+
if (value && typeof value === 'object') {
|
|
58
|
+
const record = value;
|
|
59
|
+
for (const key of ['entries', 'rows', 'items', 'payload']) {
|
|
60
|
+
if (Array.isArray(record[key]))
|
|
61
|
+
return record[key];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
};
|
|
66
|
+
const unwrap = (value) => {
|
|
67
|
+
if (!value || typeof value !== 'object')
|
|
68
|
+
return {};
|
|
69
|
+
const record = value;
|
|
70
|
+
return record.payload && typeof record.payload === 'object'
|
|
71
|
+
? record.payload
|
|
72
|
+
: record;
|
|
73
|
+
};
|
|
74
|
+
const str = (value) => (typeof value === 'string' && value ? value : undefined);
|
|
75
|
+
// Lazily load and cache the /linear/states catalog. Only invoked when at least
|
|
76
|
+
// one role is configured by name, so explicit-UUID setups never read it.
|
|
77
|
+
// The states catalog could not be read at all (e.g. /linear/states unreadable
|
|
78
|
+
// under the mount token). Distinct from a *resolution* failure (ambiguous name,
|
|
79
|
+
// cross-team, no match) so optional roles can tolerate an absent catalog without
|
|
80
|
+
// also swallowing genuine misconfiguration.
|
|
81
|
+
class CatalogUnavailableError extends Error {
|
|
82
|
+
}
|
|
83
|
+
const isCatalogUnavailable = (error) => error instanceof CatalogUnavailableError;
|
|
84
|
+
class StateCatalog {
|
|
85
|
+
reader;
|
|
86
|
+
#records;
|
|
87
|
+
constructor(reader) {
|
|
88
|
+
this.reader = reader;
|
|
89
|
+
}
|
|
90
|
+
async records() {
|
|
91
|
+
if (this.#records)
|
|
92
|
+
return this.#records;
|
|
93
|
+
let index;
|
|
94
|
+
try {
|
|
95
|
+
index = (await this.reader.readFile(STATES_INDEX_PATH)).content;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new CatalogUnavailableError(`Cannot resolve Linear state names: ${STATES_INDEX_PATH} is unavailable ` +
|
|
99
|
+
`(${error instanceof Error ? error.message : String(error)}). ` +
|
|
100
|
+
`Deploy the workflow-states resource or pin stateIds (UUIDs) in config.`);
|
|
101
|
+
}
|
|
102
|
+
const ids = asArray(index)
|
|
103
|
+
.map((row) => str(row?.id))
|
|
104
|
+
.filter((id) => Boolean(id));
|
|
105
|
+
// Read canonical records in bounded batches — a workspace can have many
|
|
106
|
+
// states, and an unbounded Promise.all would flood a remote/cloud mount.
|
|
107
|
+
const records = [];
|
|
108
|
+
for (let i = 0; i < ids.length; i += CATALOG_READ_CONCURRENCY) {
|
|
109
|
+
const batch = await Promise.all(ids.slice(i, i + CATALOG_READ_CONCURRENCY).map(async (id) => {
|
|
110
|
+
try {
|
|
111
|
+
const rec = unwrap((await this.reader.readFile(stateCanonicalPath(id))).content);
|
|
112
|
+
return { id, name: str(rec.name), teamKey: str(rec.team_key), teamName: str(rec.team_name) };
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return { id };
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
records.push(...batch);
|
|
119
|
+
}
|
|
120
|
+
this.#records = records;
|
|
121
|
+
return records;
|
|
122
|
+
}
|
|
123
|
+
// Resolve a state NAME to a UUID, optionally scoped to a team token (matched
|
|
124
|
+
// against team_key or team_name). Throws on no match or ambiguity.
|
|
125
|
+
async resolve(name, teamToken) {
|
|
126
|
+
const records = await this.records();
|
|
127
|
+
let matches = records.filter((rec) => norm(rec.name) === norm(name));
|
|
128
|
+
if (teamToken) {
|
|
129
|
+
// Restrict to states that belong to this team (or are team-less). Never
|
|
130
|
+
// fall back to another team's state of the same name — that would silently
|
|
131
|
+
// mis-route issues across teams. If nothing remains, it's a hard no-match.
|
|
132
|
+
const teamless = (rec) => !rec.teamKey && !rec.teamName;
|
|
133
|
+
const inTeam = (rec) => norm(rec.teamKey) === norm(teamToken) || norm(rec.teamName) === norm(teamToken);
|
|
134
|
+
matches = matches.filter((rec) => inTeam(rec) || teamless(rec));
|
|
135
|
+
const scoped = matches.filter(inTeam);
|
|
136
|
+
if (scoped.length > 0)
|
|
137
|
+
matches = scoped;
|
|
138
|
+
}
|
|
139
|
+
if (matches.length === 0) {
|
|
140
|
+
throw new Error(`No Linear workflow state named "${name}"${teamToken ? ` for team "${teamToken}"` : ''}.`);
|
|
141
|
+
}
|
|
142
|
+
if (matches.length > 1) {
|
|
143
|
+
throw new Error(`Linear workflow state "${name}" is ambiguous (${matches.length} matches)` +
|
|
144
|
+
`${teamToken ? ` for team "${teamToken}"` : ''}; scope it with linear.statesByTeam.`);
|
|
145
|
+
}
|
|
146
|
+
return matches[0].id;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Resolve every configured role for every known team to concrete UUIDs, building
|
|
150
|
+
// the forward (team,role)->id map and the reverse id->role map. Throws if a
|
|
151
|
+
// required role cannot be resolved for any team.
|
|
152
|
+
export async function resolveFactoryStates(reader, input) {
|
|
153
|
+
const catalog = new StateCatalog(reader);
|
|
154
|
+
const globalNames = input.states ?? {};
|
|
155
|
+
const explicitIds = input.stateIds ?? {};
|
|
156
|
+
// Normalize statesByTeam keys up front so per-team lookups are case-insensitive
|
|
157
|
+
// and consistent with how byTeam/teamTokens are keyed (avoids a lowercase
|
|
158
|
+
// team token silently missing an uppercase override, then overwriting it).
|
|
159
|
+
const byTeamNames = {};
|
|
160
|
+
for (const [team, names] of Object.entries(input.statesByTeam ?? {})) {
|
|
161
|
+
byTeamNames[norm(team)] = names;
|
|
162
|
+
}
|
|
163
|
+
// Resolve one role for one team token, applying precedence:
|
|
164
|
+
// per-team name > global name > explicit UUID. When a name is configured but
|
|
165
|
+
// the states catalog is unavailable (e.g. /linear/states unreadable under the
|
|
166
|
+
// mount token), fall back to the pinned UUID rather than failing startup — the
|
|
167
|
+
// name still feeds the reverse name->id map below for read-side backfill.
|
|
168
|
+
// `tolerant` is for the team-less default pass when subscribed teams exist:
|
|
169
|
+
// each team is resolved authoritatively below, so a team-less ambiguity must
|
|
170
|
+
// not abort startup (addresses the global-default-forces-teamless-lookup P1).
|
|
171
|
+
const resolveRole = async (teamToken, role, tolerant) => {
|
|
172
|
+
const perTeamName = teamToken ? byTeamNames[norm(teamToken)]?.[role] : undefined;
|
|
173
|
+
const name = perTeamName ?? globalNames[role];
|
|
174
|
+
if (name) {
|
|
175
|
+
try {
|
|
176
|
+
return await catalog.resolve(name, teamToken);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
// Fall back to the pinned UUID when the catalog can't resolve the name.
|
|
180
|
+
if (explicitIds[role])
|
|
181
|
+
return explicitIds[role];
|
|
182
|
+
// Best-effort team-less default pass: another team will fill this role.
|
|
183
|
+
if (tolerant)
|
|
184
|
+
return undefined;
|
|
185
|
+
// An OPTIONAL role (e.g. humanReview) tolerates an *absent* catalog
|
|
186
|
+
// (no /linear/states under the mount token) — but a real resolution
|
|
187
|
+
// failure (ambiguous name, cross-team, no match) must still surface, even
|
|
188
|
+
// for optional roles, rather than silently disabling the role.
|
|
189
|
+
if (!REQUIRED_ROLES.includes(role) && isCatalogUnavailable(error))
|
|
190
|
+
return undefined;
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return explicitIds[role];
|
|
195
|
+
};
|
|
196
|
+
// Dedupe team tokens by normalized form while keeping the first original
|
|
197
|
+
// casing for resolution + error messages.
|
|
198
|
+
const teamTokenByNorm = new Map();
|
|
199
|
+
for (const team of [...Object.keys(input.statesByTeam ?? {}), ...(input.teams ?? [])]) {
|
|
200
|
+
const key = norm(team);
|
|
201
|
+
if (key && !teamTokenByNorm.has(key))
|
|
202
|
+
teamTokenByNorm.set(key, team);
|
|
203
|
+
}
|
|
204
|
+
const byTeam = new Map();
|
|
205
|
+
const resolveAllRoles = async (teamToken, enforce, tolerant = false) => {
|
|
206
|
+
const resolved = {};
|
|
207
|
+
for (const role of FACTORY_STATE_ROLES) {
|
|
208
|
+
const id = await resolveRole(teamToken, role, tolerant);
|
|
209
|
+
if (id)
|
|
210
|
+
resolved[role] = id;
|
|
211
|
+
}
|
|
212
|
+
const missing = REQUIRED_ROLES.filter((role) => !resolved[role]);
|
|
213
|
+
if (enforce && missing.length > 0) {
|
|
214
|
+
throw new Error(`Linear state resolution incomplete${teamToken ? ` for team "${teamToken}"` : ''}: ` +
|
|
215
|
+
`missing [${missing.join(', ')}]. Set linear.states / linear.statesByTeam (by name) or stateIds (UUIDs).`);
|
|
216
|
+
}
|
|
217
|
+
return resolved;
|
|
218
|
+
};
|
|
219
|
+
// The team-less default only needs to satisfy required roles when there's
|
|
220
|
+
// global config meant to fill it; a per-team-only setup leaves it best-effort
|
|
221
|
+
// (each subscribed team is enforced below, and idFor() throws at use if an
|
|
222
|
+
// unconfigured team's issue ever appears).
|
|
223
|
+
//
|
|
224
|
+
// When teams ARE configured, the team-less default pass is tolerant: the
|
|
225
|
+
// factory's default `linear.states` names are global, so resolving them
|
|
226
|
+
// team-lessly would be ambiguous in a multi-team workspace and wrongly fail
|
|
227
|
+
// startup — even though each subscribed team resolves cleanly. Per-team passes
|
|
228
|
+
// (below) are authoritative; the team-less default is only a fallback.
|
|
229
|
+
const hasGlobalConfig = Object.keys(globalNames).length > 0 || Object.keys(explicitIds).length > 0;
|
|
230
|
+
const hasTeamScopes = teamTokenByNorm.size > 0;
|
|
231
|
+
const defaultIds = await resolveAllRoles(undefined, hasGlobalConfig && !hasTeamScopes, hasTeamScopes);
|
|
232
|
+
for (const [key, team] of teamTokenByNorm) {
|
|
233
|
+
byTeam.set(key, await resolveAllRoles(team, true));
|
|
234
|
+
}
|
|
235
|
+
const idsFor = (teamToken) => (teamToken ? byTeam.get(norm(teamToken)) : undefined) ?? defaultIds;
|
|
236
|
+
// Reverse map across the default + every team mapping.
|
|
237
|
+
const roleById = new Map();
|
|
238
|
+
for (const ids of [defaultIds, ...byTeam.values()]) {
|
|
239
|
+
for (const role of FACTORY_STATE_ROLES) {
|
|
240
|
+
const id = ids[role];
|
|
241
|
+
if (id)
|
|
242
|
+
roleById.set(id, role);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Reverse name->id map: lets a read path backfill the state UUID for issues
|
|
246
|
+
// whose synced payload only carries `state.name` (relayfile-adapters#205).
|
|
247
|
+
// Built from configured names paired with their resolved UUID (global + team).
|
|
248
|
+
const idByName = new Map();
|
|
249
|
+
const recordNames = (names, ids) => {
|
|
250
|
+
for (const role of FACTORY_STATE_ROLES) {
|
|
251
|
+
const name = names[role];
|
|
252
|
+
const id = ids[role];
|
|
253
|
+
if (name && id)
|
|
254
|
+
idByName.set(norm(name), id);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
recordNames(globalNames, defaultIds);
|
|
258
|
+
for (const [key, team] of teamTokenByNorm) {
|
|
259
|
+
recordNames(byTeamNames[key] ?? {}, byTeam.get(key) ?? {});
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
idFor(teamToken, role) {
|
|
263
|
+
const id = idsFor(teamToken)[role];
|
|
264
|
+
if (!id)
|
|
265
|
+
throw new Error(`No resolved Linear state for role "${role}"${teamToken ? ` (team "${teamToken}")` : ''}.`);
|
|
266
|
+
return id;
|
|
267
|
+
},
|
|
268
|
+
optionalIdFor(teamToken, role) {
|
|
269
|
+
return idsFor(teamToken)[role];
|
|
270
|
+
},
|
|
271
|
+
roleOf(stateId) {
|
|
272
|
+
return stateId ? roleById.get(stateId) : undefined;
|
|
273
|
+
},
|
|
274
|
+
isRole(stateId, role) {
|
|
275
|
+
return Boolean(stateId) && roleById.get(stateId) === role;
|
|
276
|
+
},
|
|
277
|
+
idForName(stateName) {
|
|
278
|
+
return stateName ? idByName.get(norm(stateName)) : undefined;
|
|
279
|
+
},
|
|
280
|
+
hasHumanReview(teamToken) {
|
|
281
|
+
return Boolean(idsFor(teamToken).humanReview);
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=state-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-resolver.js","sourceRoot":"","sources":["../../src/linear/state-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface EnsureLocalMountOptions {
|
|
2
|
+
stateWaitTimeoutMs?: number;
|
|
3
|
+
stateWaitPollMs?: number;
|
|
4
|
+
acceptableWorkspaceIds?: readonly string[];
|
|
5
|
+
refreshStaleMount?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function ensureLocalMount(workspaceId: string, startDir: string, options?: EnsureLocalMountOptions): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=local-mount-preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mount-preflight.d.ts","sourceRoot":"","sources":["../../src/mount/local-mount-preflight.ts"],"names":[],"mappings":"AAiBA,UAAU,uBAAuB;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IAIxB,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAM1C,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { checkMountStaleness, coercePid, resolveRelayfileCli, resolveRelayfileMountBinary } from './relayfile-binary.js';
|
|
5
|
+
const STATE_FILE = '.integrations/.relay/state.json';
|
|
6
|
+
// How long to wait for a freshly-spawned mount to write a valid state.json
|
|
7
|
+
// (workspace match + a live pid). A CLI mount over a large `.integrations` tree
|
|
8
|
+
// can take well over 10s to complete its FIRST reconcile (early cycles hit
|
|
9
|
+
// `context deadline exceeded` while it materializes the tree), so a 10s wait
|
|
10
|
+
// reported a spurious "did not become ready" on a mount that was simply still
|
|
11
|
+
// bootstrapping. 60s covers that without blocking startup indefinitely. Callers
|
|
12
|
+
// can still override via `stateWaitTimeoutMs`.
|
|
13
|
+
const DEFAULT_STATE_READY_TIMEOUT_MS = 60_000;
|
|
14
|
+
export async function ensureLocalMount(workspaceId, startDir, options = {}) {
|
|
15
|
+
const stateFilePath = join(startDir, STATE_FILE);
|
|
16
|
+
if (!(await isMountStatePresent(stateFilePath))) {
|
|
17
|
+
await spawnMount(workspaceId, startDir);
|
|
18
|
+
await waitForStateFile(stateFilePath, workspaceId, options.stateWaitTimeoutMs, options.stateWaitPollMs, options.acceptableWorkspaceIds);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const staleness = checkMountStaleness(stateFilePath, workspaceId, options.acceptableWorkspaceIds);
|
|
22
|
+
if (!staleness.stale)
|
|
23
|
+
return;
|
|
24
|
+
const suffix = staleness.reason !== undefined ? ` (${staleness.reason})` : '';
|
|
25
|
+
const manualHint = `Run: relayfile stop && relayfile start ${workspaceId} .integrations --background`;
|
|
26
|
+
if (options.refreshStaleMount === false) {
|
|
27
|
+
process.stderr.write(`[factory] local mount is stale${suffix}; writeback may not propagate. ${manualHint}\n`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Self-heal: re-spawn the mount so writebacks propagate, rather than silently
|
|
31
|
+
// shipping them into a stale mirror. spawnMount runs the relayfile-mount
|
|
32
|
+
// binary with --rehome, which re-establishes the mount in place.
|
|
33
|
+
process.stderr.write(`[factory] local mount is stale${suffix}; refreshing\n`);
|
|
34
|
+
try {
|
|
35
|
+
await spawnMount(workspaceId, startDir);
|
|
36
|
+
await waitForStateFile(stateFilePath, workspaceId, options.stateWaitTimeoutMs, options.stateWaitPollMs, options.acceptableWorkspaceIds);
|
|
37
|
+
process.stderr.write('[factory] local mount refreshed\n');
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
41
|
+
process.stderr.write(`[factory] local mount is stale${suffix} and auto-refresh failed (${reason}); writeback may not propagate. ${manualHint}\n`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function isMountStatePresent(stateFilePath) {
|
|
45
|
+
try {
|
|
46
|
+
const raw = await readFile(stateFilePath, 'utf8');
|
|
47
|
+
JSON.parse(raw);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function spawnMount(workspaceId, startDir) {
|
|
55
|
+
// Prefer the relayfile CLI: it resolves workspace credentials itself (the raw
|
|
56
|
+
// relayfile-mount binary requires a --token the factory has no clean way to
|
|
57
|
+
// supply) and bundles an up-to-date mount, so the factory can self-start the
|
|
58
|
+
// writeback mount unattended. Fall back to the raw binary only when no CLI is
|
|
59
|
+
// available.
|
|
60
|
+
const cli = resolveRelayfileCli();
|
|
61
|
+
if (cli) {
|
|
62
|
+
await spawnMountViaCli(cli, workspaceId, startDir);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await spawnMountViaRawBinary(workspaceId, startDir);
|
|
66
|
+
}
|
|
67
|
+
async function spawnMountViaCli(cli, workspaceId, startDir) {
|
|
68
|
+
// Best-effort stop first so a stale/dead mount registration does not make
|
|
69
|
+
// `start` reject (matches the documented `relayfile stop && relayfile start`
|
|
70
|
+
// recovery). A no-op when nothing is mounted here.
|
|
71
|
+
await runRelayfile(cli, ['stop'], startDir, workspaceId).catch(() => { });
|
|
72
|
+
await runRelayfile(cli, ['start', workspaceId, '.integrations', '--background'], startDir, workspaceId);
|
|
73
|
+
}
|
|
74
|
+
async function spawnMountViaRawBinary(workspaceId, startDir) {
|
|
75
|
+
// Search from the deployment dir (where factory.config.json + the bundled
|
|
76
|
+
// @relayfile/mount live), not this module's install location.
|
|
77
|
+
const binaryPath = resolveRelayfileMountBinary(startDir);
|
|
78
|
+
await runRelayfile(binaryPath, ['start', workspaceId, '.integrations', '--background', '--rehome'], startDir, workspaceId);
|
|
79
|
+
}
|
|
80
|
+
function runRelayfile(command, args, startDir, workspaceId) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const child = spawn(command, args, {
|
|
83
|
+
cwd: startDir,
|
|
84
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
85
|
+
});
|
|
86
|
+
const stderrChunks = [];
|
|
87
|
+
if (child.stderr) {
|
|
88
|
+
child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
89
|
+
}
|
|
90
|
+
child.on('close', (code) => {
|
|
91
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8');
|
|
92
|
+
if (isAuthError(stderr)) {
|
|
93
|
+
reject(new Error(`[factory] relayfile mount not authorized — run: relayfile workspace join ${workspaceId} --write`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (code !== 0) {
|
|
97
|
+
reject(new Error(`[factory] relayfile mount ${args[0]} failed (exit ${code ?? 'null'}): ${stderr.trim()}`));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
resolve();
|
|
101
|
+
});
|
|
102
|
+
child.on('error', (err) => {
|
|
103
|
+
reject(new Error(`[factory] relayfile mount ${args[0]} error: ${err.message}`));
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async function waitForStateFile(stateFilePath, workspaceId, timeoutMs = DEFAULT_STATE_READY_TIMEOUT_MS, pollMs = 200, acceptableWorkspaceIds = []) {
|
|
108
|
+
const deadline = Date.now() + timeoutMs;
|
|
109
|
+
let lastInvalidReason = 'state file was not created';
|
|
110
|
+
while (Date.now() < deadline) {
|
|
111
|
+
try {
|
|
112
|
+
const raw = await readFile(stateFilePath, 'utf8');
|
|
113
|
+
const state = JSON.parse(raw);
|
|
114
|
+
if (isValidMountState(state, workspaceId, acceptableWorkspaceIds))
|
|
115
|
+
return;
|
|
116
|
+
lastInvalidReason = `state file is malformed or for another workspace: ${stateFilePath}`;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT') {
|
|
120
|
+
lastInvalidReason = 'state file was not created';
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
lastInvalidReason = error instanceof Error ? error.message : String(error);
|
|
124
|
+
}
|
|
125
|
+
// not yet present
|
|
126
|
+
}
|
|
127
|
+
await sleep(pollMs);
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`[factory] relayfile mount did not become ready within ${timeoutMs}ms (${lastInvalidReason})`);
|
|
130
|
+
}
|
|
131
|
+
function isValidMountState(value, workspaceId, acceptableWorkspaceIds = []) {
|
|
132
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
133
|
+
return false;
|
|
134
|
+
const state = value;
|
|
135
|
+
const accepted = new Set([workspaceId, ...acceptableWorkspaceIds]);
|
|
136
|
+
// A CLI-daemonized mount (`relayfile start --background`) records its pid under
|
|
137
|
+
// `daemon.pid`, not the top-level `pid` — accept either, matching
|
|
138
|
+
// checkMountStaleness (else a freshly-started CLI mount is never confirmed ready).
|
|
139
|
+
const pid = coercePid(state.pid) ?? coercePid(state.daemon?.pid);
|
|
140
|
+
return typeof state.workspaceId === 'string' && accepted.has(state.workspaceId) &&
|
|
141
|
+
typeof state.lastReconcileAt === 'string' &&
|
|
142
|
+
Number.isFinite(Date.parse(state.lastReconcileAt)) &&
|
|
143
|
+
pid !== undefined;
|
|
144
|
+
}
|
|
145
|
+
const isAuthError = (stderr) => stderr.includes('workspace join') ||
|
|
146
|
+
stderr.includes('unauthorized') ||
|
|
147
|
+
stderr.includes('no credentials');
|
|
148
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
149
|
+
//# sourceMappingURL=local-mount-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mount-preflight.js","sourceRoot":"","sources":["../../src/mount/local-mount-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function coercePid(value: unknown): number | undefined;
|
|
2
|
+
export declare function resolveRelayfileMountBinary(startDir?: string): string;
|
|
3
|
+
export declare function resolveRelayfileCli(): string | undefined;
|
|
4
|
+
export declare function checkMountStaleness(stateFilePath: string, workspaceId: string, acceptableWorkspaceIds?: readonly string[]): {
|
|
5
|
+
stale: boolean;
|
|
6
|
+
reason?: string;
|
|
7
|
+
pid?: number;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=relayfile-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayfile-binary.d.ts","sourceRoot":"","sources":["../../src/mount/relayfile-binary.ts"],"names":[],"mappings":"AAqBA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE5D;AAgED,wBAAgB,2BAA2B,CAAC,QAAQ,SAAa,GAAG,MAAM,CAqBzE;AAWD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAYxD;AAED,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAKnB,sBAAsB,GAAE,SAAS,MAAM,EAAO,GAC7C;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CA8DnD"}
|