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,1492 @@
1
+ import * as plugins from './plugins.js';
2
+ import { controllerFilesystemIdentityMaximumComponents, controllerProjectLimit, } from './interfaces.projects.js';
3
+ export const flexIpcProtocolVersion = 14;
4
+ export const flexIpcMaximumFrameBytes = 2 * 1024 * 1024;
5
+ export const flexIpcMaximumPendingRequests = 64;
6
+ export const flexIpcMaximumBrowserChannels = 128;
7
+ export const flexIpcMaximumBrowserFrameBytes = 256 * 1024 + 4;
8
+ export const flexIpcMaximumPendingBrowserFrames = 128;
9
+ export const flexIpcMaximumPendingBrowserFrameBytes = 8 * 1024 * 1024;
10
+ export const flexIpcMaximumChildJobs = 64;
11
+ export const flexIpcMaximumPromptQueueEntries = 128;
12
+ export const flexIpcMaximumQueuedSessionChanges = 256;
13
+ export const flexIpcMaximumQueuedSessionChangeBytes = 8 * 1024 * 1024;
14
+ export const flexIpcControlTimeoutMs = 35_000;
15
+ export const flexIpcStartupTimeoutMs = 180_000;
16
+ export const flexIpcDisposeTimeoutMs = 10_000;
17
+ export const flexIpcSlashTimeoutMs = 30 * 60 * 1000;
18
+ export const flexIpcMaximumHostTimeoutMs = 5 * 60 * 1000;
19
+ export const flexIpcCancellationGraceTimeoutMs = 2_000;
20
+ export const flexServiceErrorMessages = {
21
+ INVALID_REQUEST: 'The Flex request is invalid.',
22
+ NOT_READY: 'The Flex service is not ready.',
23
+ NOT_FOUND: 'The requested Flex resource was not found.',
24
+ CONFLICT: 'The Flex operation conflicted with a concurrent change.',
25
+ BUSY: 'The Flex resource is busy.',
26
+ TIMEOUT: 'The Flex operation timed out.',
27
+ ABORTED: 'The Flex operation was aborted.',
28
+ OUTCOME_UNKNOWN: 'The Flex operation outcome is unknown.',
29
+ SLASH_UNAVAILABLE: 'The Flex slash command is unavailable.',
30
+ LIMIT_EXCEEDED: 'The Flex service limit was reached.',
31
+ STALE_RUN: 'The requested Flex run is no longer current.',
32
+ PROVIDER_LOGIN_FAILED: 'The provider login did not complete.',
33
+ PROVIDER_REAUTH_REQUIRED: 'The provider connection requires authentication.',
34
+ MODEL_CATALOG_REQUIRED: 'The provider model catalog must be refreshed.',
35
+ UNSUPPORTED_RUNTIME: 'The Flex child runtime is unsupported.',
36
+ INTERNAL: 'The Flex operation failed.',
37
+ };
38
+ const requestMethods = new Set([
39
+ 'service.status',
40
+ 'project.replaceAll',
41
+ 'project.register',
42
+ 'project.remove',
43
+ 'intelligence.start',
44
+ 'intelligence.get',
45
+ 'intelligence.cancel',
46
+ 'session.list',
47
+ 'session.create',
48
+ 'session.get',
49
+ 'session.update',
50
+ 'session.delete',
51
+ 'session.compact',
52
+ 'session.reversion.info',
53
+ 'slash.list',
54
+ 'slash.execute',
55
+ 'message.page',
56
+ 'message.get',
57
+ 'prompt.start',
58
+ 'prompt.acknowledge',
59
+ 'prompt.get',
60
+ 'prompt.list',
61
+ 'prompt.cancel',
62
+ 'permission.list',
63
+ 'permission.respond',
64
+ 'provider.list',
65
+ 'provider.login.begin',
66
+ 'provider.login.status',
67
+ 'provider.login.cancel',
68
+ 'provider.connection.list',
69
+ 'provider.connection.opencode-auth.get',
70
+ 'provider.connection.logout.prepare',
71
+ 'provider.connection.logout',
72
+ 'provider.connection.ratelimits.get',
73
+ 'provider.models.refresh',
74
+ 'model.choice.get',
75
+ 'model.choice.set',
76
+ 'model.choice.validate',
77
+ ]);
78
+ const hostRequestMethods = new Set([
79
+ 'reversion.prepare',
80
+ 'reversion.inspect-capture',
81
+ 'reversion.finalize',
82
+ 'reversion.inspect-apply',
83
+ 'reversion.apply',
84
+ 'reversion.release',
85
+ 'git.worktree.create',
86
+ 'git.worktree.list',
87
+ 'git.worktree.remove',
88
+ 'crossharness.chats.list',
89
+ 'crossharness.chat.read',
90
+ 'project-management.load',
91
+ 'project-management.save',
92
+ 'project-management.tombstone',
93
+ 'project-management.purge',
94
+ 'browser.resources.resolve',
95
+ 'browser.channel.open',
96
+ 'browser.channel.close',
97
+ ]);
98
+ const serviceStates = new Set([
99
+ 'starting', 'ready', 'unsupported', 'failed', 'stopping', 'stopped',
100
+ ]);
101
+ const serviceStatusCodes = new Set([
102
+ 'UNSUPPORTED_RUNTIME', 'INITIALIZATION_FAILED', 'SERVICE_STOPPED',
103
+ ]);
104
+ const serviceErrorCodes = new Set(Object.keys(flexServiceErrorMessages));
105
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,511}$/u;
106
+ const projectIdPattern = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;
107
+ const requestIdPattern = /^[A-Za-z0-9_-]{22}$/u;
108
+ const qualifiedIdPattern = /^flex:(?:job|provider:openai):[A-Za-z0-9_-]{22}$/u;
109
+ const intelligenceCapabilityTokenPattern = /^[A-Za-z0-9_-]{43}$/u;
110
+ export const isFlexPlainObject = (valueArg) => typeof valueArg === 'object'
111
+ && valueArg !== null
112
+ && !Array.isArray(valueArg)
113
+ && (Object.getPrototypeOf(valueArg) === Object.prototype
114
+ || Object.getPrototypeOf(valueArg) === null);
115
+ export const hasFlexExactKeys = (valueArg, requiredKeysArg, optionalKeysArg = []) => {
116
+ const keys = Object.keys(valueArg);
117
+ return requiredKeysArg.every((key) => Object.hasOwn(valueArg, key))
118
+ && keys.every((key) => requiredKeysArg.includes(key) || optionalKeysArg.includes(key));
119
+ };
120
+ const isBoundedString = (valueArg, maximumBytesArg, allowEmptyArg = false) => typeof valueArg === 'string'
121
+ && (allowEmptyArg || valueArg.length > 0)
122
+ && Buffer.byteLength(valueArg, 'utf8') <= maximumBytesArg;
123
+ const isIdentifier = (valueArg) => isBoundedString(valueArg, 512) && identifierPattern.test(valueArg);
124
+ const isRequestId = (valueArg) => typeof valueArg === 'string' && requestIdPattern.test(valueArg);
125
+ const isChannelId = (valueArg) => typeof valueArg === 'string' && identifierPattern.test(valueArg);
126
+ const isCanonicalBrowserFrame = (valueArg) => {
127
+ if (typeof valueArg !== 'string' || valueArg.length === 0)
128
+ return false;
129
+ const bytes = Buffer.from(valueArg, 'base64');
130
+ return bytes.byteLength >= 1
131
+ && bytes.byteLength <= flexIpcMaximumBrowserFrameBytes
132
+ && bytes.toString('base64') === valueArg;
133
+ };
134
+ const isQualifiedId = (valueArg) => typeof valueArg === 'string' && qualifiedIdPattern.test(valueArg);
135
+ const isIntelligenceCapabilityToken = (valueArg) => typeof valueArg === 'string' && intelligenceCapabilityTokenPattern.test(valueArg);
136
+ const isIsoDate = (valueArg) => isBoundedString(valueArg, 64)
137
+ && Number.isFinite(Date.parse(valueArg))
138
+ && new Date(valueArg).toISOString() === valueArg;
139
+ const isNonNegativeInteger = (valueArg) => Number.isSafeInteger(valueArg) && valueArg >= 0;
140
+ const isFlexIntelligenceSessionId = (valueArg) => isFlexPlainObject(valueArg)
141
+ && hasFlexExactKeys(valueArg, ['harnessId', 'nativeId'])
142
+ && (valueArg.harnessId === 'opencode' || valueArg.harnessId === 'flex')
143
+ && isIdentifier(valueArg.nativeId);
144
+ const isFlexIntelligenceChatSummary = (valueArg) => isFlexPlainObject(valueArg)
145
+ && hasFlexExactKeys(valueArg, ['sessionId', 'title', 'updatedAt'], ['isActive'])
146
+ && isFlexIntelligenceSessionId(valueArg.sessionId)
147
+ && isBoundedString(valueArg.title, 4096, true)
148
+ && isIsoDate(valueArg.updatedAt)
149
+ && (valueArg.isActive === undefined || typeof valueArg.isActive === 'boolean');
150
+ const isFlexIntelligenceChatMessage = (valueArg) => isFlexPlainObject(valueArg)
151
+ && hasFlexExactKeys(valueArg, ['role', 'text'], ['timestamp'])
152
+ && isBoundedString(valueArg.role, 128)
153
+ && isBoundedString(valueArg.text, 16 * 1024, true)
154
+ && (valueArg.timestamp === undefined || isIsoDate(valueArg.timestamp));
155
+ const isFlexIntelligenceChatTranscript = (valueArg) => isFlexPlainObject(valueArg)
156
+ && hasFlexExactKeys(valueArg, ['sessionId', 'title', 'messages'], ['totalMessages'])
157
+ && isFlexIntelligenceSessionId(valueArg.sessionId)
158
+ && isBoundedString(valueArg.title, 4096, true)
159
+ && Array.isArray(valueArg.messages)
160
+ && valueArg.messages.length <= 50
161
+ && valueArg.messages.every(isFlexIntelligenceChatMessage)
162
+ && (valueArg.totalMessages === undefined || isNonNegativeInteger(valueArg.totalMessages))
163
+ && Buffer.byteLength(JSON.stringify(valueArg), 'utf8') <= 256 * 1024;
164
+ const isFlexIntelligenceResult = (valueArg) => (isFlexPlainObject(valueArg)
165
+ && hasFlexExactKeys(valueArg, ['answer', 'scratchpad', 'model'])
166
+ && isBoundedString(valueArg.answer, 128 * 1024, true)
167
+ && isBoundedString(valueArg.scratchpad, 128 * 1024, true)
168
+ && valueArg.answer.length <= 32_768
169
+ && valueArg.scratchpad.length <= 32_768
170
+ && valueArg.model === 'openai/gpt-5.6-luna');
171
+ const isJsonValue = (valueArg, depthArg = 0) => {
172
+ if (depthArg > 20)
173
+ return false;
174
+ if (valueArg === null
175
+ || typeof valueArg === 'string'
176
+ || typeof valueArg === 'boolean'
177
+ || (typeof valueArg === 'number' && Number.isFinite(valueArg)))
178
+ return true;
179
+ if (Array.isArray(valueArg)) {
180
+ return valueArg.length <= 4096 && valueArg.every((entry) => isJsonValue(entry, depthArg + 1));
181
+ }
182
+ if (!isFlexPlainObject(valueArg) || Object.keys(valueArg).length > 4096)
183
+ return false;
184
+ return Object.values(valueArg).every((entry) => isJsonValue(entry, depthArg + 1));
185
+ };
186
+ const isFlexSessionGeneration = (valueArg) => isBoundedString(valueArg.sessionGenerationId, plugins.flexharness.FLEX_SESSION_GENERATION_ID_MAX_BYTES)
187
+ && isNonNegativeInteger(valueArg.sessionGenerationSequence)
188
+ && Number(valueArg.sessionGenerationSequence) >= 1;
189
+ const isFlexProjectManagementRecord = (valueArg) => {
190
+ try {
191
+ plugins.flexharness.assertFlexProjectManagementRecord(valueArg);
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ };
198
+ const isFlexProjectManagementSnapshot = (valueArg) => {
199
+ try {
200
+ plugins.flexharness.assertFlexProjectManagementSnapshot(valueArg);
201
+ return true;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ };
207
+ const isFlexProjectManagementTombstone = (valueArg) => {
208
+ try {
209
+ plugins.flexharness.assertFlexProjectManagementTombstone(valueArg);
210
+ return true;
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ };
216
+ const isFlexProjectManagementWriteContext = (valueArg) => isFlexPlainObject(valueArg)
217
+ && hasFlexExactKeys(valueArg, ['actor'], ['runId', 'agent', 'toolCallId'])
218
+ && (valueArg.actor === 'agent' || valueArg.actor === 'application')
219
+ && ['runId', 'agent', 'toolCallId'].every((key) => (valueArg[key] === undefined || isBoundedString(valueArg[key], 512)));
220
+ const isFlexProjectManagementCommitResult = (valueArg) => isFlexPlainObject(valueArg)
221
+ && ((hasFlexExactKeys(valueArg, ['committed']) && valueArg.committed === true)
222
+ || (hasFlexExactKeys(valueArg, ['committed', 'actualRevision'])
223
+ && valueArg.committed === false
224
+ && isNonNegativeInteger(valueArg.actualRevision)));
225
+ export const isFlexProjectRecord = (valueArg) => {
226
+ if (!isFlexPlainObject(valueArg) || !hasFlexExactKeys(valueArg, ['projectId', 'directory'], ['directoryIdentity'])) {
227
+ return false;
228
+ }
229
+ if (typeof valueArg.projectId !== 'string'
230
+ || !projectIdPattern.test(valueArg.projectId)
231
+ || !isBoundedString(valueArg.directory, 4096)
232
+ || valueArg.directory.includes('\0')
233
+ || !plugins.path.isAbsolute(valueArg.directory)
234
+ || plugins.path.normalize(valueArg.directory) !== valueArg.directory)
235
+ return false;
236
+ if (valueArg.directoryIdentity === undefined)
237
+ return true;
238
+ const directoryIdentity = valueArg.directoryIdentity;
239
+ if (!isFlexPlainObject(directoryIdentity) || !Array.isArray(directoryIdentity.ancestry)) {
240
+ return false;
241
+ }
242
+ const ancestry = directoryIdentity.ancestry;
243
+ return hasFlexExactKeys(directoryIdentity, ['ancestry'])
244
+ && ancestry.length === 1
245
+ + valueArg.directory.slice(1).split('/').filter(Boolean).length
246
+ && ancestry.length <= controllerFilesystemIdentityMaximumComponents
247
+ && ancestry.every((component) => (isFlexPlainObject(component)
248
+ && hasFlexExactKeys(component, ['device', 'inode', 'type'])
249
+ && typeof component.device === 'string'
250
+ && /^(?:0|[1-9][0-9]{0,31})$/u.test(component.device)
251
+ && typeof component.inode === 'string'
252
+ && /^(?:0|[1-9][0-9]{0,31})$/u.test(component.inode)
253
+ && component.type === 'directory'));
254
+ };
255
+ export const isFlexIdentityBoundProjectRecord = (valueArg) => isFlexProjectRecord(valueArg)
256
+ && valueArg.directoryIdentity !== undefined;
257
+ export const isFlexDatabaseDescriptor = (valueArg) => isFlexPlainObject(valueArg)
258
+ && hasFlexExactKeys(valueArg, ['mongoDbUrl', 'mongoDbName'])
259
+ && isBoundedString(valueArg.mongoDbUrl, 4096)
260
+ && /^(?:mongodb|mongodb\+srv):\/\//u.test(valueArg.mongoDbUrl)
261
+ && typeof valueArg.mongoDbName === 'string'
262
+ && /^[A-Za-z0-9_-]{1,63}$/u.test(valueArg.mongoDbName);
263
+ const isFlexCredentialDirectory = (valueArg) => {
264
+ if (!isBoundedString(valueArg, 4096)
265
+ || !valueArg.startsWith('/')
266
+ || valueArg.includes('\0')
267
+ || valueArg === '/')
268
+ return false;
269
+ const segments = valueArg.split('/');
270
+ return !segments.some((segment, index) => (index > 0 && (segment === '' || segment === '.' || segment === '..')));
271
+ };
272
+ export const isFlexServiceInit = (valueArg) => {
273
+ if (!isFlexPlainObject(valueArg)
274
+ || !hasFlexExactKeys(valueArg, [
275
+ 'controllerId', 'database', 'flexCredentialDirectory', 'projects',
276
+ ])
277
+ || !isIdentifier(valueArg.controllerId)
278
+ || !isFlexDatabaseDescriptor(valueArg.database)
279
+ || !isFlexCredentialDirectory(valueArg.flexCredentialDirectory)
280
+ || !Array.isArray(valueArg.projects)
281
+ || valueArg.projects.length > controllerProjectLimit
282
+ || !valueArg.projects.every(isFlexProjectRecord))
283
+ return false;
284
+ return new Set(valueArg.projects.map((project) => project.projectId)).size
285
+ === valueArg.projects.length;
286
+ };
287
+ export const isFlexServiceStatus = (valueArg) => {
288
+ if (!isFlexPlainObject(valueArg)
289
+ || !hasFlexExactKeys(valueArg, ['state', 'ready'], ['code', 'startedAt'])
290
+ || typeof valueArg.state !== 'string'
291
+ || !serviceStates.has(valueArg.state)
292
+ || typeof valueArg.ready !== 'boolean'
293
+ || (valueArg.code !== undefined
294
+ && (typeof valueArg.code !== 'string' || !serviceStatusCodes.has(valueArg.code)))
295
+ || (valueArg.startedAt !== undefined && !isIsoDate(valueArg.startedAt)))
296
+ return false;
297
+ if (valueArg.state === 'ready')
298
+ return valueArg.ready && valueArg.code === undefined;
299
+ return !valueArg.ready;
300
+ };
301
+ const isAccountSummary = (valueArg) => isFlexPlainObject(valueArg)
302
+ && hasFlexExactKeys(valueArg, ['providerId', 'authKind'], ['accountId', 'email', 'plan'])
303
+ && valueArg.providerId === 'openai'
304
+ && valueArg.authKind === 'chatgptOAuth'
305
+ && ['accountId', 'email', 'plan'].every((key) => (valueArg[key] === undefined || isBoundedString(valueArg[key], 512)));
306
+ export const isFlexPublicProviderConnection = (valueArg) => isFlexPlainObject(valueArg)
307
+ && hasFlexExactKeys(valueArg, ['loginId', 'providerId', 'status'], ['account'])
308
+ && isQualifiedId(valueArg.loginId)
309
+ && valueArg.providerId === 'openai'
310
+ && ['pending', 'active', 'deleting', 'reauthRequired'].includes(String(valueArg.status))
311
+ && (valueArg.account === undefined || isAccountSummary(valueArg.account));
312
+ const isOpenCodeOAuthAuth = (valueArg) => (isFlexPlainObject(valueArg)
313
+ && hasFlexExactKeys(valueArg, ['type', 'access', 'refresh', 'expires'], ['accountId'])
314
+ && valueArg.type === 'oauth'
315
+ && isBoundedString(valueArg.access, 16 * 1024)
316
+ && isBoundedString(valueArg.refresh, 16 * 1024)
317
+ && isNonNegativeInteger(valueArg.expires)
318
+ && (valueArg.accountId === undefined || isBoundedString(valueArg.accountId, 512))
319
+ && Buffer.byteLength(JSON.stringify(valueArg), 'utf8') <= 48 * 1024);
320
+ const isModelChoice = (valueArg) => isFlexPlainObject(valueArg)
321
+ && hasFlexExactKeys(valueArg, ['providerConnectionId', 'modelId'], ['variant'])
322
+ && isQualifiedId(valueArg.providerConnectionId)
323
+ && isBoundedString(valueArg.modelId, 256)
324
+ && (valueArg.variant === undefined || isBoundedString(valueArg.variant, 128));
325
+ const isModelIdentity = (valueArg) => isFlexPlainObject(valueArg)
326
+ && hasFlexExactKeys(valueArg, ['provider', 'model'], ['displayName', 'variant'])
327
+ && isBoundedString(valueArg.provider, 256)
328
+ && isBoundedString(valueArg.model, 256)
329
+ && (valueArg.displayName === undefined || isBoundedString(valueArg.displayName, 512))
330
+ && (valueArg.variant === undefined || isBoundedString(valueArg.variant, 128));
331
+ const isUsage = (valueArg) => isFlexPlainObject(valueArg)
332
+ && hasFlexExactKeys(valueArg, [
333
+ 'inputTokens', 'outputTokens', 'totalTokens', 'cacheReadTokens', 'cacheWriteTokens',
334
+ ])
335
+ && Object.values(valueArg).every(isNonNegativeInteger);
336
+ const isMessagePart = (valueArg) => {
337
+ if (!isFlexPlainObject(valueArg) || !isIdentifier(valueArg.partId))
338
+ return false;
339
+ switch (valueArg.type) {
340
+ case 'text':
341
+ return hasFlexExactKeys(valueArg, ['partId', 'type', 'text'])
342
+ && isBoundedString(valueArg.text, 96 * 1024, true);
343
+ case 'reasoning':
344
+ return hasFlexExactKeys(valueArg, ['partId', 'type', 'text', 'status'])
345
+ && isBoundedString(valueArg.text, 96 * 1024, true)
346
+ && ['running', 'completed', 'cancelled'].includes(String(valueArg.status));
347
+ case 'tool':
348
+ return hasFlexExactKeys(valueArg, ['partId', 'type', 'toolCallId', 'toolName', 'status', 'input'], ['output', 'error', 'childSessionId', 'model'])
349
+ && isIdentifier(valueArg.toolCallId)
350
+ && isBoundedString(valueArg.toolName, 512)
351
+ && ['running', 'completed', 'failed', 'cancelled'].includes(String(valueArg.status))
352
+ && isJsonValue(valueArg.input)
353
+ && (valueArg.output === undefined || isJsonValue(valueArg.output))
354
+ && (valueArg.error === undefined || isBoundedString(valueArg.error, 2048))
355
+ && (valueArg.childSessionId === undefined || isIdentifier(valueArg.childSessionId))
356
+ && (valueArg.model === undefined || (valueArg.childSessionId !== undefined && isModelIdentity(valueArg.model)));
357
+ case 'attachment':
358
+ return hasFlexExactKeys(valueArg, ['partId', 'type', 'attachmentType', 'source'], ['sizeBytes', 'mediaType', 'name'])
359
+ && ['image', 'file'].includes(String(valueArg.attachmentType))
360
+ && ['inline-base64', 'data-url', 'remote-url'].includes(String(valueArg.source))
361
+ && (valueArg.sizeBytes === undefined || isNonNegativeInteger(valueArg.sizeBytes))
362
+ && (valueArg.mediaType === undefined || isBoundedString(valueArg.mediaType, 512))
363
+ && (valueArg.name === undefined || isBoundedString(valueArg.name, 1024));
364
+ default:
365
+ return false;
366
+ }
367
+ };
368
+ export const isFlexPublicMessage = (valueArg) => isFlexPlainObject(valueArg)
369
+ && hasFlexExactKeys(valueArg, ['messageId', 'sessionId', 'runId', 'role', 'status', 'createdAt', 'parts'], ['completedAt', 'model', 'usage', 'error'])
370
+ && isIdentifier(valueArg.messageId)
371
+ && isIdentifier(valueArg.sessionId)
372
+ && isIdentifier(valueArg.runId)
373
+ && ['user', 'assistant'].includes(String(valueArg.role))
374
+ && ['streaming', 'completed', 'failed', 'cancelled'].includes(String(valueArg.status))
375
+ && isIsoDate(valueArg.createdAt)
376
+ && (valueArg.completedAt === undefined || isIsoDate(valueArg.completedAt))
377
+ && Array.isArray(valueArg.parts)
378
+ && valueArg.parts.length <= 2000
379
+ && valueArg.parts.every(isMessagePart)
380
+ && (valueArg.model === undefined || isModelIdentity(valueArg.model))
381
+ && (valueArg.usage === undefined || isUsage(valueArg.usage))
382
+ && (valueArg.error === undefined || isBoundedString(valueArg.error, 2048));
383
+ export const isFlexPublicSession = (valueArg) => {
384
+ if (!isFlexPlainObject(valueArg)
385
+ || !hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'createdAt', 'updatedAt', 'status', 'activity'], [
386
+ 'sessionGenerationId', 'sessionGenerationSequence',
387
+ 'title', 'archivedAt', 'parentSessionId', 'parentRunId',
388
+ 'parentToolCallId', 'agent', 'depth',
389
+ ])
390
+ || !isIdentifier(valueArg.scopeId)
391
+ || !isIdentifier(valueArg.sessionId)
392
+ || !isIsoDate(valueArg.createdAt)
393
+ || !isIsoDate(valueArg.updatedAt)
394
+ || (valueArg.title !== undefined || Object.hasOwn(valueArg, 'title'))
395
+ && !isBoundedString(valueArg.title, 4096, true)
396
+ || (valueArg.archivedAt !== undefined && !isIsoDate(valueArg.archivedAt))
397
+ || !['idle', 'scheduled', 'running', 'waiting_permission', 'failed', 'cancelled']
398
+ .includes(String(valueArg.status))
399
+ || !isFlexPlainObject(valueArg.activity)
400
+ || !hasFlexExactKeys(valueArg.activity, ['status'], [
401
+ 'runId', 'startedAt', 'completedAt', 'error',
402
+ ])
403
+ || !['idle', 'scheduled', 'running', 'waiting_permission', 'failed', 'cancelled']
404
+ .includes(String(valueArg.activity.status)))
405
+ return false;
406
+ const hasGenerationId = valueArg.sessionGenerationId !== undefined;
407
+ const hasGenerationSequence = valueArg.sessionGenerationSequence !== undefined;
408
+ if (hasGenerationId !== hasGenerationSequence
409
+ || (hasGenerationId && !isFlexSessionGeneration(valueArg)))
410
+ return false;
411
+ const relationship = [
412
+ valueArg.parentSessionId,
413
+ valueArg.parentRunId,
414
+ valueArg.parentToolCallId,
415
+ valueArg.agent,
416
+ ];
417
+ const relationshipCount = relationship.filter((entry) => entry !== undefined).length;
418
+ return (valueArg.activity.runId === undefined || isIdentifier(valueArg.activity.runId))
419
+ && (valueArg.activity.startedAt === undefined || isIsoDate(valueArg.activity.startedAt))
420
+ && (valueArg.activity.completedAt === undefined || isIsoDate(valueArg.activity.completedAt))
421
+ && (valueArg.activity.error === undefined || isBoundedString(valueArg.activity.error, 2048))
422
+ && (relationshipCount === 0 || relationshipCount === relationship.length)
423
+ && (valueArg.parentSessionId === undefined || isIdentifier(valueArg.parentSessionId))
424
+ && (valueArg.parentRunId === undefined || isIdentifier(valueArg.parentRunId))
425
+ && (valueArg.parentToolCallId === undefined || isIdentifier(valueArg.parentToolCallId))
426
+ && (valueArg.agent === undefined || isBoundedString(valueArg.agent, 128))
427
+ && (relationshipCount === 0
428
+ ? valueArg.depth === undefined || valueArg.depth === 0
429
+ : Number.isSafeInteger(valueArg.depth)
430
+ && Number(valueArg.depth) >= 1
431
+ && Number(valueArg.depth) <= 8);
432
+ };
433
+ const isPromptQueueEntry = (valueArg) => (isFlexPlainObject(valueArg)
434
+ && hasFlexExactKeys(valueArg, ['queueId', 'queueSequence', 'scopeId', 'sessionId', 'status', 'queuedAt'], ['runId', 'scheduleKey', 'startedAt', 'finishedAt', 'error'])
435
+ && isIdentifier(valueArg.queueId)
436
+ && isNonNegativeInteger(valueArg.queueSequence)
437
+ && valueArg.queueSequence >= 1
438
+ && isIdentifier(valueArg.scopeId)
439
+ && isIdentifier(valueArg.sessionId)
440
+ && ['queued', 'starting', 'scheduled', 'running', 'completed', 'failed', 'cancelled']
441
+ .includes(String(valueArg.status))
442
+ && isIsoDate(valueArg.queuedAt)
443
+ && (valueArg.runId === undefined || isIdentifier(valueArg.runId))
444
+ && (valueArg.scheduleKey === undefined || isIdentifier(valueArg.scheduleKey))
445
+ && (valueArg.startedAt === undefined || isIsoDate(valueArg.startedAt))
446
+ && (valueArg.finishedAt === undefined || isIsoDate(valueArg.finishedAt))
447
+ && (valueArg.error === undefined || (isFlexPlainObject(valueArg.error)
448
+ && hasFlexExactKeys(valueArg.error, ['name', 'message'], ['code'])
449
+ && isBoundedString(valueArg.error.name, 128)
450
+ && isBoundedString(valueArg.error.message, 2048)
451
+ && (valueArg.error.code === undefined || isBoundedString(valueArg.error.code, 128)))));
452
+ const isPermissionRequest = (valueArg) => isFlexPlainObject(valueArg)
453
+ && hasFlexExactKeys(valueArg, ['permissionId', 'scopeId', 'sessionId', 'runId', 'createdAt', 'kind', 'description'], ['toolCallId', 'rememberKey', 'metadata'])
454
+ && isIdentifier(valueArg.permissionId)
455
+ && isIdentifier(valueArg.scopeId)
456
+ && isIdentifier(valueArg.sessionId)
457
+ && isIdentifier(valueArg.runId)
458
+ && isIsoDate(valueArg.createdAt)
459
+ && isBoundedString(valueArg.kind, 128)
460
+ && isBoundedString(valueArg.description, 2048)
461
+ && (valueArg.toolCallId === undefined || isIdentifier(valueArg.toolCallId))
462
+ && (valueArg.rememberKey === undefined || isBoundedString(valueArg.rememberKey, 512))
463
+ && (valueArg.metadata === undefined || isJsonValue(valueArg.metadata));
464
+ const isPrompt = (valueArg) => {
465
+ if (isBoundedString(valueArg, 768 * 1024, true))
466
+ return true;
467
+ if (!Array.isArray(valueArg) || valueArg.length < 1 || valueArg.length > 128)
468
+ return false;
469
+ return valueArg.every((part) => {
470
+ if (!isFlexPlainObject(part))
471
+ return false;
472
+ if (part.type === 'text') {
473
+ return hasFlexExactKeys(part, ['type', 'text'])
474
+ && isBoundedString(part.text, 768 * 1024, true);
475
+ }
476
+ if (part.type === 'image') {
477
+ return hasFlexExactKeys(part, ['type', 'data'], ['mediaType', 'name'])
478
+ && isBoundedString(part.data, 768 * 1024)
479
+ && (part.mediaType === undefined || isBoundedString(part.mediaType, 512))
480
+ && (part.name === undefined || isBoundedString(part.name, 1024));
481
+ }
482
+ if (part.type === 'file') {
483
+ return hasFlexExactKeys(part, ['type', 'data', 'mediaType'], ['name'])
484
+ && isBoundedString(part.data, 768 * 1024)
485
+ && isBoundedString(part.mediaType, 512)
486
+ && (part.name === undefined || isBoundedString(part.name, 1024));
487
+ }
488
+ return false;
489
+ });
490
+ };
491
+ const isPromptOptions = (valueArg) => isFlexPlainObject(valueArg)
492
+ && hasFlexExactKeys(valueArg, [], ['modelHint', 'system', 'maxSteps'])
493
+ && (valueArg.modelHint === undefined || isBoundedString(valueArg.modelHint, 512))
494
+ && (valueArg.system === undefined || isBoundedString(valueArg.system, 128 * 1024, true))
495
+ && (valueArg.maxSteps === undefined
496
+ || (Number.isSafeInteger(valueArg.maxSteps) && Number(valueArg.maxSteps) >= 1
497
+ && Number(valueArg.maxSteps) <= 1000));
498
+ const isCreateSessionOptions = (valueArg) => isFlexPlainObject(valueArg)
499
+ && hasFlexExactKeys(valueArg, [], ['sessionId', 'title'])
500
+ && (valueArg.sessionId === undefined || isIdentifier(valueArg.sessionId))
501
+ && (valueArg.title === undefined || isBoundedString(valueArg.title, 4096, true));
502
+ const isUpdateSessionOptions = (valueArg) => isFlexPlainObject(valueArg)
503
+ && hasFlexExactKeys(valueArg, [], ['title', 'archived'])
504
+ && (valueArg.title === undefined || valueArg.title === null
505
+ || isBoundedString(valueArg.title, 4096, true))
506
+ && (valueArg.archived === undefined || typeof valueArg.archived === 'boolean');
507
+ const isScopeAndSession = (valueArg) => isIdentifier(valueArg.scopeId) && isIdentifier(valueArg.sessionId);
508
+ const isAffectedWorkspace = (valueArg) => isFlexPlainObject(valueArg)
509
+ && hasFlexExactKeys(valueArg, ['id', 'label'])
510
+ && isBoundedString(valueArg.id, 512)
511
+ && valueArg.id.trim().length > 0
512
+ && isBoundedString(valueArg.label, 2048)
513
+ && valueArg.label.trim().length > 0;
514
+ const isReversionOutcome = (valueArg) => {
515
+ if (!isFlexPlainObject(valueArg) || !isJsonValue(valueArg.reference))
516
+ return false;
517
+ if (valueArg.disposition === 'no-change') {
518
+ return hasFlexExactKeys(valueArg, ['disposition', 'reference'], ['affectedWorkspaces'])
519
+ && (valueArg.affectedWorkspaces === undefined
520
+ || (Array.isArray(valueArg.affectedWorkspaces) && valueArg.affectedWorkspaces.length === 0));
521
+ }
522
+ if (valueArg.disposition === 'revertible') {
523
+ return hasFlexExactKeys(valueArg, ['disposition', 'reference', 'affectedWorkspaces'])
524
+ && Array.isArray(valueArg.affectedWorkspaces)
525
+ && valueArg.affectedWorkspaces.length >= 1
526
+ && valueArg.affectedWorkspaces.length <= 64
527
+ && valueArg.affectedWorkspaces.every(isAffectedWorkspace)
528
+ && new Set(valueArg.affectedWorkspaces.map((entry) => entry.id)).size === valueArg.affectedWorkspaces.length;
529
+ }
530
+ return valueArg.disposition === 'nonrevertible'
531
+ && hasFlexExactKeys(valueArg, ['disposition', 'reference', 'reasonCode'], ['affectedWorkspaces'])
532
+ && isBoundedString(valueArg.reasonCode, 128)
533
+ && /^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(valueArg.reasonCode)
534
+ && (valueArg.affectedWorkspaces === undefined || (Array.isArray(valueArg.affectedWorkspaces)
535
+ && valueArg.affectedWorkspaces.length <= 64
536
+ && valueArg.affectedWorkspaces.every(isAffectedWorkspace)));
537
+ };
538
+ const isSlashDescriptor = (valueArg) => (isFlexPlainObject(valueArg)
539
+ && hasFlexExactKeys(valueArg, ['name', 'description', 'kind', 'hints', 'available', 'workspaceReversion'], ['unavailableReason'])
540
+ && typeof valueArg.name === 'string'
541
+ && /^[a-z][a-z0-9-]{0,63}$/u.test(valueArg.name)
542
+ && isBoundedString(valueArg.description, 2048, true)
543
+ && ['builtin', 'template', 'handler'].includes(String(valueArg.kind))
544
+ && Array.isArray(valueArg.hints)
545
+ && valueArg.hints.length <= 64
546
+ && valueArg.hints.every((hint) => isBoundedString(hint, 128))
547
+ && typeof valueArg.available === 'boolean'
548
+ && (valueArg.unavailableReason === undefined
549
+ || isBoundedString(valueArg.unavailableReason, 2048))
550
+ && ['supported', 'unsupported', 'not-applicable'].includes(String(valueArg.workspaceReversion)));
551
+ const isSlashInvocation = (valueArg) => (isBoundedString(valueArg.input, 768 * 1024)
552
+ && typeof valueArg.name === 'string'
553
+ && /^[a-z][a-z0-9-]{0,63}$/u.test(valueArg.name)
554
+ && isBoundedString(valueArg.rawArguments, 768 * 1024, true)
555
+ && Array.isArray(valueArg.arguments)
556
+ && valueArg.arguments.length <= 4096
557
+ && valueArg.arguments.every((entry) => isBoundedString(entry, 768 * 1024, true)));
558
+ const isSlashExecutionResult = (valueArg) => {
559
+ if (!isFlexPlainObject(valueArg) || typeof valueArg.type !== 'string')
560
+ return false;
561
+ if (valueArg.type === 'not-command')
562
+ return hasFlexExactKeys(valueArg, ['type']);
563
+ if (valueArg.type === 'malformed') {
564
+ return hasFlexExactKeys(valueArg, ['type', 'reason'])
565
+ && isBoundedString(valueArg.reason, 2048);
566
+ }
567
+ if (valueArg.type === 'unknown') {
568
+ return hasFlexExactKeys(valueArg, ['type', 'input', 'name', 'rawArguments', 'arguments'])
569
+ && isSlashInvocation(valueArg);
570
+ }
571
+ if (valueArg.type === 'operation') {
572
+ return hasFlexExactKeys(valueArg, ['type', 'name'])
573
+ && typeof valueArg.name === 'string'
574
+ && /^[a-z][a-z0-9-]{0,63}$/u.test(valueArg.name);
575
+ }
576
+ if (valueArg.type === 'handler-result') {
577
+ return hasFlexExactKeys(valueArg, ['type', 'name', 'result'])
578
+ && typeof valueArg.name === 'string'
579
+ && /^[a-z][a-z0-9-]{0,63}$/u.test(valueArg.name)
580
+ && isJsonValue(valueArg.result);
581
+ }
582
+ return valueArg.type === 'prompt-admission'
583
+ && hasFlexExactKeys(valueArg, ['type', 'name', 'admission'])
584
+ && typeof valueArg.name === 'string'
585
+ && /^[a-z][a-z0-9-]{0,63}$/u.test(valueArg.name)
586
+ && isFlexPlainObject(valueArg.admission)
587
+ && hasFlexExactKeys(valueArg.admission, ['queueId', 'runId'])
588
+ && isIdentifier(valueArg.admission.queueId)
589
+ && isIdentifier(valueArg.admission.runId);
590
+ };
591
+ const isSessionReversionInfo = (valueArg) => (isFlexPlainObject(valueArg)
592
+ && hasFlexExactKeys(valueArg, ['undoAvailable', 'redoAvailable', 'groups'])
593
+ && typeof valueArg.undoAvailable === 'boolean'
594
+ && typeof valueArg.redoAvailable === 'boolean'
595
+ && Array.isArray(valueArg.groups)
596
+ && valueArg.groups.length <= 3000
597
+ && valueArg.groups.every((entry) => isFlexPlainObject(entry)
598
+ && hasFlexExactKeys(entry, [
599
+ 'runId', 'kind', 'visibility', 'affectedWorkspaces', 'affectedWorkspacesTruncated',
600
+ ])
601
+ && isIdentifier(entry.runId)
602
+ && ['candidate', 'barrier', 'no-change'].includes(String(entry.kind))
603
+ && ['visible', 'hidden'].includes(String(entry.visibility))
604
+ && Array.isArray(entry.affectedWorkspaces)
605
+ && entry.affectedWorkspaces.length <= 64
606
+ && entry.affectedWorkspaces.every(isAffectedWorkspace)
607
+ && typeof entry.affectedWorkspacesTruncated === 'boolean'));
608
+ export const isFlexRequestPayload = (methodArg, valueArg) => {
609
+ if (!isFlexPlainObject(valueArg))
610
+ return false;
611
+ switch (methodArg) {
612
+ case 'service.status':
613
+ case 'provider.list':
614
+ case 'provider.connection.list':
615
+ return hasFlexExactKeys(valueArg, []);
616
+ case 'project.replaceAll':
617
+ return hasFlexExactKeys(valueArg, ['projects'])
618
+ && Array.isArray(valueArg.projects)
619
+ && valueArg.projects.length <= controllerProjectLimit
620
+ && valueArg.projects.every(isFlexProjectRecord)
621
+ && new Set(valueArg.projects.map((project) => project.projectId)).size
622
+ === valueArg.projects.length;
623
+ case 'project.register':
624
+ case 'project.remove':
625
+ return hasFlexExactKeys(valueArg, ['project'])
626
+ && isFlexIdentityBoundProjectRecord(valueArg.project);
627
+ case 'intelligence.start':
628
+ return hasFlexExactKeys(valueArg, [
629
+ 'scopeId', 'sourceSessionId', 'question', 'scratchpad', 'model', 'capabilityToken',
630
+ ])
631
+ && isIdentifier(valueArg.scopeId)
632
+ && isFlexIntelligenceSessionId(valueArg.sourceSessionId)
633
+ && isBoundedString(valueArg.question, 32 * 1024)
634
+ && valueArg.question.length <= 8_192
635
+ && String(valueArg.question).trim().length > 0
636
+ && isBoundedString(valueArg.scratchpad, 128 * 1024, true)
637
+ && valueArg.scratchpad.length <= 32_768
638
+ && isModelChoice(valueArg.model)
639
+ && valueArg.model.modelId === 'gpt-5.6-luna'
640
+ && valueArg.model.variant === undefined
641
+ && isIntelligenceCapabilityToken(valueArg.capabilityToken);
642
+ case 'intelligence.get':
643
+ return hasFlexExactKeys(valueArg, ['scopeId', 'jobId', 'capabilityToken'])
644
+ && isIdentifier(valueArg.scopeId)
645
+ && isQualifiedId(valueArg.jobId)
646
+ && isIntelligenceCapabilityToken(valueArg.capabilityToken);
647
+ case 'intelligence.cancel':
648
+ return hasFlexExactKeys(valueArg, ['scopeId', 'capabilityToken'])
649
+ && isIdentifier(valueArg.scopeId)
650
+ && isIntelligenceCapabilityToken(valueArg.capabilityToken);
651
+ case 'session.list':
652
+ return hasFlexExactKeys(valueArg, ['scopeId'], ['offset', 'limit'])
653
+ && isIdentifier(valueArg.scopeId)
654
+ && (valueArg.offset === undefined || isNonNegativeInteger(valueArg.offset))
655
+ && (valueArg.limit === undefined
656
+ || (Number.isSafeInteger(valueArg.limit) && Number(valueArg.limit) >= 1
657
+ && Number(valueArg.limit) <= 50));
658
+ case 'session.create':
659
+ return hasFlexExactKeys(valueArg, ['scopeId'], ['options'])
660
+ && isIdentifier(valueArg.scopeId)
661
+ && (valueArg.options === undefined || isCreateSessionOptions(valueArg.options));
662
+ case 'session.get':
663
+ case 'session.delete':
664
+ case 'session.reversion.info':
665
+ case 'slash.list':
666
+ case 'prompt.list':
667
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId'])
668
+ && isScopeAndSession(valueArg);
669
+ case 'session.compact':
670
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId'], ['model'])
671
+ && isScopeAndSession(valueArg)
672
+ && (valueArg.model === undefined || isModelChoice(valueArg.model));
673
+ case 'slash.execute':
674
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'input'], ['model'])
675
+ && isScopeAndSession(valueArg)
676
+ && isBoundedString(valueArg.input, 768 * 1024)
677
+ && (valueArg.model === undefined || isModelChoice(valueArg.model));
678
+ case 'session.update':
679
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'options'])
680
+ && isScopeAndSession(valueArg)
681
+ && isUpdateSessionOptions(valueArg.options);
682
+ case 'message.page':
683
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId'], ['limit', 'before'])
684
+ && isScopeAndSession(valueArg)
685
+ && (valueArg.limit === undefined
686
+ || (Number.isSafeInteger(valueArg.limit) && Number(valueArg.limit) >= 1
687
+ && Number(valueArg.limit) <= 50))
688
+ && (valueArg.before === undefined || isBoundedString(valueArg.before, 4096));
689
+ case 'message.get':
690
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'messageId'])
691
+ && isScopeAndSession(valueArg) && isIdentifier(valueArg.messageId);
692
+ case 'prompt.start':
693
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'prompt'], ['options', 'model', 'upload'])
694
+ && isScopeAndSession(valueArg)
695
+ && isPrompt(valueArg.prompt)
696
+ && (valueArg.options === undefined || isPromptOptions(valueArg.options))
697
+ && (valueArg.model === undefined || isModelChoice(valueArg.model))
698
+ && (valueArg.upload === undefined || (isFlexPlainObject(valueArg.upload)
699
+ && hasFlexExactKeys(valueArg.upload, ['operationId', 'directory'])
700
+ && isIdentifier(valueArg.upload.operationId)
701
+ && isBoundedString(valueArg.upload.directory, 4096)
702
+ && plugins.path.isAbsolute(valueArg.upload.directory)));
703
+ case 'prompt.get':
704
+ case 'prompt.cancel':
705
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'queueId'])
706
+ && isScopeAndSession(valueArg) && isIdentifier(valueArg.queueId);
707
+ case 'prompt.acknowledge':
708
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'queueId', 'runId'])
709
+ && isScopeAndSession(valueArg)
710
+ && isIdentifier(valueArg.queueId)
711
+ && isIdentifier(valueArg.runId);
712
+ case 'permission.list':
713
+ return hasFlexExactKeys(valueArg, ['scopeId'], ['sessionId', 'familyRootSessionId'])
714
+ && isIdentifier(valueArg.scopeId)
715
+ && (valueArg.sessionId === undefined || isIdentifier(valueArg.sessionId))
716
+ && (valueArg.familyRootSessionId === undefined
717
+ || isIdentifier(valueArg.familyRootSessionId))
718
+ && !(valueArg.sessionId !== undefined && valueArg.familyRootSessionId !== undefined);
719
+ case 'permission.respond':
720
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'permissionId', 'decision'])
721
+ && isScopeAndSession(valueArg)
722
+ && isIdentifier(valueArg.permissionId)
723
+ && ['once', 'always', 'reject'].includes(String(valueArg.decision));
724
+ case 'provider.login.begin':
725
+ return hasFlexExactKeys(valueArg, ['providerId']) && valueArg.providerId === 'openai';
726
+ case 'provider.login.status':
727
+ case 'provider.login.cancel':
728
+ return hasFlexExactKeys(valueArg, ['loginId']) && isQualifiedId(valueArg.loginId);
729
+ case 'provider.connection.logout.prepare':
730
+ case 'provider.connection.logout':
731
+ case 'provider.connection.opencode-auth.get':
732
+ case 'provider.connection.ratelimits.get':
733
+ case 'provider.models.refresh':
734
+ return hasFlexExactKeys(valueArg, ['providerConnectionId'])
735
+ && isQualifiedId(valueArg.providerConnectionId);
736
+ case 'model.choice.get':
737
+ return hasFlexExactKeys(valueArg, ['scopeId']) && isIdentifier(valueArg.scopeId);
738
+ case 'model.choice.set':
739
+ return hasFlexExactKeys(valueArg, ['scopeId', 'choice'])
740
+ && isIdentifier(valueArg.scopeId) && isModelChoice(valueArg.choice);
741
+ case 'model.choice.validate':
742
+ return hasFlexExactKeys(valueArg, ['choice']) && isModelChoice(valueArg.choice);
743
+ default:
744
+ return false;
745
+ }
746
+ };
747
+ export const isFlexHostRequestPayload = (methodArg, valueArg) => {
748
+ if (!isFlexPlainObject(valueArg))
749
+ return false;
750
+ const reversionBase = (optionalKeysArg = []) => (hasFlexExactKeys(valueArg, ['scopeId', 'storageKey', 'sessionId', 'runId', 'captureId'], optionalKeysArg)
751
+ && isIdentifier(valueArg.scopeId)
752
+ && isIdentifier(valueArg.storageKey)
753
+ && isIdentifier(valueArg.sessionId)
754
+ && isIdentifier(valueArg.runId)
755
+ && isIdentifier(valueArg.captureId));
756
+ if (methodArg === 'reversion.prepare'
757
+ || methodArg === 'reversion.inspect-capture'
758
+ || methodArg === 'reversion.finalize')
759
+ return reversionBase();
760
+ if (methodArg === 'reversion.inspect-apply' || methodArg === 'reversion.apply') {
761
+ return reversionBase(['reference', 'operationId', 'direction'])
762
+ && Object.hasOwn(valueArg, 'reference')
763
+ && isJsonValue(valueArg.reference)
764
+ && Buffer.byteLength(JSON.stringify(valueArg.reference), 'utf8') <= 256 * 1024
765
+ && isIdentifier(valueArg.operationId)
766
+ && (valueArg.direction === 'undo' || valueArg.direction === 'redo');
767
+ }
768
+ if (methodArg === 'reversion.release') {
769
+ return reversionBase(['reference'])
770
+ && Object.hasOwn(valueArg, 'reference')
771
+ && isJsonValue(valueArg.reference)
772
+ && Buffer.byteLength(JSON.stringify(valueArg.reference), 'utf8') <= 256 * 1024;
773
+ }
774
+ if (methodArg === 'git.worktree.create' || methodArg === 'git.worktree.list') {
775
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId'])
776
+ && isIdentifier(valueArg.scopeId)
777
+ && isIdentifier(valueArg.sessionId);
778
+ }
779
+ if (methodArg === 'git.worktree.remove') {
780
+ const compensating = Object.hasOwn(valueArg, 'compensate');
781
+ return hasFlexExactKeys(valueArg, ['scopeId', 'sessionId', 'worktreeId', ...(compensating ? ['compensate'] : [])])
782
+ && isIdentifier(valueArg.scopeId)
783
+ && isIdentifier(valueArg.sessionId)
784
+ && isIdentifier(valueArg.worktreeId)
785
+ && (!compensating || valueArg.compensate === true);
786
+ }
787
+ if (methodArg === 'crossharness.chats.list') {
788
+ return hasFlexExactKeys(valueArg, ['capabilityToken', 'limit'])
789
+ && isIntelligenceCapabilityToken(valueArg.capabilityToken)
790
+ && Number.isSafeInteger(valueArg.limit)
791
+ && Number(valueArg.limit) >= 1
792
+ && Number(valueArg.limit) <= 50;
793
+ }
794
+ if (methodArg === 'crossharness.chat.read') {
795
+ return hasFlexExactKeys(valueArg, ['capabilityToken', 'sessionId', 'limit', 'maxChars'])
796
+ && isIntelligenceCapabilityToken(valueArg.capabilityToken)
797
+ && isFlexIntelligenceSessionId(valueArg.sessionId)
798
+ && Number.isSafeInteger(valueArg.limit)
799
+ && Number(valueArg.limit) >= 1
800
+ && Number(valueArg.limit) <= 50
801
+ && Number.isSafeInteger(valueArg.maxChars)
802
+ && Number(valueArg.maxChars) >= 128
803
+ && Number(valueArg.maxChars) <= 4096;
804
+ }
805
+ if (methodArg === 'project-management.load') {
806
+ return hasFlexExactKeys(valueArg, [
807
+ 'storageKey',
808
+ 'sessionId',
809
+ 'sessionGenerationId',
810
+ 'sessionGenerationSequence',
811
+ ])
812
+ && isIdentifier(valueArg.storageKey)
813
+ && isIdentifier(valueArg.sessionId)
814
+ && isFlexSessionGeneration(valueArg);
815
+ }
816
+ if (methodArg === 'project-management.save') {
817
+ return hasFlexExactKeys(valueArg, [
818
+ 'storageKey',
819
+ 'sessionId',
820
+ 'snapshot',
821
+ 'expectedRevision',
822
+ 'writeContext',
823
+ ])
824
+ && isIdentifier(valueArg.storageKey)
825
+ && isIdentifier(valueArg.sessionId)
826
+ && isFlexProjectManagementSnapshot(valueArg.snapshot)
827
+ && isNonNegativeInteger(valueArg.expectedRevision)
828
+ && valueArg.snapshot.revision === Number(valueArg.expectedRevision) + 1
829
+ && isFlexProjectManagementWriteContext(valueArg.writeContext);
830
+ }
831
+ if (methodArg === 'project-management.tombstone') {
832
+ return hasFlexExactKeys(valueArg, [
833
+ 'storageKey',
834
+ 'sessionId',
835
+ 'tombstone',
836
+ 'expectedRevision',
837
+ ])
838
+ && isIdentifier(valueArg.storageKey)
839
+ && isIdentifier(valueArg.sessionId)
840
+ && isFlexProjectManagementTombstone(valueArg.tombstone)
841
+ && isNonNegativeInteger(valueArg.expectedRevision)
842
+ && valueArg.tombstone.revision === Number(valueArg.expectedRevision) + 1;
843
+ }
844
+ if (methodArg === 'project-management.purge') {
845
+ return hasFlexExactKeys(valueArg, ['storageKey']) && isIdentifier(valueArg.storageKey);
846
+ }
847
+ if (methodArg === 'browser.channel.close') {
848
+ return hasFlexExactKeys(valueArg, ['channelId']) && isChannelId(valueArg.channelId);
849
+ }
850
+ const common = hasFlexExactKeys(valueArg, methodArg === 'browser.resources.resolve'
851
+ ? ['scopeId', 'sessionId', 'runId']
852
+ : ['scopeId', 'sessionId', 'runId', 'resourceId', 'attachmentRevision', 'channelId'])
853
+ && isBoundedString(valueArg.scopeId, 128)
854
+ && identifierPattern.test(String(valueArg.scopeId))
855
+ && isBoundedString(valueArg.sessionId, 128)
856
+ && identifierPattern.test(String(valueArg.sessionId))
857
+ && isBoundedString(valueArg.runId, 512)
858
+ && identifierPattern.test(String(valueArg.runId));
859
+ if (!common || methodArg === 'browser.resources.resolve')
860
+ return common;
861
+ return isBoundedString(valueArg.resourceId, 256)
862
+ && Buffer.byteLength(String(valueArg.resourceId), 'utf8') >= 16
863
+ && identifierPattern.test(String(valueArg.resourceId))
864
+ && isNonNegativeInteger(valueArg.attachmentRevision)
865
+ && isChannelId(valueArg.channelId);
866
+ };
867
+ const isGitWorktreeDescriptor = (valueArg) => isFlexPlainObject(valueArg)
868
+ && hasFlexExactKeys(valueArg, [
869
+ 'worktreeId', 'projectId', 'sessionId', 'path', 'repositoryId', 'createdAt',
870
+ ])
871
+ && isIdentifier(valueArg.worktreeId)
872
+ && typeof valueArg.projectId === 'string'
873
+ && projectIdPattern.test(valueArg.projectId)
874
+ && isIdentifier(valueArg.sessionId)
875
+ && isBoundedString(valueArg.path, 4096)
876
+ && !valueArg.path.includes('\0')
877
+ && plugins.path.isAbsolute(valueArg.path)
878
+ && plugins.path.normalize(valueArg.path) === valueArg.path
879
+ && isIdentifier(valueArg.repositoryId)
880
+ && isIsoDate(valueArg.createdAt);
881
+ const isFlexBrowserResourceDescriptor = (valueArg) => isFlexPlainObject(valueArg)
882
+ && hasFlexExactKeys(valueArg, ['resourceId', 'attachmentRevision'])
883
+ && isBoundedString(valueArg.resourceId, 256)
884
+ && Buffer.byteLength(valueArg.resourceId, 'utf8') >= 16
885
+ && identifierPattern.test(valueArg.resourceId)
886
+ && isNonNegativeInteger(valueArg.attachmentRevision);
887
+ const isFlexBrowserChannelBinding = (valueArg) => isFlexPlainObject(valueArg)
888
+ && hasFlexExactKeys(valueArg, [
889
+ 'projectId',
890
+ 'browserResourceId',
891
+ 'attachmentAuthorityId',
892
+ 'attachmentRevision',
893
+ 'actorId',
894
+ 'peerId',
895
+ 'role',
896
+ 'source',
897
+ 'scopeId',
898
+ 'channelId',
899
+ 'runId',
900
+ 'sessionId',
901
+ ])
902
+ && isBoundedString(valueArg.projectId, 128)
903
+ && isBoundedString(valueArg.browserResourceId, 256)
904
+ && Buffer.byteLength(valueArg.browserResourceId, 'utf8') >= 16
905
+ && isBoundedString(valueArg.attachmentAuthorityId, 256)
906
+ && isNonNegativeInteger(valueArg.attachmentRevision)
907
+ && isBoundedString(valueArg.actorId, 256)
908
+ && isBoundedString(valueArg.peerId, 256)
909
+ && valueArg.role === 'agent'
910
+ && valueArg.source === 'flex'
911
+ && isBoundedString(valueArg.scopeId, 128)
912
+ && isChannelId(valueArg.channelId)
913
+ && isBoundedString(valueArg.runId, 512)
914
+ && identifierPattern.test(valueArg.runId)
915
+ && isFlexPlainObject(valueArg.sessionId)
916
+ && hasFlexExactKeys(valueArg.sessionId, ['harnessId', 'nativeId'])
917
+ && valueArg.sessionId.harnessId === 'flex'
918
+ && isBoundedString(valueArg.sessionId.nativeId, 128);
919
+ export const isFlexHostResponseResult = (methodArg, valueArg) => {
920
+ if (!isFlexPlainObject(valueArg))
921
+ return false;
922
+ if (methodArg === 'reversion.prepare') {
923
+ return hasFlexExactKeys(valueArg, ['prepared']) && valueArg.prepared === true;
924
+ }
925
+ if (methodArg === 'reversion.inspect-capture') {
926
+ if (valueArg.status === 'finalized') {
927
+ return hasFlexExactKeys(valueArg, ['status', 'outcome'])
928
+ && isReversionOutcome(valueArg.outcome);
929
+ }
930
+ return hasFlexExactKeys(valueArg, ['status'])
931
+ && ['missing', 'prepared', 'unknown'].includes(String(valueArg.status));
932
+ }
933
+ if (methodArg === 'reversion.finalize')
934
+ return isReversionOutcome(valueArg);
935
+ if (methodArg === 'reversion.inspect-apply') {
936
+ return hasFlexExactKeys(valueArg, ['status'])
937
+ && ['not-applied', 'applied', 'unknown'].includes(String(valueArg.status));
938
+ }
939
+ if (methodArg === 'reversion.apply') {
940
+ return hasFlexExactKeys(valueArg, ['applied']) && valueArg.applied === true;
941
+ }
942
+ if (methodArg === 'reversion.release') {
943
+ return hasFlexExactKeys(valueArg, ['released']) && valueArg.released === true;
944
+ }
945
+ if (methodArg === 'git.worktree.create') {
946
+ return hasFlexExactKeys(valueArg, ['worktree'])
947
+ && isGitWorktreeDescriptor(valueArg.worktree);
948
+ }
949
+ if (methodArg === 'git.worktree.list') {
950
+ return hasFlexExactKeys(valueArg, ['worktrees'])
951
+ && Array.isArray(valueArg.worktrees)
952
+ && valueArg.worktrees.length <= 128
953
+ && valueArg.worktrees.every(isGitWorktreeDescriptor);
954
+ }
955
+ if (methodArg === 'git.worktree.remove') {
956
+ return hasFlexExactKeys(valueArg, ['removed']) && valueArg.removed === true;
957
+ }
958
+ if (methodArg === 'crossharness.chats.list') {
959
+ return hasFlexExactKeys(valueArg, ['chats'])
960
+ && Array.isArray(valueArg.chats)
961
+ && valueArg.chats.length <= 50
962
+ && valueArg.chats.every(isFlexIntelligenceChatSummary)
963
+ && Buffer.byteLength(JSON.stringify(valueArg), 'utf8') <= 256 * 1024;
964
+ }
965
+ if (methodArg === 'crossharness.chat.read') {
966
+ return hasFlexExactKeys(valueArg, ['transcript'])
967
+ && isFlexIntelligenceChatTranscript(valueArg.transcript);
968
+ }
969
+ if (methodArg === 'project-management.load') {
970
+ return hasFlexExactKeys(valueArg, ['record'])
971
+ && (valueArg.record === null || isFlexProjectManagementRecord(valueArg.record));
972
+ }
973
+ if (methodArg === 'project-management.save'
974
+ || methodArg === 'project-management.tombstone')
975
+ return isFlexProjectManagementCommitResult(valueArg);
976
+ if (methodArg === 'project-management.purge') {
977
+ return hasFlexExactKeys(valueArg, ['purged']) && valueArg.purged === true;
978
+ }
979
+ if (methodArg === 'browser.resources.resolve') {
980
+ return hasFlexExactKeys(valueArg, ['resources'])
981
+ && Array.isArray(valueArg.resources)
982
+ && valueArg.resources.length <= flexIpcMaximumBrowserChannels
983
+ && valueArg.resources.every(isFlexBrowserResourceDescriptor)
984
+ && new Set(valueArg.resources.map((entry) => entry.resourceId)).size
985
+ === valueArg.resources.length;
986
+ }
987
+ if (methodArg === 'browser.channel.open') {
988
+ return hasFlexExactKeys(valueArg, ['binding', 'capabilityToken'])
989
+ && isFlexBrowserChannelBinding(valueArg.binding)
990
+ && isBoundedString(valueArg.capabilityToken, 512)
991
+ && Buffer.byteLength(valueArg.capabilityToken, 'utf8') >= 16;
992
+ }
993
+ return hasFlexExactKeys(valueArg, ['closed']) && valueArg.closed === true;
994
+ };
995
+ const isPublicProviderModel = (valueArg) => {
996
+ if (!isFlexPlainObject(valueArg)
997
+ || !hasFlexExactKeys(valueArg, [
998
+ 'providerId', 'modelId', 'displayName', 'description', 'hidden',
999
+ 'reasoningEfforts', 'defaultReasoningEffort', 'inputModalities',
1000
+ 'supportsPersonality', 'serviceTiers', 'isDefault',
1001
+ ], ['defaultServiceTier'])
1002
+ || valueArg.providerId !== 'openai'
1003
+ || !isBoundedString(valueArg.modelId, 256)
1004
+ || !isBoundedString(valueArg.displayName, 512)
1005
+ || !isBoundedString(valueArg.description, 2048, true)
1006
+ || typeof valueArg.hidden !== 'boolean'
1007
+ || !Array.isArray(valueArg.reasoningEfforts)
1008
+ || valueArg.reasoningEfforts.length > 16
1009
+ || !valueArg.reasoningEfforts.every((entry) => isFlexPlainObject(entry)
1010
+ && hasFlexExactKeys(entry, ['effort', 'description'])
1011
+ && isBoundedString(entry.effort, 128)
1012
+ && isBoundedString(entry.description, 1024, true))
1013
+ || !isBoundedString(valueArg.defaultReasoningEffort, 128)
1014
+ || !Array.isArray(valueArg.inputModalities)
1015
+ || valueArg.inputModalities.length > 3
1016
+ || !valueArg.inputModalities.every((entry) => ['text', 'image', 'audio'].includes(String(entry)))
1017
+ || typeof valueArg.supportsPersonality !== 'boolean'
1018
+ || !Array.isArray(valueArg.serviceTiers)
1019
+ || valueArg.serviceTiers.length > 16
1020
+ || !valueArg.serviceTiers.every((entry) => isFlexPlainObject(entry)
1021
+ && hasFlexExactKeys(entry, ['id', 'name', 'description'])
1022
+ && isBoundedString(entry.id, 128)
1023
+ && isBoundedString(entry.name, 256)
1024
+ && isBoundedString(entry.description, 1024, true))
1025
+ || (valueArg.defaultServiceTier !== undefined
1026
+ && !isBoundedString(valueArg.defaultServiceTier, 128))
1027
+ || typeof valueArg.isDefault !== 'boolean')
1028
+ return false;
1029
+ return true;
1030
+ };
1031
+ const isRateLimitWindow = (valueArg) => (isFlexPlainObject(valueArg)
1032
+ && hasFlexExactKeys(valueArg, [
1033
+ 'usedPercent', 'limitWindowSeconds', 'resetAfterSeconds', 'resetsAt',
1034
+ ])
1035
+ && isNonNegativeInteger(valueArg.usedPercent)
1036
+ && valueArg.usedPercent <= 100
1037
+ && isNonNegativeInteger(valueArg.limitWindowSeconds)
1038
+ && valueArg.limitWindowSeconds >= 1
1039
+ && isNonNegativeInteger(valueArg.resetAfterSeconds)
1040
+ && isNonNegativeInteger(valueArg.resetsAt));
1041
+ const isRateLimitDetails = (valueArg) => (isFlexPlainObject(valueArg)
1042
+ && hasFlexExactKeys(valueArg, ['allowed', 'limitReached'], ['primaryWindow', 'secondaryWindow'])
1043
+ && typeof valueArg.allowed === 'boolean'
1044
+ && typeof valueArg.limitReached === 'boolean'
1045
+ && (valueArg.primaryWindow === undefined || isRateLimitWindow(valueArg.primaryWindow))
1046
+ && (valueArg.secondaryWindow === undefined || isRateLimitWindow(valueArg.secondaryWindow)));
1047
+ const isAccountRateLimits = (valueArg) => isFlexPlainObject(valueArg)
1048
+ && hasFlexExactKeys(valueArg, ['providerId', 'plan', 'observedAt', 'additionalRateLimits'], ['rateLimit', 'rateLimitReachedType', 'rateLimitResetCreditsAvailableCount'])
1049
+ && valueArg.providerId === 'openai'
1050
+ && isBoundedString(valueArg.plan, 256)
1051
+ && isIsoDate(valueArg.observedAt)
1052
+ && (valueArg.rateLimit === undefined || isRateLimitDetails(valueArg.rateLimit))
1053
+ && Array.isArray(valueArg.additionalRateLimits)
1054
+ && valueArg.additionalRateLimits.length <= 64
1055
+ && valueArg.additionalRateLimits.every((entry) => isFlexPlainObject(entry)
1056
+ && hasFlexExactKeys(entry, ['limitName', 'meteredFeature'], ['rateLimit'])
1057
+ && isBoundedString(entry.limitName, 256)
1058
+ && isBoundedString(entry.meteredFeature, 256)
1059
+ && (entry.rateLimit === undefined || isRateLimitDetails(entry.rateLimit)))
1060
+ && (valueArg.rateLimitReachedType === undefined
1061
+ || isBoundedString(valueArg.rateLimitReachedType, 256))
1062
+ && (valueArg.rateLimitResetCreditsAvailableCount === undefined
1063
+ || isNonNegativeInteger(valueArg.rateLimitResetCreditsAvailableCount));
1064
+ export const isFlexResponseResult = (methodArg, valueArg) => {
1065
+ switch (methodArg) {
1066
+ case 'service.status':
1067
+ return isFlexServiceStatus(valueArg);
1068
+ case 'project.replaceAll':
1069
+ return isFlexPlainObject(valueArg)
1070
+ && hasFlexExactKeys(valueArg, ['replaced', 'retired'])
1071
+ && valueArg.replaced === true
1072
+ && isNonNegativeInteger(valueArg.retired)
1073
+ && valueArg.retired <= controllerProjectLimit;
1074
+ case 'project.register':
1075
+ return isFlexPlainObject(valueArg)
1076
+ && hasFlexExactKeys(valueArg, ['registered'])
1077
+ && valueArg.registered === true;
1078
+ case 'project.remove':
1079
+ return isFlexPlainObject(valueArg)
1080
+ && hasFlexExactKeys(valueArg, ['removed'])
1081
+ && valueArg.removed === true;
1082
+ case 'intelligence.start':
1083
+ return isFlexPlainObject(valueArg)
1084
+ && hasFlexExactKeys(valueArg, ['jobId', 'workerSessionId'])
1085
+ && isQualifiedId(valueArg.jobId)
1086
+ && isIdentifier(valueArg.workerSessionId);
1087
+ case 'intelligence.get':
1088
+ if (!isFlexPlainObject(valueArg)
1089
+ || !hasFlexExactKeys(valueArg, ['status', 'workerSessionId'], ['result', 'error'])
1090
+ || !['running', 'completed', 'failed', 'cancelled'].includes(String(valueArg.status))
1091
+ || !isIdentifier(valueArg.workerSessionId)
1092
+ || (valueArg.result !== undefined && !isFlexIntelligenceResult(valueArg.result))
1093
+ || (valueArg.error !== undefined && valueArg.error !== 'Session Intelligence failed.'))
1094
+ return false;
1095
+ return (valueArg.status === 'completed' && valueArg.result !== undefined
1096
+ && valueArg.error === undefined)
1097
+ || (valueArg.status === 'failed' && valueArg.result === undefined
1098
+ && valueArg.error === 'Session Intelligence failed.')
1099
+ || (valueArg.status === 'cancelled' && valueArg.result === undefined
1100
+ && valueArg.error === undefined)
1101
+ || (valueArg.status === 'running' && valueArg.result === undefined
1102
+ && valueArg.error === undefined);
1103
+ case 'intelligence.cancel':
1104
+ return isFlexPlainObject(valueArg)
1105
+ && hasFlexExactKeys(valueArg, ['cancelled'])
1106
+ && typeof valueArg.cancelled === 'boolean';
1107
+ case 'session.list':
1108
+ return isFlexPlainObject(valueArg)
1109
+ && hasFlexExactKeys(valueArg, ['sessions', 'total', 'truncated'])
1110
+ && Array.isArray(valueArg.sessions) && valueArg.sessions.length <= 50
1111
+ && valueArg.sessions.every(isFlexPublicSession)
1112
+ && isNonNegativeInteger(valueArg.total)
1113
+ && typeof valueArg.truncated === 'boolean';
1114
+ case 'session.create':
1115
+ case 'session.get':
1116
+ case 'session.update':
1117
+ return isFlexPublicSession(valueArg);
1118
+ case 'session.delete':
1119
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['deleted'])
1120
+ && valueArg.deleted === true;
1121
+ case 'session.compact':
1122
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['compacted'])
1123
+ && valueArg.compacted === true;
1124
+ case 'session.reversion.info':
1125
+ return isSessionReversionInfo(valueArg);
1126
+ case 'slash.list':
1127
+ return isFlexPlainObject(valueArg)
1128
+ && hasFlexExactKeys(valueArg, ['commands'])
1129
+ && Array.isArray(valueArg.commands)
1130
+ && valueArg.commands.length <= 132
1131
+ && valueArg.commands.every(isSlashDescriptor);
1132
+ case 'slash.execute':
1133
+ return isSlashExecutionResult(valueArg);
1134
+ case 'message.page':
1135
+ return isFlexPlainObject(valueArg)
1136
+ && hasFlexExactKeys(valueArg, ['messages'], ['nextCursor'])
1137
+ && Array.isArray(valueArg.messages) && valueArg.messages.length <= 50
1138
+ && valueArg.messages.every(isFlexPublicMessage)
1139
+ && (valueArg.nextCursor === undefined || isBoundedString(valueArg.nextCursor, 4096));
1140
+ case 'message.get':
1141
+ return isFlexPublicMessage(valueArg);
1142
+ case 'prompt.start':
1143
+ return isFlexPlainObject(valueArg)
1144
+ && hasFlexExactKeys(valueArg, ['queueId', 'runId'])
1145
+ && isIdentifier(valueArg.queueId)
1146
+ && isIdentifier(valueArg.runId);
1147
+ case 'prompt.acknowledge':
1148
+ return isFlexPlainObject(valueArg)
1149
+ && hasFlexExactKeys(valueArg, ['acknowledged'])
1150
+ && valueArg.acknowledged === true;
1151
+ case 'prompt.get':
1152
+ return isFlexPlainObject(valueArg)
1153
+ && hasFlexExactKeys(valueArg, ['entry'])
1154
+ && isPromptQueueEntry(valueArg.entry);
1155
+ case 'prompt.list':
1156
+ return isFlexPlainObject(valueArg)
1157
+ && hasFlexExactKeys(valueArg, ['entries'])
1158
+ && Array.isArray(valueArg.entries)
1159
+ && valueArg.entries.length <= flexIpcMaximumPromptQueueEntries
1160
+ && valueArg.entries.every(isPromptQueueEntry);
1161
+ case 'prompt.cancel':
1162
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['accepted'])
1163
+ && typeof valueArg.accepted === 'boolean';
1164
+ case 'permission.list':
1165
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['permissions'])
1166
+ && Array.isArray(valueArg.permissions) && valueArg.permissions.length <= 64
1167
+ && valueArg.permissions.every(isPermissionRequest);
1168
+ case 'permission.respond':
1169
+ case 'provider.connection.logout.prepare':
1170
+ case 'provider.connection.logout':
1171
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['accepted'])
1172
+ && valueArg.accepted === true;
1173
+ case 'provider.connection.ratelimits.get':
1174
+ return isFlexPlainObject(valueArg)
1175
+ && hasFlexExactKeys(valueArg, ['rateLimits'])
1176
+ && isAccountRateLimits(valueArg.rateLimits);
1177
+ case 'provider.list':
1178
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['providers'])
1179
+ && Array.isArray(valueArg.providers) && valueArg.providers.length === 1
1180
+ && isFlexPlainObject(valueArg.providers[0])
1181
+ && hasFlexExactKeys(valueArg.providers[0], ['providerId', 'displayName', 'loginFlow'])
1182
+ && valueArg.providers[0].providerId === 'openai'
1183
+ && isBoundedString(valueArg.providers[0].displayName, 256)
1184
+ && valueArg.providers[0].loginFlow === 'device';
1185
+ case 'provider.login.begin':
1186
+ return isFlexPlainObject(valueArg)
1187
+ && hasFlexExactKeys(valueArg, ['loginId', 'verificationUrl', 'userCode', 'status'])
1188
+ && isQualifiedId(valueArg.loginId)
1189
+ && isBoundedString(valueArg.verificationUrl, 4096)
1190
+ && isBoundedString(valueArg.userCode, 256)
1191
+ && valueArg.status === 'pending';
1192
+ case 'provider.login.status':
1193
+ return isFlexPublicProviderConnection(valueArg);
1194
+ case 'provider.login.cancel':
1195
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['canceled'])
1196
+ && typeof valueArg.canceled === 'boolean';
1197
+ case 'provider.connection.list':
1198
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['connections'])
1199
+ && Array.isArray(valueArg.connections) && valueArg.connections.length <= 512
1200
+ && valueArg.connections.every(isFlexPublicProviderConnection);
1201
+ case 'provider.connection.opencode-auth.get':
1202
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['auth'])
1203
+ && isOpenCodeOAuthAuth(valueArg.auth);
1204
+ case 'provider.models.refresh':
1205
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['jobId'])
1206
+ && isQualifiedId(valueArg.jobId);
1207
+ case 'model.choice.get':
1208
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['choice'])
1209
+ && (valueArg.choice === null || isModelChoice(valueArg.choice));
1210
+ case 'model.choice.set':
1211
+ return isFlexPlainObject(valueArg) && hasFlexExactKeys(valueArg, ['choice'])
1212
+ && isModelChoice(valueArg.choice);
1213
+ case 'model.choice.validate':
1214
+ return isFlexPlainObject(valueArg)
1215
+ && hasFlexExactKeys(valueArg, ['valid'])
1216
+ && valueArg.valid === true;
1217
+ default:
1218
+ return false;
1219
+ }
1220
+ };
1221
+ export const isFlexServiceError = (valueArg) => isFlexPlainObject(valueArg)
1222
+ && hasFlexExactKeys(valueArg, ['name', 'code', 'message'])
1223
+ && valueArg.name === 'FlexServiceError'
1224
+ && typeof valueArg.code === 'string'
1225
+ && serviceErrorCodes.has(valueArg.code)
1226
+ && valueArg.message === flexServiceErrorMessages[valueArg.code];
1227
+ const isFlexChildEvent = (valueArg) => {
1228
+ if (!isFlexPlainObject(valueArg))
1229
+ return false;
1230
+ switch (valueArg.type) {
1231
+ case 'session.history.changed':
1232
+ return hasFlexExactKeys(valueArg, ['type', 'scopeId', 'sessionId', 'direction'], ['runId'])
1233
+ && isIdentifier(valueArg.scopeId)
1234
+ && isIdentifier(valueArg.sessionId)
1235
+ && ['undo', 'redo', 'branch'].includes(String(valueArg.direction))
1236
+ && (valueArg.runId === undefined || isIdentifier(valueArg.runId))
1237
+ && (valueArg.direction === 'branch'
1238
+ ? valueArg.runId === undefined
1239
+ : valueArg.runId !== undefined);
1240
+ case 'sessions.changed':
1241
+ return hasFlexExactKeys(valueArg, ['type', 'coalesced'], ['scopeId', 'sessionId'])
1242
+ && typeof valueArg.coalesced === 'boolean'
1243
+ && (valueArg.scopeId === undefined || isIdentifier(valueArg.scopeId))
1244
+ && (valueArg.sessionId === undefined || isIdentifier(valueArg.sessionId))
1245
+ && (valueArg.sessionId === undefined || valueArg.scopeId !== undefined);
1246
+ case 'permissions.changed':
1247
+ return hasFlexExactKeys(valueArg, ['type', 'scopeId', 'sessionId'])
1248
+ && isIdentifier(valueArg.scopeId) && isIdentifier(valueArg.sessionId);
1249
+ case 'tool.updated':
1250
+ return hasFlexExactKeys(valueArg, [
1251
+ 'type', 'scopeId', 'sessionId', 'runId', 'messageId',
1252
+ 'messageIndex', 'partIndex', 'sequence', 'timestamp', 'part',
1253
+ ])
1254
+ && isIdentifier(valueArg.scopeId)
1255
+ && isIdentifier(valueArg.sessionId)
1256
+ && isIdentifier(valueArg.runId)
1257
+ && isIdentifier(valueArg.messageId)
1258
+ && isNonNegativeInteger(valueArg.messageIndex)
1259
+ && isNonNegativeInteger(valueArg.partIndex)
1260
+ && isNonNegativeInteger(valueArg.sequence)
1261
+ && valueArg.sequence >= 1
1262
+ && isIsoDate(valueArg.timestamp)
1263
+ && isFlexPlainObject(valueArg.part)
1264
+ && valueArg.part.type === 'tool'
1265
+ && isMessagePart(valueArg.part);
1266
+ case 'reasoning.updated':
1267
+ return hasFlexExactKeys(valueArg, [
1268
+ 'type', 'scopeId', 'sessionId', 'runId', 'messageId',
1269
+ 'messageIndex', 'partIndex', 'sequence', 'timestamp', 'part',
1270
+ ])
1271
+ && isIdentifier(valueArg.scopeId)
1272
+ && isIdentifier(valueArg.sessionId)
1273
+ && isIdentifier(valueArg.runId)
1274
+ && isIdentifier(valueArg.messageId)
1275
+ && isNonNegativeInteger(valueArg.messageIndex)
1276
+ && isNonNegativeInteger(valueArg.partIndex)
1277
+ && isNonNegativeInteger(valueArg.sequence)
1278
+ && valueArg.sequence >= 1
1279
+ && isIsoDate(valueArg.timestamp)
1280
+ && isFlexPlainObject(valueArg.part)
1281
+ && valueArg.part.type === 'reasoning'
1282
+ && isMessagePart(valueArg.part);
1283
+ case 'text.updated':
1284
+ return hasFlexExactKeys(valueArg, [
1285
+ 'type', 'scopeId', 'sessionId', 'runId', 'messageId',
1286
+ 'messageIndex', 'partIndex', 'sequence', 'timestamp', 'status', 'part',
1287
+ ])
1288
+ && isIdentifier(valueArg.scopeId)
1289
+ && isIdentifier(valueArg.sessionId)
1290
+ && isIdentifier(valueArg.runId)
1291
+ && isIdentifier(valueArg.messageId)
1292
+ && isNonNegativeInteger(valueArg.messageIndex)
1293
+ && isNonNegativeInteger(valueArg.partIndex)
1294
+ && isNonNegativeInteger(valueArg.sequence)
1295
+ && valueArg.sequence >= 1
1296
+ && isIsoDate(valueArg.timestamp)
1297
+ && ['running', 'completed'].includes(String(valueArg.status))
1298
+ && isFlexPlainObject(valueArg.part)
1299
+ && valueArg.part.type === 'text'
1300
+ && isMessagePart(valueArg.part);
1301
+ case 'prompt.queued':
1302
+ case 'prompt.started':
1303
+ case 'prompt.running':
1304
+ case 'prompt.finished':
1305
+ return hasFlexExactKeys(valueArg, ['type', 'scopeId', 'sessionId', 'queueId', 'entry'], ['runId'])
1306
+ && isIdentifier(valueArg.scopeId)
1307
+ && isIdentifier(valueArg.sessionId)
1308
+ && isIdentifier(valueArg.queueId)
1309
+ && (valueArg.runId === undefined || isIdentifier(valueArg.runId))
1310
+ && isPromptQueueEntry(valueArg.entry)
1311
+ && valueArg.entry.scopeId === valueArg.scopeId
1312
+ && valueArg.entry.sessionId === valueArg.sessionId
1313
+ && valueArg.entry.queueId === valueArg.queueId
1314
+ && valueArg.entry.runId === valueArg.runId
1315
+ && ((valueArg.type === 'prompt.queued'
1316
+ && valueArg.runId === undefined
1317
+ && valueArg.entry.status === 'queued')
1318
+ || (valueArg.type === 'prompt.started'
1319
+ && valueArg.runId !== undefined
1320
+ && ['starting', 'scheduled'].includes(valueArg.entry.status))
1321
+ || (valueArg.type === 'prompt.running'
1322
+ && valueArg.runId !== undefined
1323
+ && valueArg.entry.status === 'running')
1324
+ || (valueArg.type === 'prompt.finished'
1325
+ && valueArg.runId !== undefined
1326
+ && ['completed', 'failed', 'cancelled'].includes(valueArg.entry.status)));
1327
+ case 'prompt.message-bound':
1328
+ return hasFlexExactKeys(valueArg, [
1329
+ 'type', 'scopeId', 'sessionId', 'queueId', 'runId', 'messageId',
1330
+ ])
1331
+ && isIdentifier(valueArg.scopeId)
1332
+ && isIdentifier(valueArg.sessionId)
1333
+ && isIdentifier(valueArg.queueId)
1334
+ && isIdentifier(valueArg.runId)
1335
+ && isIdentifier(valueArg.messageId);
1336
+ case 'job.finished':
1337
+ return hasFlexExactKeys(valueArg, ['type', 'jobId', 'kind', 'status'], ['models'])
1338
+ && isQualifiedId(valueArg.jobId)
1339
+ && valueArg.kind === 'provider.models'
1340
+ && ['completed', 'failed', 'cancelled'].includes(String(valueArg.status))
1341
+ && (valueArg.models === undefined || (valueArg.status === 'completed'
1342
+ && Array.isArray(valueArg.models)
1343
+ && valueArg.models.length <= 256
1344
+ && valueArg.models.every(isPublicProviderModel)));
1345
+ case 'provider.connection.changed':
1346
+ return hasFlexExactKeys(valueArg, ['type', 'connection'])
1347
+ && isFlexPublicProviderConnection(valueArg.connection);
1348
+ default:
1349
+ return false;
1350
+ }
1351
+ };
1352
+ export const parseFlexParentMessage = (valueArg) => {
1353
+ if (!isFlexPlainObject(valueArg)
1354
+ || valueArg.version !== flexIpcProtocolVersion
1355
+ || typeof valueArg.type !== 'string')
1356
+ throw new Error('Invalid Flex parent message.');
1357
+ if (valueArg.type === 'init') {
1358
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'init']) || !isFlexServiceInit(valueArg.init)) {
1359
+ throw new Error('Invalid Flex init message.');
1360
+ }
1361
+ return valueArg;
1362
+ }
1363
+ if (valueArg.type === 'request') {
1364
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'method', 'payload'])
1365
+ || !isRequestId(valueArg.requestId)
1366
+ || typeof valueArg.method !== 'string'
1367
+ || !requestMethods.has(valueArg.method)
1368
+ || !isFlexRequestPayload(valueArg.method, valueArg.payload))
1369
+ throw new Error('Invalid Flex request message.');
1370
+ return valueArg;
1371
+ }
1372
+ if (valueArg.type === 'request.cancel') {
1373
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId'])
1374
+ || !isRequestId(valueArg.requestId))
1375
+ throw new Error('Invalid Flex request cancellation message.');
1376
+ return valueArg;
1377
+ }
1378
+ if (valueArg.type === 'dispose') {
1379
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId']) || !isRequestId(valueArg.requestId)) {
1380
+ throw new Error('Invalid Flex dispose message.');
1381
+ }
1382
+ return valueArg;
1383
+ }
1384
+ if (valueArg.type === 'host.response') {
1385
+ if (!isRequestId(valueArg.requestId) || typeof valueArg.ok !== 'boolean') {
1386
+ throw new Error('Invalid Flex host response message.');
1387
+ }
1388
+ if (valueArg.ok) {
1389
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'ok', 'result'])) {
1390
+ throw new Error('Invalid successful Flex host response message.');
1391
+ }
1392
+ }
1393
+ else if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'ok', 'error'])
1394
+ || !isFlexServiceError(valueArg.error)) {
1395
+ throw new Error('Invalid failed Flex host response message.');
1396
+ }
1397
+ return valueArg;
1398
+ }
1399
+ if (valueArg.type === 'browser.channel.frame') {
1400
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'channelId', 'dataBase64'])
1401
+ || !isChannelId(valueArg.channelId)
1402
+ || !isCanonicalBrowserFrame(valueArg.dataBase64))
1403
+ throw new Error('Invalid Flex browser channel frame.');
1404
+ return valueArg;
1405
+ }
1406
+ if (valueArg.type === 'browser.channel.closed') {
1407
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'channelId'])
1408
+ || !isChannelId(valueArg.channelId))
1409
+ throw new Error('Invalid Flex browser channel close message.');
1410
+ return valueArg;
1411
+ }
1412
+ throw new Error('Invalid Flex parent message type.');
1413
+ };
1414
+ export const parseFlexChildMessage = (valueArg) => {
1415
+ if (!isFlexPlainObject(valueArg)
1416
+ || valueArg.version !== flexIpcProtocolVersion
1417
+ || typeof valueArg.type !== 'string')
1418
+ throw new Error('Invalid Flex child message.');
1419
+ if (valueArg.type === 'status') {
1420
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'status']) || !isFlexServiceStatus(valueArg.status)) {
1421
+ throw new Error('Invalid Flex status message.');
1422
+ }
1423
+ return valueArg;
1424
+ }
1425
+ if (valueArg.type === 'response') {
1426
+ if (!isRequestId(valueArg.requestId) || typeof valueArg.ok !== 'boolean') {
1427
+ throw new Error('Invalid Flex response message.');
1428
+ }
1429
+ if (valueArg.ok) {
1430
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'ok', 'result'])) {
1431
+ throw new Error('Invalid successful Flex response message.');
1432
+ }
1433
+ }
1434
+ else if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'ok', 'error'])
1435
+ || !isFlexServiceError(valueArg.error)) {
1436
+ throw new Error('Invalid failed Flex response message.');
1437
+ }
1438
+ return valueArg;
1439
+ }
1440
+ if (valueArg.type === 'event') {
1441
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'event']) || !isFlexChildEvent(valueArg.event)) {
1442
+ throw new Error('Invalid Flex event message.');
1443
+ }
1444
+ return valueArg;
1445
+ }
1446
+ if (valueArg.type === 'host.request') {
1447
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId', 'method', 'payload', 'timeoutMs'])
1448
+ || !isRequestId(valueArg.requestId)
1449
+ || typeof valueArg.method !== 'string'
1450
+ || !hostRequestMethods.has(valueArg.method)
1451
+ || !Number.isSafeInteger(valueArg.timeoutMs)
1452
+ || Number(valueArg.timeoutMs) < 1
1453
+ || Number(valueArg.timeoutMs) > flexIpcMaximumHostTimeoutMs
1454
+ || !isFlexHostRequestPayload(valueArg.method, valueArg.payload))
1455
+ throw new Error('Invalid Flex host request message.');
1456
+ return valueArg;
1457
+ }
1458
+ if (valueArg.type === 'host.cancel') {
1459
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId'])
1460
+ || !isRequestId(valueArg.requestId))
1461
+ throw new Error('Invalid Flex host cancellation message.');
1462
+ return valueArg;
1463
+ }
1464
+ if (valueArg.type === 'host.response.acknowledge') {
1465
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'requestId'])
1466
+ || !isRequestId(valueArg.requestId))
1467
+ throw new Error('Invalid Flex host response acknowledgement message.');
1468
+ return valueArg;
1469
+ }
1470
+ if (valueArg.type === 'browser.channel.frame') {
1471
+ if (!hasFlexExactKeys(valueArg, ['version', 'type', 'channelId', 'dataBase64'])
1472
+ || !isChannelId(valueArg.channelId)
1473
+ || !isCanonicalBrowserFrame(valueArg.dataBase64))
1474
+ throw new Error('Invalid Flex browser channel frame.');
1475
+ return valueArg;
1476
+ }
1477
+ throw new Error('Invalid Flex child message type.');
1478
+ };
1479
+ export const createFlexServiceError = (codeArg) => ({
1480
+ name: 'FlexServiceError',
1481
+ code: codeArg,
1482
+ message: flexServiceErrorMessages[codeArg],
1483
+ });
1484
+ export class FlexServiceError extends Error {
1485
+ code;
1486
+ name = 'FlexServiceError';
1487
+ constructor(code) {
1488
+ super(flexServiceErrorMessages[code]);
1489
+ this.code = code;
1490
+ }
1491
+ }
1492
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5mbGV4aXBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaW50ZXJmYWNlcy5mbGV4aXBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCw2Q0FBNkMsRUFDN0Msc0JBQXNCLEdBRXZCLE1BQU0sMEJBQTBCLENBQUM7QUE2QmxDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQVcsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUFDMUMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxDQUFDO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0s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