agl 1.0.17 → 21.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/.smartconfig.json +55 -0
  2. package/changelog.md +1026 -0
  3. package/cli.js +14 -0
  4. package/dist_serve/bundle.js +44778 -0
  5. package/dist_serve/index.html +13 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.authmodels.d.ts +126 -0
  9. package/dist_ts/classes.authmodels.js +1422 -0
  10. package/dist_ts/classes.authstore.d.ts +160 -0
  11. package/dist_ts/classes.authstore.js +2483 -0
  12. package/dist_ts/classes.browserresourcehost.d.ts +85 -0
  13. package/dist_ts/classes.browserresourcehost.js +912 -0
  14. package/dist_ts/classes.cli.d.ts +21 -0
  15. package/dist_ts/classes.cli.js +1082 -0
  16. package/dist_ts/classes.config.d.ts +23 -0
  17. package/dist_ts/classes.config.js +267 -0
  18. package/dist_ts/classes.controller.d.ts +523 -0
  19. package/dist_ts/classes.controller.js +10611 -0
  20. package/dist_ts/classes.controllermanagement.d.ts +32 -0
  21. package/dist_ts/classes.controllermanagement.js +222 -0
  22. package/dist_ts/classes.draftmanager.d.ts +30 -0
  23. package/dist_ts/classes.draftmanager.js +179 -0
  24. package/dist_ts/classes.embeddeddb.d.ts +30 -0
  25. package/dist_ts/classes.embeddeddb.js +159 -0
  26. package/dist_ts/classes.flexframedtransport.d.ts +56 -0
  27. package/dist_ts/classes.flexframedtransport.js +275 -0
  28. package/dist_ts/classes.flexmodels.private.d.ts +231 -0
  29. package/dist_ts/classes.flexmodels.private.js +985 -0
  30. package/dist_ts/classes.flexmodels.public.d.ts +207 -0
  31. package/dist_ts/classes.flexmodels.public.js +885 -0
  32. package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
  33. package/dist_ts/classes.flexprojectionreader.js +580 -0
  34. package/dist_ts/classes.flexservice.d.ts +196 -0
  35. package/dist_ts/classes.flexservice.js +3704 -0
  36. package/dist_ts/classes.flexstore.d.ts +174 -0
  37. package/dist_ts/classes.flexstore.js +3400 -0
  38. package/dist_ts/classes.flexsupervisor.d.ts +105 -0
  39. package/dist_ts/classes.flexsupervisor.js +1191 -0
  40. package/dist_ts/classes.gitreversion.d.ts +431 -0
  41. package/dist_ts/classes.gitreversion.js +10592 -0
  42. package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
  43. package/dist_ts/classes.harnessoperationmanager.js +602 -0
  44. package/dist_ts/classes.opencodeclient.d.ts +146 -0
  45. package/dist_ts/classes.opencodeclient.js +3003 -0
  46. package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
  47. package/dist_ts/classes.opencodesupervisor.js +1003 -0
  48. package/dist_ts/classes.passkeymanager.d.ts +34 -0
  49. package/dist_ts/classes.passkeymanager.js +456 -0
  50. package/dist_ts/classes.processinspection.d.ts +50 -0
  51. package/dist_ts/classes.processinspection.js +484 -0
  52. package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
  53. package/dist_ts/classes.resourcecoordinator.js +294 -0
  54. package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
  55. package/dist_ts/classes.sessionintelligencereader.js +40 -0
  56. package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
  57. package/dist_ts/classes.systemmetricssampler.js +168 -0
  58. package/dist_ts/classes.terminalmanager.d.ts +95 -0
  59. package/dist_ts/classes.terminalmanager.js +981 -0
  60. package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
  61. package/dist_ts/classes.terminalresourcehost.js +84 -0
  62. package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
  63. package/dist_ts/classes.upgradecoordinator.js +2155 -0
  64. package/dist_ts/classes.upgradetransaction.d.ts +92 -0
  65. package/dist_ts/classes.upgradetransaction.js +2125 -0
  66. package/dist_ts/classes.uploadmanager.d.ts +24 -0
  67. package/dist_ts/classes.uploadmanager.js +210 -0
  68. package/dist_ts/classes.validation.d.ts +91 -0
  69. package/dist_ts/classes.validation.js +1087 -0
  70. package/dist_ts/flexharness.child.d.ts +1 -0
  71. package/dist_ts/flexharness.child.js +28 -0
  72. package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
  73. package/dist_ts/functions.canonicaldirectory.js +144 -0
  74. package/dist_ts/functions.controllerdataroot.d.ts +15 -0
  75. package/dist_ts/functions.controllerdataroot.js +76 -0
  76. package/dist_ts/functions.embeddeddb.d.ts +2 -0
  77. package/dist_ts/functions.embeddeddb.js +21 -0
  78. package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
  79. package/dist_ts/functions.flexcredentialstore.js +93 -0
  80. package/dist_ts/functions.opencodeauth.d.ts +3 -0
  81. package/dist_ts/functions.opencodeauth.js +31 -0
  82. package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
  83. package/dist_ts/functions.runtimeenvironment.js +79 -0
  84. package/dist_ts/functions.upgradefollower.d.ts +3 -0
  85. package/dist_ts/functions.upgradefollower.js +95 -0
  86. package/dist_ts/index.d.ts +24 -0
  87. package/dist_ts/index.js +25 -0
  88. package/dist_ts/interfaces.auth.d.ts +181 -0
  89. package/dist_ts/interfaces.auth.js +82 -0
  90. package/dist_ts/interfaces.config.d.ts +34 -0
  91. package/dist_ts/interfaces.config.js +2 -0
  92. package/dist_ts/interfaces.flexipc.d.ts +939 -0
  93. package/dist_ts/interfaces.flexipc.js +1492 -0
  94. package/dist_ts/interfaces.gitreversion.d.ts +246 -0
  95. package/dist_ts/interfaces.gitreversion.js +2 -0
  96. package/dist_ts/interfaces.lifecycle.d.ts +37 -0
  97. package/dist_ts/interfaces.lifecycle.js +2 -0
  98. package/dist_ts/interfaces.opencode.d.ts +101 -0
  99. package/dist_ts/interfaces.opencode.js +3 -0
  100. package/dist_ts/interfaces.projects.d.ts +156 -0
  101. package/dist_ts/interfaces.projects.js +5 -0
  102. package/dist_ts/plugins.d.ts +36 -0
  103. package/dist_ts/plugins.js +40 -0
  104. package/dist_ts_interfaces/index.d.ts +2 -0
  105. package/dist_ts_interfaces/index.js +3 -0
  106. package/dist_ts_interfaces/interfaces.d.ts +747 -0
  107. package/dist_ts_interfaces/interfaces.js +47 -0
  108. package/dist_ts_interfaces/plugins.d.ts +4 -0
  109. package/dist_ts_interfaces/plugins.js +3 -0
  110. package/dist_ts_interfaces/requests.d.ts +806 -0
  111. package/dist_ts_interfaces/requests.js +2 -0
  112. package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
  113. package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
  114. package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
  115. package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
  116. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
  117. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
  118. package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
  119. package/dist_ts_migration/classes.migrationrunner.js +34 -0
  120. package/dist_ts_migration/index.d.ts +12 -0
  121. package/dist_ts_migration/index.js +13 -0
  122. package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
  123. package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
  124. package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
  125. package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
  126. package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
  127. package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
  128. package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
  129. package/dist_ts_migration/v18_resourcelayout.js +23 -0
  130. package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
  131. package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
  132. package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
  133. package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
  134. package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
  135. package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
  136. package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
  137. package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
  138. package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
  139. package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
  140. package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
  141. package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
  142. package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
  143. package/dist_ts_migration/v6_protocoldocuments.js +138 -0
  144. package/html/index.html +13 -0
  145. package/{LICENSE → license.md} +2 -2
  146. package/package.json +86 -48
  147. package/readme.md +480 -0
  148. package/readme.plan.md +188 -0
  149. package/ts/00_commitinfo_data.ts +8 -0
  150. package/ts/classes.authmodels.ts +1245 -0
  151. package/ts/classes.authstore.ts +3274 -0
  152. package/ts/classes.browserresourcehost.ts +1205 -0
  153. package/ts/classes.cli.ts +1254 -0
  154. package/ts/classes.config.ts +351 -0
  155. package/ts/classes.controller.ts +14426 -0
  156. package/ts/classes.controllermanagement.ts +330 -0
  157. package/ts/classes.draftmanager.ts +232 -0
  158. package/ts/classes.embeddeddb.ts +166 -0
  159. package/ts/classes.flexframedtransport.ts +283 -0
  160. package/ts/classes.flexmodels.private.ts +823 -0
  161. package/ts/classes.flexmodels.public.ts +732 -0
  162. package/ts/classes.flexprojectionreader.ts +816 -0
  163. package/ts/classes.flexservice.ts +4302 -0
  164. package/ts/classes.flexstore.ts +4565 -0
  165. package/ts/classes.flexsupervisor.ts +1453 -0
  166. package/ts/classes.gitreversion.ts +13353 -0
  167. package/ts/classes.harnessoperationmanager.ts +870 -0
  168. package/ts/classes.opencodeclient.ts +4110 -0
  169. package/ts/classes.opencodesupervisor.ts +1280 -0
  170. package/ts/classes.passkeymanager.ts +570 -0
  171. package/ts/classes.processinspection.ts +623 -0
  172. package/ts/classes.resourcecoordinator.ts +436 -0
  173. package/ts/classes.sessionintelligencereader.ts +52 -0
  174. package/ts/classes.systemmetricssampler.ts +215 -0
  175. package/ts/classes.terminalmanager.ts +1207 -0
  176. package/ts/classes.terminalresourcehost.ts +122 -0
  177. package/ts/classes.upgradecoordinator.ts +2675 -0
  178. package/ts/classes.upgradetransaction.ts +2900 -0
  179. package/ts/classes.uploadmanager.ts +240 -0
  180. package/ts/classes.validation.ts +1409 -0
  181. package/ts/flexharness.child.ts +35 -0
  182. package/ts/functions.canonicaldirectory.ts +213 -0
  183. package/ts/functions.controllerdataroot.ts +107 -0
  184. package/ts/functions.embeddeddb.ts +22 -0
  185. package/ts/functions.flexcredentialstore.ts +128 -0
  186. package/ts/functions.opencodeauth.ts +34 -0
  187. package/ts/functions.runtimeenvironment.ts +90 -0
  188. package/ts/functions.upgradefollower.ts +115 -0
  189. package/ts/index.ts +36 -6
  190. package/ts/interfaces.auth.ts +316 -0
  191. package/ts/interfaces.config.ts +37 -0
  192. package/ts/interfaces.flexipc.ts +2586 -0
  193. package/ts/interfaces.gitreversion.ts +336 -0
  194. package/ts/interfaces.lifecycle.ts +46 -0
  195. package/ts/interfaces.opencode.ts +153 -0
  196. package/ts/interfaces.projects.ts +182 -0
  197. package/ts/plugins.ts +64 -0
  198. package/ts_interfaces/index.ts +2 -0
  199. package/ts_interfaces/interfaces.ts +827 -0
  200. package/ts_interfaces/plugins.ts +15 -0
  201. package/ts_interfaces/requests.ts +1186 -0
  202. package/ts_migration/classes.documentmigrationrunner.ts +32 -0
  203. package/ts_migration/classes.flexmigrationrunner.ts +33 -0
  204. package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
  205. package/ts_migration/classes.migrationrunner.ts +40 -0
  206. package/ts_migration/index.ts +12 -0
  207. package/ts_migration/v10_flexharnessv3migration.ts +35 -0
  208. package/ts_migration/v13_flexprojectionorder.ts +33 -0
  209. package/ts_migration/v16_flexprovidercredentials.ts +196 -0
  210. package/ts_migration/v18_resourcelayout.ts +55 -0
  211. package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
  212. package/ts_migration/v19_flexprojectmanagement.ts +28 -0
  213. package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
  214. package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
  215. package/ts_migration/v2_controllerdataroot.ts +2349 -0
  216. package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
  217. package/ts_migration/v6_protocoldocuments.ts +198 -0
  218. package/ts_web/00_commitinfo_data.ts +8 -0
  219. package/ts_web/classes.controllersocketclient.ts +517 -0
  220. package/ts_web/classes.sessiondraftsync.ts +390 -0
  221. package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
  222. package/ts_web/index.ts +2 -0
  223. package/ts_web/plugins.ts +31 -0
  224. package/.gitlab-ci.yml +0 -71
  225. package/.npmignore +0 -5
  226. package/README.md +0 -40
  227. package/dist/cli.js +0 -2
  228. package/dist/index.d.ts +0 -0
  229. package/dist/index.js +0 -9
  230. package/dist/mod_bundle/index.d.ts +0 -1
  231. package/dist/mod_bundle/index.js +0 -18
  232. package/dist/mod_bundle/mod.plugins.d.ts +0 -4
  233. package/dist/mod_bundle/mod.plugins.js +0 -11
  234. package/dist/mod_install/index.d.ts +0 -4
  235. package/dist/mod_install/index.js +0 -21
  236. package/dist/mod_install/mod.plugins.d.ts +0 -1
  237. package/dist/mod_install/mod.plugins.js +0 -7
  238. package/dist/mod_standard/index.d.ts +0 -4
  239. package/dist/mod_standard/index.js +0 -21
  240. package/dist/mod_standard/mod.browser.d.ts +0 -6
  241. package/dist/mod_standard/mod.browser.js +0 -14
  242. package/dist/mod_standard/mod.clean.d.ts +0 -4
  243. package/dist/mod_standard/mod.clean.js +0 -12
  244. package/dist/mod_standard/mod.compile.d.ts +0 -4
  245. package/dist/mod_standard/mod.compile.js +0 -21
  246. package/dist/mod_standard/mod.plugins.d.ts +0 -8
  247. package/dist/mod_standard/mod.plugins.js +0 -19
  248. package/dist/mod_standard/mod.test.d.ts +0 -4
  249. package/dist/mod_standard/mod.test.js +0 -12
  250. package/dist/plr.cli.d.ts +0 -3
  251. package/dist/plr.cli.js +0 -57
  252. package/dist/plr.config.d.ts +0 -11
  253. package/dist/plr.config.js +0 -26
  254. package/dist/plr.mods.d.ts +0 -17
  255. package/dist/plr.mods.js +0 -17
  256. package/dist/plr.paths.d.ts +0 -19
  257. package/dist/plr.paths.js +0 -26
  258. package/dist/plr.plugins.d.ts +0 -8
  259. package/dist/plr.plugins.js +0 -16
  260. package/npmextra.json +0 -10
  261. package/ts/mod_bundle/index.ts +0 -20
  262. package/ts/mod_bundle/mod.plugins.ts +0 -9
  263. package/ts/mod_install/index.ts +0 -20
  264. package/ts/mod_install/mod.plugins.ts +0 -1
  265. package/ts/mod_standard/index.ts +0 -23
  266. package/ts/mod_standard/mod.browser.ts +0 -17
  267. package/ts/mod_standard/mod.clean.ts +0 -13
  268. package/ts/mod_standard/mod.compile.ts +0 -23
  269. package/ts/mod_standard/mod.plugins.ts +0 -17
  270. package/ts/mod_standard/mod.test.ts +0 -13
  271. package/ts/plr.cli.ts +0 -60
  272. package/ts/plr.config.ts +0 -36
  273. package/ts/plr.mods.ts +0 -25
  274. package/ts/plr.paths.ts +0 -29
  275. package/ts/plr.plugins.ts +0 -17
  276. package/tslint.json +0 -3
  277. package/yarn.lock +0 -3464
