@opengeni/contracts 5.5.0 → 5.5.2-canary.40656248492001

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 (543) hide show
  1. package/dist/agent-authored-durable-text.d.ts +9 -9
  2. package/dist/agent-config.d.ts +148 -37
  3. package/dist/api-key-presets.d.ts +19 -0
  4. package/dist/app-action-catalog-types.d.ts +32 -0
  5. package/dist/app-action-catalog.gen.d.ts +2 -0
  6. package/dist/app-actions.d.ts +91 -0
  7. package/dist/app-actions.js +10130 -0
  8. package/dist/app-actions.js.map +1 -0
  9. package/dist/app-shot.d.ts +55 -0
  10. package/dist/artifact-catalog.d.ts +33 -0
  11. package/dist/artifacts.d.ts +166 -0
  12. package/dist/atlassian-native-retirement.d.ts +16 -0
  13. package/dist/atlassian-native-retirement.js +30 -0
  14. package/dist/atlassian-native-retirement.js.map +1 -0
  15. package/dist/atlassian.js +48 -23
  16. package/dist/automation-templates.d.ts +434 -0
  17. package/dist/automation-templates.js +31 -0
  18. package/dist/automation-templates.js.map +1 -0
  19. package/dist/billing-subscriptions.d.ts +61 -0
  20. package/dist/bots.d.ts +583 -0
  21. package/dist/bundled-skills.d.ts +58 -2
  22. package/dist/canonical-human-identities.js +3 -1
  23. package/dist/child-lifecycle-notice-protocol.d.ts +45 -0
  24. package/dist/chunk-2QKIEAGY.js +396 -0
  25. package/dist/chunk-2QKIEAGY.js.map +1 -0
  26. package/dist/chunk-2WOWEWXV.js +426 -0
  27. package/dist/chunk-2WOWEWXV.js.map +1 -0
  28. package/dist/chunk-2ZIHHL72.js +153 -0
  29. package/dist/chunk-2ZIHHL72.js.map +1 -0
  30. package/dist/chunk-32U6NKQQ.js +389 -0
  31. package/dist/chunk-32U6NKQQ.js.map +1 -0
  32. package/dist/chunk-4YDDHSO2.js +799 -0
  33. package/dist/chunk-4YDDHSO2.js.map +1 -0
  34. package/dist/chunk-56SNIMDO.js +9 -0
  35. package/dist/chunk-56SNIMDO.js.map +1 -0
  36. package/dist/chunk-5RWB6QVL.js +101 -0
  37. package/dist/chunk-5RWB6QVL.js.map +1 -0
  38. package/dist/chunk-5UGUOT3L.js +243 -0
  39. package/dist/chunk-5UGUOT3L.js.map +1 -0
  40. package/dist/chunk-6LAT33BH.js +130 -0
  41. package/dist/chunk-6LAT33BH.js.map +1 -0
  42. package/dist/chunk-7272KVWZ.js +60 -0
  43. package/dist/chunk-7272KVWZ.js.map +1 -0
  44. package/dist/chunk-72QC2GTL.js +36 -0
  45. package/dist/chunk-72QC2GTL.js.map +1 -0
  46. package/dist/chunk-7EQGGZBY.js +105 -0
  47. package/dist/chunk-7EQGGZBY.js.map +1 -0
  48. package/dist/chunk-A3LXWVYU.js +382 -0
  49. package/dist/chunk-A3LXWVYU.js.map +1 -0
  50. package/dist/chunk-AQYDZUJV.js +34 -0
  51. package/dist/chunk-AQYDZUJV.js.map +1 -0
  52. package/dist/chunk-BHCEVVUP.js +93 -0
  53. package/dist/chunk-BHCEVVUP.js.map +1 -0
  54. package/dist/chunk-BMUTAZX5.js +486 -0
  55. package/dist/chunk-BMUTAZX5.js.map +1 -0
  56. package/dist/chunk-DGG6IBBK.js +150 -0
  57. package/dist/chunk-DGG6IBBK.js.map +1 -0
  58. package/dist/{chunk-YBW5JSA3.js → chunk-FBCTUMHI.js} +123 -102
  59. package/dist/chunk-FBCTUMHI.js.map +1 -0
  60. package/dist/chunk-G2KJTFIC.js +97 -0
  61. package/dist/chunk-G2KJTFIC.js.map +1 -0
  62. package/dist/chunk-G4RKARXZ.js +1167 -0
  63. package/dist/chunk-G4RKARXZ.js.map +1 -0
  64. package/dist/chunk-H6UJJIUM.js +350 -0
  65. package/dist/chunk-H6UJJIUM.js.map +1 -0
  66. package/dist/chunk-JOTHDW4H.js +18 -0
  67. package/dist/chunk-JOTHDW4H.js.map +1 -0
  68. package/dist/chunk-L4GUEP7K.js +56480 -0
  69. package/dist/chunk-L4GUEP7K.js.map +1 -0
  70. package/dist/{chunk-SIOU2K4U.js → chunk-LJH2EYGT.js} +23 -23
  71. package/dist/chunk-MTJKSIGA.js +161 -0
  72. package/dist/chunk-MTJKSIGA.js.map +1 -0
  73. package/dist/chunk-MYHMB6GZ.js +202 -0
  74. package/dist/chunk-MYHMB6GZ.js.map +1 -0
  75. package/dist/chunk-PI5VIKJY.js +660 -0
  76. package/dist/chunk-PI5VIKJY.js.map +1 -0
  77. package/dist/{chunk-RIY7GYQS.js → chunk-PTSROVDG.js} +2 -2
  78. package/dist/chunk-PUIUXIOL.js +189 -0
  79. package/dist/chunk-PUIUXIOL.js.map +1 -0
  80. package/dist/chunk-R6VXJIMB.js +19 -0
  81. package/dist/chunk-R6VXJIMB.js.map +1 -0
  82. package/dist/chunk-RLJUNVAM.js +15 -0
  83. package/dist/chunk-RLJUNVAM.js.map +1 -0
  84. package/dist/chunk-RR6APCBK.js +213 -0
  85. package/dist/chunk-RR6APCBK.js.map +1 -0
  86. package/dist/{chunk-TXTQIYCV.js → chunk-RUQ4I6DO.js} +59 -13
  87. package/dist/chunk-RUQ4I6DO.js.map +1 -0
  88. package/dist/{chunk-WYBDERIY.js → chunk-RWEEUDHD.js} +53 -42
  89. package/dist/chunk-RWEEUDHD.js.map +1 -0
  90. package/dist/chunk-S7MSQQL6.js +158 -0
  91. package/dist/chunk-S7MSQQL6.js.map +1 -0
  92. package/dist/{chunk-5Q54VCCH.js → chunk-SHO4YO4B.js} +20 -36
  93. package/dist/chunk-SHO4YO4B.js.map +1 -0
  94. package/dist/{chunk-HHZSZYYF.js → chunk-T3HSWMA5.js} +20 -4
  95. package/dist/chunk-T3HSWMA5.js.map +1 -0
  96. package/dist/{chunk-YRKRZ6OF.js → chunk-TOOJIBJC.js} +2 -2
  97. package/dist/chunk-UCUOTRS6.js +431 -0
  98. package/dist/chunk-UCUOTRS6.js.map +1 -0
  99. package/dist/chunk-UH4K7GP7.js +424 -0
  100. package/dist/chunk-UH4K7GP7.js.map +1 -0
  101. package/dist/chunk-UIZWGPHV.js +120 -0
  102. package/dist/chunk-UIZWGPHV.js.map +1 -0
  103. package/dist/chunk-VLUKBV6Y.js +1170 -0
  104. package/dist/chunk-VLUKBV6Y.js.map +1 -0
  105. package/dist/chunk-W2QQ5Y6K.js +55 -0
  106. package/dist/chunk-W2QQ5Y6K.js.map +1 -0
  107. package/dist/{chunk-Y3KNXVTD.js → chunk-W3NBPR4E.js} +131 -31
  108. package/dist/chunk-W3NBPR4E.js.map +1 -0
  109. package/dist/{chunk-NRMCVHAU.js → chunk-WMGO4HJU.js} +11 -9
  110. package/dist/chunk-WMGO4HJU.js.map +1 -0
  111. package/dist/{chunk-MYBZRDTY.js → chunk-WQI7VNN4.js} +19 -9
  112. package/dist/chunk-WQI7VNN4.js.map +1 -0
  113. package/dist/{chunk-PX3VCKAU.js → chunk-WVCFSOUZ.js} +1 -1
  114. package/dist/{chunk-PX3VCKAU.js.map → chunk-WVCFSOUZ.js.map} +1 -1
  115. package/dist/chunk-XB6GQLBH.js +76 -0
  116. package/dist/chunk-XB6GQLBH.js.map +1 -0
  117. package/dist/{chunk-D2HKF2EF.js → chunk-XP5M3IKT.js} +2 -2
  118. package/dist/{chunk-O77VSFYZ.js → chunk-ZMPU5BWE.js} +12 -2
  119. package/dist/chunk-ZMPU5BWE.js.map +1 -0
  120. package/dist/{chunk-3SIZGL3O.js → chunk-ZYVEJFNU.js} +22 -18
  121. package/dist/chunk-ZYVEJFNU.js.map +1 -0
  122. package/dist/claude-provider-account-authority.d.ts +18 -0
  123. package/dist/claude-subscription-oauth.d.ts +25 -0
  124. package/dist/claude-subscription-usage.d.ts +95 -1
  125. package/dist/client-error-report.d.ts +154 -8
  126. package/dist/client-error-report.js +157 -2
  127. package/dist/client-error-report.js.map +1 -1
  128. package/dist/code-search.d.ts +1 -1
  129. package/dist/code-search.js.map +1 -1
  130. package/dist/codex-provider-account-authority.js +23 -12
  131. package/dist/codex-provider-account-authority.js.map +1 -1
  132. package/dist/company-profile.d.ts +144 -0
  133. package/dist/connect.d.ts +38 -0
  134. package/dist/connect.js +244 -164
  135. package/dist/connect.js.map +1 -1
  136. package/dist/connection-account-label.d.ts +2 -0
  137. package/dist/connection-account-label.js +34 -0
  138. package/dist/connection-account-label.js.map +1 -0
  139. package/dist/connection-authority.js +49 -24
  140. package/dist/connector-attachments.js +3 -1
  141. package/dist/connector-destinations.js +3 -1
  142. package/dist/connector-tool-permissions.d.ts +68 -4
  143. package/dist/credential-profiles.d.ts +166 -0
  144. package/dist/cua-desktop-tools.d.ts +19 -0
  145. package/dist/define-schema.d.ts +8 -0
  146. package/dist/desktop-app.d.ts +28 -0
  147. package/dist/direct-model-provider.d.ts +38 -0
  148. package/dist/document-artifact-commands.js +2 -2
  149. package/dist/document-artifact-query.js +2 -2
  150. package/dist/editable-artifact-binary.d.ts +7 -0
  151. package/dist/editable-artifact-causal-frontier.js +2 -2
  152. package/dist/editable-artifact-codec-registry.js +7 -7
  153. package/dist/editable-artifact-committed-transaction.js +4 -2
  154. package/dist/editable-artifact-live.js +8 -8
  155. package/dist/editable-artifact-serialized-commit.js +9 -9
  156. package/dist/editable-artifact-versions.d.ts +7 -1
  157. package/dist/editable-artifact-versions.js +1 -1
  158. package/dist/editable-artifacts.js +49 -43
  159. package/dist/event-preview.d.ts +22 -0
  160. package/dist/event-triggers.d.ts +1253 -0
  161. package/dist/event-triggers.js +148 -0
  162. package/dist/event-triggers.js.map +1 -0
  163. package/dist/external-identities.d.ts +34 -0
  164. package/dist/external-identities.js +4 -2
  165. package/dist/feedback.d.ts +181 -0
  166. package/dist/file-access.d.ts +23 -0
  167. package/dist/first-party-tool-authorization.d.ts +852 -0
  168. package/dist/github-repository-contracts.js +64 -43
  169. package/dist/github-repository-contracts.js.map +1 -1
  170. package/dist/google-drive-native-retirement.d.ts +12 -0
  171. package/dist/google-drive-native-retirement.js +20 -0
  172. package/dist/google-drive-native-retirement.js.map +1 -0
  173. package/dist/google-drive.d.ts +1 -1
  174. package/dist/google-drive.js +323 -239
  175. package/dist/google-drive.js.map +1 -1
  176. package/dist/host-mcp-bindings.js +250 -198
  177. package/dist/host-mcp-bindings.js.map +1 -1
  178. package/dist/index.d.ts +29072 -20593
  179. package/dist/index.js +2432 -366
  180. package/dist/inference-residency.d.ts +22 -0
  181. package/dist/insights-usage.d.ts +948 -0
  182. package/dist/insights-usage.js +608 -0
  183. package/dist/insights-usage.js.map +1 -0
  184. package/dist/integration-capability-id.d.ts +8 -0
  185. package/dist/interaction-action-deadline.d.ts +48 -0
  186. package/dist/interaction-driver-diagnostic.d.ts +28 -0
  187. package/dist/interaction.d.ts +2126 -881
  188. package/dist/knowledge-entries.d.ts +38 -0
  189. package/dist/knowledge-preparation.d.ts +4 -0
  190. package/dist/learning-refusal.d.ts +43 -0
  191. package/dist/learning-refusal.js +49 -0
  192. package/dist/learning-refusal.js.map +1 -0
  193. package/dist/managed-auth-session-sets.d.ts +1 -0
  194. package/dist/managed-auth-session-sets.js +207 -146
  195. package/dist/managed-auth-session-sets.js.map +1 -1
  196. package/dist/managed-sign-in-methods.d.ts +96 -0
  197. package/dist/managed-sign-in-methods.js +157 -35
  198. package/dist/managed-sign-in-methods.js.map +1 -1
  199. package/dist/mcp-structured-content.d.ts +25 -0
  200. package/dist/message-time-zone.d.ts +38 -0
  201. package/dist/message-time-zone.js +19 -0
  202. package/dist/message-time-zone.js.map +1 -0
  203. package/dist/modal-native-proof-v2.d.ts +587 -0
  204. package/dist/modal-native-proof-v2.js +39 -0
  205. package/dist/modal-native-proof-v2.js.map +1 -0
  206. package/dist/model-account-choice.d.ts +237 -0
  207. package/dist/model-account-settings.d.ts +422 -0
  208. package/dist/model-availability.d.ts +15 -0
  209. package/dist/model-connection-access.d.ts +13 -0
  210. package/dist/model-context-inspector.d.ts +8 -0
  211. package/dist/model-display.d.ts +43 -0
  212. package/dist/model-display.js +17 -0
  213. package/dist/model-display.js.map +1 -0
  214. package/dist/model-picker-order.js.map +1 -1
  215. package/dist/model-residency.d.ts +304 -0
  216. package/dist/organization-access.d.ts +416 -0
  217. package/dist/organization-access.js +40 -0
  218. package/dist/organization-access.js.map +1 -0
  219. package/dist/organization-integration-policy.d.ts +18 -0
  220. package/dist/organization-membership-lifecycle.d.ts +66 -0
  221. package/dist/organization-model-usage.d.ts +146 -0
  222. package/dist/organization-model-usage.js +87 -0
  223. package/dist/organization-model-usage.js.map +1 -0
  224. package/dist/organization-recovery.js +3 -1
  225. package/dist/organization-usage.d.ts +12 -0
  226. package/dist/passkey-only-account.d.ts +14 -0
  227. package/dist/passkey-only-account.js +13 -0
  228. package/dist/passkey-only-account.js.map +1 -0
  229. package/dist/permissions.d.ts +19 -0
  230. package/dist/personal-github.js +220 -148
  231. package/dist/personal-github.js.map +1 -1
  232. package/dist/personal-integration-setup.d.ts +81 -0
  233. package/dist/personal-integration-setup.js +42 -0
  234. package/dist/personal-integration-setup.js.map +1 -0
  235. package/dist/prepared-mcp-setup.d.ts +54 -0
  236. package/dist/prepared-mcp-setup.js +13 -0
  237. package/dist/prepared-mcp-setup.js.map +1 -0
  238. package/dist/presentation-artifact-commands.js +2 -2
  239. package/dist/presentation-artifact-query.js +2 -2
  240. package/dist/primitives.d.ts +18 -0
  241. package/dist/product-analytics.d.ts +27 -10
  242. package/dist/product-lifecycle-facts.d.ts +26 -3
  243. package/dist/prompt-cache-diagnostics.d.ts +92 -0
  244. package/dist/recordings.d.ts +1371 -0
  245. package/dist/remember.d.ts +98 -2
  246. package/dist/retained-output.d.ts +4 -2
  247. package/dist/sandbox-file-artifacts.d.ts +19 -2
  248. package/dist/sandbox-provider-command.d.ts +5 -44
  249. package/dist/sandbox-recovery.d.ts +139 -8
  250. package/dist/secret-generator.d.ts +44 -0
  251. package/dist/secret-mask-strings.d.ts +32 -0
  252. package/dist/secret-references.d.ts +90 -0
  253. package/dist/secret-resolution.d.ts +143 -0
  254. package/dist/secret-shape-masking.d.ts +52 -0
  255. package/dist/secret-shape-masking.js +19 -0
  256. package/dist/secret-shape-masking.js.map +1 -0
  257. package/dist/secret-totp.d.ts +41 -0
  258. package/dist/secret-use-approval-question.d.ts +11 -0
  259. package/dist/secret-use-approval-question.js +11 -0
  260. package/dist/secret-use-approval-question.js.map +1 -0
  261. package/dist/secret-use-approvals.d.ts +106 -0
  262. package/dist/secret-value-masking.d.ts +299 -0
  263. package/dist/secret-value-masking.js +62 -0
  264. package/dist/secret-value-masking.js.map +1 -0
  265. package/dist/secret-value.d.ts +19 -0
  266. package/dist/session-history-import.d.ts +444 -8
  267. package/dist/session-history.d.ts +111 -0
  268. package/dist/session-history.js +35 -0
  269. package/dist/session-history.js.map +1 -0
  270. package/dist/session-list-entries.d.ts +8 -0
  271. package/dist/session-list-entries.js +61 -0
  272. package/dist/session-list-entries.js.map +1 -0
  273. package/dist/session-mcp-projections.d.ts +13 -1
  274. package/dist/session-mcp-tool-permissions.d.ts +62 -0
  275. package/dist/session-target.d.ts +18 -0
  276. package/dist/session-titles.d.ts +8 -0
  277. package/dist/session-titles.js +5 -1
  278. package/dist/session-usage-limit-refusal.d.ts +34 -0
  279. package/dist/session-usage-limit-refusal.js +15 -0
  280. package/dist/session-usage-limit-refusal.js.map +1 -0
  281. package/dist/session-usage-limits.d.ts +127 -0
  282. package/dist/session-usage-limits.js +43 -0
  283. package/dist/session-usage-limits.js.map +1 -0
  284. package/dist/site-data.d.ts +286 -0
  285. package/dist/site-operations.d.ts +39 -0
  286. package/dist/site-publishing.d.ts +813 -0
  287. package/dist/site-session-http.d.ts +103 -4
  288. package/dist/site-session-http.js +27 -1
  289. package/dist/site-sql.d.ts +425 -0
  290. package/dist/skills.d.ts +38 -0
  291. package/dist/slack-bot-scopes.d.ts +9 -7
  292. package/dist/slack-bot-scopes.js +6 -3
  293. package/dist/slack-rest-mcp.d.ts +36 -0
  294. package/dist/slack-rest-mcp.js +25 -0
  295. package/dist/slack-rest-mcp.js.map +1 -0
  296. package/dist/spreadsheet-artifact-commands.d.ts +14 -1
  297. package/dist/spreadsheet-artifact-commands.js +9 -2
  298. package/dist/spreadsheet-artifact-query.d.ts +13 -6
  299. package/dist/spreadsheet-artifact-query.js +4 -3
  300. package/dist/subscription-account-actions.d.ts +83 -0
  301. package/dist/subscription-account-pools.d.ts +326 -0
  302. package/dist/subscription-personal-authority-v2.d.ts +28 -0
  303. package/dist/subscription-personal-authority-v2.js +13 -0
  304. package/dist/subscription-personal-authority-v2.js.map +1 -0
  305. package/dist/subscription-plans.d.ts +38 -0
  306. package/dist/subscription-usage-pool.d.ts +89 -0
  307. package/dist/tool-action-review.d.ts +141 -0
  308. package/dist/tool-catalog.d.ts +479 -0
  309. package/dist/tool-policy.d.ts +5 -0
  310. package/dist/tool-review-presentation.d.ts +29 -0
  311. package/dist/tool-review-presentation.js +21 -0
  312. package/dist/tool-review-presentation.js.map +1 -0
  313. package/dist/turn-serving-policy.d.ts +223 -0
  314. package/dist/usage-allowances.d.ts +30 -0
  315. package/dist/usage-allowances.js +5 -1
  316. package/dist/values.d.ts +11 -0
  317. package/dist/values.js +19 -0
  318. package/dist/values.js.map +1 -0
  319. package/dist/vault-provider-wire.d.ts +907 -0
  320. package/dist/vault-provider-wire.js +74 -0
  321. package/dist/vault-provider-wire.js.map +1 -0
  322. package/dist/vaults.d.ts +2185 -0
  323. package/dist/video-generation.d.ts +75 -0
  324. package/dist/video-generation.js +8 -1
  325. package/dist/workspace-control-event.d.ts +18 -0
  326. package/dist/workspace-control-event.js +18 -0
  327. package/dist/workspace-control-event.js.map +1 -0
  328. package/dist/workspace-governance-context.d.ts +18 -0
  329. package/dist/workspace-integration-wire.d.ts +1 -1
  330. package/dist/workspace-integration-wire.js +1 -1
  331. package/dist/workspace-integrations.d.ts +212 -12
  332. package/dist/xai-provider-account-authority.js +3 -1
  333. package/package.json +121 -4
  334. package/src/agent-authored-durable-text.ts +14 -11
  335. package/src/agent-config.ts +382 -203
  336. package/src/agent-instruction-changes.ts +94 -74
  337. package/src/agent-learning.ts +94 -66
  338. package/src/agent-topology.ts +58 -52
  339. package/src/api-key-presets.ts +28 -0
  340. package/src/app-action-catalog-types.ts +32 -0
  341. package/src/app-action-catalog.gen.ts +9905 -0
  342. package/src/app-actions.ts +365 -0
  343. package/src/app-shot.ts +176 -0
  344. package/src/artifact-catalog.ts +81 -46
  345. package/src/artifacts.ts +360 -227
  346. package/src/atlassian-native-retirement.ts +33 -0
  347. package/src/atlassian.ts +136 -108
  348. package/src/automation-templates.ts +201 -0
  349. package/src/billing-subscriptions.ts +48 -0
  350. package/src/bots.ts +238 -0
  351. package/src/bundled-skills.ts +79 -22
  352. package/src/canonical-human-identities.ts +65 -62
  353. package/src/child-lifecycle-notice-protocol.gen.json +1310 -0
  354. package/src/child-lifecycle-notice-protocol.ts +224 -0
  355. package/src/claude-provider-account-authority.ts +12 -0
  356. package/src/claude-subscription-oauth.ts +61 -19
  357. package/src/claude-subscription-usage.ts +64 -35
  358. package/src/client-error-report.ts +344 -9
  359. package/src/code-search.ts +1 -1
  360. package/src/codex-provider-account-authority.ts +22 -16
  361. package/src/company-brain-governed-writes.ts +265 -244
  362. package/src/company-brain.ts +165 -154
  363. package/src/company-profile.ts +362 -297
  364. package/src/connect.ts +222 -173
  365. package/src/connection-account-label.ts +45 -0
  366. package/src/connection-authority.ts +172 -152
  367. package/src/connector-attachments.ts +139 -123
  368. package/src/connector-destinations.ts +48 -43
  369. package/src/connector-tool-permissions.ts +104 -46
  370. package/src/credential-profiles.ts +161 -0
  371. package/src/cua-desktop-tools.gen.json +6722 -0
  372. package/src/cua-desktop-tools.linux.gen.json +6798 -0
  373. package/src/cua-desktop-tools.ts +42 -0
  374. package/src/cua-desktop-tools.windows.gen.json +6739 -0
  375. package/src/define-schema.ts +10 -0
  376. package/src/desktop-app.ts +50 -0
  377. package/src/direct-model-provider.ts +112 -0
  378. package/src/editable-artifact-binary.ts +29 -8
  379. package/src/editable-artifact-committed-transaction.ts +19 -18
  380. package/src/editable-artifact-serialized-commit.ts +8 -2
  381. package/src/editable-artifact-versions.ts +7 -1
  382. package/src/event-preview.ts +53 -3
  383. package/src/event-triggers.ts +891 -0
  384. package/src/external-identities.ts +239 -195
  385. package/src/feedback.ts +125 -30
  386. package/src/file-access.ts +26 -0
  387. package/src/first-party-tool-authorization.ts +383 -0
  388. package/src/github-repository-contracts.ts +78 -64
  389. package/src/google-drive-native-retirement.ts +20 -0
  390. package/src/google-drive.ts +286 -234
  391. package/src/governed-learning-activation.ts +159 -137
  392. package/src/governed-learning-evaluator.ts +141 -133
  393. package/src/host-mcp-bindings.ts +244 -221
  394. package/src/image-generation.ts +105 -95
  395. package/src/index.ts +13928 -9899
  396. package/src/inference-residency.ts +36 -0
  397. package/src/insights-usage.ts +774 -0
  398. package/src/integration-capability-id.ts +16 -0
  399. package/src/interaction-action-deadline.ts +143 -0
  400. package/src/interaction-driver-diagnostic.ts +89 -0
  401. package/src/interaction.ts +3527 -2427
  402. package/src/knowledge-entries.ts +386 -299
  403. package/src/knowledge-preparation.ts +49 -41
  404. package/src/knowledge.ts +242 -213
  405. package/src/learning-refusal.ts +90 -0
  406. package/src/managed-auth-session-sets.ts +180 -133
  407. package/src/managed-sign-in-methods.ts +156 -34
  408. package/src/mcp-oauth.ts +58 -46
  409. package/src/mcp-receipts.ts +199 -194
  410. package/src/mcp-structured-content.ts +81 -0
  411. package/src/memory-slack-delivery.ts +172 -142
  412. package/src/message-time-zone.ts +109 -0
  413. package/src/modal-native-proof-v2.ts +430 -0
  414. package/src/model-account-choice.ts +178 -0
  415. package/src/model-account-settings.ts +210 -0
  416. package/src/model-availability.ts +22 -0
  417. package/src/model-connection-access.ts +62 -14
  418. package/src/model-context-inspector.ts +130 -109
  419. package/src/model-display.ts +221 -0
  420. package/src/model-picker-order.ts +1 -1
  421. package/src/model-residency.ts +535 -0
  422. package/src/organization-access.ts +216 -0
  423. package/src/organization-integration-policy.ts +47 -28
  424. package/src/organization-membership-lifecycle.ts +558 -384
  425. package/src/organization-model-usage.ts +82 -0
  426. package/src/organization-recovery.ts +148 -135
  427. package/src/organization-usage.ts +84 -52
  428. package/src/passkey-only-account.ts +29 -0
  429. package/src/permissions.ts +94 -52
  430. package/src/personal-github.ts +211 -171
  431. package/src/personal-integration-setup.ts +150 -0
  432. package/src/preference-registry.ts +319 -263
  433. package/src/prepared-mcp-setup.ts +190 -0
  434. package/src/primitives.ts +22 -0
  435. package/src/product-analytics.ts +40 -15
  436. package/src/product-lifecycle-facts.ts +50 -20
  437. package/src/prompt-cache-diagnostics.ts +212 -0
  438. package/src/recordings.ts +1153 -0
  439. package/src/remember.ts +184 -172
  440. package/src/retained-output.ts +181 -168
  441. package/src/sandbox-file-artifacts.ts +78 -57
  442. package/src/sandbox-provider-command.ts +55 -72
  443. package/src/sandbox-recovery.ts +163 -77
  444. package/src/scoped-knowledge.ts +62 -43
  445. package/src/secret-generator.ts +156 -0
  446. package/src/secret-mask-strings.ts +175 -0
  447. package/src/secret-references.ts +414 -0
  448. package/src/secret-resolution.ts +322 -0
  449. package/src/secret-shape-masking.ts +573 -0
  450. package/src/secret-totp.ts +188 -0
  451. package/src/secret-use-approval-question.ts +22 -0
  452. package/src/secret-use-approvals.ts +219 -0
  453. package/src/secret-value-masking.ts +1283 -0
  454. package/src/secret-value.ts +22 -0
  455. package/src/session-goal-reports.ts +55 -49
  456. package/src/session-history-import.ts +84 -68
  457. package/src/session-history.ts +197 -0
  458. package/src/session-list-entries.ts +106 -0
  459. package/src/session-mcp-projections.ts +21 -3
  460. package/src/session-mcp-tool-permissions.ts +109 -0
  461. package/src/session-message-search.ts +46 -38
  462. package/src/session-target.ts +58 -0
  463. package/src/session-titles.ts +40 -4
  464. package/src/session-topology-primitives.ts +20 -12
  465. package/src/session-usage-limit-refusal.ts +101 -0
  466. package/src/session-usage-limits.ts +169 -0
  467. package/src/signup-attribution.ts +20 -15
  468. package/src/site-data.ts +337 -0
  469. package/src/site-operations.ts +154 -0
  470. package/src/site-publishing.ts +903 -0
  471. package/src/site-session-http.ts +344 -16
  472. package/src/site-sql.ts +1120 -0
  473. package/src/skill-use.ts +18 -17
  474. package/src/skills.ts +105 -50
  475. package/src/slack-bot-scopes.ts +18 -35
  476. package/src/slack-rest-mcp.ts +222 -0
  477. package/src/slack-task-policy.ts +97 -73
  478. package/src/spreadsheet-artifact-commands.ts +74 -13
  479. package/src/spreadsheet-artifact-query.ts +188 -50
  480. package/src/subscription-account-actions.ts +103 -0
  481. package/src/subscription-account-pools.ts +74 -0
  482. package/src/subscription-personal-authority-v2.ts +69 -0
  483. package/src/subscription-plans.ts +51 -0
  484. package/src/subscription-usage-pool.ts +44 -0
  485. package/src/task-notes.ts +70 -68
  486. package/src/tool-action-review.ts +271 -0
  487. package/src/tool-catalog.ts +694 -379
  488. package/src/tool-policy.ts +82 -0
  489. package/src/tool-result-spill.ts +13 -9
  490. package/src/tool-review-presentation.ts +643 -0
  491. package/src/turn-serving-policy.ts +167 -0
  492. package/src/usage-allowances.ts +212 -136
  493. package/src/values.ts +25 -0
  494. package/src/vault-provider-wire.ts +580 -0
  495. package/src/vaults.ts +1296 -0
  496. package/src/video-generation.ts +430 -361
  497. package/src/work-claims.ts +183 -166
  498. package/src/workspace-control-event.ts +134 -0
  499. package/src/workspace-governance-context.ts +63 -0
  500. package/src/workspace-instruction-policies.ts +346 -279
  501. package/src/workspace-integration-wire.ts +10 -0
  502. package/src/workspace-integrations.ts +488 -398
  503. package/src/workspace-learning-administration.ts +58 -44
  504. package/src/workspace-learning-policy.ts +126 -99
  505. package/src/workspace-state.ts +239 -220
  506. package/src/xai-provider-account-authority.ts +23 -17
  507. package/dist/chunk-3SIZGL3O.js.map +0 -1
  508. package/dist/chunk-566IFOVP.js +0 -26133
  509. package/dist/chunk-566IFOVP.js.map +0 -1
  510. package/dist/chunk-5IXYF6XN.js +0 -728
  511. package/dist/chunk-5IXYF6XN.js.map +0 -1
  512. package/dist/chunk-5Q54VCCH.js.map +0 -1
  513. package/dist/chunk-BCS7WHCK.js +0 -139
  514. package/dist/chunk-BCS7WHCK.js.map +0 -1
  515. package/dist/chunk-EK7NDGFR.js +0 -128
  516. package/dist/chunk-EK7NDGFR.js.map +0 -1
  517. package/dist/chunk-GRG7PHWQ.js +0 -25
  518. package/dist/chunk-GRG7PHWQ.js.map +0 -1
  519. package/dist/chunk-HHZSZYYF.js.map +0 -1
  520. package/dist/chunk-ICDZGUX2.js +0 -186
  521. package/dist/chunk-ICDZGUX2.js.map +0 -1
  522. package/dist/chunk-JUFK3T4Q.js +0 -80
  523. package/dist/chunk-JUFK3T4Q.js.map +0 -1
  524. package/dist/chunk-MYBZRDTY.js.map +0 -1
  525. package/dist/chunk-NRMCVHAU.js.map +0 -1
  526. package/dist/chunk-O77VSFYZ.js.map +0 -1
  527. package/dist/chunk-P3HLDT77.js +0 -59
  528. package/dist/chunk-P3HLDT77.js.map +0 -1
  529. package/dist/chunk-TXTQIYCV.js.map +0 -1
  530. package/dist/chunk-WYBDERIY.js.map +0 -1
  531. package/dist/chunk-Y3KNXVTD.js.map +0 -1
  532. package/dist/chunk-YBW5JSA3.js.map +0 -1
  533. package/dist/chunk-YRXAWWCU.js +0 -45
  534. package/dist/chunk-YRXAWWCU.js.map +0 -1
  535. package/dist/chunk-YWMOIZ6A.js +0 -185
  536. package/dist/chunk-YWMOIZ6A.js.map +0 -1
  537. package/dist/site-request-headers.test.d.ts +0 -1
  538. package/dist/transcription-recordings.d.ts +0 -300
  539. package/src/transcription-recordings.ts +0 -169
  540. /package/dist/{chunk-SIOU2K4U.js.map → chunk-LJH2EYGT.js.map} +0 -0
  541. /package/dist/{chunk-RIY7GYQS.js.map → chunk-PTSROVDG.js.map} +0 -0
  542. /package/dist/{chunk-YRKRZ6OF.js.map → chunk-TOOJIBJC.js.map} +0 -0
  543. /package/dist/{chunk-D2HKF2EF.js.map → chunk-XP5M3IKT.js.map} +0 -0
