@felan-ai/daemon 0.0.0-stage → 0.0.0

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 (288) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +69 -0
  3. package/README.md +61 -2
  4. package/dist/client.d.ts +5 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +4 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/daemon/admission.d.ts +39 -0
  9. package/dist/daemon/admission.d.ts.map +1 -0
  10. package/dist/daemon/admission.js +175 -0
  11. package/dist/daemon/admission.js.map +1 -0
  12. package/dist/daemon/agent-logs.d.ts +11 -0
  13. package/dist/daemon/agent-logs.d.ts.map +1 -0
  14. package/dist/daemon/agent-logs.js +31 -0
  15. package/dist/daemon/agent-logs.js.map +1 -0
  16. package/dist/daemon/bootstrap.d.ts +7 -0
  17. package/dist/daemon/bootstrap.d.ts.map +1 -0
  18. package/dist/daemon/bootstrap.js +4 -0
  19. package/dist/daemon/bootstrap.js.map +1 -0
  20. package/dist/daemon/broker.d.ts +94 -0
  21. package/dist/daemon/broker.d.ts.map +1 -0
  22. package/dist/daemon/broker.js +374 -0
  23. package/dist/daemon/broker.js.map +1 -0
  24. package/dist/daemon/commands.d.ts +47 -0
  25. package/dist/daemon/commands.d.ts.map +1 -0
  26. package/dist/daemon/commands.js +639 -0
  27. package/dist/daemon/commands.js.map +1 -0
  28. package/dist/daemon/control-recovery.d.ts +9 -0
  29. package/dist/daemon/control-recovery.d.ts.map +1 -0
  30. package/dist/daemon/control-recovery.js +68 -0
  31. package/dist/daemon/control-recovery.js.map +1 -0
  32. package/dist/daemon/control-state.d.ts +1915 -0
  33. package/dist/daemon/control-state.d.ts.map +1 -0
  34. package/dist/daemon/control-state.js +154 -0
  35. package/dist/daemon/control-state.js.map +1 -0
  36. package/dist/daemon/control-store.d.ts +113 -0
  37. package/dist/daemon/control-store.d.ts.map +1 -0
  38. package/dist/daemon/control-store.js +901 -0
  39. package/dist/daemon/control-store.js.map +1 -0
  40. package/dist/daemon/execution-policy.d.ts +15 -0
  41. package/dist/daemon/execution-policy.d.ts.map +1 -0
  42. package/dist/daemon/execution-policy.js +42 -0
  43. package/dist/daemon/execution-policy.js.map +1 -0
  44. package/dist/daemon/execution-services.d.ts +5 -0
  45. package/dist/daemon/execution-services.d.ts.map +1 -0
  46. package/dist/daemon/execution-services.js +73 -0
  47. package/dist/daemon/execution-services.js.map +1 -0
  48. package/dist/daemon/executions.d.ts +134 -0
  49. package/dist/daemon/executions.d.ts.map +1 -0
  50. package/dist/daemon/executions.js +486 -0
  51. package/dist/daemon/executions.js.map +1 -0
  52. package/dist/daemon/extension-ui.d.ts +24 -0
  53. package/dist/daemon/extension-ui.d.ts.map +1 -0
  54. package/dist/daemon/extension-ui.js +161 -0
  55. package/dist/daemon/extension-ui.js.map +1 -0
  56. package/dist/daemon/fanout.d.ts +40 -0
  57. package/dist/daemon/fanout.d.ts.map +1 -0
  58. package/dist/daemon/fanout.js +304 -0
  59. package/dist/daemon/fanout.js.map +1 -0
  60. package/dist/daemon/headless-json.d.ts +3 -0
  61. package/dist/daemon/headless-json.d.ts.map +1 -0
  62. package/dist/daemon/headless-json.js +20 -0
  63. package/dist/daemon/headless-json.js.map +1 -0
  64. package/dist/daemon/host-config.d.ts +61 -0
  65. package/dist/daemon/host-config.d.ts.map +1 -0
  66. package/dist/daemon/host-config.js +167 -0
  67. package/dist/daemon/host-config.js.map +1 -0
  68. package/dist/daemon/host-services.d.ts +61 -0
  69. package/dist/daemon/host-services.d.ts.map +1 -0
  70. package/dist/daemon/host-services.js +2 -0
  71. package/dist/daemon/host-services.js.map +1 -0
  72. package/dist/daemon/ipc.d.ts +14 -0
  73. package/dist/daemon/ipc.d.ts.map +1 -0
  74. package/dist/daemon/ipc.js +233 -0
  75. package/dist/daemon/ipc.js.map +1 -0
  76. package/dist/daemon/legacy-sessions.d.ts +48 -0
  77. package/dist/daemon/legacy-sessions.d.ts.map +1 -0
  78. package/dist/daemon/legacy-sessions.js +328 -0
  79. package/dist/daemon/legacy-sessions.js.map +1 -0
  80. package/dist/daemon/lifecycle.d.ts +44 -0
  81. package/dist/daemon/lifecycle.d.ts.map +1 -0
  82. package/dist/daemon/lifecycle.js +164 -0
  83. package/dist/daemon/lifecycle.js.map +1 -0
  84. package/dist/daemon/main.d.ts +3 -0
  85. package/dist/daemon/main.d.ts.map +1 -0
  86. package/dist/daemon/main.js +83 -0
  87. package/dist/daemon/main.js.map +1 -0
  88. package/dist/daemon/message-display.d.ts +4 -0
  89. package/dist/daemon/message-display.d.ts.map +1 -0
  90. package/dist/daemon/message-display.js +20 -0
  91. package/dist/daemon/message-display.js.map +1 -0
  92. package/dist/daemon/native-ownership.d.ts +13 -0
  93. package/dist/daemon/native-ownership.d.ts.map +1 -0
  94. package/dist/daemon/native-ownership.js +173 -0
  95. package/dist/daemon/native-ownership.js.map +1 -0
  96. package/dist/daemon/operational-log.d.ts +23 -0
  97. package/dist/daemon/operational-log.d.ts.map +1 -0
  98. package/dist/daemon/operational-log.js +79 -0
  99. package/dist/daemon/operational-log.js.map +1 -0
  100. package/dist/daemon/ownership.d.ts +35 -0
  101. package/dist/daemon/ownership.d.ts.map +1 -0
  102. package/dist/daemon/ownership.js +395 -0
  103. package/dist/daemon/ownership.js.map +1 -0
  104. package/dist/daemon/persistence.d.ts +110 -0
  105. package/dist/daemon/persistence.d.ts.map +1 -0
  106. package/dist/daemon/persistence.js +540 -0
  107. package/dist/daemon/persistence.js.map +1 -0
  108. package/dist/daemon/process-adapter.d.ts +23 -0
  109. package/dist/daemon/process-adapter.d.ts.map +1 -0
  110. package/dist/daemon/process-adapter.js +2 -0
  111. package/dist/daemon/process-adapter.js.map +1 -0
  112. package/dist/daemon/processes.d.ts +102 -0
  113. package/dist/daemon/processes.d.ts.map +1 -0
  114. package/dist/daemon/processes.js +691 -0
  115. package/dist/daemon/processes.js.map +1 -0
  116. package/dist/daemon/profile-storage.d.ts +16 -0
  117. package/dist/daemon/profile-storage.d.ts.map +1 -0
  118. package/dist/daemon/profile-storage.js +148 -0
  119. package/dist/daemon/profile-storage.js.map +1 -0
  120. package/dist/daemon/projection.d.ts +110 -0
  121. package/dist/daemon/projection.d.ts.map +1 -0
  122. package/dist/daemon/projection.js +661 -0
  123. package/dist/daemon/projection.js.map +1 -0
  124. package/dist/daemon/provider-loader.d.ts +28 -0
  125. package/dist/daemon/provider-loader.d.ts.map +1 -0
  126. package/dist/daemon/provider-loader.js +376 -0
  127. package/dist/daemon/provider-loader.js.map +1 -0
  128. package/dist/daemon/provider.d.ts +92 -0
  129. package/dist/daemon/provider.d.ts.map +1 -0
  130. package/dist/daemon/provider.js +31 -0
  131. package/dist/daemon/provider.js.map +1 -0
  132. package/dist/daemon/registry.d.ts +209 -0
  133. package/dist/daemon/registry.d.ts.map +1 -0
  134. package/dist/daemon/registry.js +1591 -0
  135. package/dist/daemon/registry.js.map +1 -0
  136. package/dist/daemon/runtime-dependencies.d.ts +5 -0
  137. package/dist/daemon/runtime-dependencies.d.ts.map +1 -0
  138. package/dist/daemon/runtime-dependencies.js +31 -0
  139. package/dist/daemon/runtime-dependencies.js.map +1 -0
  140. package/dist/daemon/server.d.ts +110 -0
  141. package/dist/daemon/server.d.ts.map +1 -0
  142. package/dist/daemon/server.js +556 -0
  143. package/dist/daemon/server.js.map +1 -0
  144. package/dist/daemon/service.d.ts +38 -0
  145. package/dist/daemon/service.d.ts.map +1 -0
  146. package/dist/daemon/service.js +275 -0
  147. package/dist/daemon/service.js.map +1 -0
  148. package/dist/daemon/session-cursor.d.ts +3 -0
  149. package/dist/daemon/session-cursor.d.ts.map +1 -0
  150. package/dist/daemon/session-cursor.js +4 -0
  151. package/dist/daemon/session-cursor.js.map +1 -0
  152. package/dist/daemon/session-execution.d.ts +88 -0
  153. package/dist/daemon/session-execution.d.ts.map +1 -0
  154. package/dist/daemon/session-execution.js +2 -0
  155. package/dist/daemon/session-execution.js.map +1 -0
  156. package/dist/daemon/session-executions.d.ts +5 -0
  157. package/dist/daemon/session-executions.d.ts.map +1 -0
  158. package/dist/daemon/session-executions.js +146 -0
  159. package/dist/daemon/session-executions.js.map +1 -0
  160. package/dist/daemon/session-files.d.ts +28 -0
  161. package/dist/daemon/session-files.d.ts.map +1 -0
  162. package/dist/daemon/session-files.js +189 -0
  163. package/dist/daemon/session-files.js.map +1 -0
  164. package/dist/daemon/session-lifecycle-contracts.d.ts +104 -0
  165. package/dist/daemon/session-lifecycle-contracts.d.ts.map +1 -0
  166. package/dist/daemon/session-lifecycle-contracts.js +2 -0
  167. package/dist/daemon/session-lifecycle-contracts.js.map +1 -0
  168. package/dist/daemon/session-lifecycle.d.ts +26 -0
  169. package/dist/daemon/session-lifecycle.d.ts.map +1 -0
  170. package/dist/daemon/session-lifecycle.js +246 -0
  171. package/dist/daemon/session-lifecycle.js.map +1 -0
  172. package/dist/daemon/session-runtime.d.ts +64 -0
  173. package/dist/daemon/session-runtime.d.ts.map +1 -0
  174. package/dist/daemon/session-runtime.js +3 -0
  175. package/dist/daemon/session-runtime.js.map +1 -0
  176. package/dist/daemon/session-services.d.ts +6 -0
  177. package/dist/daemon/session-services.d.ts.map +1 -0
  178. package/dist/daemon/session-services.js +144 -0
  179. package/dist/daemon/session-services.js.map +1 -0
  180. package/dist/daemon/shutdown-error.d.ts +12 -0
  181. package/dist/daemon/shutdown-error.d.ts.map +1 -0
  182. package/dist/daemon/shutdown-error.js +51 -0
  183. package/dist/daemon/shutdown-error.js.map +1 -0
  184. package/dist/daemon/supervisor.d.ts +28 -0
  185. package/dist/daemon/supervisor.d.ts.map +1 -0
  186. package/dist/daemon/supervisor.js +159 -0
  187. package/dist/daemon/supervisor.js.map +1 -0
  188. package/dist/daemon/target.d.ts +55 -0
  189. package/dist/daemon/target.d.ts.map +1 -0
  190. package/dist/daemon/target.js +191 -0
  191. package/dist/daemon/target.js.map +1 -0
  192. package/dist/daemon/tree.d.ts +7 -0
  193. package/dist/daemon/tree.d.ts.map +1 -0
  194. package/dist/daemon/tree.js +126 -0
  195. package/dist/daemon/tree.js.map +1 -0
  196. package/dist/daemon/ui-vocabulary.d.ts +29 -0
  197. package/dist/daemon/ui-vocabulary.d.ts.map +1 -0
  198. package/dist/daemon/ui-vocabulary.js +323 -0
  199. package/dist/daemon/ui-vocabulary.js.map +1 -0
  200. package/dist/daemon/worker.d.ts +5 -0
  201. package/dist/daemon/worker.d.ts.map +1 -0
  202. package/dist/daemon/worker.js +49 -0
  203. package/dist/daemon/worker.js.map +1 -0
  204. package/dist/index.d.ts +4 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +12 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/lock.d.ts +27 -0
  209. package/dist/lock.d.ts.map +1 -0
  210. package/dist/lock.js +432 -0
  211. package/dist/lock.js.map +1 -0
  212. package/dist/logger.d.ts +9 -0
  213. package/dist/logger.d.ts.map +1 -0
  214. package/dist/logger.js +56 -0
  215. package/dist/logger.js.map +1 -0
  216. package/dist/remote/backoff.d.ts +17 -0
  217. package/dist/remote/backoff.d.ts.map +1 -0
  218. package/dist/remote/backoff.js +18 -0
  219. package/dist/remote/backoff.js.map +1 -0
  220. package/dist/remote/batch.d.ts +3 -0
  221. package/dist/remote/batch.d.ts.map +1 -0
  222. package/dist/remote/batch.js +27 -0
  223. package/dist/remote/batch.js.map +1 -0
  224. package/dist/remote/command-journal.d.ts +30 -0
  225. package/dist/remote/command-journal.d.ts.map +1 -0
  226. package/dist/remote/command-journal.js +72 -0
  227. package/dist/remote/command-journal.js.map +1 -0
  228. package/dist/remote/commands.d.ts +48 -0
  229. package/dist/remote/commands.d.ts.map +1 -0
  230. package/dist/remote/commands.js +145 -0
  231. package/dist/remote/commands.js.map +1 -0
  232. package/dist/remote/connector.d.ts +135 -0
  233. package/dist/remote/connector.d.ts.map +1 -0
  234. package/dist/remote/connector.js +1069 -0
  235. package/dist/remote/connector.js.map +1 -0
  236. package/dist/remote/content.d.ts +17 -0
  237. package/dist/remote/content.d.ts.map +1 -0
  238. package/dist/remote/content.js +116 -0
  239. package/dist/remote/content.js.map +1 -0
  240. package/dist/remote/outbox.d.ts +52 -0
  241. package/dist/remote/outbox.d.ts.map +1 -0
  242. package/dist/remote/outbox.js +321 -0
  243. package/dist/remote/outbox.js.map +1 -0
  244. package/dist/remote/platform.d.ts +53 -0
  245. package/dist/remote/platform.d.ts.map +1 -0
  246. package/dist/remote/platform.js +231 -0
  247. package/dist/remote/platform.js.map +1 -0
  248. package/dist/remote/realtime.d.ts +45 -0
  249. package/dist/remote/realtime.d.ts.map +1 -0
  250. package/dist/remote/realtime.js +265 -0
  251. package/dist/remote/realtime.js.map +1 -0
  252. package/dist/remote/sharing.d.ts +16 -0
  253. package/dist/remote/sharing.d.ts.map +1 -0
  254. package/dist/remote/sharing.js +24 -0
  255. package/dist/remote/sharing.js.map +1 -0
  256. package/dist/remote/state.d.ts +52 -0
  257. package/dist/remote/state.d.ts.map +1 -0
  258. package/dist/remote/state.js +156 -0
  259. package/dist/remote/state.js.map +1 -0
  260. package/dist/remote/text.d.ts +11 -0
  261. package/dist/remote/text.d.ts.map +1 -0
  262. package/dist/remote/text.js +188 -0
  263. package/dist/remote/text.js.map +1 -0
  264. package/dist/remote/token.d.ts +39 -0
  265. package/dist/remote/token.d.ts.map +1 -0
  266. package/dist/remote/token.js +238 -0
  267. package/dist/remote/token.js.map +1 -0
  268. package/dist/runtime-factory.d.ts +12 -0
  269. package/dist/runtime-factory.d.ts.map +1 -0
  270. package/dist/runtime-factory.js +12 -0
  271. package/dist/runtime-factory.js.map +1 -0
  272. package/dist/session-history.d.ts +29 -0
  273. package/dist/session-history.d.ts.map +1 -0
  274. package/dist/session-history.js +374 -0
  275. package/dist/session-history.js.map +1 -0
  276. package/dist/setup/dependencies.d.ts +15 -0
  277. package/dist/setup/dependencies.d.ts.map +1 -0
  278. package/dist/setup/dependencies.js +2 -0
  279. package/dist/setup/dependencies.js.map +1 -0
  280. package/dist/setup/open.d.ts +8 -0
  281. package/dist/setup/open.d.ts.map +1 -0
  282. package/dist/setup/open.js +16 -0
  283. package/dist/setup/open.js.map +1 -0
  284. package/dist/version.d.ts +2 -0
  285. package/dist/version.d.ts.map +1 -0
  286. package/dist/version.js +4 -0
  287. package/dist/version.js.map +1 -0
  288. package/package.json +66 -4
