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,294 @@
1
+ import { controllerRuntimeIdKey, } from '../dist_ts_interfaces/index.js';
2
+ import {} from './interfaces.flexipc.js';
3
+ export class ControllerResourceUnavailableError extends Error {
4
+ code = 'resource_unavailable';
5
+ constructor(messageArg) {
6
+ super(messageArg);
7
+ this.name = 'ControllerResourceUnavailableError';
8
+ }
9
+ }
10
+ export class ControllerProjectHasResourcesError extends Error {
11
+ resourceIds;
12
+ code = 'project_has_resources';
13
+ constructor(resourceIds) {
14
+ super('Retire every project resource before removing the project.');
15
+ this.resourceIds = resourceIds;
16
+ this.name = 'ControllerProjectHasResourcesError';
17
+ }
18
+ }
19
+ const sessionIdsEqual = (leftArg, rightArg) => leftArg === null
20
+ ? rightArg === null
21
+ : rightArg !== null && controllerRuntimeIdKey(leftArg) === controllerRuntimeIdKey(rightArg);
22
+ export class ControllerResourceCoordinator {
23
+ options;
24
+ projectStates = new Map();
25
+ deletingSessions = new Set();
26
+ constructor(options) {
27
+ this.options = options;
28
+ }
29
+ async listResources(projectIdArg) {
30
+ const resources = await this.options.store.listResources(projectIdArg);
31
+ return resources.map((resource) => this.toPublicResource(resource));
32
+ }
33
+ async requireResourceKind(projectIdArg, resourceIdArg, kindArg) {
34
+ return this.runProjectMutation(projectIdArg, async () => {
35
+ const resource = (await this.options.store.listResources(projectIdArg))
36
+ .find((entry) => entry.id === resourceIdArg);
37
+ if (!resource)
38
+ return false;
39
+ if (resource.kind !== kindArg) {
40
+ throw new ControllerResourceUnavailableError(`The requested ${kindArg} resource is unavailable.`);
41
+ }
42
+ return true;
43
+ });
44
+ }
45
+ async createResource(inputArg, signalArg) {
46
+ return this.runProjectMutation(inputArg.projectId, async () => {
47
+ const resource = await this.options.store.createResource(inputArg);
48
+ await this.hostFor(resource).startResource(resource, signalArg);
49
+ const current = (await this.options.store.listResources(inputArg.projectId))
50
+ .find((entry) => entry.id === resource.id) ?? resource;
51
+ return this.toPublicResource(current);
52
+ });
53
+ }
54
+ async renameResource(projectIdArg, resourceIdArg, titleArg) {
55
+ return this.runProjectMutation(projectIdArg, async () => {
56
+ const resource = await this.options.store.renameResource(projectIdArg, resourceIdArg, titleArg);
57
+ await this.hostFor(resource).renameResource?.(resource);
58
+ return this.toPublicResource(resource);
59
+ });
60
+ }
61
+ async changeAttachment(inputArg) {
62
+ return this.runProjectMutation(inputArg.projectId, async () => {
63
+ if (inputArg.sessionId
64
+ && this.deletingSessions.has(this.sessionKey(inputArg.projectId, inputArg.sessionId))) {
65
+ throw new ControllerResourceUnavailableError('The target session is being deleted.');
66
+ }
67
+ const pending = await this.options.store.beginResourceAttachmentTransition(inputArg.projectId, inputArg.resourceId, inputArg.sessionId, inputArg.expectedAttachmentRevision);
68
+ return this.toPublicResource(await this.reconcilePendingAttachment(pending, inputArg.signal));
69
+ });
70
+ }
71
+ async retireResource(projectIdArg, resourceIdArg, signalArg) {
72
+ await this.runProjectMutation(projectIdArg, async () => {
73
+ const retiring = await this.options.store.beginResourceRetirement(projectIdArg, resourceIdArg);
74
+ if (retiring.lifecycle === 'retired')
75
+ return;
76
+ await this.hostFor(retiring).retireResource(retiring, signalArg);
77
+ await this.options.store.completeResourceRetirement(projectIdArg, resourceIdArg);
78
+ });
79
+ }
80
+ async startResource(projectIdArg, resourceIdArg, signalArg) {
81
+ return this.runProjectMutation(projectIdArg, async () => {
82
+ const resource = (await this.options.store.listResources(projectIdArg))
83
+ .find((entry) => entry.id === resourceIdArg);
84
+ if (!resource || resource.lifecycle !== 'active' || resource.pendingAttachment) {
85
+ throw new ControllerResourceUnavailableError('The resource cannot be started now.');
86
+ }
87
+ await this.hostFor(resource).startResource(resource, signalArg);
88
+ const current = (await this.options.store.listResources(projectIdArg))
89
+ .find((entry) => entry.id === resourceIdArg) ?? resource;
90
+ return this.toPublicResource(current);
91
+ });
92
+ }
93
+ async stopResource(projectIdArg, resourceIdArg, signalArg) {
94
+ return this.runProjectMutation(projectIdArg, async () => {
95
+ const resource = (await this.options.store.listResources(projectIdArg))
96
+ .find((entry) => entry.id === resourceIdArg);
97
+ if (!resource || resource.lifecycle !== 'active') {
98
+ throw new ControllerResourceUnavailableError('The resource cannot be stopped now.');
99
+ }
100
+ await this.hostFor(resource).stopResource(resource, signalArg);
101
+ const current = (await this.options.store.listResources(projectIdArg))
102
+ .find((entry) => entry.id === resourceIdArg) ?? resource;
103
+ return this.toPublicResource(current);
104
+ });
105
+ }
106
+ async recover(signalArg) {
107
+ for (const resource of await this.options.store.listRecoverableResources()) {
108
+ signalArg.throwIfAborted();
109
+ await this.runProjectMutation(resource.projectId, async () => {
110
+ if (resource.lifecycle === 'retiring') {
111
+ await this.hostFor(resource).retireResource(resource, signalArg);
112
+ await this.options.store.completeResourceRetirement(resource.projectId, resource.id);
113
+ return;
114
+ }
115
+ if (resource.pendingAttachment) {
116
+ await this.reconcilePendingAttachment(resource, signalArg);
117
+ return;
118
+ }
119
+ await this.hostFor(resource).reconcileAttachment(resource, signalArg);
120
+ });
121
+ }
122
+ }
123
+ async withSessionDeletion(projectIdArg, sessionIdArg, signalArg, deleteArg) {
124
+ const sessionKey = this.sessionKey(projectIdArg, sessionIdArg);
125
+ if (this.deletingSessions.has(sessionKey)) {
126
+ throw new ControllerResourceUnavailableError('The session is already being deleted.');
127
+ }
128
+ this.deletingSessions.add(sessionKey);
129
+ try {
130
+ await this.runProjectMutation(projectIdArg, async () => {
131
+ const resources = await this.options.store.listResources(projectIdArg);
132
+ for (let resource of resources) {
133
+ if (resource.pendingAttachment) {
134
+ resource = await this.reconcilePendingAttachment(resource, signalArg);
135
+ }
136
+ if (!sessionIdsEqual(resource.sessionId, sessionIdArg))
137
+ continue;
138
+ const pending = await this.options.store.beginResourceAttachmentTransition(projectIdArg, resource.id, null, resource.attachmentRevision);
139
+ await this.reconcilePendingAttachment(pending, signalArg);
140
+ }
141
+ });
142
+ return await deleteArg();
143
+ }
144
+ finally {
145
+ this.deletingSessions.delete(sessionKey);
146
+ }
147
+ }
148
+ async withProjectRemovalGuard(projectIdArg, removeArg) {
149
+ const state = this.projectState(projectIdArg);
150
+ if (!state.admissionOpen || state.removed) {
151
+ throw new ControllerResourceUnavailableError('The project is not accepting resource operations.');
152
+ }
153
+ state.admissionOpen = false;
154
+ await state.tail;
155
+ const resources = await this.options.store.listResources(projectIdArg);
156
+ if (resources.length > 0) {
157
+ state.admissionOpen = true;
158
+ throw new ControllerProjectHasResourcesError(resources.map((resource) => resource.id));
159
+ }
160
+ try {
161
+ const result = await removeArg();
162
+ state.removed = true;
163
+ this.projectStates.delete(projectIdArg);
164
+ return result;
165
+ }
166
+ catch (errorArg) {
167
+ state.admissionOpen = true;
168
+ throw errorArg;
169
+ }
170
+ }
171
+ async resolveFlexBrowserResources(projectIdArg, sessionIdArg) {
172
+ return this.runProjectMutation(projectIdArg, async () => ((await this.options.store.listResources(projectIdArg))
173
+ .filter((resource) => (resource.kind === 'browser'
174
+ && resource.lifecycle === 'active'
175
+ && resource.pendingAttachment === undefined
176
+ && resource.sessionId?.harnessId === 'flex'
177
+ && resource.sessionId.nativeId === sessionIdArg))
178
+ .sort((left, right) => left.id.localeCompare(right.id))
179
+ .map((resource) => ({
180
+ resourceId: resource.id,
181
+ attachmentRevision: resource.attachmentRevision,
182
+ }))));
183
+ }
184
+ async requireFlexBrowserResource(inputArg) {
185
+ return this.runProjectMutation(inputArg.projectId, async () => {
186
+ const resource = (await this.options.store.listResources(inputArg.projectId))
187
+ .find((entry) => entry.id === inputArg.resourceId);
188
+ if (!resource
189
+ || resource.kind !== 'browser'
190
+ || resource.lifecycle !== 'active'
191
+ || resource.pendingAttachment !== undefined
192
+ || resource.attachmentRevision !== inputArg.attachmentRevision
193
+ || resource.sessionId?.harnessId !== 'flex'
194
+ || resource.sessionId.nativeId !== inputArg.sessionId)
195
+ throw new ControllerResourceUnavailableError('The browser attachment is no longer current.');
196
+ return resource;
197
+ });
198
+ }
199
+ async reconcilePendingAttachment(resourceArg, signalArg) {
200
+ const pending = resourceArg.pendingAttachment;
201
+ if (!pending)
202
+ return resourceArg;
203
+ const target = {
204
+ ...resourceArg,
205
+ attachmentRevision: pending.attachmentRevision,
206
+ sessionId: pending.sessionId === null ? null : { ...pending.sessionId },
207
+ };
208
+ delete target.pendingAttachment;
209
+ await this.hostFor(resourceArg).reconcileAttachment(target, signalArg);
210
+ return this.options.store.commitResourceAttachmentTransition(resourceArg.projectId, resourceArg.id, pending.operationId);
211
+ }
212
+ toPublicResource(resourceArg) {
213
+ const attachment = {
214
+ authorityId: resourceArg.attachmentAuthorityId,
215
+ revision: resourceArg.attachmentRevision,
216
+ sessionId: resourceArg.sessionId === null ? null : { ...resourceArg.sessionId },
217
+ };
218
+ const agentAvailability = resourceArg.pendingAttachment
219
+ ? 'transitioning'
220
+ : resourceArg.sessionId === null
221
+ ? 'detached'
222
+ : resourceArg.kind === 'browser'
223
+ ? resourceArg.sessionId?.harnessId === 'flex'
224
+ && this.options.browserHost.isAvailable()
225
+ && this.options.isFlexHarnessAvailable()
226
+ ? 'available'
227
+ : 'dependencyUnavailable'
228
+ : 'available';
229
+ const base = {
230
+ id: resourceArg.id,
231
+ projectId: resourceArg.projectId,
232
+ kind: resourceArg.kind,
233
+ title: resourceArg.title,
234
+ lifecycle: resourceArg.lifecycle,
235
+ attachment,
236
+ agentAvailability,
237
+ createdAt: resourceArg.createdAt.getTime(),
238
+ updatedAt: resourceArg.updatedAt.getTime(),
239
+ };
240
+ if (resourceArg.kind === 'browser') {
241
+ return {
242
+ ...base,
243
+ kind: 'browser',
244
+ browserRuntimeState: this.options.browserHost.isAvailable() ? 'available' : 'unavailable',
245
+ };
246
+ }
247
+ const terminal = resourceArg.terminal;
248
+ return {
249
+ ...base,
250
+ kind: 'terminal',
251
+ command: terminal.command,
252
+ cwd: terminal.cwd,
253
+ processState: this.options.terminalHost.isRunning(resourceArg) ? 'running' : 'stopped',
254
+ ...(terminal.stoppedAt === undefined ? {} : { stoppedAt: terminal.stoppedAt.getTime() }),
255
+ ...(terminal.lastExitCode === undefined ? {} : { lastExitCode: terminal.lastExitCode }),
256
+ };
257
+ }
258
+ hostFor(resourceArg) {
259
+ return resourceArg.kind === 'terminal' ? this.options.terminalHost : this.options.browserHost;
260
+ }
261
+ projectState(projectIdArg) {
262
+ let state = this.projectStates.get(projectIdArg);
263
+ if (!state) {
264
+ state = { tail: Promise.resolve(), admissionOpen: true, removed: false };
265
+ this.projectStates.set(projectIdArg, state);
266
+ }
267
+ return state;
268
+ }
269
+ runProjectMutation(projectIdArg, operationArg) {
270
+ const state = this.projectState(projectIdArg);
271
+ if (!state.admissionOpen || state.removed) {
272
+ return Promise.reject(new ControllerResourceUnavailableError('The project is not accepting resource operations.'));
273
+ }
274
+ const operation = state.tail.then(async () => {
275
+ if (!state.admissionOpen || state.removed) {
276
+ throw new ControllerResourceUnavailableError('The project stopped accepting resource operations.');
277
+ }
278
+ return operationArg();
279
+ });
280
+ const tail = operation.then(() => undefined, () => undefined);
281
+ state.tail = tail;
282
+ void tail.finally(() => {
283
+ if (state.admissionOpen
284
+ && !state.removed
285
+ && state.tail === tail)
286
+ this.projectStates.delete(projectIdArg);
287
+ });
288
+ return operation;
289
+ }
290
+ sessionKey(projectIdArg, sessionIdArg) {
291
+ return `${projectIdArg}:${controllerRuntimeIdKey(sessionIdArg)}`;
292
+ }
293
+ }
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZXNvdXJjZWNvb3JkaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5yZXNvdXJjZWNvb3JkaW5hdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSwyQkFBMkIsQ0FBQztBQUduQyxPQUFPLEVBRU4sTUFBTSx5QkFBeUIsQ0FBQztBQXlDakMsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLEtBQUs7SUFDM0MsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBRTlDLFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLEtBQUs7SUFHL0I7SUFGWixJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFFL0MsWUFBNEIsV0FBcUI7UUFDL0MsS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFEMUMsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFFL0MsSUFBSSxDQUFDLElBQUksR0FBRyxvQ0FBb0MsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFRRCxNQUFNLGVBQWUsR0FBRyxDQUN0QixPQUFvQyxFQUNwQyxRQUFxQyxFQUM1QixFQUFFLENBQUMsT0FBTyxLQUFLLElBQUk7SUFDNUIsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJO0lBQ25CLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxLQUFLLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sT0FBTyw2QkFBNkI7SUFJWDtJQUhaLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN6RCxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRXRELFlBQTZCLE9BQThD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
@@ -0,0 +1,13 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IOpenCodeConnectionConfig } from './interfaces.opencode.js';
3
+ export declare class SessionIntelligenceReader {
4
+ private readonly config;
5
+ private readonly registry;
6
+ private connectionId?;
7
+ constructor(config: IOpenCodeConnectionConfig);
8
+ init(signalArg?: AbortSignal): Promise<void>;
9
+ listChats(limitArg: number): Promise<plugins.crossharness.IChatSummary[]>;
10
+ readChat(chatIdArg: string, limitArg: number, maxCharsArg: number): Promise<plugins.crossharness.IChatTranscript>;
11
+ close(): Promise<void>;
12
+ private connection;
13
+ }
@@ -0,0 +1,40 @@
1
+ import * as plugins from './plugins.js';
2
+ export class SessionIntelligenceReader {
3
+ config;
4
+ registry;
5
+ connectionId;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.registry = new plugins.crossharness.ConnectionRegistry({
9
+ allowedServerUrls: [config.baseUrl],
10
+ maxConnections: 1,
11
+ openCodeCredentials: {
12
+ serverUrl: config.baseUrl,
13
+ username: config.username,
14
+ password: config.password,
15
+ },
16
+ });
17
+ }
18
+ async init(signalArg) {
19
+ if (this.connectionId)
20
+ throw new Error('The Session Intelligence reader is already initialized.');
21
+ const connection = await this.registry.connect('opencode', this.config.baseUrl, this.config.directory, signalArg);
22
+ this.connectionId = connection.connectionId;
23
+ }
24
+ listChats(limitArg) {
25
+ return this.connection().listChats(limitArg);
26
+ }
27
+ readChat(chatIdArg, limitArg, maxCharsArg) {
28
+ return this.connection().readChat(chatIdArg, limitArg, maxCharsArg);
29
+ }
30
+ async close() {
31
+ await this.registry.closeAll();
32
+ this.connectionId = undefined;
33
+ }
34
+ connection() {
35
+ if (!this.connectionId)
36
+ throw new Error('The Session Intelligence reader is not initialized.');
37
+ return this.registry.get(this.connectionId);
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXNzaW9uaW50ZWxsaWdlbmNlcmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5zZXNzaW9uaW50ZWxsaWdlbmNlcmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBR3hDLE1BQU0sT0FBTyx5QkFBeUI7SUFJUDtJQUhaLFFBQVEsQ0FBMEM7SUFDM0QsWUFBWSxDQUFVO0lBRTlCLFlBQTZCLE1BQWlDO1FBQWpDLFdBQU0sR0FBTixNQUFNLENBQTJCO1FBQzVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDO1lBQzFELGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNuQyxjQUFjLEVBQUUsQ0FBQztZQUNqQixtQkFBbUIsRUFBRTtnQkFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN6QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTthQUMxQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXVCO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDbEcsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDNUMsVUFBVSxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFDckIsU0FBUyxDQUNWLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7SUFDOUMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxRQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLFFBQVEsQ0FDYixTQUFpQixFQUNqQixRQUFnQixFQUNoQixXQUFtQjtRQUVuQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,53 @@
1
+ import type { IControllerSystemMetrics } from '../dist_ts_interfaces/index.js';
2
+ interface ISystemMetricsSource {
3
+ currentLoad: () => Promise<{
4
+ currentLoad: number;
5
+ }>;
6
+ mem: () => Promise<{
7
+ active: number;
8
+ total: number;
9
+ }>;
10
+ networkInterfaces: () => Promise<Array<{
11
+ iface: string;
12
+ virtual: boolean;
13
+ }>>;
14
+ networkStats: (interfaces: string) => Promise<Array<{
15
+ rx_sec: number;
16
+ tx_sec: number;
17
+ }>>;
18
+ }
19
+ interface IRawSystemMetrics {
20
+ cpuUsagePercent?: unknown;
21
+ memoryUsedBytes?: unknown;
22
+ memoryTotalBytes?: unknown;
23
+ networkStats?: Array<{
24
+ rx_sec?: unknown;
25
+ tx_sec?: unknown;
26
+ }>;
27
+ }
28
+ interface ISystemMetricsSamplerOptions {
29
+ source?: ISystemMetricsSource;
30
+ now?: () => number;
31
+ sampleTimeoutMs?: number;
32
+ }
33
+ export declare const normalizeSystemMetrics: (sampledAtArg: number, rawArg: IRawSystemMetrics) => IControllerSystemMetrics;
34
+ export declare class SystemMetricsSampler {
35
+ private readonly source;
36
+ private readonly now;
37
+ private readonly sampleTimeoutMs;
38
+ private cachedSample;
39
+ private inFlightSample;
40
+ private inFlightCpuRead;
41
+ private inFlightMemoryRead;
42
+ private inFlightNetworkRead;
43
+ constructor(optionsArg?: ISystemMetricsSamplerOptions);
44
+ sample(): Promise<IControllerSystemMetrics>;
45
+ private readFreshSample;
46
+ private readSourceMetrics;
47
+ private readCpu;
48
+ private readMemory;
49
+ private readNetwork;
50
+ private withTimeout;
51
+ private readNetworkStats;
52
+ }
53
+ export {};
@@ -0,0 +1,168 @@
1
+ import * as plugins from './plugins.js';
2
+ const cacheTtlMs = 1_000;
3
+ const defaultSampleTimeoutMs = 2_000;
4
+ const asNonNegativeNumber = (valueArg) => (typeof valueArg === 'number' && Number.isFinite(valueArg) && valueArg >= 0
5
+ ? valueArg
6
+ : null);
7
+ const asPercentage = (valueArg) => {
8
+ const value = asNonNegativeNumber(valueArg);
9
+ return value !== null && value <= 100 ? value : null;
10
+ };
11
+ const aggregateNetworkRate = (statsArg, keyArg) => {
12
+ if (!statsArg || statsArg.length === 0)
13
+ return null;
14
+ let total = 0;
15
+ for (const stats of statsArg) {
16
+ const value = asNonNegativeNumber(stats[keyArg]);
17
+ if (value === null)
18
+ return null;
19
+ total += value;
20
+ }
21
+ return Number.isFinite(total) ? total : null;
22
+ };
23
+ export const normalizeSystemMetrics = (sampledAtArg, rawArg) => {
24
+ const memoryTotalBytes = asNonNegativeNumber(rawArg.memoryTotalBytes);
25
+ const memoryUsedCandidate = asNonNegativeNumber(rawArg.memoryUsedBytes);
26
+ const memoryUsedBytes = (memoryUsedCandidate !== null
27
+ && memoryTotalBytes !== null
28
+ && memoryTotalBytes > 0
29
+ && memoryUsedCandidate <= memoryTotalBytes) ? memoryUsedCandidate : null;
30
+ return {
31
+ sampledAt: sampledAtArg,
32
+ cpuUsagePercent: asPercentage(rawArg.cpuUsagePercent),
33
+ memoryUsedBytes,
34
+ memoryTotalBytes: memoryTotalBytes !== null && memoryTotalBytes > 0
35
+ ? memoryTotalBytes
36
+ : null,
37
+ networkReceiveBytesPerSecond: aggregateNetworkRate(rawArg.networkStats, 'rx_sec'),
38
+ networkTransmitBytesPerSecond: aggregateNetworkRate(rawArg.networkStats, 'tx_sec'),
39
+ };
40
+ };
41
+ export class SystemMetricsSampler {
42
+ source;
43
+ now;
44
+ sampleTimeoutMs;
45
+ cachedSample;
46
+ inFlightSample;
47
+ inFlightCpuRead;
48
+ inFlightMemoryRead;
49
+ inFlightNetworkRead;
50
+ constructor(optionsArg = {}) {
51
+ this.source = optionsArg.source ?? plugins.systeminformation;
52
+ this.now = optionsArg.now ?? Date.now;
53
+ this.sampleTimeoutMs = optionsArg.sampleTimeoutMs ?? defaultSampleTimeoutMs;
54
+ }
55
+ async sample() {
56
+ const now = this.now();
57
+ if (this.cachedSample && now - this.cachedSample.sampledAt < cacheTtlMs) {
58
+ return this.cachedSample;
59
+ }
60
+ if (this.inFlightSample)
61
+ return this.inFlightSample;
62
+ const samplePromise = this.readFreshSample();
63
+ this.inFlightSample = samplePromise;
64
+ try {
65
+ const sample = await samplePromise;
66
+ this.cachedSample = sample;
67
+ return sample;
68
+ }
69
+ finally {
70
+ if (this.inFlightSample === samplePromise) {
71
+ this.inFlightSample = undefined;
72
+ }
73
+ }
74
+ }
75
+ async readFreshSample() {
76
+ return normalizeSystemMetrics(this.now(), await this.readSourceMetrics());
77
+ }
78
+ async readSourceMetrics() {
79
+ const [cpuResult, memoryResult, networkResult] = await Promise.all([
80
+ this.readCpu(),
81
+ this.readMemory(),
82
+ this.readNetwork(),
83
+ ]);
84
+ return {
85
+ ...(cpuResult
86
+ ? { cpuUsagePercent: cpuResult.currentLoad }
87
+ : {}),
88
+ ...(memoryResult
89
+ ? {
90
+ memoryUsedBytes: memoryResult.active,
91
+ memoryTotalBytes: memoryResult.total,
92
+ }
93
+ : {}),
94
+ ...(networkResult
95
+ ? { networkStats: networkResult }
96
+ : {}),
97
+ };
98
+ }
99
+ async readCpu() {
100
+ let sourceRead = this.inFlightCpuRead;
101
+ if (!sourceRead) {
102
+ sourceRead = Promise.resolve().then(() => this.source.currentLoad());
103
+ this.inFlightCpuRead = sourceRead;
104
+ const clear = () => {
105
+ if (this.inFlightCpuRead === sourceRead)
106
+ this.inFlightCpuRead = undefined;
107
+ };
108
+ void sourceRead.then(clear, clear);
109
+ }
110
+ return this.withTimeout(sourceRead);
111
+ }
112
+ async readMemory() {
113
+ let sourceRead = this.inFlightMemoryRead;
114
+ if (!sourceRead) {
115
+ sourceRead = Promise.resolve().then(() => this.source.mem());
116
+ this.inFlightMemoryRead = sourceRead;
117
+ const clear = () => {
118
+ if (this.inFlightMemoryRead === sourceRead)
119
+ this.inFlightMemoryRead = undefined;
120
+ };
121
+ void sourceRead.then(clear, clear);
122
+ }
123
+ return this.withTimeout(sourceRead);
124
+ }
125
+ async readNetwork() {
126
+ let sourceRead = this.inFlightNetworkRead;
127
+ if (!sourceRead) {
128
+ sourceRead = Promise.resolve().then(() => this.readNetworkStats());
129
+ this.inFlightNetworkRead = sourceRead;
130
+ const clear = () => {
131
+ if (this.inFlightNetworkRead === sourceRead)
132
+ this.inFlightNetworkRead = undefined;
133
+ };
134
+ void sourceRead.then(clear, clear);
135
+ }
136
+ return this.withTimeout(sourceRead);
137
+ }
138
+ async withTimeout(sourceReadArg) {
139
+ let timeout;
140
+ const timedOut = Symbol('systemMetricsTimeout');
141
+ try {
142
+ const result = await Promise.race([
143
+ sourceReadArg,
144
+ new Promise((resolve) => {
145
+ timeout = setTimeout(() => resolve(timedOut), this.sampleTimeoutMs);
146
+ }),
147
+ ]);
148
+ return result === timedOut ? undefined : result;
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ finally {
154
+ if (timeout)
155
+ clearTimeout(timeout);
156
+ }
157
+ }
158
+ async readNetworkStats() {
159
+ const interfaces = await this.source.networkInterfaces();
160
+ const interfaceNames = [...new Set(interfaces
161
+ .filter((networkInterface) => !networkInterface.virtual && networkInterface.iface.length > 0)
162
+ .map((networkInterface) => networkInterface.iface))].slice(0, 128);
163
+ if (interfaceNames.length === 0)
164
+ return [];
165
+ return this.source.networkStats(interfaceNames.join(','));
166
+ }
167
+ }
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zeXN0ZW1tZXRyaWNzc2FtcGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuc3lzdGVtbWV0cmljc3NhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFnQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN6QixNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUVyQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBaUIsRUFBRSxDQUFDLENBQ2hFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxRQUFRO0lBQ1YsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFpQixFQUFpQixFQUFFO0lBQ3hELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQzNCLFFBQTJDLEVBQzNDLE1BQTJCLEVBQ1osRUFBRTtJQUNqQixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxL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