@@ -0,0 +1,431 @@
1
+ // src/tool-review-presentation.ts
2
+ var protectedName = /password|passwd|passphrase|secret|credential|authorization|cookie|(^|[_-])token($|[_-])|api[_-]?key|accessToken|refreshToken|privateKey/i;
3
+ var protectedReviewField = (key, fields = []) => protectedName.test(key) || fields.includes(key) || fields.includes("*");
4
+ var SECRET_LAST_WORDS = /* @__PURE__ */ new Set([
5
+ "password",
6
+ "passwd",
7
+ "passphrase",
8
+ "secret",
9
+ "secrets",
10
+ "credential",
11
+ "credentials",
12
+ "cookie",
13
+ "cookies",
14
+ "token",
15
+ "otp",
16
+ "totp",
17
+ "dsn",
18
+ "authorization"
19
+ ]);
20
+ var SECRET_CODE_KINDS = /* @__PURE__ */ new Set([
21
+ "user",
22
+ "auth",
23
+ "authorization",
24
+ "oauth",
25
+ "verification",
26
+ "setup",
27
+ "recovery",
28
+ "device",
29
+ "otp"
30
+ ]);
31
+ var SECRET_KEY_KINDS = /* @__PURE__ */ new Set([
32
+ "api",
33
+ "private",
34
+ "access",
35
+ "secret",
36
+ "signing",
37
+ "encryption",
38
+ "master",
39
+ "license"
40
+ ]);
41
+ var SECRET_FLAG_FIRST_WORDS = /* @__PURE__ */ new Set(["has", "is", "awaiting", "can", "needs", "expected"]);
42
+ var SECRET_METADATA_LAST_WORDS = /* @__PURE__ */ new Set([
43
+ "version",
44
+ "versions",
45
+ "id",
46
+ "ids",
47
+ "count",
48
+ "at",
49
+ "name",
50
+ "names",
51
+ "label",
52
+ "kind",
53
+ "type",
54
+ "status",
55
+ "mode",
56
+ "source",
57
+ "ref",
58
+ "refs",
59
+ "reference",
60
+ "references",
61
+ "configured",
62
+ "present",
63
+ "set",
64
+ "enabled",
65
+ "required",
66
+ "length",
67
+ "prefix",
68
+ "hint",
69
+ "fingerprint",
70
+ "scope",
71
+ "scopes",
72
+ "provider",
73
+ "expiry",
74
+ "expires",
75
+ "suffix",
76
+ "url",
77
+ "uri",
78
+ "epoch"
79
+ ]);
80
+ function nameWords(name) {
81
+ return name.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_\s-]+/g, " ").toLowerCase().split(" ").filter(Boolean);
82
+ }
83
+ function secretFieldName(name) {
84
+ const words = nameWords(name);
85
+ const last = words.at(-1);
86
+ const before = words.at(-2);
87
+ if (!last || SECRET_FLAG_FIRST_WORDS.has(words[0])) return false;
88
+ if (last === "token" && before === "page") return false;
89
+ if (SECRET_LAST_WORDS.has(last)) return true;
90
+ if (last === "code") return before === void 0 || SECRET_CODE_KINDS.has(before);
91
+ if (last === "key" && before !== void 0 && SECRET_KEY_KINDS.has(before)) return true;
92
+ return protectedName.test(name) && !SECRET_METADATA_LAST_WORDS.has(last);
93
+ }
94
+ var SECRET_PATH_HOSTS = /^(hooks\.slack\.com|(\w+\.)?discord(app)?\.com|[\w-]+\.webhook\.office\.com|outlook\.office\.com|chat\.googleapis\.com|hooks\.zapier\.com)$/i;
95
+ var URL_IN_TEXT = /[a-z][a-z0-9+.-]*:\/\/[^\s"'<>]+/gi;
96
+ var CONNECTION_STRING_SECRET = /((?:^|;)\s*(?:password|pwd|user ?password|account ?key|shared ?access ?key|shared ?access ?signature|access ?key|secret|token|sig)\s*=)[^;]*/gi;
97
+ var AUTHORIZATION_VALUE = /\b(Bearer|Basic|Token)\s+[A-Za-z0-9._~+/=-]{8,}/g;
98
+ var TOKEN_SHAPES = /\b(?:sk-[A-Za-z0-9_-]{16,}|sk_(?:live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[abprs]-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,})/g;
99
+ function secretLookingPathSegment(segment) {
100
+ if (/^[A-Za-z0-9_-]{32,}$/.test(segment)) return true;
101
+ return segment.split(/[-_.~]/).some((chunk) => chunk.length >= 12 && /\d/.test(chunk) && /[A-Za-z]/.test(chunk));
102
+ }
103
+ function withoutUrlSecret(url) {
104
+ const scheme = url.slice(0, url.indexOf("://") + 3);
105
+ const rest = url.slice(scheme.length).split(/[?#]/, 1)[0];
106
+ const address = rest.slice(rest.lastIndexOf("@") + 1);
107
+ const host = address.split("/", 1)[0];
108
+ const hostname = host.replace(/:\d+$/, "");
109
+ if (SECRET_PATH_HOSTS.test(hostname) && address.length > host.length + 1) {
110
+ return `${scheme}${host}/\u2026`;
111
+ }
112
+ const path = address.slice(host.length).split("/").map((segment) => secretLookingPathSegment(segment) ? "\u2026" : segment).join("/");
113
+ return `${scheme}${host}${path}`;
114
+ }
115
+ function withoutTextSecrets(text) {
116
+ return text.replace(URL_IN_TEXT, withoutUrlSecret).replace(CONNECTION_STRING_SECRET, "$1[Protected value]").replace(AUTHORIZATION_VALUE, "$1 [Protected value]").replace(TOKEN_SHAPES, "[Protected value]");
117
+ }
118
+ var bound = (value, limit) => value.length > limit ? `${value.slice(0, limit)}\u2026` : value;
119
+ function toolReviewFieldLabel(key) {
120
+ const label = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\bids?\b/gi, (word) => word.length === 3 ? "IDs" : "ID").replace(
121
+ /\b(api|url|uri|http|https|ip|sql|json|html)(s?)\b/gi,
122
+ (_word, name, plural) => `${name.toUpperCase()}${plural}`
123
+ ).replace(
124
+ /(?<=\S\s+)([A-Z])([a-z]+)\b/g,
125
+ (_word, first, rest) => `${first.toLowerCase()}${rest}`
126
+ ).trim();
127
+ return label.charAt(0).toUpperCase() + label.slice(1);
128
+ }
129
+ function decodeReviewArguments(value) {
130
+ let decoded = value;
131
+ if (typeof decoded === "string") {
132
+ try {
133
+ decoded = JSON.parse(decoded);
134
+ } catch {
135
+ return null;
136
+ }
137
+ }
138
+ return decoded && typeof decoded === "object" && !Array.isArray(decoded) ? decoded : null;
139
+ }
140
+ function safeReviewValue(value, key = "", protectedFields = [], depth = 0) {
141
+ if (protectedReviewField(key, protectedFields)) return "[Protected value]";
142
+ if (depth > 20) return "[Nested value; open this field for details]";
143
+ if (Array.isArray(value))
144
+ return value.map((entry) => safeReviewValue(entry, "", protectedFields, depth + 1));
145
+ if (value && typeof value === "object")
146
+ return Object.fromEntries(
147
+ Object.entries(value).map(([name, entry]) => [
148
+ name,
149
+ safeReviewValue(entry, name, protectedFields, depth + 1)
150
+ ])
151
+ );
152
+ return value;
153
+ }
154
+ function valueText(value) {
155
+ return typeof value === "string" ? value : value === null ? "None" : typeof value === "boolean" ? value ? "Yes" : "No" : JSON.stringify(value) ?? "Unavailable";
156
+ }
157
+ var pointer = (name) => `/${name.replaceAll("~", "~0").replaceAll("/", "~1")}`;
158
+ var fieldPointer = (key, index, parent = "") => pointer(key).length > 256 || parent.length + pointer(key).length > 1024 ? `/~2${index}` : pointer(key);
159
+ function toolReviewFields(argumentsValue, context, toolName) {
160
+ if (toolName === APP_ACTION_REVIEW_TOOL) return { fields: [], moreFields: 0 };
161
+ const args = decodeReviewArguments(argumentsValue);
162
+ if (!args) return { fields: [], moreFields: 0 };
163
+ const entries = Object.entries(args);
164
+ if (context?.email) {
165
+ const email = toolReviewFields(context.email);
166
+ const original = toolReviewFields(args, { ...context, email: void 0 });
167
+ const fields = [
168
+ ...email.fields.filter(
169
+ (field) => field.path !== "/contentSha256" && field.path !== "/htmlBody" && field.preview !== ""
170
+ ).map((field) => ({
171
+ ...field,
172
+ label: field.path === "/textBody" ? "Message" : field.label,
173
+ path: `/$email${field.path}`,
174
+ ...field.path === "/attachments" ? {
175
+ preview: context.email.attachments.map((attachment) => attachment.name).join(", ").slice(0, 240)
176
+ } : {}
177
+ })),
178
+ ...original.fields.filter(
179
+ (field) => ![
180
+ "/raw",
181
+ "/expectedContentSha256",
182
+ "/from",
183
+ "/to",
184
+ "/cc",
185
+ "/bcc",
186
+ "/subject",
187
+ "/body",
188
+ "/textBody",
189
+ "/htmlBody",
190
+ "/attachments"
191
+ ].includes(field.path)
192
+ )
193
+ ];
194
+ return {
195
+ fields: fields.slice(0, 16),
196
+ moreFields: original.moreFields + Math.max(0, fields.length - 16)
197
+ };
198
+ }
199
+ return {
200
+ moreFields: Math.max(0, entries.length - 16),
201
+ fields: entries.slice(0, 16).map(([key, value], index) => {
202
+ const hidden = protectedReviewField(key, context?.protectedFields);
203
+ const safe = hidden ? "[Protected value]" : value;
204
+ const count = !hidden && Array.isArray(value) ? value.length : void 0;
205
+ const compactList = !hidden && Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every(
206
+ (entry) => typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean"
207
+ ) ? value.map(valueText).join(", ") : void 0;
208
+ const text = compactList !== void 0 ? compactList : count !== void 0 ? `${count.toLocaleString("en-US")} item${count === 1 ? "" : "s"}` : safe && typeof safe === "object" ? `${Object.keys(safe).length} field${Object.keys(safe).length === 1 ? "" : "s"}` : valueText(safe);
209
+ return {
210
+ path: fieldPointer(key, index),
211
+ label: bound(
212
+ (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key) ? context.fieldLabels[key] : void 0) ?? toolReviewFieldLabel(key),
213
+ 256
214
+ ),
215
+ preview: bound(text, 240),
216
+ ...count !== void 0 ? { count } : {},
217
+ truncated: !hidden && (text.length > 240 || compactList === void 0 && typeof value === "object" && value !== null),
218
+ ...hidden ? { protected: true } : {}
219
+ };
220
+ })
221
+ };
222
+ }
223
+ var APP_ACTION_REVIEW_TOOL = "admin_action_call";
224
+ var APP_ACTION_UNREADABLE_KEY = /^(id|operationId|idempotencyKey|expiresAt|expectedVersion|expectedRevision|expectedEtag)$|Ids?$/;
225
+ function appActionReviewSummary(argumentsValue) {
226
+ const args = decodeReviewArguments(argumentsValue);
227
+ if (!args) return void 0;
228
+ const parts = [];
229
+ const visit = (key, value, depth) => {
230
+ if (parts.length >= 4 || APP_ACTION_UNREADABLE_KEY.test(key)) return;
231
+ if (secretFieldName(key)) {
232
+ parts.push(`${toolReviewFieldLabel(key)}: [Protected value]`);
233
+ return;
234
+ }
235
+ if (value && typeof value === "object" && !Array.isArray(value)) {
236
+ if (depth < 2)
237
+ for (const [name, entry] of Object.entries(value)) visit(name, entry, depth + 1);
238
+ return;
239
+ }
240
+ const scalar = (entry) => entry === null || ["string", "number", "boolean"].includes(typeof entry);
241
+ const shown = (entry) => valueText(typeof entry === "string" ? withoutTextSecrets(entry.trim()) : entry);
242
+ const text = Array.isArray(value) ? value.length > 0 && value.length <= 4 && value.every(scalar) ? value.map(shown).join(", ") : "" : scalar(value) ? shown(value) : "";
243
+ const line = text.replace(/\s+/g, " ").trim();
244
+ if (line) parts.push(`${toolReviewFieldLabel(key)}: ${bound(line, 80)}`);
245
+ };
246
+ for (const source of [args.body, args.query]) {
247
+ if (source && typeof source === "object" && !Array.isArray(source))
248
+ for (const [name, entry] of Object.entries(source)) visit(name, entry, 0);
249
+ }
250
+ return parts.length > 0 ? bound(parts.join(" \xB7 "), 240) : void 0;
251
+ }
252
+ function toolReviewAction(toolName, argumentsValue, context) {
253
+ const fallback = {
254
+ title: context?.title ?? bound(
255
+ toolReviewFieldLabel(
256
+ toolName.replace(/^mcp_[^_]+__/, "").replace(/^batch[_-](?=[a-z])/i, "")
257
+ ),
258
+ 256
259
+ ),
260
+ // An app action's card asks the person a plain question ("Invite … to
261
+ // your organization?"), so its button answers it.
262
+ approveLabel: toolName === APP_ACTION_REVIEW_TOOL ? "Allow" : "Approve action",
263
+ effects: []
264
+ };
265
+ if (toolName === APP_ACTION_REVIEW_TOOL) {
266
+ const consequence = appActionReviewSummary(argumentsValue);
267
+ return consequence ? { ...fallback, consequence } : fallback;
268
+ }
269
+ if (context?.kind !== "gmail") return fallback;
270
+ const args = decodeReviewArguments(argumentsValue);
271
+ if (!args) return fallback;
272
+ const thread = toolName.endsWith("_thread");
273
+ const selectionKind = thread ? "threads" : "messages";
274
+ const ids = thread && typeof args.threadId === "string" ? [args.threadId] : Array.isArray(args.messageIds) ? args.messageIds : typeof args.messageId === "string" ? [args.messageId] : null;
275
+ const selectionCount = ids?.every((id) => typeof id === "string") ? new Set(ids).size : void 0;
276
+ const noun = selectionCount === void 0 ? thread ? "conversations" : "messages" : `${selectionCount.toLocaleString("en-US")} ${thread ? "conversation" : "message"}${selectionCount === 1 ? "" : "s"}`;
277
+ const addValues = toolName.startsWith("label_") ? args.labelIds : args.addLabelIds;
278
+ const adds = Array.isArray(addValues) ? addValues.filter((v) => typeof v === "string") : [];
279
+ const removeValues = toolName.startsWith("unlabel_") ? args.labelIds : args.removeLabelIds;
280
+ const removes = Array.isArray(removeValues) ? removeValues.filter((v) => typeof v === "string") : [];
281
+ const labelEffect = (label, adding) => {
282
+ const known = {
283
+ TRASH: ["Move to Trash", "Remove from Trash"],
284
+ INBOX: ["Move to Inbox", "Remove from Inbox"],
285
+ UNREAD: ["Mark as unread", "Mark as read"],
286
+ STARRED: ["Add star", "Remove star"],
287
+ SPAM: ["Mark as spam", "Remove from Spam"],
288
+ IMPORTANT: ["Mark as important", "Remove importance"]
289
+ };
290
+ return (Object.hasOwn(known, label) ? known[label]?.[adding ? 0 : 1] : void 0) ?? `${adding ? "Add" : "Remove"} label ${bound(label, 120)}`;
291
+ };
292
+ const effects = [
293
+ ...adds.map((id) => labelEffect(id, true)),
294
+ ...removes.map((id) => labelEffect(id, false))
295
+ ];
296
+ if ([
297
+ "batch_modify_messages",
298
+ "modify_message",
299
+ "modify_thread",
300
+ "label_message",
301
+ "label_thread",
302
+ "unlabel_message",
303
+ "unlabel_thread"
304
+ ].includes(toolName)) {
305
+ const trash = adds.includes("TRASH");
306
+ return {
307
+ title: trash ? `Move ${noun} to Trash` : `Update ${noun}`,
308
+ approveLabel: trash ? "Move to Trash" : "Apply changes",
309
+ effects,
310
+ ...selectionCount === void 0 ? {} : { selectionCount, selectionKind },
311
+ ...trash ? { consequence: "Messages stay recoverable in Trash until Gmail deletes them." } : thread ? { consequence: "Applies to every message in the conversation." } : {}
312
+ };
313
+ }
314
+ if (["trash_message", "restore_message", "trash_thread", "restore_thread"].includes(toolName))
315
+ return {
316
+ title: toolName.startsWith("trash_") ? `Move ${noun} to Trash` : `Remove ${noun} from Trash`,
317
+ approveLabel: toolName.startsWith("trash_") ? "Move to Trash" : "Remove from Trash",
318
+ effects,
319
+ ...selectionCount === void 0 ? {} : { selectionCount, selectionKind }
320
+ };
321
+ const named = {
322
+ send_message: ["Send email", "Send email"],
323
+ send_draft: ["Send draft", "Send draft"],
324
+ create_draft: ["Create email draft", "Create draft"],
325
+ update_draft: ["Update email draft", "Update draft"],
326
+ delete_draft: ["Delete email draft", "Delete draft"],
327
+ create_label: ["Create label", "Create label"],
328
+ update_label: ["Update label", "Update label"],
329
+ delete_label: ["Delete label", "Delete label"]
330
+ };
331
+ const action = Object.hasOwn(named, toolName) ? named[toolName] : void 0;
332
+ return action ? { title: action[0], approveLabel: action[1], effects } : fallback;
333
+ }
334
+ function toolReviewDetails(argumentsValue, context, path, offset, limit = 25) {
335
+ if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(limit) || limit < 1 || limit > 50)
336
+ throw new Error("Invalid review page");
337
+ const args = decodeReviewArguments(argumentsValue);
338
+ let value = context?.email ? { ...args, $email: context.email } : args;
339
+ if (path !== "") {
340
+ if (!path.startsWith("/")) throw new Error("Invalid review field");
341
+ for (const escaped of path.slice(1).split("/")) {
342
+ if (/^~2\d+$/.test(escaped)) {
343
+ if (!value || typeof value !== "object" || Array.isArray(value))
344
+ throw new Error("Review field not found");
345
+ const selected = Object.entries(value)[Number(escaped.slice(2))];
346
+ if (!selected) throw new Error("Review field not found");
347
+ value = {
348
+ fieldName: selected[0],
349
+ value: protectedReviewField(selected[0], context?.protectedFields) ? "[Protected value]" : selected[1]
350
+ };
351
+ continue;
352
+ }
353
+ const key = escaped.replaceAll("~1", "/").replaceAll("~0", "~");
354
+ if (protectedReviewField(key, context?.protectedFields)) {
355
+ value = "[Protected value]";
356
+ break;
357
+ }
358
+ if (!value || typeof value !== "object" || !Object.hasOwn(value, key))
359
+ throw new Error("Review field not found");
360
+ value = value[key];
361
+ }
362
+ }
363
+ const preview = (entry, key, childPath) => {
364
+ const hidden = protectedReviewField(key, context?.protectedFields);
365
+ if (!hidden && entry !== null && typeof entry === "object") {
366
+ const count = Array.isArray(entry) ? entry.length : Object.keys(entry).length;
367
+ return {
368
+ value: `${count.toLocaleString("en-US")} ${Array.isArray(entry) ? count === 1 ? "item" : "items" : count === 1 ? "field" : "fields"}`,
369
+ path: childPath,
370
+ truncated: true
371
+ };
372
+ }
373
+ const text = valueText(safeReviewValue(entry, key, context?.protectedFields));
374
+ return {
375
+ value: bound(text, 4e3),
376
+ ...hidden ? {} : { path: childPath },
377
+ truncated: !hidden && text.length > 4e3
378
+ };
379
+ };
380
+ const labels = (path === "/messageIds" || path === "/messageId") && context?.selectionLabels?.length ? new Map(context.selectionLabels.map((label) => [label.id, label])) : void 0;
381
+ const labelled = (entry) => {
382
+ const label = typeof entry === "string" ? labels?.get(entry) : void 0;
383
+ return label && typeof entry === "string" ? {
384
+ value: label.title,
385
+ detail: label.subtitle ? `${label.subtitle} \xB7 ${entry}` : entry
386
+ } : void 0;
387
+ };
388
+ let total;
389
+ let items;
390
+ if (Array.isArray(value)) {
391
+ total = value.length;
392
+ items = value.slice(offset, offset + limit).map((entry, index) => ({
393
+ label: `${offset + index + 1}`,
394
+ ...preview(entry, "", `${path}/${offset + index}`),
395
+ ...labelled(entry)
396
+ }));
397
+ } else if (offset === 0 && labelled(value)) {
398
+ total = 1;
399
+ items = [{ label: "Message", ...labelled(value) }];
400
+ } else if (value && typeof value === "object") {
401
+ const entries = Object.entries(value);
402
+ total = entries.length;
403
+ items = entries.slice(offset, offset + limit).map(([key, entry], index) => ({
404
+ label: bound(
405
+ (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key) ? context.fieldLabels[key] : void 0) ?? toolReviewFieldLabel(key),
406
+ 256
407
+ ),
408
+ ...preview(entry, key, `${path}${fieldPointer(key, offset + index, path)}`)
409
+ }));
410
+ } else {
411
+ const text = valueText(value);
412
+ total = Math.max(1, Math.ceil(text.length / 4e3));
413
+ items = Array.from({ length: Math.max(0, Math.min(limit, total - offset)) }, (_, index) => ({
414
+ label: `Part ${offset + index + 1}`,
415
+ value: text.slice((offset + index) * 4e3, (offset + index + 1) * 4e3)
416
+ }));
417
+ }
418
+ return { path, items, total, nextOffset: offset + limit < total ? offset + limit : null };
419
+ }
420
+
421
+ export {
422
+ secretFieldName,
423
+ toolReviewFieldLabel,
424
+ decodeReviewArguments,
425
+ safeReviewValue,
426
+ toolReviewFields,
427
+ appActionReviewSummary,
428
+ toolReviewAction,
429
+ toolReviewDetails
430
+ };
431
+ //# sourceMappingURL=chunk-UCUOTRS6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-review-presentation.ts"],"sourcesContent":["import type {\n ToolActionReview,\n ToolReviewContext,\n ToolReviewDetailsPage,\n} from \"./tool-action-review\";\n\nconst protectedName =\n /password|passwd|passphrase|secret|credential|authorization|cookie|(^|[_-])token($|[_-])|api[_-]?key|accessToken|refreshToken|privateKey/i;\nconst protectedReviewField = (key: string, fields: readonly string[] = []) =>\n protectedName.test(key) || fields.includes(key) || fields.includes(\"*\");\n\nconst SECRET_LAST_WORDS = new Set([\n \"password\",\n \"passwd\",\n \"passphrase\",\n \"secret\",\n \"secrets\",\n \"credential\",\n \"credentials\",\n \"cookie\",\n \"cookies\",\n \"token\",\n \"otp\",\n \"totp\",\n \"dsn\",\n \"authorization\",\n]);\n// \"code\" alone is a sign-in code; \"errorCode\" or \"countryCode\" are not.\nconst SECRET_CODE_KINDS = new Set([\n \"user\",\n \"auth\",\n \"authorization\",\n \"oauth\",\n \"verification\",\n \"setup\",\n \"recovery\",\n \"device\",\n \"otp\",\n]);\nconst SECRET_KEY_KINDS = new Set([\n \"api\",\n \"private\",\n \"access\",\n \"secret\",\n \"signing\",\n \"encryption\",\n \"master\",\n \"license\",\n]);\n// Flags and checks about a secret (\"hasWebhookSecret\", \"expectedCredential…\")\n// say whether one exists, never what it is.\nconst SECRET_FLAG_FIRST_WORDS = new Set([\"has\", \"is\", \"awaiting\", \"can\", \"needs\", \"expected\"]);\n// Facts about a secret (\"credentialVersion\", \"secretName\", \"apiKeyPrefix\")\n// describe it without being it.\nconst SECRET_METADATA_LAST_WORDS = new Set([\n \"version\",\n \"versions\",\n \"id\",\n \"ids\",\n \"count\",\n \"at\",\n \"name\",\n \"names\",\n \"label\",\n \"kind\",\n \"type\",\n \"status\",\n \"mode\",\n \"source\",\n \"ref\",\n \"refs\",\n \"reference\",\n \"references\",\n \"configured\",\n \"present\",\n \"set\",\n \"enabled\",\n \"required\",\n \"length\",\n \"prefix\",\n \"hint\",\n \"fingerprint\",\n \"scope\",\n \"scopes\",\n \"provider\",\n \"expiry\",\n \"expires\",\n \"suffix\",\n \"url\",\n \"uri\",\n \"epoch\",\n]);\n\nfunction nameWords(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_\\s-]+/g, \" \")\n .toLowerCase()\n .split(\" \")\n .filter(Boolean);\n}\n\n/**\n * Whether a field with this name carries a key, password, token, code or\n * other secret, judged by its last word: \"apiKey\", \"clientSecret\", \"code\",\n * \"userCode\" and \"masterPassword\" do; \"credentialVersion\", \"credentialId\",\n * \"errorCode\", \"hasWebhookSecret\" and \"nextPageToken\" don't. The app-action catalog\n * generator marks actions by it and an app action's card hides by it.\n */\nexport function secretFieldName(name: string): boolean {\n const words = nameWords(name);\n const last = words.at(-1);\n const before = words.at(-2);\n if (!last || SECRET_FLAG_FIRST_WORDS.has(words[0]!)) return false;\n if (last === \"token\" && before === \"page\") return false;\n if (SECRET_LAST_WORDS.has(last)) return true;\n if (last === \"code\") return before === undefined || SECRET_CODE_KINDS.has(before);\n if (last === \"key\" && before !== undefined && SECRET_KEY_KINDS.has(before)) return true;\n // A secret word earlier in the name (\"secretValue\", \"privateKeyPem\",\n // \"passwordHash\"), unless the name only describes the secret.\n return protectedName.test(name) && !SECRET_METADATA_LAST_WORDS.has(last);\n}\n\n// Hosts whose webhook URLs carry their secret in the path\n// (\"https://hooks.slack.com/services/T…/B…/<secret>\"), including ones whose\n// secret is too short to look random.\nconst SECRET_PATH_HOSTS =\n /^(hooks\\.slack\\.com|(\\w+\\.)?discord(app)?\\.com|[\\w-]+\\.webhook\\.office\\.com|outlook\\.office\\.com|chat\\.googleapis\\.com|hooks\\.zapier\\.com)$/i;\nconst URL_IN_TEXT = /[a-z][a-z0-9+.-]*:\\/\\/[^\\s\"'<>]+/gi;\n// \"Server=db;User Id=app;Password=…\" and similar key=value connection strings.\nconst CONNECTION_STRING_SECRET =\n /((?:^|;)\\s*(?:password|pwd|user ?password|account ?key|shared ?access ?key|shared ?access ?signature|access ?key|secret|token|sig)\\s*=)[^;]*/gi;\nconst AUTHORIZATION_VALUE = /\\b(Bearer|Basic|Token)\\s+[A-Za-z0-9._~+/=-]{8,}/g;\n// Bare tokens with a well-known shape: OpenAI/Anthropic and Stripe keys,\n// GitHub tokens, Slack tokens, AWS access key IDs and JWTs.\nconst TOKEN_SHAPES =\n /\\b(?:sk-[A-Za-z0-9_-]{16,}|sk_(?:live|test)_[A-Za-z0-9]{16,}|gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[abprs]-[A-Za-z0-9-]{10,}|AKIA[0-9A-Z]{16}|eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,})/g;\n\n/**\n * Whether one URL path segment looks like a random secret rather than a\n * readable name: a long run of letters and digits mixed, or a long opaque\n * token. Slugs (\"getting-started\") and dates stay readable.\n */\nfunction secretLookingPathSegment(segment: string): boolean {\n if (/^[A-Za-z0-9_-]{32,}$/.test(segment)) return true;\n return segment\n .split(/[-_.~]/)\n .some((chunk) => chunk.length >= 12 && /\\d/.test(chunk) && /[A-Za-z]/.test(chunk));\n}\n\n/**\n * One URL with its sign-in parts and query removed, and its path too for\n * webhook hosts that keep the secret there:\n * \"postgres://app:pw@db:5432/x\" → \"postgres://db:5432/x\",\n * \"https://hooks.example.com/in?token=…\" → \"https://hooks.example.com/in\",\n * \"https://hooks.slack.com/services/…\" → \"https://hooks.slack.com/…\",\n * and any random-looking path segment hidden:\n * \"https://example.com/hooks/a1b2c3d4e5f6g7h8\" → \"https://example.com/hooks/…\".\n */\nfunction withoutUrlSecret(url: string): string {\n const scheme = url.slice(0, url.indexOf(\"://\") + 3);\n const rest = url.slice(scheme.length).split(/[?#]/, 1)[0]!;\n // The last \"@\" ends the sign-in part even when an unencoded password holds\n // a \"/\"; a path with an \"@\" in it only loses its start.\n const address = rest.slice(rest.lastIndexOf(\"@\") + 1);\n const host = address.split(\"/\", 1)[0]!;\n const hostname = host.replace(/:\\d+$/, \"\");\n if (SECRET_PATH_HOSTS.test(hostname) && address.length > host.length + 1) {\n return `${scheme}${host}/…`;\n }\n const path = address\n .slice(host.length)\n .split(\"/\")\n .map((segment) => (secretLookingPathSegment(segment) ? \"…\" : segment))\n .join(\"/\");\n return `${scheme}${host}${path}`;\n}\n\n/**\n * Text with the secrets it may carry removed: the sign-in parts, query and\n * webhook paths of every URL in it, password-like parts of a connection\n * string, bearer or basic credentials, and bare tokens of a well-known shape.\n */\nfunction withoutTextSecrets(text: string): string {\n return text\n .replace(URL_IN_TEXT, withoutUrlSecret)\n .replace(CONNECTION_STRING_SECRET, \"$1[Protected value]\")\n .replace(AUTHORIZATION_VALUE, \"$1 [Protected value]\")\n .replace(TOKEN_SHAPES, \"[Protected value]\");\n}\nconst bound = (value: string, limit: number) =>\n value.length > limit ? `${value.slice(0, limit)}…` : value;\nexport function toolReviewFieldLabel(key: string): string {\n const label = key\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\bids?\\b/gi, (word) => (word.length === 3 ? \"IDs\" : \"ID\"))\n .replace(\n /\\b(api|url|uri|http|https|ip|sql|json|html)(s?)\\b/gi,\n (_word, name: string, plural: string) => `${name.toUpperCase()}${plural}`,\n )\n // Sentence case, keeping acronyms: \"Working Directory\" → \"Working directory\".\n .replace(\n /(?<=\\S\\s+)([A-Z])([a-z]+)\\b/g,\n (_word, first: string, rest: string) => `${first.toLowerCase()}${rest}`,\n )\n .trim();\n return label.charAt(0).toUpperCase() + label.slice(1);\n}\nexport function decodeReviewArguments(value: unknown): Record<string, unknown> | null {\n // Historical SDK entries sometimes wrapped arguments in JSON. Decode only once.\n let decoded = value;\n if (typeof decoded === \"string\") {\n try {\n decoded = JSON.parse(decoded);\n } catch {\n return null;\n }\n }\n return decoded && typeof decoded === \"object\" && !Array.isArray(decoded)\n ? (decoded as Record<string, unknown>)\n : null;\n}\nexport function safeReviewValue(\n value: unknown,\n key = \"\",\n protectedFields: readonly string[] = [],\n depth = 0,\n): unknown {\n if (protectedReviewField(key, protectedFields)) return \"[Protected value]\";\n if (depth > 20) return \"[Nested value; open this field for details]\";\n if (Array.isArray(value))\n return value.map((entry) => safeReviewValue(entry, \"\", protectedFields, depth + 1));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value).map(([name, entry]) => [\n name,\n safeReviewValue(entry, name, protectedFields, depth + 1),\n ]),\n );\n return value;\n}\nfunction valueText(value: unknown): string {\n return typeof value === \"string\"\n ? value\n : value === null\n ? \"None\"\n : typeof value === \"boolean\"\n ? value\n ? \"Yes\"\n : \"No\"\n : (JSON.stringify(value) ?? \"Unavailable\");\n}\nconst pointer = (name: string) => `/${name.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`;\n// Long arbitrary property names remain readable without placing them in every\n// preview or URL. An indexed segment opens their saved name and value together.\nconst fieldPointer = (key: string, index: number, parent = \"\") =>\n pointer(key).length > 256 || parent.length + pointer(key).length > 1024\n ? `/~2${index}`\n : pointer(key);\n\nexport function toolReviewFields(\n argumentsValue: unknown,\n context?: ToolReviewContext,\n toolName?: string,\n): { fields: ToolActionReview[\"fields\"]; moreFields: number } {\n // An app action's card says what it does in one plain line (its\n // consequence); its raw arguments (action id, path, body) stay in Details.\n if (toolName === APP_ACTION_REVIEW_TOOL) return { fields: [], moreFields: 0 };\n const args = decodeReviewArguments(argumentsValue);\n if (!args) return { fields: [], moreFields: 0 };\n const entries = Object.entries(args);\n if (context?.email) {\n const email = toolReviewFields(context.email);\n const original = toolReviewFields(args, { ...context, email: undefined });\n const fields = [\n ...email.fields\n .filter(\n (field) =>\n field.path !== \"/contentSha256\" && field.path !== \"/htmlBody\" && field.preview !== \"\",\n )\n .map((field) => ({\n ...field,\n label: field.path === \"/textBody\" ? \"Message\" : field.label,\n path: `/$email${field.path}`,\n ...(field.path === \"/attachments\"\n ? {\n preview: context\n .email!.attachments.map((attachment) => attachment.name)\n .join(\", \")\n .slice(0, 240),\n }\n : {}),\n })),\n ...original.fields.filter(\n (field) =>\n ![\n \"/raw\",\n \"/expectedContentSha256\",\n \"/from\",\n \"/to\",\n \"/cc\",\n \"/bcc\",\n \"/subject\",\n \"/body\",\n \"/textBody\",\n \"/htmlBody\",\n \"/attachments\",\n ].includes(field.path),\n ),\n ];\n return {\n fields: fields.slice(0, 16),\n moreFields: original.moreFields + Math.max(0, fields.length - 16),\n };\n }\n return {\n moreFields: Math.max(0, entries.length - 16),\n fields: entries.slice(0, 16).map(([key, value], index) => {\n const hidden = protectedReviewField(key, context?.protectedFields);\n const safe = hidden ? \"[Protected value]\" : value;\n const count = !hidden && Array.isArray(value) ? value.length : undefined;\n const compactList =\n !hidden &&\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (entry) =>\n typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\",\n )\n ? value.map(valueText).join(\", \")\n : undefined;\n const text =\n compactList !== undefined\n ? compactList\n : count !== undefined\n ? `${count.toLocaleString(\"en-US\")} item${count === 1 ? \"\" : \"s\"}`\n : safe && typeof safe === \"object\"\n ? `${Object.keys(safe).length} field${Object.keys(safe).length === 1 ? \"\" : \"s\"}`\n : valueText(safe);\n return {\n path: fieldPointer(key, index),\n label: bound(\n (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key)\n ? context.fieldLabels[key]\n : undefined) ?? toolReviewFieldLabel(key),\n 256,\n ),\n preview: bound(text, 240),\n ...(count !== undefined ? { count } : {}),\n truncated:\n !hidden &&\n (text.length > 240 ||\n (compactList === undefined && typeof value === \"object\" && value !== null)),\n ...(hidden ? { protected: true } : {}),\n };\n }),\n };\n}\n\n/** The tool that runs an app action as the person (see @opengeni/contracts/app-actions). */\nconst APP_ACTION_REVIEW_TOOL = \"admin_action_call\";\n// Bookkeeping and opaque identifiers say nothing a person can check.\nconst APP_ACTION_UNREADABLE_KEY =\n /^(id|operationId|idempotencyKey|expiresAt|expectedVersion|expectedRevision|expectedEtag)$|Ids?$/;\n\n/**\n * One short readable line of an app action's key values, for example\n * \"Email: anna@example.com · Role: admin\", taken from its body and query.\n * Values are shown as labelled data, never as the question itself. Secrets\n * (by field name), and the secrets text can carry (URL sign-in parts, queries\n * and webhook paths, connection string passwords, bearer credentials), are\n * never shown.\n */\nexport function appActionReviewSummary(argumentsValue: unknown): string | undefined {\n const args = decodeReviewArguments(argumentsValue);\n if (!args) return undefined;\n const parts: string[] = [];\n const visit = (key: string, value: unknown, depth: number) => {\n if (parts.length >= 4 || APP_ACTION_UNREADABLE_KEY.test(key)) return;\n if (secretFieldName(key)) {\n parts.push(`${toolReviewFieldLabel(key)}: [Protected value]`);\n return;\n }\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n if (depth < 2)\n for (const [name, entry] of Object.entries(value)) visit(name, entry, depth + 1);\n return;\n }\n const scalar = (entry: unknown) =>\n entry === null || [\"string\", \"number\", \"boolean\"].includes(typeof entry);\n const shown = (entry: unknown) =>\n valueText(typeof entry === \"string\" ? withoutTextSecrets(entry.trim()) : entry);\n const text = Array.isArray(value)\n ? value.length > 0 && value.length <= 4 && value.every(scalar)\n ? value.map(shown).join(\", \")\n : \"\"\n : scalar(value)\n ? shown(value)\n : \"\";\n const line = text.replace(/\\s+/g, \" \").trim();\n if (line) parts.push(`${toolReviewFieldLabel(key)}: ${bound(line, 80)}`);\n };\n for (const source of [args.body, args.query]) {\n if (source && typeof source === \"object\" && !Array.isArray(source))\n for (const [name, entry] of Object.entries(source)) visit(name, entry, 0);\n }\n return parts.length > 0 ? bound(parts.join(\" · \"), 240) : undefined;\n}\n\n/** Deterministic consequences from the reviewed bytes. Unknown fields remain visible. */\nexport function toolReviewAction(\n toolName: string,\n argumentsValue: unknown,\n context?: ToolReviewContext,\n): Pick<\n ToolActionReview,\n \"title\" | \"approveLabel\" | \"effects\" | \"consequence\" | \"selectionCount\" | \"selectionKind\"\n> {\n const fallback = {\n title:\n context?.title ??\n bound(\n toolReviewFieldLabel(\n toolName.replace(/^mcp_[^_]+__/, \"\").replace(/^batch[_-](?=[a-z])/i, \"\"),\n ),\n 256,\n ),\n // An app action's card asks the person a plain question (\"Invite … to\n // your organization?\"), so its button answers it.\n approveLabel: toolName === APP_ACTION_REVIEW_TOOL ? \"Allow\" : \"Approve action\",\n effects: [] as string[],\n };\n if (toolName === APP_ACTION_REVIEW_TOOL) {\n const consequence = appActionReviewSummary(argumentsValue);\n return consequence ? { ...fallback, consequence } : fallback;\n }\n if (context?.kind !== \"gmail\") return fallback;\n const args = decodeReviewArguments(argumentsValue);\n if (!args) return fallback;\n const thread = toolName.endsWith(\"_thread\");\n const selectionKind = thread ? (\"threads\" as const) : (\"messages\" as const);\n const ids =\n thread && typeof args.threadId === \"string\"\n ? [args.threadId]\n : Array.isArray(args.messageIds)\n ? args.messageIds\n : typeof args.messageId === \"string\"\n ? [args.messageId]\n : null;\n const selectionCount = ids?.every((id) => typeof id === \"string\") ? new Set(ids).size : undefined;\n const noun =\n selectionCount === undefined\n ? thread\n ? \"conversations\"\n : \"messages\"\n : `${selectionCount.toLocaleString(\"en-US\")} ${thread ? \"conversation\" : \"message\"}${selectionCount === 1 ? \"\" : \"s\"}`;\n const addValues = toolName.startsWith(\"label_\") ? args.labelIds : args.addLabelIds;\n const adds = Array.isArray(addValues)\n ? addValues.filter((v): v is string => typeof v === \"string\")\n : [];\n const removeValues = toolName.startsWith(\"unlabel_\") ? args.labelIds : args.removeLabelIds;\n const removes = Array.isArray(removeValues)\n ? removeValues.filter((v): v is string => typeof v === \"string\")\n : [];\n const labelEffect = (label: string, adding: boolean): string => {\n const known: Record<string, [string, string]> = {\n TRASH: [\"Move to Trash\", \"Remove from Trash\"],\n INBOX: [\"Move to Inbox\", \"Remove from Inbox\"],\n UNREAD: [\"Mark as unread\", \"Mark as read\"],\n STARRED: [\"Add star\", \"Remove star\"],\n SPAM: [\"Mark as spam\", \"Remove from Spam\"],\n IMPORTANT: [\"Mark as important\", \"Remove importance\"],\n };\n return (\n (Object.hasOwn(known, label) ? known[label]?.[adding ? 0 : 1] : undefined) ??\n `${adding ? \"Add\" : \"Remove\"} label ${bound(label, 120)}`\n );\n };\n const effects = [\n ...adds.map((id) => labelEffect(id, true)),\n ...removes.map((id) => labelEffect(id, false)),\n ];\n if (\n [\n \"batch_modify_messages\",\n \"modify_message\",\n \"modify_thread\",\n \"label_message\",\n \"label_thread\",\n \"unlabel_message\",\n \"unlabel_thread\",\n ].includes(toolName)\n ) {\n const trash = adds.includes(\"TRASH\");\n return {\n title: trash ? `Move ${noun} to Trash` : `Update ${noun}`,\n approveLabel: trash ? \"Move to Trash\" : \"Apply changes\",\n effects,\n ...(selectionCount === undefined ? {} : { selectionCount, selectionKind }),\n ...(trash\n ? { consequence: \"Messages stay recoverable in Trash until Gmail deletes them.\" }\n : thread\n ? { consequence: \"Applies to every message in the conversation.\" }\n : {}),\n };\n }\n if ([\"trash_message\", \"restore_message\", \"trash_thread\", \"restore_thread\"].includes(toolName))\n return {\n title: toolName.startsWith(\"trash_\") ? `Move ${noun} to Trash` : `Remove ${noun} from Trash`,\n approveLabel: toolName.startsWith(\"trash_\") ? \"Move to Trash\" : \"Remove from Trash\",\n effects,\n ...(selectionCount === undefined ? {} : { selectionCount, selectionKind }),\n };\n const named: Record<string, [string, string]> = {\n send_message: [\"Send email\", \"Send email\"],\n send_draft: [\"Send draft\", \"Send draft\"],\n create_draft: [\"Create email draft\", \"Create draft\"],\n update_draft: [\"Update email draft\", \"Update draft\"],\n delete_draft: [\"Delete email draft\", \"Delete draft\"],\n create_label: [\"Create label\", \"Create label\"],\n update_label: [\"Update label\", \"Update label\"],\n delete_label: [\"Delete label\", \"Delete label\"],\n };\n const action = Object.hasOwn(named, toolName) ? named[toolName] : undefined;\n return action ? { title: action[0], approveLabel: action[1], effects } : fallback;\n}\n\n/** A bounded slice of the immutable saved arguments; never evaluates a fresh provider query. */\nexport function toolReviewDetails(\n argumentsValue: unknown,\n context: ToolReviewContext | undefined,\n path: string,\n offset: number,\n limit = 25,\n): Omit<ToolReviewDetailsPage, \"id\" | \"actionDigest\" | \"version\"> {\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 50\n )\n throw new Error(\"Invalid review page\");\n const args = decodeReviewArguments(argumentsValue);\n let value: unknown = context?.email ? { ...args, $email: context.email } : args;\n if (path !== \"\") {\n if (!path.startsWith(\"/\")) throw new Error(\"Invalid review field\");\n for (const escaped of path.slice(1).split(\"/\")) {\n if (/^~2\\d+$/.test(escaped)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"Review field not found\");\n const selected = Object.entries(value)[Number(escaped.slice(2))];\n if (!selected) throw new Error(\"Review field not found\");\n value = {\n fieldName: selected[0],\n value: protectedReviewField(selected[0], context?.protectedFields)\n ? \"[Protected value]\"\n : selected[1],\n };\n continue;\n }\n const key = escaped.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n if (protectedReviewField(key, context?.protectedFields)) {\n value = \"[Protected value]\";\n break;\n }\n if (!value || typeof value !== \"object\" || !Object.hasOwn(value, key))\n throw new Error(\"Review field not found\");\n value = (value as Record<string, unknown>)[key];\n }\n }\n type DetailItem = ToolReviewDetailsPage[\"items\"][number];\n const preview = (\n entry: unknown,\n key: string,\n childPath: string,\n ): Pick<DetailItem, \"value\" | \"truncated\" | \"path\"> => {\n const hidden = protectedReviewField(key, context?.protectedFields);\n if (!hidden && entry !== null && typeof entry === \"object\") {\n const count = Array.isArray(entry) ? entry.length : Object.keys(entry).length;\n return {\n value: `${count.toLocaleString(\"en-US\")} ${Array.isArray(entry) ? (count === 1 ? \"item\" : \"items\") : count === 1 ? \"field\" : \"fields\"}`,\n path: childPath,\n truncated: true,\n };\n }\n const text = valueText(safeReviewValue(entry, key, context?.protectedFields));\n return {\n value: bound(text, 4000),\n ...(hidden ? {} : { path: childPath }),\n truncated: !hidden && text.length > 4000,\n };\n };\n // Selected messages read as subject and sender rather than bare provider ids.\n const labels =\n (path === \"/messageIds\" || path === \"/messageId\") && context?.selectionLabels?.length\n ? new Map(context.selectionLabels.map((label) => [label.id, label]))\n : undefined;\n const labelled = (entry: unknown): Pick<DetailItem, \"value\" | \"detail\"> | undefined => {\n const label = typeof entry === \"string\" ? labels?.get(entry) : undefined;\n return label && typeof entry === \"string\"\n ? {\n value: label.title,\n detail: label.subtitle ? `${label.subtitle} · ${entry}` : entry,\n }\n : undefined;\n };\n let total: number;\n let items: DetailItem[];\n if (Array.isArray(value)) {\n total = value.length;\n items = value.slice(offset, offset + limit).map((entry, index) => ({\n label: `${offset + index + 1}`,\n ...preview(entry, \"\", `${path}/${offset + index}`),\n ...labelled(entry),\n }));\n } else if (offset === 0 && labelled(value)) {\n total = 1;\n items = [{ label: \"Message\", ...labelled(value)! }];\n } else if (value && typeof value === \"object\") {\n const entries = Object.entries(value);\n total = entries.length;\n items = entries.slice(offset, offset + limit).map(([key, entry], index) => ({\n label: bound(\n (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key)\n ? context.fieldLabels[key]\n : undefined) ?? toolReviewFieldLabel(key),\n 256,\n ),\n ...preview(entry, key, `${path}${fieldPointer(key, offset + index, path)}`),\n }));\n } else {\n const text = valueText(value);\n total = Math.max(1, Math.ceil(text.length / 4000));\n items = Array.from({ length: Math.max(0, Math.min(limit, total - offset)) }, (_, index) => ({\n label: `Part ${offset + index + 1}`,\n value: text.slice((offset + index) * 4000, (offset + index + 1) * 4000),\n }));\n }\n return { path, items, total, nextOffset: offset + limit < total ? offset + limit : null };\n}\n"],"mappings":"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","names":[]}