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,34 @@
1
+ import { type IAuthenticationBeginOptions, type IAuthenticationBeginResult, type IAuthenticationFinishOptions, type IAuthenticationResult, type IPasskeyManagerOptions, type ISetupBeginOptions, type ISetupBeginResult, type ISetupFinishOptions } from './interfaces.auth.js';
2
+ export declare class PasskeyManager {
3
+ private readonly store;
4
+ private readonly relyingPartyName;
5
+ private readonly webAuthn;
6
+ private readonly now;
7
+ private readonly setupAttemptLimit;
8
+ private readonly setupAttemptWindowMs;
9
+ private readonly authenticationAttemptLimitPerPeer;
10
+ private readonly authenticationAttemptWindowMs;
11
+ private readonly maxActiveSetupCeremonies;
12
+ private readonly maxActiveAuthenticationCeremonies;
13
+ private readonly setupAttemptTimestamps;
14
+ private readonly authenticationVerificationAttemptTimestamps;
15
+ private readonly authenticationAttemptTimestampsByPeer;
16
+ private ceremonyCreationTail;
17
+ constructor(optionsArg: IPasskeyManagerOptions);
18
+ getAuthState(): Promise<{
19
+ state: 'setupRequired' | 'ready';
20
+ setupCodeExpired: boolean;
21
+ }>;
22
+ beginSetup(optionsArg: ISetupBeginOptions): Promise<ISetupBeginResult>;
23
+ finishSetup(optionsArg: ISetupFinishOptions): Promise<IAuthenticationResult>;
24
+ preflightSetupFinish(optionsArg: ISetupFinishOptions): Promise<void>;
25
+ beginAuthentication(optionsArg: IAuthenticationBeginOptions): Promise<IAuthenticationBeginResult>;
26
+ finishAuthentication(optionsArg: IAuthenticationFinishOptions): Promise<IAuthenticationResult>;
27
+ preflightAuthenticationFinish(optionsArg: IAuthenticationFinishOptions): Promise<void>;
28
+ private currentTime;
29
+ private recordSetupAttempt;
30
+ private recordAuthenticationAttempt;
31
+ private assertCeremonyCapacity;
32
+ private assertConfiguredOrigin;
33
+ private withCeremonyCreationLock;
34
+ }
@@ -0,0 +1,456 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthError, } from './interfaces.auth.js';
3
+ const setupCeremonyLifetimeMs = 5 * 60 * 1000;
4
+ const authenticationCeremonyLifetimeMs = 2 * 60 * 1000;
5
+ const maxAuthenticationVerificationAttemptsPerWindow = 128;
6
+ const base64Url32BytePattern = /^[A-Za-z0-9_-]{43}$/;
7
+ const defaultWebAuthn = {
8
+ generateRegistrationOptions: plugins.simplewebauthnServer.generateRegistrationOptions,
9
+ verifyRegistrationResponse: plugins.simplewebauthnServer.verifyRegistrationResponse,
10
+ generateAuthenticationOptions: plugins.simplewebauthnServer.generateAuthenticationOptions,
11
+ verifyAuthenticationResponse: plugins.simplewebauthnServer.verifyAuthenticationResponse,
12
+ };
13
+ const requirePositiveLimit = (valueArg, labelArg, maximumArg = 10_000) => {
14
+ if (!Number.isSafeInteger(valueArg) || valueArg < 1 || valueArg > maximumArg) {
15
+ throw new Error(`${labelArg} must be a positive safe integer no greater than ${maximumArg}.`);
16
+ }
17
+ return valueArg;
18
+ };
19
+ const requirePeerId = (peerIdArg) => {
20
+ if (typeof peerIdArg !== 'string'
21
+ || peerIdArg.length === 0
22
+ || peerIdArg.length > 512
23
+ || peerIdArg.trim() !== peerIdArg) {
24
+ throw new AuthError('peer_mismatch', 'The connection identity is malformed.');
25
+ }
26
+ return peerIdArg;
27
+ };
28
+ const requireOrigin = (originArg) => {
29
+ if (typeof originArg !== 'string' || originArg.length === 0 || originArg.length > 2048) {
30
+ throw new AuthError('origin_mismatch', 'The request origin is malformed.');
31
+ }
32
+ try {
33
+ const origin = new URL(originArg);
34
+ if (origin.origin !== originArg
35
+ || (origin.protocol !== 'http:' && origin.protocol !== 'https:')
36
+ || origin.username.length > 0
37
+ || origin.password.length > 0
38
+ || origin.pathname !== '/'
39
+ || origin.search.length > 0
40
+ || origin.hash.length > 0) {
41
+ throw new Error('not an origin');
42
+ }
43
+ }
44
+ catch {
45
+ throw new AuthError('origin_mismatch', 'The request origin is malformed.');
46
+ }
47
+ return originArg;
48
+ };
49
+ const requireCeremonyId = (ceremonyIdArg) => {
50
+ if (typeof ceremonyIdArg !== 'string' || !base64Url32BytePattern.test(ceremonyIdArg)) {
51
+ throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony identifier is malformed.');
52
+ }
53
+ return ceremonyIdArg;
54
+ };
55
+ const randomBase64Url = () => plugins.crypto.randomBytes(32).toString('base64url');
56
+ const base64UrlValuesEqual = (leftArg, rightArg) => {
57
+ if (!base64Url32BytePattern.test(leftArg) || !base64Url32BytePattern.test(rightArg)) {
58
+ return false;
59
+ }
60
+ const left = Buffer.from(leftArg, 'base64url');
61
+ const right = Buffer.from(rightArg, 'base64url');
62
+ return left.byteLength === right.byteLength && plugins.crypto.timingSafeEqual(left, right);
63
+ };
64
+ export class PasskeyManager {
65
+ store;
66
+ relyingPartyName;
67
+ webAuthn;
68
+ now;
69
+ setupAttemptLimit;
70
+ setupAttemptWindowMs;
71
+ authenticationAttemptLimitPerPeer;
72
+ authenticationAttemptWindowMs;
73
+ maxActiveSetupCeremonies;
74
+ maxActiveAuthenticationCeremonies;
75
+ setupAttemptTimestamps = [];
76
+ authenticationVerificationAttemptTimestamps = [];
77
+ authenticationAttemptTimestampsByPeer = new Map();
78
+ ceremonyCreationTail = Promise.resolve();
79
+ constructor(optionsArg) {
80
+ this.store = optionsArg.store;
81
+ this.relyingPartyName = optionsArg.relyingPartyName ?? 'Agent Gateway Layer';
82
+ if (this.relyingPartyName.trim().length === 0 || this.relyingPartyName.length > 128) {
83
+ throw new Error('relyingPartyName must contain 1-128 characters.');
84
+ }
85
+ this.webAuthn = optionsArg.webAuthn ?? defaultWebAuthn;
86
+ this.now = optionsArg.now ?? (() => new Date());
87
+ this.setupAttemptLimit = requirePositiveLimit(optionsArg.setupAttemptLimit ?? 10, 'setupAttemptLimit');
88
+ this.setupAttemptWindowMs = requirePositiveLimit(optionsArg.setupAttemptWindowMs ?? 60_000, 'setupAttemptWindowMs', 24 * 60 * 60 * 1000);
89
+ this.authenticationAttemptLimitPerPeer = requirePositiveLimit(optionsArg.authenticationAttemptLimitPerPeer ?? 6, 'authenticationAttemptLimitPerPeer');
90
+ this.authenticationAttemptWindowMs = requirePositiveLimit(optionsArg.authenticationAttemptWindowMs ?? 60_000, 'authenticationAttemptWindowMs', 24 * 60 * 60 * 1000);
91
+ this.maxActiveSetupCeremonies = requirePositiveLimit(optionsArg.maxActiveSetupCeremonies ?? 16, 'maxActiveSetupCeremonies');
92
+ this.maxActiveAuthenticationCeremonies = requirePositiveLimit(optionsArg.maxActiveAuthenticationCeremonies ?? 64, 'maxActiveAuthenticationCeremonies');
93
+ }
94
+ async getAuthState() {
95
+ const state = await this.store.getState();
96
+ return {
97
+ state: state.authState,
98
+ setupCodeExpired: state.setup !== null
99
+ && state.setup.expiresAt.getTime() <= this.currentTime().getTime(),
100
+ };
101
+ }
102
+ async beginSetup(optionsArg) {
103
+ const peerId = requirePeerId(optionsArg.peerId);
104
+ const origin = requireOrigin(optionsArg.origin);
105
+ return this.withCeremonyCreationLock(async () => {
106
+ const now = this.currentTime();
107
+ await this.assertCeremonyCapacity('setup', now);
108
+ const state = await this.store.getState();
109
+ this.assertConfiguredOrigin(origin, state.config.publicOrigin);
110
+ // the attempt budget must burn BEFORE the code is checked — a limiter
111
+ // that only counts correct codes throttles the legitimate operator and
112
+ // leaves guessing unmetered
113
+ this.recordSetupAttempt(now);
114
+ await this.store.assertSetupAuthority(optionsArg.setupCode, undefined, now);
115
+ if (!state.setup) {
116
+ throw new AuthError('setup_unavailable', 'Passkey setup is no longer available.');
117
+ }
118
+ const registrationOptions = await this.webAuthn.generateRegistrationOptions({
119
+ rpName: this.relyingPartyName,
120
+ rpID: state.config.rpId,
121
+ userName: 'agl',
122
+ userDisplayName: 'agl',
123
+ userID: Buffer.from(state.webauthnUserId, 'base64url'),
124
+ timeout: setupCeremonyLifetimeMs,
125
+ attestationType: 'none',
126
+ excludeCredentials: [],
127
+ authenticatorSelection: {
128
+ residentKey: 'required',
129
+ requireResidentKey: true,
130
+ userVerification: 'required',
131
+ },
132
+ });
133
+ const ceremonyId = randomBase64Url();
134
+ const expiresAt = new Date(Math.min(now.getTime() + setupCeremonyLifetimeMs, state.setup.expiresAt.getTime()));
135
+ const ceremony = {
136
+ id: ceremonyId,
137
+ kind: 'setup',
138
+ state: 'pending',
139
+ peerId,
140
+ challenge: registrationOptions.challenge,
141
+ origin,
142
+ rpId: state.config.rpId,
143
+ userId: state.webauthnUserId,
144
+ setupGeneration: state.setup.generation,
145
+ setupHash: state.setup.hash,
146
+ createdAt: now,
147
+ expiresAt,
148
+ };
149
+ await this.store.createCeremony(ceremony);
150
+ return { ceremonyId, options: registrationOptions };
151
+ });
152
+ }
153
+ async finishSetup(optionsArg) {
154
+ const peerId = requirePeerId(optionsArg.peerId);
155
+ const origin = requireOrigin(optionsArg.origin);
156
+ const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
157
+ const now = this.currentTime();
158
+ const stateBefore = await this.store.getState();
159
+ this.assertConfiguredOrigin(origin, stateBefore.config.publicOrigin);
160
+ // burn the attempt budget BEFORE consuming the ceremony: an exhausted
161
+ // budget must reject without destroying a still-valid ceremony, otherwise
162
+ // the user's authenticator keeps a credential the store never accepted
163
+ this.recordSetupAttempt(now);
164
+ const ceremony = await this.store.consumeCeremony({
165
+ ceremonyId,
166
+ kind: 'setup',
167
+ peerId,
168
+ origin,
169
+ rpId: stateBefore.config.rpId,
170
+ userId: stateBefore.webauthnUserId,
171
+ now,
172
+ });
173
+ if (ceremony.kind !== 'setup'
174
+ || typeof ceremony.setupGeneration !== 'string'
175
+ || typeof ceremony.setupHash !== 'string') {
176
+ throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony has the wrong kind.');
177
+ }
178
+ const setupCeremony = {
179
+ ...ceremony,
180
+ kind: 'setup',
181
+ setupGeneration: ceremony.setupGeneration,
182
+ setupHash: ceremony.setupHash,
183
+ };
184
+ await this.store.assertSetupAuthority(optionsArg.setupCode, setupCeremony, now);
185
+ let verification;
186
+ try {
187
+ verification = await this.webAuthn.verifyRegistrationResponse({
188
+ response: optionsArg.response,
189
+ expectedChallenge: ceremony.challenge,
190
+ expectedOrigin: ceremony.origin,
191
+ expectedRPID: ceremony.rpId,
192
+ requireUserPresence: true,
193
+ requireUserVerification: true,
194
+ });
195
+ }
196
+ catch (errorArg) {
197
+ throw new AuthError('verification_failed', 'Passkey registration verification failed.', {
198
+ cause: errorArg,
199
+ });
200
+ }
201
+ if (!verification.verified
202
+ || !verification.registrationInfo.userVerified
203
+ || verification.registrationInfo.credential.id !== optionsArg.response.id) {
204
+ throw new AuthError('verification_failed', 'Passkey registration verification failed.');
205
+ }
206
+ const verifiedCredential = verification.registrationInfo.credential;
207
+ const storedCredential = {
208
+ id: verifiedCredential.id,
209
+ publicKey: Buffer.from(verifiedCredential.publicKey).toString('base64url'),
210
+ counter: verifiedCredential.counter,
211
+ transports: [...(verifiedCredential.transports ?? optionsArg.response.response.transports ?? [])],
212
+ deviceType: verification.registrationInfo.credentialDeviceType,
213
+ backedUp: verification.registrationInfo.credentialBackedUp,
214
+ createdAt: now,
215
+ counterUpdateId: randomBase64Url(),
216
+ };
217
+ await this.store.commitFirstCredential(setupCeremony, storedCredential);
218
+ return { authenticated: true, credentialId: storedCredential.id };
219
+ }
220
+ async preflightSetupFinish(optionsArg) {
221
+ const peerId = requirePeerId(optionsArg.peerId);
222
+ const origin = requireOrigin(optionsArg.origin);
223
+ const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
224
+ const now = this.currentTime();
225
+ const state = await this.store.getState();
226
+ this.assertConfiguredOrigin(origin, state.config.publicOrigin);
227
+ const ceremony = await this.store.assertPendingCeremony({
228
+ ceremonyId,
229
+ kind: 'setup',
230
+ peerId,
231
+ origin,
232
+ rpId: state.config.rpId,
233
+ userId: state.webauthnUserId,
234
+ now,
235
+ });
236
+ if (ceremony.kind !== 'setup'
237
+ || typeof ceremony.setupGeneration !== 'string'
238
+ || typeof ceremony.setupHash !== 'string') {
239
+ throw new AuthError('ceremony_invalid', 'The WebAuthn ceremony has the wrong kind.');
240
+ }
241
+ // preflight is the first place a wrong code arrives in the controller
242
+ // flow, so it must burn the attempt budget too
243
+ this.recordSetupAttempt(now);
244
+ await this.store.assertSetupAuthority(optionsArg.setupCode, {
245
+ ...ceremony,
246
+ kind: 'setup',
247
+ setupGeneration: ceremony.setupGeneration,
248
+ setupHash: ceremony.setupHash,
249
+ }, now);
250
+ }
251
+ async beginAuthentication(optionsArg) {
252
+ const peerId = requirePeerId(optionsArg.peerId);
253
+ const origin = requireOrigin(optionsArg.origin);
254
+ return this.withCeremonyCreationLock(async () => {
255
+ const now = this.currentTime();
256
+ await this.assertCeremonyCapacity('authentication', now);
257
+ const state = await this.store.getState();
258
+ this.assertConfiguredOrigin(origin, state.config.publicOrigin);
259
+ if (state.authState !== 'ready' || state.credentials.length === 0) {
260
+ throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
261
+ }
262
+ this.recordAuthenticationAttempt(now, peerId, false);
263
+ const authenticationOptions = await this.webAuthn.generateAuthenticationOptions({
264
+ rpID: state.config.rpId,
265
+ timeout: authenticationCeremonyLifetimeMs,
266
+ userVerification: 'required',
267
+ });
268
+ const ceremonyId = randomBase64Url();
269
+ const ceremony = {
270
+ id: ceremonyId,
271
+ kind: 'authentication',
272
+ state: 'pending',
273
+ peerId,
274
+ challenge: authenticationOptions.challenge,
275
+ origin,
276
+ rpId: state.config.rpId,
277
+ userId: state.webauthnUserId,
278
+ createdAt: now,
279
+ expiresAt: new Date(now.getTime() + authenticationCeremonyLifetimeMs),
280
+ };
281
+ await this.store.createCeremony(ceremony);
282
+ return { ceremonyId, options: authenticationOptions };
283
+ });
284
+ }
285
+ async finishAuthentication(optionsArg) {
286
+ const peerId = requirePeerId(optionsArg.peerId);
287
+ const origin = requireOrigin(optionsArg.origin);
288
+ const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
289
+ const now = this.currentTime();
290
+ const state = await this.store.getState();
291
+ this.assertConfiguredOrigin(origin, state.config.publicOrigin);
292
+ const ceremony = await this.store.consumeCeremony({
293
+ ceremonyId,
294
+ kind: 'authentication',
295
+ peerId,
296
+ origin,
297
+ rpId: state.config.rpId,
298
+ userId: state.webauthnUserId,
299
+ now,
300
+ });
301
+ if (state.authState !== 'ready' || state.credentials.length === 0) {
302
+ throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
303
+ }
304
+ const userHandle = optionsArg.response.response.userHandle;
305
+ if (typeof userHandle !== 'string'
306
+ || !base64UrlValuesEqual(userHandle, state.webauthnUserId)) {
307
+ throw new AuthError('verification_failed', 'The passkey user handle is invalid.');
308
+ }
309
+ const credential = state.credentials.find((entry) => entry.id === optionsArg.response.id);
310
+ if (!credential) {
311
+ throw new AuthError('credential_not_found', 'The passkey credential is unknown.');
312
+ }
313
+ this.recordAuthenticationAttempt(now, peerId, true);
314
+ let verification;
315
+ try {
316
+ verification = await this.webAuthn.verifyAuthenticationResponse({
317
+ response: optionsArg.response,
318
+ expectedChallenge: ceremony.challenge,
319
+ expectedOrigin: ceremony.origin,
320
+ expectedRPID: ceremony.rpId,
321
+ credential: {
322
+ id: credential.id,
323
+ publicKey: Buffer.from(credential.publicKey, 'base64url'),
324
+ counter: credential.counter,
325
+ transports: [...credential.transports],
326
+ },
327
+ requireUserVerification: true,
328
+ advancedFIDOConfig: {
329
+ userVerification: 'required',
330
+ },
331
+ });
332
+ }
333
+ catch (errorArg) {
334
+ throw new AuthError('verification_failed', 'Passkey authentication verification failed.', {
335
+ cause: errorArg,
336
+ });
337
+ }
338
+ if (!verification.verified
339
+ || !verification.authenticationInfo.userVerified
340
+ || verification.authenticationInfo.credentialID !== credential.id
341
+ || verification.authenticationInfo.origin !== ceremony.origin
342
+ || verification.authenticationInfo.rpID !== ceremony.rpId) {
343
+ throw new AuthError('verification_failed', 'Passkey authentication verification failed.');
344
+ }
345
+ await this.store.updateCounter(credential.id, credential.counter, verification.authenticationInfo.newCounter);
346
+ return { authenticated: true, credentialId: credential.id };
347
+ }
348
+ async preflightAuthenticationFinish(optionsArg) {
349
+ const peerId = requirePeerId(optionsArg.peerId);
350
+ const origin = requireOrigin(optionsArg.origin);
351
+ const ceremonyId = requireCeremonyId(optionsArg.ceremonyId);
352
+ const now = this.currentTime();
353
+ const state = await this.store.getState();
354
+ this.assertConfiguredOrigin(origin, state.config.publicOrigin);
355
+ if (state.authState !== 'ready' || state.credentials.length === 0) {
356
+ throw new AuthError('setup_unavailable', 'Passkey authentication is not configured.');
357
+ }
358
+ const userHandle = optionsArg.response.response.userHandle;
359
+ if (typeof userHandle !== 'string'
360
+ || !base64UrlValuesEqual(userHandle, state.webauthnUserId)) {
361
+ throw new AuthError('verification_failed', 'The passkey user handle is invalid.');
362
+ }
363
+ if (!state.credentials.some((entry) => entry.id === optionsArg.response.id)) {
364
+ throw new AuthError('credential_not_found', 'The passkey credential is unknown.');
365
+ }
366
+ await this.store.assertPendingCeremony({
367
+ ceremonyId,
368
+ kind: 'authentication',
369
+ peerId,
370
+ origin,
371
+ rpId: state.config.rpId,
372
+ userId: state.webauthnUserId,
373
+ now,
374
+ });
375
+ }
376
+ currentTime() {
377
+ const now = this.now();
378
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
379
+ throw new Error('The PasskeyManager clock returned an invalid Date.');
380
+ }
381
+ return new Date(now);
382
+ }
383
+ recordSetupAttempt(nowArg) {
384
+ const cutoff = nowArg.getTime() - this.setupAttemptWindowMs;
385
+ while (this.setupAttemptTimestamps.length > 0
386
+ && this.setupAttemptTimestamps[0] <= cutoff) {
387
+ this.setupAttemptTimestamps.shift();
388
+ }
389
+ if (this.setupAttemptTimestamps.length >= this.setupAttemptLimit) {
390
+ throw new AuthError('rate_limited', 'Too many setup attempts. Try again later.');
391
+ }
392
+ this.setupAttemptTimestamps.push(nowArg.getTime());
393
+ }
394
+ recordAuthenticationAttempt(nowArg, peerIdArg, includeGlobalVerificationLimitArg) {
395
+ const now = nowArg.getTime();
396
+ const cutoff = now - this.authenticationAttemptWindowMs;
397
+ while (this.authenticationVerificationAttemptTimestamps.length > 0
398
+ && this.authenticationVerificationAttemptTimestamps[0] <= cutoff) {
399
+ this.authenticationVerificationAttemptTimestamps.shift();
400
+ }
401
+ for (const [peerId, timestamps] of this.authenticationAttemptTimestampsByPeer) {
402
+ while (timestamps.length > 0 && timestamps[0] <= cutoff)
403
+ timestamps.shift();
404
+ if (timestamps.length === 0)
405
+ this.authenticationAttemptTimestampsByPeer.delete(peerId);
406
+ }
407
+ const peerTimestamps = this.authenticationAttemptTimestampsByPeer.get(peerIdArg) ?? [];
408
+ if (peerTimestamps.length >= this.authenticationAttemptLimitPerPeer) {
409
+ throw new AuthError('rate_limited', 'Too many authentication attempts. Try again later.');
410
+ }
411
+ if (includeGlobalVerificationLimitArg
412
+ && this.authenticationVerificationAttemptTimestamps.length
413
+ >= maxAuthenticationVerificationAttemptsPerWindow) {
414
+ throw new AuthError('rate_limited', 'Too many passkey verification attempts. Try again later.');
415
+ }
416
+ if (peerTimestamps.length === 0
417
+ && this.authenticationAttemptTimestampsByPeer.size
418
+ >= this.maxActiveAuthenticationCeremonies * 2) {
419
+ throw new AuthError('rate_limited', 'Too many authentication peers. Try again later.');
420
+ }
421
+ if (includeGlobalVerificationLimitArg) {
422
+ this.authenticationVerificationAttemptTimestamps.push(now);
423
+ }
424
+ peerTimestamps.push(now);
425
+ this.authenticationAttemptTimestampsByPeer.set(peerIdArg, peerTimestamps);
426
+ }
427
+ async assertCeremonyCapacity(kindArg, nowArg) {
428
+ const maximum = kindArg === 'setup'
429
+ ? this.maxActiveSetupCeremonies
430
+ : this.maxActiveAuthenticationCeremonies;
431
+ const active = await this.store.countActiveCeremonies(kindArg, nowArg);
432
+ if (active >= maximum) {
433
+ throw new AuthError('ceremony_limit', `Too many active ${kindArg} ceremonies.`);
434
+ }
435
+ }
436
+ assertConfiguredOrigin(actualArg, expectedArg) {
437
+ if (actualArg !== expectedArg) {
438
+ throw new AuthError('origin_mismatch', 'The request origin is not trusted.');
439
+ }
440
+ }
441
+ async withCeremonyCreationLock(functionArg) {
442
+ const previous = this.ceremonyCreationTail;
443
+ let release;
444
+ this.ceremonyCreationTail = new Promise((resolve) => {
445
+ release = resolve;
446
+ });
447
+ await previous;
448
+ try {
449
+ return await functionArg();
450
+ }
451
+ finally {
452
+ release();
453
+ }
454
+ }
455
+ }
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wYXNza2V5bWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMucGFzc2tleW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLFNBQVMsR0FhVixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2RCxNQUFNLDhDQUE4QyxHQUFHLEdBQUcsQ0FBQztBQUMzRCxNQUFNLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sZUFBZSxHQUFrQztJQUNyRCwyQkFBMkIsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCO0lBQ3JGLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEI7SUFDbkYsNkJBQTZCLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixDQUFDLDZCQUE2QjtJQUN6Riw0QkFBNEIsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsNEJBQTRCO0NBQ3hGLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQzNCLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLFVBQVUsR0FBRyxNQUFNLEVBQ1gsRUFBRTtJQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxRQUFRLG9EQUFvRCxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFN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
@@ -0,0 +1,50 @@
1
+ export interface IControllerProcessIdentity {
2
+ pid: number;
3
+ processGroupId: number;
4
+ processGroupLeader: boolean;
5
+ arguments: string[];
6
+ argumentsTruncated?: boolean;
7
+ fingerprint: string;
8
+ }
9
+ export interface IControllerProcessCandidate {
10
+ identity: IControllerProcessIdentity;
11
+ command: '__serve' | 'foreground';
12
+ port: number;
13
+ }
14
+ export interface IControllerDataWriterProcessCandidate {
15
+ kind: 'controller' | 'temp-password' | 'flex-child';
16
+ identity: IControllerProcessIdentity;
17
+ }
18
+ export declare const readControllerProcessIdentity: (pidArg: number) => Promise<IControllerProcessIdentity | null>;
19
+ export declare const readProcessGroupMemberPids: (processGroupIdArg: number) => Promise<number[]>;
20
+ export declare const processIdentityHasFileArgument: (identityArg: IControllerProcessIdentity, filePathArg: string, optionsArg?: {
21
+ allowMissingAbsolutePath?: boolean;
22
+ }) => Promise<boolean>;
23
+ export declare const processIdentityHasCliCommand: (identityArg: IControllerProcessIdentity, cliPathArg: string, commandArg: "__serve" | "__upgrade-worker" | "upgrade" | "start" | "foreground" | "temp-password", optionsArg?: {
24
+ allowMissingAbsolutePath?: boolean;
25
+ }) => Promise<boolean>;
26
+ export declare const listControllerProcessesForCli: (cliPathArg: string) => Promise<IControllerProcessCandidate[]>;
27
+ export declare const listControllerDataWriterProcessesForCli: (cliPathArg: string, optionsArg?: {
28
+ includeInstalledPackagePaths?: boolean;
29
+ }) => Promise<IControllerDataWriterProcessCandidate[]>;
30
+ export declare const listControllerDataWriterProcessesForCliPaths: (cliPathsArg: readonly string[], optionsArg?: {
31
+ includeInstalledPackagePaths?: boolean;
32
+ }) => Promise<IControllerDataWriterProcessCandidate[]>;
33
+ export declare const inspectControllerProcess: (optionsArg: {
34
+ pid: number;
35
+ cliPath: string;
36
+ port: number;
37
+ expectedProcessGroupId?: number;
38
+ expectedFingerprint?: string;
39
+ command: "__serve" | "foreground";
40
+ }) => Promise<IControllerProcessIdentity | null>;
41
+ export declare const signalVerifiedControllerProcess: (optionsArg: {
42
+ pid: number;
43
+ cliPath: string;
44
+ port: number;
45
+ expectedProcessGroupId: number;
46
+ expectedFingerprint: string;
47
+ signal: NodeJS.Signals;
48
+ signalProcessGroup: boolean;
49
+ command: "__serve" | "foreground";
50
+ }) => Promise<void>;