@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,540 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { closeSync, constants, fstatSync, fsyncSync, lstatSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { basename, dirname, join } from 'node:path';
5
+ import { assertPathIdentity, pathIdentity, pathInside, pinPathAncestry, storeDirectory } from './target.js';
6
+ import { ControlStoreError } from './control-state.js';
7
+ export function sha256(data) { return createHash('sha256').update(data).digest('hex'); }
8
+ export function guardOwnedPaths(owner, paths) {
9
+ const targets = paths.map(input => ({ input, canonical: owner.assertOwnsPath(input) }));
10
+ const pins = new Map();
11
+ for (const { canonical } of targets) {
12
+ let existing = canonical;
13
+ for (;;) {
14
+ try {
15
+ const stat = lstatSync(existing);
16
+ if (!stat.isDirectory()) {
17
+ pins.set(existing, pathIdentity(existing));
18
+ existing = dirname(existing);
19
+ }
20
+ break;
21
+ }
22
+ catch (error) {
23
+ if (error.code !== 'ENOENT')
24
+ throw error;
25
+ existing = dirname(existing);
26
+ }
27
+ }
28
+ for (const pin of pinPathAncestry(existing))
29
+ pins.set(pin.path, pin);
30
+ }
31
+ return () => {
32
+ owner.assertCurrent();
33
+ for (const pin of pins.values())
34
+ assertPathIdentity(pin);
35
+ for (const target of targets)
36
+ if (owner.assertOwnsPath(target.input) !== target.canonical)
37
+ throw new ControlStoreError('ownership_lost', 'An owned path changed its canonical destination.');
38
+ owner.assertCurrent();
39
+ };
40
+ }
41
+ export function syncOwnedDirectory(owner, directory) {
42
+ const path = owner.assertOwnsPath(directory);
43
+ const check = guardOwnedPaths(owner, [path]);
44
+ const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
45
+ try {
46
+ const stat = fstatSync(fd, { bigint: true });
47
+ const pin = pathIdentity(path);
48
+ if (stat.dev !== pin.dev || stat.ino !== pin.ino)
49
+ throw new ControlStoreError('ownership_lost', 'Directory changed while syncing.');
50
+ check();
51
+ fsyncSync(fd);
52
+ check();
53
+ }
54
+ finally {
55
+ closeSync(fd);
56
+ }
57
+ }
58
+ export function prepareControlDirectory(owner, directory) {
59
+ const canonical = owner.assertOwnsPath(directory);
60
+ const check = guardOwnedPaths(owner, [directory]);
61
+ const actual = storeDirectory(canonical);
62
+ check();
63
+ if (actual !== canonical)
64
+ throw new ControlStoreError('ownership_lost', 'Directory changed while creating it.');
65
+ for (let path = canonical;; path = dirname(path)) {
66
+ syncOwnedDirectory(owner, path);
67
+ if (owner.target.rootSet.includes(path))
68
+ break;
69
+ }
70
+ return actual;
71
+ }
72
+ /** Session projections are stored as their own rows, keyed by `[session, key]`. */
73
+ export const CONTROL_TABLES = ['sessions', 'requests', 'interactions', 'continuations', 'resources', 'projections'];
74
+ const DATABASE = 'control.sqlite';
75
+ const FORMAT = '1';
76
+ const SIDECARS = ['-wal', '-shm', '-journal'];
77
+ // NORMAL avoids per-commit flushes; remaining syncs, including checkpoints, retain macOS F_FULLFSYNC.
78
+ const PRAGMAS = 'PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA fullfsync = ON; PRAGMA checkpoint_fullfsync = ON; PRAGMA busy_timeout = 1000';
79
+ /** SQLite primary result codes that describe the environment, not the file's contents. */
80
+ const SQLITE_TRANSIENT = new Set([3 /* PERM */, 5 /* BUSY */, 6 /* LOCKED */, 7 /* NOMEM */, 8 /* READONLY */, 10 /* IOERR */, 13 /* FULL */, 14 /* CANTOPEN */]);
81
+ const REMOTE_SCHEMA = `
82
+ CREATE TABLE IF NOT EXISTS remote_records (kind TEXT NOT NULL, id TEXT NOT NULL, data TEXT NOT NULL, PRIMARY KEY (kind, id)) STRICT;
83
+ CREATE TABLE IF NOT EXISTS remote_outbox (session TEXT NOT NULL, seq INTEGER NOT NULL, bytes INTEGER NOT NULL, data TEXT NOT NULL, PRIMARY KEY (session, seq)) STRICT;
84
+ `;
85
+ let sqlite;
86
+ /** Loads node:sqlite on first use so clients that import daemon modules never load it. */
87
+ function loadSqlite() {
88
+ if (sqlite)
89
+ return sqlite;
90
+ const emitWarning = process.emitWarning;
91
+ // Supported Node lines mark node:sqlite experimental; its one-time warning would reach foreground daemon output.
92
+ process.emitWarning = ((warning, ...rest) => {
93
+ if (String(warning instanceof Error ? warning.message : warning).startsWith('SQLite is an experimental feature'))
94
+ return;
95
+ emitWarning.call(process, warning, ...rest);
96
+ });
97
+ try {
98
+ sqlite = createRequire(import.meta.url)('node:sqlite');
99
+ }
100
+ finally {
101
+ process.emitWarning = emitWarning;
102
+ }
103
+ return sqlite;
104
+ }
105
+ /**
106
+ * The control store's SQLite database. A commit writes only the rows that changed, in one
107
+ * synchronous-NORMAL WAL transaction, after rechecking ownership and the pinned file identities.
108
+ */
109
+ export class ControlDatabase {
110
+ owner;
111
+ fault;
112
+ directory;
113
+ path;
114
+ initialization;
115
+ initializationPin;
116
+ pin;
117
+ unwatch = () => { };
118
+ db;
119
+ statements;
120
+ poisoned = false;
121
+ closed = false;
122
+ storeId;
123
+ wasRebuilt = false;
124
+ inTransaction = false;
125
+ get rebuilt() { return this.wasRebuilt; }
126
+ constructor(owner, directory, fault) {
127
+ this.owner = owner;
128
+ this.fault = fault;
129
+ this.directory = owner.assertOwnsPath(directory);
130
+ if (pathInside(this.directory, owner.target.agentDir))
131
+ throw new ControlStoreError('invalid_request', 'Control state cannot contain its independent initialization record.');
132
+ this.initialization = join(owner.target.agentDir, `.control-initialized-${sha256(this.directory)}.json`);
133
+ this.path = join(this.directory, DATABASE);
134
+ try {
135
+ this.open();
136
+ }
137
+ catch (error) {
138
+ this.release();
139
+ owner.assertCurrent();
140
+ if (!integrityFailure(error))
141
+ throw unreadable(error);
142
+ this.wasRebuilt = true;
143
+ // Unusable control state is moved aside and rebuilt; transcripts remain the durable session record.
144
+ try {
145
+ renameSync(this.directory, `${this.directory}.corrupt-${Date.now()}`);
146
+ }
147
+ catch (error) {
148
+ if (error.code !== 'ENOENT')
149
+ throw error;
150
+ }
151
+ try {
152
+ unlinkSync(this.initialization);
153
+ }
154
+ catch (error) {
155
+ if (error.code !== 'ENOENT')
156
+ throw error;
157
+ }
158
+ try {
159
+ this.open();
160
+ }
161
+ catch {
162
+ this.release();
163
+ throw new ControlStoreError('storage_failure', 'Control store cannot be created.');
164
+ }
165
+ }
166
+ }
167
+ open() {
168
+ const owner = this.owner;
169
+ let initialized;
170
+ try {
171
+ initialized = this.readFile(this.initialization);
172
+ }
173
+ catch (error) {
174
+ if (error.code !== 'ENOENT')
175
+ throw error;
176
+ }
177
+ if (initialized === undefined) {
178
+ // A crash between quarantining the directory and recreating its initialization must not erase evidence of journal loss.
179
+ try {
180
+ if (readdirSync(dirname(this.directory)).some(name => name.startsWith(`${basename(this.directory)}.corrupt-`)))
181
+ this.wasRebuilt = true;
182
+ }
183
+ catch (error) {
184
+ if (error.code !== 'ENOENT')
185
+ throw error;
186
+ }
187
+ try {
188
+ if (readdirSync(this.directory).length !== 0)
189
+ throw new Error('unregistered control state');
190
+ }
191
+ catch (error) {
192
+ if (error.code !== 'ENOENT')
193
+ throw error;
194
+ }
195
+ this.storeId = randomUUID();
196
+ const fd = openSync(this.initialization, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
197
+ try {
198
+ writeFileSync(fd, JSON.stringify({ version: 1, storeId: this.storeId, directory: this.directory }));
199
+ fsyncSync(fd);
200
+ }
201
+ finally {
202
+ closeSync(fd);
203
+ }
204
+ syncOwnedDirectory(owner, owner.target.agentDir);
205
+ prepareControlDirectory(owner, this.directory);
206
+ }
207
+ else {
208
+ const value = JSON.parse(initialized);
209
+ if (value.version !== 1 || typeof value.storeId !== 'string' || !/^[a-f0-9-]{36}$/.test(value.storeId) || value.directory !== this.directory)
210
+ throw new Error('initialization');
211
+ this.storeId = value.storeId;
212
+ }
213
+ this.initializationPin = pathIdentity(this.initialization);
214
+ this.unwatch = owner.watchPath(this.directory);
215
+ if (this.present()) {
216
+ try {
217
+ this.connect();
218
+ return;
219
+ }
220
+ catch (error) {
221
+ this.disconnect();
222
+ if (!(error instanceof DatabaseIntegrityError))
223
+ throw error;
224
+ this.quarantineFiles();
225
+ }
226
+ }
227
+ if (initialized !== undefined)
228
+ this.wasRebuilt = true;
229
+ this.create();
230
+ }
231
+ /**
232
+ * False when no database exists. A database or sidecar that is not a regular file is quarantined, because
233
+ * SQLite follows links. Unreadable files fail retryably.
234
+ */
235
+ present() {
236
+ const files = [this.path, ...SIDECARS.map(extension => `${this.path}${extension}`)].map(path => {
237
+ try {
238
+ return lstatSync(path);
239
+ }
240
+ catch (error) {
241
+ if (error.code === 'ENOENT')
242
+ return undefined;
243
+ throw error;
244
+ }
245
+ });
246
+ if (files.some(stat => stat && !stat.isFile())) {
247
+ this.quarantineFiles();
248
+ return false;
249
+ }
250
+ if (!files[0])
251
+ return false;
252
+ closeSync(openSync(this.path, constants.O_RDWR | constants.O_NOFOLLOW));
253
+ return true;
254
+ }
255
+ connect() {
256
+ const db = this.db = new (loadSqlite().DatabaseSync)(this.path);
257
+ try {
258
+ db.exec(PRAGMAS);
259
+ if (db.prepare('PRAGMA quick_check').get()?.quick_check !== 'ok')
260
+ throw new DatabaseIntegrityError();
261
+ const tables = new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map(row => row.name));
262
+ if (!['meta', ...CONTROL_TABLES].every(table => tables.has(table)))
263
+ throw new DatabaseIntegrityError();
264
+ const meta = new Map(db.prepare('SELECT key, value FROM meta').all().map(row => [row.key, row.value]));
265
+ if (meta.get('format') !== FORMAT || meta.get('storeId') !== this.storeId)
266
+ throw new DatabaseIntegrityError();
267
+ // Rows without the state metadata cannot be validated against their namespace; never resurrect them under a new one.
268
+ if (!meta.has('namespace') && CONTROL_TABLES.some(table => db.prepare(`SELECT 1 FROM ${table} LIMIT 1`).get() !== undefined))
269
+ throw new DatabaseIntegrityError();
270
+ this.wasRebuilt = meta.get('remoteRebuilt') === 'true';
271
+ this.pin = pathIdentity(this.path);
272
+ db.exec(`BEGIN IMMEDIATE; ${REMOTE_SCHEMA}`);
273
+ this.assertCurrent();
274
+ db.exec('COMMIT');
275
+ this.assertCurrent();
276
+ this.statements = prepareStatements(db);
277
+ }
278
+ catch (error) {
279
+ // Past opening the file, a non-environmental SQLite error means the schema is not this format's.
280
+ const code = error?.errcode;
281
+ if (typeof code === 'number' && !SQLITE_TRANSIENT.has(code & 0xff))
282
+ throw new DatabaseIntegrityError();
283
+ throw error;
284
+ }
285
+ this.pin = pathIdentity(this.path);
286
+ }
287
+ create() {
288
+ // A WAL left without its database would be replayed into the new file.
289
+ if (SIDECARS.some(extension => { try {
290
+ lstatSync(`${this.path}${extension}`);
291
+ return true;
292
+ }
293
+ catch {
294
+ return false;
295
+ } }))
296
+ this.quarantineFiles();
297
+ closeSync(openSync(this.path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600));
298
+ const db = this.db = new (loadSqlite().DatabaseSync)(this.path);
299
+ db.exec(PRAGMAS);
300
+ db.exec(['BEGIN IMMEDIATE', 'CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT NOT NULL) STRICT',
301
+ ...CONTROL_TABLES.map(table => `CREATE TABLE ${table} (id TEXT PRIMARY KEY, ord INTEGER NOT NULL, data TEXT NOT NULL) STRICT`), REMOTE_SCHEMA].join('; '));
302
+ this.statements = prepareStatements(db);
303
+ this.statements.putMeta.run('format', FORMAT);
304
+ this.statements.putMeta.run('storeId', this.storeId);
305
+ if (this.wasRebuilt)
306
+ this.statements.putMeta.run('remoteRebuilt', 'true');
307
+ db.exec('COMMIT');
308
+ this.syncDirectory();
309
+ this.pin = pathIdentity(this.path);
310
+ }
311
+ /** Null until the first state is written. */
312
+ read() {
313
+ this.assertCurrent();
314
+ const meta = this.meta();
315
+ const namespace = meta.get('namespace');
316
+ const agentDir = meta.get('agentDir');
317
+ if (namespace === undefined || agentDir === undefined)
318
+ return null;
319
+ const rows = Object.fromEntries(CONTROL_TABLES.map(table => [table, this.statements[table].rows.all()]));
320
+ this.assertCurrent();
321
+ return { meta: { namespace, agentDir, clock: Number(meta.get('clock')) }, rows };
322
+ }
323
+ /** Moves the database aside for inspection and starts an empty one. */
324
+ quarantine() {
325
+ this.assertCurrent();
326
+ this.disconnect();
327
+ this.quarantineFiles();
328
+ this.create();
329
+ }
330
+ write(changes) {
331
+ try {
332
+ this.transaction(() => {
333
+ const statements = this.statements;
334
+ for (const [table, id] of changes.deletes)
335
+ statements[table].remove.run(id);
336
+ for (const [table, row] of changes.upserts)
337
+ statements[table].upsert.run(row.id, row.ord, row.data);
338
+ statements.putMeta.run('namespace', changes.meta.namespace);
339
+ statements.putMeta.run('agentDir', changes.meta.agentDir);
340
+ statements.putMeta.run('clock', String(changes.meta.clock));
341
+ });
342
+ }
343
+ catch {
344
+ throw this.fence();
345
+ }
346
+ }
347
+ record(kind, id) {
348
+ this.assertCurrent();
349
+ const row = this.statements.record.get(kind, id);
350
+ this.assertCurrent();
351
+ return row?.data;
352
+ }
353
+ records(kind) {
354
+ this.assertCurrent();
355
+ const rows = this.statements.records.all(kind);
356
+ this.assertCurrent();
357
+ return rows;
358
+ }
359
+ putRecord(kind, id, data) {
360
+ this.assertTransaction();
361
+ this.statements.putRecord.run(kind, id, data);
362
+ }
363
+ deleteRecord(kind, id) {
364
+ this.assertTransaction();
365
+ this.statements.deleteRecord.run(kind, id);
366
+ }
367
+ outbox(session, after = -1, limit = -1) {
368
+ this.assertCurrent();
369
+ if (!Number.isSafeInteger(after) || after < -1 || !Number.isSafeInteger(limit) || limit < -1)
370
+ throw new ControlStoreError('invalid_request', 'Invalid outbox range.');
371
+ const rows = this.statements.outbox.all(session, after, limit);
372
+ this.assertCurrent();
373
+ return rows;
374
+ }
375
+ insertOutbox(session, seq, bytes, data) {
376
+ this.assertTransaction();
377
+ if (!Number.isSafeInteger(seq) || seq < 0 || !Number.isSafeInteger(bytes) || bytes < 0)
378
+ throw new ControlStoreError('invalid_request', 'Invalid outbox sequence or byte count.');
379
+ this.statements.insertOutbox.run(session, seq, bytes, data);
380
+ }
381
+ deleteOutbox(session, through = Number.MAX_SAFE_INTEGER) {
382
+ this.assertTransaction();
383
+ if (!Number.isSafeInteger(through) || through < 0)
384
+ throw new ControlStoreError('invalid_request', 'Invalid outbox sequence.');
385
+ this.statements.deleteOutbox.run(session, through);
386
+ }
387
+ assertTransaction() {
388
+ this.assertCurrent();
389
+ if (!this.inTransaction)
390
+ throw new ControlStoreError('invalid_request', 'Remote writes require a transaction.');
391
+ }
392
+ transaction(fn) {
393
+ this.assertCurrent();
394
+ if (this.inTransaction)
395
+ throw new ControlStoreError('invalid_request', 'Nested control transactions are not supported.');
396
+ const db = this.db;
397
+ try {
398
+ db.exec('BEGIN IMMEDIATE');
399
+ }
400
+ catch {
401
+ throw new ControlStoreError('storage_failure', 'Control transaction could not begin; retry the operation.');
402
+ }
403
+ this.inTransaction = true;
404
+ try {
405
+ let result;
406
+ try {
407
+ result = fn();
408
+ if (result && typeof result.then === 'function')
409
+ throw new ControlStoreError('invalid_request', 'Control transactions must be synchronous.');
410
+ }
411
+ catch (error) {
412
+ // A callback failure rolled back cleanly leaves a known outcome, so it must not fence the
413
+ // shared database: one connector write failure would otherwise stop local session recording.
414
+ try {
415
+ db.exec('ROLLBACK');
416
+ }
417
+ catch {
418
+ throw this.fence();
419
+ }
420
+ throw error;
421
+ }
422
+ try {
423
+ this.fault?.('before_commit');
424
+ this.assertCurrent();
425
+ db.exec('COMMIT');
426
+ }
427
+ catch {
428
+ try {
429
+ db.exec('ROLLBACK');
430
+ }
431
+ catch { /* The handle is fenced below either way. */ }
432
+ throw this.fence();
433
+ }
434
+ try {
435
+ this.fault?.('after_commit');
436
+ this.assertCurrent();
437
+ }
438
+ catch {
439
+ throw this.fence();
440
+ }
441
+ return result;
442
+ }
443
+ finally {
444
+ this.inTransaction = false;
445
+ }
446
+ }
447
+ fence() {
448
+ this.poisoned = true;
449
+ return new ControlStoreError('storage_failure', 'Control commit failed; outcome is uncertain. Stop admission and reopen only after writers settle.');
450
+ }
451
+ assertCurrent() {
452
+ if (this.closed || this.poisoned)
453
+ throw new ControlStoreError('storage_failure', 'Control store is closed or fenced after a failed commit.');
454
+ this.owner.assertCurrent();
455
+ if (this.initializationPin)
456
+ assertPathIdentity(this.initializationPin);
457
+ if (this.pin)
458
+ assertPathIdentity(this.pin);
459
+ }
460
+ close() {
461
+ if (this.closed)
462
+ return;
463
+ this.closed = true;
464
+ this.release();
465
+ }
466
+ release() { this.disconnect(); this.unwatch(); }
467
+ disconnect() {
468
+ try {
469
+ this.db?.close();
470
+ }
471
+ catch { /* A failed close leaves nothing to recover in this handle. */ }
472
+ this.db = undefined;
473
+ this.statements = undefined;
474
+ this.pin = undefined;
475
+ }
476
+ meta() {
477
+ return new Map(this.statements.meta.all().map(row => [row.key, row.value]));
478
+ }
479
+ quarantineFiles() {
480
+ this.wasRebuilt = true;
481
+ const suffix = `control-corrupt-${Date.now()}-${randomUUID().slice(0, 8)}.sqlite`;
482
+ for (const extension of ['', ...SIDECARS]) {
483
+ try {
484
+ renameSync(`${this.path}${extension}`, join(this.directory, `${suffix}${extension}`));
485
+ }
486
+ catch (error) {
487
+ if (error.code !== 'ENOENT')
488
+ throw error;
489
+ }
490
+ }
491
+ this.pin = undefined;
492
+ this.syncDirectory();
493
+ }
494
+ readFile(path) {
495
+ this.owner.assertCurrent();
496
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
497
+ try {
498
+ return new TextDecoder('utf-8', { fatal: true }).decode(readFileSync(fd));
499
+ }
500
+ finally {
501
+ closeSync(fd);
502
+ }
503
+ }
504
+ syncDirectory() {
505
+ syncOwnedDirectory(this.owner, this.directory);
506
+ }
507
+ }
508
+ function prepareStatements(db) {
509
+ const tables = Object.fromEntries(CONTROL_TABLES.map(table => [table, {
510
+ upsert: db.prepare(`INSERT INTO ${table} (id, ord, data) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET ord = excluded.ord, data = excluded.data`),
511
+ remove: db.prepare(`DELETE FROM ${table} WHERE id = ?`),
512
+ rows: db.prepare(`SELECT id, ord, data FROM ${table} ORDER BY ord`),
513
+ }]));
514
+ return {
515
+ ...tables, putMeta: db.prepare('INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value'), meta: db.prepare('SELECT key, value FROM meta'),
516
+ record: db.prepare('SELECT data FROM remote_records WHERE kind = ? AND id = ?'),
517
+ records: db.prepare('SELECT id, data FROM remote_records WHERE kind = ? ORDER BY id'),
518
+ putRecord: db.prepare('INSERT INTO remote_records (kind, id, data) VALUES (?, ?, ?) ON CONFLICT(kind, id) DO UPDATE SET data = excluded.data'),
519
+ deleteRecord: db.prepare('DELETE FROM remote_records WHERE kind = ? AND id = ?'),
520
+ outbox: db.prepare('SELECT seq, bytes, data FROM remote_outbox WHERE session = ? AND seq > ? ORDER BY seq LIMIT ?'),
521
+ insertOutbox: db.prepare('INSERT INTO remote_outbox (session, seq, bytes, data) VALUES (?, ?, ?, ?)'),
522
+ deleteOutbox: db.prepare('DELETE FROM remote_outbox WHERE session = ? AND seq <= ?'),
523
+ };
524
+ }
525
+ class DatabaseIntegrityError extends Error {
526
+ }
527
+ /** Corrupt, foreign or substituted state is rebuilt; ownership loss and transient I/O errors must not discard it. */
528
+ function integrityFailure(error) {
529
+ if (error instanceof ControlStoreError || error?.name === 'DaemonSecurityError')
530
+ return false;
531
+ const code = error?.code;
532
+ return code === undefined || ['ENOENT', 'ELOOP', 'ENOTDIR', 'EISDIR', 'EEXIST', 'ERR_ENCODING_INVALID_ENCODED_DATA'].includes(code);
533
+ }
534
+ function unreadable(error) {
535
+ if (error instanceof ControlStoreError || error?.name === 'DaemonSecurityError')
536
+ return error;
537
+ const code = error?.code ?? 'unknown';
538
+ return new ControlStoreError('storage_failure', `Control state could not be read (${code}); it was left in place. Retry starting the daemon.`);
539
+ }
540
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/daemon/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AgentRuntime } from '@felan-ai/agent-core';
2
+ export interface ProcessRecord {
3
+ readonly id: string;
4
+ readonly kind: 'pty' | 'detached';
5
+ readonly status: 'running' | 'completed' | 'failed' | 'killed' | 'unknown';
6
+ readonly command: string;
7
+ readonly startedAt: number;
8
+ readonly startIdentity?: string;
9
+ readonly outputPath: string;
10
+ readonly commandIdentity: readonly string[];
11
+ readonly exitCode?: number;
12
+ }
13
+ export interface DetachedProcessInspection {
14
+ readonly status: ProcessRecord['status'];
15
+ readonly pid?: number;
16
+ }
17
+ export interface ProcessAdapter {
18
+ storageDirectory(runtime: AgentRuntime): string;
19
+ describeJob(runtime: AgentRuntime, path: string, bytes: Uint8Array): ProcessRecord | undefined;
20
+ inspectDetached(runtime: AgentRuntime, id: string): Promise<DetachedProcessInspection>;
21
+ stopDetached(runtime: AgentRuntime, id: string, signal: 'SIGTERM' | 'SIGKILL'): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=process-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-adapter.d.ts","sourceRoot":"","sources":["../../src/daemon/process-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;IAChD,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC;IAC/F,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvF,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-adapter.js","sourceRoot":"","sources":["../../src/daemon/process-adapter.ts"],"names":[],"mappings":""}