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.
- package/.smartconfig.json +55 -0
- package/changelog.md +1026 -0
- package/cli.js +14 -0
- package/dist_serve/bundle.js +44778 -0
- package/dist_serve/index.html +13 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.authmodels.d.ts +126 -0
- package/dist_ts/classes.authmodels.js +1422 -0
- package/dist_ts/classes.authstore.d.ts +160 -0
- package/dist_ts/classes.authstore.js +2483 -0
- package/dist_ts/classes.browserresourcehost.d.ts +85 -0
- package/dist_ts/classes.browserresourcehost.js +912 -0
- package/dist_ts/classes.cli.d.ts +21 -0
- package/dist_ts/classes.cli.js +1082 -0
- package/dist_ts/classes.config.d.ts +23 -0
- package/dist_ts/classes.config.js +267 -0
- package/dist_ts/classes.controller.d.ts +523 -0
- package/dist_ts/classes.controller.js +10611 -0
- package/dist_ts/classes.controllermanagement.d.ts +32 -0
- package/dist_ts/classes.controllermanagement.js +222 -0
- package/dist_ts/classes.draftmanager.d.ts +30 -0
- package/dist_ts/classes.draftmanager.js +179 -0
- package/dist_ts/classes.embeddeddb.d.ts +30 -0
- package/dist_ts/classes.embeddeddb.js +159 -0
- package/dist_ts/classes.flexframedtransport.d.ts +56 -0
- package/dist_ts/classes.flexframedtransport.js +275 -0
- package/dist_ts/classes.flexmodels.private.d.ts +231 -0
- package/dist_ts/classes.flexmodels.private.js +985 -0
- package/dist_ts/classes.flexmodels.public.d.ts +207 -0
- package/dist_ts/classes.flexmodels.public.js +885 -0
- package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
- package/dist_ts/classes.flexprojectionreader.js +580 -0
- package/dist_ts/classes.flexservice.d.ts +196 -0
- package/dist_ts/classes.flexservice.js +3704 -0
- package/dist_ts/classes.flexstore.d.ts +174 -0
- package/dist_ts/classes.flexstore.js +3400 -0
- package/dist_ts/classes.flexsupervisor.d.ts +105 -0
- package/dist_ts/classes.flexsupervisor.js +1191 -0
- package/dist_ts/classes.gitreversion.d.ts +431 -0
- package/dist_ts/classes.gitreversion.js +10592 -0
- package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
- package/dist_ts/classes.harnessoperationmanager.js +602 -0
- package/dist_ts/classes.opencodeclient.d.ts +146 -0
- package/dist_ts/classes.opencodeclient.js +3003 -0
- package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
- package/dist_ts/classes.opencodesupervisor.js +1003 -0
- package/dist_ts/classes.passkeymanager.d.ts +34 -0
- package/dist_ts/classes.passkeymanager.js +456 -0
- package/dist_ts/classes.processinspection.d.ts +50 -0
- package/dist_ts/classes.processinspection.js +484 -0
- package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
- package/dist_ts/classes.resourcecoordinator.js +294 -0
- package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
- package/dist_ts/classes.sessionintelligencereader.js +40 -0
- package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
- package/dist_ts/classes.systemmetricssampler.js +168 -0
- package/dist_ts/classes.terminalmanager.d.ts +95 -0
- package/dist_ts/classes.terminalmanager.js +981 -0
- package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
- package/dist_ts/classes.terminalresourcehost.js +84 -0
- package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
- package/dist_ts/classes.upgradecoordinator.js +2155 -0
- package/dist_ts/classes.upgradetransaction.d.ts +92 -0
- package/dist_ts/classes.upgradetransaction.js +2125 -0
- package/dist_ts/classes.uploadmanager.d.ts +24 -0
- package/dist_ts/classes.uploadmanager.js +210 -0
- package/dist_ts/classes.validation.d.ts +91 -0
- package/dist_ts/classes.validation.js +1087 -0
- package/dist_ts/flexharness.child.d.ts +1 -0
- package/dist_ts/flexharness.child.js +28 -0
- package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
- package/dist_ts/functions.canonicaldirectory.js +144 -0
- package/dist_ts/functions.controllerdataroot.d.ts +15 -0
- package/dist_ts/functions.controllerdataroot.js +76 -0
- package/dist_ts/functions.embeddeddb.d.ts +2 -0
- package/dist_ts/functions.embeddeddb.js +21 -0
- package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
- package/dist_ts/functions.flexcredentialstore.js +93 -0
- package/dist_ts/functions.opencodeauth.d.ts +3 -0
- package/dist_ts/functions.opencodeauth.js +31 -0
- package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
- package/dist_ts/functions.runtimeenvironment.js +79 -0
- package/dist_ts/functions.upgradefollower.d.ts +3 -0
- package/dist_ts/functions.upgradefollower.js +95 -0
- package/dist_ts/index.d.ts +24 -0
- package/dist_ts/index.js +25 -0
- package/dist_ts/interfaces.auth.d.ts +181 -0
- package/dist_ts/interfaces.auth.js +82 -0
- package/dist_ts/interfaces.config.d.ts +34 -0
- package/dist_ts/interfaces.config.js +2 -0
- package/dist_ts/interfaces.flexipc.d.ts +939 -0
- package/dist_ts/interfaces.flexipc.js +1492 -0
- package/dist_ts/interfaces.gitreversion.d.ts +246 -0
- package/dist_ts/interfaces.gitreversion.js +2 -0
- package/dist_ts/interfaces.lifecycle.d.ts +37 -0
- package/dist_ts/interfaces.lifecycle.js +2 -0
- package/dist_ts/interfaces.opencode.d.ts +101 -0
- package/dist_ts/interfaces.opencode.js +3 -0
- package/dist_ts/interfaces.projects.d.ts +156 -0
- package/dist_ts/interfaces.projects.js +5 -0
- package/dist_ts/plugins.d.ts +36 -0
- package/dist_ts/plugins.js +40 -0
- package/dist_ts_interfaces/index.d.ts +2 -0
- package/dist_ts_interfaces/index.js +3 -0
- package/dist_ts_interfaces/interfaces.d.ts +747 -0
- package/dist_ts_interfaces/interfaces.js +47 -0
- package/dist_ts_interfaces/plugins.d.ts +4 -0
- package/dist_ts_interfaces/plugins.js +3 -0
- package/dist_ts_interfaces/requests.d.ts +806 -0
- package/dist_ts_interfaces/requests.js +2 -0
- package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
- package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
- package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
- package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.migrationrunner.js +34 -0
- package/dist_ts_migration/index.d.ts +12 -0
- package/dist_ts_migration/index.js +13 -0
- package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
- package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
- package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
- package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
- package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
- package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
- package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
- package/dist_ts_migration/v18_resourcelayout.js +23 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
- package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
- package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
- package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
- package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
- package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocuments.js +138 -0
- package/html/index.html +13 -0
- package/{LICENSE → license.md} +2 -2
- package/package.json +86 -48
- package/readme.md +480 -0
- package/readme.plan.md +188 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.authmodels.ts +1245 -0
- package/ts/classes.authstore.ts +3274 -0
- package/ts/classes.browserresourcehost.ts +1205 -0
- package/ts/classes.cli.ts +1254 -0
- package/ts/classes.config.ts +351 -0
- package/ts/classes.controller.ts +14426 -0
- package/ts/classes.controllermanagement.ts +330 -0
- package/ts/classes.draftmanager.ts +232 -0
- package/ts/classes.embeddeddb.ts +166 -0
- package/ts/classes.flexframedtransport.ts +283 -0
- package/ts/classes.flexmodels.private.ts +823 -0
- package/ts/classes.flexmodels.public.ts +732 -0
- package/ts/classes.flexprojectionreader.ts +816 -0
- package/ts/classes.flexservice.ts +4302 -0
- package/ts/classes.flexstore.ts +4565 -0
- package/ts/classes.flexsupervisor.ts +1453 -0
- package/ts/classes.gitreversion.ts +13353 -0
- package/ts/classes.harnessoperationmanager.ts +870 -0
- package/ts/classes.opencodeclient.ts +4110 -0
- package/ts/classes.opencodesupervisor.ts +1280 -0
- package/ts/classes.passkeymanager.ts +570 -0
- package/ts/classes.processinspection.ts +623 -0
- package/ts/classes.resourcecoordinator.ts +436 -0
- package/ts/classes.sessionintelligencereader.ts +52 -0
- package/ts/classes.systemmetricssampler.ts +215 -0
- package/ts/classes.terminalmanager.ts +1207 -0
- package/ts/classes.terminalresourcehost.ts +122 -0
- package/ts/classes.upgradecoordinator.ts +2675 -0
- package/ts/classes.upgradetransaction.ts +2900 -0
- package/ts/classes.uploadmanager.ts +240 -0
- package/ts/classes.validation.ts +1409 -0
- package/ts/flexharness.child.ts +35 -0
- package/ts/functions.canonicaldirectory.ts +213 -0
- package/ts/functions.controllerdataroot.ts +107 -0
- package/ts/functions.embeddeddb.ts +22 -0
- package/ts/functions.flexcredentialstore.ts +128 -0
- package/ts/functions.opencodeauth.ts +34 -0
- package/ts/functions.runtimeenvironment.ts +90 -0
- package/ts/functions.upgradefollower.ts +115 -0
- package/ts/index.ts +36 -6
- package/ts/interfaces.auth.ts +316 -0
- package/ts/interfaces.config.ts +37 -0
- package/ts/interfaces.flexipc.ts +2586 -0
- package/ts/interfaces.gitreversion.ts +336 -0
- package/ts/interfaces.lifecycle.ts +46 -0
- package/ts/interfaces.opencode.ts +153 -0
- package/ts/interfaces.projects.ts +182 -0
- package/ts/plugins.ts +64 -0
- package/ts_interfaces/index.ts +2 -0
- package/ts_interfaces/interfaces.ts +827 -0
- package/ts_interfaces/plugins.ts +15 -0
- package/ts_interfaces/requests.ts +1186 -0
- package/ts_migration/classes.documentmigrationrunner.ts +32 -0
- package/ts_migration/classes.flexmigrationrunner.ts +33 -0
- package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
- package/ts_migration/classes.migrationrunner.ts +40 -0
- package/ts_migration/index.ts +12 -0
- package/ts_migration/v10_flexharnessv3migration.ts +35 -0
- package/ts_migration/v13_flexprojectionorder.ts +33 -0
- package/ts_migration/v16_flexprovidercredentials.ts +196 -0
- package/ts_migration/v18_resourcelayout.ts +55 -0
- package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
- package/ts_migration/v19_flexprojectmanagement.ts +28 -0
- package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
- package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
- package/ts_migration/v2_controllerdataroot.ts +2349 -0
- package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
- package/ts_migration/v6_protocoldocuments.ts +198 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/classes.controllersocketclient.ts +517 -0
- package/ts_web/classes.sessiondraftsync.ts +390 -0
- package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
- package/ts_web/index.ts +2 -0
- package/ts_web/plugins.ts +31 -0
- package/.gitlab-ci.yml +0 -71
- package/.npmignore +0 -5
- package/README.md +0 -40
- package/dist/cli.js +0 -2
- package/dist/index.d.ts +0 -0
- package/dist/index.js +0 -9
- package/dist/mod_bundle/index.d.ts +0 -1
- package/dist/mod_bundle/index.js +0 -18
- package/dist/mod_bundle/mod.plugins.d.ts +0 -4
- package/dist/mod_bundle/mod.plugins.js +0 -11
- package/dist/mod_install/index.d.ts +0 -4
- package/dist/mod_install/index.js +0 -21
- package/dist/mod_install/mod.plugins.d.ts +0 -1
- package/dist/mod_install/mod.plugins.js +0 -7
- package/dist/mod_standard/index.d.ts +0 -4
- package/dist/mod_standard/index.js +0 -21
- package/dist/mod_standard/mod.browser.d.ts +0 -6
- package/dist/mod_standard/mod.browser.js +0 -14
- package/dist/mod_standard/mod.clean.d.ts +0 -4
- package/dist/mod_standard/mod.clean.js +0 -12
- package/dist/mod_standard/mod.compile.d.ts +0 -4
- package/dist/mod_standard/mod.compile.js +0 -21
- package/dist/mod_standard/mod.plugins.d.ts +0 -8
- package/dist/mod_standard/mod.plugins.js +0 -19
- package/dist/mod_standard/mod.test.d.ts +0 -4
- package/dist/mod_standard/mod.test.js +0 -12
- package/dist/plr.cli.d.ts +0 -3
- package/dist/plr.cli.js +0 -57
- package/dist/plr.config.d.ts +0 -11
- package/dist/plr.config.js +0 -26
- package/dist/plr.mods.d.ts +0 -17
- package/dist/plr.mods.js +0 -17
- package/dist/plr.paths.d.ts +0 -19
- package/dist/plr.paths.js +0 -26
- package/dist/plr.plugins.d.ts +0 -8
- package/dist/plr.plugins.js +0 -16
- package/npmextra.json +0 -10
- package/ts/mod_bundle/index.ts +0 -20
- package/ts/mod_bundle/mod.plugins.ts +0 -9
- package/ts/mod_install/index.ts +0 -20
- package/ts/mod_install/mod.plugins.ts +0 -1
- package/ts/mod_standard/index.ts +0 -23
- package/ts/mod_standard/mod.browser.ts +0 -17
- package/ts/mod_standard/mod.clean.ts +0 -13
- package/ts/mod_standard/mod.compile.ts +0 -23
- package/ts/mod_standard/mod.plugins.ts +0 -17
- package/ts/mod_standard/mod.test.ts +0 -13
- package/ts/plr.cli.ts +0 -60
- package/ts/plr.config.ts +0 -36
- package/ts/plr.mods.ts +0 -25
- package/ts/plr.paths.ts +0 -29
- package/ts/plr.plugins.ts +0 -17
- package/tslint.json +0 -3
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZXNvdXJjZWNvb3JkaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5yZXNvdXJjZWNvb3JkaW5hdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSwyQkFBMkIsQ0FBQztBQUduQyxPQUFPLEVBRU4sTUFBTSx5QkFBeUIsQ0FBQztBQXlDakMsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLEtBQUs7SUFDM0MsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBRTlDLFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGtDQUFtQyxTQUFRLEtBQUs7SUFHL0I7SUFGWixJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFFL0MsWUFBNEIsV0FBcUI7UUFDL0MsS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFEMUMsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFFL0MsSUFBSSxDQUFDLElBQUksR0FBRyxvQ0FBb0MsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFRRCxNQUFNLGVBQWUsR0FBRyxDQUN0QixPQUFvQyxFQUNwQyxRQUFxQyxFQUM1QixFQUFFLENBQUMsT0FBTyxLQUFLLElBQUk7SUFDNUIsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJO0lBQ25CLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxLQUFLLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sT0FBTyw2QkFBNkI7SUFJWDtJQUhaLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN6RCxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRXRELFlBQTZCLE9BQThDO1FBQTlDLFlBQU8sR0FBUCxPQUFPLENBQXVDO0lBQUcsQ0FBQztJQUV4RSxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUIsWUFBb0IsRUFDcEIsYUFBcUIsRUFDckIsT0FBNEM7UUFFNUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3BFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM1QixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyxpQkFBaUIsT0FBTywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQ3pCLFFBQTZELEVBQzdELFNBQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3pFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDO1lBQ3pELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQ3pCLFlBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLFFBQWdCO1FBRWhCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFNN0I7UUFDQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVELElBQ0UsUUFBUSxDQUFDLFNBQVM7bUJBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ3JGLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLGtDQUFrQyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQ3hFLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFFBQVEsQ0FBQyxVQUFVLEVBQ25CLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFFBQVEsQ0FBQywwQkFBMEIsQ0FDcEMsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUN6QixZQUFvQixFQUNwQixhQUFxQixFQUNyQixTQUFzQjtRQUV0QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDL0YsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQUUsT0FBTztZQUM3QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUN4QixZQUFvQixFQUNwQixhQUFxQixFQUNyQixTQUFzQjtRQUV0QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDcEUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQy9FLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRSxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNuRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLElBQUksUUFBUSxDQUFDO1lBQzNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQ3ZCLFlBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLFNBQXNCO1FBRXRCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNwRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLElBQUksa0NBQWtDLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDbkUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxJQUFJLFFBQVEsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQXNCO1FBQ3pDLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7WUFDM0UsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzNELElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ2pFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3JGLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMvQixNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzNELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQzlCLFlBQW9CLEVBQ3BCLFlBQWtDLEVBQ2xDLFNBQXNCLEVBQ3RCLFNBQTJCO1FBRTNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9ELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDckQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQy9CLElBQUksUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQy9CLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3hFLENBQUM7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQzt3QkFBRSxTQUFTO29CQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUN4RSxZQUFZLEVBQ1osUUFBUSxDQUFDLEVBQUUsRUFDWCxJQUFJLEVBQ0osUUFBUSxDQUFDLGtCQUFrQixDQUM1QixDQUFDO29CQUNGLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLFNBQVMsRUFBRSxDQUFDO1FBQzNCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFlBQW9CLEVBQ3BCLFNBQTJCO1FBRTNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFDRCxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM1QixNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4QyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMzQixNQUFNLFFBQVEsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsWUFBb0IsRUFDcEIsWUFBb0I7UUFFcEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FDdkQsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNuRCxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQ3BCLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUztlQUN4QixRQUFRLENBQUMsU0FBUyxLQUFLLFFBQVE7ZUFDL0IsUUFBUSxDQUFDLGlCQUFpQixLQUFLLFNBQVM7ZUFDeEMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEtBQUssTUFBTTtlQUN4QyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQ2hELENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdEQsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUN2QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1NBQ2hELENBQUMsQ0FBQyxDQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsUUFLdkM7UUFDQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMxRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELElBQ0UsQ0FBQyxRQUFRO21CQUNOLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUzttQkFDM0IsUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFRO21CQUMvQixRQUFRLENBQUMsaUJBQWlCLEtBQUssU0FBUzttQkFDeEMsUUFBUSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsQ0FBQyxrQkFBa0I7bUJBQzNELFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxLQUFLLE1BQU07bUJBQ3hDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxTQUFTO2dCQUNyRCxNQUFNLElBQUksa0NBQWtDLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUMvRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLFdBQXdDLEVBQ3hDLFNBQXNCO1FBRXRCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sV0FBVyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFnQztZQUMxQyxHQUFHLFdBQVc7WUFDZCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRTtTQUN4RSxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUMxRCxXQUFXLENBQUMsU0FBUyxFQUNyQixXQUFXLENBQUMsRUFBRSxFQUNkLE9BQU8sQ0FBQyxXQUFXLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBd0M7UUFDL0QsTUFBTSxVQUFVLEdBQUc7WUFDakIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxxQkFBcUI7WUFDOUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxrQkFBa0I7WUFDeEMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFO1NBQ2hGLENBQUM7UUFDRixNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxpQkFBaUI7WUFDckQsQ0FBQyxDQUFDLGVBQXdCO1lBQzFCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLElBQUk7Z0JBQzlCLENBQUMsQ0FBQyxVQUFtQjtnQkFDckIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUztvQkFDOUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxLQUFLLE1BQU07MkJBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTsyQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTt3QkFDeEMsQ0FBQyxDQUFDLFdBQW9CO3dCQUN0QixDQUFDLENBQUMsdUJBQWdDO29CQUNwQyxDQUFDLENBQUMsV0FBb0IsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRztZQUNYLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtZQUNsQixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDaEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO1lBQ3RCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztZQUN4QixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDaEMsVUFBVTtZQUNWLGlCQUFpQjtZQUNqQixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDMUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1NBQzNDLENBQUM7UUFDRixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsT0FBTztnQkFDTCxHQUFHLElBQUk7Z0JBQ1AsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYTthQUMxRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFTLENBQUM7UUFDdkMsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7WUFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3RGLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDeEYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN4RixDQUFDO0lBQ0osQ0FBQztJQUVPLE9BQU8sQ0FBQyxXQUF3QztRQUN0RCxPQUFPLFdBQVcsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDaEcsQ0FBQztJQUVPLFlBQVksQ0FBQyxZQUFvQjtRQUN2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sa0JBQWtCLENBQUksWUFBb0IsRUFBRSxZQUE4QjtRQUNoRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxrQ0FBa0MsQ0FDMUQsbURBQW1ELENBQ3BELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxrQ0FBa0MsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxPQUFPLFlBQVksRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNyQixJQUNFLEtBQUssQ0FBQyxhQUFhO21CQUNoQixDQUFDLEtBQUssQ0FBQyxPQUFPO21CQUNkLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSTtnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sVUFBVSxDQUFDLFlBQW9CLEVBQUUsWUFBa0M7UUFDekUsT0FBTyxHQUFHLFlBQVksSUFBSSxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ25FLENBQUM7Q0FDRiJ9
|
|
@@ -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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
|