agl 1.0.17 → 21.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/.smartconfig.json +55 -0
  2. package/changelog.md +1026 -0
  3. package/cli.js +14 -0
  4. package/dist_serve/bundle.js +44778 -0
  5. package/dist_serve/index.html +13 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.authmodels.d.ts +126 -0
  9. package/dist_ts/classes.authmodels.js +1422 -0
  10. package/dist_ts/classes.authstore.d.ts +160 -0
  11. package/dist_ts/classes.authstore.js +2483 -0
  12. package/dist_ts/classes.browserresourcehost.d.ts +85 -0
  13. package/dist_ts/classes.browserresourcehost.js +912 -0
  14. package/dist_ts/classes.cli.d.ts +21 -0
  15. package/dist_ts/classes.cli.js +1082 -0
  16. package/dist_ts/classes.config.d.ts +23 -0
  17. package/dist_ts/classes.config.js +267 -0
  18. package/dist_ts/classes.controller.d.ts +523 -0
  19. package/dist_ts/classes.controller.js +10611 -0
  20. package/dist_ts/classes.controllermanagement.d.ts +32 -0
  21. package/dist_ts/classes.controllermanagement.js +222 -0
  22. package/dist_ts/classes.draftmanager.d.ts +30 -0
  23. package/dist_ts/classes.draftmanager.js +179 -0
  24. package/dist_ts/classes.embeddeddb.d.ts +30 -0
  25. package/dist_ts/classes.embeddeddb.js +159 -0
  26. package/dist_ts/classes.flexframedtransport.d.ts +56 -0
  27. package/dist_ts/classes.flexframedtransport.js +275 -0
  28. package/dist_ts/classes.flexmodels.private.d.ts +231 -0
  29. package/dist_ts/classes.flexmodels.private.js +985 -0
  30. package/dist_ts/classes.flexmodels.public.d.ts +207 -0
  31. package/dist_ts/classes.flexmodels.public.js +885 -0
  32. package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
  33. package/dist_ts/classes.flexprojectionreader.js +580 -0
  34. package/dist_ts/classes.flexservice.d.ts +196 -0
  35. package/dist_ts/classes.flexservice.js +3704 -0
  36. package/dist_ts/classes.flexstore.d.ts +174 -0
  37. package/dist_ts/classes.flexstore.js +3400 -0
  38. package/dist_ts/classes.flexsupervisor.d.ts +105 -0
  39. package/dist_ts/classes.flexsupervisor.js +1191 -0
  40. package/dist_ts/classes.gitreversion.d.ts +431 -0
  41. package/dist_ts/classes.gitreversion.js +10592 -0
  42. package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
  43. package/dist_ts/classes.harnessoperationmanager.js +602 -0
  44. package/dist_ts/classes.opencodeclient.d.ts +146 -0
  45. package/dist_ts/classes.opencodeclient.js +3003 -0
  46. package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
  47. package/dist_ts/classes.opencodesupervisor.js +1003 -0
  48. package/dist_ts/classes.passkeymanager.d.ts +34 -0
  49. package/dist_ts/classes.passkeymanager.js +456 -0
  50. package/dist_ts/classes.processinspection.d.ts +50 -0
  51. package/dist_ts/classes.processinspection.js +484 -0
  52. package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
  53. package/dist_ts/classes.resourcecoordinator.js +294 -0
  54. package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
  55. package/dist_ts/classes.sessionintelligencereader.js +40 -0
  56. package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
  57. package/dist_ts/classes.systemmetricssampler.js +168 -0
  58. package/dist_ts/classes.terminalmanager.d.ts +95 -0
  59. package/dist_ts/classes.terminalmanager.js +981 -0
  60. package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
  61. package/dist_ts/classes.terminalresourcehost.js +84 -0
  62. package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
  63. package/dist_ts/classes.upgradecoordinator.js +2155 -0
  64. package/dist_ts/classes.upgradetransaction.d.ts +92 -0
  65. package/dist_ts/classes.upgradetransaction.js +2125 -0
  66. package/dist_ts/classes.uploadmanager.d.ts +24 -0
  67. package/dist_ts/classes.uploadmanager.js +210 -0
  68. package/dist_ts/classes.validation.d.ts +91 -0
  69. package/dist_ts/classes.validation.js +1087 -0
  70. package/dist_ts/flexharness.child.d.ts +1 -0
  71. package/dist_ts/flexharness.child.js +28 -0
  72. package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
  73. package/dist_ts/functions.canonicaldirectory.js +144 -0
  74. package/dist_ts/functions.controllerdataroot.d.ts +15 -0
  75. package/dist_ts/functions.controllerdataroot.js +76 -0
  76. package/dist_ts/functions.embeddeddb.d.ts +2 -0
  77. package/dist_ts/functions.embeddeddb.js +21 -0
  78. package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
  79. package/dist_ts/functions.flexcredentialstore.js +93 -0
  80. package/dist_ts/functions.opencodeauth.d.ts +3 -0
  81. package/dist_ts/functions.opencodeauth.js +31 -0
  82. package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
  83. package/dist_ts/functions.runtimeenvironment.js +79 -0
  84. package/dist_ts/functions.upgradefollower.d.ts +3 -0
  85. package/dist_ts/functions.upgradefollower.js +95 -0
  86. package/dist_ts/index.d.ts +24 -0
  87. package/dist_ts/index.js +25 -0
  88. package/dist_ts/interfaces.auth.d.ts +181 -0
  89. package/dist_ts/interfaces.auth.js +82 -0
  90. package/dist_ts/interfaces.config.d.ts +34 -0
  91. package/dist_ts/interfaces.config.js +2 -0
  92. package/dist_ts/interfaces.flexipc.d.ts +939 -0
  93. package/dist_ts/interfaces.flexipc.js +1492 -0
  94. package/dist_ts/interfaces.gitreversion.d.ts +246 -0
  95. package/dist_ts/interfaces.gitreversion.js +2 -0
  96. package/dist_ts/interfaces.lifecycle.d.ts +37 -0
  97. package/dist_ts/interfaces.lifecycle.js +2 -0
  98. package/dist_ts/interfaces.opencode.d.ts +101 -0
  99. package/dist_ts/interfaces.opencode.js +3 -0
  100. package/dist_ts/interfaces.projects.d.ts +156 -0
  101. package/dist_ts/interfaces.projects.js +5 -0
  102. package/dist_ts/plugins.d.ts +36 -0
  103. package/dist_ts/plugins.js +40 -0
  104. package/dist_ts_interfaces/index.d.ts +2 -0
  105. package/dist_ts_interfaces/index.js +3 -0
  106. package/dist_ts_interfaces/interfaces.d.ts +747 -0
  107. package/dist_ts_interfaces/interfaces.js +47 -0
  108. package/dist_ts_interfaces/plugins.d.ts +4 -0
  109. package/dist_ts_interfaces/plugins.js +3 -0
  110. package/dist_ts_interfaces/requests.d.ts +806 -0
  111. package/dist_ts_interfaces/requests.js +2 -0
  112. package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
  113. package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
  114. package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
  115. package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
  116. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
  117. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
  118. package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
  119. package/dist_ts_migration/classes.migrationrunner.js +34 -0
  120. package/dist_ts_migration/index.d.ts +12 -0
  121. package/dist_ts_migration/index.js +13 -0
  122. package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
  123. package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
  124. package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
  125. package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
  126. package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
  127. package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
  128. package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
  129. package/dist_ts_migration/v18_resourcelayout.js +23 -0
  130. package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
  131. package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
  132. package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
  133. package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
  134. package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
  135. package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
  136. package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
  137. package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
  138. package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
  139. package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
  140. package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
  141. package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
  142. package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
  143. package/dist_ts_migration/v6_protocoldocuments.js +138 -0
  144. package/html/index.html +13 -0
  145. package/{LICENSE → license.md} +2 -2
  146. package/package.json +86 -48
  147. package/readme.md +480 -0
  148. package/readme.plan.md +188 -0
  149. package/ts/00_commitinfo_data.ts +8 -0
  150. package/ts/classes.authmodels.ts +1245 -0
  151. package/ts/classes.authstore.ts +3274 -0
  152. package/ts/classes.browserresourcehost.ts +1205 -0
  153. package/ts/classes.cli.ts +1254 -0
  154. package/ts/classes.config.ts +351 -0
  155. package/ts/classes.controller.ts +14426 -0
  156. package/ts/classes.controllermanagement.ts +330 -0
  157. package/ts/classes.draftmanager.ts +232 -0
  158. package/ts/classes.embeddeddb.ts +166 -0
  159. package/ts/classes.flexframedtransport.ts +283 -0
  160. package/ts/classes.flexmodels.private.ts +823 -0
  161. package/ts/classes.flexmodels.public.ts +732 -0
  162. package/ts/classes.flexprojectionreader.ts +816 -0
  163. package/ts/classes.flexservice.ts +4302 -0
  164. package/ts/classes.flexstore.ts +4565 -0
  165. package/ts/classes.flexsupervisor.ts +1453 -0
  166. package/ts/classes.gitreversion.ts +13353 -0
  167. package/ts/classes.harnessoperationmanager.ts +870 -0
  168. package/ts/classes.opencodeclient.ts +4110 -0
  169. package/ts/classes.opencodesupervisor.ts +1280 -0
  170. package/ts/classes.passkeymanager.ts +570 -0
  171. package/ts/classes.processinspection.ts +623 -0
  172. package/ts/classes.resourcecoordinator.ts +436 -0
  173. package/ts/classes.sessionintelligencereader.ts +52 -0
  174. package/ts/classes.systemmetricssampler.ts +215 -0
  175. package/ts/classes.terminalmanager.ts +1207 -0
  176. package/ts/classes.terminalresourcehost.ts +122 -0
  177. package/ts/classes.upgradecoordinator.ts +2675 -0
  178. package/ts/classes.upgradetransaction.ts +2900 -0
  179. package/ts/classes.uploadmanager.ts +240 -0
  180. package/ts/classes.validation.ts +1409 -0
  181. package/ts/flexharness.child.ts +35 -0
  182. package/ts/functions.canonicaldirectory.ts +213 -0
  183. package/ts/functions.controllerdataroot.ts +107 -0
  184. package/ts/functions.embeddeddb.ts +22 -0
  185. package/ts/functions.flexcredentialstore.ts +128 -0
  186. package/ts/functions.opencodeauth.ts +34 -0
  187. package/ts/functions.runtimeenvironment.ts +90 -0
  188. package/ts/functions.upgradefollower.ts +115 -0
  189. package/ts/index.ts +36 -6
  190. package/ts/interfaces.auth.ts +316 -0
  191. package/ts/interfaces.config.ts +37 -0
  192. package/ts/interfaces.flexipc.ts +2586 -0
  193. package/ts/interfaces.gitreversion.ts +336 -0
  194. package/ts/interfaces.lifecycle.ts +46 -0
  195. package/ts/interfaces.opencode.ts +153 -0
  196. package/ts/interfaces.projects.ts +182 -0
  197. package/ts/plugins.ts +64 -0
  198. package/ts_interfaces/index.ts +2 -0
  199. package/ts_interfaces/interfaces.ts +827 -0
  200. package/ts_interfaces/plugins.ts +15 -0
  201. package/ts_interfaces/requests.ts +1186 -0
  202. package/ts_migration/classes.documentmigrationrunner.ts +32 -0
  203. package/ts_migration/classes.flexmigrationrunner.ts +33 -0
  204. package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
  205. package/ts_migration/classes.migrationrunner.ts +40 -0
  206. package/ts_migration/index.ts +12 -0
  207. package/ts_migration/v10_flexharnessv3migration.ts +35 -0
  208. package/ts_migration/v13_flexprojectionorder.ts +33 -0
  209. package/ts_migration/v16_flexprovidercredentials.ts +196 -0
  210. package/ts_migration/v18_resourcelayout.ts +55 -0
  211. package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
  212. package/ts_migration/v19_flexprojectmanagement.ts +28 -0
  213. package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
  214. package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
  215. package/ts_migration/v2_controllerdataroot.ts +2349 -0
  216. package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
  217. package/ts_migration/v6_protocoldocuments.ts +198 -0
  218. package/ts_web/00_commitinfo_data.ts +8 -0
  219. package/ts_web/classes.controllersocketclient.ts +517 -0
  220. package/ts_web/classes.sessiondraftsync.ts +390 -0
  221. package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
  222. package/ts_web/index.ts +2 -0
  223. package/ts_web/plugins.ts +31 -0
  224. package/.gitlab-ci.yml +0 -71
  225. package/.npmignore +0 -5
  226. package/README.md +0 -40
  227. package/dist/cli.js +0 -2
  228. package/dist/index.d.ts +0 -0
  229. package/dist/index.js +0 -9
  230. package/dist/mod_bundle/index.d.ts +0 -1
  231. package/dist/mod_bundle/index.js +0 -18
  232. package/dist/mod_bundle/mod.plugins.d.ts +0 -4
  233. package/dist/mod_bundle/mod.plugins.js +0 -11
  234. package/dist/mod_install/index.d.ts +0 -4
  235. package/dist/mod_install/index.js +0 -21
  236. package/dist/mod_install/mod.plugins.d.ts +0 -1
  237. package/dist/mod_install/mod.plugins.js +0 -7
  238. package/dist/mod_standard/index.d.ts +0 -4
  239. package/dist/mod_standard/index.js +0 -21
  240. package/dist/mod_standard/mod.browser.d.ts +0 -6
  241. package/dist/mod_standard/mod.browser.js +0 -14
  242. package/dist/mod_standard/mod.clean.d.ts +0 -4
  243. package/dist/mod_standard/mod.clean.js +0 -12
  244. package/dist/mod_standard/mod.compile.d.ts +0 -4
  245. package/dist/mod_standard/mod.compile.js +0 -21
  246. package/dist/mod_standard/mod.plugins.d.ts +0 -8
  247. package/dist/mod_standard/mod.plugins.js +0 -19
  248. package/dist/mod_standard/mod.test.d.ts +0 -4
  249. package/dist/mod_standard/mod.test.js +0 -12
  250. package/dist/plr.cli.d.ts +0 -3
  251. package/dist/plr.cli.js +0 -57
  252. package/dist/plr.config.d.ts +0 -11
  253. package/dist/plr.config.js +0 -26
  254. package/dist/plr.mods.d.ts +0 -17
  255. package/dist/plr.mods.js +0 -17
  256. package/dist/plr.paths.d.ts +0 -19
  257. package/dist/plr.paths.js +0 -26
  258. package/dist/plr.plugins.d.ts +0 -8
  259. package/dist/plr.plugins.js +0 -16
  260. package/npmextra.json +0 -10
  261. package/ts/mod_bundle/index.ts +0 -20
  262. package/ts/mod_bundle/mod.plugins.ts +0 -9
  263. package/ts/mod_install/index.ts +0 -20
  264. package/ts/mod_install/mod.plugins.ts +0 -1
  265. package/ts/mod_standard/index.ts +0 -23
  266. package/ts/mod_standard/mod.browser.ts +0 -17
  267. package/ts/mod_standard/mod.clean.ts +0 -13
  268. package/ts/mod_standard/mod.compile.ts +0 -23
  269. package/ts/mod_standard/mod.plugins.ts +0 -17
  270. package/ts/mod_standard/mod.test.ts +0 -13
  271. package/ts/plr.cli.ts +0 -60
  272. package/ts/plr.config.ts +0 -36
  273. package/ts/plr.mods.ts +0 -25
  274. package/ts/plr.paths.ts +0 -29
  275. package/ts/plr.plugins.ts +0 -17
  276. package/tslint.json +0 -3
  277. package/yarn.lock +0 -3464
@@ -0,0 +1,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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