@agent-relay/factory 0.0.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +182 -23
  2. package/bin/factory.mjs +7 -0
  3. package/dist/cli/fleet.d.ts +81 -0
  4. package/dist/cli/fleet.d.ts.map +1 -0
  5. package/dist/cli/fleet.js +571 -0
  6. package/dist/cli/fleet.js.map +1 -0
  7. package/dist/config/schema.d.ts +1313 -0
  8. package/dist/config/schema.d.ts.map +1 -0
  9. package/dist/config/schema.js +320 -0
  10. package/dist/config/schema.js.map +1 -0
  11. package/dist/constants/linear.d.ts +6 -0
  12. package/dist/constants/linear.d.ts.map +1 -0
  13. package/dist/constants/linear.js +21 -0
  14. package/dist/constants/linear.js.map +1 -0
  15. package/dist/constants/slack.d.ts +3 -0
  16. package/dist/constants/slack.d.ts.map +1 -0
  17. package/dist/constants/slack.js +3 -0
  18. package/dist/constants/slack.js.map +1 -0
  19. package/dist/dispatch/templates.d.ts +52 -0
  20. package/dist/dispatch/templates.d.ts.map +1 -0
  21. package/dist/dispatch/templates.js +118 -0
  22. package/dist/dispatch/templates.js.map +1 -0
  23. package/dist/fleet/create-fleet.d.ts +14 -0
  24. package/dist/fleet/create-fleet.d.ts.map +1 -0
  25. package/dist/fleet/create-fleet.js +15 -0
  26. package/dist/fleet/create-fleet.js.map +1 -0
  27. package/dist/fleet/ensure-relay-broker.d.ts +24 -0
  28. package/dist/fleet/ensure-relay-broker.d.ts.map +1 -0
  29. package/dist/fleet/ensure-relay-broker.js +56 -0
  30. package/dist/fleet/ensure-relay-broker.js.map +1 -0
  31. package/dist/fleet/internal-fleet-client.d.ts +90 -0
  32. package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
  33. package/dist/fleet/internal-fleet-client.js +602 -0
  34. package/dist/fleet/internal-fleet-client.js.map +1 -0
  35. package/dist/fleet/relay-fleet-client.d.ts +105 -0
  36. package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
  37. package/dist/fleet/relay-fleet-client.js +509 -0
  38. package/dist/fleet/relay-fleet-client.js.map +1 -0
  39. package/dist/github/index.d.ts +5 -0
  40. package/dist/github/index.d.ts.map +1 -0
  41. package/dist/github/index.js +3 -0
  42. package/dist/github/index.js.map +1 -0
  43. package/dist/github/merge-gate.d.ts +47 -0
  44. package/dist/github/merge-gate.d.ts.map +1 -0
  45. package/dist/github/merge-gate.js +147 -0
  46. package/dist/github/merge-gate.js.map +1 -0
  47. package/dist/github/probe-closer.d.ts +15 -0
  48. package/dist/github/probe-closer.d.ts.map +1 -0
  49. package/dist/github/probe-closer.js +67 -0
  50. package/dist/github/probe-closer.js.map +1 -0
  51. package/dist/index.d.ts +36 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +20 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/issue-key-match.d.ts +3 -0
  56. package/dist/issue-key-match.d.ts.map +1 -0
  57. package/dist/issue-key-match.js +22 -0
  58. package/dist/issue-key-match.js.map +1 -0
  59. package/dist/linear/state-resolver.d.ts +26 -0
  60. package/dist/linear/state-resolver.d.ts.map +1 -0
  61. package/dist/linear/state-resolver.js +285 -0
  62. package/dist/linear/state-resolver.js.map +1 -0
  63. package/dist/mount/local-mount-preflight.d.ts +9 -0
  64. package/dist/mount/local-mount-preflight.d.ts.map +1 -0
  65. package/dist/mount/local-mount-preflight.js +149 -0
  66. package/dist/mount/local-mount-preflight.js.map +1 -0
  67. package/dist/mount/relayfile-binary.d.ts +9 -0
  68. package/dist/mount/relayfile-binary.d.ts.map +1 -0
  69. package/dist/mount/relayfile-binary.js +177 -0
  70. package/dist/mount/relayfile-binary.js.map +1 -0
  71. package/dist/mount/relayfile-cloud-mount-client.d.ts +123 -0
  72. package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -0
  73. package/dist/mount/relayfile-cloud-mount-client.js +427 -0
  74. package/dist/mount/relayfile-cloud-mount-client.js.map +1 -0
  75. package/dist/node/factory-node.d.ts +59 -0
  76. package/dist/node/factory-node.d.ts.map +1 -0
  77. package/dist/node/factory-node.js +351 -0
  78. package/dist/node/factory-node.js.map +1 -0
  79. package/dist/node/factory.node.d.ts +3 -0
  80. package/dist/node/factory.node.d.ts.map +1 -0
  81. package/dist/node/factory.node.js +5 -0
  82. package/dist/node/factory.node.js.map +1 -0
  83. package/dist/orchestrator/batch-tracker.d.ts +42 -0
  84. package/dist/orchestrator/batch-tracker.d.ts.map +1 -0
  85. package/dist/orchestrator/batch-tracker.js +125 -0
  86. package/dist/orchestrator/batch-tracker.js.map +1 -0
  87. package/dist/orchestrator/factory.d.ts +58 -0
  88. package/dist/orchestrator/factory.d.ts.map +1 -0
  89. package/dist/orchestrator/factory.js +4372 -0
  90. package/dist/orchestrator/factory.js.map +1 -0
  91. package/dist/orchestrator/index.d.ts +5 -0
  92. package/dist/orchestrator/index.d.ts.map +1 -0
  93. package/dist/orchestrator/index.js +4 -0
  94. package/dist/orchestrator/index.js.map +1 -0
  95. package/dist/orchestrator/process-identity.d.ts +23 -0
  96. package/dist/orchestrator/process-identity.d.ts.map +1 -0
  97. package/dist/orchestrator/process-identity.js +122 -0
  98. package/dist/orchestrator/process-identity.js.map +1 -0
  99. package/dist/orchestrator/reaper.d.ts +60 -0
  100. package/dist/orchestrator/reaper.d.ts.map +1 -0
  101. package/dist/orchestrator/reaper.js +293 -0
  102. package/dist/orchestrator/reaper.js.map +1 -0
  103. package/dist/ports/fleet.d.ts +101 -0
  104. package/dist/ports/fleet.d.ts.map +1 -0
  105. package/dist/ports/fleet.js +2 -0
  106. package/dist/ports/fleet.js.map +1 -0
  107. package/dist/ports/index.d.ts +5 -0
  108. package/dist/ports/index.d.ts.map +1 -0
  109. package/dist/ports/index.js +2 -0
  110. package/dist/ports/index.js.map +1 -0
  111. package/dist/ports/mount.d.ts +56 -0
  112. package/dist/ports/mount.d.ts.map +1 -0
  113. package/dist/ports/mount.js +2 -0
  114. package/dist/ports/mount.js.map +1 -0
  115. package/dist/ports/state.d.ts +61 -0
  116. package/dist/ports/state.d.ts.map +1 -0
  117. package/dist/ports/state.js +2 -0
  118. package/dist/ports/state.js.map +1 -0
  119. package/dist/ports/system.d.ts +15 -0
  120. package/dist/ports/system.d.ts.map +1 -0
  121. package/dist/ports/system.js +2 -0
  122. package/dist/ports/system.js.map +1 -0
  123. package/dist/ports/writeback.d.ts +25 -0
  124. package/dist/ports/writeback.d.ts.map +1 -0
  125. package/dist/ports/writeback.js +2 -0
  126. package/dist/ports/writeback.js.map +1 -0
  127. package/dist/safety/factory-scope.d.ts +16 -0
  128. package/dist/safety/factory-scope.d.ts.map +1 -0
  129. package/dist/safety/factory-scope.js +107 -0
  130. package/dist/safety/factory-scope.js.map +1 -0
  131. package/dist/state/in-memory-state-store.d.ts +31 -0
  132. package/dist/state/in-memory-state-store.d.ts.map +1 -0
  133. package/dist/state/in-memory-state-store.js +115 -0
  134. package/dist/state/in-memory-state-store.js.map +1 -0
  135. package/dist/state/index.d.ts +3 -0
  136. package/dist/state/index.d.ts.map +1 -0
  137. package/dist/state/index.js +2 -0
  138. package/dist/state/index.js.map +1 -0
  139. package/dist/state/store.d.ts +29 -0
  140. package/dist/state/store.d.ts.map +1 -0
  141. package/dist/state/store.js +26 -0
  142. package/dist/state/store.js.map +1 -0
  143. package/dist/subscriptions/common.d.ts +7 -0
  144. package/dist/subscriptions/common.d.ts.map +1 -0
  145. package/dist/subscriptions/common.js +59 -0
  146. package/dist/subscriptions/common.js.map +1 -0
  147. package/dist/subscriptions/event-client.d.ts +40 -0
  148. package/dist/subscriptions/event-client.d.ts.map +1 -0
  149. package/dist/subscriptions/event-client.js +234 -0
  150. package/dist/subscriptions/event-client.js.map +1 -0
  151. package/dist/subscriptions/globs.d.ts +5 -0
  152. package/dist/subscriptions/globs.d.ts.map +1 -0
  153. package/dist/subscriptions/globs.js +50 -0
  154. package/dist/subscriptions/globs.js.map +1 -0
  155. package/dist/subscriptions/index.d.ts +8 -0
  156. package/dist/subscriptions/index.d.ts.map +1 -0
  157. package/dist/subscriptions/index.js +5 -0
  158. package/dist/subscriptions/index.js.map +1 -0
  159. package/dist/subscriptions/linear-filter.d.ts +26 -0
  160. package/dist/subscriptions/linear-filter.d.ts.map +1 -0
  161. package/dist/subscriptions/linear-filter.js +143 -0
  162. package/dist/subscriptions/linear-filter.js.map +1 -0
  163. package/dist/subscriptions/specs.d.ts +44 -0
  164. package/dist/subscriptions/specs.d.ts.map +1 -0
  165. package/dist/subscriptions/specs.js +195 -0
  166. package/dist/subscriptions/specs.js.map +1 -0
  167. package/dist/testing/fakes.d.ts +114 -0
  168. package/dist/testing/fakes.d.ts.map +1 -0
  169. package/dist/testing/fakes.js +219 -0
  170. package/dist/testing/fakes.js.map +1 -0
  171. package/dist/testing/index.d.ts +2 -0
  172. package/dist/testing/index.d.ts.map +1 -0
  173. package/dist/testing/index.js +2 -0
  174. package/dist/testing/index.js.map +1 -0
  175. package/dist/triage/heuristic.d.ts +42 -0
  176. package/dist/triage/heuristic.d.ts.map +1 -0
  177. package/dist/triage/heuristic.js +326 -0
  178. package/dist/triage/heuristic.js.map +1 -0
  179. package/dist/triage/index.d.ts +7 -0
  180. package/dist/triage/index.d.ts.map +1 -0
  181. package/dist/triage/index.js +5 -0
  182. package/dist/triage/index.js.map +1 -0
  183. package/dist/triage/llm.d.ts +11 -0
  184. package/dist/triage/llm.d.ts.map +1 -0
  185. package/dist/triage/llm.js +48 -0
  186. package/dist/triage/llm.js.map +1 -0
  187. package/dist/triage/schema.d.ts +344 -0
  188. package/dist/triage/schema.d.ts.map +1 -0
  189. package/dist/triage/schema.js +37 -0
  190. package/dist/triage/schema.js.map +1 -0
  191. package/dist/triage/tiered.d.ts +8 -0
  192. package/dist/triage/tiered.d.ts.map +1 -0
  193. package/dist/triage/tiered.js +47 -0
  194. package/dist/triage/tiered.js.map +1 -0
  195. package/dist/types.d.ts +212 -0
  196. package/dist/types.d.ts.map +1 -0
  197. package/dist/types.js +2 -0
  198. package/dist/types.js.map +1 -0
  199. package/dist/webhook/handler.d.ts +22 -0
  200. package/dist/webhook/handler.d.ts.map +1 -0
  201. package/dist/webhook/handler.js +57 -0
  202. package/dist/webhook/handler.js.map +1 -0
  203. package/dist/webhook/index.d.ts +5 -0
  204. package/dist/webhook/index.d.ts.map +1 -0
  205. package/dist/webhook/index.js +3 -0
  206. package/dist/webhook/index.js.map +1 -0
  207. package/dist/webhook/registrar.d.ts +16 -0
  208. package/dist/webhook/registrar.d.ts.map +1 -0
  209. package/dist/webhook/registrar.js +50 -0
  210. package/dist/webhook/registrar.js.map +1 -0
  211. package/dist/writeback/github.d.ts +6 -0
  212. package/dist/writeback/github.d.ts.map +1 -0
  213. package/dist/writeback/github.js +48 -0
  214. package/dist/writeback/github.js.map +1 -0
  215. package/dist/writeback/index.d.ts +6 -0
  216. package/dist/writeback/index.d.ts.map +1 -0
  217. package/dist/writeback/index.js +4 -0
  218. package/dist/writeback/index.js.map +1 -0
  219. package/dist/writeback/linear.d.ts +41 -0
  220. package/dist/writeback/linear.d.ts.map +1 -0
  221. package/dist/writeback/linear.js +286 -0
  222. package/dist/writeback/linear.js.map +1 -0
  223. package/dist/writeback/shared.d.ts +7 -0
  224. package/dist/writeback/shared.d.ts.map +1 -0
  225. package/dist/writeback/shared.js +29 -0
  226. package/dist/writeback/shared.js.map +1 -0
  227. package/dist/writeback/slack.d.ts +16 -0
  228. package/dist/writeback/slack.d.ts.map +1 -0
  229. package/dist/writeback/slack.js +104 -0
  230. package/dist/writeback/slack.js.map +1 -0
  231. package/package.json +54 -9
  232. package/scripts/com.agentrelay.factory-canary.plist.example +53 -0
  233. package/scripts/factory-canary.sh +89 -0
  234. package/index.d.ts +0 -2
  235. package/index.js +0 -7
