@felan-ai/daemon 0.0.0-stage → 0.1.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 +65 -3
@@ -0,0 +1,83 @@
1
+ import { resolveDaemonTarget } from './target.js';
2
+ import { startDaemonService } from './service.js';
3
+ import { publishDaemonReadiness } from './supervisor.js';
4
+ import { DAEMON_VERSION } from '../version.js';
5
+ import { DaemonIdentitySchema, parseSchema } from '@felan-ai/session-protocol';
6
+ export async function runDaemonProcess(args, manager) {
7
+ if (args.length < 1 || args[0].length > 65_536)
8
+ throw new Error('Invalid daemon launch arguments.');
9
+ const target = parseTarget(args[0]);
10
+ let foreground = false;
11
+ let hostConfigPath;
12
+ let replacing;
13
+ for (let index = 1; index < args.length; index++) {
14
+ const option = args[index];
15
+ if (option === '--foreground' && !foreground) {
16
+ foreground = true;
17
+ continue;
18
+ }
19
+ if ((option === '--host-config' || option === '--replace') && index + 1 < args.length) {
20
+ const value = args[++index];
21
+ if (!value || value.length > 65_536)
22
+ throw new Error('Invalid daemon launch arguments.');
23
+ if (option === '--host-config' && hostConfigPath === undefined)
24
+ hostConfigPath = value;
25
+ else if (option === '--replace' && replacing === undefined)
26
+ replacing = parseSchema(DaemonIdentitySchema, JSON.parse(value));
27
+ else
28
+ throw new Error('Invalid daemon launch arguments.');
29
+ continue;
30
+ }
31
+ throw new Error('Invalid daemon launch arguments.');
32
+ }
33
+ const activeManager = manager ?? { packageName: '@felan-ai/daemon', version: DAEMON_VERSION,
34
+ resolveFrom: new URL('../index.js', import.meta.url).href };
35
+ const service = await startDaemonService(target, { ...(replacing ? { replacing } : {}), ...(hostConfigPath ? { hostConfigPath } : {}), manager: activeManager });
36
+ let failed = false;
37
+ const stop = () => {
38
+ void service.requestStop().then(response => {
39
+ if (response.outcome !== 'accepted')
40
+ throw new Error('Shutdown was not accepted.');
41
+ }).catch(() => { failed = true; process.stderr.write('Daemon shutdown is blocked. Inspect status and use explicit force only when appropriate.\n'); });
42
+ };
43
+ const fail = () => { failed = true; stop(); };
44
+ process.on('SIGINT', stop);
45
+ process.on('SIGTERM', stop);
46
+ process.on('uncaughtException', fail);
47
+ process.on('unhandledRejection', fail);
48
+ try {
49
+ if (foreground)
50
+ process.stdout.write(`Felan daemon ${DAEMON_VERSION}: ${service.lifecycle.state}\n`);
51
+ else {
52
+ try {
53
+ await publishDaemonReadiness(service.owner, DAEMON_VERSION, 10_000);
54
+ }
55
+ catch {
56
+ failed = true;
57
+ stop();
58
+ }
59
+ }
60
+ await service.stopped;
61
+ }
62
+ finally {
63
+ process.off('SIGINT', stop);
64
+ process.off('SIGTERM', stop);
65
+ process.off('uncaughtException', fail);
66
+ process.off('unhandledRejection', fail);
67
+ if (failed)
68
+ process.exitCode = 1;
69
+ }
70
+ }
71
+ function parseTarget(text) {
72
+ const value = JSON.parse(text);
73
+ if (!value || typeof value !== 'object' || Array.isArray(value))
74
+ throw new Error('Invalid daemon target.');
75
+ const kind = Reflect.get(value, 'kind');
76
+ const keys = kind === 'production' ? ['kind', 'agentDir', 'storeRoots'] : kind === 'isolated' ? ['kind', 'directory', 'namespaceId', 'storeRoots'] : [];
77
+ if (!keys.length || Object.keys(value).some(key => !keys.includes(key)))
78
+ throw new Error('Invalid daemon target fields.');
79
+ const target = value;
80
+ resolveDaemonTarget(target);
81
+ return target;
82
+ }
83
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/daemon/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AgentSession } from '@felan-ai/agent-core';
2
+ import { type MessageDisplay } from '@felan-ai/session-protocol';
3
+ export declare function messageDisplay(message: AgentSession['messages'][number]): MessageDisplay | undefined;
4
+ //# sourceMappingURL=message-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-display.d.ts","sourceRoot":"","sources":["../../src/daemon/message-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAgD,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE/G,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,cAAc,GAAG,SAAS,CAapG"}
@@ -0,0 +1,20 @@
1
+ import { ProtocolValidationError, parseMessageDisplay } from '@felan-ai/session-protocol';
2
+ export function messageDisplay(message) {
3
+ try {
4
+ if (message.role === 'toolResult')
5
+ return parseMessageDisplay({ kind: 'tool', name: message.toolName, timestamp: message.timestamp });
6
+ if (message.role !== 'assistant')
7
+ return undefined;
8
+ const usage = message.usage;
9
+ return parseMessageDisplay({ kind: 'assistant', timestamp: message.timestamp, api: message.api, provider: message.provider, model: message.model,
10
+ stopReason: message.stopReason, ...(message.errorMessage === undefined ? {} : { errorMessage: message.errorMessage }),
11
+ usage: { input: usage?.input, output: usage?.output, cacheRead: usage?.cacheRead, cacheWrite: usage?.cacheWrite, totalTokens: usage?.totalTokens,
12
+ cost: { input: usage?.cost?.input, output: usage?.cost?.output, cacheRead: usage?.cost?.cacheRead, cacheWrite: usage?.cost?.cacheWrite, total: usage?.cost?.total } } });
13
+ }
14
+ catch (error) {
15
+ if (error instanceof ProtocolValidationError)
16
+ return undefined;
17
+ throw error;
18
+ }
19
+ }
20
+ //# sourceMappingURL=message-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-display.js","sourceRoot":"","sources":["../../src/daemon/message-display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAuB,MAAM,4BAA4B,CAAC;AAE/G,MAAM,UAAU,cAAc,CAAC,OAAyC;IACtE,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACtI,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK;YAC9I,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACrH,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW;gBAC9I,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/K,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB;YAAE,OAAO,SAAS,CAAC;QAC/D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Socket } from 'node:net';
2
+ export declare class DaemonSecurityError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ export declare function requireOwnershipPlatform(): 'darwin' | 'linux';
7
+ export declare function tryKernelLock(fd: number): boolean;
8
+ export declare function socketPathLimit(): number;
9
+ export declare function protectSocket(path: string): void;
10
+ export declare function listenUnix(path: string): number;
11
+ export declare function peerUid(fd: number): number;
12
+ export declare function connectUnix(path: string, uid: number, timeoutMs?: number): Promise<Socket>;
13
+ //# sourceMappingURL=native-ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-ownership.d.ts","sourceRoot":"","sources":["../../src/daemon/native-ownership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAInD;AAED,wBAAgB,wBAAwB,IAAI,QAAQ,GAAG,OAAO,CAQ7D;AAgCD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIjD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAAgE;AACzG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhD;AAwBD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAU1C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB/F"}
@@ -0,0 +1,173 @@
1
+ import { closeSync } from 'node:fs';
2
+ import { Socket } from 'node:net';
3
+ import koffi from 'koffi';
4
+ export class DaemonSecurityError extends Error {
5
+ code;
6
+ constructor(code, message) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'DaemonSecurityError';
10
+ }
11
+ }
12
+ export function requireOwnershipPlatform() {
13
+ if ((process.platform !== 'darwin' && process.platform !== 'linux') || !['arm64', 'x64'].includes(process.arch)) {
14
+ throw new DaemonSecurityError('platform_blocked', 'Daemon ownership is not available on this platform: Windows requires reviewed token, DACL and handle-lock support; other native ABIs require verification. No fallback is permitted.');
15
+ }
16
+ if (process.getuid() !== process.geteuid() || process.getgid() !== process.getegid()) {
17
+ throw new DaemonSecurityError('platform_blocked', 'Daemon ownership refuses set-ID execution.');
18
+ }
19
+ return process.platform;
20
+ }
21
+ let api;
22
+ function loadApi() {
23
+ const platform = requireOwnershipPlatform();
24
+ let libc;
25
+ try {
26
+ libc = koffi.load(platform === 'darwin' ? '/usr/lib/libSystem.B.dylib' : 'libc.so.6');
27
+ }
28
+ catch {
29
+ throw new DaemonSecurityError('platform_blocked', 'Native ownership backend unavailable; Linux requires glibc. No lease-lock or TCP fallback is permitted.');
30
+ }
31
+ return {
32
+ platform,
33
+ flock: libc.func('int flock(int fd, int operation)'),
34
+ socket: libc.func('int socket(int domain, int type, int protocol)'),
35
+ bind: libc.func('int bind(int fd, const void *address, uint32_t length)'),
36
+ listen: libc.func('int listen(int fd, int backlog)'),
37
+ connect: libc.func('int connect(int fd, const void *address, uint32_t length)'),
38
+ fcntl: libc.func('int fcntl(int fd, int command, ...)'),
39
+ getpeereid: platform === 'darwin' ? libc.func('int getpeereid(int fd, _Out_ uint32_t *uid, _Out_ uint32_t *gid)') : undefined,
40
+ getsockopt: libc.func('int getsockopt(int fd, int level, int option, void *value, void *length)'),
41
+ chmodNoFollow: platform === 'darwin' ? libc.func('int lchmod(const char *path, uint32_t mode)') : libc.func('int fchmodat(int dirfd, const char *path, uint32_t mode, int flags)'),
42
+ };
43
+ }
44
+ function native() { return api ??= loadApi(); }
45
+ function failure(operation) {
46
+ const errno = koffi.errno();
47
+ let code = 'native_failure';
48
+ if (operation === 'connect') {
49
+ if (errno === koffi.os.errno.ECONNREFUSED)
50
+ code = 'stale_endpoint';
51
+ else if (errno === koffi.os.errno.ENOENT)
52
+ code = 'unavailable';
53
+ }
54
+ throw new DaemonSecurityError(code, `${operation} failed (errno ${errno}).`);
55
+ }
56
+ export function tryKernelLock(fd) {
57
+ if (native().flock(fd, 2 | 4) === 0)
58
+ return true;
59
+ if (koffi.errno() === koffi.os.errno.EWOULDBLOCK || koffi.errno() === koffi.os.errno.EAGAIN)
60
+ return false;
61
+ return failure('flock');
62
+ }
63
+ export function socketPathLimit() { return requireOwnershipPlatform() === 'darwin' ? 103 : 107; }
64
+ export function protectSocket(path) {
65
+ const n = native();
66
+ const result = n.platform === 'darwin' ? n.chmodNoFollow(path, 0o600) : n.chmodNoFollow(-100, path, 0o600, 0x100);
67
+ if (result !== 0)
68
+ failure('no-follow socket chmod');
69
+ }
70
+ function address(path) {
71
+ if (path.includes('\0') || Buffer.byteLength(path) > socketPathLimit()) {
72
+ throw new DaemonSecurityError('invalid_endpoint', `Unix socket path exceeds the ${socketPathLimit()}-byte platform limit or contains NUL.`);
73
+ }
74
+ const bytes = Buffer.from(path);
75
+ const result = Buffer.alloc(bytes.length + 3);
76
+ if (native().platform === 'darwin') {
77
+ result[0] = result.length;
78
+ result[1] = 1;
79
+ }
80
+ else
81
+ result.writeUInt16LE(1);
82
+ bytes.copy(result, 2);
83
+ return result;
84
+ }
85
+ function configure(fd) {
86
+ const n = native();
87
+ if (n.fcntl(fd, 2, 'int', 1) !== 0)
88
+ failure('FD_CLOEXEC');
89
+ const flags = n.fcntl(fd, 3);
90
+ if (flags < 0 || n.fcntl(fd, 4, 'int', flags | (n.platform === 'darwin' ? 4 : 2048)) !== 0)
91
+ failure('O_NONBLOCK');
92
+ }
93
+ function openSocket() {
94
+ const fd = native().socket(1, 1, 0);
95
+ if (fd < 0)
96
+ failure('socket');
97
+ try {
98
+ configure(fd);
99
+ return fd;
100
+ }
101
+ catch (error) {
102
+ closeSync(fd);
103
+ throw error;
104
+ }
105
+ }
106
+ export function listenUnix(path) {
107
+ const addr = address(path);
108
+ const fd = openSocket();
109
+ try {
110
+ if (native().bind(fd, addr, addr.length) !== 0)
111
+ failure('bind');
112
+ if (native().listen(fd, 64) !== 0)
113
+ failure('listen');
114
+ return fd;
115
+ }
116
+ catch (error) {
117
+ closeSync(fd);
118
+ throw error;
119
+ }
120
+ }
121
+ export function peerUid(fd) {
122
+ const n = native();
123
+ if (n.getpeereid) {
124
+ const uid = [0];
125
+ const gid = [0];
126
+ if (n.getpeereid(fd, uid, gid) !== 0)
127
+ failure('getpeereid');
128
+ return uid[0];
129
+ }
130
+ const value = Buffer.alloc(12);
131
+ const length = Buffer.alloc(4);
132
+ length.writeUInt32LE(12);
133
+ if (n.getsockopt(fd, 1, 17, value, length) !== 0 || length.readUInt32LE() !== 12)
134
+ failure('SO_PEERCRED');
135
+ return value.readUInt32LE(4);
136
+ }
137
+ export async function connectUnix(path, uid, timeoutMs = 2_000) {
138
+ const addr = address(path);
139
+ const fd = openSocket();
140
+ try {
141
+ const n = native();
142
+ const result = n.connect(fd, addr, addr.length);
143
+ if (result !== 0 && koffi.errno() !== koffi.os.errno.EINPROGRESS)
144
+ failure('connect');
145
+ const deadline = performance.now() + timeoutMs;
146
+ for (;;) {
147
+ const value = Buffer.alloc(4);
148
+ const length = Buffer.alloc(4);
149
+ length.writeUInt32LE(4);
150
+ if (n.getsockopt(fd, n.platform === 'darwin' ? 0xffff : 1, n.platform === 'darwin' ? 0x1007 : 4, value, length) !== 0)
151
+ failure('SO_ERROR');
152
+ if (value.readInt32LE() !== 0)
153
+ throw new DaemonSecurityError('unavailable', 'Unix connection failed.');
154
+ try {
155
+ if (peerUid(fd) !== uid)
156
+ throw new DaemonSecurityError('forbidden', 'Unix server belongs to another OS account.');
157
+ return new Socket({ fd, readable: true, writable: true });
158
+ }
159
+ catch (error) {
160
+ if (!(error instanceof DaemonSecurityError) || error.code !== 'native_failure')
161
+ throw error;
162
+ if (performance.now() >= deadline)
163
+ throw new DaemonSecurityError('unavailable', 'Unix connection timed out.');
164
+ await new Promise(resolve => setTimeout(resolve, 10));
165
+ }
166
+ }
167
+ }
168
+ catch (error) {
169
+ closeSync(fd);
170
+ throw error;
171
+ }
172
+ }
173
+ //# sourceMappingURL=native-ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-ownership.js","sourceRoot":"","sources":["../../src/daemon/native-ownership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type HostBlocked, type OperationParams, type OperationResult } from '@felan-ai/session-protocol';
2
+ import { BoundedDaemonLogs } from './supervisor.js';
3
+ declare const messages: {
4
+ readonly started: "Daemon is ready.";
5
+ readonly stop_requested: "Explicit daemon stop requested.";
6
+ readonly restart_requested: "Explicit daemon restart requested.";
7
+ readonly drain_blocked: "Daemon shutdown is blocked; ownership remains held.";
8
+ readonly drain_cancelled: "Daemon drain did not finish because work is still active; the daemon keeps running. Use force to interrupt it.";
9
+ readonly releasing: "Owned work settled; releasing daemon ownership.";
10
+ readonly ownership_lost: "Daemon ownership was lost; admission is fenced.";
11
+ readonly startup_failed: "Daemon startup could not complete.";
12
+ readonly legacy_warmup_failed: "Pre-daemon session titles could not be read in the background; listings read them on request.";
13
+ };
14
+ export declare class DaemonOperationalLog {
15
+ private readonly sink;
16
+ private readonly now;
17
+ constructor(sink: BoundedDaemonLogs, now?: () => number);
18
+ record(event: keyof typeof messages): void;
19
+ blocked(blocked: HostBlocked): void;
20
+ page(input: OperationParams<'host.logs'>): OperationResult<'host.logs'>;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=operational-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operational-log.d.ts","sourceRoot":"","sources":["../../src/daemon/operational-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEhK,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,QAAA,MAAM,QAAQ;;;;;;;;;;CAUJ,CAAC;AAIX,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAqB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAA7C,IAAI,EAAE,iBAAiB,EAAmB,GAAG,GAAE,MAAM,MAAiB;IAEnG,MAAM,CAAC,KAAK,EAAE,MAAM,OAAO,QAAQ,GAAG,IAAI;IAM1C,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKnC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,GAAG,eAAe,CAAC,WAAW,CAAC;CA2BxE"}
@@ -0,0 +1,79 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { DiagnosticTextSchema, PageRequestSchema, parseSchema } from '@felan-ai/session-protocol';
3
+ import { commandError } from './commands.js';
4
+ import { BoundedDaemonLogs } from './supervisor.js';
5
+ import { shutdownText } from './shutdown-error.js';
6
+ const messages = {
7
+ started: 'Daemon is ready.',
8
+ stop_requested: 'Explicit daemon stop requested.',
9
+ restart_requested: 'Explicit daemon restart requested.',
10
+ drain_blocked: 'Daemon shutdown is blocked; ownership remains held.',
11
+ drain_cancelled: 'Daemon drain did not finish because work is still active; the daemon keeps running. Use force to interrupt it.',
12
+ releasing: 'Owned work settled; releasing daemon ownership.',
13
+ ownership_lost: 'Daemon ownership was lost; admission is fenced.',
14
+ startup_failed: 'Daemon startup could not complete.',
15
+ legacy_warmup_failed: 'Pre-daemon session titles could not be read in the background; listings read them on request.',
16
+ };
17
+ const blockedPrefix = 'Daemon shutdown failed at ';
18
+ export class DaemonOperationalLog {
19
+ sink;
20
+ now;
21
+ constructor(sink, now = Date.now) {
22
+ this.sink = sink;
23
+ this.now = now;
24
+ }
25
+ record(event) {
26
+ if (!Object.hasOwn(messages, event))
27
+ throw new Error('Unknown operational event.');
28
+ const entry = { timestamp: this.now(), level: ['drain_blocked', 'ownership_lost', 'startup_failed'].includes(event) ? 'error' : event === 'drain_cancelled' || event === 'legacy_warmup_failed' ? 'warning' : 'info', message: messages[event] };
29
+ this.sink.write('stdout', JSON.stringify(entry));
30
+ }
31
+ blocked(blocked) {
32
+ const message = shutdownText(`${blockedPrefix}${blocked.step ?? 'settlement'}${blocked.session ? ` (session ${blocked.session})` : ''}: ${blocked.message}`, 2000);
33
+ this.sink.write('stdout', JSON.stringify({ timestamp: this.now(), level: 'error', message }));
34
+ }
35
+ page(input) {
36
+ const params = parseSchema(PageRequestSchema, input);
37
+ const known = new Set(Object.values(messages));
38
+ const entries = [];
39
+ for (const line of this.sink.read('stdout').split('\n')) {
40
+ let value;
41
+ try {
42
+ value = JSON.parse(line);
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ if (value === null || typeof value !== 'object')
48
+ continue;
49
+ const row = value;
50
+ if (!Number.isSafeInteger(row.timestamp) || row.timestamp < 0 || !['info', 'warning', 'error'].includes(row.level ?? ''))
51
+ continue;
52
+ if (!known.has(row.message ?? '')) {
53
+ if (row.level !== 'error' || typeof row.message !== 'string' || !row.message.startsWith(blockedPrefix) || row.message.length > 2000)
54
+ continue;
55
+ try {
56
+ parseSchema(DiagnosticTextSchema, row.message);
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ if (shutdownText(row.message, 2000) !== row.message)
62
+ continue;
63
+ }
64
+ entries.push({ timestamp: row.timestamp, level: row.level, message: row.message });
65
+ }
66
+ const generation = createHash('sha256').update(JSON.stringify(entries)).digest('hex');
67
+ let offset = 0;
68
+ if (params.cursor) {
69
+ const match = /^([a-f0-9]{64}):(\d{1,6})$/.exec(params.cursor);
70
+ if (!match || match[1] !== generation || Number(match[2]) > entries.length)
71
+ throw commandError('resync_required');
72
+ offset = Number(match[2]);
73
+ }
74
+ const result = entries.slice(offset, offset + (params.limit ?? 64));
75
+ const next = offset + result.length;
76
+ return { entries: result, ...(next < entries.length ? { cursor: `${generation}:${next}` } : {}) };
77
+ }
78
+ }
79
+ //# sourceMappingURL=operational-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operational-log.js","sourceRoot":"","sources":["../../src/daemon/operational-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { DaemonIdentity } from '@felan-ai/session-protocol';
2
+ import { DaemonSecurityError } from './native-ownership.js';
3
+ import { type DaemonTarget, type PathIdentity, type ResolvedDaemonTarget } from './target.js';
4
+ export declare function namespaceLockName(target: ResolvedDaemonTarget): string;
5
+ export declare class DaemonOwnership {
6
+ readonly instanceId: string;
7
+ private readonly fds;
8
+ private readonly pins;
9
+ private readonly lockedRoots;
10
+ readonly identity: DaemonIdentity;
11
+ private lost;
12
+ private released;
13
+ private releasePromise;
14
+ private timer;
15
+ private listeners;
16
+ private extraPins;
17
+ private current;
18
+ private readonly owning;
19
+ private refreshedAt;
20
+ constructor(target: ResolvedDaemonTarget, instanceId: string, fds: number[], pins: readonly PathIdentity[], lockedRoots?: string[]);
21
+ get target(): ResolvedDaemonTarget;
22
+ assertCurrent(): void;
23
+ /** Wall-clock throttling refreshes on the first tick after sleep, when reapers may run immediately. */
24
+ private refreshTimestamps;
25
+ watchPath(path: string): () => void;
26
+ assertOwnsPath(path: string): string;
27
+ /** Adds a session directory to the owned stores, locking it against other daemons. */
28
+ ownRoot(directory: string): Promise<void>;
29
+ private lockRoot;
30
+ onLost(listener: (error: DaemonSecurityError) => void): () => void;
31
+ release(): Promise<void>;
32
+ private releaseOnce;
33
+ }
34
+ export declare function acquireDaemonOwnership(input: DaemonTarget): Promise<DaemonOwnership>;
35
+ //# sourceMappingURL=ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../src/daemon/ownership.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAiB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAoP,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAkGhV,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAEtE;AA+BD,qBAAa,eAAe;IAYgB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAY,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC1H,OAAO,CAAC,QAAQ,CAAC,WAAW;IAZ9B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,SAAS,CAAmD;IACpE,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,WAAW,CAAK;gBAEZ,MAAM,EAAE,oBAAoB,EAAW,UAAU,EAAE,MAAM,EAAmB,GAAG,EAAE,MAAM,EAAE,EAAmB,IAAI,EAAE,SAAS,YAAY,EAAE,EAClI,WAAW,GAAE,MAAM,EAAwB;IAO9D,IAAI,MAAM,IAAI,oBAAoB,CAAyB;IAC3D,aAAa,IAAI,IAAI;IAcrB,uGAAuG;IACvG,OAAO,CAAC,iBAAiB;IAQzB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI;IAInC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOpC,sFAAsF;IACtF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW3B,QAAQ;IAoBtB,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI;IAKlE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YACV,WAAW;CAgB1B;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC1F"}