@@ -0,0 +1,72 @@
1
+ import { RemoteIntegrityError } from './state.js';
2
+ import { parseClientEnvelope, parseRemoteCommandOutcome, requestTimestamp } from '@felan-ai/session-protocol';
3
+ import { commandError } from '../daemon/commands.js';
4
+ export class RemoteCommandJournal {
5
+ database;
6
+ capacity;
7
+ count;
8
+ constructor(database, capacity = 4096) {
9
+ this.database = database;
10
+ this.capacity = capacity;
11
+ if (!Number.isSafeInteger(capacity) || capacity < 1)
12
+ throw commandError('invalid_request');
13
+ database.assertCurrent();
14
+ }
15
+ get(id) {
16
+ id = id.toLowerCase();
17
+ requestTimestamp(id);
18
+ const data = this.database.record('command', id);
19
+ if (data === undefined)
20
+ return undefined;
21
+ try {
22
+ return this.validate(JSON.parse(data), id);
23
+ }
24
+ catch {
25
+ throw new RemoteIntegrityError('Remote command journal is unreadable; refusing to replay.');
26
+ }
27
+ }
28
+ write(entry) {
29
+ requestTimestamp(entry.id);
30
+ this.validate(entry, entry.id);
31
+ const fresh = !this.get(entry.id);
32
+ if (fresh && (this.count ??= this.database.records('command').length) >= this.capacity) {
33
+ throw commandError('request_capacity', 'Remote command journal is full; acknowledge completed commands first.');
34
+ }
35
+ this.database.transaction(() => this.database.putRecord('command', entry.id.toLowerCase(), JSON.stringify(entry)));
36
+ if (fresh)
37
+ this.count = this.count + 1;
38
+ }
39
+ forget(id) {
40
+ const entry = this.get(id);
41
+ if (!entry)
42
+ return;
43
+ if (entry.state !== 'completed')
44
+ throw commandError('invalid_request', 'An unfinished remote command cannot be forgotten.');
45
+ this.database.transaction(() => this.database.deleteRecord('command', id.toLowerCase()));
46
+ if (this.count !== undefined)
47
+ this.count--;
48
+ }
49
+ validate(value, id) {
50
+ if (!value || typeof value !== 'object' || !('id' in value) || value.id !== id || !('identity' in value)
51
+ || typeof value.identity !== 'string' || !/^[a-f0-9]{64}$/u.test(value.identity) || !('state' in value))
52
+ throw commandError('storage_failure');
53
+ if (value.state === 'completed' && 'outcome' in value) {
54
+ const outcome = parseRemoteCommandOutcome(value.outcome);
55
+ if (outcome.re !== id)
56
+ throw commandError('storage_failure');
57
+ // The generic protocol response union normalizes valid result fields away through its empty-result branch.
58
+ const preserved = outcome.outcome === 'accepted'
59
+ ? { ...outcome, result: structuredClone(value.outcome.result) } : outcome;
60
+ return { id, identity: value.identity, state: 'completed', outcome: preserved };
61
+ }
62
+ if (value.state === 'dispatching' && 'request' in value) {
63
+ const request = parseClientEnvelope(value.request);
64
+ const createdSession = 'createdSession' in value ? value.createdSession : undefined;
65
+ if (createdSession !== undefined && typeof createdSession !== 'string')
66
+ throw commandError('storage_failure');
67
+ return { id, identity: value.identity, state: 'dispatching', request, ...(createdSession ? { createdSession } : {}) };
68
+ }
69
+ throw commandError('storage_failure');
70
+ }
71
+ }
72
+ //# sourceMappingURL=command-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-journal.js","sourceRoot":"","sources":["../../src/remote/command-journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type ClientEnvelope, type HostCapabilities, type HostProject, type RemoteCommand, type RemoteCommandOutcome, type Response } from '@felan-ai/session-protocol';
2
+ import type { CommandJournal } from './command-journal.js';
3
+ import { type RemoteClock } from './backoff.js';
4
+ export type ClaimedRemoteCommand = {
5
+ id: string;
6
+ requester: string;
7
+ command: RemoteCommand;
8
+ expiresAt: number;
9
+ claimedAt?: number;
10
+ } | {
11
+ id: string;
12
+ invalid: string;
13
+ };
14
+ export interface CommandClaimBatch {
15
+ startedAt: number;
16
+ receivedAt: number;
17
+ }
18
+ export interface RemoteCommandDependencies {
19
+ submit(request: ClientEnvelope, remote: {
20
+ user: string;
21
+ command: string;
22
+ requireRetained?: boolean;
23
+ interactionKinds: HostCapabilities['interactionKinds'];
24
+ }): Promise<Response>;
25
+ lookup(id: string): boolean;
26
+ owner(): string | undefined;
27
+ clock?: Pick<RemoteClock, 'now'>;
28
+ /** Projects explicitly opened and trusted by the local user, not arbitrary cwd values. */
29
+ projects(): HostProject[];
30
+ isShared(session: string): boolean;
31
+ markWebCreated(session: string): void;
32
+ capabilities: HostCapabilities;
33
+ journal: CommandJournal;
34
+ unrecordedIsIndeterminate?(): boolean;
35
+ }
36
+ export declare class RemoteCommandExecutor {
37
+ private readonly options;
38
+ private readonly pending;
39
+ constructor(options: RemoteCommandDependencies);
40
+ execute(row: ClaimedRemoteCommand, batch?: CommandClaimBatch): Promise<RemoteCommandOutcome>;
41
+ forget(id: string): void;
42
+ private run;
43
+ private submit;
44
+ private map;
45
+ private complete;
46
+ }
47
+ export declare function remotePromptRequestId(command: string): string;
48
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/remote/commands.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEjK,OAAO,KAAK,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AACtK,MAAM,WAAW,iBAAiB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC5E,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC;QACjG,gBAAgB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,KAAK,IAAI,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjC,0FAA0F;IAC1F,QAAQ,IAAI,WAAW,EAAE,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,yBAAyB,CAAC,IAAI,OAAO,CAAC;CACvC;AAED,qBAAa,qBAAqB;IAEpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;gBAC/C,OAAO,EAAE,yBAAyB;IAE/D,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAY5F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;YAEV,GAAG;YAiEH,MAAM;IAKpB,OAAO,CAAC,GAAG;IAQX,OAAO,CAAC,QAAQ;CASjB;AAQD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI7D"}
@@ -0,0 +1,145 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { ERROR_CODES, parseClientEnvelope, parseRemoteCommand, parseRemoteCommandOutcome, requestTimestamp } from '@felan-ai/session-protocol';
3
+ import { commandError } from '../daemon/commands.js';
4
+ import { systemClock } from './backoff.js';
5
+ export class RemoteCommandExecutor {
6
+ options;
7
+ pending = new Map();
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ execute(row, batch) {
12
+ const now = batch?.receivedAt ?? (this.options.clock ?? systemClock).now();
13
+ const claim = batch ?? { startedAt: now, receivedAt: now };
14
+ // Serialize duplicate claims without letting a conflicting payload inherit the first caller's outcome.
15
+ const key = row.id.toLowerCase();
16
+ const previous = this.pending.get(key);
17
+ const work = (previous ? previous.catch(() => { }) : Promise.resolve()).then(() => this.run(row, claim));
18
+ this.pending.set(key, work);
19
+ void work.finally(() => { if (this.pending.get(key) === work)
20
+ this.pending.delete(key); }).catch(() => { });
21
+ return work;
22
+ }
23
+ forget(id) { this.options.journal.forget(id); }
24
+ async run(row, batch) {
25
+ requestTimestamp(row.id);
26
+ const id = row.id.toLowerCase();
27
+ let identity = createHash('sha256').update(JSON.stringify(row)).digest('hex');
28
+ let entry = this.options.journal.get(id);
29
+ if (!entry && this.options.unrecordedIsIndeterminate?.()) {
30
+ if (!('invalid' in row))
31
+ identity = createHash('sha256').update(canonical({ requester: row.requester.toLowerCase(), command: row.command })).digest('hex');
32
+ return this.complete(id, identity, failure(id, 'indeterminate', 'Remote command journal was lost. Inspect the session before retrying.'));
33
+ }
34
+ try {
35
+ let command;
36
+ let requester;
37
+ if ('invalid' in row) {
38
+ if (entry)
39
+ return entry.identity === identity && entry.state === 'completed' ? entry.outcome : failure(id, 'request_conflict', 'Remote command identity changed.');
40
+ throw commandError('invalid_request', 'Invalid remote command row.');
41
+ }
42
+ if (!/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu.test(row.requester))
43
+ throw commandError('invalid_request');
44
+ requester = row.requester.toLowerCase();
45
+ command = parseRemoteCommand(row.command);
46
+ identity = createHash('sha256').update(canonical({ requester, command })).digest('hex');
47
+ if (entry && entry.identity !== identity)
48
+ return failure(id, 'request_conflict', 'Remote command identity changed.');
49
+ if (requester !== this.options.owner()?.toLowerCase()) {
50
+ const outcome = failure(id, 'forbidden', 'Remote commands require the host owner.');
51
+ return entry ? outcome : this.complete(id, identity, outcome);
52
+ }
53
+ if (entry?.state === 'completed')
54
+ return entry.outcome;
55
+ // A fresh server claim already won the expiry race; batch processing time must not undo it.
56
+ const previouslyClaimed = row.claimedAt === undefined || row.claimedAt < batch.startedAt - 5_000;
57
+ if (!entry && previouslyClaimed && row.expiresAt <= batch.receivedAt - 5_000) {
58
+ return this.complete(id, identity, failure(id, 'expired', 'Remote command expired before admission.'));
59
+ }
60
+ const replay = entry !== undefined;
61
+ if (!this.options.capabilities.operations.includes(command.op))
62
+ throw commandError('forbidden', 'Remote operation is not advertised by this host.');
63
+ if (command.op === 'sessions.create' && command.params.prompt && !this.options.capabilities.operations.includes('prompt'))
64
+ throw commandError('forbidden');
65
+ if (command.op !== 'sessions.create' && !this.options.isShared(command.session))
66
+ throw commandError('forbidden', 'Session is not shared.');
67
+ if (!entry) {
68
+ const request = this.map(id, command);
69
+ const dispatching = { id, identity, state: 'dispatching', request };
70
+ this.options.journal.write(dispatching);
71
+ entry = dispatching;
72
+ }
73
+ let response = await this.submit(entry, requester, replay);
74
+ if (response.outcome === 'accepted' && command.op === 'sessions.create') {
75
+ const session = entry.createdSession ?? ('sessionId' in response.result ? response.result.sessionId : undefined);
76
+ if (typeof session !== 'string')
77
+ throw commandError('indeterminate');
78
+ this.options.markWebCreated(session);
79
+ if (command.params.prompt && !entry.createdSession) {
80
+ const prompt = parseClientEnvelope({ v: 1, id: remotePromptRequestId(id), op: 'prompt', session, params: command.params.prompt });
81
+ const dispatching = { id, identity, state: 'dispatching', request: prompt, createdSession: session };
82
+ this.options.journal.write(dispatching);
83
+ entry = dispatching;
84
+ response = await this.options.submit(prompt, { user: requester, command: id, interactionKinds: this.options.capabilities.interactionKinds });
85
+ }
86
+ if (response.outcome === 'accepted')
87
+ return this.complete(id, identity, { v: 1, re: id, outcome: 'accepted', result: { sessionId: session } });
88
+ }
89
+ return this.complete(id, identity, { ...response, re: id });
90
+ }
91
+ catch (error) {
92
+ const candidate = error && typeof error === 'object' && 'code' in error ? error.code : undefined;
93
+ const code = typeof candidate === 'string' && ERROR_CODES.includes(candidate) ? candidate : 'unavailable';
94
+ if (entry && entry.identity !== identity)
95
+ return failure(id, 'request_conflict', 'Remote command identity changed.');
96
+ if (entry?.state === 'completed')
97
+ return entry.outcome;
98
+ if (entry?.state === 'dispatching')
99
+ return this.complete(id, identity, failure(id, 'indeterminate', 'Remote command outcome is unknown. Inspect the session before retrying.'));
100
+ return this.complete(id, identity, failure(id, code, 'Remote command was rejected.'));
101
+ }
102
+ }
103
+ async submit(entry, user, replay) {
104
+ if (replay && !this.options.lookup(entry.request.id))
105
+ return failure(entry.id, 'indeterminate', 'The admitted request is no longer retained.');
106
+ return this.options.submit(entry.request, { user, command: entry.id, ...(replay ? { requireRetained: true } : {}), interactionKinds: this.options.capabilities.interactionKinds });
107
+ }
108
+ map(id, command) {
109
+ if (command.op !== 'sessions.create')
110
+ return parseClientEnvelope({ v: 1, id, ...command });
111
+ const project = this.options.projects().find(project => project.id === command.params.project);
112
+ if (!project)
113
+ throw commandError('not_found', 'Project is not open for remote sessions.');
114
+ return parseClientEnvelope({ v: 1, id, op: 'sessions.create', params: { cwd: project.path,
115
+ ...(command.params.model ? { model: command.params.model } : {}), ...(command.params.thinking ? { thinking: command.params.thinking } : {}) } });
116
+ }
117
+ complete(id, identity, outcome) {
118
+ parseRemoteCommandOutcome(outcome);
119
+ try {
120
+ this.options.journal.write({ id, identity, state: 'completed', outcome });
121
+ }
122
+ catch (error) {
123
+ if (outcome.outcome !== 'rejected' || !error || typeof error !== 'object' || !('code' in error) || error.code !== 'request_capacity')
124
+ throw error;
125
+ return failure(id, 'request_capacity', 'Remote command was rejected.');
126
+ }
127
+ return outcome;
128
+ }
129
+ }
130
+ function canonical(value) {
131
+ if (Array.isArray(value))
132
+ return `[${value.map(canonical).join(',')}]`;
133
+ if (value && typeof value === 'object')
134
+ return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(',')}}`;
135
+ return JSON.stringify(value);
136
+ }
137
+ export function remotePromptRequestId(command) {
138
+ requestTimestamp(command);
139
+ const digest = createHash('sha256').update(`remote-initial-prompt:${command.toLowerCase()}`).digest('hex');
140
+ return `${command.slice(0, 14).toLowerCase()}7${digest.slice(0, 3)}-8${digest.slice(3, 6)}-${digest.slice(6, 18)}`;
141
+ }
142
+ function failure(id, code, message) {
143
+ return parseRemoteCommandOutcome({ v: 1, re: id, outcome: code === 'indeterminate' ? 'indeterminate' : 'rejected', error: { code, message, retryable: false } });
144
+ }
145
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/remote/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EACoB,MAAM,4BAA4B,CAAC;AACjK,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAoB,MAAM,cAAc,CAAC;AAmB7D,MAAM,OAAO,qBAAqB;IAEH;IADZ,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IAC5E,YAA6B,OAAkC;QAAlC,YAAO,GAAP,OAAO,CAA2B;IAAG,CAAC;IAEnE,OAAO,CAAC,GAAyB,EAAE,KAAyB;QAC1D,MAAM,GAAG,GAAG,KAAK,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC3D,uGAAuG;QACvG,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAU,IAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErD,KAAK,CAAC,GAAG,CAAC,GAAyB,EAAE,KAAwB;QACnE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;gBAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3J,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,uEAAuE,CAAC,CAAC,CAAC;QAC5I,CAAC;QACD,IAAI,CAAC;YACH,IAAI,OAAsB,CAAC;YAC3B,IAAI,SAAiB,CAAC;YACtB,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;gBACnK,MAAM,YAAY,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,6DAA6D,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,MAAM,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAC9H,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YAAC,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnF,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxF,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;YACrH,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,yCAAyC,CAAC,CAAC;gBACpF,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,EAAE,KAAK,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC,OAAO,CAAC;YACvD,4FAA4F;YAC5F,MAAM,iBAAiB,GAAG,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACjG,IAAI,CAAC,KAAK,IAAI,iBAAiB,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC;gBAC7E,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,0CAA0C,CAAC,CAAC,CAAC;YACzG,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAE,MAAM,YAAY,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC;YACpJ,IAAI,OAAO,CAAC,EAAE,KAAK,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAC3J,IAAI,OAAO,CAAC,EAAE,KAAK,iBAAiB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,MAAM,YAAY,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;YAC3I,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM,WAAW,GAA8B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;gBAC/F,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACxC,KAAK,GAAG,WAAW,CAAC;YACtB,CAAC;YACD,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBACxE,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACjH,IAAI,OAAO,OAAO,KAAK,QAAQ;oBAAE,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;gBACrE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,qBAAqB,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;oBAClI,MAAM,WAAW,GAA8B,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;oBAChI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBACxC,KAAK,GAAG,WAAW,CAAC;oBACpB,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBAC/I,CAAC;gBACD,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU;oBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAA0B,CAAC,CAAC;YACzK,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACjG,MAAM,IAAI,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;YACjI,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;YACrH,IAAI,KAAK,EAAE,KAAK,KAAK,WAAW;gBAAE,OAAO,KAAK,CAAC,OAAO,CAAC;YACvD,IAAI,KAAK,EAAE,KAAK,KAAK,aAAa;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,yEAAyE,CAAC,CAAC,CAAC;YAChL,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,KAAmE,EAAE,IAAY,EAAE,MAAe;QACrH,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,EAAE,6CAA6C,CAAC,CAAC;QAC/I,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrL,CAAC;IAEO,GAAG,CAAC,EAAU,EAAE,OAAsB;QAC5C,IAAI,OAAO,CAAC,EAAE,KAAK,iBAAiB;YAAE,OAAO,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO;YAAE,MAAM,YAAY,CAAC,WAAW,EAAE,0CAA0C,CAAC,CAAC;QAC1F,OAAO,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI;gBACvF,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACrJ,CAAC;IAEO,QAAQ,CAAC,EAAU,EAAE,QAAgB,EAAE,OAA6B;QAC1E,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QAClF,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;gBAAE,MAAM,KAAK,CAAC;YAClJ,OAAO,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,8BAA8B,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvM,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3G,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACrH,CAAC;AAED,SAAS,OAAO,CAAC,EAAU,EAAE,IAAY,EAAE,OAAe;IACxD,OAAO,yBAAyB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAa,CAAC;AAC/K,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { type HostCapabilities, type OperationParams, type RemoteStatus } from '@felan-ai/session-protocol';
2
+ import type { ProviderSecretStorage } from '../daemon/provider.js';
3
+ import type { RemoteDatabase } from '../daemon/persistence.js';
4
+ import type { SessionRegistry } from '../daemon/registry.js';
5
+ import type { SessionServer } from '../daemon/server.js';
6
+ import { type RemoteClock } from './backoff.js';
7
+ import { RemoteOutbox } from './outbox.js';
8
+ import { PlatformClient } from './platform.js';
9
+ import { RemoteStore } from './state.js';
10
+ import { HostTokenSource, type HostTokenProvider, type HostTokenSourceOptions } from './token.js';
11
+ export declare const REMOTE_CAPABILITIES: HostCapabilities;
12
+ export type ConnectorTokenSource = HostTokenProvider & Pick<HostTokenSource, 'stop' | 'invalidate'>;
13
+ export type ConnectorPlatform = Pick<PlatformClient, 'register' | 'heartbeat' | 'publish' | 'claim' | 'complete' | 'close'> & {
14
+ realtime: Pick<PlatformClient['realtime'], 'subscribeCommands' | 'sendText'>;
15
+ };
16
+ export interface RemoteConnectorOptions {
17
+ database: RemoteDatabase;
18
+ registry: SessionRegistry;
19
+ server: Pick<SessionServer, 'submitRemote' | 'hasRemoteRequest'>;
20
+ secretStorage: ProviderSecretStorage;
21
+ owner: {
22
+ assertCurrent(): void;
23
+ };
24
+ apiUrl?: string;
25
+ name?: string;
26
+ daemonVersion?: string;
27
+ capabilities?: HostCapabilities;
28
+ clock?: RemoteClock;
29
+ heartbeatMs?: number;
30
+ requestTimeoutMs?: number;
31
+ shutdownTimeoutMs?: number;
32
+ tokenSource?(options: HostTokenSourceOptions): ConnectorTokenSource;
33
+ connect?(source: ConnectorTokenSource): Promise<ConnectorPlatform>;
34
+ }
35
+ export declare class RemoteConnector {
36
+ private readonly options;
37
+ readonly store: RemoteStore;
38
+ readonly outbox: RemoteOutbox;
39
+ private readonly executor;
40
+ private readonly clock;
41
+ private readonly capabilities;
42
+ private lastStatus;
43
+ private state;
44
+ private reason;
45
+ private message;
46
+ private supported;
47
+ private configured;
48
+ private host;
49
+ private token;
50
+ private platform;
51
+ private generation;
52
+ private started;
53
+ private stopped;
54
+ private draining;
55
+ private attempt;
56
+ private retryTimer;
57
+ private heartbeatTimer;
58
+ private publishTimer;
59
+ private unobserve;
60
+ private unsubscribeCommands;
61
+ private publishWork;
62
+ private claimWork;
63
+ private claimAgain;
64
+ private publishAgain;
65
+ private configureWork;
66
+ private registrationWork;
67
+ private readonly work;
68
+ private readonly text;
69
+ private readonly indexed;
70
+ private readonly backfilling;
71
+ private readonly backfillScheduled;
72
+ private readonly backfillRetryAt;
73
+ private readonly backfillIssues;
74
+ private readonly buffered;
75
+ private readonly reauthorizedPublications;
76
+ private readonly publicationGaps;
77
+ private outboxErrorsWired;
78
+ private readonly blocked;
79
+ private readonly recordingIssues;
80
+ private readonly recordingBlocked;
81
+ private readonly rootIds;
82
+ constructor(options: RemoteConnectorOptions);
83
+ start(): void;
84
+ beginDrain(): void;
85
+ endDrain(): void;
86
+ stop(): Promise<void>;
87
+ status(): RemoteStatus;
88
+ private readStatus;
89
+ private collectStatus;
90
+ setupNeeds(): {
91
+ code: string;
92
+ message: string;
93
+ }[];
94
+ configure(value: OperationParams<'remote.configure'>): Promise<RemoteStatus>;
95
+ setShared(session: string, shared: boolean): void;
96
+ isShared(session: string): boolean;
97
+ private rootId;
98
+ private currentRootId;
99
+ private sharing;
100
+ private record;
101
+ private markUnshared;
102
+ private apiUrl;
103
+ private apiOrigin;
104
+ private validateApiUrl;
105
+ private registration;
106
+ private register;
107
+ private login;
108
+ private connect;
109
+ private fenceRepairedSessions;
110
+ private heartbeat;
111
+ private observe;
112
+ private safelyBackfill;
113
+ private blockRecording;
114
+ private recordingFailure;
115
+ private publicationChange;
116
+ private backfill;
117
+ private performBackfill;
118
+ private finishBackfill;
119
+ private removeLocalSession;
120
+ private wakePublish;
121
+ private publish;
122
+ private publishSession;
123
+ private publishSessionNow;
124
+ private terminate;
125
+ private wakeClaims;
126
+ private failed;
127
+ private notifyStopped;
128
+ private clearStoppedPresentations;
129
+ private disconnect;
130
+ private clearTimers;
131
+ private current;
132
+ private track;
133
+ private bounded;
134
+ }
135
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/remote/connector.ts"],"names":[],"mappings":"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"}