@vm0/cli 9.268.0 → 9.269.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/{agent-4QRFYL6Q.js → agent-VK7PFHFX.js} +11 -11
  2. package/agent-VK7PFHFX.js.map +1 -0
  3. package/{banking-VKKVWIYX.js → banking-GD4YJ7QA.js} +4 -4
  4. package/{browser-VFBMLIUS.js → browser-T44LR4CD.js} +4 -4
  5. package/{chat-KQRKGQKS.js → chat-GC5PXDMC.js} +5 -5
  6. package/{chunk-CZA5MW3N.js → chunk-3ZIEOU43.js} +15 -17
  7. package/chunk-3ZIEOU43.js.map +1 -0
  8. package/{chunk-TNDBFUFP.js → chunk-4WDDMKO6.js} +1 -6
  9. package/chunk-4WDDMKO6.js.map +1 -0
  10. package/{chunk-7I3P4REZ.js → chunk-5WCJ4YK2.js} +2 -2
  11. package/{chunk-VGPSGL5S.js → chunk-73DZG6Q7.js} +138 -57
  12. package/chunk-73DZG6Q7.js.map +1 -0
  13. package/{chunk-4JA54Z75.js → chunk-C6ZDYQZB.js} +2 -2
  14. package/{chunk-QSWNNYV4.js → chunk-HWHNQPKS.js} +92 -6
  15. package/chunk-HWHNQPKS.js.map +1 -0
  16. package/{chunk-C6KDTR5A.js → chunk-NGXH4WMD.js} +29 -29
  17. package/chunk-NGXH4WMD.js.map +1 -0
  18. package/chunk-PNFIYMDN.js +22 -0
  19. package/chunk-PNFIYMDN.js.map +1 -0
  20. package/{chunk-DTZW7RES.js → chunk-Q4PS674D.js} +2 -2
  21. package/{chunk-ISZ5CKJ3.js → chunk-X24DXUXC.js} +2 -2
  22. package/{computer-use-LTZEVHCS.js → computer-use-K56KV7VB.js} +4 -4
  23. package/{connector-MY7K7RJN.js → connector-QQWAHPS4.js} +46 -47
  24. package/connector-QQWAHPS4.js.map +1 -0
  25. package/{credit-LDEHJIJT.js → credit-ROARDLCA.js} +5 -5
  26. package/{developer-support-ROATSWMP.js → developer-support-UDMUZCE3.js} +4 -4
  27. package/{doctor-3P6KUY4D.js → doctor-RGYXFZHU.js} +5 -5
  28. package/{feishu-PHKR2Q36.js → feishu-OBNUWOA2.js} +4 -4
  29. package/{finance-3LM55SWD.js → finance-F6O6Y6PV.js} +4 -4
  30. package/{generate-23ZOL7AI.js → generate-MUXDMLOJ.js} +10 -10
  31. package/generate-MUXDMLOJ.js.map +1 -0
  32. package/{github-SC4AB2Q2.js → github-2C7AOKI4.js} +4 -4
  33. package/{goal-FTWV2ADK.js → goal-W3LM6XZV.js} +4 -4
  34. package/{host-L4BEXBPB.js → host-P7D2E62D.js} +4 -4
  35. package/{logs-TICCUASU.js → logs-BAHOQLAE.js} +6 -6
  36. package/{mail-ZUBVNRJW.js → mail-VKEHKTZI.js} +6 -6
  37. package/{maps-UAKTZSO2.js → maps-NZTI34NQ.js} +4 -4
  38. package/{model-3N3ZWLZM.js → model-IR6ZDEE2.js} +5 -5
  39. package/{model-provider-RI26N5OQ.js → model-provider-DFX4CPKT.js} +5 -5
  40. package/{org-IEYB2WBO.js → org-XVM6CZTT.js} +4 -4
  41. package/package.json +1 -1
  42. package/{people-search-5S4TV7RL.js → people-search-IV3H5OUA.js} +4 -4
  43. package/{phone-XV2LWGQT.js → phone-HUY6BIZX.js} +4 -4
  44. package/{preference-6XHDDQUW.js → preference-HMVK2L5M.js} +4 -4
  45. package/{resource-HXS7RGBP.js → resource-5UIGWAZD.js} +4 -4
  46. package/{scrape-NU6T5BQE.js → scrape-OYG3NWYJ.js} +4 -4
  47. package/{search-FDG26NWA.js → search-NRTKXEOM.js} +6 -6
  48. package/{secret-HN3R3V32.js → secret-3AIMSGWX.js} +4 -4
  49. package/{slack-IWEZU6HY.js → slack-SBHKIKCI.js} +4 -4
  50. package/{teams-6VZAWVC6.js → teams-Y7RWSTVP.js} +4 -4
  51. package/{telegram-UTCDO5ZB.js → telegram-MVCNV2KP.js} +4 -4
  52. package/{upgrade-EX2F7BFJ.js → upgrade-2SNSYI66.js} +3 -3
  53. package/{variable-U67PHCBZ.js → variable-ZUQ7J3X2.js} +4 -4
  54. package/{video-GTQQSN6W.js → video-TDGGCC4I.js} +3 -3
  55. package/{weather-NMEINAIZ.js → weather-CVL343M4.js} +4 -4
  56. package/{web-YC7E327U.js → web-M5AW34U4.js} +4 -4
  57. package/{web-search-TCWP5NDJ.js → web-search-C2BOORHI.js} +4 -4
  58. package/{whoami-KACAW67A.js → whoami-TWCA5HMI.js} +13 -13
  59. package/whoami-TWCA5HMI.js.map +1 -0
  60. package/{workflow-TKJF2YY2.js → workflow-QAMRYA5T.js} +99 -8
  61. package/workflow-QAMRYA5T.js.map +1 -0
  62. package/zero.js +43 -43
  63. package/agent-4QRFYL6Q.js.map +0 -1
  64. package/chunk-C6KDTR5A.js.map +0 -1
  65. package/chunk-CZA5MW3N.js.map +0 -1
  66. package/chunk-QSWNNYV4.js.map +0 -1
  67. package/chunk-TNDBFUFP.js.map +0 -1
  68. package/chunk-VGPSGL5S.js.map +0 -1
  69. package/chunk-ZL7WFWOC.js +0 -97
  70. package/chunk-ZL7WFWOC.js.map +0 -1
  71. package/connector-MY7K7RJN.js.map +0 -1
  72. package/generate-23ZOL7AI.js.map +0 -1
  73. package/whoami-KACAW67A.js.map +0 -1
  74. package/workflow-TKJF2YY2.js.map +0 -1
  75. /package/{banking-VKKVWIYX.js.map → banking-GD4YJ7QA.js.map} +0 -0
  76. /package/{browser-VFBMLIUS.js.map → browser-T44LR4CD.js.map} +0 -0
  77. /package/{chat-KQRKGQKS.js.map → chat-GC5PXDMC.js.map} +0 -0
  78. /package/{chunk-7I3P4REZ.js.map → chunk-5WCJ4YK2.js.map} +0 -0
  79. /package/{chunk-4JA54Z75.js.map → chunk-C6ZDYQZB.js.map} +0 -0
  80. /package/{chunk-DTZW7RES.js.map → chunk-Q4PS674D.js.map} +0 -0
  81. /package/{chunk-ISZ5CKJ3.js.map → chunk-X24DXUXC.js.map} +0 -0
  82. /package/{computer-use-LTZEVHCS.js.map → computer-use-K56KV7VB.js.map} +0 -0
  83. /package/{credit-LDEHJIJT.js.map → credit-ROARDLCA.js.map} +0 -0
  84. /package/{developer-support-ROATSWMP.js.map → developer-support-UDMUZCE3.js.map} +0 -0
  85. /package/{doctor-3P6KUY4D.js.map → doctor-RGYXFZHU.js.map} +0 -0
  86. /package/{feishu-PHKR2Q36.js.map → feishu-OBNUWOA2.js.map} +0 -0
  87. /package/{finance-3LM55SWD.js.map → finance-F6O6Y6PV.js.map} +0 -0
  88. /package/{github-SC4AB2Q2.js.map → github-2C7AOKI4.js.map} +0 -0
  89. /package/{goal-FTWV2ADK.js.map → goal-W3LM6XZV.js.map} +0 -0
  90. /package/{host-L4BEXBPB.js.map → host-P7D2E62D.js.map} +0 -0
  91. /package/{logs-TICCUASU.js.map → logs-BAHOQLAE.js.map} +0 -0
  92. /package/{mail-ZUBVNRJW.js.map → mail-VKEHKTZI.js.map} +0 -0
  93. /package/{maps-UAKTZSO2.js.map → maps-NZTI34NQ.js.map} +0 -0
  94. /package/{model-3N3ZWLZM.js.map → model-IR6ZDEE2.js.map} +0 -0
  95. /package/{model-provider-RI26N5OQ.js.map → model-provider-DFX4CPKT.js.map} +0 -0
  96. /package/{org-IEYB2WBO.js.map → org-XVM6CZTT.js.map} +0 -0
  97. /package/{people-search-5S4TV7RL.js.map → people-search-IV3H5OUA.js.map} +0 -0
  98. /package/{phone-XV2LWGQT.js.map → phone-HUY6BIZX.js.map} +0 -0
  99. /package/{preference-6XHDDQUW.js.map → preference-HMVK2L5M.js.map} +0 -0
  100. /package/{resource-HXS7RGBP.js.map → resource-5UIGWAZD.js.map} +0 -0
  101. /package/{scrape-NU6T5BQE.js.map → scrape-OYG3NWYJ.js.map} +0 -0
  102. /package/{search-FDG26NWA.js.map → search-NRTKXEOM.js.map} +0 -0
  103. /package/{secret-HN3R3V32.js.map → secret-3AIMSGWX.js.map} +0 -0
  104. /package/{slack-IWEZU6HY.js.map → slack-SBHKIKCI.js.map} +0 -0
  105. /package/{teams-6VZAWVC6.js.map → teams-Y7RWSTVP.js.map} +0 -0
  106. /package/{telegram-UTCDO5ZB.js.map → telegram-MVCNV2KP.js.map} +0 -0
  107. /package/{upgrade-EX2F7BFJ.js.map → upgrade-2SNSYI66.js.map} +0 -0
  108. /package/{variable-U67PHCBZ.js.map → variable-ZUQ7J3X2.js.map} +0 -0
  109. /package/{video-GTQQSN6W.js.map → video-TDGGCC4I.js.map} +0 -0
  110. /package/{weather-NMEINAIZ.js.map → weather-CVL343M4.js.map} +0 -0
  111. /package/{web-YC7E327U.js.map → web-M5AW34U4.js.map} +0 -0
  112. /package/{web-search-TCWP5NDJ.js.map → web-search-C2BOORHI.js.map} +0 -0
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  MODEL_PROVIDER_TYPES
6
- } from "./chunk-DTZW7RES.js";
6
+ } from "./chunk-Q4PS674D.js";
7
7
  import {
8
8
  init_esm_shims
9
9
  } from "./chunk-GPYQ24DR.js";
