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