@@ -0,0 +1,32 @@
1
+ import { type IControllerStatus, type IReq_ControllerUpgradeLaunch, type IReq_ControllerUpgradePrepareBegin, type IReq_ControllerUpgradeFinalize } from '../dist_ts_interfaces/index.js';
2
+ export interface IControllerStatusExpectation {
3
+ packageName: string;
4
+ packageVersion: string;
5
+ protocolVersion?: number;
6
+ upgradeManagementVersion: number;
7
+ }
8
+ export declare const controllerUpgradePrepareBeginRequestTimeoutMs = 30000;
9
+ export declare const assertControllerStatus: (statusArg: unknown, expectationArg: IControllerStatusExpectation) => IControllerStatus;
10
+ export declare const requestControllerUpgradePrepareBegin: (portArg: number, tokenArg: string, targetVersionArg: string, gracePeriodMsArg: number) => Promise<IReq_ControllerUpgradePrepareBegin["response"]>;
11
+ export declare const requestControllerUpgradeFinalize: (portArg: number, tokenArg: string, modeArg: IReq_ControllerUpgradeFinalize["request"]["mode"], timeoutMsArg?: number) => Promise<IReq_ControllerUpgradeFinalize["response"]>;
12
+ export declare const queryControllerStatus: (portArg: number, expectationArg: IControllerStatusExpectation, timeoutMsArg?: number) => Promise<IControllerStatus>;
13
+ export declare const tryQueryControllerStatus: (portArg: number, expectationArg: IControllerStatusExpectation) => Promise<IControllerStatus | undefined>;
14
+ export declare const isLoopbackPortListening: (portArg: number, timeoutMsArg?: number) => Promise<boolean>;
15
+ export declare const requestControllerUpgradeLaunch: (portArg: number, tokenArg: string, timeoutMsArg?: number) => Promise<IReq_ControllerUpgradeLaunch["response"]>;
16
+ export declare const waitUntilControllerExited: (optionsArg: {
17
+ pid: number;
18
+ cliPath: string;
19
+ port: number;
20
+ expectedProcessGroupId: number;
21
+ expectedFingerprint: string;
22
+ command: "__serve" | "foreground";
23
+ }, timeoutMsArg: number) => Promise<boolean>;
24
+ export declare const resolveControllerStopSignal: (statusArg: IControllerStatus, phaseArg: "cooperative" | "hard") => {
25
+ signal: NodeJS.Signals;
26
+ signalProcessGroup: boolean;
27
+ };
28
+ export declare const stopVerifiedController: (optionsArg: {
29
+ status: IControllerStatus;
30
+ cliPath: string;
31
+ port: number;
32
+ }) => Promise<void>;
@@ -0,0 +1,222 @@
1
+ import * as plugins from './plugins.js';
2
+ import { controllerPackageName, } from '../dist_ts_interfaces/index.js';
3
+ import { inspectControllerProcess, signalVerifiedControllerProcess, } from './classes.processinspection.js';
4
+ const currentCliName = String(controllerPackageName) === 'agl' ? 'agl' : 'hcon';
5
+ const currentRuntimeName = currentCliName === 'agl' ? 'AGL' : currentCliName;
6
+ const harnessStates = ['starting', 'ready', 'stopping', 'stopped', 'failed'];
7
+ export const controllerUpgradePrepareBeginRequestTimeoutMs = 30_000;
8
+ const isControllerHarnessStatus = (statusArg) => {
9
+ if (typeof statusArg !== 'object' || statusArg === null)
10
+ return false;
11
+ const status = statusArg;
12
+ return ((status.harnessId === 'opencode' || status.harnessId === 'flex')
13
+ && harnessStates.some((stateArg) => status.state === stateArg)
14
+ && typeof status.healthy === 'boolean'
15
+ && (status.pid === undefined || Number.isSafeInteger(status.pid))
16
+ && (status.version === undefined || typeof status.version === 'string'));
17
+ };
18
+ const isControllerUpgradeStatus = (statusArg) => {
19
+ if (!statusArg || typeof statusArg !== 'object' || Array.isArray(statusArg))
20
+ return false;
21
+ const status = statusArg;
22
+ return Object.keys(status).length === 3
23
+ && typeof status.fromVersion === 'string'
24
+ && status.fromVersion.length > 0
25
+ && Buffer.byteLength(status.fromVersion, 'utf8') <= 128
26
+ && typeof status.toVersion === 'string'
27
+ && status.toVersion.length > 0
28
+ && Buffer.byteLength(status.toVersion, 'utf8') <= 128
29
+ && typeof status.phase === 'string'
30
+ && ['preparing', 'pausing', 'installing', 'restarting', 'continuing', 'completed', 'failed']
31
+ .includes(status.phase);
32
+ };
33
+ export const assertControllerStatus = (statusArg, expectationArg) => {
34
+ if (typeof statusArg !== 'object' || statusArg === null) {
35
+ throw new Error(`The service on the management port is not an ${currentRuntimeName} endpoint.`);
36
+ }
37
+ const status = statusArg;
38
+ const harnesses = Array.isArray(status.harnesses) ? status.harnesses : [];
39
+ const openCode = harnesses.find((entryArg) => entryArg?.harnessId === 'opencode');
40
+ const flex = harnesses.find((entryArg) => entryArg?.harnessId === 'flex');
41
+ if (status.packageName !== expectationArg.packageName
42
+ || status.packageVersion !== expectationArg.packageVersion
43
+ || (expectationArg.protocolVersion !== undefined
44
+ && status.protocolVersion !== expectationArg.protocolVersion)
45
+ || status.upgradeManagementVersion !== expectationArg.upgradeManagementVersion
46
+ || !Number.isSafeInteger(status.controllerPid)
47
+ || !Number.isSafeInteger(status.processGroupId)
48
+ || typeof status.processFingerprint !== 'string'
49
+ || status.processFingerprint.length < 8
50
+ || status.processFingerprint.length > 256
51
+ || (status.processMode !== 'detached' && status.processMode !== 'foreground')
52
+ || (status.lifecycleState !== 'starting'
53
+ && status.lifecycleState !== 'ready'
54
+ && status.lifecycleState !== 'stopping'
55
+ && status.lifecycleState !== 'stopped')
56
+ || typeof status.startedAt !== 'number'
57
+ || typeof status.setupRequired !== 'boolean'
58
+ || (status.upgrade !== undefined && !isControllerUpgradeStatus(status.upgrade))
59
+ || harnesses.length !== 2
60
+ || !openCode
61
+ || !flex
62
+ || !harnesses.every((entryArg) => isControllerHarnessStatus(entryArg))) {
63
+ throw new Error('The service on the management port has an incompatible controller identity.');
64
+ }
65
+ return status;
66
+ };
67
+ export const requestControllerUpgradePrepareBegin = async (portArg, tokenArg, targetVersionArg, gracePeriodMsArg) => {
68
+ const abortController = new AbortController();
69
+ const timeout = setTimeout(() => abortController.abort(), controllerUpgradePrepareBeginRequestTimeoutMs);
70
+ let socket;
71
+ try {
72
+ socket = await plugins.typedsocket.TypedSocket.createClient(new plugins.typedrequest.TypedRouter(), `http://127.0.0.1:${portArg}`, {
73
+ autoReconnect: false,
74
+ maxRetries: 0,
75
+ abortSignal: abortController.signal,
76
+ });
77
+ const response = await socket.createTypedRequest('controller.upgrade.prepare.begin', undefined, {
78
+ timeoutMs: controllerUpgradePrepareBeginRequestTimeoutMs,
79
+ abortSignal: abortController.signal,
80
+ }).fire({ token: tokenArg, targetVersion: targetVersionArg, gracePeriodMs: gracePeriodMsArg });
81
+ if (!response
82
+ || typeof response !== 'object'
83
+ || Array.isArray(response)
84
+ || Object.keys(response).length !== 1
85
+ || response.accepted !== true)
86
+ throw new Error('The controller returned an invalid upgrade preparation response.');
87
+ return response;
88
+ }
89
+ finally {
90
+ clearTimeout(timeout);
91
+ await socket?.stop();
92
+ }
93
+ };
94
+ export const requestControllerUpgradeFinalize = async (portArg, tokenArg, modeArg, timeoutMsArg = 60_000) => {
95
+ const socket = await plugins.typedsocket.TypedSocket.createClient(new plugins.typedrequest.TypedRouter(), `http://127.0.0.1:${portArg}`, { autoReconnect: false, maxRetries: 0 });
96
+ try {
97
+ return await socket.createTypedRequest('controller.upgrade.finalize', undefined, { timeoutMs: timeoutMsArg }).fire({ token: tokenArg, mode: modeArg });
98
+ }
99
+ finally {
100
+ await socket.stop();
101
+ }
102
+ };
103
+ export const queryControllerStatus = async (portArg, expectationArg, timeoutMsArg = 2_500) => {
104
+ const abortController = new AbortController();
105
+ const timeout = setTimeout(() => abortController.abort(), timeoutMsArg);
106
+ let socket;
107
+ try {
108
+ const router = new plugins.typedrequest.TypedRouter();
109
+ socket = await plugins.typedsocket.TypedSocket.createClient(router, `http://127.0.0.1:${portArg}`, {
110
+ autoReconnect: false,
111
+ maxRetries: 0,
112
+ abortSignal: abortController.signal,
113
+ });
114
+ const request = socket.createTypedRequest('controller.status', undefined, { timeoutMs: timeoutMsArg, abortSignal: abortController.signal });
115
+ return assertControllerStatus(await request.fire({}), expectationArg);
116
+ }
117
+ finally {
118
+ clearTimeout(timeout);
119
+ await socket?.stop();
120
+ }
121
+ };
122
+ export const tryQueryControllerStatus = async (portArg, expectationArg) => {
123
+ try {
124
+ return await queryControllerStatus(portArg, expectationArg);
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ };
130
+ export const isLoopbackPortListening = async (portArg, timeoutMsArg = 500) => {
131
+ return await new Promise((resolve) => {
132
+ const socket = plugins.net.createConnection({ host: '127.0.0.1', port: portArg });
133
+ let settled = false;
134
+ const finish = (resultArg) => {
135
+ if (settled)
136
+ return;
137
+ settled = true;
138
+ clearTimeout(timeout);
139
+ socket.destroy();
140
+ resolve(resultArg);
141
+ };
142
+ const timeout = setTimeout(() => finish(false), timeoutMsArg);
143
+ socket.once('connect', () => finish(true));
144
+ socket.once('error', () => finish(false));
145
+ });
146
+ };
147
+ export const requestControllerUpgradeLaunch = async (portArg, tokenArg, timeoutMsArg = 15_000) => {
148
+ const abortController = new AbortController();
149
+ const timeout = setTimeout(() => abortController.abort(), timeoutMsArg);
150
+ let socket;
151
+ try {
152
+ const router = new plugins.typedrequest.TypedRouter();
153
+ socket = await plugins.typedsocket.TypedSocket.createClient(router, `http://127.0.0.1:${portArg}`, {
154
+ autoReconnect: false,
155
+ maxRetries: 0,
156
+ abortSignal: abortController.signal,
157
+ });
158
+ const response = await socket.createTypedRequest('controller.upgrade.launch', undefined, { timeoutMs: timeoutMsArg, abortSignal: abortController.signal }).fire({ token: tokenArg });
159
+ if (!response
160
+ || typeof response !== 'object'
161
+ || response.accepted !== true
162
+ || !Number.isSafeInteger(response.workerPid)
163
+ || response.workerPid < 2
164
+ || typeof response.logFilePath !== 'string'
165
+ || !plugins.path.isAbsolute(response.logFilePath)) {
166
+ throw new Error(`The controller returned an invalid ${currentCliName} upgrade launch response.`);
167
+ }
168
+ return response;
169
+ }
170
+ finally {
171
+ clearTimeout(timeout);
172
+ await socket?.stop();
173
+ }
174
+ };
175
+ export const waitUntilControllerExited = async (optionsArg, timeoutMsArg) => {
176
+ const deadline = Date.now() + timeoutMsArg;
177
+ while (Date.now() < deadline) {
178
+ if (!await inspectControllerProcess(optionsArg))
179
+ return true;
180
+ await new Promise((resolve) => setTimeout(resolve, 150));
181
+ }
182
+ return !await inspectControllerProcess(optionsArg);
183
+ };
184
+ export const resolveControllerStopSignal = (statusArg, phaseArg) => {
185
+ if (phaseArg === 'cooperative') {
186
+ return { signal: 'SIGTERM', signalProcessGroup: false };
187
+ }
188
+ const signalProcessGroup = statusArg.processMode === 'detached';
189
+ if (signalProcessGroup && statusArg.processGroupId !== statusArg.controllerPid) {
190
+ throw new Error('The detached controller is not the verified leader of its process group.');
191
+ }
192
+ return { signal: 'SIGKILL', signalProcessGroup };
193
+ };
194
+ export const stopVerifiedController = async (optionsArg) => {
195
+ const command = optionsArg.status.processMode === 'detached'
196
+ ? '__serve'
197
+ : 'foreground';
198
+ const processIdentity = {
199
+ pid: optionsArg.status.controllerPid,
200
+ cliPath: optionsArg.cliPath,
201
+ port: optionsArg.port,
202
+ expectedProcessGroupId: optionsArg.status.processGroupId,
203
+ expectedFingerprint: optionsArg.status.processFingerprint,
204
+ command,
205
+ };
206
+ const cooperativeSignal = resolveControllerStopSignal(optionsArg.status, 'cooperative');
207
+ await signalVerifiedControllerProcess({
208
+ ...processIdentity,
209
+ ...cooperativeSignal,
210
+ });
211
+ if (await waitUntilControllerExited(processIdentity, 30_000))
212
+ return;
213
+ const hardSignal = resolveControllerStopSignal(optionsArg.status, 'hard');
214
+ await signalVerifiedControllerProcess({
215
+ ...processIdentity,
216
+ ...hardSignal,
217
+ });
218
+ if (!await waitUntilControllerExited(processIdentity, 15_000)) {
219
+ throw new Error('The exact controller process survived verified hard-stop escalation.');
220
+ }
221
+ };
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb250cm9sbGVybWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuY29udHJvbGxlcm1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLHFCQUFxQixHQU10QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsK0JBQStCLEdBQ2hDLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRixNQUFNLGtCQUFrQixHQUFHLGNBQWMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO0FBUzdFLE1BQU0sYUFBYSxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLDZDQUE2QyxHQUFHLE1BQU0sQ0FBQztBQUVwRSxNQUFNLHlCQUF5QixHQUFHLENBQUMsU0FBa0IsRUFBVyxFQUFFO0lBQ2hFLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsU0FBb0MsQ0FBQztJQUNwRCxPQUFPLENBQ0wsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQztXQUM3RCxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FB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
@@ -0,0 +1,30 @@
1
+ import { type IControllerDraftAttachment, type IControllerSessionDraft, type IControllerSessionDraftUpdate } from '../dist_ts_interfaces/interfaces.js';
2
+ export declare class ControllerDraftConflictError extends Error {
3
+ readonly draft: IControllerSessionDraft;
4
+ constructor(draft: IControllerSessionDraft);
5
+ }
6
+ export declare class ControllerDraftLimitError extends Error {
7
+ constructor(messageArg: string);
8
+ }
9
+ export interface IControllerDraftMutationResult {
10
+ draft: IControllerSessionDraft;
11
+ update?: IControllerSessionDraftUpdate;
12
+ }
13
+ export declare class ControllerDraftManager {
14
+ private readonly drafts;
15
+ private nonEmptyDrafts;
16
+ private aggregateAttachmentBytes;
17
+ get(keyArg: string): IControllerSessionDraft;
18
+ update(keyArg: string, expectedRevisionArg: number, patchArg: {
19
+ text?: string;
20
+ attachments?: readonly IControllerDraftAttachment[];
21
+ }): IControllerDraftMutationResult;
22
+ snapshot(keyArg: string, revisionArg: number): IControllerSessionDraft;
23
+ clearExact(keyArg: string, revisionArg: number): IControllerDraftMutationResult;
24
+ purge(keyArg: string): void;
25
+ purgePrefix(prefixArg: string): void;
26
+ clear(): void;
27
+ private assertDraftFields;
28
+ private assertAdmission;
29
+ private store;
30
+ }
@@ -0,0 +1,179 @@
1
+ import { controllerMaxDraftAttachmentBytes, controllerMaxDraftAttachmentTotalBytes, controllerMaxDraftAttachments, controllerMaxDraftTextBytes, } from '../dist_ts_interfaces/interfaces.js';
2
+ const maximumDraftIdentities = 4_096;
3
+ const maximumNonEmptyDrafts = 512;
4
+ const maximumAggregateAttachmentBytes = 64 * 1024 * 1024;
5
+ export class ControllerDraftConflictError extends Error {
6
+ draft;
7
+ constructor(draft) {
8
+ super('The composer draft changed concurrently.');
9
+ this.draft = draft;
10
+ this.name = 'ControllerDraftConflictError';
11
+ }
12
+ }
13
+ export class ControllerDraftLimitError extends Error {
14
+ constructor(messageArg) {
15
+ super(messageArg);
16
+ this.name = 'ControllerDraftLimitError';
17
+ }
18
+ }
19
+ const cloneAttachment = (attachmentArg) => ({ ...attachmentArg });
20
+ const cloneDraft = (draftArg) => ({
21
+ text: draftArg.text,
22
+ attachments: draftArg.attachments.map(cloneAttachment),
23
+ revision: draftArg.revision,
24
+ });
25
+ const emptyDraft = () => ({ text: '', attachments: [], revision: 0 });
26
+ const attachmentBytes = (draftArg) => (draftArg.attachments.reduce((sum, attachment) => sum + attachment.size, 0));
27
+ const isNonEmpty = (draftArg) => (draftArg.text.length > 0 || draftArg.attachments.length > 0);
28
+ const attachmentsEqual = (leftArg, rightArg) => leftArg.length === rightArg.length && leftArg.every((left, index) => {
29
+ const right = rightArg[index];
30
+ return right !== undefined
31
+ && left.id === right.id
32
+ && left.name === right.name
33
+ && left.mediaType === right.mediaType
34
+ && left.size === right.size
35
+ && left.kind === right.kind
36
+ && left.dataBase64 === right.dataBase64;
37
+ });
38
+ export class ControllerDraftManager {
39
+ drafts = new Map();
40
+ nonEmptyDrafts = 0;
41
+ aggregateAttachmentBytes = 0;
42
+ get(keyArg) {
43
+ return cloneDraft(this.drafts.get(keyArg) ?? emptyDraft());
44
+ }
45
+ update(keyArg, expectedRevisionArg, patchArg) {
46
+ const current = this.drafts.get(keyArg) ?? emptyDraft();
47
+ if (current.revision !== expectedRevisionArg) {
48
+ throw new ControllerDraftConflictError(cloneDraft(current));
49
+ }
50
+ if (patchArg.text === undefined && patchArg.attachments === undefined) {
51
+ throw new Error('A draft update must replace text, attachments, or both.');
52
+ }
53
+ const nextText = patchArg.text ?? current.text;
54
+ const nextAttachments = patchArg.attachments === undefined
55
+ ? current.attachments
56
+ : patchArg.attachments.map(cloneAttachment);
57
+ this.assertDraftFields(nextText, nextAttachments);
58
+ const textChanged = nextText !== current.text;
59
+ const attachmentsChanged = !attachmentsEqual(nextAttachments, current.attachments);
60
+ if (!textChanged && !attachmentsChanged)
61
+ return { draft: cloneDraft(current) };
62
+ if (current.revision >= Number.MAX_SAFE_INTEGER) {
63
+ throw new ControllerDraftLimitError('The draft revision limit was reached.');
64
+ }
65
+ const next = {
66
+ text: nextText,
67
+ attachments: nextAttachments,
68
+ revision: current.revision + 1,
69
+ };
70
+ this.assertAdmission(keyArg, current, next);
71
+ this.store(keyArg, current, next);
72
+ return {
73
+ draft: cloneDraft(next),
74
+ update: {
75
+ revision: next.revision,
76
+ ...(textChanged ? { text: next.text } : {}),
77
+ ...(attachmentsChanged
78
+ ? { attachments: next.attachments.map(cloneAttachment) }
79
+ : {}),
80
+ },
81
+ };
82
+ }
83
+ snapshot(keyArg, revisionArg) {
84
+ const current = this.drafts.get(keyArg) ?? emptyDraft();
85
+ if (current.revision !== revisionArg) {
86
+ throw new ControllerDraftConflictError(cloneDraft(current));
87
+ }
88
+ if (current.revision >= Number.MAX_SAFE_INTEGER) {
89
+ throw new ControllerDraftLimitError('The draft revision limit was reached.');
90
+ }
91
+ if (!current.text.trim())
92
+ throw new Error('The composer draft text must not be blank.');
93
+ return cloneDraft(current);
94
+ }
95
+ clearExact(keyArg, revisionArg) {
96
+ const current = this.drafts.get(keyArg);
97
+ if (!current || current.revision !== revisionArg) {
98
+ return { draft: cloneDraft(current ?? emptyDraft()) };
99
+ }
100
+ if (current.revision >= Number.MAX_SAFE_INTEGER) {
101
+ throw new ControllerDraftLimitError('The draft revision limit was reached.');
102
+ }
103
+ const next = {
104
+ text: '',
105
+ attachments: [],
106
+ revision: current.revision + 1,
107
+ };
108
+ this.store(keyArg, current, next);
109
+ return {
110
+ draft: cloneDraft(next),
111
+ update: { revision: next.revision, text: '', attachments: [] },
112
+ };
113
+ }
114
+ purge(keyArg) {
115
+ const current = this.drafts.get(keyArg);
116
+ if (!current)
117
+ return;
118
+ this.drafts.delete(keyArg);
119
+ if (isNonEmpty(current))
120
+ this.nonEmptyDrafts -= 1;
121
+ this.aggregateAttachmentBytes -= attachmentBytes(current);
122
+ }
123
+ purgePrefix(prefixArg) {
124
+ for (const key of this.drafts.keys()) {
125
+ if (key.startsWith(prefixArg))
126
+ this.purge(key);
127
+ }
128
+ }
129
+ clear() {
130
+ this.drafts.clear();
131
+ this.nonEmptyDrafts = 0;
132
+ this.aggregateAttachmentBytes = 0;
133
+ }
134
+ assertDraftFields(textArg, attachmentsArg) {
135
+ if (Buffer.byteLength(textArg, 'utf8') > controllerMaxDraftTextBytes) {
136
+ throw new ControllerDraftLimitError('The draft text exceeds the controller byte limit.');
137
+ }
138
+ if (attachmentsArg.length > controllerMaxDraftAttachments) {
139
+ throw new ControllerDraftLimitError('The draft attachment count exceeds the controller limit.');
140
+ }
141
+ const ids = new Set();
142
+ let bytes = 0;
143
+ for (const attachment of attachmentsArg) {
144
+ if (ids.has(attachment.id))
145
+ throw new Error('Draft attachment IDs must be unique.');
146
+ ids.add(attachment.id);
147
+ if (attachment.size > controllerMaxDraftAttachmentBytes) {
148
+ throw new ControllerDraftLimitError('A draft attachment exceeds the controller byte limit.');
149
+ }
150
+ bytes += attachment.size;
151
+ }
152
+ if (bytes > controllerMaxDraftAttachmentTotalBytes) {
153
+ throw new ControllerDraftLimitError('The draft attachments exceed the controller total byte limit.');
154
+ }
155
+ }
156
+ assertAdmission(keyArg, currentArg, nextArg) {
157
+ if (!this.drafts.has(keyArg) && this.drafts.size >= maximumDraftIdentities) {
158
+ throw new ControllerDraftLimitError('The controller draft identity limit is exhausted.');
159
+ }
160
+ const nextNonEmptyCount = this.nonEmptyDrafts
161
+ - (isNonEmpty(currentArg) ? 1 : 0)
162
+ + (isNonEmpty(nextArg) ? 1 : 0);
163
+ if (nextNonEmptyCount > maximumNonEmptyDrafts) {
164
+ throw new ControllerDraftLimitError('The controller non-empty draft limit is exhausted.');
165
+ }
166
+ const nextAttachmentBytes = this.aggregateAttachmentBytes
167
+ - attachmentBytes(currentArg)
168
+ + attachmentBytes(nextArg);
169
+ if (nextAttachmentBytes > maximumAggregateAttachmentBytes) {
170
+ throw new ControllerDraftLimitError('The controller draft attachment memory limit is exhausted.');
171
+ }
172
+ }
173
+ store(keyArg, currentArg, nextArg) {
174
+ this.nonEmptyDrafts += (isNonEmpty(nextArg) ? 1 : 0) - (isNonEmpty(currentArg) ? 1 : 0);
175
+ this.aggregateAttachmentBytes += attachmentBytes(nextArg) - attachmentBytes(currentArg);
176
+ this.drafts.set(keyArg, nextArg);
177
+ }
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kcmFmdG1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmRyYWZ0bWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsMkJBQTJCLEdBSTVCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7QUFDckMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDbEMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUV6RCxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsS0FBSztJQUN6QjtJQUE1QixZQUE0QixLQUE4QjtRQUN4RCxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUR4QixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQUV4RCxJQUFJLENBQUMsSUFBSSxHQUFHLDhCQUE4QixDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBQ2xELFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBT0QsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsYUFBeUMsRUFDYixFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUV4RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWlDLEVBQTJCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtJQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQ3RELFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtDQUM1QixD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
@@ -0,0 +1,30 @@
1
+ export { embeddedDatabaseSocketPath } from './functions.embeddeddb.js';
2
+ export interface IEmbeddedControllerDatabaseOptions {
3
+ /** directory holding the smartdb storage files and its unix socket */
4
+ dataDirectory: string;
5
+ /** previous installed default, logically migrated only while its engine is stopped */
6
+ legacyDataDirectory?: string;
7
+ }
8
+ /**
9
+ * The controller's embedded database engine: a @push.rocks/smartdb
10
+ * LocalSmartDb over a unix socket inside the data directory. The socket
11
+ * path is deterministic so a second controller process (e.g. the
12
+ * temp-password CLI) attaches to the running daemon's engine instead of
13
+ * opening the storage files a second time; only the process that booted
14
+ * the engine stops it.
15
+ */
16
+ export declare class EmbeddedControllerDatabase {
17
+ private readonly options;
18
+ private localDb?;
19
+ private connectionUri?;
20
+ private startPromise?;
21
+ private migrationRunner?;
22
+ constructor(options: IEmbeddedControllerDatabaseOptions);
23
+ get socketPath(): string;
24
+ get ownsEngine(): boolean;
25
+ /** Starts (or attaches to) the engine and returns the smartdata-ready URI. */
26
+ start(): Promise<string>;
27
+ private startOnce;
28
+ stop(): Promise<void>;
29
+ private isSocketListening;
30
+ }