@@ -40,4 +40,4 @@ export {
40
40
  formatModelProviderRoute,
41
41
  formatModelPolicyStatus
42
42
  };
43
- //# sourceMappingURL=chunk-4JA54Z75.js.map
43
+ //# sourceMappingURL=chunk-C6ZDYQZB.js.map
@@ -2,12 +2,16 @@
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
- UNKNOWN_PERMISSION_GRANT
6
- } from "./chunk-VGPSGL5S.js";
5
+ UNKNOWN_PERMISSION_GRANT,
6
+ getZeroConnectorCatalogPermissions
7
+ } from "./chunk-73DZG6Q7.js";
7
8
  import {
8
9
  init_esm_shims
9
10
  } from "./chunk-GPYQ24DR.js";
10
11
 
12
+ // src/commands/zero/shared/firewall-permissions.ts
13
+ init_esm_shims();
14
+
11
15
  // ../../packages/connectors/src/firewall-metadata/policy.ts
12
16
  init_esm_shims();
13
17
 
@@ -125,9 +129,91 @@ function permissionGrantsToFirewallPolicies(grants) {
125
129
  return Object.keys(policies).length > 0 ? policies : null;
126
130
  }
127
131
 
132
+ // src/commands/zero/shared/firewall-permissions.ts
133
+ async function loadPermissionMetadataBySlug(connectorSlugs) {
134
+ const uniqueConnectorSlugs = [...new Set(connectorSlugs)];
135
+ const entries = await Promise.all(
136
+ uniqueConnectorSlugs.map(async (connectorSlug) => {
137
+ return [
138
+ connectorSlug,
139
+ await getZeroConnectorCatalogPermissions(connectorSlug)
140
+ ];
141
+ })
142
+ );
143
+ return new Map(entries);
144
+ }
145
+ function connectorPermissionInfo(args) {
146
+ if (!args.metadata) {
147
+ return {
148
+ connectorSlug: args.connectorSlug,
149
+ hasPermissions: false,
150
+ hasPolicyEntry: false,
151
+ permissions: [],
152
+ policies: null,
153
+ unknownPolicy: "allow",
154
+ allowed: 0,
155
+ total: 0
156
+ };
157
+ }
158
+ const connectorPolicy = args.resolvedPolicies?.[args.metadata.connectorSlug];
159
+ const policies = connectorPolicy && Object.keys(connectorPolicy.policies).length > 0 ? connectorPolicy.policies : null;
160
+ const total = args.metadata.permissions.length;
161
+ const allowed = policies ? args.metadata.permissions.filter((permission) => {
162
+ return policies[permission.name] === "allow";
163
+ }).length : 0;
164
+ return {
165
+ connectorSlug: args.connectorSlug,
166
+ hasPermissions: true,
167
+ hasPolicyEntry: connectorPolicy !== void 0,
168
+ permissions: args.metadata.permissions,
169
+ policies,
170
+ unknownPolicy: connectorPolicy?.unknownPolicy ?? "allow",
171
+ allowed,
172
+ total
173
+ };
174
+ }
175
+ async function loadConnectorPermissionInfos(args) {
176
+ const metadataBySlug = await loadPermissionMetadataBySlug([
177
+ ...args.displayConnectorSlugs,
178
+ ...args.defaultPolicyConnectorSlugs
179
+ ]);
180
+ const defaultPolicyMetadata = args.defaultPolicyConnectorSlugs.flatMap(
181
+ (connectorSlug) => {
182
+ const metadata = metadataBySlug.get(connectorSlug);
183
+ return metadata ? [metadata] : [];
184
+ }
185
+ );
186
+ const resolvedPolicies = resolveFirewallMetadataPolicies(
187
+ args.storedPolicies,
188
+ defaultPolicyMetadata.map(({ connectorSlug, ...metadata }) => {
189
+ return { ...metadata, connectorRef: connectorSlug };
190
+ })
191
+ );
192
+ return args.displayConnectorSlugs.map((connectorSlug) => {
193
+ return connectorPermissionInfo({
194
+ connectorSlug,
195
+ metadata: metadataBySlug.get(connectorSlug) ?? null,
196
+ resolvedPolicies
197
+ });
198
+ });
199
+ }
200
+ function connectorPermissionGrantsToFirewallPolicies(grants) {
201
+ return permissionGrantsToFirewallPolicies(
202
+ grants.map(({ connectorSlug, ...grant }) => {
203
+ return { ...grant, connectorRef: connectorSlug };
204
+ })
205
+ );
206
+ }
207
+ function hasConnectorFirewallMetadataPermission(metadata, permission) {
208
+ return findFirewallMetadataPermission(
209
+ { ...metadata, connectorRef: metadata.connectorSlug },
210
+ permission
211
+ ) !== null;
212
+ }
213
+
128
214
  export {
129
- findFirewallMetadataPermission,
130
- resolveFirewallMetadataPolicies,
131
- permissionGrantsToFirewallPolicies
215
+ loadConnectorPermissionInfos,
216
+ connectorPermissionGrantsToFirewallPolicies,
217
+ hasConnectorFirewallMetadataPermission
132
218
  };
