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,1087 @@
|
|
|
1
|
+
import { controllerHarnessIds, controllerMaxDraftAttachmentBytes, controllerMaxDraftAttachmentTotalBytes, controllerMaxDraftAttachments, controllerMaxDraftTextBytes, controllerRuntimeIdKey, controllerSessionHarnessIds, } from '../dist_ts_interfaces/index.js';
|
|
2
|
+
const isPlainObject = (valueArg) => {
|
|
3
|
+
if (typeof valueArg !== 'object' || valueArg === null || Array.isArray(valueArg))
|
|
4
|
+
return false;
|
|
5
|
+
const prototype = Object.getPrototypeOf(valueArg);
|
|
6
|
+
return prototype === Object.prototype || prototype === null;
|
|
7
|
+
};
|
|
8
|
+
const assertObject = (valueArg, nameArg) => {
|
|
9
|
+
if (!isPlainObject(valueArg))
|
|
10
|
+
throw new Error(`${nameArg} must be an object.`);
|
|
11
|
+
return valueArg;
|
|
12
|
+
};
|
|
13
|
+
const assertKeys = (valueArg, requiredArg, optionalArg = []) => {
|
|
14
|
+
const allowed = new Set([...requiredArg, ...optionalArg]);
|
|
15
|
+
for (const key of Object.keys(valueArg)) {
|
|
16
|
+
if (!allowed.has(key))
|
|
17
|
+
throw new Error(`Unexpected request field: ${key}`);
|
|
18
|
+
}
|
|
19
|
+
for (const key of requiredArg) {
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(valueArg, key)) {
|
|
21
|
+
throw new Error(`Missing request field: ${key}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const assertString = (valueArg, nameArg, minimumArg, maximumArg) => {
|
|
26
|
+
if (typeof valueArg !== 'string' || valueArg.length < minimumArg || valueArg.length > maximumArg) {
|
|
27
|
+
throw new Error(`${nameArg} must contain ${minimumArg}-${maximumArg} characters.`);
|
|
28
|
+
}
|
|
29
|
+
return valueArg;
|
|
30
|
+
};
|
|
31
|
+
export const assertEmptyRequest = (valueArg) => {
|
|
32
|
+
const value = assertObject(valueArg, 'request');
|
|
33
|
+
assertKeys(value, []);
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
36
|
+
export const assertIdentifier = (valueArg, nameArg) => {
|
|
37
|
+
const value = assertString(valueArg, nameArg, 1, 128);
|
|
38
|
+
if (!/^[A-Za-z0-9_-]+$/.test(value)) {
|
|
39
|
+
throw new Error(`${nameArg} contains unsupported characters.`);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
const assertOpaqueIdentifier = (valueArg, nameArg) => {
|
|
44
|
+
if (typeof valueArg !== 'string'
|
|
45
|
+
|| valueArg.length === 0
|
|
46
|
+
|| Buffer.byteLength(valueArg, 'utf8') > 512) {
|
|
47
|
+
throw new Error(`${nameArg} must contain 1-512 UTF-8 bytes.`);
|
|
48
|
+
}
|
|
49
|
+
return valueArg;
|
|
50
|
+
};
|
|
51
|
+
export function assertControllerRuntimeId(valueArg, nameArg, allowedHarnessIdsArg = controllerHarnessIds) {
|
|
52
|
+
const value = assertObject(valueArg, nameArg);
|
|
53
|
+
assertKeys(value, ['harnessId', 'nativeId']);
|
|
54
|
+
if (typeof value.harnessId !== 'string'
|
|
55
|
+
|| !allowedHarnessIdsArg.includes(value.harnessId)) {
|
|
56
|
+
throw new Error(`${nameArg}.harnessId has the wrong runtime owner.`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
harnessId: value.harnessId,
|
|
60
|
+
nativeId: assertOpaqueIdentifier(value.nativeId, `${nameArg}.nativeId`),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const assertRelatedRuntimeIds = (leftArg, rightArg, nameArg) => {
|
|
64
|
+
if (leftArg.harnessId !== rightArg.harnessId) {
|
|
65
|
+
throw new Error(`${nameArg} must belong to the same harness.`);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const assertCeremonyId = (valueArg) => {
|
|
69
|
+
const value = assertString(valueArg, 'ceremonyId', 43, 43);
|
|
70
|
+
if (!/^[A-Za-z0-9_-]{43}$/.test(value)) {
|
|
71
|
+
throw new Error('ceremonyId must be a 32-byte base64url value.');
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
};
|
|
75
|
+
const assertWebAuthnResponse = (valueArg, kindArg) => {
|
|
76
|
+
const value = assertObject(valueArg, `${kindArg} response`);
|
|
77
|
+
assertKeys(value, ['id', 'rawId', 'response', 'type'], [
|
|
78
|
+
'authenticatorAttachment',
|
|
79
|
+
'clientExtensionResults',
|
|
80
|
+
]);
|
|
81
|
+
assertString(value.id, 'credential id', 1, 2048);
|
|
82
|
+
assertString(value.rawId, 'credential rawId', 1, 2048);
|
|
83
|
+
if (value.type !== 'public-key')
|
|
84
|
+
throw new Error('WebAuthn credential type must be public-key.');
|
|
85
|
+
assertObject(value.response, 'WebAuthn response payload');
|
|
86
|
+
let encoded;
|
|
87
|
+
try {
|
|
88
|
+
encoded = JSON.stringify(value);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new Error('WebAuthn response must be serializable.');
|
|
92
|
+
}
|
|
93
|
+
if (encoded.length > 220_000)
|
|
94
|
+
throw new Error('WebAuthn response is too large.');
|
|
95
|
+
return value;
|
|
96
|
+
};
|
|
97
|
+
export const assertSetupBeginRequest = (valueArg) => {
|
|
98
|
+
const value = assertObject(valueArg, 'setup request');
|
|
99
|
+
assertKeys(value, ['setupCode']);
|
|
100
|
+
return { setupCode: assertString(value.setupCode, 'setupCode', 1, 256) };
|
|
101
|
+
};
|
|
102
|
+
export const assertSetupFinishRequest = (valueArg) => {
|
|
103
|
+
const value = assertObject(valueArg, 'setup completion request');
|
|
104
|
+
assertKeys(value, ['ceremonyId', 'setupCode', 'response']);
|
|
105
|
+
return {
|
|
106
|
+
ceremonyId: assertCeremonyId(value.ceremonyId),
|
|
107
|
+
setupCode: assertString(value.setupCode, 'setupCode', 1, 256),
|
|
108
|
+
response: assertWebAuthnResponse(value.response, 'registration'),
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
export const assertAuthenticationFinishRequest = (valueArg) => {
|
|
112
|
+
const value = assertObject(valueArg, 'authentication completion request');
|
|
113
|
+
assertKeys(value, ['ceremonyId', 'response']);
|
|
114
|
+
return {
|
|
115
|
+
ceremonyId: assertCeremonyId(value.ceremonyId),
|
|
116
|
+
response: assertWebAuthnResponse(value.response, 'authentication'),
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
export const assertProjectListRequest = assertEmptyRequest;
|
|
120
|
+
const pathSegmentValid = (segmentArg) => (segmentArg.length > 0
|
|
121
|
+
&& segmentArg.length <= 255
|
|
122
|
+
&& segmentArg !== '.'
|
|
123
|
+
&& segmentArg !== '..'
|
|
124
|
+
&& !segmentArg.startsWith('.')
|
|
125
|
+
// eslint-disable-next-line no-control-regex
|
|
126
|
+
&& !/[\x00-\x1f\x7f/\\]/.test(segmentArg));
|
|
127
|
+
export const assertProjectRelativePath = (valueArg, nameArg) => {
|
|
128
|
+
const value = assertString(valueArg, nameArg, 1, 1024);
|
|
129
|
+
const segments = value.split('/');
|
|
130
|
+
if (!segments.every(pathSegmentValid)) {
|
|
131
|
+
throw new Error(`${nameArg} must be a relative path of visible directory names without dot navigation.`);
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
};
|
|
135
|
+
export const assertProjectCreateRequest = (valueArg) => {
|
|
136
|
+
const value = assertObject(valueArg, 'project creation request');
|
|
137
|
+
assertKeys(value, ['path']);
|
|
138
|
+
const path = assertString(value.path, 'path', 1, 4096);
|
|
139
|
+
// eslint-disable-next-line no-control-regex
|
|
140
|
+
if (/[\x00-\x1f\x7f\\]/.test(path)) {
|
|
141
|
+
throw new Error('path contains unsupported characters.');
|
|
142
|
+
}
|
|
143
|
+
// Resolution against the projects root (for relative input) happens in the
|
|
144
|
+
// controller; see resolveProjectPathInput.
|
|
145
|
+
return { path };
|
|
146
|
+
};
|
|
147
|
+
// Explicitly typed absolute paths may name hidden directories; only path
|
|
148
|
+
// navigation and unusable characters are rejected.
|
|
149
|
+
const absoluteSegmentValid = (segmentArg) => (segmentArg.length > 0
|
|
150
|
+
&& segmentArg.length <= 255
|
|
151
|
+
&& segmentArg !== '.'
|
|
152
|
+
&& segmentArg !== '..'
|
|
153
|
+
// eslint-disable-next-line no-control-regex
|
|
154
|
+
&& !/[\x00-\x1f\x7f/\\]/.test(segmentArg));
|
|
155
|
+
export const assertAbsoluteProjectPath = (valueArg, nameArg) => {
|
|
156
|
+
const value = assertString(valueArg, nameArg, 2, 4096);
|
|
157
|
+
if (!value.startsWith('/') || !value.slice(1).split('/').every(absoluteSegmentValid)) {
|
|
158
|
+
throw new Error(`${nameArg} must be an absolute path of directory names without dot navigation.`);
|
|
159
|
+
}
|
|
160
|
+
return value;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Accepts what a human types and returns the absolute directory to register:
|
|
164
|
+
* an absolute path is taken as-is (any location on disk), a relative path is
|
|
165
|
+
* resolved against the projects root.
|
|
166
|
+
*/
|
|
167
|
+
export const resolveProjectPathInput = (pathArg, projectsRootArg) => {
|
|
168
|
+
if (!pathArg.startsWith('/')) {
|
|
169
|
+
return `${projectsRootArg}/${assertProjectRelativePath(pathArg, 'path')}`;
|
|
170
|
+
}
|
|
171
|
+
let trimmed = pathArg;
|
|
172
|
+
while (trimmed.length > 1 && trimmed.endsWith('/')) {
|
|
173
|
+
trimmed = trimmed.slice(0, -1);
|
|
174
|
+
}
|
|
175
|
+
if (trimmed === projectsRootArg) {
|
|
176
|
+
return projectsRootArg;
|
|
177
|
+
}
|
|
178
|
+
return assertAbsoluteProjectPath(trimmed, 'path');
|
|
179
|
+
};
|
|
180
|
+
export const assertProjectSuggestRequest = (valueArg) => {
|
|
181
|
+
const value = assertObject(valueArg, 'path suggestion request');
|
|
182
|
+
assertKeys(value, ['query']);
|
|
183
|
+
const query = assertString(value.query, 'query', 0, 4096);
|
|
184
|
+
const absolute = query.startsWith('/');
|
|
185
|
+
const lastSlash = query.lastIndexOf('/');
|
|
186
|
+
const directoryPath = absolute
|
|
187
|
+
? (lastSlash === 0 ? '/' : query.slice(0, lastSlash))
|
|
188
|
+
: (lastSlash < 0 ? '' : query.slice(0, lastSlash));
|
|
189
|
+
const prefix = lastSlash < 0 ? query : query.slice(lastSlash + 1);
|
|
190
|
+
if (absolute && directoryPath !== '/') {
|
|
191
|
+
assertAbsoluteProjectPath(directoryPath, 'query');
|
|
192
|
+
}
|
|
193
|
+
else if (!absolute && directoryPath !== '') {
|
|
194
|
+
assertProjectRelativePath(directoryPath, 'query');
|
|
195
|
+
}
|
|
196
|
+
if (prefix.length > 255
|
|
197
|
+
// eslint-disable-next-line no-control-regex
|
|
198
|
+
|| /[\x00-\x1f\x7f\\]/.test(prefix)) {
|
|
199
|
+
throw new Error('query contains unsupported characters.');
|
|
200
|
+
}
|
|
201
|
+
// Hidden entries are never suggested; a dot prefix yields an empty result
|
|
202
|
+
// while typing rather than an error.
|
|
203
|
+
return { directoryPath, prefix, unmatchable: prefix.startsWith('.'), absolute };
|
|
204
|
+
};
|
|
205
|
+
export const assertProjectRemoveRequest = (valueArg) => {
|
|
206
|
+
const value = assertObject(valueArg, 'project removal request');
|
|
207
|
+
assertKeys(value, ['projectId']);
|
|
208
|
+
return { projectId: assertIdentifier(value.projectId, 'projectId') };
|
|
209
|
+
};
|
|
210
|
+
export const assertProviderListRequest = assertEmptyRequest;
|
|
211
|
+
export const assertProviderConnectionListRequest = assertEmptyRequest;
|
|
212
|
+
export const assertProviderLoginBeginRequest = (valueArg) => {
|
|
213
|
+
const value = assertObject(valueArg, 'provider login request');
|
|
214
|
+
assertKeys(value, ['providerID']);
|
|
215
|
+
if (value.providerID !== 'openai') {
|
|
216
|
+
throw new Error('providerID must be openai.');
|
|
217
|
+
}
|
|
218
|
+
return { providerID: 'openai' };
|
|
219
|
+
};
|
|
220
|
+
export const assertProviderLoginGetRequest = (valueArg) => {
|
|
221
|
+
const value = assertObject(valueArg, 'provider login lookup request');
|
|
222
|
+
assertKeys(value, ['loginId']);
|
|
223
|
+
return { loginId: assertControllerRuntimeId(value.loginId, 'loginId', ['flex']) };
|
|
224
|
+
};
|
|
225
|
+
export const assertProviderLoginCancelRequest = (valueArg) => {
|
|
226
|
+
const value = assertObject(valueArg, 'provider login cancellation request');
|
|
227
|
+
assertKeys(value, ['loginId']);
|
|
228
|
+
return { loginId: assertControllerRuntimeId(value.loginId, 'loginId', ['flex']) };
|
|
229
|
+
};
|
|
230
|
+
export const assertProviderConnectionLogoutRequest = (valueArg) => {
|
|
231
|
+
const value = assertObject(valueArg, 'provider connection logout request');
|
|
232
|
+
assertKeys(value, ['providerConnectionId']);
|
|
233
|
+
return {
|
|
234
|
+
providerConnectionId: assertOpaqueIdentifier(value.providerConnectionId, 'providerConnectionId'),
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
export const assertProviderConnectionRateLimitsGetRequest = (valueArg) => (assertProviderConnectionLogoutRequest(valueArg));
|
|
238
|
+
export const assertProviderConnectionActivateOpenCodeRequest = (valueArg) => (assertProviderConnectionLogoutRequest(valueArg));
|
|
239
|
+
export const assertProviderModelRefreshBeginRequest = (valueArg) => {
|
|
240
|
+
const value = assertObject(valueArg, 'provider model refresh request');
|
|
241
|
+
assertKeys(value, ['providerConnectionId']);
|
|
242
|
+
return {
|
|
243
|
+
providerConnectionId: assertOpaqueIdentifier(value.providerConnectionId, 'providerConnectionId'),
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
export const assertProviderModelRefreshGetRequest = (valueArg) => {
|
|
247
|
+
const value = assertObject(valueArg, 'provider model refresh lookup request');
|
|
248
|
+
assertKeys(value, ['jobId']);
|
|
249
|
+
return { jobId: assertControllerRuntimeId(value.jobId, 'jobId', ['flex']) };
|
|
250
|
+
};
|
|
251
|
+
export const assertSettingsUpdateRequest = (valueArg) => {
|
|
252
|
+
const value = assertObject(valueArg, 'settings update request');
|
|
253
|
+
assertKeys(value, [], ['defaultModels', 'autoAcceptPermissions']);
|
|
254
|
+
const result = {};
|
|
255
|
+
if ('autoAcceptPermissions' in value) {
|
|
256
|
+
if (typeof value.autoAcceptPermissions !== 'boolean') {
|
|
257
|
+
throw new Error('autoAcceptPermissions must be a boolean.');
|
|
258
|
+
}
|
|
259
|
+
result.autoAcceptPermissions = value.autoAcceptPermissions;
|
|
260
|
+
}
|
|
261
|
+
if (!('defaultModels' in value))
|
|
262
|
+
return result;
|
|
263
|
+
if (!Array.isArray(value.defaultModels) || value.defaultModels.length > 2) {
|
|
264
|
+
throw new Error('defaultModels must contain at most one model per session harness.');
|
|
265
|
+
}
|
|
266
|
+
const defaultModels = value.defaultModels.map((modelArg) => assertModelChoice(modelArg));
|
|
267
|
+
if (new Set(defaultModels.map((model) => model.harnessId)).size !== defaultModels.length) {
|
|
268
|
+
throw new Error('defaultModels must contain at most one model per session harness.');
|
|
269
|
+
}
|
|
270
|
+
return { ...result, defaultModels };
|
|
271
|
+
};
|
|
272
|
+
export const assertSessionListRequest = (valueArg) => {
|
|
273
|
+
const value = assertObject(valueArg, 'session list request');
|
|
274
|
+
assertKeys(value, ['projectId']);
|
|
275
|
+
return { projectId: assertIdentifier(value.projectId, 'projectId') };
|
|
276
|
+
};
|
|
277
|
+
export const assertSlashListRequest = (valueArg) => {
|
|
278
|
+
const value = assertObject(valueArg, 'slash command list request');
|
|
279
|
+
assertKeys(value, ['projectId', 'sessionId']);
|
|
280
|
+
return {
|
|
281
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
282
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
export const assertSessionGetRequest = (valueArg) => {
|
|
286
|
+
const value = assertObject(valueArg, 'session request');
|
|
287
|
+
assertKeys(value, ['projectId', 'sessionId']);
|
|
288
|
+
return {
|
|
289
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
290
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
export const assertSessionAuxiliaryGetRequest = (valueArg) => assertSessionGetRequest(valueArg);
|
|
294
|
+
export const assertSessionModelUpdateRequest = (valueArg) => {
|
|
295
|
+
const value = assertObject(valueArg, 'session model update request');
|
|
296
|
+
assertKeys(value, ['projectId', 'sessionId', 'model']);
|
|
297
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds);
|
|
298
|
+
const model = assertModelChoice(value.model);
|
|
299
|
+
if (model.harnessId !== sessionId.harnessId) {
|
|
300
|
+
throw new Error('model must belong to the same harness as sessionId.');
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
304
|
+
sessionId,
|
|
305
|
+
model,
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
export const assertSessionScratchpadSaveRequest = (valueArg) => {
|
|
309
|
+
const value = assertObject(valueArg, 'session scratchpad save request');
|
|
310
|
+
assertKeys(value, ['projectId', 'sessionId', 'text', 'expectedRevision']);
|
|
311
|
+
const text = assertString(value.text, 'text', 0, 32_768);
|
|
312
|
+
if (Buffer.byteLength(text, 'utf8') > 128 * 1024) {
|
|
313
|
+
throw new Error('text exceeds the 128 KiB UTF-8 limit.');
|
|
314
|
+
}
|
|
315
|
+
if (!Number.isSafeInteger(value.expectedRevision) || value.expectedRevision < 0) {
|
|
316
|
+
throw new Error('expectedRevision must be a non-negative safe integer.');
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
320
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
321
|
+
text,
|
|
322
|
+
expectedRevision: value.expectedRevision,
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
export const assertSessionIntelligenceAskRequest = (valueArg) => {
|
|
326
|
+
const value = assertObject(valueArg, 'session intelligence request');
|
|
327
|
+
assertKeys(value, ['projectId', 'sessionId', 'question']);
|
|
328
|
+
const question = assertString(value.question, 'question', 1, 8_192);
|
|
329
|
+
if (!question.trim())
|
|
330
|
+
throw new Error('question must not be blank.');
|
|
331
|
+
if (Buffer.byteLength(question, 'utf8') > 32 * 1024) {
|
|
332
|
+
throw new Error('question exceeds the 32 KiB UTF-8 limit.');
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
336
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
337
|
+
question,
|
|
338
|
+
};
|
|
339
|
+
};
|
|
340
|
+
export const assertSessionMessagesPageRequest = (valueArg) => {
|
|
341
|
+
const value = assertObject(valueArg, 'session message page request');
|
|
342
|
+
assertKeys(value, ['projectId', 'sessionId', 'limit'], ['before']);
|
|
343
|
+
if (!Number.isSafeInteger(value.limit) || value.limit < 1 || value.limit > 50) {
|
|
344
|
+
throw new Error('limit must be an integer between 1 and 50.');
|
|
345
|
+
}
|
|
346
|
+
const before = value.before === undefined
|
|
347
|
+
? undefined
|
|
348
|
+
: assertString(value.before, 'before', 1, 4096);
|
|
349
|
+
return {
|
|
350
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
351
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
352
|
+
limit: value.limit,
|
|
353
|
+
...(before === undefined ? {} : { before }),
|
|
354
|
+
};
|
|
355
|
+
};
|
|
356
|
+
export const assertSessionMessageGetRequest = (valueArg) => {
|
|
357
|
+
const value = assertObject(valueArg, 'exact session message request');
|
|
358
|
+
assertKeys(value, ['projectId', 'sessionId', 'messageId']);
|
|
359
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds);
|
|
360
|
+
const messageId = assertControllerRuntimeId(value.messageId, 'messageId', controllerSessionHarnessIds);
|
|
361
|
+
assertRelatedRuntimeIds(sessionId, messageId, 'messageId');
|
|
362
|
+
return {
|
|
363
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
364
|
+
sessionId,
|
|
365
|
+
messageId,
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
export const assertSessionCreateRequest = (valueArg) => {
|
|
369
|
+
const value = assertObject(valueArg, 'session creation request');
|
|
370
|
+
assertKeys(value, ['projectId', 'harnessId'], ['title', 'model']);
|
|
371
|
+
const projectId = assertIdentifier(value.projectId, 'projectId');
|
|
372
|
+
if (typeof value.harnessId !== 'string'
|
|
373
|
+
|| !controllerSessionHarnessIds.includes(value.harnessId)) {
|
|
374
|
+
throw new Error('harnessId must be opencode or flex.');
|
|
375
|
+
}
|
|
376
|
+
const harnessId = value.harnessId;
|
|
377
|
+
const model = value.model === undefined ? undefined : assertModelChoice(value.model);
|
|
378
|
+
if (model !== undefined && model.harnessId !== harnessId) {
|
|
379
|
+
throw new Error('model must belong to the requested harness.');
|
|
380
|
+
}
|
|
381
|
+
const title = value.title === undefined
|
|
382
|
+
? undefined
|
|
383
|
+
: assertString(value.title, 'title', 1, 200).trim();
|
|
384
|
+
if (value.title !== undefined && !title)
|
|
385
|
+
throw new Error('title must not be blank.');
|
|
386
|
+
return {
|
|
387
|
+
projectId,
|
|
388
|
+
harnessId,
|
|
389
|
+
...(title === undefined ? {} : { title }),
|
|
390
|
+
...(model === undefined ? {} : { model }),
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
export const assertTempPasswordLoginRequest = (valueArg) => {
|
|
394
|
+
const value = assertObject(valueArg, 'temporary password login request');
|
|
395
|
+
assertKeys(value, ['password']);
|
|
396
|
+
const password = assertString(value.password, 'password', 8, 256);
|
|
397
|
+
if (!/^[\x21-\x7e]+$/.test(password)) {
|
|
398
|
+
throw new Error('password contains unsupported characters.');
|
|
399
|
+
}
|
|
400
|
+
return { password };
|
|
401
|
+
};
|
|
402
|
+
export const assertAuthResumeRequest = (valueArg) => {
|
|
403
|
+
const value = assertObject(valueArg, 'auth resume request');
|
|
404
|
+
assertKeys(value, ['token']);
|
|
405
|
+
const token = assertString(value.token, 'token', 43, 43);
|
|
406
|
+
if (!/^[A-Za-z0-9_-]{43}$/.test(token)) {
|
|
407
|
+
throw new Error('token contains unsupported characters.');
|
|
408
|
+
}
|
|
409
|
+
return { token };
|
|
410
|
+
};
|
|
411
|
+
export const assertVariantName = (valueArg) => {
|
|
412
|
+
const variant = assertString(valueArg, 'variant', 1, 64);
|
|
413
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(variant)) {
|
|
414
|
+
throw new Error('variant contains unsupported characters.');
|
|
415
|
+
}
|
|
416
|
+
return variant;
|
|
417
|
+
};
|
|
418
|
+
export function assertModelChoice(valueArg, nameArg = 'model') {
|
|
419
|
+
const model = assertObject(valueArg, nameArg);
|
|
420
|
+
if (model.harnessId === 'opencode') {
|
|
421
|
+
assertKeys(model, ['harnessId', 'providerID', 'modelID'], ['variant']);
|
|
422
|
+
}
|
|
423
|
+
else if (model.harnessId === 'flex') {
|
|
424
|
+
assertKeys(model, ['harnessId', 'providerConnectionId', 'providerID', 'modelID'], ['variant']);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
throw new Error(`${nameArg}.harnessId must be opencode or flex.`);
|
|
428
|
+
}
|
|
429
|
+
const variant = model.variant === undefined ? undefined : assertVariantName(model.variant);
|
|
430
|
+
const common = {
|
|
431
|
+
providerID: assertString(model.providerID, `${nameArg}.providerID`, 1, 256),
|
|
432
|
+
modelID: assertString(model.modelID, `${nameArg}.modelID`, 1, 256),
|
|
433
|
+
...(variant === undefined ? {} : { variant }),
|
|
434
|
+
};
|
|
435
|
+
if (model.harnessId === 'opencode')
|
|
436
|
+
return { harnessId: 'opencode', ...common };
|
|
437
|
+
return {
|
|
438
|
+
harnessId: 'flex',
|
|
439
|
+
providerConnectionId: assertOpaqueIdentifier(model.providerConnectionId, `${nameArg}.providerConnectionId`),
|
|
440
|
+
...common,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
const assertOptionalModelChoice = (valueArg, sessionIdArg) => {
|
|
444
|
+
if (valueArg === undefined)
|
|
445
|
+
return undefined;
|
|
446
|
+
const model = assertModelChoice(valueArg);
|
|
447
|
+
if (model.harnessId !== sessionIdArg.harnessId) {
|
|
448
|
+
throw new Error('model must belong to the same harness as sessionId.');
|
|
449
|
+
}
|
|
450
|
+
return model;
|
|
451
|
+
};
|
|
452
|
+
const attachmentMediaTypePattern = /^[a-z0-9!#$&^_.+-]{1,64}\/[a-z0-9!#$&^_.+-]{1,64}$/i;
|
|
453
|
+
const sanitizeAttachmentName = (valueArg, indexArg) => {
|
|
454
|
+
const raw = assertString(valueArg, `attachments[${indexArg}].name`, 1, 255);
|
|
455
|
+
// Basename only — uploads must never traverse out of their storage folder.
|
|
456
|
+
const basename = raw.split(/[/\\]/).pop() ?? '';
|
|
457
|
+
const cleaned = basename.replace(/[^A-Za-z0-9._ -]/g, '_').replace(/^\.+/, '').trim();
|
|
458
|
+
return cleaned || `file-${indexArg + 1}`;
|
|
459
|
+
};
|
|
460
|
+
const assertDraftAttachments = (valueArg) => {
|
|
461
|
+
if (!Array.isArray(valueArg))
|
|
462
|
+
throw new Error('attachments must be an array.');
|
|
463
|
+
if (valueArg.length > controllerMaxDraftAttachments) {
|
|
464
|
+
throw new Error(`At most ${controllerMaxDraftAttachments} draft attachments are allowed.`);
|
|
465
|
+
}
|
|
466
|
+
let totalRawBytes = 0;
|
|
467
|
+
const ids = new Set();
|
|
468
|
+
return valueArg.map((entry, index) => {
|
|
469
|
+
const attachment = assertObject(entry, `attachments[${index}]`);
|
|
470
|
+
assertKeys(attachment, ['id', 'name', 'mediaType', 'size', 'kind', 'dataBase64']);
|
|
471
|
+
const id = assertOpaqueIdentifier(attachment.id, `attachments[${index}].id`);
|
|
472
|
+
if (ids.has(id))
|
|
473
|
+
throw new Error('Attachment IDs must be unique.');
|
|
474
|
+
ids.add(id);
|
|
475
|
+
const mediaType = assertString(attachment.mediaType, `attachments[${index}].mediaType`, 1, 129);
|
|
476
|
+
if (!attachmentMediaTypePattern.test(mediaType)) {
|
|
477
|
+
throw new Error(`attachments[${index}].mediaType is not a valid media type.`);
|
|
478
|
+
}
|
|
479
|
+
if (typeof attachment.dataBase64 !== 'string'
|
|
480
|
+
|| attachment.dataBase64.length > Math.ceil((controllerMaxDraftAttachmentBytes * 4) / 3) + 4)
|
|
481
|
+
throw new Error(`attachments[${index}].dataBase64 is invalid.`);
|
|
482
|
+
const dataBase64 = attachment.dataBase64;
|
|
483
|
+
const decoded = Buffer.from(dataBase64, 'base64');
|
|
484
|
+
if (decoded.toString('base64') !== dataBase64) {
|
|
485
|
+
throw new Error(`attachments[${index}].dataBase64 must be valid base64.`);
|
|
486
|
+
}
|
|
487
|
+
const rawBytes = decoded.byteLength;
|
|
488
|
+
if (rawBytes > controllerMaxDraftAttachmentBytes) {
|
|
489
|
+
throw new Error(`attachments[${index}] exceeds the per-file upload limit.`);
|
|
490
|
+
}
|
|
491
|
+
if (!Number.isSafeInteger(attachment.size) || Number(attachment.size) !== rawBytes) {
|
|
492
|
+
throw new Error(`attachments[${index}].size must match the decoded content size.`);
|
|
493
|
+
}
|
|
494
|
+
if (!['image', 'text', 'binary'].includes(String(attachment.kind))) {
|
|
495
|
+
throw new Error(`attachments[${index}].kind is invalid.`);
|
|
496
|
+
}
|
|
497
|
+
totalRawBytes += rawBytes;
|
|
498
|
+
if (totalRawBytes > controllerMaxDraftAttachmentTotalBytes) {
|
|
499
|
+
throw new Error('The combined attachment size exceeds the upload limit.');
|
|
500
|
+
}
|
|
501
|
+
return {
|
|
502
|
+
id,
|
|
503
|
+
name: sanitizeAttachmentName(attachment.name, index),
|
|
504
|
+
mediaType,
|
|
505
|
+
size: rawBytes,
|
|
506
|
+
kind: attachment.kind,
|
|
507
|
+
dataBase64,
|
|
508
|
+
};
|
|
509
|
+
});
|
|
510
|
+
};
|
|
511
|
+
const assertDraftRevision = (valueArg, nameArg = 'draftRevision') => {
|
|
512
|
+
if (!Number.isSafeInteger(valueArg) || Number(valueArg) < 0) {
|
|
513
|
+
throw new Error(`${nameArg} must be a non-negative safe integer.`);
|
|
514
|
+
}
|
|
515
|
+
return Number(valueArg);
|
|
516
|
+
};
|
|
517
|
+
export const assertSessionDraftUpdateRequest = (valueArg) => {
|
|
518
|
+
const value = assertObject(valueArg, 'session draft update request');
|
|
519
|
+
assertKeys(value, ['projectId', 'sessionId', 'expectedRevision'], ['text', 'attachments']);
|
|
520
|
+
if (value.text === undefined && value.attachments === undefined) {
|
|
521
|
+
throw new Error('A draft update must replace text, attachments, or both.');
|
|
522
|
+
}
|
|
523
|
+
let text;
|
|
524
|
+
if (value.text !== undefined) {
|
|
525
|
+
if (typeof value.text !== 'string'
|
|
526
|
+
|| Buffer.byteLength(value.text, 'utf8') > controllerMaxDraftTextBytes)
|
|
527
|
+
throw new Error('text exceeds the draft UTF-8 byte limit.');
|
|
528
|
+
text = value.text;
|
|
529
|
+
}
|
|
530
|
+
const attachments = value.attachments === undefined
|
|
531
|
+
? undefined
|
|
532
|
+
: assertDraftAttachments(value.attachments);
|
|
533
|
+
return {
|
|
534
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
535
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
536
|
+
expectedRevision: assertDraftRevision(value.expectedRevision, 'expectedRevision'),
|
|
537
|
+
...(text === undefined ? {} : { text }),
|
|
538
|
+
...(attachments === undefined ? {} : { attachments }),
|
|
539
|
+
};
|
|
540
|
+
};
|
|
541
|
+
export const assertSessionSendRequest = (valueArg) => {
|
|
542
|
+
const value = assertObject(valueArg, 'session message request');
|
|
543
|
+
assertKeys(value, ['projectId', 'sessionId', 'draftRevision'], ['model']);
|
|
544
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds);
|
|
545
|
+
const model = assertOptionalModelChoice(value.model, sessionId);
|
|
546
|
+
return {
|
|
547
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
548
|
+
sessionId,
|
|
549
|
+
draftRevision: assertDraftRevision(value.draftRevision),
|
|
550
|
+
...(model === undefined ? {} : { model }),
|
|
551
|
+
};
|
|
552
|
+
};
|
|
553
|
+
export const assertSlashExecuteRequest = (valueArg) => {
|
|
554
|
+
const value = assertObject(valueArg, 'slash command execution request');
|
|
555
|
+
assertKeys(value, ['projectId', 'sessionId', 'draftRevision'], ['model']);
|
|
556
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds);
|
|
557
|
+
const model = assertOptionalModelChoice(value.model, sessionId);
|
|
558
|
+
return {
|
|
559
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
560
|
+
sessionId,
|
|
561
|
+
draftRevision: assertDraftRevision(value.draftRevision),
|
|
562
|
+
...(model === undefined ? {} : { model }),
|
|
563
|
+
};
|
|
564
|
+
};
|
|
565
|
+
export const assertPermissionReplyRequest = (valueArg) => {
|
|
566
|
+
const value = assertObject(valueArg, 'permission reply request');
|
|
567
|
+
assertKeys(value, ['projectId', 'sessionId', 'requestId', 'reply'], ['message']);
|
|
568
|
+
if (value.reply !== 'once' && value.reply !== 'reject') {
|
|
569
|
+
throw new Error('reply must be once or reject. Persistent broad grants are not supported.');
|
|
570
|
+
}
|
|
571
|
+
const message = value.message === undefined
|
|
572
|
+
? undefined
|
|
573
|
+
: assertString(value.message, 'message', 1, 2048);
|
|
574
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds);
|
|
575
|
+
const requestId = assertControllerRuntimeId(value.requestId, 'requestId', controllerSessionHarnessIds);
|
|
576
|
+
assertRelatedRuntimeIds(sessionId, requestId, 'requestId');
|
|
577
|
+
return {
|
|
578
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
579
|
+
sessionId,
|
|
580
|
+
requestId,
|
|
581
|
+
reply: value.reply,
|
|
582
|
+
...(message === undefined ? {} : { message }),
|
|
583
|
+
};
|
|
584
|
+
};
|
|
585
|
+
export const assertSessionGroupsGetRequest = (valueArg) => {
|
|
586
|
+
const value = assertObject(valueArg, 'session groups request');
|
|
587
|
+
assertKeys(value, ['projectId']);
|
|
588
|
+
return { projectId: assertIdentifier(value.projectId, 'projectId') };
|
|
589
|
+
};
|
|
590
|
+
export const assertSessionGroupsUpdateRequest = (valueArg) => {
|
|
591
|
+
const value = assertObject(valueArg, 'session groups update request');
|
|
592
|
+
assertKeys(value, ['projectId', 'groups'], ['ungroupedSessionIds', 'expectedRevision']);
|
|
593
|
+
const projectId = assertIdentifier(value.projectId, 'projectId');
|
|
594
|
+
if (!Array.isArray(value.groups) || value.groups.length > 64) {
|
|
595
|
+
throw new Error('groups must be a list of at most 64 groups.');
|
|
596
|
+
}
|
|
597
|
+
const groupIds = new Set();
|
|
598
|
+
const memberIds = new Set();
|
|
599
|
+
const groups = value.groups.map((groupArg) => {
|
|
600
|
+
const group = assertObject(groupArg, 'group');
|
|
601
|
+
assertKeys(group, ['id', 'name', 'sessionIds']);
|
|
602
|
+
const id = assertIdentifier(group.id, 'group id');
|
|
603
|
+
if (groupIds.has(id))
|
|
604
|
+
throw new Error('Group IDs must be unique.');
|
|
605
|
+
groupIds.add(id);
|
|
606
|
+
const name = assertString(group.name, 'group name', 1, 128);
|
|
607
|
+
// eslint-disable-next-line no-control-regex
|
|
608
|
+
if (/[\x00-\x1f\x7f]/.test(name) || name.trim().length === 0) {
|
|
609
|
+
throw new Error('Group names must be a single line of printable text.');
|
|
610
|
+
}
|
|
611
|
+
if (!Array.isArray(group.sessionIds) || group.sessionIds.length > 512) {
|
|
612
|
+
throw new Error('A group holds at most 512 layout items.');
|
|
613
|
+
}
|
|
614
|
+
const sessionIds = group.sessionIds.map((sessionIdArg) => {
|
|
615
|
+
const sessionId = assertControllerRuntimeId(sessionIdArg, 'layout item id', controllerSessionHarnessIds);
|
|
616
|
+
const sessionKey = controllerRuntimeIdKey(sessionId);
|
|
617
|
+
if (memberIds.has(sessionKey)) {
|
|
618
|
+
throw new Error('A layout item can only belong to one group.');
|
|
619
|
+
}
|
|
620
|
+
memberIds.add(sessionKey);
|
|
621
|
+
return sessionId;
|
|
622
|
+
});
|
|
623
|
+
return { id, name: name.trim(), sessionIds };
|
|
624
|
+
});
|
|
625
|
+
let ungroupedSessionIds;
|
|
626
|
+
if (value.ungroupedSessionIds !== undefined) {
|
|
627
|
+
if (!Array.isArray(value.ungroupedSessionIds) || value.ungroupedSessionIds.length > 2048) {
|
|
628
|
+
throw new Error('ungroupedSessionIds must be a list of at most 2048 layout item IDs.');
|
|
629
|
+
}
|
|
630
|
+
const ungroupedIds = new Set();
|
|
631
|
+
ungroupedSessionIds = value.ungroupedSessionIds.map((sessionIdArg) => {
|
|
632
|
+
const sessionId = assertControllerRuntimeId(sessionIdArg, 'ungrouped layout item id', controllerSessionHarnessIds);
|
|
633
|
+
const sessionKey = controllerRuntimeIdKey(sessionId);
|
|
634
|
+
if (memberIds.has(sessionKey) || ungroupedIds.has(sessionKey)) {
|
|
635
|
+
throw new Error('A layout item can only appear once in the session layout.');
|
|
636
|
+
}
|
|
637
|
+
ungroupedIds.add(sessionKey);
|
|
638
|
+
return sessionId;
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
let expectedRevision;
|
|
642
|
+
if (value.expectedRevision !== undefined) {
|
|
643
|
+
if (!Number.isSafeInteger(value.expectedRevision) || value.expectedRevision < 0) {
|
|
644
|
+
throw new Error('expectedRevision must be a non-negative safe integer.');
|
|
645
|
+
}
|
|
646
|
+
expectedRevision = value.expectedRevision;
|
|
647
|
+
}
|
|
648
|
+
return {
|
|
649
|
+
projectId,
|
|
650
|
+
groups,
|
|
651
|
+
...(ungroupedSessionIds === undefined ? {} : { ungroupedSessionIds }),
|
|
652
|
+
...(expectedRevision === undefined ? {} : { expectedRevision }),
|
|
653
|
+
};
|
|
654
|
+
};
|
|
655
|
+
export const assertSessionYoloRequest = (valueArg) => {
|
|
656
|
+
const value = assertObject(valueArg, 'session yolo request');
|
|
657
|
+
assertKeys(value, ['projectId', 'sessionId', 'enabled']);
|
|
658
|
+
if (typeof value.enabled !== 'boolean') {
|
|
659
|
+
throw new Error('enabled must be a boolean.');
|
|
660
|
+
}
|
|
661
|
+
return {
|
|
662
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
663
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', ['opencode', 'flex']),
|
|
664
|
+
enabled: value.enabled,
|
|
665
|
+
};
|
|
666
|
+
};
|
|
667
|
+
export const assertControllerSessionTitle = (valueArg) => {
|
|
668
|
+
const title = assertString(valueArg, 'title', 1, 2048);
|
|
669
|
+
// eslint-disable-next-line no-control-regex
|
|
670
|
+
if (/[\x00-\x1f\x7f]/.test(title) || title.trim().length === 0) {
|
|
671
|
+
throw new Error('title must be a single line of printable text.');
|
|
672
|
+
}
|
|
673
|
+
return title.trim();
|
|
674
|
+
};
|
|
675
|
+
export const assertSessionRenameRequest = (valueArg) => {
|
|
676
|
+
const value = assertObject(valueArg, 'session rename request');
|
|
677
|
+
assertKeys(value, ['projectId', 'sessionId', 'title']);
|
|
678
|
+
return {
|
|
679
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
680
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
681
|
+
title: assertControllerSessionTitle(value.title),
|
|
682
|
+
};
|
|
683
|
+
};
|
|
684
|
+
export const assertSessionArchiveRequest = (valueArg) => {
|
|
685
|
+
const value = assertObject(valueArg, 'session archive request');
|
|
686
|
+
assertKeys(value, ['projectId', 'sessionId']);
|
|
687
|
+
return {
|
|
688
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
689
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
690
|
+
};
|
|
691
|
+
};
|
|
692
|
+
const assertSingleLineText = (valueArg, nameArg, maximumArg) => {
|
|
693
|
+
const text = assertString(valueArg, nameArg, 1, maximumArg);
|
|
694
|
+
// eslint-disable-next-line no-control-regex
|
|
695
|
+
if (/[\x00-\x1f\x7f]/.test(text) || text.trim().length === 0) {
|
|
696
|
+
throw new Error(`${nameArg} must be a single line of printable text.`);
|
|
697
|
+
}
|
|
698
|
+
return text.trim();
|
|
699
|
+
};
|
|
700
|
+
const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
701
|
+
export const assertTerminalListRequest = (valueArg) => {
|
|
702
|
+
const value = assertObject(valueArg, 'terminal list request');
|
|
703
|
+
assertKeys(value, ['projectId']);
|
|
704
|
+
return { projectId: assertIdentifier(value.projectId, 'projectId') };
|
|
705
|
+
};
|
|
706
|
+
export const assertResourceListRequest = (valueArg) => {
|
|
707
|
+
const value = assertObject(valueArg, 'resource list request');
|
|
708
|
+
assertKeys(value, ['projectId']);
|
|
709
|
+
return { projectId: assertIdentifier(value.projectId, 'projectId') };
|
|
710
|
+
};
|
|
711
|
+
export const assertResourceCreateRequest = (valueArg) => {
|
|
712
|
+
const value = assertObject(valueArg, 'resource create request');
|
|
713
|
+
assertKeys(value, ['projectId', 'kind'], ['title']);
|
|
714
|
+
if (value.kind !== 'terminal' && value.kind !== 'browser') {
|
|
715
|
+
throw new Error('kind must be terminal or browser.');
|
|
716
|
+
}
|
|
717
|
+
const title = value.title === undefined
|
|
718
|
+
? undefined
|
|
719
|
+
: assertSingleLineText(value.title, 'title', 256);
|
|
720
|
+
return {
|
|
721
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
722
|
+
kind: value.kind,
|
|
723
|
+
...(title === undefined ? {} : { title }),
|
|
724
|
+
};
|
|
725
|
+
};
|
|
726
|
+
export const assertResourceRenameRequest = (valueArg) => {
|
|
727
|
+
const value = assertObject(valueArg, 'resource rename request');
|
|
728
|
+
assertKeys(value, ['projectId', 'resourceId', 'title']);
|
|
729
|
+
return {
|
|
730
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
731
|
+
resourceId: assertIdentifier(value.resourceId, 'resourceId'),
|
|
732
|
+
title: assertSingleLineText(value.title, 'title', 256),
|
|
733
|
+
};
|
|
734
|
+
};
|
|
735
|
+
const assertAttachmentRevision = (valueArg) => {
|
|
736
|
+
if (!Number.isSafeInteger(valueArg) || valueArg < 0) {
|
|
737
|
+
throw new Error('expectedAttachmentRevision must be a non-negative safe integer.');
|
|
738
|
+
}
|
|
739
|
+
return valueArg;
|
|
740
|
+
};
|
|
741
|
+
export const assertResourceAttachRequest = (valueArg) => {
|
|
742
|
+
const value = assertObject(valueArg, 'resource attach request');
|
|
743
|
+
assertKeys(value, ['projectId', 'resourceId', 'sessionId', 'expectedAttachmentRevision']);
|
|
744
|
+
return {
|
|
745
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
746
|
+
resourceId: assertIdentifier(value.resourceId, 'resourceId'),
|
|
747
|
+
sessionId: assertControllerRuntimeId(value.sessionId, 'sessionId', controllerSessionHarnessIds),
|
|
748
|
+
expectedAttachmentRevision: assertAttachmentRevision(value.expectedAttachmentRevision),
|
|
749
|
+
};
|
|
750
|
+
};
|
|
751
|
+
export const assertResourceDetachRequest = (valueArg) => {
|
|
752
|
+
const value = assertObject(valueArg, 'resource detach request');
|
|
753
|
+
assertKeys(value, ['projectId', 'resourceId', 'expectedAttachmentRevision']);
|
|
754
|
+
return {
|
|
755
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
756
|
+
resourceId: assertIdentifier(value.resourceId, 'resourceId'),
|
|
757
|
+
expectedAttachmentRevision: assertAttachmentRevision(value.expectedAttachmentRevision),
|
|
758
|
+
};
|
|
759
|
+
};
|
|
760
|
+
export const assertResourceTargetRequest = (valueArg, nameArg) => {
|
|
761
|
+
const value = assertObject(valueArg, nameArg);
|
|
762
|
+
assertKeys(value, ['projectId', 'resourceId']);
|
|
763
|
+
return {
|
|
764
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
765
|
+
resourceId: assertIdentifier(value.resourceId, 'resourceId'),
|
|
766
|
+
};
|
|
767
|
+
};
|
|
768
|
+
const assertBrowserViewport = (valueArg, nameArg) => {
|
|
769
|
+
const value = assertObject(valueArg, nameArg);
|
|
770
|
+
assertKeys(value, ['width', 'height', 'deviceScaleFactor']);
|
|
771
|
+
if (!Number.isInteger(value.width) || value.width < 1 || value.width > 4096
|
|
772
|
+
|| !Number.isInteger(value.height) || value.height < 1 || value.height > 4096
|
|
773
|
+
|| typeof value.deviceScaleFactor !== 'number'
|
|
774
|
+
|| !Number.isFinite(value.deviceScaleFactor)
|
|
775
|
+
|| value.deviceScaleFactor < 0.25
|
|
776
|
+
|| value.deviceScaleFactor > 4)
|
|
777
|
+
throw new Error(`${nameArg} is invalid.`);
|
|
778
|
+
return value;
|
|
779
|
+
};
|
|
780
|
+
const assertBrowserInputBase = (valueArg, nameArg) => {
|
|
781
|
+
if (!Number.isSafeInteger(valueArg.generation) || valueArg.generation < 0
|
|
782
|
+
|| !Number.isSafeInteger(valueArg.viewportRevision) || valueArg.viewportRevision < 0)
|
|
783
|
+
throw new Error(`${nameArg} has an invalid frame identity.`);
|
|
784
|
+
return {
|
|
785
|
+
tabId: assertIdentifier(valueArg.tabId, `${nameArg}.tabId`),
|
|
786
|
+
generation: valueArg.generation,
|
|
787
|
+
viewportRevision: valueArg.viewportRevision,
|
|
788
|
+
};
|
|
789
|
+
};
|
|
790
|
+
const assertBrowserModifiers = (valueArg, nameArg) => {
|
|
791
|
+
if (valueArg === undefined)
|
|
792
|
+
return undefined;
|
|
793
|
+
const value = assertObject(valueArg, nameArg);
|
|
794
|
+
assertKeys(value, [], ['alt', 'control', 'meta', 'shift']);
|
|
795
|
+
for (const key of Object.keys(value)) {
|
|
796
|
+
if (typeof value[key] !== 'boolean')
|
|
797
|
+
throw new Error(`${nameArg}.${key} must be boolean.`);
|
|
798
|
+
}
|
|
799
|
+
return value;
|
|
800
|
+
};
|
|
801
|
+
const assertFiniteNumber = (valueArg, nameArg) => {
|
|
802
|
+
if (typeof valueArg !== 'number' || !Number.isFinite(valueArg)) {
|
|
803
|
+
throw new Error(`${nameArg} must be finite.`);
|
|
804
|
+
}
|
|
805
|
+
return valueArg;
|
|
806
|
+
};
|
|
807
|
+
export const assertBrowserViewOpenRequest = (valueArg) => {
|
|
808
|
+
const value = assertObject(valueArg, 'browser view open request');
|
|
809
|
+
assertKeys(value, ['projectId', 'resourceId', 'expectedAttachmentRevision']);
|
|
810
|
+
return {
|
|
811
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
812
|
+
resourceId: assertIdentifier(value.resourceId, 'resourceId'),
|
|
813
|
+
expectedAttachmentRevision: assertAttachmentRevision(value.expectedAttachmentRevision),
|
|
814
|
+
};
|
|
815
|
+
};
|
|
816
|
+
export const assertBrowserViewCloseRequest = (valueArg) => {
|
|
817
|
+
const value = assertObject(valueArg, 'browser view close request');
|
|
818
|
+
assertKeys(value, ['viewId']);
|
|
819
|
+
return { viewId: assertIdentifier(value.viewId, 'viewId') };
|
|
820
|
+
};
|
|
821
|
+
export const assertBrowserViewActivateRequest = (valueArg) => {
|
|
822
|
+
const value = assertObject(valueArg, 'browser view activation request');
|
|
823
|
+
assertKeys(value, ['viewId']);
|
|
824
|
+
return { viewId: assertIdentifier(value.viewId, 'viewId') };
|
|
825
|
+
};
|
|
826
|
+
export const assertBrowserViewOperateRequest = (valueArg) => {
|
|
827
|
+
const value = assertObject(valueArg, 'browser view operation request');
|
|
828
|
+
assertKeys(value, ['viewId', 'operation']);
|
|
829
|
+
const operation = assertObject(value.operation, 'operation');
|
|
830
|
+
if (typeof operation.type !== 'string')
|
|
831
|
+
throw new Error('operation.type is invalid.');
|
|
832
|
+
if (operation.type === 'acknowledgeFrame') {
|
|
833
|
+
assertKeys(operation, ['type', 'acknowledgement']);
|
|
834
|
+
const acknowledgement = assertObject(operation.acknowledgement, 'acknowledgement');
|
|
835
|
+
assertKeys(acknowledgement, ['tabId', 'sequence', 'generation', 'viewportRevision']);
|
|
836
|
+
if (!Number.isSafeInteger(acknowledgement.sequence) || acknowledgement.sequence < 0) {
|
|
837
|
+
throw new Error('acknowledgement.sequence is invalid.');
|
|
838
|
+
}
|
|
839
|
+
return {
|
|
840
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
841
|
+
operation: {
|
|
842
|
+
type: 'acknowledgeFrame',
|
|
843
|
+
acknowledgement: {
|
|
844
|
+
...assertBrowserInputBase(acknowledgement, 'acknowledgement'),
|
|
845
|
+
sequence: acknowledgement.sequence,
|
|
846
|
+
},
|
|
847
|
+
},
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
if (operation.type === 'setViewport') {
|
|
851
|
+
assertKeys(operation, ['type', 'viewport']);
|
|
852
|
+
return {
|
|
853
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
854
|
+
operation: { type: 'setViewport', viewport: assertBrowserViewport(operation.viewport, 'viewport') },
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
if (operation.type === 'dispatchMouse') {
|
|
858
|
+
assertKeys(operation, ['type', 'input']);
|
|
859
|
+
const input = assertObject(operation.input, 'input');
|
|
860
|
+
assertKeys(input, ['tabId', 'generation', 'viewportRevision', 'type', 'x', 'y'], [
|
|
861
|
+
'button', 'buttons', 'clickCount', 'modifiers',
|
|
862
|
+
]);
|
|
863
|
+
if (!['move', 'down', 'up'].includes(String(input.type)))
|
|
864
|
+
throw new Error('input.type is invalid.');
|
|
865
|
+
if (input.button !== undefined && !['none', 'left', 'middle', 'right', 'back', 'forward'].includes(String(input.button))) {
|
|
866
|
+
throw new Error('input.button is invalid.');
|
|
867
|
+
}
|
|
868
|
+
const modifiers = assertBrowserModifiers(input.modifiers, 'input.modifiers');
|
|
869
|
+
return {
|
|
870
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
871
|
+
operation: { type: 'dispatchMouse', input: {
|
|
872
|
+
...assertBrowserInputBase(input, 'input'),
|
|
873
|
+
type: input.type,
|
|
874
|
+
x: assertFiniteNumber(input.x, 'input.x'),
|
|
875
|
+
y: assertFiniteNumber(input.y, 'input.y'),
|
|
876
|
+
...(input.button === undefined ? {} : { button: input.button }),
|
|
877
|
+
...(input.buttons === undefined ? {} : { buttons: assertFiniteNumber(input.buttons, 'input.buttons') }),
|
|
878
|
+
...(input.clickCount === undefined ? {} : { clickCount: assertFiniteNumber(input.clickCount, 'input.clickCount') }),
|
|
879
|
+
...(modifiers === undefined ? {} : { modifiers }),
|
|
880
|
+
} },
|
|
881
|
+
};
|
|
882
|
+
}
|
|
883
|
+
if (operation.type === 'dispatchWheel') {
|
|
884
|
+
assertKeys(operation, ['type', 'input']);
|
|
885
|
+
const input = assertObject(operation.input, 'input');
|
|
886
|
+
assertKeys(input, ['tabId', 'generation', 'viewportRevision', 'x', 'y', 'deltaX', 'deltaY'], ['modifiers']);
|
|
887
|
+
const modifiers = assertBrowserModifiers(input.modifiers, 'input.modifiers');
|
|
888
|
+
return {
|
|
889
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
890
|
+
operation: { type: 'dispatchWheel', input: {
|
|
891
|
+
...assertBrowserInputBase(input, 'input'),
|
|
892
|
+
x: assertFiniteNumber(input.x, 'input.x'),
|
|
893
|
+
y: assertFiniteNumber(input.y, 'input.y'),
|
|
894
|
+
deltaX: assertFiniteNumber(input.deltaX, 'input.deltaX'),
|
|
895
|
+
deltaY: assertFiniteNumber(input.deltaY, 'input.deltaY'),
|
|
896
|
+
...(modifiers === undefined ? {} : { modifiers }),
|
|
897
|
+
} },
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
if (operation.type === 'dispatchKey') {
|
|
901
|
+
assertKeys(operation, ['type', 'input']);
|
|
902
|
+
const input = assertObject(operation.input, 'input');
|
|
903
|
+
assertKeys(input, ['tabId', 'generation', 'viewportRevision', 'type', 'key'], [
|
|
904
|
+
'code', 'text', 'unmodifiedText', 'windowsVirtualKeyCode', 'nativeVirtualKeyCode',
|
|
905
|
+
'autoRepeat', 'isKeypad', 'location', 'modifiers',
|
|
906
|
+
]);
|
|
907
|
+
if (input.type !== 'down' && input.type !== 'up')
|
|
908
|
+
throw new Error('input.type is invalid.');
|
|
909
|
+
const optionalString = (keyArg) => input[keyArg] === undefined
|
|
910
|
+
? undefined
|
|
911
|
+
: assertString(input[keyArg], `input.${keyArg}`, 0, 256);
|
|
912
|
+
const optionalInteger = (keyArg) => {
|
|
913
|
+
const candidate = input[keyArg];
|
|
914
|
+
if (candidate === undefined)
|
|
915
|
+
return undefined;
|
|
916
|
+
if (!Number.isSafeInteger(candidate) || candidate < 0)
|
|
917
|
+
throw new Error(`input.${keyArg} is invalid.`);
|
|
918
|
+
return candidate;
|
|
919
|
+
};
|
|
920
|
+
const modifiers = assertBrowserModifiers(input.modifiers, 'input.modifiers');
|
|
921
|
+
return {
|
|
922
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
923
|
+
operation: { type: 'dispatchKey', input: {
|
|
924
|
+
...assertBrowserInputBase(input, 'input'),
|
|
925
|
+
type: input.type,
|
|
926
|
+
key: assertString(input.key, 'input.key', 1, 256),
|
|
927
|
+
...['code', 'text', 'unmodifiedText'].reduce((result, key) => {
|
|
928
|
+
const candidate = optionalString(key);
|
|
929
|
+
if (candidate !== undefined)
|
|
930
|
+
result[key] = candidate;
|
|
931
|
+
return result;
|
|
932
|
+
}, {}),
|
|
933
|
+
...['windowsVirtualKeyCode', 'nativeVirtualKeyCode', 'location']
|
|
934
|
+
.reduce((result, key) => {
|
|
935
|
+
const candidate = optionalInteger(key);
|
|
936
|
+
if (candidate !== undefined)
|
|
937
|
+
result[key] = candidate;
|
|
938
|
+
return result;
|
|
939
|
+
}, {}),
|
|
940
|
+
...(typeof input.autoRepeat === 'boolean' ? { autoRepeat: input.autoRepeat } : {}),
|
|
941
|
+
...(typeof input.isKeypad === 'boolean' ? { isKeypad: input.isKeypad } : {}),
|
|
942
|
+
...(modifiers === undefined ? {} : { modifiers }),
|
|
943
|
+
} },
|
|
944
|
+
};
|
|
945
|
+
}
|
|
946
|
+
if (operation.type === 'insertText') {
|
|
947
|
+
assertKeys(operation, ['type', 'input']);
|
|
948
|
+
const input = assertObject(operation.input, 'input');
|
|
949
|
+
assertKeys(input, ['tabId', 'generation', 'viewportRevision', 'text']);
|
|
950
|
+
return {
|
|
951
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
952
|
+
operation: { type: 'insertText', input: {
|
|
953
|
+
...assertBrowserInputBase(input, 'input'),
|
|
954
|
+
text: assertString(input.text, 'input.text', 1, 16 * 1024),
|
|
955
|
+
} },
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
if (operation.type === 'navigate') {
|
|
959
|
+
assertKeys(operation, ['type', 'url'], ['tabId', 'timeoutMs']);
|
|
960
|
+
return {
|
|
961
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
962
|
+
operation: {
|
|
963
|
+
type: 'navigate',
|
|
964
|
+
url: assertString(operation.url, 'operation.url', 1, 8192),
|
|
965
|
+
...(operation.tabId === undefined ? {} : { tabId: assertIdentifier(operation.tabId, 'operation.tabId') }),
|
|
966
|
+
...(operation.timeoutMs === undefined ? {} : { timeoutMs: assertFiniteNumber(operation.timeoutMs, 'operation.timeoutMs') }),
|
|
967
|
+
},
|
|
968
|
+
};
|
|
969
|
+
}
|
|
970
|
+
if (operation.type === 'createTab') {
|
|
971
|
+
assertKeys(operation, ['type'], ['url', 'activate']);
|
|
972
|
+
if (operation.activate !== undefined && typeof operation.activate !== 'boolean')
|
|
973
|
+
throw new Error('operation.activate is invalid.');
|
|
974
|
+
return {
|
|
975
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
976
|
+
operation: {
|
|
977
|
+
type: 'createTab',
|
|
978
|
+
...(operation.url === undefined ? {} : { url: assertString(operation.url, 'operation.url', 1, 8192) }),
|
|
979
|
+
...(operation.activate === undefined ? {} : { activate: operation.activate }),
|
|
980
|
+
},
|
|
981
|
+
};
|
|
982
|
+
}
|
|
983
|
+
if (operation.type === 'activateTab' || operation.type === 'closeTab') {
|
|
984
|
+
assertKeys(operation, ['type', 'tabId']);
|
|
985
|
+
return {
|
|
986
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
987
|
+
operation: { type: operation.type, tabId: assertIdentifier(operation.tabId, 'operation.tabId') },
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
if (operation.type === 'back' || operation.type === 'forward' || operation.type === 'reload') {
|
|
991
|
+
assertKeys(operation, ['type'], ['tabId']);
|
|
992
|
+
return {
|
|
993
|
+
viewId: assertIdentifier(value.viewId, 'viewId'),
|
|
994
|
+
operation: {
|
|
995
|
+
type: operation.type,
|
|
996
|
+
...(operation.tabId === undefined ? {} : { tabId: assertIdentifier(operation.tabId, 'operation.tabId') }),
|
|
997
|
+
},
|
|
998
|
+
};
|
|
999
|
+
}
|
|
1000
|
+
throw new Error('operation.type is unsupported.');
|
|
1001
|
+
};
|
|
1002
|
+
export const assertTerminalCreateRequest = (valueArg) => {
|
|
1003
|
+
const value = assertObject(valueArg, 'terminal create request');
|
|
1004
|
+
assertKeys(value, ['projectId'], ['title']);
|
|
1005
|
+
const title = value.title === undefined
|
|
1006
|
+
? undefined
|
|
1007
|
+
: assertSingleLineText(value.title, 'title', 256);
|
|
1008
|
+
return {
|
|
1009
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
1010
|
+
...(title === undefined ? {} : { title }),
|
|
1011
|
+
};
|
|
1012
|
+
};
|
|
1013
|
+
export const assertTerminalRenameRequest = (valueArg) => {
|
|
1014
|
+
const value = assertObject(valueArg, 'terminal rename request');
|
|
1015
|
+
assertKeys(value, ['projectId', 'terminalId', 'title']);
|
|
1016
|
+
return {
|
|
1017
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
1018
|
+
terminalId: assertControllerRuntimeId(value.terminalId, 'terminalId', ['controller']),
|
|
1019
|
+
title: assertSingleLineText(value.title, 'title', 256),
|
|
1020
|
+
};
|
|
1021
|
+
};
|
|
1022
|
+
export const assertTerminalTargetRequest = (valueArg, nameArg) => {
|
|
1023
|
+
const value = assertObject(valueArg, nameArg);
|
|
1024
|
+
assertKeys(value, ['projectId', 'terminalId']);
|
|
1025
|
+
return {
|
|
1026
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
1027
|
+
terminalId: assertControllerRuntimeId(value.terminalId, 'terminalId', ['controller']),
|
|
1028
|
+
};
|
|
1029
|
+
};
|
|
1030
|
+
export const assertTerminalInputRequest = (valueArg) => {
|
|
1031
|
+
const value = assertObject(valueArg, 'terminal input request');
|
|
1032
|
+
assertKeys(value, ['projectId', 'terminalId', 'dataBase64']);
|
|
1033
|
+
const dataBase64 = assertString(value.dataBase64, 'dataBase64', 1, 16 * 1024);
|
|
1034
|
+
if (!base64Pattern.test(dataBase64)) {
|
|
1035
|
+
throw new Error('dataBase64 must be valid base64.');
|
|
1036
|
+
}
|
|
1037
|
+
return {
|
|
1038
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
1039
|
+
terminalId: assertControllerRuntimeId(value.terminalId, 'terminalId', ['controller']),
|
|
1040
|
+
dataBase64,
|
|
1041
|
+
};
|
|
1042
|
+
};
|
|
1043
|
+
export const assertTerminalResizeRequest = (valueArg) => {
|
|
1044
|
+
const value = assertObject(valueArg, 'terminal resize request');
|
|
1045
|
+
assertKeys(value, ['projectId', 'terminalId', 'rows', 'cols']);
|
|
1046
|
+
const assertDimension = (candidate, nameArg) => {
|
|
1047
|
+
if (!Number.isSafeInteger(candidate) || candidate < 2 || candidate > 500) {
|
|
1048
|
+
throw new Error(`${nameArg} must be an integer between 2 and 500.`);
|
|
1049
|
+
}
|
|
1050
|
+
return candidate;
|
|
1051
|
+
};
|
|
1052
|
+
return {
|
|
1053
|
+
projectId: assertIdentifier(value.projectId, 'projectId'),
|
|
1054
|
+
terminalId: assertControllerRuntimeId(value.terminalId, 'terminalId', ['controller']),
|
|
1055
|
+
rows: assertDimension(value.rows, 'rows'),
|
|
1056
|
+
cols: assertDimension(value.cols, 'cols'),
|
|
1057
|
+
};
|
|
1058
|
+
};
|
|
1059
|
+
export const assertQuestionReplyRequest = (valueArg) => {
|
|
1060
|
+
const value = assertObject(valueArg, 'question reply request');
|
|
1061
|
+
assertKeys(value, ['projectId', 'sessionId', 'requestId', 'answers']);
|
|
1062
|
+
const projectId = assertIdentifier(value.projectId, 'projectId');
|
|
1063
|
+
const sessionId = assertControllerRuntimeId(value.sessionId, 'sessionId', ['opencode']);
|
|
1064
|
+
const requestId = assertControllerRuntimeId(value.requestId, 'requestId', ['opencode']);
|
|
1065
|
+
assertRelatedRuntimeIds(sessionId, requestId, 'requestId');
|
|
1066
|
+
if (value.answers === null) {
|
|
1067
|
+
return { projectId, sessionId, requestId, answers: null };
|
|
1068
|
+
}
|
|
1069
|
+
if (!Array.isArray(value.answers) || value.answers.length === 0 || value.answers.length > 16) {
|
|
1070
|
+
throw new Error('answers must be null or contain 1-16 per-question answer lists.');
|
|
1071
|
+
}
|
|
1072
|
+
const answers = value.answers.map((answerList) => {
|
|
1073
|
+
if (!Array.isArray(answerList) || answerList.length === 0 || answerList.length > 16) {
|
|
1074
|
+
throw new Error('Each question needs 1-16 selected answers.');
|
|
1075
|
+
}
|
|
1076
|
+
return answerList.map((answer) => {
|
|
1077
|
+
const text = assertString(answer, 'answer', 1, 4096);
|
|
1078
|
+
// eslint-disable-next-line no-control-regex
|
|
1079
|
+
if (/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(text)) {
|
|
1080
|
+
throw new Error('answer contains unsupported control characters.');
|
|
1081
|
+
}
|
|
1082
|
+
return text;
|
|
1083
|
+
});
|
|
1084
|
+
});
|
|
1085
|
+
return { projectId, sessionId, requestId, answers };
|
|
1086
|
+
};
|
|
1087
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy52YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEVBQ2pDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QiwyQkFBMkIsR0FDNUIsTUFBTSwyQkFBMkIsQ0FBQztBQUluQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQWlCLEVBQXVCLEVBQUU7SUFDL0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9GLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO0FBQzlELENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBaUIsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUNuRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLHFCQUFxQixDQUFDLENBQUM7SUFDL0UsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FDakIsUUFBaUIsRUFDakIsV0FBOEIsRUFDOUIsY0FBaUMsRUFBRSxFQUM3QixFQUFFO0lBQ1IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFB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
|