@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,427 @@
|
|
|
1
|
+
import { CloudAuthError, ensureCloudSession, resolveActiveWorkspace, } from '@agent-relay/cloud';
|
|
2
|
+
import { RelayfileSetup, } from '@relayfile/sdk';
|
|
3
|
+
import { createWorkspaceScopedEventClient, } from '../subscriptions/index.js';
|
|
4
|
+
const DEFAULT_WORKSPACE_ID = 'rw_7ccfea89';
|
|
5
|
+
const DEFAULT_AGENT_NAME = 'agent-relay-factory';
|
|
6
|
+
export const FACTORY_RELAYFILE_SCOPES = [
|
|
7
|
+
'relayfile:fs:read:/linear/issues/**',
|
|
8
|
+
'relayfile:fs:write:/linear/issues/**',
|
|
9
|
+
'relayfile:fs:read:/github/repos/**',
|
|
10
|
+
'relayfile:fs:read:/slack/channels/**',
|
|
11
|
+
'relayfile:fs:write:/slack/channels/**',
|
|
12
|
+
'relayfile:fs:read:/slack/users/**',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Derive the factory's workspace from the active cloud session rather than a
|
|
16
|
+
* hardcoded config value. `resolveActiveWorkspace()` resolves the locally
|
|
17
|
+
* pinned workspace against the cloud API and returns both identifier forms.
|
|
18
|
+
* Falls back to the built-in default when resolution fails (offline / no
|
|
19
|
+
* session), so callers always get a usable handle.
|
|
20
|
+
*/
|
|
21
|
+
export async function resolveFactoryWorkspace(resolver = resolveActiveWorkspace) {
|
|
22
|
+
try {
|
|
23
|
+
const descriptor = await resolver({ interactive: false });
|
|
24
|
+
if (descriptor.relayfileWorkspaceId) {
|
|
25
|
+
return {
|
|
26
|
+
workspaceId: descriptor.relayfileWorkspaceId,
|
|
27
|
+
cloudWorkspaceId: descriptor.cloudWorkspaceId,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// fall through to the built-in default below
|
|
33
|
+
}
|
|
34
|
+
return { workspaceId: DEFAULT_WORKSPACE_ID };
|
|
35
|
+
}
|
|
36
|
+
export class RelayfileCloudMountClient {
|
|
37
|
+
workspaceId;
|
|
38
|
+
writebackTransport = 'relayfile-cloud';
|
|
39
|
+
#client;
|
|
40
|
+
#tokenProvider;
|
|
41
|
+
#baseUrl;
|
|
42
|
+
#eventClient;
|
|
43
|
+
#isAllowedDraft;
|
|
44
|
+
#isAllowedDelete;
|
|
45
|
+
#lastOpByPath = new Map();
|
|
46
|
+
constructor(config = {}) {
|
|
47
|
+
if (!config.client) {
|
|
48
|
+
throw new Error('RelayfileCloudMountClient requires a client; use fromConfig() to load cloud credentials');
|
|
49
|
+
}
|
|
50
|
+
this.workspaceId = config.workspaceId ?? DEFAULT_WORKSPACE_ID;
|
|
51
|
+
this.#client = config.client;
|
|
52
|
+
this.#tokenProvider = config.tokenProvider ?? (() => this.#client.getToken?.());
|
|
53
|
+
this.#baseUrl = config.baseUrl ?? this.#client.getBaseUrl?.();
|
|
54
|
+
this.#eventClient = config.eventClient;
|
|
55
|
+
this.#isAllowedDraft = config.isAllowedDraft;
|
|
56
|
+
this.#isAllowedDelete = config.isAllowedDelete;
|
|
57
|
+
}
|
|
58
|
+
setDefaultAllowedDraftPredicate(predicate) {
|
|
59
|
+
this.#isAllowedDraft ??= predicate;
|
|
60
|
+
}
|
|
61
|
+
static async fromConfig(config = {}) {
|
|
62
|
+
if ('credsPath' in config) {
|
|
63
|
+
throw new Error('RelayfileCloudMountClient no longer accepts credsPath; run `agent-relay login` to use the shared cloud session');
|
|
64
|
+
}
|
|
65
|
+
if (config.client)
|
|
66
|
+
return new RelayfileCloudMountClient(config);
|
|
67
|
+
const workspaceId = config.workspaceId ?? DEFAULT_WORKSPACE_ID;
|
|
68
|
+
const sharedSession = createSharedCloudSessionResolver(config);
|
|
69
|
+
const initialSession = await sharedSession.resolve();
|
|
70
|
+
const setup = (config.relayfileSetupFactory ?? createDefaultRelayfileSetup)({
|
|
71
|
+
cloudApiUrl: initialSession.auth.apiUrl,
|
|
72
|
+
tokenProvider: sharedSession.getAccessToken,
|
|
73
|
+
});
|
|
74
|
+
const handle = await setup.joinWorkspace(workspaceId, {
|
|
75
|
+
agentName: config.agentName ?? DEFAULT_AGENT_NAME,
|
|
76
|
+
scopes: config.scopes ?? [...FACTORY_RELAYFILE_SCOPES],
|
|
77
|
+
});
|
|
78
|
+
return new RelayfileCloudMountClient({
|
|
79
|
+
...config,
|
|
80
|
+
workspaceId,
|
|
81
|
+
client: handle.client(),
|
|
82
|
+
tokenProvider: () => handle.getToken(),
|
|
83
|
+
baseUrl: handle.info.relayfileUrl,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async readFile(path) {
|
|
87
|
+
const response = await this.#client.readFile(this.workspaceId, path);
|
|
88
|
+
return {
|
|
89
|
+
content: parseRemoteContent(response),
|
|
90
|
+
revision: response.revision,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async writeFile(path, content, opts) {
|
|
94
|
+
if (isProviderWritebackPath(path) && await this.#isAllowedDraft?.(path, content, opts) !== true) {
|
|
95
|
+
throw new Error(`Refusing provider writeback draft for ${path}: draft predicate rejected or is unset`);
|
|
96
|
+
}
|
|
97
|
+
const serialized = serializeContent(content);
|
|
98
|
+
const writeAtCurrentRevision = async () => {
|
|
99
|
+
let baseRevision = '0';
|
|
100
|
+
try {
|
|
101
|
+
baseRevision = (await this.#client.readFile(this.workspaceId, path)).revision;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (!isHttpStatus(error, 404))
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
return this.#client.writeFile({
|
|
108
|
+
workspaceId: this.workspaceId,
|
|
109
|
+
path,
|
|
110
|
+
baseRevision,
|
|
111
|
+
content: serialized.content,
|
|
112
|
+
contentType: serialized.contentType,
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
try {
|
|
116
|
+
this.#lastOpByPath.set(path, (await writeAtCurrentRevision()).opId);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (!isHttpStatus(error, 409))
|
|
120
|
+
throw error;
|
|
121
|
+
this.#lastOpByPath.set(path, (await writeAtCurrentRevision()).opId);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async deleteFile(path) {
|
|
125
|
+
const current = await this.#client.readFile(this.workspaceId, path);
|
|
126
|
+
const currentContent = parseRemoteContent(current);
|
|
127
|
+
if (isProviderPath(path)) {
|
|
128
|
+
await this.#assertProviderDeleteAllowed(path, currentContent);
|
|
129
|
+
}
|
|
130
|
+
this.#lastOpByPath.set(path, (await this.#client.deleteFile({
|
|
131
|
+
workspaceId: this.workspaceId,
|
|
132
|
+
path,
|
|
133
|
+
baseRevision: current.revision,
|
|
134
|
+
})).opId);
|
|
135
|
+
}
|
|
136
|
+
async #assertProviderDeleteAllowed(path, currentContent) {
|
|
137
|
+
if (providerContentLooksLinked(currentContent)) {
|
|
138
|
+
throw new Error(`Refusing provider delete for ${path}: current record is reconciled or linked`);
|
|
139
|
+
}
|
|
140
|
+
const opId = this.#lastOpByPath.get(path);
|
|
141
|
+
if (!opId || !this.#client.getOp) {
|
|
142
|
+
throw new Error(`Refusing provider delete for ${path}: create operation is unknown`);
|
|
143
|
+
}
|
|
144
|
+
let op;
|
|
145
|
+
try {
|
|
146
|
+
op = await this.#client.getOp(this.workspaceId, opId);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new Error(`Refusing provider delete for ${path}: unable to verify create operation: ${errorMessage(error)}`);
|
|
150
|
+
}
|
|
151
|
+
const providerResult = op.providerResult;
|
|
152
|
+
if (typeof providerResult?.externalId === 'string' && providerResult.externalId.length > 0) {
|
|
153
|
+
throw new Error(`Refusing provider delete for ${path}: create operation linked provider object ${providerResult.externalId}`);
|
|
154
|
+
}
|
|
155
|
+
if (op.status !== 'failed' && op.status !== 'dead_lettered' && op.status !== 'canceled') {
|
|
156
|
+
throw new Error(`Refusing provider delete for ${path}: create operation status is ${op.status}`);
|
|
157
|
+
}
|
|
158
|
+
if (await this.#isAllowedDelete?.(path, currentContent) !== true) {
|
|
159
|
+
throw new Error(`Refusing provider delete for ${path}: delete predicate rejected or is unset`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async listTree(prefix) {
|
|
163
|
+
const paths = [];
|
|
164
|
+
let cursor;
|
|
165
|
+
for (;;) {
|
|
166
|
+
const response = await this.#client.listTree(this.workspaceId, {
|
|
167
|
+
path: prefix,
|
|
168
|
+
cursor,
|
|
169
|
+
});
|
|
170
|
+
paths.push(...response.entries.map((entry) => entry.path));
|
|
171
|
+
if (!response.nextCursor)
|
|
172
|
+
break;
|
|
173
|
+
cursor = response.nextCursor;
|
|
174
|
+
}
|
|
175
|
+
return paths.sort();
|
|
176
|
+
}
|
|
177
|
+
subscribe(globs, onChange, opts) {
|
|
178
|
+
const eventClient = this.#eventClient ?? createWorkspaceScopedEventClient(this.#client, this.workspaceId, this.#tokenProvider, this.#baseUrl);
|
|
179
|
+
return eventClient.subscribe(globs, onChange, opts);
|
|
180
|
+
}
|
|
181
|
+
async getEvents(opts) {
|
|
182
|
+
if (opts.last !== undefined && this.#client.listLastNChanges) {
|
|
183
|
+
const response = await this.#client.listLastNChanges(opts.last, { workspaceId: this.workspaceId });
|
|
184
|
+
const events = opts.provider
|
|
185
|
+
? response.events.filter((event) => eventProvider(event) === opts.provider)
|
|
186
|
+
: response.events;
|
|
187
|
+
return {
|
|
188
|
+
events: events.slice(0, opts.limit ?? events.length),
|
|
189
|
+
nextCursor: null,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const response = await this.#client.getEvents(this.workspaceId, opts);
|
|
193
|
+
return {
|
|
194
|
+
events: response.events,
|
|
195
|
+
nextCursor: response.nextCursor,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
async getEventHighWatermark(opts = {}) {
|
|
199
|
+
if (!this.#client.listLastNChanges)
|
|
200
|
+
return undefined;
|
|
201
|
+
const response = await this.#client.listLastNChanges(10, { workspaceId: this.workspaceId });
|
|
202
|
+
const events = opts.provider
|
|
203
|
+
? response.events.filter((event) => event.resource.provider === opts.provider)
|
|
204
|
+
: response.events;
|
|
205
|
+
return maxEventId(events.map((event) => event.id));
|
|
206
|
+
}
|
|
207
|
+
async getSyncStatus(provider) {
|
|
208
|
+
if (!this.#client.getSyncStatus)
|
|
209
|
+
return undefined;
|
|
210
|
+
return normalizeProviderSyncStatus(await this.#client.getSyncStatus(this.workspaceId, { provider }), provider);
|
|
211
|
+
}
|
|
212
|
+
async confirmWrite(path, opts = {}) {
|
|
213
|
+
const opId = this.#lastOpByPath.get(path);
|
|
214
|
+
if (!opId || !this.#client.getOp)
|
|
215
|
+
return 'timeout';
|
|
216
|
+
const deadline = Date.now() + (opts.timeoutMs ?? 90_000);
|
|
217
|
+
for (;;) {
|
|
218
|
+
const status = mapOperationStatus(await this.#client.getOp(this.workspaceId, opId));
|
|
219
|
+
if (status !== 'pending')
|
|
220
|
+
return status;
|
|
221
|
+
if (Date.now() >= deadline)
|
|
222
|
+
return 'timeout';
|
|
223
|
+
await sleep(Math.min(500, Math.max(25, deadline - Date.now())));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async ensureSubRoot(prefix, _opts) {
|
|
227
|
+
try {
|
|
228
|
+
await this.#client.listTree(this.workspaceId, { path: prefix, depth: 1 });
|
|
229
|
+
return 'ready';
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (isHttpStatus(error, 404))
|
|
233
|
+
return 'absent';
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const createDefaultRelayfileSetup = ({ cloudApiUrl, tokenProvider }) => new RelayfileSetup({
|
|
239
|
+
cloudApiUrl,
|
|
240
|
+
accessToken: tokenProvider,
|
|
241
|
+
});
|
|
242
|
+
const createSharedCloudSessionResolver = (config) => {
|
|
243
|
+
const provider = config.cloudSessionProvider ?? ensureCloudSession;
|
|
244
|
+
let session;
|
|
245
|
+
let inFlight;
|
|
246
|
+
const resolve = async () => {
|
|
247
|
+
if (!inFlight) {
|
|
248
|
+
const options = {
|
|
249
|
+
interactive: false,
|
|
250
|
+
};
|
|
251
|
+
const apiUrl = session?.auth.apiUrl ?? config.cloudApiUrl;
|
|
252
|
+
if (apiUrl)
|
|
253
|
+
options.apiUrl = apiUrl;
|
|
254
|
+
if (config.cloudSessionRefreshTimeoutMs !== undefined)
|
|
255
|
+
options.refreshTimeoutMs = config.cloudSessionRefreshTimeoutMs;
|
|
256
|
+
if (config.cloudSessionEnv !== undefined)
|
|
257
|
+
options.env = config.cloudSessionEnv;
|
|
258
|
+
inFlight = provider(options).catch((error) => {
|
|
259
|
+
if (error instanceof CloudAuthError && error.code === 'AUTH_BROWSER_REQUIRED') {
|
|
260
|
+
throw new Error('Relayfile cloud session required; run `agent-relay login`');
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}).finally(() => {
|
|
264
|
+
inFlight = undefined;
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
session = await inFlight;
|
|
268
|
+
return session;
|
|
269
|
+
};
|
|
270
|
+
return {
|
|
271
|
+
resolve,
|
|
272
|
+
getAccessToken: async () => (await resolve()).auth.accessToken,
|
|
273
|
+
};
|
|
274
|
+
};
|
|
275
|
+
const parseRemoteContent = (response) => {
|
|
276
|
+
if (!response.contentType.includes('json'))
|
|
277
|
+
return response.content;
|
|
278
|
+
try {
|
|
279
|
+
return JSON.parse(response.content);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return response.content;
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
const serializeContent = (content) => {
|
|
286
|
+
if (typeof content === 'string') {
|
|
287
|
+
return { content, contentType: 'text/plain' };
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
content: JSON.stringify(content),
|
|
291
|
+
contentType: 'application/json',
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
const isHttpStatus = (error, status) => {
|
|
295
|
+
const record = error !== null && typeof error === 'object' ? error : undefined;
|
|
296
|
+
return record?.status === status || record?.statusCode === status;
|
|
297
|
+
};
|
|
298
|
+
const mapOperationStatus = (response) => {
|
|
299
|
+
if (response.status === 'succeeded') {
|
|
300
|
+
const providerResult = response.providerResult;
|
|
301
|
+
if (providerResult &&
|
|
302
|
+
providerResult.status === 200 &&
|
|
303
|
+
typeof providerResult.externalId === 'string' &&
|
|
304
|
+
providerResult.externalId.length > 0) {
|
|
305
|
+
return 'acked';
|
|
306
|
+
}
|
|
307
|
+
throw new Error(`Writeback provider result incomplete for ${response.path ?? response.opId}: ${providerResultError(response)}`);
|
|
308
|
+
}
|
|
309
|
+
if (response.status === 'failed' || response.status === 'dead_lettered' || response.status === 'canceled') {
|
|
310
|
+
throw new Error(`Writeback operation failed for ${response.path ?? response.opId}: ${providerResultError(response)}`);
|
|
311
|
+
}
|
|
312
|
+
return 'pending';
|
|
313
|
+
};
|
|
314
|
+
const providerResultError = (response) => {
|
|
315
|
+
const providerResult = response.providerResult;
|
|
316
|
+
const resultError = typeof providerResult?.lastError === 'string'
|
|
317
|
+
? providerResult.lastError
|
|
318
|
+
: typeof providerResult?.error === 'string'
|
|
319
|
+
? providerResult.error
|
|
320
|
+
: typeof providerResult?.message === 'string'
|
|
321
|
+
? providerResult.message
|
|
322
|
+
: undefined;
|
|
323
|
+
return resultError ?? response.lastError ?? 'unknown provider error';
|
|
324
|
+
};
|
|
325
|
+
const normalizeProviderSyncStatus = (value, provider) => {
|
|
326
|
+
const record = value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
327
|
+
? value
|
|
328
|
+
: undefined;
|
|
329
|
+
if (!record)
|
|
330
|
+
return undefined;
|
|
331
|
+
const candidates = [
|
|
332
|
+
record,
|
|
333
|
+
asRecord(record[provider]),
|
|
334
|
+
asRecord(record.integration),
|
|
335
|
+
asRecord(record.connection),
|
|
336
|
+
...arrayRecords(record.providers),
|
|
337
|
+
...arrayRecords(record.integrations),
|
|
338
|
+
...arrayRecords(record.connections),
|
|
339
|
+
...arrayRecords(record.items),
|
|
340
|
+
].filter((candidate) => candidate !== undefined &&
|
|
341
|
+
(stringField(candidate, 'provider') === undefined || stringField(candidate, 'provider') === provider));
|
|
342
|
+
const source = candidates.find(hasProviderSyncFreshness) ??
|
|
343
|
+
candidates.find((candidate) => stringField(candidate, 'status')) ?? record;
|
|
344
|
+
const lastEventAt = stringField(source, 'lastEventAt') ??
|
|
345
|
+
stringField(source, 'last_event_at') ??
|
|
346
|
+
stringField(source, 'watermarkAt') ??
|
|
347
|
+
stringField(source, 'watermark_at') ??
|
|
348
|
+
stringField(source, 'watermarkTs') ??
|
|
349
|
+
stringField(source, 'watermark_ts');
|
|
350
|
+
const lastEventAtMs = numberField(source, 'lastEventAtMs') ??
|
|
351
|
+
numberField(source, 'last_event_at_ms') ??
|
|
352
|
+
(lastEventAt ? Date.parse(lastEventAt) : undefined);
|
|
353
|
+
const watermarkTs = stringField(source, 'watermarkTs') ?? stringField(source, 'watermark_ts') ?? lastEventAt;
|
|
354
|
+
return {
|
|
355
|
+
provider: stringField(source, 'provider') ?? provider,
|
|
356
|
+
status: stringField(source, 'status'),
|
|
357
|
+
lastEventAt,
|
|
358
|
+
lastEventAtMs: Number.isFinite(lastEventAtMs) ? lastEventAtMs : undefined,
|
|
359
|
+
watermarkTs,
|
|
360
|
+
lagSeconds: numberField(source, 'lagSeconds') ?? numberField(source, 'lag_seconds'),
|
|
361
|
+
};
|
|
362
|
+
};
|
|
363
|
+
const hasProviderSyncFreshness = (candidate) => Boolean(stringField(candidate, 'lastEventAt') ||
|
|
364
|
+
stringField(candidate, 'last_event_at') ||
|
|
365
|
+
stringField(candidate, 'watermarkAt') ||
|
|
366
|
+
stringField(candidate, 'watermark_at') ||
|
|
367
|
+
stringField(candidate, 'watermarkTs') ||
|
|
368
|
+
stringField(candidate, 'watermark_ts') ||
|
|
369
|
+
numberField(candidate, 'lastEventAtMs') !== undefined ||
|
|
370
|
+
numberField(candidate, 'last_event_at_ms') !== undefined ||
|
|
371
|
+
numberField(candidate, 'lagSeconds') !== undefined ||
|
|
372
|
+
numberField(candidate, 'lag_seconds') !== undefined);
|
|
373
|
+
const stringField = (record, key) => typeof record[key] === 'string' ? record[key] : undefined;
|
|
374
|
+
const numberField = (record, key) => typeof record[key] === 'number' ? record[key] : undefined;
|
|
375
|
+
const asRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
376
|
+
const eventProvider = (event) => {
|
|
377
|
+
const record = asRecord(event) ?? {};
|
|
378
|
+
return stringField(asRecord(record.resource) ?? {}, 'provider') ?? stringField(record, 'provider');
|
|
379
|
+
};
|
|
380
|
+
const arrayRecords = (value) => Array.isArray(value) ? value.map(asRecord).filter((entry) => entry !== undefined) : [];
|
|
381
|
+
const isProviderWritebackPath = (path) => path.startsWith('/linear/issues/') ||
|
|
382
|
+
path.startsWith('/linear/comments/') ||
|
|
383
|
+
/^\/slack\/channels\/[^/]+\/messages\/.+/u.test(path);
|
|
384
|
+
const isProviderPath = (path) => path.startsWith('/linear/') || path.startsWith('/slack/');
|
|
385
|
+
const providerContentLooksLinked = (content) => {
|
|
386
|
+
const record = content !== null && typeof content === 'object' && !Array.isArray(content)
|
|
387
|
+
? content
|
|
388
|
+
: {};
|
|
389
|
+
const payload = record.payload !== null && typeof record.payload === 'object' && !Array.isArray(record.payload)
|
|
390
|
+
? record.payload
|
|
391
|
+
: record;
|
|
392
|
+
const url = payload.url;
|
|
393
|
+
if (typeof url === 'string' && url.trim().length > 0)
|
|
394
|
+
return true;
|
|
395
|
+
const identifier = payload.identifier;
|
|
396
|
+
return typeof identifier === 'string' && /^[A-Z][A-Z0-9]*-\d+$/u.test(identifier);
|
|
397
|
+
};
|
|
398
|
+
const errorMessage = (error) => error instanceof Error ? error.message : String(error);
|
|
399
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
400
|
+
const maxEventId = (ids) => {
|
|
401
|
+
let max;
|
|
402
|
+
for (const id of ids) {
|
|
403
|
+
if (!max || compareEventIds(id, max) > 0) {
|
|
404
|
+
max = id;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return max;
|
|
408
|
+
};
|
|
409
|
+
const compareEventIds = (left, right) => {
|
|
410
|
+
const leftSequence = eventSequenceNumber(left);
|
|
411
|
+
const rightSequence = eventSequenceNumber(right);
|
|
412
|
+
if (leftSequence !== undefined && rightSequence !== undefined) {
|
|
413
|
+
return leftSequence - rightSequence;
|
|
414
|
+
}
|
|
415
|
+
return left.localeCompare(right);
|
|
416
|
+
};
|
|
417
|
+
const eventSequenceNumber = (eventId) => {
|
|
418
|
+
const whole = Number(eventId);
|
|
419
|
+
if (Number.isFinite(whole))
|
|
420
|
+
return whole;
|
|
421
|
+
const trailing = eventId.match(/(\d+)$/u)?.[1];
|
|
422
|
+
if (!trailing)
|
|
423
|
+
return undefined;
|
|
424
|
+
const parsed = Number(trailing);
|
|
425
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
426
|
+
};
|
|
427
|
+
//# sourceMappingURL=relayfile-cloud-mount-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayfile-cloud-mount-client.js","sourceRoot":"","sources":["../../src/mount/relayfile-cloud-mount-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type FleetNodeDefinition } from '@agent-relay/fleet';
|
|
2
|
+
import { type NodeConfig } from '../config/schema.js';
|
|
3
|
+
import { type AgentRelayMcpCommand } from '../fleet/internal-fleet-client.js';
|
|
4
|
+
export declare const FACTORY_NODE_CONFIG_ENV = "FACTORY_NODE_CONFIG";
|
|
5
|
+
export declare const AGENT_RELAY_FACTORY_NODE_CONFIG_ENV = "AGENT_RELAY_FACTORY_NODE_CONFIG";
|
|
6
|
+
export declare const DEFAULT_FACTORY_NODE_CONFIG_PATH = "factory.node.json";
|
|
7
|
+
export interface FactoryNodeDefinitionOptions {
|
|
8
|
+
config: NodeConfig;
|
|
9
|
+
name?: string;
|
|
10
|
+
maxAgents?: number;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
version?: string;
|
|
13
|
+
workflowRunner?: WorkflowRunner;
|
|
14
|
+
resolveAgentRelayMcpCommand?: () => AgentRelayMcpCommand | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowRunnerInput {
|
|
17
|
+
workflow: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
inputs: Record<string, unknown>;
|
|
20
|
+
invocationId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WorkflowRunnerResult {
|
|
23
|
+
command: string;
|
|
24
|
+
args: string[];
|
|
25
|
+
cwd: string;
|
|
26
|
+
exitCode: number;
|
|
27
|
+
stdout: string;
|
|
28
|
+
stderr: string;
|
|
29
|
+
}
|
|
30
|
+
export type WorkflowRunner = (input: WorkflowRunnerInput) => Promise<WorkflowRunnerResult>;
|
|
31
|
+
export interface FactoryNodeInventoryAgent {
|
|
32
|
+
agent_id?: string;
|
|
33
|
+
name: string;
|
|
34
|
+
invocationId?: string;
|
|
35
|
+
session_ref?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface FactoryNodeInventorySync {
|
|
38
|
+
type: 'inventory.sync';
|
|
39
|
+
workspaceId?: string;
|
|
40
|
+
clonePaths: Record<string, string>;
|
|
41
|
+
agents: FactoryNodeInventoryAgent[];
|
|
42
|
+
}
|
|
43
|
+
export declare function createFactoryNodeDefinition(options: FactoryNodeDefinitionOptions): FleetNodeDefinition;
|
|
44
|
+
export declare function readFactoryNodeConfigSync(configPath?: string): NodeConfig;
|
|
45
|
+
export declare function resolveFactoryNodeConfigPath(env?: NodeJS.ProcessEnv): string;
|
|
46
|
+
export declare function parseFactoryNodeConfig(input: unknown): NodeConfig;
|
|
47
|
+
/**
|
|
48
|
+
* Builds the `inventory.sync` payload a node emits on reconnect so the cloud can
|
|
49
|
+
* reconcile live agents against the node's advertised clone paths (AC3/AC5).
|
|
50
|
+
*
|
|
51
|
+
* Provisional surface: the wire-level reconnect/drain handshake is owned by the
|
|
52
|
+
* installed `agent-relay` sidecar, not this package — the sidecar calls this
|
|
53
|
+
* builder via the default node export to produce the reconcile payload. It is
|
|
54
|
+
* exported (and unit-proven) here so the payload shape stays pinned to NodeConfig
|
|
55
|
+
* even though no in-package handler invokes it directly.
|
|
56
|
+
*/
|
|
57
|
+
export declare function factoryNodeInventorySync(config: NodeConfig, agents: FactoryNodeInventoryAgent[]): FactoryNodeInventorySync;
|
|
58
|
+
export declare function runRelayflowsWorkflow(input: WorkflowRunnerInput): Promise<WorkflowRunnerResult>;
|
|
59
|
+
//# sourceMappingURL=factory-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory-node.d.ts","sourceRoot":"","sources":["../../src/node/factory-node.ts"],"names":[],"mappings":"AAMA,OAAO,EAA0E,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAKrI,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACvF,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,gCAAgC,CAAA;AAGvC,eAAO,MAAM,uBAAuB,wBAAwB,CAAA;AAC5D,eAAO,MAAM,mCAAmC,oCAAoC,CAAA;AACpF,eAAO,MAAM,gCAAgC,sBAAsB,CAAA;AAuEnE,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,2BAA2B,CAAC,EAAE,MAAM,oBAAoB,GAAG,SAAS,CAAA;CACrE;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAE1F,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,gBAAgB,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,MAAM,EAAE,yBAAyB,EAAE,CAAA;CACpC;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,mBAAmB,CAkCtG;AAED,wBAAgB,yBAAyB,CAAC,UAAU,SAAiC,GAAG,UAAU,CAIjG;AAED,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAOzF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CASjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,GAAG,wBAAwB,CAO1H;AA+ED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoCrG"}
|