133
- //# sourceMappingURL=chunk-QSWNNYV4.js.map
219
+ //# sourceMappingURL=chunk-HWHNQPKS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/shared/firewall-permissions.ts","../../../packages/connectors/src/firewall-metadata/policy.ts","../../../packages/connectors/src/firewall-metadata/policy-resolver.ts"],"sourcesContent":["import {\n findFirewallMetadataPermission,\n permissionGrantsToFirewallPolicies,\n resolveFirewallMetadataPolicies,\n} from \"@vm0/connectors/firewall-metadata/policy\";\nimport type {\n FirewallPolicies,\n FirewallPolicyValue,\n} from \"@vm0/connectors/firewall-types\";\nimport { getZeroConnectorCatalogPermissions } from \"../../../lib/api\";\nimport type { ZeroUserPermissionGrant } from \"../../../lib/api/domains/zero-agents\";\nimport type { ZeroConnectorCatalogPermissionDetail } from \"../../../lib/api/domains/zero-connectors\";\n\nexport interface ConnectorPermissionInfo {\n readonly connectorSlug: string;\n readonly hasPermissions: boolean;\n readonly hasPolicyEntry: boolean;\n readonly permissions: readonly ZeroConnectorCatalogPermissionDetail[\"permissions\"][number][];\n readonly policies: Readonly<Record<string, FirewallPolicyValue>> | null;\n readonly unknownPolicy: FirewallPolicyValue;\n readonly allowed: number;\n readonly total: number;\n}\n\ntype PermissionMetadataBySlug = Map<\n string,\n ZeroConnectorCatalogPermissionDetail | null\n>;\n\nasync function loadPermissionMetadataBySlug(\n connectorSlugs: readonly string[],\n): Promise<PermissionMetadataBySlug> {\n const uniqueConnectorSlugs = [...new Set(connectorSlugs)];\n const entries = await Promise.all(\n uniqueConnectorSlugs.map(async (connectorSlug) => {\n return [\n connectorSlug,\n await getZeroConnectorCatalogPermissions(connectorSlug),\n ] as const;\n }),\n );\n return new Map(entries);\n}\n\nfunction connectorPermissionInfo(args: {\n readonly connectorSlug: string;\n readonly metadata: ZeroConnectorCatalogPermissionDetail | null;\n readonly resolvedPolicies: FirewallPolicies | null;\n}): ConnectorPermissionInfo {\n if (!args.metadata) {\n return {\n connectorSlug: args.connectorSlug,\n hasPermissions: false,\n hasPolicyEntry: false,\n permissions: [],\n policies: null,\n unknownPolicy: \"allow\",\n allowed: 0,\n total: 0,\n };\n }\n\n const connectorPolicy = args.resolvedPolicies?.[args.metadata.connectorSlug];\n const policies =\n connectorPolicy && Object.keys(connectorPolicy.policies).length > 0\n ? connectorPolicy.policies\n : null;\n const total = args.metadata.permissions.length;\n const allowed = policies\n ? args.metadata.permissions.filter((permission) => {\n return policies[permission.name] === \"allow\";\n }).length\n : 0;\n\n return {\n connectorSlug: args.connectorSlug,\n hasPermissions: true,\n hasPolicyEntry: connectorPolicy !== undefined,\n permissions: args.metadata.permissions,\n policies,\n unknownPolicy: connectorPolicy?.unknownPolicy ?? \"allow\",\n allowed,\n total,\n };\n}\n\nexport async function loadConnectorPermissionInfos(args: {\n readonly displayConnectorSlugs: readonly string[];\n readonly defaultPolicyConnectorSlugs: readonly string[];\n readonly storedPolicies: FirewallPolicies | null;\n}): Promise<ConnectorPermissionInfo[]> {\n const metadataBySlug = await loadPermissionMetadataBySlug([\n ...args.displayConnectorSlugs,\n ...args.defaultPolicyConnectorSlugs,\n ]);\n const defaultPolicyMetadata = args.defaultPolicyConnectorSlugs.flatMap(\n (connectorSlug) => {\n const metadata = metadataBySlug.get(connectorSlug);\n return metadata ? [metadata] : [];\n },\n );\n const resolvedPolicies = resolveFirewallMetadataPolicies(\n args.storedPolicies,\n defaultPolicyMetadata.map(({ connectorSlug, ...metadata }) => {\n return { ...metadata, connectorRef: connectorSlug };\n }),\n );\n\n return args.displayConnectorSlugs.map((connectorSlug) => {\n return connectorPermissionInfo({\n connectorSlug,\n metadata: metadataBySlug.get(connectorSlug) ?? null,\n resolvedPolicies,\n });\n });\n}\n\nexport function connectorPermissionGrantsToFirewallPolicies(\n grants: readonly ZeroUserPermissionGrant[],\n): FirewallPolicies | null {\n return permissionGrantsToFirewallPolicies(\n grants.map(({ connectorSlug, ...grant }) => {\n return { ...grant, connectorRef: connectorSlug };\n }),\n );\n}\n\nexport function hasConnectorFirewallMetadataPermission(\n metadata: ZeroConnectorCatalogPermissionDetail,\n permission: string,\n): boolean {\n return (\n findFirewallMetadataPermission(\n { ...metadata, connectorRef: metadata.connectorSlug },\n permission,\n ) !== null\n );\n}\n","import {\n UNKNOWN_PERMISSION_GRANT,\n type FirewallPolicies,\n type FirewallPolicy,\n type FirewallPolicyValue,\n} from \"../firewall-types\";\nimport { createFirewallMetadataPolicyResolver } from \"./policy-resolver\";\n\nexport type {\n FirewallMetadataPolicyListState,\n FirewallMetadataPolicyOverlay,\n FirewallMetadataPolicyResolver,\n} from \"./policy-resolver\";\n\nexport interface FirewallPermissionPolicyMetadataPermission {\n readonly name: string;\n readonly description?: string;\n}\n\nexport interface FirewallPermissionPolicyCategoryMetadata {\n readonly categories: Readonly<Record<string, string>>;\n readonly displayOrder: readonly string[];\n}\n\nexport type FirewallPermissionPolicyDefaultOverrides = Readonly<\n Partial<Record<FirewallPolicyValue, readonly string[]>>\n>;\n\nexport interface FirewallPermissionPolicyDefaultMetadata {\n readonly permissionDefault: FirewallPolicyValue;\n readonly permissionOverrides?: FirewallPermissionPolicyDefaultOverrides;\n readonly unknownPolicy: FirewallPolicyValue;\n}\n\ninterface FirewallPermissionPolicyMetadataBase {\n readonly label: string;\n readonly permissionCount: number;\n readonly permissions: readonly FirewallPermissionPolicyMetadataPermission[];\n readonly categories?: FirewallPermissionPolicyCategoryMetadata | null;\n readonly defaultPolicy: FirewallPermissionPolicyDefaultMetadata;\n}\n\nexport type FirewallPermissionPolicyMetadata =\n FirewallPermissionPolicyMetadataBase &\n // TODO(#23619): Rename with the catalog artifact metadata contract.\n (| { readonly connectorRef: string; readonly type?: string }\n | { readonly connectorRef?: undefined; readonly type: string }\n );\n\nexport interface FirewallMetadataPermissionGroup<T extends { name: string }> {\n readonly category: string;\n readonly permissions: T[];\n}\n\nexport type FirewallPermissionGrantAction = Extract<\n FirewallPolicyValue,\n \"allow\" | \"deny\"\n>;\n\nexport interface FirewallPermissionGrant {\n // TODO(#23619): Rename with the permission-grant wire and storage fields.\n readonly connectorRef: string;\n readonly permission: string;\n readonly action: FirewallPermissionGrantAction;\n}\n\nfunction metadataConnectorSlug(\n metadata: FirewallPermissionPolicyMetadata,\n): string {\n return metadata.connectorRef ?? metadata.type;\n}\n\nexport { createFirewallMetadataPolicyResolver };\n\nexport function expandFirewallMetadataDefaultPolicy(\n metadata: FirewallPermissionPolicyMetadata,\n): FirewallPolicy {\n const resolver = createFirewallMetadataPolicyResolver(metadata);\n const policies: Record<string, FirewallPolicyValue> = {};\n\n for (const permission of metadata.permissions) {\n policies[permission.name] = resolver.permission(permission.name);\n }\n\n return {\n policies,\n unknownPolicy: resolver.unknown(),\n };\n}\n\nexport function findFirewallMetadataPermission(\n metadata: FirewallPermissionPolicyMetadata,\n name: string,\n): FirewallPermissionPolicyMetadata[\"permissions\"][number] | null {\n return (\n metadata.permissions.find((permission) => {\n return permission.name === name;\n }) ?? null\n );\n}\n\nexport function groupFirewallMetadataPermissionsByCategory<\n T extends { name: string },\n>(\n permissions: readonly T[],\n metadata: FirewallPermissionPolicyMetadata,\n): FirewallMetadataPermissionGroup<T>[] | null {\n if (!metadata.categories) {\n return null;\n }\n\n const grouped = new Map<string, T[]>();\n for (const category of metadata.categories.displayOrder) {\n grouped.set(category, []);\n }\n\n for (const permission of permissions) {\n const category = metadata.categories.categories[permission.name];\n if (!category) {\n continue;\n }\n grouped.get(category)?.push(permission);\n }\n\n return [...grouped.entries()]\n .filter(([, groupPermissions]) => {\n return groupPermissions.length > 0;\n })\n .map(([category, groupPermissions]) => {\n return { category, permissions: groupPermissions };\n });\n}\n\nexport function resolveFirewallMetadataPolicies(\n stored: FirewallPolicies | null,\n metadata: readonly FirewallPermissionPolicyMetadata[],\n): FirewallPolicies | null {\n let resolved: FirewallPolicies | null = stored;\n for (const detail of metadata) {\n const connectorSlug = metadataConnectorSlug(detail);\n const defaults = expandFirewallMetadataDefaultPolicy(detail);\n const existing = resolved?.[connectorSlug];\n resolved = {\n ...resolved,\n [connectorSlug]: {\n policies: { ...defaults.policies, ...existing?.policies },\n ...(existing?.unknownPolicy !== undefined\n ? { unknownPolicy: existing.unknownPolicy }\n : { unknownPolicy: defaults.unknownPolicy }),\n },\n };\n }\n return resolved;\n}\n\nexport function permissionGrantsToFirewallPolicies(\n grants: readonly FirewallPermissionGrant[],\n): FirewallPolicies | null {\n const policies: FirewallPolicies = {};\n for (const grant of grants) {\n const current = policies[grant.connectorRef] ?? { policies: {} };\n if (grant.permission === UNKNOWN_PERMISSION_GRANT) {\n policies[grant.connectorRef] = {\n ...current,\n unknownPolicy: grant.action,\n };\n continue;\n }\n current.policies[grant.permission] = grant.action;\n policies[grant.connectorRef] = current;\n }\n return Object.keys(policies).length > 0 ? policies : null;\n}\n","import type { FirewallPolicyValue } from \"../firewall-types\";\n\ninterface FirewallMetadataPolicyResolverMetadata {\n readonly defaultPolicy: {\n readonly permissionDefault: FirewallPolicyValue;\n readonly permissionOverrides?: Readonly<\n Partial<Record<FirewallPolicyValue, readonly string[]>>\n >;\n readonly unknownPolicy: FirewallPolicyValue;\n };\n}\n\nexport interface FirewallMetadataPolicyOverlay {\n readonly permissionDefault?: FirewallPolicyValue;\n readonly permissionOverrides?: Readonly<Record<string, FirewallPolicyValue>>;\n readonly unknownPolicy?: FirewallPolicyValue;\n}\n\nexport type FirewallMetadataPolicyListState = FirewallPolicyValue | \"mixed\";\n\n/**\n * Resolves generated metadata defaults with an optional sparse policy overlay.\n * Permission name validation belongs to callers; unknown endpoints use unknown().\n */\nexport interface FirewallMetadataPolicyResolver {\n permission(name: string): FirewallPolicyValue;\n unknown(): FirewallPolicyValue;\n list(permissionNames: readonly string[]): FirewallMetadataPolicyListState;\n isPermissionOverridden(name: string): boolean;\n isUnknownOverridden(): boolean;\n}\n\nfunction buildMetadataOverrideLookup(\n metadata: FirewallMetadataPolicyResolverMetadata,\n): ReadonlyMap<string, FirewallPolicyValue> {\n const overrides = metadata.defaultPolicy.permissionOverrides;\n const lookup = new Map<string, FirewallPolicyValue>();\n if (!overrides) {\n return lookup;\n }\n\n for (const permission of overrides.allow ?? []) {\n lookup.set(permission, \"allow\");\n }\n for (const permission of overrides.deny ?? []) {\n lookup.set(permission, \"deny\");\n }\n for (const permission of overrides.ask ?? []) {\n lookup.set(permission, \"ask\");\n }\n\n return lookup;\n}\n\nfunction getOwnPermissionOverride(\n overrides: Readonly<Record<string, FirewallPolicyValue>> | undefined,\n name: string,\n): FirewallPolicyValue | undefined {\n if (!overrides || !Object.prototype.hasOwnProperty.call(overrides, name)) {\n return undefined;\n }\n return overrides[name];\n}\n\nexport function createFirewallMetadataPolicyResolver(\n metadata: FirewallMetadataPolicyResolverMetadata,\n overlay?: FirewallMetadataPolicyOverlay,\n): FirewallMetadataPolicyResolver {\n const metadataOverrides = buildMetadataOverrideLookup(metadata);\n\n function metadataPermission(name: string): FirewallPolicyValue {\n return (\n metadataOverrides.get(name) ?? metadata.defaultPolicy.permissionDefault\n );\n }\n\n function permission(name: string): FirewallPolicyValue {\n return (\n getOwnPermissionOverride(overlay?.permissionOverrides, name) ??\n overlay?.permissionDefault ??\n metadataPermission(name)\n );\n }\n\n return {\n permission,\n unknown: () => {\n return overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy;\n },\n list: (permissionNames) => {\n let first: FirewallPolicyValue | null = null;\n for (const name of permissionNames) {\n const current = permission(name);\n if (first === null) {\n first = current;\n continue;\n }\n if (first !== current) {\n return \"mixed\";\n }\n }\n return first ?? \"mixed\";\n },\n isPermissionOverridden: (name) => {\n return permission(name) !== metadataPermission(name);\n },\n isUnknownOverridden: () => {\n return (\n (overlay?.unknownPolicy ?? metadata.defaultPolicy.unknownPolicy) !==\n metadata.defaultPolicy.unknownPolicy\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -17,7 +17,7 @@ import {
17
17
  runnerGroupSchema,
