@vm0/cli 9.237.1 → 9.237.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/{agent-G5NJDTZD.js → agent-2NTLUZ3Q.js} +5 -5
- package/{banking-RE4Y55OB.js → banking-GYL2ITBM.js} +3 -3
- package/{chat-TRC4V4LW.js → chat-6UAO4EJO.js} +4 -4
- package/{chunk-ZWYDJ3AZ.js → chunk-2J262TOD.js} +2 -2
- package/{chunk-ZJOHVGBX.js → chunk-2JZ66FKH.js} +2 -2
- package/{chunk-AJUYZVZU.js → chunk-AEL2XKIL.js} +2 -2
- package/{chunk-UFRPDBLC.js → chunk-E5VVOBJ4.js} +69 -39
- package/chunk-E5VVOBJ4.js.map +1 -0
- package/{chunk-G55J25QR.js → chunk-GPZFXJF6.js} +10 -3
- package/chunk-GPZFXJF6.js.map +1 -0
- package/{chunk-FAIVSEFV.js → chunk-HEGJPPBN.js} +3 -2
- package/chunk-HEGJPPBN.js.map +1 -0
- package/{chunk-LAUWX3TW.js → chunk-HU44PZDH.js} +4 -4
- package/{chunk-4KHAQF4M.js → chunk-JKB6P3VO.js} +2 -2
- package/{chunk-SSQSKO3U.js → chunk-MBQ64I5M.js} +2 -2
- package/{chunk-DNWL4DAH.js → chunk-NPC4JKK2.js} +2 -2
- package/{chunk-RNGEJBP2.js → chunk-OHQONXKG.js} +3 -3
- package/{chunk-G5FQWKVF.js → chunk-OJDPK7NK.js} +2 -2
- package/{chunk-G5FQWKVF.js.map → chunk-OJDPK7NK.js.map} +1 -1
- package/{computer-use-GESXXHFG.js → computer-use-TZP5D27S.js} +3 -3
- package/{connector-SDQMMKIT.js → connector-4LDVG2YU.js} +4 -4
- package/{credit-JTKH4UMZ.js → credit-ASJ5RACS.js} +4 -4
- package/{developer-support-2JW3QPDC.js → developer-support-CUUQTNHK.js} +3 -3
- package/{doctor-VPBYKX77.js → doctor-4XKNSIOM.js} +7 -7
- package/{generate-F7ZPK6IV.js → generate-I2VLS2N6.js} +5 -5
- package/{github-GDPM257C.js → github-SVWWHKGN.js} +3 -3
- package/{goal-M2AYUQJ4.js → goal-CQDVC4YO.js} +3 -3
- package/{host-OJR3FPYM.js → host-HOMIDNAL.js} +3 -3
- package/index.js +15 -15
- package/{logs-H5JYXHA6.js → logs-YIPQV5UX.js} +8 -8
- package/{maps-PLCIA2DA.js → maps-SO3MLFWJ.js} +3 -3
- package/{memory-EJSR4TVG.js → memory-KV2RFKQS.js} +3 -3
- package/{model-5YKXB5ND.js → model-U6DTR7JY.js} +4 -4
- package/{model-provider-4EUN45KQ.js → model-provider-5LGQU6VF.js} +4 -4
- package/{org-NY3ZQYMJ.js → org-2UDAOW4R.js} +3 -3
- package/package.json +1 -1
- package/{phone-LJFIA4YV.js → phone-7WJLTTW2.js} +3 -3
- package/{preference-H4WF5NXY.js → preference-MSMPINCM.js} +3 -3
- package/{relationship-2OHALC26.js → relationship-XC64ZBSX.js} +3 -3
- package/{resource-2DLQU6OU.js → resource-W7JNLMJP.js} +4 -4
- package/{search-BDC7KHXU.js → search-XK5LO4BC.js} +8 -8
- package/{secret-DYZ2K6QX.js → secret-5CFIBLLI.js} +4 -4
- package/{slack-DRX6JAGE.js → slack-7J33PAP5.js} +3 -3
- package/{teams-K2XTVCGT.js → teams-IWY7IFLD.js} +3 -3
- package/{telegram-XNU3XVPW.js → telegram-QWZYLAJW.js} +3 -3
- package/{variable-J5FV4HHC.js → variable-3LUSNJRP.js} +3 -3
- package/{video-HSB2R7TK.js → video-XHTZYJWK.js} +2 -2
- package/{web-MRZE6CNW.js → web-C76UB3WO.js} +3 -3
- package/{whoami-5SM2Z5BX.js → whoami-K6I3CEDK.js} +5 -5
- package/{workflow-6ZJZKTJ5.js → workflow-K2OP7MBH.js} +3 -3
- package/zero.js +34 -34
- package/chunk-FAIVSEFV.js.map +0 -1
- package/chunk-G55J25QR.js.map +0 -1
- package/chunk-UFRPDBLC.js.map +0 -1
- /package/{agent-G5NJDTZD.js.map → agent-2NTLUZ3Q.js.map} +0 -0
- /package/{banking-RE4Y55OB.js.map → banking-GYL2ITBM.js.map} +0 -0
- /package/{chat-TRC4V4LW.js.map → chat-6UAO4EJO.js.map} +0 -0
- /package/{chunk-ZWYDJ3AZ.js.map → chunk-2J262TOD.js.map} +0 -0
- /package/{chunk-ZJOHVGBX.js.map → chunk-2JZ66FKH.js.map} +0 -0
- /package/{chunk-AJUYZVZU.js.map → chunk-AEL2XKIL.js.map} +0 -0
- /package/{chunk-LAUWX3TW.js.map → chunk-HU44PZDH.js.map} +0 -0
- /package/{chunk-4KHAQF4M.js.map → chunk-JKB6P3VO.js.map} +0 -0
- /package/{chunk-SSQSKO3U.js.map → chunk-MBQ64I5M.js.map} +0 -0
- /package/{chunk-DNWL4DAH.js.map → chunk-NPC4JKK2.js.map} +0 -0
- /package/{chunk-RNGEJBP2.js.map → chunk-OHQONXKG.js.map} +0 -0
- /package/{computer-use-GESXXHFG.js.map → computer-use-TZP5D27S.js.map} +0 -0
- /package/{connector-SDQMMKIT.js.map → connector-4LDVG2YU.js.map} +0 -0
- /package/{credit-JTKH4UMZ.js.map → credit-ASJ5RACS.js.map} +0 -0
- /package/{developer-support-2JW3QPDC.js.map → developer-support-CUUQTNHK.js.map} +0 -0
- /package/{doctor-VPBYKX77.js.map → doctor-4XKNSIOM.js.map} +0 -0
- /package/{generate-F7ZPK6IV.js.map → generate-I2VLS2N6.js.map} +0 -0
- /package/{github-GDPM257C.js.map → github-SVWWHKGN.js.map} +0 -0
- /package/{goal-M2AYUQJ4.js.map → goal-CQDVC4YO.js.map} +0 -0
- /package/{host-OJR3FPYM.js.map → host-HOMIDNAL.js.map} +0 -0
- /package/{logs-H5JYXHA6.js.map → logs-YIPQV5UX.js.map} +0 -0
- /package/{maps-PLCIA2DA.js.map → maps-SO3MLFWJ.js.map} +0 -0
- /package/{memory-EJSR4TVG.js.map → memory-KV2RFKQS.js.map} +0 -0
- /package/{model-5YKXB5ND.js.map → model-U6DTR7JY.js.map} +0 -0
- /package/{model-provider-4EUN45KQ.js.map → model-provider-5LGQU6VF.js.map} +0 -0
- /package/{org-NY3ZQYMJ.js.map → org-2UDAOW4R.js.map} +0 -0
- /package/{phone-LJFIA4YV.js.map → phone-7WJLTTW2.js.map} +0 -0
- /package/{preference-H4WF5NXY.js.map → preference-MSMPINCM.js.map} +0 -0
- /package/{relationship-2OHALC26.js.map → relationship-XC64ZBSX.js.map} +0 -0
- /package/{resource-2DLQU6OU.js.map → resource-W7JNLMJP.js.map} +0 -0
- /package/{search-BDC7KHXU.js.map → search-XK5LO4BC.js.map} +0 -0
- /package/{secret-DYZ2K6QX.js.map → secret-5CFIBLLI.js.map} +0 -0
- /package/{slack-DRX6JAGE.js.map → slack-7J33PAP5.js.map} +0 -0
- /package/{teams-K2XTVCGT.js.map → teams-IWY7IFLD.js.map} +0 -0
- /package/{telegram-XNU3XVPW.js.map → telegram-QWZYLAJW.js.map} +0 -0
- /package/{variable-J5FV4HHC.js.map → variable-3LUSNJRP.js.map} +0 -0
- /package/{video-HSB2R7TK.js.map → video-XHTZYJWK.js.map} +0 -0
- /package/{web-MRZE6CNW.js.map → web-C76UB3WO.js.map} +0 -0
- /package/{whoami-5SM2Z5BX.js.map → whoami-K6I3CEDK.js.map} +0 -0
- /package/{workflow-6ZJZKTJ5.js.map → workflow-K2OP7MBH.js.map} +0 -0
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
downloadTeamsFile,
|
|
8
8
|
initTeamsFileUpload,
|
|
9
9
|
sendTeamsMessage
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GPZFXJF6.js";
|
|
11
11
|
import {
|
|
12
12
|
withErrorHandler
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-NPC4JKK2.js";
|
|
14
14
|
import {
|
|
15
15
|
source_default
|
|
16
16
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -281,4 +281,4 @@ Examples:
|
|
|
281
281
|
export {
|
|
282
282
|
zeroTeamsCommand
|
|
283
283
|
};
|
|
284
|
-
//# sourceMappingURL=teams-
|
|
284
|
+
//# sourceMappingURL=teams-IWY7IFLD.js.map
|
|
@@ -8,10 +8,10 @@ import {
|
|
|
8
8
|
initTelegramFileUpload,
|
|
9
9
|
listTelegramBots,
|
|
10
10
|
sendTelegramMessage
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-GPZFXJF6.js";
|
|
12
12
|
import {
|
|
13
13
|
withErrorHandler
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-NPC4JKK2.js";
|
|
15
15
|
import {
|
|
16
16
|
source_default
|
|
17
17
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -335,4 +335,4 @@ Examples:
|
|
|
335
335
|
export {
|
|
336
336
|
zeroTelegramCommand
|
|
337
337
|
};
|
|
338
|
-
//# sourceMappingURL=telegram-
|
|
338
|
+
//# sourceMappingURL=telegram-QWZYLAJW.js.map
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
deleteZeroVariable,
|
|
11
11
|
listZeroVariables,
|
|
12
12
|
setZeroVariable
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-GPZFXJF6.js";
|
|
14
14
|
import {
|
|
15
15
|
withErrorHandler
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-NPC4JKK2.js";
|
|
17
17
|
import {
|
|
18
18
|
source_default
|
|
19
19
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -117,4 +117,4 @@ var zeroVariableCommand = new Command().name("variable").description("Read or wr
|
|
|
117
117
|
export {
|
|
118
118
|
zeroVariableCommand
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=variable-
|
|
120
|
+
//# sourceMappingURL=variable-3LUSNJRP.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
downloadWebFile,
|
|
7
7
|
transcribeAudio,
|
|
8
8
|
withErrorHandler
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-NPC4JKK2.js";
|
|
10
10
|
import "./chunk-JUTUEPIR.js";
|
|
11
11
|
import "./chunk-LRHXR7JT.js";
|
|
12
12
|
import {
|
|
@@ -246,4 +246,4 @@ Tip (video understanding):
|
|
|
246
246
|
export {
|
|
247
247
|
zeroVideoCommand
|
|
248
248
|
};
|
|
249
|
-
//# sourceMappingURL=video-
|
|
249
|
+
//# sourceMappingURL=video-XHTZYJWK.js.map
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import "./chunk-LTDQISD7.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-GPZFXJF6.js";
|
|
6
6
|
import {
|
|
7
7
|
downloadWebFile,
|
|
8
8
|
uploadWebFile,
|
|
9
9
|
withErrorHandler
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-NPC4JKK2.js";
|
|
11
11
|
import "./chunk-JUTUEPIR.js";
|
|
12
12
|
import "./chunk-LRHXR7JT.js";
|
|
13
13
|
import {
|
|
@@ -106,4 +106,4 @@ Examples:
|
|
|
106
106
|
export {
|
|
107
107
|
zeroWebCommand
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=web-
|
|
109
|
+
//# sourceMappingURL=web-C76UB3WO.js.map
|
|
@@ -4,22 +4,22 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
loadConnectorPermissionInfos,
|
|
6
6
|
policyIcon
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2JZ66FKH.js";
|
|
8
8
|
import {
|
|
9
9
|
permissionGrantsToFirewallPolicies
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AEL2XKIL.js";
|
|
11
11
|
import "./chunk-LTDQISD7.js";
|
|
12
12
|
import {
|
|
13
13
|
getZeroAgentUserConnectors,
|
|
14
14
|
listZeroConnectors,
|
|
15
15
|
listZeroUserPermissionGrants
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-GPZFXJF6.js";
|
|
17
17
|
import {
|
|
18
18
|
getActiveOrg,
|
|
19
19
|
getApiUrl,
|
|
20
20
|
getToken,
|
|
21
21
|
withErrorHandler
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-NPC4JKK2.js";
|
|
23
23
|
import {
|
|
24
24
|
source_default
|
|
25
25
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -192,4 +192,4 @@ Notes:
|
|
|
192
192
|
export {
|
|
193
193
|
zeroWhoamiCommand
|
|
194
194
|
};
|
|
195
|
-
//# sourceMappingURL=whoami-
|
|
195
|
+
//# sourceMappingURL=whoami-K6I3CEDK.js.map
|
|
@@ -20,10 +20,10 @@ import {
|
|
|
20
20
|
listWorkflows,
|
|
21
21
|
updateWorkflow,
|
|
22
22
|
updateWorkflowTrigger
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-GPZFXJF6.js";
|
|
24
24
|
import {
|
|
25
25
|
withErrorHandler
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-NPC4JKK2.js";
|
|
27
27
|
import {
|
|
28
28
|
source_default
|
|
29
29
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -1753,4 +1753,4 @@ Examples:
|
|
|
1753
1753
|
export {
|
|
1754
1754
|
zeroWorkflowCommand
|
|
1755
1755
|
};
|
|
1756
|
-
//# sourceMappingURL=workflow-
|
|
1756
|
+
//# sourceMappingURL=workflow-K2OP7MBH.js.map
|
package/zero.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
configureGlobalProxyFromEnv
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OHQONXKG.js";
|
|
7
7
|
import {
|
|
8
8
|
decodeZeroTokenPayload
|
|
9
9
|
} from "./chunk-LRHXR7JT.js";
|
|
@@ -55,70 +55,70 @@ var ZERO_COMMAND_DEFINITIONS = [
|
|
|
55
55
|
name: "org",
|
|
56
56
|
description: "Manage organization settings, members, and providers",
|
|
57
57
|
load: async () => {
|
|
58
|
-
return (await import("./org-
|
|
58
|
+
return (await import("./org-2UDAOW4R.js")).zeroOrgCommand;
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
name: "model",
|
|
63
63
|
description: "List available models and model-switching guidance",
|
|
64
64
|
load: async () => {
|
|
65
|
-
return (await import("./model-
|
|
65
|
+
return (await import("./model-U6DTR7JY.js")).zeroModelCommand;
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
name: "model-provider",
|
|
70
70
|
description: "Inspect model provider routing",
|
|
71
71
|
load: async () => {
|
|
72
|
-
return (await import("./model-provider-
|
|
72
|
+
return (await import("./model-provider-5LGQU6VF.js")).zeroModelProviderCommand;
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
76
|
name: "agent",
|
|
77
77
|
description: "View or manage zero agents",
|
|
78
78
|
load: async () => {
|
|
79
|
-
return (await import("./agent-
|
|
79
|
+
return (await import("./agent-2NTLUZ3Q.js")).zeroAgentCommand;
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
name: "connector",
|
|
84
84
|
description: "Check third-party service connections (GitHub, Slack, etc.)",
|
|
85
85
|
load: async () => {
|
|
86
|
-
return (await import("./connector-
|
|
86
|
+
return (await import("./connector-4LDVG2YU.js")).zeroConnectorCommand;
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
name: "relationship",
|
|
91
91
|
description: "Query relationship memory",
|
|
92
92
|
load: async () => {
|
|
93
|
-
return (await import("./relationship-
|
|
93
|
+
return (await import("./relationship-XC64ZBSX.js")).zeroRelationshipCommand;
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
name: "memory",
|
|
98
98
|
description: "Recall structured memory",
|
|
99
99
|
load: async () => {
|
|
100
|
-
return (await import("./memory-
|
|
100
|
+
return (await import("./memory-KV2RFKQS.js")).zeroMemoryCommand;
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
name: "credit",
|
|
105
105
|
description: "Create a Stripe checkout link to buy credits",
|
|
106
106
|
load: async () => {
|
|
107
|
-
return (await import("./credit-
|
|
107
|
+
return (await import("./credit-ASJ5RACS.js")).zeroCreditCommand;
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
name: "doctor",
|
|
112
112
|
description: "Diagnose runtime issues (connector health, permission denials)",
|
|
113
113
|
load: async () => {
|
|
114
|
-
return (await import("./doctor-
|
|
114
|
+
return (await import("./doctor-4XKNSIOM.js")).zeroDoctorCommand;
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
name: "preference",
|
|
119
119
|
description: "View or update user preferences (timezone, notifications)",
|
|
120
120
|
load: async () => {
|
|
121
|
-
return (await import("./preference-
|
|
121
|
+
return (await import("./preference-MSMPINCM.js")).zeroPreferenceCommand;
|
|
122
122
|
}
|
|
123
123
|
},
|
|
124
124
|
{
|
|
@@ -139,84 +139,84 @@ var ZERO_COMMAND_DEFINITIONS = [
|
|
|
139
139
|
name: "secret",
|
|
140
140
|
description: "Read or write secrets (API keys, tokens)",
|
|
141
141
|
load: async () => {
|
|
142
|
-
return (await import("./secret-
|
|
142
|
+
return (await import("./secret-5CFIBLLI.js")).zeroSecretCommand;
|
|
143
143
|
}
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
146
|
name: "github",
|
|
147
147
|
description: "Upload and download GitHub files",
|
|
148
148
|
load: async () => {
|
|
149
|
-
return (await import("./github-
|
|
149
|
+
return (await import("./github-SVWWHKGN.js")).zeroGithubCommand;
|
|
150
150
|
}
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
name: "slack",
|
|
154
154
|
description: "Send messages, upload files, and download files from Slack as the bot",
|
|
155
155
|
load: async () => {
|
|
156
|
-
return (await import("./slack-
|
|
156
|
+
return (await import("./slack-7J33PAP5.js")).zeroSlackCommand;
|
|
157
157
|
}
|
|
158
158
|
},
|
|
159
159
|
{
|
|
160
160
|
name: "teams",
|
|
161
161
|
description: "Send Microsoft Teams messages, upload files, and download files",
|
|
162
162
|
load: async () => {
|
|
163
|
-
return (await import("./teams-
|
|
163
|
+
return (await import("./teams-IWY7IFLD.js")).zeroTeamsCommand;
|
|
164
164
|
}
|
|
165
165
|
},
|
|
166
166
|
{
|
|
167
167
|
name: "telegram",
|
|
168
168
|
description: "Inspect bots, send messages, upload files, and download files from Telegram",
|
|
169
169
|
load: async () => {
|
|
170
|
-
return (await import("./telegram-
|
|
170
|
+
return (await import("./telegram-QWZYLAJW.js")).zeroTelegramCommand;
|
|
171
171
|
}
|
|
172
172
|
},
|
|
173
173
|
{
|
|
174
174
|
name: "phone",
|
|
175
175
|
description: "Send AgentPhone messages, upload files, and download media",
|
|
176
176
|
load: async () => {
|
|
177
|
-
return (await import("./phone-
|
|
177
|
+
return (await import("./phone-7WJLTTW2.js")).zeroPhoneCommand;
|
|
178
178
|
}
|
|
179
179
|
},
|
|
180
180
|
{
|
|
181
181
|
name: "variable",
|
|
182
182
|
description: "Read or write non-sensitive configuration values",
|
|
183
183
|
load: async () => {
|
|
184
|
-
return (await import("./variable-
|
|
184
|
+
return (await import("./variable-3LUSNJRP.js")).zeroVariableCommand;
|
|
185
185
|
}
|
|
186
186
|
},
|
|
187
187
|
{
|
|
188
188
|
name: "logs",
|
|
189
189
|
description: "View and search agent run logs",
|
|
190
190
|
load: async () => {
|
|
191
|
-
return (await import("./logs-
|
|
191
|
+
return (await import("./logs-YIPQV5UX.js")).zeroLogsCommand;
|
|
192
192
|
}
|
|
193
193
|
},
|
|
194
194
|
{
|
|
195
195
|
name: "search",
|
|
196
196
|
description: "Search logs, chat, or get a recipe for external sources",
|
|
197
197
|
load: async () => {
|
|
198
|
-
return (await import("./search-
|
|
198
|
+
return (await import("./search-XK5LO4BC.js")).zeroSearchCommand;
|
|
199
199
|
}
|
|
200
200
|
},
|
|
201
201
|
{
|
|
202
202
|
name: "chat",
|
|
203
203
|
description: "Manage the current web chat thread",
|
|
204
204
|
load: async () => {
|
|
205
|
-
return (await import("./chat-
|
|
205
|
+
return (await import("./chat-6UAO4EJO.js")).zeroChatCommand;
|
|
206
206
|
}
|
|
207
207
|
},
|
|
208
208
|
{
|
|
209
209
|
name: "resource",
|
|
210
210
|
description: "Pull registry resources from private R2-backed archives",
|
|
211
211
|
load: async () => {
|
|
212
|
-
return (await import("./resource-
|
|
212
|
+
return (await import("./resource-W7JNLMJP.js")).zeroResourceCommand;
|
|
213
213
|
}
|
|
214
214
|
},
|
|
215
215
|
{
|
|
216
216
|
name: "whoami",
|
|
217
217
|
description: "Show agent identity, run ID, and capabilities",
|
|
218
218
|
load: async () => {
|
|
219
|
-
return (await import("./whoami-
|
|
219
|
+
return (await import("./whoami-K6I3CEDK.js")).zeroWhoamiCommand;
|
|
220
220
|
}
|
|
221
221
|
},
|
|
222
222
|
{
|
|
@@ -230,70 +230,70 @@ var ZERO_COMMAND_DEFINITIONS = [
|
|
|
230
230
|
name: "workflow",
|
|
231
231
|
description: "Manage workflows",
|
|
232
232
|
load: async () => {
|
|
233
|
-
return (await import("./workflow-
|
|
233
|
+
return (await import("./workflow-K2OP7MBH.js")).zeroWorkflowCommand;
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
236
|
{
|
|
237
237
|
name: "goal",
|
|
238
238
|
description: "Manage the current thread goal",
|
|
239
239
|
load: async () => {
|
|
240
|
-
return (await import("./goal-
|
|
240
|
+
return (await import("./goal-CQDVC4YO.js")).zeroGoalCommand;
|
|
241
241
|
}
|
|
242
242
|
},
|
|
243
243
|
{
|
|
244
244
|
name: "developer-support",
|
|
245
245
|
description: "Submit a diagnostic report to the dev team",
|
|
246
246
|
load: async () => {
|
|
247
|
-
return (await import("./developer-support-
|
|
247
|
+
return (await import("./developer-support-CUUQTNHK.js")).zeroDeveloperSupportCommand;
|
|
248
248
|
}
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
name: "computer-use",
|
|
252
252
|
description: "Desktop app computer use through Zero CLI",
|
|
253
253
|
load: async () => {
|
|
254
|
-
return (await import("./computer-use-
|
|
254
|
+
return (await import("./computer-use-TZP5D27S.js")).zeroComputerUseCommand;
|
|
255
255
|
}
|
|
256
256
|
},
|
|
257
257
|
{
|
|
258
258
|
name: "generate",
|
|
259
259
|
description: "Generate assets via vm0's built-in pipelines or get connector skill-invocation guidance",
|
|
260
260
|
load: async () => {
|
|
261
|
-
return (await import("./generate-
|
|
261
|
+
return (await import("./generate-I2VLS2N6.js")).generateCommand;
|
|
262
262
|
}
|
|
263
263
|
},
|
|
264
264
|
{
|
|
265
265
|
name: "web",
|
|
266
266
|
description: "Upload and download files via the web chat endpoint",
|
|
267
267
|
load: async () => {
|
|
268
|
-
return (await import("./web-
|
|
268
|
+
return (await import("./web-C76UB3WO.js")).zeroWebCommand;
|
|
269
269
|
}
|
|
270
270
|
},
|
|
271
271
|
{
|
|
272
272
|
name: "video",
|
|
273
273
|
description: "Video processing utilities",
|
|
274
274
|
load: async () => {
|
|
275
|
-
return (await import("./video-
|
|
275
|
+
return (await import("./video-XHTZYJWK.js")).zeroVideoCommand;
|
|
276
276
|
}
|
|
277
277
|
},
|
|
278
278
|
{
|
|
279
279
|
name: "host",
|
|
280
280
|
description: "Publish static sites and clone owned hosted site files",
|
|
281
281
|
load: async () => {
|
|
282
|
-
return (await import("./host-
|
|
282
|
+
return (await import("./host-HOMIDNAL.js")).zeroHostCommand;
|
|
283
283
|
}
|
|
284
284
|
},
|
|
285
285
|
{
|
|
286
286
|
name: "maps",
|
|
287
287
|
description: "Use managed zero maps services",
|
|
288
288
|
load: async () => {
|
|
289
|
-
return (await import("./maps-
|
|
289
|
+
return (await import("./maps-SO3MLFWJ.js")).zeroMapsCommand;
|
|
290
290
|
}
|
|
291
291
|
},
|
|
292
292
|
{
|
|
293
293
|
name: "banking",
|
|
294
294
|
description: "Use managed zero banking services",
|
|
295
295
|
load: async () => {
|
|
296
|
-
return (await import("./banking-
|
|
296
|
+
return (await import("./banking-GYL2ITBM.js")).zeroBankingCommand;
|
|
297
297
|
}
|
|
298
298
|
}
|
|
299
299
|
];
|
|
@@ -406,7 +406,7 @@ function registerZeroCommands(prog, commands) {
|
|
|
406
406
|
var program = new Command();
|
|
407
407
|
program.name("zero").description(
|
|
408
408
|
"Zero CLI \u2014 interact with the zero platform from inside the sandbox"
|
|
409
|
-
).version("9.237.
|
|
409
|
+
).version("9.237.2").addHelpText("after", () => {
|
|
410
410
|
return buildZeroHelpText();
|
|
411
411
|
});
|
|
412
412
|
if (process.argv[1]?.endsWith("zero.js") || process.argv[1]?.endsWith("zero.ts") || process.argv[1]?.endsWith("zero")) {
|
package/chunk-FAIVSEFV.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/connectors/src/firewall-rule-matcher.ts"],"sourcesContent":["import {\n type FirewallConfig,\n hasUnsafeFirewallPath,\n hasBaseUrlParams,\n validateAuthBaseUrl,\n validateBaseUrl,\n} from \"./firewall-types\";\nimport { hasRawWhitespace, hasUnsafeUrlCodepoint } from \"./firewall-url-utils\";\nimport { parseSegment, splitPathSegments } from \"./segment-parser\";\n\ntype SegmentParseResult = ReturnType<typeof parseSegment>;\ntype MatchableSegment = Exclude<SegmentParseResult, { kind: \"error\" }>;\ntype SegmentMatchParser = (\n segment: string,\n patternIndex: number,\n lastPatternIndex: number,\n) => MatchableSegment | null;\n\ntype PathSpecificity = readonly [\n literalSegments: number,\n mixedParamSegments: number,\n plainParamSegments: number,\n plusGreedySegments: number,\n negativeStarGreedySegments: number,\n literalChars: number,\n segmentCount: number,\n];\n\nexport interface FindMatchingPermissionsOptions {\n apiBase?: string;\n}\n\nexport interface FirewallBaseUrlMatch {\n displayBase: string;\n relativePath: string;\n score: number;\n}\n\nexport interface FirewallRoutingPermissionRoute {\n readonly permissionName: string;\n readonly rule: string;\n}\n\nexport interface FirewallRoutingPermissionApi {\n readonly base: string;\n readonly routes: readonly FirewallRoutingPermissionRoute[];\n}\n\nexport type FirewallRequestBlockReason =\n | \"permission_denied\"\n | \"unknown_endpoint\"\n | \"malformed_firewall_config\"\n | \"malformed_network_policy\"\n | \"unsafe_path\";\n\nexport type FirewallRequestDecision =\n | {\n readonly kind: \"no_match\";\n }\n | {\n readonly kind: \"allow\";\n readonly firewallName: string;\n readonly base: string;\n readonly relativePath: string;\n readonly permission?: string;\n readonly rule?: string;\n }\n | {\n readonly kind: \"block\";\n readonly firewallName: string;\n readonly base: string;\n readonly relativePath: string;\n readonly reason: FirewallRequestBlockReason;\n readonly permissions: readonly string[];\n };\n\ninterface ApiMatchState {\n bestSpecificity: PathSpecificity | null;\n matched: string[];\n}\n\ninterface PermissionRuleSet {\n readonly name: string;\n readonly rules: readonly string[];\n}\n\ninterface PermissionMatchApi {\n readonly permissionRuleSets: readonly PermissionRuleSet[];\n}\n\ntype UnknownPolicy = \"allow\" | \"deny\" | \"ask\";\n\ninterface CompiledNetworkPolicy {\n readonly blockedPermissions: ReadonlySet<string>;\n readonly unknownPolicy: UnknownPolicy;\n readonly permissionMalformed: boolean;\n readonly unknownPolicyMalformed: boolean;\n}\n\ninterface CompiledNetworkPolicies {\n readonly policies: ReadonlyMap<string, CompiledNetworkPolicy>;\n readonly topLevelMalformed: boolean;\n}\n\ninterface DecisionRule {\n readonly permission: string;\n readonly raw: string;\n readonly method: string;\n readonly path: string;\n readonly specificity: PathSpecificity;\n}\n\ninterface DecisionApi {\n readonly rawBase: string;\n readonly baseMalformed: boolean;\n readonly authMalformed: boolean;\n readonly hasMalformedRules: boolean;\n readonly rules: readonly DecisionRule[];\n}\n\ninterface DecisionFirewall {\n readonly name: string;\n readonly nameMalformed: boolean;\n readonly apis: readonly DecisionApi[];\n}\n\ninterface DecisionBaseMatch {\n readonly firewallName: string;\n readonly base: string;\n readonly allowBase: string;\n readonly relativePath: string;\n}\n\ninterface DecisionAllowedRuleMatch {\n readonly firewallName: string;\n readonly base: string;\n readonly relativePath: string;\n readonly permission: string;\n readonly rule: string;\n}\n\ninterface DecisionBlockMatch {\n readonly firewallName: string;\n readonly base: string;\n readonly relativePath: string;\n}\n\ninterface FirewallDecisionState {\n bestBaseScore: number | null;\n bestRuleSpecificity: PathSpecificity | null;\n baseMatch: DecisionBaseMatch | null;\n allowedMatch: DecisionAllowedRuleMatch | null;\n deniedMatch: DecisionBlockMatch | null;\n deniedPermissionNames: string[];\n malformedConfigMatch: DecisionBlockMatch | null;\n malformedPolicyMatch: DecisionBlockMatch | null;\n}\n\nconst VALID_RULE_METHODS = new Set([\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"ANY\",\n]);\nconst FORBIDDEN_RUNTIME_HOST_CHARS = new Set(\"#%*,/<>?@\\\\^|{}\".split(\"\"));\nconst FORBIDDEN_BASE_PATTERN_HOST_CHARS = new Set(\"#%,/<>?@\\\\^|\".split(\"\"));\nconst PERCENT_ESCAPE_LENGTH = 3;\nconst HEX_DIGITS = new Set(\"0123456789abcdefABCDEF\".split(\"\"));\nconst PATH_SCORE_MULTIPLIER = 1_000_000;\nconst AUTHORITY_SCORE_MULTIPLIER = 100;\nconst LITERAL_SEGMENT_SCORE = 1_000;\nconst MIXED_PARAM_SEGMENT_SCORE = 100;\nconst PLAIN_PARAM_SEGMENT_SCORE = 10;\nconst PLUS_GREEDY_SEGMENT_SCORE = 1;\nconst ROOT_PATH_SCORE = 1;\nconst STATIC_BASE_SCORE_BONUS = 1;\nconst PERCENT_DECODED_AUTHORITY_SYNTAX_CHARS = new Set([\n \"{\",\n \"}\",\n \"*\",\n \".\",\n \"\\u3002\",\n \"\\uff0e\",\n \"\\uff61\",\n \":\",\n]);\n\n/**\n * Match a runtime segment against a mixed pattern's literal prefix/suffix.\n *\n * Byte-exact comparison; callers must case-fold inputs themselves when\n * needed. Returns the captured middle on success, or null if prefix/suffix\n * don't match or the middle would be empty (non-empty guard).\n */\nfunction matchMixedSegment(\n runtime: string,\n prefix: string,\n suffix: string,\n): string | null {\n if (!runtime.startsWith(prefix)) return null;\n if (!runtime.endsWith(suffix)) return null;\n if (runtime.length <= prefix.length + suffix.length) return null;\n return runtime.slice(prefix.length, runtime.length - suffix.length);\n}\n\nfunction hasNonEmptySegment(segments: string[], start: number): boolean {\n for (let i = start; i < segments.length; i++) {\n if (segments[i] !== \"\") return true;\n }\n return false;\n}\n\nfunction codePointLength(value: string): number {\n return [...value].length;\n}\n\nfunction hasUnsafeRuntimeUrlSyntax(value: string): boolean {\n return (\n hasUnsafeUrlCodepoint(value) ||\n hasRawWhitespace(value) ||\n value.includes(\"\\\\\") ||\n !value.includes(\"://\")\n );\n}\n\nfunction stripTrailingSlash(value: string): string {\n return value.endsWith(\"/\") ? value.slice(0, -1) : value;\n}\n\nfunction isInvalidGreedyParam(\n patternIndex: number,\n lastPatternIndex: number,\n prefix: string,\n suffix: string,\n): boolean {\n return patternIndex !== lastPatternIndex || prefix !== \"\" || suffix !== \"\";\n}\n\nfunction parseStrictMatchSegment(\n segment: string,\n patternIndex: number,\n lastPatternIndex: number,\n): MatchableSegment | null {\n const parsed = parseSegment(segment);\n if (parsed.kind === \"error\") return null;\n if (\n parsed.kind === \"param\" &&\n parsed.greedy !== \"\" &&\n isInvalidGreedyParam(\n patternIndex,\n lastPatternIndex,\n parsed.prefix,\n parsed.suffix,\n )\n ) {\n return null;\n }\n return parsed;\n}\n\nfunction pathSpecificity(pattern: string): PathSpecificity | null {\n if (\n !pattern.startsWith(\"/\") ||\n pattern.includes(\"?\") ||\n pattern.includes(\"#\") ||\n pattern.includes(\"\\\\\") ||\n hasRawWhitespace(pattern) ||\n hasUnsafeUrlCodepoint(pattern)\n ) {\n return null;\n }\n\n let literalSegments = 0;\n let mixedParamSegments = 0;\n let plainParamSegments = 0;\n let plusGreedySegments = 0;\n let starGreedySegments = 0;\n let literalChars = 0;\n const segments = splitPathSegments(pattern);\n const paramNames = new Set<string>();\n const lastSegmentIndex = segments.length - 1;\n\n for (let index = 0; index < segments.length; index += 1) {\n const seg = segments[index]!;\n const parsed = parseSegment(seg);\n if (parsed.kind === \"error\") return null;\n if (parsed.kind === \"literal\") {\n literalSegments += 1;\n literalChars += codePointLength(parsed.value);\n continue;\n }\n if (paramNames.has(parsed.name)) return null;\n paramNames.add(parsed.name);\n if (\n parsed.greedy !== \"\" &&\n isInvalidGreedyParam(\n index,\n lastSegmentIndex,\n parsed.prefix,\n parsed.suffix,\n )\n ) {\n return null;\n }\n\n literalChars +=\n codePointLength(parsed.prefix) + codePointLength(parsed.suffix);\n if (parsed.prefix !== \"\" || parsed.suffix !== \"\") {\n mixedParamSegments += 1;\n } else if (parsed.greedy === \"+\") {\n plusGreedySegments += 1;\n } else if (parsed.greedy === \"*\") {\n starGreedySegments += 1;\n } else {\n plainParamSegments += 1;\n }\n }\n\n return [\n literalSegments,\n mixedParamSegments,\n plainParamSegments,\n plusGreedySegments,\n -starGreedySegments,\n literalChars,\n segments.length,\n ];\n}\n\nfunction comparePathSpecificity(\n left: PathSpecificity,\n right: PathSpecificity,\n): number {\n for (let i = 0; i < left.length; i++) {\n const difference = left[i]! - right[i]!;\n if (difference !== 0) return difference;\n }\n return 0;\n}\n\nfunction matchingRulePath(rule: string, upperMethod: string): string | null {\n const spaceIdx = rule.indexOf(\" \");\n if (spaceIdx === -1) return null;\n const ruleMethod = rule.slice(0, spaceIdx);\n if (!VALID_RULE_METHODS.has(ruleMethod)) return null;\n if (ruleMethod !== \"ANY\" && ruleMethod !== upperMethod) return null;\n return rule.slice(spaceIdx + 1);\n}\n\nfunction compileDecisionRule(\n permission: string,\n rule: string,\n): DecisionRule | null {\n const spaceIdx = rule.indexOf(\" \");\n if (spaceIdx === -1) return null;\n const method = rule.slice(0, spaceIdx);\n if (!VALID_RULE_METHODS.has(method)) return null;\n const path = rule.slice(spaceIdx + 1);\n const specificity = pathSpecificity(path);\n if (specificity === null) return null;\n return { permission, raw: rule, method, path, specificity };\n}\n\nfunction isValidPermissionName(permissionName: string): boolean {\n return permissionName !== \"\" && permissionName !== \"all\";\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!isObjectRecord(value)) return false;\n return Object.values(value).every((entry) => {\n return typeof entry === \"string\";\n });\n}\n\nfunction hasEntries(value: Record<string, string> | undefined): boolean {\n return value !== undefined && Object.keys(value).length > 0;\n}\n\nfunction isValidAwsSigv4AuthConfig(value: unknown): boolean {\n if (!isObjectRecord(value)) return false;\n const allowedKeys = new Set([\n \"accessKeyId\",\n \"secretAccessKey\",\n \"sessionToken\",\n ]);\n if (\n Object.keys(value).some((key) => {\n return !allowedKeys.has(key);\n })\n ) {\n return false;\n }\n if (typeof value.accessKeyId !== \"string\" || value.accessKeyId === \"\") {\n return false;\n }\n if (\n typeof value.secretAccessKey !== \"string\" ||\n value.secretAccessKey === \"\"\n ) {\n return false;\n }\n const optionalValue = value.sessionToken;\n if (\n optionalValue !== undefined &&\n (typeof optionalValue !== \"string\" || optionalValue === \"\")\n ) {\n return false;\n }\n return true;\n}\n\nfunction isValidAuthConfig(auth: unknown, serviceName: string): boolean {\n if (!isObjectRecord(auth)) return false;\n if (auth.headers !== undefined && !isStringRecord(auth.headers)) return false;\n if (auth.query !== undefined && !isStringRecord(auth.query)) return false;\n if (\n auth.awsSigv4 !== undefined &&\n !isValidAwsSigv4AuthConfig(auth.awsSigv4)\n ) {\n return false;\n }\n if (auth.awsSigv4 !== undefined) {\n if (hasEntries(auth.headers as Record<string, string> | undefined)) {\n return false;\n }\n if (hasEntries(auth.query as Record<string, string> | undefined)) {\n return false;\n }\n }\n if (auth.base !== undefined) {\n if (typeof auth.base !== \"string\") return false;\n validateAuthBaseUrl(auth.base, serviceName);\n }\n return true;\n}\n\nfunction isValidApiEntry(\n api: FirewallConfig[\"apis\"][number],\n serviceName: string,\n): boolean {\n if (!isObjectRecord(api)) return false;\n if (typeof api.base !== \"string\") return false;\n try {\n validateBaseUrl(api.base, serviceName);\n if (!isValidAuthConfig(api.auth, serviceName)) return false;\n } catch {\n return false;\n }\n return true;\n}\n\nfunction getPermissionName(permission: unknown): string | null {\n if (!isObjectRecord(permission)) return null;\n if (typeof permission.name !== \"string\") return null;\n if (!isValidPermissionName(permission.name)) return null;\n return permission.name;\n}\n\nfunction getPermissionRules(permission: unknown): string[] {\n if (!isObjectRecord(permission)) return [];\n if (!Array.isArray(permission.rules)) return [];\n const rules = permission.rules.filter((rule) => {\n return typeof rule === \"string\";\n });\n return rules;\n}\n\nfunction rawObjectHasOwn(value: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key);\n}\n\nfunction isValidAuthConfigForDecision(\n auth: unknown,\n serviceName: string,\n): boolean {\n try {\n return isValidAuthConfig(auth, serviceName);\n } catch {\n return false;\n }\n}\n\nfunction compileDecisionApi(\n api: Record<string, unknown>,\n serviceName: string,\n nameMalformed: boolean,\n): DecisionApi | null {\n if (typeof api.base !== \"string\") return null;\n\n let baseMalformed = false;\n try {\n validateBaseUrl(api.base, serviceName);\n } catch {\n baseMalformed = true;\n }\n const authMalformed = !isValidAuthConfigForDecision(api.auth, serviceName);\n const rules: DecisionRule[] = [];\n const seenPermissionNames = new Set<string>();\n let hasMalformedRules = nameMalformed;\n const rawPermissions = api.permissions;\n\n if (Array.isArray(rawPermissions)) {\n for (const rawPermission of rawPermissions) {\n if (!isObjectRecord(rawPermission)) {\n hasMalformedRules = true;\n continue;\n }\n const permissionName = rawPermission.name;\n if (\n typeof permissionName !== \"string\" ||\n !isValidPermissionName(permissionName)\n ) {\n hasMalformedRules = true;\n continue;\n }\n if (seenPermissionNames.has(permissionName)) {\n hasMalformedRules = true;\n continue;\n }\n seenPermissionNames.add(permissionName);\n\n const rawRules = rawPermission.rules;\n if (!Array.isArray(rawRules)) {\n hasMalformedRules = true;\n continue;\n }\n if (rawRules.length === 0) {\n hasMalformedRules = true;\n }\n\n for (const rawRule of rawRules) {\n if (typeof rawRule !== \"string\") {\n hasMalformedRules = true;\n continue;\n }\n const compiledRule = compileDecisionRule(permissionName, rawRule);\n if (compiledRule === null) {\n hasMalformedRules = true;\n continue;\n }\n rules.push(compiledRule);\n }\n }\n } else if (rawObjectHasOwn(api, \"permissions\")) {\n hasMalformedRules = true;\n }\n\n return {\n rawBase: api.base,\n baseMalformed,\n authMalformed,\n hasMalformedRules,\n rules,\n };\n}\n\nfunction compileDecisionFirewall(\n rawFirewall: unknown,\n): DecisionFirewall | null {\n if (!isObjectRecord(rawFirewall)) return null;\n\n const rawName = rawFirewall.name;\n const nameMalformed = typeof rawName !== \"string\" || rawName === \"\";\n const name = typeof rawName === \"string\" ? rawName : \"\";\n const rawApis = rawFirewall.apis;\n if (!Array.isArray(rawApis)) return null;\n\n const apis: DecisionApi[] = [];\n for (const rawApi of rawApis) {\n if (!isObjectRecord(rawApi)) continue;\n const api = compileDecisionApi(rawApi, name, nameMalformed);\n if (api !== null) {\n apis.push(api);\n }\n }\n\n if (apis.length === 0) return null;\n return { name, nameMalformed, apis };\n}\n\nfunction compileDecisionFirewalls(rawFirewalls: unknown): DecisionFirewall[] {\n if (!Array.isArray(rawFirewalls) || rawFirewalls.length === 0) return [];\n\n const firewalls: DecisionFirewall[] = [];\n for (const rawFirewall of rawFirewalls) {\n const firewall = compileDecisionFirewall(rawFirewall);\n if (firewall !== null) {\n firewalls.push(firewall);\n }\n }\n return firewalls;\n}\n\nfunction compilePermissionSet(rawValue: unknown): {\n readonly values: ReadonlySet<string>;\n readonly malformed: boolean;\n} {\n if (rawValue === undefined || rawValue === null) {\n return { values: new Set<string>(), malformed: false };\n }\n if (\n !Array.isArray(rawValue) ||\n rawValue.some((item) => {\n return typeof item !== \"string\";\n })\n ) {\n return { values: new Set<string>(), malformed: true };\n }\n return { values: new Set(rawValue), malformed: false };\n}\n\nfunction compileNetworkPolicies(\n rawNetworkPolicies: unknown,\n): CompiledNetworkPolicies {\n if (rawNetworkPolicies === undefined || rawNetworkPolicies === null) {\n return { policies: new Map(), topLevelMalformed: false };\n }\n if (!isObjectRecord(rawNetworkPolicies)) {\n return { policies: new Map(), topLevelMalformed: true };\n }\n\n const policies = new Map<string, CompiledNetworkPolicy>();\n for (const [firewallName, grant] of Object.entries(rawNetworkPolicies)) {\n if (!isObjectRecord(grant)) {\n policies.set(firewallName, {\n blockedPermissions: new Set<string>(),\n unknownPolicy: \"allow\",\n permissionMalformed: true,\n unknownPolicyMalformed: false,\n });\n continue;\n }\n\n const allow = compilePermissionSet(grant.allow);\n const deny = compilePermissionSet(grant.deny);\n const ask = compilePermissionSet(grant.ask);\n const blockedPermissions = new Set<string>([...deny.values, ...ask.values]);\n\n let unknownPolicy: UnknownPolicy = \"allow\";\n let unknownPolicyMalformed = false;\n const rawUnknownPolicy = grant.unknownPolicy;\n if (\n rawUnknownPolicy === \"allow\" ||\n rawUnknownPolicy === \"deny\" ||\n rawUnknownPolicy === \"ask\"\n ) {\n unknownPolicy = rawUnknownPolicy;\n } else if (rawUnknownPolicy !== undefined && rawUnknownPolicy !== null) {\n unknownPolicyMalformed = true;\n }\n\n policies.set(firewallName, {\n blockedPermissions,\n unknownPolicy,\n permissionMalformed: allow.malformed || deny.malformed || ask.malformed,\n unknownPolicyMalformed,\n });\n }\n\n return { policies, topLevelMalformed: false };\n}\n\nfunction getApiPermissionRuleSetsForMatch(\n api: FirewallConfig[\"apis\"][number],\n serviceName: string,\n apiBase: string | null,\n): PermissionRuleSet[] | null {\n if (!isValidApiEntry(api, serviceName)) return null;\n if (apiBase !== null && stripTrailingSlash(api.base) !== apiBase) return null;\n if (api.permissions === undefined) return null;\n if (!Array.isArray(api.permissions)) return null;\n\n const permissionRuleSets: PermissionRuleSet[] = [];\n const seenPermissionNames = new Set<string>();\n for (const rawPermission of api.permissions) {\n const permissionName = getPermissionName(rawPermission);\n if (permissionName === null) continue;\n if (seenPermissionNames.has(permissionName)) continue;\n seenPermissionNames.add(permissionName);\n permissionRuleSets.push({\n name: permissionName,\n rules: getPermissionRules(rawPermission),\n });\n }\n return permissionRuleSets;\n}\n\nfunction recordPermissionMatch(\n state: ApiMatchState,\n permission: string,\n specificity: PathSpecificity,\n): void {\n if (\n state.bestSpecificity === null ||\n comparePathSpecificity(specificity, state.bestSpecificity) > 0\n ) {\n state.bestSpecificity = specificity;\n state.matched.length = 0;\n }\n if (\n comparePathSpecificity(specificity, state.bestSpecificity) === 0 &&\n !state.matched.includes(permission)\n ) {\n state.matched.push(permission);\n }\n}\n\nfunction relativePathFromSegments(\n segments: string[],\n consumed: number,\n): string {\n const rest = segments.slice(consumed).join(\"/\");\n return rest === \"\" ? \"/\" : `/${rest}`;\n}\n\nfunction stripUrlQueryAndFragment(url: string): string {\n const queryIndex = url.indexOf(\"?\");\n const fragmentIndex = url.indexOf(\"#\");\n let end = url.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (fragmentIndex !== -1) end = Math.min(end, fragmentIndex);\n return url.slice(0, end);\n}\n\nfunction rawUrlAuthorityBounds(url: string): {\n readonly authorityStart: number;\n readonly authorityEnd: number;\n} | null {\n const schemeEnd = url.indexOf(\"://\");\n if (schemeEnd === -1) return null;\n\n const authorityStart = schemeEnd + 3;\n let authorityEnd = url.length;\n for (const delimiter of [\"/\", \"?\", \"#\"]) {\n const delimiterIndex = url.indexOf(delimiter, authorityStart);\n if (delimiterIndex !== -1)\n authorityEnd = Math.min(authorityEnd, delimiterIndex);\n }\n\n return { authorityStart, authorityEnd };\n}\n\nfunction replaceRawUrlAuthority(\n url: string,\n bounds: { readonly authorityStart: number; readonly authorityEnd: number },\n authority: string,\n): string {\n return `${url.slice(0, bounds.authorityStart)}${authority}${url.slice(bounds.authorityEnd)}`;\n}\n\nfunction stripRawUrlUserinfo(url: string): string {\n const bounds = rawUrlAuthorityBounds(url);\n if (bounds === null) return url;\n\n const authority = url.slice(bounds.authorityStart, bounds.authorityEnd);\n const userinfoEnd = authority.lastIndexOf(\"@\");\n if (userinfoEnd === -1) return url;\n\n return replaceRawUrlAuthority(url, bounds, authority.slice(userinfoEnd + 1));\n}\n\nfunction rawAuthorityPortIsMalformed(port: string): boolean {\n if (port === \"\") return true;\n if (\n ![...port].every((char) => {\n return char >= \"0\" && char <= \"9\";\n })\n ) {\n return true;\n }\n return Number(port) > 65535;\n}\n\nfunction stripRawUrlMalformedPort(url: string): string {\n const bounds = rawUrlAuthorityBounds(url);\n if (bounds === null) return url;\n\n const authority = url.slice(bounds.authorityStart, bounds.authorityEnd);\n if (authority.startsWith(\"[\")) {\n const closeBracketIndex = authority.indexOf(\"]\");\n if (closeBracketIndex === -1) return url;\n const portPrefix = authority.slice(closeBracketIndex + 1);\n if (!portPrefix.startsWith(\":\")) return url;\n if (!rawAuthorityPortIsMalformed(portPrefix.slice(1))) return url;\n return replaceRawUrlAuthority(\n url,\n bounds,\n authority.slice(0, closeBracketIndex + 1),\n );\n }\n\n const portSeparator = authority.lastIndexOf(\":\");\n if (portSeparator === -1) return url;\n if (authority.indexOf(\":\") !== portSeparator) return url;\n if (!rawAuthorityPortIsMalformed(authority.slice(portSeparator + 1))) {\n return url;\n }\n return replaceRawUrlAuthority(url, bounds, authority.slice(0, portSeparator));\n}\n\nfunction rawBaseForDecisionMatch(rawBase: string): string | null {\n if (stripUrlQueryAndFragment(rawBase).includes(\"\\\\\")) return null;\n return stripRawUrlMalformedPort(stripRawUrlUserinfo(rawBase));\n}\n\nfunction rawPathFromUrl(url: string): string {\n const urlWithoutQuery = stripUrlQueryAndFragment(url);\n const schemeEnd = urlWithoutQuery.indexOf(\"://\");\n const authorityStart = schemeEnd === -1 ? 0 : schemeEnd + 3;\n const pathStart = urlWithoutQuery.indexOf(\"/\", authorityStart);\n return pathStart === -1 ? \"/\" : urlWithoutQuery.slice(pathStart);\n}\n\nfunction rawBasePathFromUrl(url: string): string {\n const urlWithoutQuery = stripUrlQueryAndFragment(url);\n const schemeEnd = urlWithoutQuery.indexOf(\"://\");\n const authorityStart = schemeEnd === -1 ? 0 : schemeEnd + 3;\n const pathStart = urlWithoutQuery.indexOf(\"/\", authorityStart);\n return pathStart === -1 ? \"\" : urlWithoutQuery.slice(pathStart);\n}\n\nfunction rawAuthorityFromUrl(url: string): string | null {\n const urlWithoutQuery = stripUrlQueryAndFragment(url);\n const schemeEnd = urlWithoutQuery.indexOf(\"://\");\n if (schemeEnd === -1) return null;\n const authorityStart = schemeEnd + 3;\n const pathStart = urlWithoutQuery.indexOf(\"/\", authorityStart);\n const authority =\n pathStart === -1\n ? urlWithoutQuery.slice(authorityStart)\n : urlWithoutQuery.slice(authorityStart, pathStart);\n return authority === \"\" ? null : authority;\n}\n\nfunction hasNonAscii(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n if (value.charCodeAt(index) > 0x7f) return true;\n }\n return false;\n}\n\nfunction rawHostFromAuthority(authority: string): string {\n const withoutUserinfo = authority.slice(authority.lastIndexOf(\"@\") + 1);\n if (withoutUserinfo.startsWith(\"[\")) {\n const closeBracket = withoutUserinfo.indexOf(\"]\");\n return closeBracket === -1\n ? withoutUserinfo\n : withoutUserinfo.slice(0, closeBracket + 1);\n }\n const portSeparator = withoutUserinfo.lastIndexOf(\":\");\n return portSeparator === -1\n ? withoutUserinfo\n : withoutUserinfo.slice(0, portSeparator);\n}\n\nfunction authorityHasEmptyPort(authority: string): boolean {\n const withoutUserinfo = authority.slice(authority.lastIndexOf(\"@\") + 1);\n if (withoutUserinfo.startsWith(\"[\")) {\n const closeBracket = withoutUserinfo.indexOf(\"]\");\n if (closeBracket === -1) return false;\n return withoutUserinfo.slice(closeBracket + 1) === \":\";\n }\n\n const portSeparator = withoutUserinfo.lastIndexOf(\":\");\n if (portSeparator === -1) return false;\n return (\n withoutUserinfo.indexOf(\":\") === portSeparator &&\n portSeparator === withoutUserinfo.length - 1\n );\n}\n\nfunction rawAuthorityHostStartsWithDigit(authority: string): boolean {\n const firstChar = rawHostFromAuthority(authority)[0];\n return firstChar !== undefined && firstChar >= \"0\" && firstChar <= \"9\";\n}\n\nfunction runtimeAuthorityOriginForHostValidation(url: string): string | null {\n const authority = rawAuthorityFromUrl(url);\n if (authority === null) return null;\n if (\n !authority.includes(\"%\") &&\n !hasNonAscii(authority) &&\n !rawAuthorityHostStartsWithDigit(authority)\n ) {\n return null;\n }\n\n const schemeEnd = url.indexOf(\"://\");\n if (schemeEnd === -1) return null;\n return `${url.slice(0, schemeEnd)}://${authority}`;\n}\n\nfunction hasPercentEncodedAuthoritySyntax(value: string): boolean {\n let index = value.indexOf(\"%\");\n while (index !== -1) {\n let runEnd = index;\n while (runEnd < value.length && value[runEnd] === \"%\") {\n const firstHexDigit = value[runEnd + 1];\n const secondHexDigit = value[runEnd + 2];\n if (\n !firstHexDigit ||\n !secondHexDigit ||\n !HEX_DIGITS.has(firstHexDigit) ||\n !HEX_DIGITS.has(secondHexDigit)\n ) {\n return true;\n }\n runEnd += PERCENT_ESCAPE_LENGTH;\n }\n\n let decodedRun: string;\n try {\n decodedRun = decodeURIComponent(value.slice(index, runEnd));\n } catch {\n return true;\n }\n for (const char of decodedRun) {\n if (PERCENT_DECODED_AUTHORITY_SYNTAX_CHARS.has(char)) {\n return true;\n }\n }\n index = value.indexOf(\"%\", runEnd);\n }\n return false;\n}\n\nfunction hasMalformedRuntimeAuthoritySyntax(url: string): boolean {\n const authority = rawAuthorityFromUrl(url);\n if (authority === null) return false;\n return (\n authority.includes(\"\\\\\") ||\n authorityHasEmptyPort(authority) ||\n hasPercentEncodedAuthoritySyntax(authority)\n );\n}\n\nfunction scoreLiteralSegment(segment: string): number {\n return LITERAL_SEGMENT_SCORE + codePointLength(segment);\n}\n\nfunction scoreParsedPatternSegment(parsed: MatchableSegment): number {\n if (parsed.kind === \"literal\") {\n return scoreLiteralSegment(parsed.value);\n }\n\n const literalChars =\n codePointLength(parsed.prefix) + codePointLength(parsed.suffix);\n if (parsed.prefix !== \"\" || parsed.suffix !== \"\") {\n return MIXED_PARAM_SEGMENT_SCORE + literalChars;\n }\n if (parsed.greedy === \"+\") return PLUS_GREEDY_SEGMENT_SCORE;\n if (parsed.greedy === \"*\") return 0;\n return PLAIN_PARAM_SEGMENT_SCORE;\n}\n\nfunction scoreStaticSegments(segments: string[]): number {\n return segments.reduce((score, segment) => {\n return score + scoreLiteralSegment(segment);\n }, 0);\n}\n\nfunction scorePatternSegmentsWithParser(\n segments: string[],\n parsePatternSegment: SegmentMatchParser,\n): number {\n const lastPatternIndex = segments.length - 1;\n let score = 0;\n for (let index = 0; index < segments.length; index += 1) {\n const segment = segments[index]!;\n const parsed = parsePatternSegment(segment, index, lastPatternIndex);\n if (parsed !== null) {\n score += scoreParsedPatternSegment(parsed);\n }\n }\n return score;\n}\n\nfunction scorePathPattern(\n path: string,\n parsePatternSegment: SegmentMatchParser | null,\n): number {\n if (path === \"\") return 0;\n if (path === \"/\") return ROOT_PATH_SCORE;\n const segments = splitPathSegments(path);\n return parsePatternSegment === null\n ? scoreStaticSegments(segments)\n : scorePatternSegmentsWithParser(segments, parsePatternSegment);\n}\n\nfunction splitAuthoritySegments(authority: string): string[] {\n if (authority.startsWith(\"[\")) return [authority];\n const normalized = authority.endsWith(\".\")\n ? authority.slice(0, -1)\n : authority;\n return normalized === \"\" ? [] : normalized.split(\".\");\n}\n\nfunction baseUrlSpecificityScore({\n authority,\n path,\n hasParams,\n tolerateMalformedBaseParams = false,\n}: {\n readonly authority: string;\n readonly path: string;\n readonly hasParams: boolean;\n readonly tolerateMalformedBaseParams?: boolean;\n}): number {\n const patternParser = hasParams\n ? tolerateMalformedBaseParams\n ? parseMalformedTolerantBaseSegment\n : parseStrictMatchSegment\n : null;\n const authoritySegments = splitAuthoritySegments(authority);\n const authorityScore =\n patternParser === null\n ? scoreStaticSegments(authoritySegments)\n : scorePatternSegmentsWithParser(\n [...authoritySegments].reverse(),\n patternParser,\n );\n const pathScore = scorePathPattern(path, patternParser);\n return (\n pathScore * PATH_SCORE_MULTIPLIER +\n authorityScore * AUTHORITY_SCORE_MULTIPLIER +\n (hasParams ? 0 : STATIC_BASE_SCORE_BONUS)\n );\n}\n\nfunction matchStaticBasePathPrefix(\n path: string,\n pattern: string,\n): string | null {\n if (pattern === \"\") {\n return path === \"\" ? \"/\" : path;\n }\n if (pattern === \"/\") {\n if (!path.startsWith(pattern)) return null;\n const relativePath = path.slice(pattern.length);\n if (relativePath !== \"\" && !relativePath.startsWith(\"/\")) return null;\n return relativePath === \"\" ? \"/\" : relativePath;\n }\n if (!path.startsWith(pattern)) return null;\n const relativePath = path.slice(pattern.length);\n if (relativePath !== \"\" && !relativePath.startsWith(\"/\")) return null;\n return relativePath === \"\" ? \"/\" : relativePath;\n}\n\nfunction normalizeUrlHostname(\n hostname: string,\n options: { allowHostParams?: boolean } = {},\n): string | null {\n let normalized = hostname.toLowerCase();\n if (normalized.endsWith(\".\")) {\n normalized = normalized.slice(0, -1);\n if (normalized === \"\" || normalized.endsWith(\".\")) {\n return null;\n }\n }\n if (\n normalized.split(\".\").some((label) => {\n return label === \"\";\n })\n ) {\n return null;\n }\n const forbiddenChars =\n options.allowHostParams === true\n ? FORBIDDEN_BASE_PATTERN_HOST_CHARS\n : FORBIDDEN_RUNTIME_HOST_CHARS;\n if (\n !normalized.startsWith(\"[\") &&\n [...normalized].some((char) => {\n return forbiddenChars.has(char);\n })\n ) {\n return null;\n }\n return normalized;\n}\n\nfunction normalizedUrlAuthority(\n parsed: URL,\n options: { allowHostParams?: boolean } = {},\n): string | null {\n if (parsed.username !== \"\" || parsed.password !== \"\") {\n return null;\n }\n\n const hostname = normalizeUrlHostname(parsed.hostname, options);\n if (hostname === null || hostname === \"\") {\n return null;\n }\n\n return parsed.port === \"\" ? hostname : `${hostname}:${parsed.port}`;\n}\n\nfunction matchStaticFirewallBaseUrl(\n url: string,\n rawBase: string,\n options: {\n readonly tolerateMalformedBaseParams?: boolean;\n } = {},\n): FirewallBaseUrlMatch | null {\n const parsedUrl = new URL(url);\n const parsedBase = new URL(rawBase);\n if (parsedUrl.protocol.toLowerCase() !== parsedBase.protocol.toLowerCase()) {\n return null;\n }\n const baseHasParams = hasBaseUrlParams(rawBase);\n const baseForMatch = stripTrailingSlash(rawBase);\n\n const urlAuthority = normalizedUrlAuthority(parsedUrl);\n const baseAuthority = normalizedUrlAuthority(parsedBase, {\n allowHostParams: baseHasParams,\n });\n if (urlAuthority === null || baseAuthority === null) return null;\n if (baseHasParams) {\n const hostParams =\n options.tolerateMalformedBaseParams === true\n ? matchFirewallHostForMalformedBaseDecision(urlAuthority, baseAuthority)\n : matchFirewallHost(urlAuthority, baseAuthority);\n if (hostParams === null) return null;\n } else if (urlAuthority !== baseAuthority) {\n return null;\n }\n\n const basePath = rawBasePathFromUrl(baseForMatch);\n const relativePath = baseHasParams\n ? options.tolerateMalformedBaseParams === true\n ? matchFirewallPathPrefixForMalformedBaseDecision(\n rawPathFromUrl(url),\n basePath,\n )\n : matchFirewallPathPrefix(rawPathFromUrl(url), basePath)\n : matchStaticBasePathPrefix(rawPathFromUrl(url), basePath);\n if (relativePath === null) return null;\n\n const displayBase = stripTrailingSlash(rawBase);\n return {\n displayBase,\n relativePath,\n score: baseUrlSpecificityScore({\n authority: baseAuthority,\n path: basePath,\n hasParams: baseHasParams,\n tolerateMalformedBaseParams: options.tolerateMalformedBaseParams === true,\n }),\n };\n}\n\nfunction runtimeUrlCanMatchFirewallBase(url: string): boolean {\n if (\n hasUnsafeUrlCodepoint(url) ||\n hasRawWhitespace(url) ||\n !url.includes(\"://\") ||\n hasMalformedRuntimeAuthoritySyntax(url)\n ) {\n return false;\n }\n\n const runtimeAuthorityOrigin = runtimeAuthorityOriginForHostValidation(url);\n if (runtimeAuthorityOrigin === null) return true;\n\n try {\n validateBaseUrl(runtimeAuthorityOrigin, \"runtime\");\n return true;\n } catch {\n return false;\n }\n}\n\nfunction matchFirewallBaseUrlForDecision(\n url: string,\n rawBase: string,\n): FirewallBaseUrlMatch | null {\n if (!runtimeUrlCanMatchFirewallBase(url)) return null;\n const baseForMatch = rawBaseForDecisionMatch(rawBase);\n if (baseForMatch === null) return null;\n\n try {\n const match = matchStaticFirewallBaseUrl(url, baseForMatch, {\n tolerateMalformedBaseParams: true,\n });\n if (match === null) return null;\n return { ...match, displayBase: stripTrailingSlash(rawBase) };\n } catch {\n return null;\n }\n}\n\nfunction createDecisionState(): FirewallDecisionState {\n return {\n bestBaseScore: null,\n bestRuleSpecificity: null,\n baseMatch: null,\n allowedMatch: null,\n deniedMatch: null,\n deniedPermissionNames: [],\n malformedConfigMatch: null,\n malformedPolicyMatch: null,\n };\n}\n\nfunction acceptDecisionBaseMatch(\n state: FirewallDecisionState,\n match: DecisionBaseMatch,\n score: number,\n): boolean {\n if (state.bestBaseScore === null || score > state.bestBaseScore) {\n state.bestBaseScore = score;\n state.bestRuleSpecificity = null;\n state.baseMatch = null;\n state.allowedMatch = null;\n state.deniedMatch = null;\n state.deniedPermissionNames = [];\n state.malformedConfigMatch = null;\n state.malformedPolicyMatch = null;\n } else if (score < state.bestBaseScore) {\n return false;\n }\n\n state.baseMatch ??= match;\n return true;\n}\n\nfunction canRuleSpecificityAffectDecision(\n state: FirewallDecisionState,\n specificity: PathSpecificity,\n): boolean {\n if (state.bestRuleSpecificity === null) return true;\n const comparison = comparePathSpecificity(\n specificity,\n state.bestRuleSpecificity,\n );\n if (comparison > 0) return true;\n if (comparison < 0) return false;\n return state.allowedMatch === null;\n}\n\nfunction acceptRuleSpecificity(\n state: FirewallDecisionState,\n specificity: PathSpecificity,\n): boolean {\n if (state.bestRuleSpecificity === null) {\n state.bestRuleSpecificity = specificity;\n return true;\n }\n\n const comparison = comparePathSpecificity(\n specificity,\n state.bestRuleSpecificity,\n );\n if (comparison > 0) {\n state.bestRuleSpecificity = specificity;\n state.allowedMatch = null;\n state.deniedMatch = null;\n state.deniedPermissionNames = [];\n return true;\n }\n return comparison === 0;\n}\n\nfunction recordDeniedRule(\n state: FirewallDecisionState,\n match: DecisionBlockMatch,\n permission: string,\n): void {\n if (!state.deniedPermissionNames.includes(permission)) {\n state.deniedPermissionNames.push(permission);\n }\n state.deniedMatch ??= match;\n}\n\nfunction resolveFirewallDecision(\n state: FirewallDecisionState,\n networkPolicies: CompiledNetworkPolicies,\n): FirewallRequestDecision {\n const baseMatch = state.baseMatch;\n if (baseMatch === null) {\n return { kind: \"no_match\" };\n }\n\n if (state.allowedMatch !== null) {\n return {\n kind: \"allow\",\n firewallName: state.allowedMatch.firewallName,\n base: state.allowedMatch.base,\n relativePath: state.allowedMatch.relativePath,\n permission: state.allowedMatch.permission,\n rule: state.allowedMatch.rule,\n };\n }\n\n if (state.deniedMatch !== null) {\n return {\n kind: \"block\",\n firewallName: state.deniedMatch.firewallName,\n base: state.deniedMatch.base,\n relativePath: state.deniedMatch.relativePath,\n reason: \"permission_denied\",\n permissions: state.deniedPermissionNames,\n };\n }\n\n if (state.malformedPolicyMatch !== null) {\n return {\n kind: \"block\",\n firewallName: state.malformedPolicyMatch.firewallName,\n base: state.malformedPolicyMatch.base,\n relativePath: state.malformedPolicyMatch.relativePath,\n reason: \"malformed_network_policy\",\n permissions: [],\n };\n }\n\n if (state.malformedConfigMatch !== null) {\n return {\n kind: \"block\",\n firewallName: state.malformedConfigMatch.firewallName,\n base: state.malformedConfigMatch.base,\n relativePath: state.malformedConfigMatch.relativePath,\n reason: \"malformed_firewall_config\",\n permissions: [],\n };\n }\n\n const policy = networkPolicies.policies.get(baseMatch.firewallName);\n if (policy === undefined) {\n return {\n kind: \"allow\",\n firewallName: baseMatch.firewallName,\n base: baseMatch.allowBase,\n relativePath: baseMatch.relativePath,\n };\n }\n if (policy.unknownPolicyMalformed) {\n return {\n kind: \"block\",\n firewallName: baseMatch.firewallName,\n base: baseMatch.base,\n relativePath: baseMatch.relativePath,\n reason: \"malformed_network_policy\",\n permissions: [],\n };\n }\n if (policy.unknownPolicy === \"allow\") {\n return {\n kind: \"allow\",\n firewallName: baseMatch.firewallName,\n base: baseMatch.allowBase,\n relativePath: baseMatch.relativePath,\n };\n }\n\n return {\n kind: \"block\",\n firewallName: baseMatch.firewallName,\n base: baseMatch.base,\n relativePath: baseMatch.relativePath,\n reason: \"unknown_endpoint\",\n permissions: [],\n };\n}\n\nfunction unsafePathBlockDecision(\n firewall: DecisionFirewall,\n baseMatch: FirewallBaseUrlMatch,\n): FirewallRequestDecision {\n return {\n kind: \"block\",\n firewallName: firewall.name,\n base: baseMatch.displayBase,\n relativePath: baseMatch.relativePath,\n reason: \"unsafe_path\",\n permissions: [],\n };\n}\n\nfunction recordMalformedDecisionState(\n state: FirewallDecisionState,\n api: DecisionApi,\n blockMatch: DecisionBlockMatch,\n): void {\n if (api.baseMalformed || api.authMalformed || api.hasMalformedRules) {\n state.malformedConfigMatch ??= blockMatch;\n }\n}\n\nfunction apiCannotEvaluateRules(\n firewall: DecisionFirewall,\n api: DecisionApi,\n): boolean {\n return firewall.nameMalformed || api.baseMalformed || api.authMalformed;\n}\n\nfunction policyCannotEvaluateRules(\n networkPolicies: CompiledNetworkPolicies,\n policy: CompiledNetworkPolicy | undefined,\n): boolean {\n return (\n networkPolicies.topLevelMalformed ||\n (policy !== undefined && policy.permissionMalformed)\n );\n}\n\nfunction evaluateDecisionRule({\n state,\n rule,\n policy,\n blockMatch,\n baseMatch,\n upperMethod,\n}: {\n readonly state: FirewallDecisionState;\n readonly rule: DecisionRule;\n readonly policy: CompiledNetworkPolicy | undefined;\n readonly blockMatch: DecisionBlockMatch;\n readonly baseMatch: DecisionBaseMatch;\n readonly upperMethod: string;\n}): void {\n if (rule.method !== \"ANY\" && rule.method !== upperMethod) return;\n if (!canRuleSpecificityAffectDecision(state, rule.specificity)) return;\n\n const permissionBlocked =\n policy !== undefined && policy.blockedPermissions.has(rule.permission);\n if (matchFirewallPath(baseMatch.relativePath, rule.path) === null) return;\n if (!acceptRuleSpecificity(state, rule.specificity)) return;\n\n if (permissionBlocked) {\n recordDeniedRule(state, blockMatch, rule.permission);\n return;\n }\n\n state.allowedMatch ??= {\n firewallName: baseMatch.firewallName,\n base: baseMatch.allowBase,\n relativePath: baseMatch.relativePath,\n permission: rule.permission,\n rule: rule.raw,\n };\n}\n\nfunction evaluateDecisionRules({\n state,\n api,\n policy,\n blockMatch,\n baseMatch,\n upperMethod,\n}: {\n readonly state: FirewallDecisionState;\n readonly api: DecisionApi;\n readonly policy: CompiledNetworkPolicy | undefined;\n readonly blockMatch: DecisionBlockMatch;\n readonly baseMatch: DecisionBaseMatch;\n readonly upperMethod: string;\n}): void {\n for (const rule of api.rules) {\n evaluateDecisionRule({\n state,\n rule,\n policy,\n blockMatch,\n baseMatch,\n upperMethod,\n });\n }\n}\n\nfunction evaluateDecisionApi({\n state,\n firewall,\n api,\n url,\n unsafePath,\n networkPolicies,\n upperMethod,\n}: {\n readonly state: FirewallDecisionState;\n readonly firewall: DecisionFirewall;\n readonly api: DecisionApi;\n readonly url: string;\n readonly unsafePath: boolean;\n readonly networkPolicies: CompiledNetworkPolicies;\n readonly upperMethod: string;\n}): FirewallRequestDecision | null {\n const policy = networkPolicies.policies.get(firewall.name);\n const baseMatch = matchFirewallBaseUrlForDecision(url, api.rawBase);\n if (baseMatch === null) return null;\n if (unsafePath) return unsafePathBlockDecision(firewall, baseMatch);\n\n const decisionBaseMatch: DecisionBaseMatch = {\n firewallName: firewall.name,\n base: baseMatch.displayBase,\n allowBase: api.rawBase,\n relativePath: baseMatch.relativePath,\n };\n const blockMatch: DecisionBlockMatch = {\n firewallName: decisionBaseMatch.firewallName,\n base: decisionBaseMatch.base,\n relativePath: decisionBaseMatch.relativePath,\n };\n if (!acceptDecisionBaseMatch(state, decisionBaseMatch, baseMatch.score)) {\n return null;\n }\n\n recordMalformedDecisionState(state, api, blockMatch);\n if (apiCannotEvaluateRules(firewall, api)) return null;\n if (policyCannotEvaluateRules(networkPolicies, policy)) {\n state.malformedPolicyMatch ??= blockMatch;\n return null;\n }\n\n evaluateDecisionRules({\n state,\n api,\n policy,\n blockMatch,\n baseMatch: decisionBaseMatch,\n upperMethod,\n });\n return null;\n}\n\nexport function matchFirewallBaseUrl(\n url: string,\n rawBase: string,\n): FirewallBaseUrlMatch | null {\n if (\n hasUnsafeRuntimeUrlSyntax(url) ||\n hasMalformedRuntimeAuthoritySyntax(url)\n ) {\n return null;\n }\n\n const runtimeAuthorityOrigin = runtimeAuthorityOriginForHostValidation(url);\n\n try {\n if (runtimeAuthorityOrigin !== null) {\n validateBaseUrl(runtimeAuthorityOrigin, \"runtime\");\n }\n validateBaseUrl(rawBase, \"firewall\");\n return matchStaticFirewallBaseUrl(url, rawBase);\n } catch {\n return null;\n }\n}\n\nexport function matchFirewallRequestDecision(\n firewalls: unknown,\n method: string,\n url: string,\n networkPolicies: unknown = undefined,\n): FirewallRequestDecision {\n const decisionFirewalls = compileDecisionFirewalls(firewalls);\n if (decisionFirewalls.length === 0) return { kind: \"no_match\" };\n\n const compiledNetworkPolicies = compileNetworkPolicies(networkPolicies);\n const upperMethod = method.toUpperCase();\n const state = createDecisionState();\n const unsafePath =\n url.includes(\"\\\\\") || hasUnsafeFirewallPath(rawPathFromUrl(url));\n\n for (const firewall of decisionFirewalls) {\n for (const api of firewall.apis) {\n const immediateDecision = evaluateDecisionApi({\n state,\n firewall,\n api,\n url,\n unsafePath,\n networkPolicies: compiledNetworkPolicies,\n upperMethod,\n });\n if (immediateDecision !== null) {\n return immediateDecision;\n }\n }\n }\n\n return resolveFirewallDecision(state, compiledNetworkPolicies);\n}\n\nfunction matchFirewallHostWithParser(\n host: string,\n pattern: string,\n parsePatternSegment: SegmentMatchParser,\n): Record<string, string> | null {\n const hostSegsOrig = host.split(\".\");\n const hostSegsLower = hostSegsOrig.map((segment) => {\n return segment.toLowerCase();\n });\n const patternSegs = pattern.split(\".\").reverse();\n\n hostSegsOrig.reverse();\n hostSegsLower.reverse();\n\n const params: Record<string, string> = {};\n let hi = 0;\n const lastPatternIndex = patternSegs.length - 1;\n\n for (\n let patternIndex = 0;\n patternIndex < patternSegs.length;\n patternIndex++\n ) {\n const seg = patternSegs[patternIndex]!;\n const parsed = parsePatternSegment(seg, patternIndex, lastPatternIndex);\n if (parsed === null) return null;\n if (parsed.kind === \"literal\") {\n if (\n hi >= hostSegsLower.length ||\n hostSegsLower[hi] !== parsed.value.toLowerCase()\n ) {\n return null;\n }\n hi += 1;\n continue;\n }\n\n const { name, prefix, suffix, greedy } = parsed;\n if (greedy === \"+\") {\n if (hi >= hostSegsOrig.length) return null;\n params[name] = hostSegsOrig.slice(hi).reverse().join(\".\");\n return params;\n }\n if (greedy === \"*\") {\n params[name] = hostSegsOrig.slice(hi).reverse().join(\".\");\n return params;\n }\n if (hi >= hostSegsOrig.length) return null;\n if (prefix === \"\" && suffix === \"\") {\n params[name] = hostSegsLower[hi]!;\n } else {\n const captured = matchMixedSegment(\n hostSegsLower[hi]!,\n prefix.toLowerCase(),\n suffix.toLowerCase(),\n );\n if (captured === null) return null;\n params[name] = captured;\n }\n hi += 1;\n }\n\n return hi === hostSegsOrig.length ? params : null;\n}\n\n/**\n * Match a runtime host/authority against a firewall base host pattern.\n *\n * Host comparison is case-insensitive and mirrors the runner's right-to-left\n * host matcher. Non-default ports are part of the normalized authority and\n * therefore participate in the final host segment comparison.\n */\nexport function matchFirewallHost(\n host: string,\n pattern: string,\n): Record<string, string> | null {\n return matchFirewallHostWithParser(host, pattern, parseStrictMatchSegment);\n}\n\nfunction parseMalformedTolerantBaseSegment(\n segment: string,\n patternIndex: number,\n lastPatternIndex: number,\n): MatchableSegment {\n const parsed = parseSegment(segment);\n if (parsed.kind === \"error\") {\n return {\n kind: \"param\",\n prefix: \"\",\n name: `__malformed_base_segment_${patternIndex}`,\n suffix: \"\",\n greedy: \"\",\n };\n }\n if (\n parsed.kind === \"param\" &&\n parsed.greedy !== \"\" &&\n isInvalidGreedyParam(\n patternIndex,\n lastPatternIndex,\n parsed.prefix,\n parsed.suffix,\n )\n ) {\n return { ...parsed, greedy: \"\" };\n }\n return parsed;\n}\n\nfunction matchFirewallHostForMalformedBaseDecision(\n host: string,\n pattern: string,\n): Record<string, string> | null {\n return matchFirewallHostWithParser(\n host,\n pattern,\n parseMalformedTolerantBaseSegment,\n );\n}\n\nfunction matchFirewallPathPrefixWithParser(\n path: string,\n pattern: string,\n parsePatternSegment: SegmentMatchParser,\n): string | null {\n const pathSegs = splitPathSegments(path);\n const patternSegs = splitPathSegments(pattern);\n\n let pi = 0;\n const lastPatternIndex = patternSegs.length - 1;\n for (\n let patternIndex = 0;\n patternIndex < patternSegs.length;\n patternIndex++\n ) {\n const seg = patternSegs[patternIndex]!;\n const parsed = parsePatternSegment(seg, patternIndex, lastPatternIndex);\n if (parsed === null) return null;\n if (parsed.kind === \"literal\") {\n if (pi >= pathSegs.length || pathSegs[pi] !== parsed.value) return null;\n pi += 1;\n continue;\n }\n\n const { prefix, suffix, greedy } = parsed;\n if (greedy === \"+\") {\n if (pi >= pathSegs.length || !hasNonEmptySegment(pathSegs, pi)) {\n return null;\n }\n return \"/\";\n }\n if (greedy === \"*\") {\n return \"/\";\n }\n if (pi >= pathSegs.length) return null;\n\n const runtime = pathSegs[pi]!;\n if (prefix === \"\" && suffix === \"\") {\n if (runtime === \"\") return null;\n } else if (matchMixedSegment(runtime, prefix, suffix) === null) {\n return null;\n }\n pi += 1;\n }\n\n return relativePathFromSegments(pathSegs, pi);\n}\n\n/**\n * Match a runtime path against the beginning of a firewall base path pattern.\n *\n * Unlike matchFirewallPath(), this intentionally allows extra runtime path\n * segments and returns the remaining relative path after the base prefix.\n */\nexport function matchFirewallPathPrefix(\n path: string,\n pattern: string,\n): string | null {\n return matchFirewallPathPrefixWithParser(\n path,\n pattern,\n parseStrictMatchSegment,\n );\n}\n\nfunction matchFirewallPathPrefixForMalformedBaseDecision(\n path: string,\n pattern: string,\n): string | null {\n return matchFirewallPathPrefixWithParser(\n path,\n pattern,\n parseMalformedTolerantBaseSegment,\n );\n}\n\n/**\n * Match a URL path against a rule path pattern.\n *\n * Ported from the Python MITM addon's `match_path()` function\n * (crates/runner/mitm-addon/src/matching.py).\n *\n * - Literal segments must match exactly (case-sensitive).\n * - `{name}` matches a single non-empty path segment.\n * - `prefix{name}suffix` (mixed) matches a segment that starts with\n * `prefix` and ends with `suffix`, with a non-empty middle captured\n * into `name`.\n * - `{name+}` matches the rest of the path (one or more segments). Must be last.\n * - `{name*}` matches the rest of the path (zero or more segments). Must be last.\n *\n * Returns extracted parameters on match, or null on mismatch.\n */\nexport function matchFirewallPath(\n path: string,\n pattern: string,\n): Record<string, string> | null {\n const pathSegs = splitPathSegments(path);\n const patternSegs = splitPathSegments(pattern);\n\n const params: Record<string, string> = {};\n let pi = 0;\n const lastPatternIndex = patternSegs.length - 1;\n\n for (\n let patternIndex = 0;\n patternIndex < patternSegs.length;\n patternIndex++\n ) {\n const seg = patternSegs[patternIndex]!;\n const parsed = parseSegment(seg);\n // Invalid patterns are rejected by validateRule at ingest time, so\n // kind \"error\" should never appear here on validated inputs.\n if (parsed.kind === \"error\") return null;\n if (parsed.kind === \"literal\") {\n if (pi >= pathSegs.length || pathSegs[pi] !== parsed.value) return null;\n pi++;\n continue;\n }\n const { name, prefix, suffix, greedy } = parsed;\n if (greedy === \"+\") {\n if (isInvalidGreedyParam(patternIndex, lastPatternIndex, prefix, suffix))\n return null;\n if (pi >= pathSegs.length || !hasNonEmptySegment(pathSegs, pi)) {\n return null;\n }\n params[name] = pathSegs.slice(pi).join(\"/\");\n return params;\n }\n if (greedy === \"*\") {\n if (isInvalidGreedyParam(patternIndex, lastPatternIndex, prefix, suffix))\n return null;\n params[name] = pathSegs.slice(pi).join(\"/\");\n return params;\n }\n if (pi >= pathSegs.length) return null;\n const runtime = pathSegs[pi]!;\n if (prefix === \"\" && suffix === \"\") {\n if (runtime === \"\") return null;\n params[name] = runtime;\n } else {\n const captured = matchMixedSegment(runtime, prefix, suffix);\n if (captured === null) return null;\n params[name] = captured;\n }\n pi++;\n }\n\n // All pattern segments consumed; path must also be fully consumed\n if (pi !== pathSegs.length) return null;\n return params;\n}\n\n/**\n * Find permission names from a firewall config whose most-specific rules match\n * the given HTTP method and relative path.\n *\n * Method matching is case-insensitive. The special method `ANY` matches\n * any HTTP method. Path specificity mirrors the runner firewall matcher within\n * each API entry.\n */\nexport function findMatchingPermissions(\n method: string,\n path: string,\n config: unknown,\n options: FindMatchingPermissionsOptions = {},\n): string[] {\n if (!isObjectRecord(config)) return [];\n if (typeof config.name !== \"string\" || config.name === \"\") return [];\n if (!Array.isArray(config.apis)) return [];\n\n const apiBase =\n options.apiBase === undefined ? null : stripTrailingSlash(options.apiBase);\n const matchApis: PermissionMatchApi[] = [];\n\n for (const api of config.apis) {\n const permissionRuleSets = getApiPermissionRuleSetsForMatch(\n api,\n config.name,\n apiBase,\n );\n if (permissionRuleSets !== null) {\n matchApis.push({ permissionRuleSets });\n }\n }\n\n return findMatchingPermissionRuleSets(method, path, matchApis);\n}\n\nfunction findMatchingPermissionRuleSets(\n method: string,\n path: string,\n apis: readonly PermissionMatchApi[],\n): string[] {\n const upperMethod = method.toUpperCase();\n const matched: string[] = [];\n\n for (const api of apis) {\n const state: ApiMatchState = { bestSpecificity: null, matched: [] };\n\n for (const permission of api.permissionRuleSets) {\n for (const rule of permission.rules) {\n const rest = matchingRulePath(rule, upperMethod);\n if (rest === null) continue;\n\n if (matchFirewallPath(path, rest) !== null) {\n const specificity = pathSpecificity(rest);\n if (specificity === null) continue;\n recordPermissionMatch(state, permission.name, specificity);\n }\n }\n }\n\n for (const permission of state.matched) {\n if (!matched.includes(permission)) {\n matched.push(permission);\n }\n }\n }\n\n return matched;\n}\n"],"mappings":"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","names":["relativePath"]}
|