@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,395 @@
1
+ import { closeSync, constants, fsyncSync, futimesSync, lstatSync, lutimesSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { dirname, isAbsolute, join } from 'node:path';
4
+ import { DaemonSecurityError, tryKernelLock } from './native-ownership.js';
5
+ import { assertPathIdentity, assertPrivateStat, canonicalProspectivePath, identityFor, openPrivateFile, pathIdentity, pathInside, pathsOverlap, pinPathAncestry, pinPathChain, prepareDaemonTarget, privateDirectory, resolveDaemonTarget, storeDirectory } from './target.js';
6
+ const STORE_LOCK = '.felan-store.lock';
7
+ const CLAIMS_LOCK = 'claims.lock';
8
+ const KNOWN_ROOTS = 'daemon-store-roots.json';
9
+ /**
10
+ * Temp reapers (macOS tmp_cleaner, systemd-tmpfiles) delete files whose atime, mtime and ctime are all days old.
11
+ * Holding a flock never updates them, and deleting a pinned lock permanently fences the running owner.
12
+ */
13
+ const TIMESTAMP_REFRESH_MS = 60 * 60_000;
14
+ /** Claims are only advisory hints about live daemons, so an unreadable ledger is rebuilt rather than trusted. */
15
+ function readLedger(directory) {
16
+ let fd;
17
+ try {
18
+ fd = openSync(join(directory, 'claims.json'), constants.O_RDONLY | constants.O_NOFOLLOW);
19
+ }
20
+ catch {
21
+ return { version: 1, claims: [] };
22
+ }
23
+ try {
24
+ const value = JSON.parse(readFileSync(fd, 'utf8'));
25
+ if (!value || typeof value !== 'object' || !('version' in value) || value.version !== 1 || !('claims' in value) || !Array.isArray(value.claims))
26
+ return { version: 1, claims: [] };
27
+ return { version: 1, claims: value.claims.filter(validClaim) };
28
+ }
29
+ catch {
30
+ return { version: 1, claims: [] };
31
+ }
32
+ finally {
33
+ closeSync(fd);
34
+ }
35
+ }
36
+ function validClaim(c) {
37
+ return !!c && (c.kind === 'production' || c.kind === 'isolated') && typeof c.namespaceId === 'string' && typeof c.instanceId === 'string'
38
+ && typeof c.lock === 'string' && /^(production|isolated-[a-f0-9]{64})\.lock$/.test(c.lock) && validNode(c.lockNode)
39
+ && Array.isArray(c.roots) && c.roots.every((r) => typeof r === 'string' && r.startsWith('/') && !r.includes('\0'))
40
+ && Array.isArray(c.nodes) && c.nodes.length === c.roots.length && c.nodes.every(validNode) && Array.isArray(c.ancestors) && c.ancestors.every(validNode);
41
+ }
42
+ function validNode(value) {
43
+ if (!value || typeof value !== 'object' || !('dev' in value) || !('ino' in value))
44
+ return false;
45
+ return typeof value.dev === 'string' && /^\d{1,32}$/.test(value.dev) && typeof value.ino === 'string' && /^\d{1,32}$/.test(value.ino);
46
+ }
47
+ function node(pin) { return { dev: String(pin.dev), ino: String(pin.ino) }; }
48
+ function nodesIntersect(a, b) {
49
+ const keys = new Set(a.map(n => `${n.dev}:${n.ino}`));
50
+ return b.some(n => keys.has(`${n.dev}:${n.ino}`));
51
+ }
52
+ function existingNodes(paths) {
53
+ return paths.flatMap(path => {
54
+ try {
55
+ return [node(pathIdentity(path))];
56
+ }
57
+ catch (error) {
58
+ if (error.code === 'ENOENT')
59
+ return [];
60
+ throw error;
61
+ }
62
+ });
63
+ }
64
+ function uniqueNodes(pins) {
65
+ return [...new Map(pins.map(pin => { const n = node(pin); return [`${n.dev}:${n.ino}`, n]; })).values()];
66
+ }
67
+ /** A claim is live only while another process still holds its registered lifetime lock. */
68
+ function claimActive(target, claim) {
69
+ let fd;
70
+ try {
71
+ fd = openSync(join(target.accountDirectory, claim.lock), constants.O_RDWR | constants.O_NOFOLLOW);
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ try {
77
+ const pin = pathIdentity(join(target.accountDirectory, claim.lock));
78
+ if (String(pin.dev) !== claim.lockNode.dev || String(pin.ino) !== claim.lockNode.ino)
79
+ return false;
80
+ return !tryKernelLock(fd);
81
+ }
82
+ finally {
83
+ closeSync(fd);
84
+ }
85
+ }
86
+ function saveLedger(directory, uid, ledger) {
87
+ const temp = join(directory, `claims-${randomUUID()}.tmp`);
88
+ const fd = openSync(temp, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
89
+ try {
90
+ writeFileSync(fd, JSON.stringify(ledger));
91
+ fsyncSync(fd);
92
+ }
93
+ finally {
94
+ closeSync(fd);
95
+ }
96
+ try {
97
+ assertPrivateStat(lstatSync(directory, { bigint: true }), uid, true);
98
+ renameSync(temp, join(directory, 'claims.json'));
99
+ const dir = openSync(directory, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
100
+ try {
101
+ fsyncSync(dir);
102
+ }
103
+ finally {
104
+ closeSync(dir);
105
+ }
106
+ }
107
+ finally {
108
+ try {
109
+ unlinkSync(temp);
110
+ }
111
+ catch (error) {
112
+ if (error.code !== 'ENOENT')
113
+ throw error;
114
+ }
115
+ }
116
+ }
117
+ async function coordination(target) {
118
+ privateDirectory(target.accountDirectory, target.uid);
119
+ const pins = pinPathChain(target.accountDirectory, target.uid);
120
+ const file = join(target.accountDirectory, CLAIMS_LOCK);
121
+ const fd = openPrivateFile(file, target.uid);
122
+ const pin = pathIdentity(file);
123
+ pins.push(pin);
124
+ try {
125
+ const deadline = performance.now() + 5_000;
126
+ while (!tryKernelLock(fd)) {
127
+ if (performance.now() >= deadline)
128
+ throw new DaemonSecurityError('ownership_busy', 'Account claim coordinator is busy; retry without removing its lock.');
129
+ await new Promise(resolve => setTimeout(resolve, 10));
130
+ for (const p of pins)
131
+ assertPathIdentity(p);
132
+ }
133
+ for (const p of pins)
134
+ assertPathIdentity(p);
135
+ return { fd, pins };
136
+ }
137
+ catch (error) {
138
+ closeSync(fd);
139
+ throw error;
140
+ }
141
+ }
142
+ export function namespaceLockName(target) {
143
+ return target.kind === 'production' ? 'production.lock' : `isolated-${createHash('sha256').update(target.namespaceId).digest('hex')}.lock`;
144
+ }
145
+ function storeRootAllowed(target, root) {
146
+ if (pathsOverlap(root, target.accountDirectory) || pathsOverlap(root, target.runtimeDirectory))
147
+ return false;
148
+ return target.kind !== 'isolated' || pathInside(dirname(target.runtimeDirectory), root);
149
+ }
150
+ /** Session directories used before stay addressable after restart; they are locked again when a session opens there. */
151
+ function readKnownRoots(target) {
152
+ let value;
153
+ try {
154
+ value = JSON.parse(readFileSync(join(target.agentDir, KNOWN_ROOTS), 'utf8'));
155
+ }
156
+ catch {
157
+ return [];
158
+ }
159
+ if (!Array.isArray(value))
160
+ return [];
161
+ return value.flatMap(root => {
162
+ if (typeof root !== 'string' || !isAbsolute(root))
163
+ return [];
164
+ try {
165
+ const canonical = canonicalProspectivePath(root);
166
+ return storeRootAllowed(target, canonical) ? [canonical] : [];
167
+ }
168
+ catch {
169
+ return [];
170
+ }
171
+ });
172
+ }
173
+ function writeKnownRoots(agentDir, roots) {
174
+ const path = join(agentDir, KNOWN_ROOTS);
175
+ const temp = `${path}.${randomUUID()}.tmp`;
176
+ try {
177
+ writeFileSync(temp, JSON.stringify(roots), { flag: 'wx', mode: 0o600 });
178
+ renameSync(temp, path);
179
+ }
180
+ finally {
181
+ try {
182
+ unlinkSync(temp);
183
+ }
184
+ catch { /* Already renamed. */ }
185
+ }
186
+ }
187
+ function lockStoreRoot(root) {
188
+ const fd = openSync(join(root, STORE_LOCK), constants.O_RDWR | constants.O_CREAT | constants.O_NOFOLLOW, 0o600);
189
+ if (tryKernelLock(fd))
190
+ return fd;
191
+ closeSync(fd);
192
+ throw new DaemonSecurityError('root_conflict', 'The canonical store has a live kernel ownership lock.');
193
+ }
194
+ export class DaemonOwnership {
195
+ instanceId;
196
+ fds;
197
+ pins;
198
+ lockedRoots;
199
+ identity;
200
+ lost;
201
+ released = false;
202
+ releasePromise;
203
+ timer;
204
+ listeners = new Set();
205
+ extraPins = [];
206
+ current;
207
+ owning = new Map();
208
+ refreshedAt = 0;
209
+ constructor(target, instanceId, fds, pins, lockedRoots = [...target.rootSet]) {
210
+ this.instanceId = instanceId;
211
+ this.fds = fds;
212
+ this.pins = pins;
213
+ this.lockedRoots = lockedRoots;
214
+ this.current = target;
215
+ const identity = identityFor(target, instanceId);
216
+ Object.freeze(identity.rootSet);
217
+ this.identity = Object.freeze(identity);
218
+ this.timer = setInterval(() => { try {
219
+ this.assertCurrent();
220
+ this.refreshTimestamps();
221
+ }
222
+ catch { /* assertCurrent synchronously fences and notifies. */ } }, 25);
223
+ this.timer.unref();
224
+ }
225
+ get target() { return this.current; }
226
+ assertCurrent() {
227
+ if (this.lost)
228
+ throw this.lost;
229
+ if (this.released)
230
+ throw new DaemonSecurityError('ownership_lost', 'Daemon ownership has been released.');
231
+ try {
232
+ for (const pin of [...this.pins, ...this.extraPins])
233
+ assertPathIdentity(pin);
234
+ for (const fd of this.fds)
235
+ if (!tryKernelLock(fd))
236
+ throw new Error('kernel lock lost');
237
+ }
238
+ catch {
239
+ this.lost = new DaemonSecurityError('ownership_lost', 'Daemon lock or path identity changed; admission is permanently fenced for this instance.');
240
+ clearInterval(this.timer);
241
+ for (const listener of this.listeners) {
242
+ try {
243
+ listener(this.lost);
244
+ }
245
+ catch { /* One observer must not suppress the remaining fences. */ }
246
+ }
247
+ throw this.lost;
248
+ }
249
+ }
250
+ /** Wall-clock throttling refreshes on the first tick after sleep, when reapers may run immediately. */
251
+ refreshTimestamps() {
252
+ const now = Date.now();
253
+ const elapsed = now - this.refreshedAt;
254
+ if (elapsed >= 0 && elapsed < TIMESTAMP_REFRESH_MS)
255
+ return;
256
+ this.refreshedAt = now;
257
+ const time = new Date(now);
258
+ for (const fd of this.fds)
259
+ futimesSync(fd, time, time);
260
+ lutimesSync(join(this.current.accountDirectory, CLAIMS_LOCK), time, time);
261
+ }
262
+ watchPath(path) {
263
+ this.assertCurrent();
264
+ const pin = pathIdentity(path);
265
+ this.extraPins.push(pin);
266
+ return () => { this.extraPins = this.extraPins.filter(item => item !== pin); };
267
+ }
268
+ assertOwnsPath(path) {
269
+ this.assertCurrent();
270
+ const canonical = canonicalProspectivePath(path);
271
+ if (!this.current.rootSet.some(root => pathInside(root, canonical)))
272
+ throw new DaemonSecurityError('root_not_owned', 'This path is outside the daemon store roots.');
273
+ this.assertCurrent();
274
+ return canonical;
275
+ }
276
+ /** Adds a session directory to the owned stores, locking it against other daemons. */
277
+ ownRoot(directory) {
278
+ this.assertCurrent();
279
+ const root = canonicalProspectivePath(directory);
280
+ if (this.lockedRoots.some(owned => pathInside(owned, root)))
281
+ return Promise.resolve();
282
+ let pending = this.owning.get(root);
283
+ if (!pending) {
284
+ pending = this.lockRoot(root).finally(() => this.owning.delete(root));
285
+ this.owning.set(root, pending);
286
+ }
287
+ return pending;
288
+ }
289
+ async lockRoot(root) {
290
+ if (!storeRootAllowed(this.current, root))
291
+ throw new DaemonSecurityError('root_not_owned', 'Session stores cannot use daemon runtime paths or leave an isolated fixture.');
292
+ storeDirectory(root);
293
+ const coordinator = await coordination(this.current);
294
+ try {
295
+ this.assertCurrent();
296
+ const ledger = readLedger(this.current.accountDirectory);
297
+ if (ledger.claims.some(claim => claim.instanceId !== this.instanceId && claim.roots.some(other => pathsOverlap(other, root)) && claimActive(this.current, claim))) {
298
+ throw new DaemonSecurityError('root_conflict', 'Another daemon owns an overlapping canonical store root.');
299
+ }
300
+ this.fds.push(lockStoreRoot(root));
301
+ this.lockedRoots.push(root);
302
+ const own = ledger.claims.find(claim => claim.instanceId === this.instanceId);
303
+ if (own) {
304
+ own.roots.push(root);
305
+ own.nodes.push(node(pathIdentity(root)));
306
+ saveLedger(this.current.accountDirectory, this.current.uid, ledger);
307
+ }
308
+ }
309
+ finally {
310
+ closeSync(coordinator.fd);
311
+ }
312
+ if (this.current.rootSet.includes(root))
313
+ return;
314
+ const rootSet = Object.freeze([...this.current.rootSet, root]);
315
+ this.current = Object.freeze({ ...this.current, rootSet });
316
+ writeKnownRoots(this.current.agentDir, rootSet.filter(known => known !== this.current.agentDir));
317
+ }
318
+ onLost(listener) {
319
+ this.listeners.add(listener);
320
+ if (this.lost)
321
+ listener(this.lost);
322
+ return () => this.listeners.delete(listener);
323
+ }
324
+ release() { return this.releasePromise ??= this.releaseOnce(); }
325
+ async releaseOnce() {
326
+ // Call only after all owned writers have settled, including after loss.
327
+ this.released = true;
328
+ clearInterval(this.timer);
329
+ let coordinator;
330
+ try {
331
+ for (const pin of this.pins.filter(p => p.path === this.current.accountDirectory || p.path.startsWith(`${this.current.accountDirectory}/`)))
332
+ assertPathIdentity(pin);
333
+ coordinator = await coordination(this.current);
334
+ const ledger = readLedger(this.current.accountDirectory);
335
+ ledger.claims = ledger.claims.filter(c => c.instanceId !== this.instanceId);
336
+ saveLedger(this.current.accountDirectory, this.current.uid, ledger);
337
+ }
338
+ finally {
339
+ for (const fd of this.fds.splice(0).reverse())
340
+ closeSync(fd);
341
+ if (coordinator)
342
+ closeSync(coordinator.fd);
343
+ this.listeners.clear();
344
+ }
345
+ }
346
+ }
347
+ export async function acquireDaemonOwnership(input) {
348
+ let target = resolveDaemonTarget(input);
349
+ const coordinator = await coordination(target);
350
+ const held = [];
351
+ try {
352
+ const guardedRoots = [...target.rootSet, target.kind === 'isolated' ? dirname(target.runtimeDirectory) : target.runtimeDirectory];
353
+ const candidateNodes = existingNodes(guardedRoots);
354
+ const candidateAncestors = target.pins.map(node);
355
+ const lock = namespaceLockName(target);
356
+ const lifetime = openPrivateFile(join(target.accountDirectory, lock), target.uid);
357
+ held.push(lifetime);
358
+ if (!tryKernelLock(lifetime))
359
+ throw new DaemonSecurityError('owner_running', 'This OS account/namespace already has a daemon. Attach using its pinned roots; do not delete locks.');
360
+ const live = readLedger(target.accountDirectory).claims.filter(claim => claim.lock !== lock && claimActive(target, claim));
361
+ for (const claim of live) {
362
+ if (claim.roots.some(root => guardedRoots.some(other => pathsOverlap(root, other))) || nodesIntersect(claim.nodes, candidateAncestors) || nodesIntersect(candidateNodes, claim.ancestors)) {
363
+ throw new DaemonSecurityError('root_conflict', 'Another daemon owns an overlapping canonical store root.');
364
+ }
365
+ }
366
+ target = prepareDaemonTarget(target);
367
+ const nodes = guardedRoots.map(root => node(pathIdentity(root)));
368
+ const ancestors = uniqueNodes(guardedRoots.flatMap(pinPathAncestry));
369
+ for (const claim of live) {
370
+ if (nodesIntersect(claim.nodes, ancestors) || nodesIntersect(nodes, claim.ancestors))
371
+ throw new DaemonSecurityError('root_conflict', 'A store inode or ancestor is already registered under another path.');
372
+ }
373
+ for (const root of target.rootSet)
374
+ held.push(lockStoreRoot(root));
375
+ const instanceId = randomUUID();
376
+ const lockPin = pathIdentity(join(target.accountDirectory, lock));
377
+ for (const pin of coordinator.pins)
378
+ assertPathIdentity(pin);
379
+ saveLedger(target.accountDirectory, target.uid, { version: 1, claims: [...live, { kind: target.kind, namespaceId: target.namespaceId, instanceId, lock, lockNode: node(lockPin), roots: guardedRoots, nodes, ancestors }] });
380
+ const lockPins = [join(target.accountDirectory, lock), ...target.rootSet.map(root => join(root, STORE_LOCK))].map(pathIdentity);
381
+ const lockedRoots = [...target.rootSet];
382
+ const known = [...new Set(readKnownRoots(target))].filter(root => !lockedRoots.some(owned => pathInside(owned, root)));
383
+ const owned = known.length ? Object.freeze({ ...target, rootSet: Object.freeze([...target.rootSet, ...known]) }) : target;
384
+ return new DaemonOwnership(owned, instanceId, held, [...coordinator.pins, ...target.pins, ...lockPins], lockedRoots);
385
+ }
386
+ catch (error) {
387
+ for (const fd of held.reverse())
388
+ closeSync(fd);
389
+ throw error;
390
+ }
391
+ finally {
392
+ closeSync(coordinator.fd);
393
+ }
394
+ }
395
+ //# sourceMappingURL=ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../src/daemon/ownership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import type { DaemonOwnership } from './ownership.js';
2
+ export type PersistenceBoundary = 'before_commit' | 'after_commit';
3
+ export declare function sha256(data: string | Buffer): string;
4
+ export declare function guardOwnedPaths(owner: DaemonOwnership, paths: readonly string[]): () => void;
5
+ export declare function syncOwnedDirectory(owner: DaemonOwnership, directory: string): void;
6
+ export declare function prepareControlDirectory(owner: DaemonOwnership, directory: string): string;
7
+ /** Session projections are stored as their own rows, keyed by `[session, key]`. */
8
+ export declare const CONTROL_TABLES: readonly ["sessions", "requests", "interactions", "continuations", "resources", "projections"];
9
+ export type ControlTable = typeof CONTROL_TABLES[number];
10
+ /** A persisted record; `ord` orders a table's rows as the in-memory arrays they were written from. */
11
+ export interface ControlRow {
12
+ readonly id: string;
13
+ readonly ord: number;
14
+ readonly data: string;
15
+ }
16
+ export interface ControlMeta {
17
+ readonly namespace: string;
18
+ readonly agentDir: string;
19
+ readonly clock: number;
20
+ }
21
+ export interface StoredControl {
22
+ readonly meta: ControlMeta;
23
+ readonly rows: Readonly<Record<ControlTable, readonly ControlRow[]>>;
24
+ }
25
+ export interface ControlChanges {
26
+ readonly meta: ControlMeta;
27
+ readonly upserts: readonly (readonly [ControlTable, ControlRow])[];
28
+ readonly deletes: readonly (readonly [ControlTable, string])[];
29
+ }
30
+ export interface RemoteDatabase {
31
+ assertCurrent(): void;
32
+ readonly rebuilt: boolean;
33
+ record(kind: string, id: string): string | undefined;
34
+ records(kind: string): {
35
+ id: string;
36
+ data: string;
37
+ }[];
38
+ putRecord(kind: string, id: string, data: string): void;
39
+ deleteRecord(kind: string, id: string): void;
40
+ outbox(session: string, after?: number, limit?: number): {
41
+ seq: number;
42
+ bytes: number;
43
+ data: string;
44
+ }[];
45
+ insertOutbox(session: string, seq: number, bytes: number, data: string): void;
46
+ deleteOutbox(session: string, through?: number): void;
47
+ transaction<T>(fn: () => T): T;
48
+ }
49
+ /**
50
+ * The control store's SQLite database. A commit writes only the rows that changed, in one
51
+ * synchronous-NORMAL WAL transaction, after rechecking ownership and the pinned file identities.
52
+ */
53
+ export declare class ControlDatabase implements RemoteDatabase {
54
+ readonly owner: DaemonOwnership;
55
+ private readonly fault?;
56
+ readonly directory: string;
57
+ private readonly path;
58
+ private readonly initialization;
59
+ private initializationPin;
60
+ private pin;
61
+ private unwatch;
62
+ private db;
63
+ private statements;
64
+ private poisoned;
65
+ private closed;
66
+ private storeId;
67
+ private wasRebuilt;
68
+ private inTransaction;
69
+ get rebuilt(): boolean;
70
+ constructor(owner: DaemonOwnership, directory: string, fault?: ((boundary: PersistenceBoundary) => void) | undefined);
71
+ private open;
72
+ /**
73
+ * False when no database exists. A database or sidecar that is not a regular file is quarantined, because
74
+ * SQLite follows links. Unreadable files fail retryably.
75
+ */
76
+ private present;
77
+ private connect;
78
+ private create;
79
+ /** Null until the first state is written. */
80
+ read(): StoredControl | null;
81
+ /** Moves the database aside for inspection and starts an empty one. */
82
+ quarantine(): void;
83
+ write(changes: ControlChanges): void;
84
+ record(kind: string, id: string): string | undefined;
85
+ records(kind: string): {
86
+ id: string;
87
+ data: string;
88
+ }[];
89
+ putRecord(kind: string, id: string, data: string): void;
90
+ deleteRecord(kind: string, id: string): void;
91
+ outbox(session: string, after?: number, limit?: number): {
92
+ seq: number;
93
+ bytes: number;
94
+ data: string;
95
+ }[];
96
+ insertOutbox(session: string, seq: number, bytes: number, data: string): void;
97
+ deleteOutbox(session: string, through?: number): void;
98
+ private assertTransaction;
99
+ transaction<T>(fn: () => T): T;
100
+ private fence;
101
+ assertCurrent(): void;
102
+ close(): void;
103
+ private release;
104
+ private disconnect;
105
+ private meta;
106
+ private quarantineFiles;
107
+ private readFile;
108
+ private syncDirectory;
109
+ }
110
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/daemon/persistence.ts"],"names":[],"mappings":"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"}