18
18
  searchZeroLogs,
19
19
  zeroAgentVisibilitySchema
20
- } from "./chunk-VGPSGL5S.js";
20
+ } from "./chunk-73DZG6Q7.js";
21
21
  import {
22
22
  apiErrorSchema,
23
23
  external_exports,
@@ -31,7 +31,7 @@ import {
31
31
  upsertModelProviderRequestSchema,
32
32
  upsertModelProviderResponseSchema,
33
33
  withErrorHandler
34
- } from "./chunk-DTZW7RES.js";
34
+ } from "./chunk-Q4PS674D.js";
35
35
  import {
36
36
  Command
37
37
  } from "./chunk-CCWPKGTB.js";
@@ -8397,7 +8397,7 @@ var PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES = {
8397
8397
  var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8398
8398
  {
8399
8399
  slug: "playful-launch-presentation",
8400
- title: "Playful launch",
8400
+ title: "Sunburst playroom",
8401
8401
  prompt: "/gen presentation, create a 15-slide launch deck for SproutPop, a playful habit-building app for remote teams introducing a shared 30-day wellness challenge. Present it to people and culture leaders with cover, agenda, launch story, audience pain points, product vision, feature tour, rollout timeline, activation moments, team, early metrics, testimonials, pricing, and next steps. Make it saturated, joyful, idea-led, and structured.",
8402
8402
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/daf7c2d1-5195-4c09-ad4b-8d85778fc104/playful-launch-presentation.html",
8403
8403
  previewImage: PLAYFUL_LAUNCH_CDN_PREVIEW_IMAGES[0],
@@ -8410,7 +8410,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8410
8410
  },
8411
8411
  {
8412
8412
  slug: "botane-organic-deck",
8413
- title: "Botane organic",
8413
+ title: "Mauve garden",
8414
8414
  prompt: "/gen presentation, create a 15-slide brand story deck for Moss & Moon, a coastal wellness retreat launching a seasonal herb garden, tea bar, and slow-living membership program. Present it to hospitality partners with cover, agenda, origin story, guest philosophy, retreat spaces, treatment menu, garden-to-table process, photography gallery, sustainability metrics, member testimonials, packages, and contact. Make it calm, editorial, rounded, and organic.",
8415
8415
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/0babab92-7ad9-414e-b44f-7a060ed48bcc/botane-organic-deck.html",
8416
8416
  previewImage: BOTANE_ORGANIC_PREVIEW_IMAGES[0],
@@ -8423,7 +8423,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8423
8423
  },
8424
8424
  {
8425
8425
  slug: "business-data-presentation",
8426
- title: "Business data",
8426
+ title: "Berry dashboard",
8427
8427
  prompt: "/gen presentation, create a 15-slide executive data readout for HarborCart, an omnichannel grocery retailer reviewing 2026 growth, loyalty behavior, basket mix, and store-to-delivery conversion. Present it to the leadership team with cover, agenda, business context, KPI scorecard, regional segments, channel comparison, customer cohorts, operational drivers, forecast, strategic bets, risks, recommendations, and appendix contact. Make it number-first, chart-led, confident, modern, and readable.",
8428
8428
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/95648bba-2a52-497e-b1b8-9cdd0cab9d93/business-data-presentation.html",
8429
8429
  previewImage: BUSINESS_DATA_CDN_PREVIEW_IMAGES[0],
@@ -8436,7 +8436,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8436
8436
  },
8437
8437
  {
8438
8438
  slug: "crayon-learning-deck",
8439
- title: "Crayon learning",
8439
+ title: "Crayon doodle",
8440
8440
  prompt: "/gen presentation, create a 15-slide parent-night deck for Rainbow Lab, a summer art-and-science camp where kids build storybooks, cardboard cities, and tiny robots. Present it to families with cover, agenda, camp promise, learning goals, weekly themes, instructor team, sample day, workshop stations, student gallery, safety plan, progress metrics, parent quotes, pricing, and registration steps. Make it bright, rounded, joyful, and crayon-like.",
8441
8441
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/63af1d38-51e8-493e-b975-1728f4f796da/crayon-learning-deck.html",
8442
8442
  previewImage: CRAYON_PREVIEW_IMAGES[0],
@@ -8450,7 +8450,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8450
8450
  },
8451
8451
  {
8452
8452
  slug: "creative-agency-presentation",
8453
- title: "Creative agency",
8453
+ title: "Foliage gallery",
8454
8454
  prompt: "/gen presentation, create a 15-slide rebrand pitch for Northstar Studio proposing a new identity, website, and launch campaign for a boutique hotel group expanding into three coastal cities. Present it to the client board with cover, agenda, brand challenge, strategic insight, creative direction, visual territories, service scope, project process, case-study gallery, launch roadmap, impact metrics, client quotes, investment, and contact. Make it minimal, editorial, sharp, and agency-grade.",
8455
8455
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/527ad859-e0dd-4cfd-90a4-09e5030b71e1/creative-agency-presentation.html",
8456
8456
  previewImage: CREATIVE_AGENCY_PREVIEW_IMAGES[0],
@@ -8464,7 +8464,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8464
8464
  },
8465
8465
  {
8466
8466
  slug: "data-report-presentation",
8467
- title: "Data report",
8467
+ title: "Candy charts",
8468
8468
  prompt: "/gen presentation, create a 15-slide research findings deck for MetroPulse, a city mobility study comparing bike-share, buses, rideshare, and commuter rail across 12 neighborhoods. Present it to urban planning stakeholders with cover, contents, study context, methodology, demand trends, neighborhood segments, mode comparison, peak-hour bottlenecks, equity impact, emissions estimate, 12-month forecast, recommendations, summary, and contact. Make it chart-led, sharp, vivid, and number-first.",
8469
8469
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/920c6119-1833-4902-bda9-327af1bd8f7f/data-report-presentation.html",
8470
8470
  previewImage: DATA_REPORT_PREVIEW_IMAGES[0],
@@ -8478,7 +8478,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8478
8478
  },
8479
8479
  {
8480
8480
  slug: "editorial-magazine-deck",
8481
- title: "Editorial magazine",
8481
+ title: "Paper magazine",
8482
8482
  prompt: "/gen presentation, create a 15-slide media kit for Field Notes Quarterly, an independent culture magazine pitching its autumn issue on craft, travel, food, and design to premium sponsors. Include cover, editor letter, issue theme, audience profile, editorial departments, contributor roster, feature previews, photography gallery, distribution plan, partnership formats, audience metrics, sponsor examples, rate card, production timeline, and contact. Make it restrained, paper-forward, serif, and magazine-like.",
8483
8483
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/85360bd6-8b80-43ba-9c9c-001b7d96f205/editorial-magazine-deck.html",
8484
8484
  previewImage: EDITORIAL_MAGAZINE_PREVIEW_IMAGES[0],
@@ -8492,7 +8492,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8492
8492
  },
8493
8493
  {
8494
8494
  slug: "landing-consulting-deck",
8495
- title: "Landing consulting",
8495
+ title: "Neon browser",
8496
8496
  prompt: "/gen presentation, create a 15-slide growth proposal for ScaleBridge advising a B2B fintech SaaS team on reducing onboarding drop-off and improving trial-to-paid conversion. Present it to the revenue leadership team with cover, agenda, opportunity size, diagnosis, desired outcomes, engagement model, workstreams, sprint process, benchmark gallery, proof metrics, client testimonials, pricing tiers, decision timeline, and contact. Make it landing-page-like, sharp, high-contrast, and conversion-oriented.",
8497
8497
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/998aed16-60a1-4d84-b60e-1ab093de8fa6/landing-consulting-deck.html",
8498
8498
  previewImage: LANDING_CONSULTING_PREVIEW_IMAGES[0],
@@ -8506,7 +8506,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8506
8506
  },
8507
8507
  {
8508
8508
  slug: "lumina-creative-studio",
8509
- title: "Lumina creative studio",
8509
+ title: "Brush stickers",
8510
8510
  prompt: "/gen presentation, create a 15-slide portfolio deck for LensLab Studio, a photography and motion team pitching a beauty brand's global campaign shoot across studio sets, street casting, and social cutdowns. Include cover, agenda, studio point of view, campaign concept, team, production services, creative process, location plan, image gallery, motion deliverables, campaign metrics, client quotes, package options, and contact. Make it bold, sticker-tagged, sharp, and creative-studio oriented.",
8511
8511
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/08fe05a2-a7dd-4355-822d-14fb6a0987b3/lumina-creative-studio.html",
8512
8512
  previewImage: LUMINA_PREVIEW_IMAGES[0],
@@ -8520,7 +8520,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8520
8520
  },
8521
8521
  {
8522
8522
  slug: "mosaic-geometric-pitch",
8523
- title: "Mosaic geometric pitch",
8523
+ title: "Bauhaus tiles",
8524
8524
  prompt: "/gen presentation, create a 15-slide modular identity pitch for CivicLink, a new transit app unifying buses, bikes, scooters, and commuter rail under one visual system. Present it to city innovation leaders with cover, agenda, brand problem, design principles, logo grid, color and icon system, app moments, rollout process, station signage gallery, accessibility impact, pilot metrics, stakeholder quotes, implementation budget, and contact. Make it bold, modular, Bauhaus-geometric, and colourful.",
8525
8525
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/65f0f224-4bf0-4b11-9f3e-ddb1a11b1ec3/mosaic-geometric-pitch.html",
8526
8526
  previewImage: MOSAIC_GEOMETRIC_PREVIEW_IMAGES[0],
@@ -8534,7 +8534,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8534
8534
  },
8535
8535
  {
8536
8536
  slug: "playful-pop-deck",
8537
- title: "Playful pop",
8537
+ title: "Neon candy",
8538
8538
  prompt: "/gen presentation, create a 15-slide campus launch deck for FizzPop, a sparkling tea brand planning a colorful back-to-school sampling tour, creator challenge, and limited-edition flavor drop. Present it to retail and student ambassador partners with cover, agenda, brand world, audience insight, campaign idea, flavor lineup, activation map, event flow, content plan, gallery, reach metrics, partner testimonials, budget, and contact. Make it neon, bouncy, rounded, and pop-art playful.",
8539
8539
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/6b2f388a-119f-4ecc-8638-5cc309779b67/playful-pop-deck.html",
8540
8540
  previewImage: PLAYFUL_POP_PREVIEW_IMAGES[0],
@@ -8548,7 +8548,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8548
8548
  },
8549
8549
  {
8550
8550
  slug: "bloom-pitch",
8551
- title: "Bloom pitch",
8551
+ title: "Petal pitch",
8552
8552
  prompt: "/gen presentation, create a 15-slide investor pitch for PetalLoop, a climate-friendly flower delivery marketplace raising a seed round. Include cover, agenda, market shift, customer problem, solution, product flow, traction, business model, go-to-market, competitive position, roadmap, team, financial plan, ask, and next steps. Make it playful, optimistic, organic, and investor-ready.",
8553
8553
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/d29707fb-9b85-44bc-be55-cf3cf082f68d/bloom-pitch.html",
8554
8554
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["bloom-pitch"][0],
@@ -8561,7 +8561,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8561
8561
  },
8562
8562
  {
8563
8563
  slug: "blueprint-academy",
8564
- title: "Blueprint academy",
8564
+ title: "Drafting campus",
8565
8565
  prompt: "/gen presentation, create a 15-slide curriculum proposal for Northline Academy launching an applied AI certificate for working professionals. Present it to academic leadership with cover, agenda, program context, learner needs, curriculum map, module sequence, faculty team, classroom experience, assessment model, outcomes, partnerships, enrollment plan, budget, and next steps. Make it academic, structured, blueprint-like, and credible.",
8566
8566
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/f64cd670-7565-483f-b872-117a18c0c414/blueprint-academy.html",
8567
8567
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["blueprint-academy"][0],
@@ -8574,7 +8574,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8574
8574
  },
8575
8575
  {
8576
8576
  slug: "meridian",
8577
- title: "Meridian",
8577
+ title: "Cobalt blocks",
8578
8578
  prompt: "/gen presentation, create a 15-slide agency capabilities deck for Meridian Works, a data strategy studio helping enterprise teams modernize analytics operations. Present it to a prospective client executive team with cover, agenda, market context, client challenges, service model, team, process, case studies, measurement plan, operating rhythm, timeline, commercial model, and contact. Make it professional, sharp, data-led, and executive-ready.",
8579
8579
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/58cc240d-7d84-49a7-92ba-57eea4168730/meridian.html",
8580
8580
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["meridian"][0],
@@ -8587,7 +8587,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8587
8587
  },
8588
8588
  {
8589
8589
  slug: "neo-brutalism",
8590
- title: "Neo brutalism",
8590
+ title: "Shadow shop",
8591
8591
  prompt: "/gen presentation, create a 15-slide founder pitch for BlockForge, a developer tooling startup launching a collaborative build system. Present it to early-stage investors with cover, agenda, problem, product, technical edge, market, traction, customer proof, business model, go-to-market, competition, roadmap, team, funding ask, and next steps. Make it bold, direct, high-contrast, and brutalist.",
8592
8592
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/4d8a4052-b43d-498a-81cc-b4c743103ff2/neo-brutalism.html",
8593
8593
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["neo-brutalism"][0],
@@ -8600,7 +8600,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8600
8600
  },
8601
8601
  {
8602
8602
  slug: "nocturne",
8603
- title: "Nocturne",
8603
+ title: "Midnight stage",
8604
8604
  prompt: "/gen presentation, create a 15-slide annual keynote for NightOps Cloud reviewing reliability, infrastructure scale, and the roadmap for autonomous operations. Present it to technical customers with cover, agenda, state of the platform, usage growth, reliability metrics, architecture, product updates, customer stories, roadmap, ecosystem, pricing changes, and closing call to action. Make it dark, data-rich, polished, and keynote-ready.",
8605
8605
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/dd4ecb89-b6b1-4ed0-bfca-4ebf3db3a664/nocturne.html",
8606
8606
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["nocturne"][0],
@@ -8613,7 +8613,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8613
8613
  },
8614
8614
  {
8615
8615
  slug: "pixel-glitch",
8616
- title: "Pixel glitch",
8616
+ title: "Arcade pixels",
8617
8617
  prompt: "/gen presentation, create a 15-slide creative studio deck for Arcade Signal pitching a retro-futurist campaign for an indie game launch. Present it to the publisher team with cover, agenda, audience insight, campaign concept, visual world, channel plan, creator program, launch timeline, asset gallery, performance targets, budget, team, and next steps. Make it pixelated, energetic, digital, and sharp.",
8618
8618
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/274e4cc3-d811-40a1-a091-526db9a62734/pixel-glitch.html",
8619
8619
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["pixel-glitch"][0],
@@ -8626,7 +8626,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8626
8626
  },
8627
8627
  {
8628
8628
  slug: "prospectus",
8629
- title: "Prospectus",
8629
+ title: "Homepage pitch",
8630
8630
  prompt: "/gen presentation, create a 15-slide business plan for Atlas Harbor, a B2B logistics platform expanding into regional fulfillment. Present it to strategic partners with cover, agenda, market context, customer problem, solution, operating model, product experience, growth plan, financial model, implementation roadmap, risks, team, partnership terms, and next steps. Make it corporate, polished, structured, and proposal-ready.",
8631
8631
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/64a9b8c5-f89d-4379-998c-9da755f7ca62/prospectus.html",
8632
8632
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["prospectus"][0],
@@ -8639,7 +8639,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8639
8639
  },
8640
8640
  {
8641
8641
  slug: "schoolhouse",
8642
- title: "Schoolhouse",
8642
+ title: "Kraft poster",
8643
8643
  prompt: "/gen presentation, create a 15-slide community education deck for Maple Hall launching a weekend skills program for families and local makers. Present it to city partners with cover, agenda, mission, audience needs, program tracks, sample day, instructor team, venue plan, safety approach, outcomes, testimonials, membership tiers, budget, and registration steps. Make it warm, retro, classroom-inspired, and approachable.",
8644
8644
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/cb03f77b-982d-4708-8781-2a0ab450a4fb/schoolhouse.html",
8645
8645
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["schoolhouse"][0],
@@ -8652,7 +8652,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8652
8652
  },
8653
8653
  {
8654
8654
  slug: "sticker-scrapbook",
8655
- title: "Sticker scrapbook",
8655
+ title: "Sticker notebook",
8656
8656
  prompt: "/gen presentation, create a 15-slide brand collaboration deck for Patch Party, a youth culture festival launching sponsor activations, creator booths, and collectible merch. Present it to brand partners with cover, agenda, audience story, event concept, activation zones, creator plan, media moments, sponsor packages, timeline, reach metrics, testimonials, budget, and contact. Make it vibrant, scrapbook-like, sticker-heavy, and celebratory.",
8657
8657
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/f15ccce7-90f1-4773-b4c8-c7eaf903ce76/sticker-scrapbook.html",
8658
8658
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["sticker-scrapbook"][0],
@@ -8665,7 +8665,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8665
8665
  },
8666
8666
  {
8667
8667
  slug: "strata",
8668
- title: "Strata",
8668
+ title: "Red staircase",
8669
8669
  prompt: "/gen presentation, create a 15-slide agency proposal for Strata Studio helping a fintech brand redesign its onboarding and lifecycle communications. Present it to the client leadership team with cover, agenda, business challenge, strategic principles, design direction, service scope, sprint process, sample work, measurement plan, timeline, investment, team, and next steps. Make it Swiss-minimal, precise, editorial, and agency-grade.",
8670
8670
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/040ddb5c-6819-436a-bd3a-87cb5de2be0e/strata.html",
8671
8671
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["strata"][0],
@@ -8678,7 +8678,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8678
8678
  },
8679
8679
  {
8680
8680
  slug: "taped-consulting",
8681
- title: "Taped consulting",
8681
+ title: "Polaroid wall",
8682
8682
  prompt: "/gen presentation, create a 15-slide transformation proposal for Clearpath Advisory helping a healthcare network improve patient intake operations. Present it to operations executives with cover, agenda, current-state diagnosis, opportunity, engagement model, workstreams, field research, process redesign, timeline, proof metrics, testimonials, pricing, and next steps. Make it consulting-focused, tactile, polished, and persuasive.",
8683
8683
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/ffa53ff0-36b0-4bd1-b44a-4c2d8d66aaa6/taped-consulting.html",
8684
8684
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["taped-consulting"][0],
@@ -8691,7 +8691,7 @@ var PRESENTATION_TEMPLATE_PICKER_ITEMS = [
8691
8691
  },
8692
8692
  {
8693
8693
  slug: "vantage",
8694
- title: "Vantage",
8694
+ title: "Numbered boardroom",
8695
8695
  prompt: "/gen presentation, create a 15-slide business proposal for Vantage Partners helping a robotics manufacturer launch a new service program. Present it to enterprise buyers with cover, agenda, market context, buyer pain points, proposed solution, service model, operating plan, proof metrics, roadmap, commercials, implementation timeline, team, and close. Make it business-focused, confident, structured, and modern.",
8696
8696
  embedUrl: "https://static.vm0.io/vm0/artifact-templates/presentation/acada4b0-952c-4354-a382-56dcf49bb7e9/vantage.html",
8697
8697
  previewImage: PRESENTATION_TEMPLATE_REFERENCE_PREVIEW_IMAGES["vantage"][0],
@@ -12809,7 +12809,7 @@ var cronCompactUsageEventsResponseSchema = external_exports.object({
12809
12809
  lockWaitMs: external_exports.number().int().nonnegative(),
12810
12810
  durationMs: external_exports.number().int().nonnegative()
12811
12811
  });
12812
- var cronMonitorChatMessageQueueResponseSchema = external_exports.object({
12812
+ var cronMonitorChatEventQueueResponseSchema = external_exports.object({
12813
12813
  success: external_exports.literal(true),
12814
12814
  orphanedMessages: external_exports.number().int().nonnegative()
12815
12815
  });
@@ -12953,13 +12953,13 @@ var cronCompactUsageEventsContract = c35.router({
12953
12953
  summary: "Compact stable usage events into hourly rollups"
12954
12954
  }
12955
12955
  });
12956
- var cronMonitorChatMessageQueueContract = c35.router({
12956
+ var cronMonitorChatEventQueueContract = c35.router({
12957
12957
  monitor: {
12958
12958
  method: "GET",
12959
12959
  path: "/api/cron/monitor-chat-message-queue",
12960
12960
  headers: authHeadersSchema,
12961
12961
  responses: {
12962
- 200: cronMonitorChatMessageQueueResponseSchema,
12962
+ 200: cronMonitorChatEventQueueResponseSchema,
12963
12963
  401: apiErrorSchema,
12964
12964
  500: external_exports.object({ error: external_exports.string() })
12965
12965
  },
@@ -18157,4 +18157,4 @@ export {
18157
18157
  runLogsSearch,
18158
18158
  searchCommand
18159
18159
  };
18160
- //# sourceMappingURL=chunk-C6KDTR5A.js.map
18160
+ //# sourceMappingURL=chunk-NGXH4WMD.js.map