@@ -0,0 +1,177 @@
1
+ import { accessSync, constants, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ // ESM has no __dirname; derive this module's directory for the default search
5
+ // start (used when no caller-supplied deployment dir is available).
6
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
7
+ const STALE_RECONCILE_MS = 15 * 60 * 1000;
8
+ const NOT_FOUND_ERROR = '[factory] relayfile-mount binary not found. Install dependencies or run: npm run relayfile-mount:install';
9
+ export function coercePid(value) {
10
+ return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;
11
+ }
12
+ function canExecute(filePath) {
13
+ if (!filePath)
14
+ return false;
15
+ try {
16
+ accessSync(filePath, constants.X_OK);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function devArchSuffix() {
24
+ if (process.platform === 'darwin') {
25
+ return process.arch === 'arm64' ? 'darwin-arm64' : 'darwin-amd64';
26
+ }
27
+ if (process.platform === 'linux') {
28
+ return process.arch === 'arm64' ? 'linux-arm64' : 'linux-amd64';
29
+ }
30
+ return `${process.platform}-${process.arch}`;
31
+ }
32
+ function binaryName() {
33
+ return process.platform === 'win32' ? 'relayfile-mount.exe' : 'relayfile-mount';
34
+ }
35
+ function optionalPackageArchSuffix() {
36
+ return `${process.platform}-${process.arch}`;
37
+ }
38
+ function findPearRoot(startDir) {
39
+ let current = resolve(startDir);
40
+ for (;;) {
41
+ try {
42
+ accessSync(join(current, 'factory.config.json'), constants.R_OK);
43
+ return current;
44
+ }
45
+ catch {
46
+ const parent = dirname(current);
47
+ if (parent === current)
48
+ return null;
49
+ current = parent;
50
+ }
51
+ }
52
+ }
53
+ function devRelayfileCandidates(pearRoot) {
54
+ const distRoot = resolve(process.env.RELAYFILE_DIST_DIR ?? join(pearRoot, '..', 'relayfile', 'dist'));
55
+ const suffix = devArchSuffix();
56
+ return [
57
+ join(distRoot, `relayfile-mount-${suffix}`),
58
+ join(distRoot, suffix, binaryName()),
59
+ ];
60
+ }
61
+ // @relayfile/sdk carries relayfile-mount through per-platform optional
62
+ // dependencies. Prefer that bundled binary so factory start does not depend on
63
+ // a global relayfile install or a manually populated repo bin/ directory.
64
+ function optionalPackageCandidates(pearRoot) {
65
+ const suffix = optionalPackageArchSuffix();
66
+ return [
67
+ join(pearRoot, 'node_modules', '@relayfile', `mount-${suffix}`, 'bin', binaryName()),
68
+ join(pearRoot, 'node_modules', '@relayfile', 'sdk', 'node_modules', '@relayfile', `mount-${suffix}`, 'bin', binaryName()),
69
+ ];
70
+ }
71
+ export function resolveRelayfileMountBinary(startDir = MODULE_DIR) {
72
+ if (process.env.RELAYFILE_MOUNT_BIN) {
73
+ const explicitBinary = resolve(process.env.RELAYFILE_MOUNT_BIN);
74
+ if (canExecute(explicitBinary))
75
+ return explicitBinary;
76
+ throw new Error(NOT_FOUND_ERROR);
77
+ }
78
+ const pearRoot = findPearRoot(startDir);
79
+ const candidates = pearRoot
80
+ ? [
81
+ ...optionalPackageCandidates(pearRoot),
82
+ join(pearRoot, 'bin', binaryName()),
83
+ ...devRelayfileCandidates(pearRoot),
84
+ ]
85
+ : [];
86
+ for (const candidate of candidates) {
87
+ if (canExecute(candidate))
88
+ return resolve(candidate);
89
+ }
90
+ throw new Error(NOT_FOUND_ERROR);
91
+ }
92
+ function cliName() {
93
+ return process.platform === 'win32' ? 'relayfile.exe' : 'relayfile';
94
+ }
95
+ // The `relayfile` CLI (as opposed to the raw relayfile-mount binary) resolves
96
+ // workspace credentials itself and bundles an up-to-date mount, so the factory
97
+ // can start/refresh the writeback mount without plumbing a token — and without
98
+ // depending on a possibly-stale @relayfile/mount-* node_modules binary. Prefer
99
+ // it; fall back to the raw binary only when no CLI is on PATH.
100
+ export function resolveRelayfileCli() {
101
+ const explicit = process.env.RELAYFILE_BIN;
102
+ if (explicit)
103
+ return canExecute(explicit) ? resolve(explicit) : undefined;
104
+ const exe = cliName();
105
+ const separator = process.platform === 'win32' ? ';' : ':';
106
+ for (const dir of (process.env.PATH ?? '').split(separator)) {
107
+ if (!dir)
108
+ continue;
109
+ const candidate = join(dir, exe);
110
+ if (canExecute(candidate))
111
+ return resolve(candidate);
112
+ }
113
+ return undefined;
114
+ }
115
+ export function checkMountStaleness(stateFilePath, workspaceId,
116
+ // Alternate identifiers that name the SAME workspace (e.g. the cloud-side
117
+ // UUID for a `rw_` handle). The local mount records the cloud UUID in its
118
+ // state.json, so without these aliases a handle-vs-UUID comparison would
119
+ // report a false "workspace mismatch".
120
+ acceptableWorkspaceIds = []) {
121
+ let parsed;
122
+ try {
123
+ parsed = JSON.parse(readFileSync(stateFilePath, 'utf8'));
124
+ }
125
+ catch (error) {
126
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT') {
127
+ return { stale: false };
128
+ }
129
+ return { stale: true, reason: `mount state is unreadable: ${error instanceof Error ? error.message : String(error)}` };
130
+ }
131
+ if (typeof parsed !== 'object' || parsed === null) {
132
+ return { stale: true, reason: 'mount state is unreadable: expected object' };
133
+ }
134
+ const registeredWorkspaceId = typeof parsed.workspaceId === 'string' ? parsed.workspaceId : undefined;
135
+ const accepted = new Set([workspaceId, ...acceptableWorkspaceIds]);
136
+ if (registeredWorkspaceId === undefined || !accepted.has(registeredWorkspaceId)) {
137
+ return {
138
+ stale: true,
139
+ reason: `workspace mismatch: registered=${registeredWorkspaceId ?? 'unknown'} expected=${[...accepted].join('|')}`,
140
+ };
141
+ }
142
+ // Prefer the top-level pid; fall back to the CLI-daemonized mount's daemon.pid.
143
+ const pid = coercePid(parsed.pid) ?? coercePid(parsed.daemon?.pid);
144
+ const lastReconcileAt = typeof parsed.lastReconcileAt === 'string'
145
+ ? Date.parse(parsed.lastReconcileAt)
146
+ : NaN;
147
+ if (!Number.isFinite(lastReconcileAt)) {
148
+ return { stale: true, reason: 'last reconcile timestamp is missing', pid };
149
+ }
150
+ const ageMs = Date.now() - lastReconcileAt;
151
+ if (ageMs > STALE_RECONCILE_MS) {
152
+ return {
153
+ stale: true,
154
+ reason: `last reconcile ${Math.floor(ageMs / 60000)}m ago`,
155
+ pid,
156
+ };
157
+ }
158
+ if (pid === undefined) {
159
+ // Neither a top-level pid nor daemon.pid was recorded. The fresh
160
+ // lastReconcileAt validated above is itself proof the mount is live and
161
+ // reconciling, so fall back to that rather than declaring a healthy mount
162
+ // stale and forcing a spurious refresh (which previously tore down the live
163
+ // mount and then failed to re-spawn).
164
+ return { stale: false };
165
+ }
166
+ try {
167
+ process.kill(pid, 0);
168
+ }
169
+ catch (error) {
170
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'EPERM') {
171
+ return { stale: false, pid };
172
+ }
173
+ return { stale: true, reason: `mount process (pid ${pid}) is not running`, pid };
174
+ }
175
+ return { stale: false, pid };
176
+ }
177
+ //# sourceMappingURL=relayfile-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayfile-binary.js","sourceRoot":"","sources":["../../src/mount/relayfile-binary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { type ActiveWorkspaceDescriptor, type CloudSession, type CloudSessionOptions } from '@agent-relay/cloud';
2
+ import { type ChangeEvent, type DeleteFileInput, type EventFeedResponse, type FileReadResponse, type GetEventsOptions, type ListTreeOptions, type ResourceAtEventResult, type OperationStatusResponse, type Subscription, type TreeResponse, type WriteFileInput, type WriteQueuedResponse } from '@relayfile/sdk';
3
+ import type { EventPage, MountClient, ProviderSyncStatus, SubscribeOptions } from '../ports/index.js';
4
+ import { type RelayfileEventClient, type TokenProvider } from '../subscriptions/index.js';
5
+ export declare const FACTORY_RELAYFILE_SCOPES: readonly ["relayfile:fs:read:/linear/issues/**", "relayfile:fs:write:/linear/issues/**", "relayfile:fs:read:/github/repos/**", "relayfile:fs:read:/slack/channels/**", "relayfile:fs:write:/slack/channels/**", "relayfile:fs:read:/slack/users/**"];
6
+ export type CloudSessionProvider = (options?: CloudSessionOptions) => Promise<CloudSession>;
7
+ export type ActiveWorkspaceResolver = (options?: {
8
+ interactive?: boolean;
9
+ }) => Promise<ActiveWorkspaceDescriptor>;
10
+ export interface ResolvedFactoryWorkspace {
11
+ /** Relayfile workspace handle (e.g. `rw_7ccfea89`) — what the mount/config use. */
12
+ workspaceId: string;
13
+ /**
14
+ * Cloud-side UUID for the same workspace (e.g. `50587328-…`). The local
15
+ * relayfile mount records this form in its state.json, so it is passed to the
16
+ * staleness check as an accepted alias to avoid a spurious "workspace
17
+ * mismatch" warning when handle and UUID refer to the same workspace.
18
+ */
19
+ cloudWorkspaceId?: string;
20
+ }
21
+ /**
22
+ * Derive the factory's workspace from the active cloud session rather than a
23
+ * hardcoded config value. `resolveActiveWorkspace()` resolves the locally
24
+ * pinned workspace against the cloud API and returns both identifier forms.
25
+ * Falls back to the built-in default when resolution fails (offline / no
26
+ * session), so callers always get a usable handle.
27
+ */
28
+ export declare function resolveFactoryWorkspace(resolver?: ActiveWorkspaceResolver): Promise<ResolvedFactoryWorkspace>;
29
+ export interface RelayfileWorkspaceHandleLike {
30
+ info: {
31
+ relayfileUrl: string;
32
+ };
33
+ client(): RelayFileClientLike;
34
+ getToken(): Promise<string> | string;
35
+ }
36
+ export type RelayfileSetupFactory = (options: {
37
+ cloudApiUrl: string;
38
+ tokenProvider: () => Promise<string>;
39
+ }) => {
40
+ joinWorkspace(workspaceId: string, options?: {
41
+ agentName?: string;
42
+ scopes?: string[];
43
+ }): Promise<RelayfileWorkspaceHandleLike>;
44
+ };
45
+ export interface RelayfileCloudMountClientConfig {
46
+ backend?: 'relayfile-cloud';
47
+ workspaceId?: string;
48
+ cloudApiUrl?: string;
49
+ cloudSessionProvider?: CloudSessionProvider;
50
+ cloudSessionRefreshTimeoutMs?: number;
51
+ cloudSessionEnv?: NodeJS.ProcessEnv;
52
+ relayfileSetupFactory?: RelayfileSetupFactory;
53
+ agentName?: string;
54
+ scopes?: string[];
55
+ client?: RelayFileClientLike;
56
+ tokenProvider?: TokenProvider;
57
+ baseUrl?: string;
58
+ eventClient?: RelayfileEventClient;
59
+ isAllowedDraft?: (path: string, content: unknown, opts?: {
60
+ guarded?: boolean;
61
+ }) => boolean | Promise<boolean>;
62
+ isAllowedDelete?: (path: string, currentContent: unknown) => boolean | Promise<boolean>;
63
+ }
64
+ export type RelayFileClientLike = {
65
+ readFile(workspaceId: string, path: string): Promise<FileReadResponse>;
66
+ writeFile(input: WriteFileInput): Promise<WriteQueuedResponse>;
67
+ deleteFile(input: DeleteFileInput): Promise<WriteQueuedResponse>;
68
+ listTree(workspaceId: string, options?: ListTreeOptions): Promise<TreeResponse>;
69
+ getEvents(workspaceId: string, options?: GetEventsOptions): Promise<EventFeedResponse>;
70
+ listLastNChanges?(limit: number, context?: {
71
+ workspaceId: string;
72
+ token?: string;
73
+ }): Promise<{
74
+ events: ChangeEvent[];
75
+ }>;
76
+ getResourceAtEvent(eventId: string, context?: {
77
+ workspaceId: string;
78
+ token?: string;
79
+ }): Promise<ResourceAtEventResult>;
80
+ getOp?(workspaceId: string, opId: string): Promise<OperationStatusResponse>;
81
+ getSyncStatus?(workspaceId: string, options?: {
82
+ provider?: string;
83
+ }): Promise<unknown>;
84
+ getToken?(): Promise<string> | string;
85
+ getBaseUrl?(): string;
86
+ };
87
+ export declare class RelayfileCloudMountClient implements MountClient {
88
+ #private;
89
+ readonly workspaceId: string;
90
+ readonly writebackTransport = "relayfile-cloud";
91
+ constructor(config?: RelayfileCloudMountClientConfig);
92
+ setDefaultAllowedDraftPredicate(predicate: (path: string, content: unknown, opts?: {
93
+ guarded?: boolean;
94
+ }) => boolean | Promise<boolean>): void;
95
+ static fromConfig(config?: RelayfileCloudMountClientConfig): Promise<RelayfileCloudMountClient>;
96
+ readFile(path: string): Promise<{
97
+ content: unknown;
98
+ revision?: string;
99
+ }>;
100
+ writeFile(path: string, content: unknown, opts?: {
101
+ guarded?: boolean;
102
+ }): Promise<void>;
103
+ deleteFile(path: string): Promise<void>;
104
+ listTree(prefix: string): Promise<string[]>;
105
+ subscribe(globs: string[], onChange: (event: ChangeEvent) => void, opts?: SubscribeOptions): Subscription;
106
+ getEvents(opts: {
107
+ cursor?: string;
108
+ limit?: number;
109
+ provider?: string;
110
+ last?: number;
111
+ }): Promise<EventPage>;
112
+ getEventHighWatermark(opts?: {
113
+ provider?: string;
114
+ }): Promise<string | undefined>;
115
+ getSyncStatus(provider: string): Promise<ProviderSyncStatus | undefined>;
116
+ confirmWrite(path: string, opts?: {
117
+ timeoutMs?: number;
118
+ }): Promise<'acked' | 'pending' | 'failed' | 'timeout'>;
119
+ ensureSubRoot(prefix: string, _opts?: {
120
+ timeoutMs?: number;
121
+ }): Promise<'ready' | 'absent'>;
122
+ }
123
+ //# sourceMappingURL=relayfile-cloud-mount-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayfile-cloud-mount-client.d.ts","sourceRoot":"","sources":["../../src/mount/relayfile-cloud-mount-client.ts"],"names":[],"mappings":"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"}