@beeuni/sdk 0.2.0 → 0.3.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 (231) hide show
  1. package/README.md +19 -10
  2. package/dist/beeuni.esm.min.js +37 -35
  3. package/dist/beeuni.global.js +37 -35
  4. package/dist/browser/cache/idb-sync-cache.js +15 -5
  5. package/dist/browser/session-sync/server-transcript-mirror.d.ts +7 -1
  6. package/dist/browser/session-sync/server-transcript-mirror.js +30 -24
  7. package/dist/browser/session-sync/session-sync-registry.d.ts +3 -1
  8. package/dist/browser/session-sync/session-sync-registry.js +48 -3
  9. package/dist/browser/stores/sync-store/keep-unchanged.d.ts +4 -0
  10. package/dist/browser/stores/sync-store/keep-unchanged.js +34 -0
  11. package/dist/browser/stores/sync-store.d.ts +1 -0
  12. package/dist/browser/stores/sync-store.js +72 -16
  13. package/dist/core/attachments/prompt-attachments.d.ts +4 -0
  14. package/dist/core/attachments/prompt-attachments.js +34 -0
  15. package/dist/core/capture/rules.d.ts +17 -0
  16. package/dist/core/capture/rules.js +27 -0
  17. package/dist/core/client/beeuni.d.ts +92 -5
  18. package/dist/core/client/beeuni.js +2 -0
  19. package/dist/core/client/capture.d.ts +105 -0
  20. package/dist/core/client/capture.js +48 -0
  21. package/dist/core/client/facade-identity.d.ts +1 -0
  22. package/dist/core/client/facade-identity.js +1 -0
  23. package/dist/core/client/project-access-resources.d.ts +3 -1
  24. package/dist/core/client/project-access-resources.js +1 -1
  25. package/dist/core/client/project-operations-admin.d.ts +4 -4
  26. package/dist/core/client/project-operations-review.d.ts +2 -3
  27. package/dist/core/client/project-operations-review.js +1 -0
  28. package/dist/core/client/project-operations-workspace.d.ts +4 -4
  29. package/dist/core/client/project-operations-workspace.js +1 -1
  30. package/dist/core/client/project-operations.d.ts +5 -4
  31. package/dist/core/client/session-context.d.ts +2 -0
  32. package/dist/core/client/session-handle.d.ts +13 -0
  33. package/dist/core/client/session-lifecycle-resources.d.ts +11 -0
  34. package/dist/core/client/session-lifecycle-resources.js +4 -0
  35. package/dist/core/client/session-lifecycle-security.d.ts +2 -0
  36. package/dist/core/client/session-lifecycle-security.js +1 -0
  37. package/dist/core/client/session-readiness.d.ts +2 -0
  38. package/dist/core/client/session-readiness.js +20 -1
  39. package/dist/core/http/api-client.d.ts +1 -0
  40. package/dist/core/http/api-client.js +1 -0
  41. package/dist/core/http/config.d.ts +2 -0
  42. package/dist/core/http/response-error.js +26 -11
  43. package/dist/core/http/transport.js +6 -1
  44. package/dist/core/models/composer-model.d.ts +14 -0
  45. package/dist/core/models/composer-model.js +21 -1
  46. package/dist/core/rest/platform-client/capture.d.ts +363 -0
  47. package/dist/core/rest/platform-client/capture.js +116 -0
  48. package/dist/core/rest/platform-client/index.d.ts +1 -0
  49. package/dist/core/rest/platform-client/index.js +1 -0
  50. package/dist/core/rest/platform-client/lifecycle.js +18 -12
  51. package/dist/core/rest/platform-client/shared.d.ts +5 -0
  52. package/dist/core/rest/platform-client/shared.js +18 -0
  53. package/dist/core/rest/projects-client/account-secret-resources.d.ts +2 -1
  54. package/dist/core/rest/projects-client/accounts.d.ts +34 -0
  55. package/dist/core/rest/projects-client/accounts.js +10 -0
  56. package/dist/core/rest/projects-client/admin-providers.d.ts +0 -61
  57. package/dist/core/rest/projects-client/admin-providers.js +0 -6
  58. package/dist/core/rest/projects-client/agent-config.d.ts +3 -0
  59. package/dist/core/rest/projects-client/apps-fleet.d.ts +5 -1
  60. package/dist/core/rest/projects-client/apps-fleet.js +2 -2
  61. package/dist/core/rest/projects-client/apps.d.ts +3 -0
  62. package/dist/core/rest/projects-client/change-requests.d.ts +2 -0
  63. package/dist/core/rest/projects-client/change-requests.js +2 -0
  64. package/dist/core/rest/projects-client/connectors.d.ts +7 -0
  65. package/dist/core/rest/projects-client/connectors.js +3 -0
  66. package/dist/core/rest/projects-client/files.d.ts +3 -0
  67. package/dist/core/rest/projects-client/files.js +4 -0
  68. package/dist/core/rest/projects-client/gateway.d.ts +5 -0
  69. package/dist/core/rest/projects-client/iam-actions.d.ts +76 -0
  70. package/dist/core/rest/projects-client/iam-actions.js +101 -0
  71. package/dist/core/rest/projects-client/iam.d.ts +1 -0
  72. package/dist/core/rest/projects-client/iam.js +1 -0
  73. package/dist/core/rest/projects-client/notifications.d.ts +1 -1
  74. package/dist/core/rest/projects-client/notifications.js +4 -0
  75. package/dist/core/rest/projects-client/projects.d.ts +3 -2
  76. package/dist/core/rest/projects-client/projects.js +2 -3
  77. package/dist/core/rest/projects-client/review-items.d.ts +2 -0
  78. package/dist/core/rest/projects-client/review-items.js +4 -0
  79. package/dist/core/rest/projects-client/review.d.ts +17 -3
  80. package/dist/core/rest/projects-client/review.js +11 -0
  81. package/dist/core/rest/projects-client/secrets.d.ts +3 -0
  82. package/dist/core/rest/projects-client/session-attachments.js +14 -1
  83. package/dist/core/rest/projects-client/sessions.d.ts +29 -2
  84. package/dist/core/rest/projects-client/sessions.js +34 -4
  85. package/dist/core/runtime/runtime-rest-client.js +1 -1
  86. package/dist/core/runtime/runtime-types.d.ts +1 -0
  87. package/dist/core/session/open-bundle.d.ts +4 -4
  88. package/dist/core/session/open-bundle.js +29 -46
  89. package/dist/core/session/turn-end-watch.d.ts +47 -0
  90. package/dist/core/session/turn-end-watch.js +141 -0
  91. package/dist/core/session-log/index.d.ts +4 -0
  92. package/dist/core/session-log/index.js +3 -0
  93. package/dist/core/session-log/tool-call.d.ts +7 -2
  94. package/dist/core/session-log/tool-call.js +25 -6
  95. package/dist/core/session-log/turns/blocks.d.ts +60 -0
  96. package/dist/core/session-log/turns/blocks.js +124 -0
  97. package/dist/core/session-log/turns/history.d.ts +32 -0
  98. package/dist/core/session-log/turns/history.js +99 -0
  99. package/dist/core/session-log/turns/index.d.ts +4 -0
  100. package/dist/core/session-log/turns/index.js +4 -0
  101. package/dist/core/session-log/turns/metrics.d.ts +21 -0
  102. package/dist/core/session-log/turns/metrics.js +29 -0
  103. package/dist/core/session-log/turns/turn.d.ts +55 -0
  104. package/dist/core/session-log/turns/turn.js +279 -0
  105. package/dist/core/session-log/turns/v1-parts.d.ts +8 -0
  106. package/dist/core/session-log/turns/v1-parts.js +43 -0
  107. package/dist/core/session-log/v1-view.d.ts +5 -2
  108. package/dist/core/session-log/v1-view.js +86 -22
  109. package/dist/core/session-log/v1.js +10 -3
  110. package/dist/core/session-sync/saved-transcript.d.ts +15 -1
  111. package/dist/core/session-sync/saved-transcript.js +55 -0
  112. package/dist/core/session-sync/session-sync-controller.js +3 -0
  113. package/dist/core/stream/event-stream.js +3 -3
  114. package/dist/core/turns/classify.js +4 -2
  115. package/dist/core/turns/edit-blocks.d.ts +1 -0
  116. package/dist/core/turns/edit-blocks.js +15 -0
  117. package/dist/core/turns/segments/burst-summary.d.ts +1 -0
  118. package/dist/core/turns/segments/burst-summary.js +24 -0
  119. package/dist/core/turns/segments/group-steps.d.ts +4 -3
  120. package/dist/core/turns/segments/group-steps.js +9 -6
  121. package/dist/core/turns/segments/narration.d.ts +5 -4
  122. package/dist/core/turns/segments/narration.js +12 -3
  123. package/dist/core/turns/segments/session-activity-groups.d.ts +2 -1
  124. package/dist/core/turns/segments/session-activity-groups.js +3 -1
  125. package/dist/core/turns/segments/step-label.d.ts +2 -1
  126. package/dist/core/turns/segments/step-label.js +3 -1
  127. package/dist/core/turns/segments/working-turn.d.ts +4 -2
  128. package/dist/core/turns/segments/working-turn.js +9 -8
  129. package/dist/core/turns/tool-kind.d.ts +1 -1
  130. package/dist/core/turns/tool-kind.js +3 -2
  131. package/dist/core/turns/tool-registry.js +1 -0
  132. package/dist/core/turns/tools/tool-meta.d.ts +1 -1
  133. package/dist/core/turns/tools/tool-meta.js +3 -2
  134. package/dist/core/turns/view-model.js +1 -13
  135. package/dist/genui/catalog.d.ts +28 -0
  136. package/dist/genui/catalog.js +396 -0
  137. package/dist/genui/expansion.d.ts +3 -0
  138. package/dist/genui/expansion.js +295 -0
  139. package/dist/genui/fence-entry.d.ts +2 -0
  140. package/dist/genui/fence-entry.js +1 -0
  141. package/dist/genui/fence.d.ts +21 -0
  142. package/dist/genui/fence.js +138 -0
  143. package/dist/genui/index.d.ts +6 -0
  144. package/dist/genui/index.js +6 -0
  145. package/dist/genui/markdown.d.ts +12 -0
  146. package/dist/genui/markdown.js +104 -0
  147. package/dist/genui/parse.d.ts +6 -0
  148. package/dist/genui/parse.js +75 -0
  149. package/dist/genui/prompt.d.ts +2 -0
  150. package/dist/genui/prompt.js +206 -0
  151. package/dist/genui/react/default-components.d.ts +2 -0
  152. package/dist/genui/react/default-components.js +72 -0
  153. package/dist/genui/react/default-components.test.d.ts +1 -0
  154. package/dist/genui/react/default-components.test.js +94 -0
  155. package/dist/genui/react/genui-block-disabled.test.d.ts +1 -0
  156. package/dist/genui/react/genui-block-disabled.test.js +50 -0
  157. package/dist/genui/react/genui-block.d.ts +28 -0
  158. package/dist/genui/react/genui-block.js +91 -0
  159. package/dist/genui/react/genui-block.test.d.ts +1 -0
  160. package/dist/genui/react/genui-block.test.js +205 -0
  161. package/dist/genui/react/index.d.ts +2 -0
  162. package/dist/genui/react/index.js +2 -0
  163. package/dist/genui/share.d.ts +5 -0
  164. package/dist/genui/share.js +30 -0
  165. package/dist/genui/test-fixtures.d.ts +2 -0
  166. package/dist/genui/test-fixtures.js +16 -0
  167. package/dist/genui/types.d.ts +29 -0
  168. package/dist/genui/types.js +1 -0
  169. package/dist/genui/urls.d.ts +1 -0
  170. package/dist/genui/urls.js +18 -0
  171. package/dist/genui/validate.d.ts +9 -0
  172. package/dist/genui/validate.js +116 -0
  173. package/dist/index.d.ts +2 -2
  174. package/dist/index.js +2 -2
  175. package/dist/internal/connector-catalog.d.ts +1 -0
  176. package/dist/platform/ui.d.ts +8 -2
  177. package/dist/platform/ui.js +19 -4
  178. package/dist/react/chat/use-chat-turns.d.ts +1 -1
  179. package/dist/react/human-presence.d.ts +9 -0
  180. package/dist/react/human-presence.js +12 -0
  181. package/dist/react/index.d.ts +4 -0
  182. package/dist/react/index.js +4 -0
  183. package/dist/react/opencode.d.ts +1 -1
  184. package/dist/react/opencode.js +1 -1
  185. package/dist/react/query-contracts.d.ts +6 -0
  186. package/dist/react/query-contracts.js +6 -0
  187. package/dist/react/query-keys.d.ts +17 -1
  188. package/dist/react/query-keys.js +24 -1
  189. package/dist/react/reset-identity-state.js +2 -0
  190. package/dist/react/session-cache-write.d.ts +1 -0
  191. package/dist/react/session-cache-write.js +20 -0
  192. package/dist/react/session-transcript-subscription.js +1 -1
  193. package/dist/react/sign-in-with-beeuni.d.ts +5 -5
  194. package/dist/react/turn-end-handoff.d.ts +13 -0
  195. package/dist/react/turn-end-handoff.js +101 -0
  196. package/dist/react/use-admin-providers.d.ts +0 -3
  197. package/dist/react/use-admin-providers.js +1 -11
  198. package/dist/react/use-capture.d.ts +47 -0
  199. package/dist/react/use-capture.js +173 -0
  200. package/dist/react/use-feature-flag.js +1 -0
  201. package/dist/react/use-opencode-events/handle-interaction-event.js +8 -3
  202. package/dist/react/use-opencode-events/handle-session-event.js +13 -8
  203. package/dist/react/use-opencode-events/handler-context.d.ts +1 -0
  204. package/dist/react/use-opencode-events/helpers.d.ts +1 -0
  205. package/dist/react/use-opencode-events/helpers.js +11 -1
  206. package/dist/react/use-opencode-local.d.ts +5 -1
  207. package/dist/react/use-opencode-local.js +15 -2
  208. package/dist/react/use-opencode-sessions/commands.d.ts +11 -1
  209. package/dist/react/use-opencode-sessions/commands.js +21 -1
  210. package/dist/react/use-opencode-sessions/permissions.js +28 -1
  211. package/dist/react/use-project-sessions.d.ts +1 -1
  212. package/dist/react/use-project-sessions.js +6 -5
  213. package/dist/react/use-prompt-attachments.js +1 -0
  214. package/dist/react/use-review-summary.d.ts +13 -0
  215. package/dist/react/use-review-summary.js +32 -0
  216. package/dist/react/use-runtime-reconnect.js +2 -2
  217. package/dist/react/use-session-list-state.d.ts +6 -0
  218. package/dist/react/use-session-list-state.js +33 -0
  219. package/dist/react/use-session-log.d.ts +3 -2
  220. package/dist/react/use-session-log.js +26 -17
  221. package/dist/react/use-session-messages.d.ts +2 -1
  222. package/dist/react/use-session-messages.js +15 -14
  223. package/dist/react/use-session-stream.js +12 -1
  224. package/dist/react/use-session-sync.d.ts +2 -2
  225. package/dist/react/use-session-sync.js +10 -8
  226. package/dist/react/use-session-transcript-history.js +2 -12
  227. package/dist/react/use-session-working.d.ts +2 -0
  228. package/dist/react/use-session-working.js +10 -0
  229. package/dist/react/use-session.d.ts +6 -0
  230. package/dist/react/use-session.js +87 -7
  231. package/package.json +49 -3
@@ -0,0 +1,116 @@
1
+ import { backendApi } from '../../http/api-client.js';
2
+ import { unwrap } from '../projects-client/shared.js';
3
+ export * from '../../capture/rules.js';
4
+ export function captureHealthBucket(device) {
5
+ const { state, idle } = device.health;
6
+ if (state === 'healthy')
7
+ return idle ? 'idle' : 'recording';
8
+ return state;
9
+ }
10
+ const base = (accountId) => `/accounts/${accountId}/capture`;
11
+ function captureQuery(params) {
12
+ const search = new URLSearchParams();
13
+ for (const [key, value] of Object.entries(params)) {
14
+ if (value !== undefined && value !== '')
15
+ search.set(key, String(value));
16
+ }
17
+ const query = search.toString();
18
+ return query ? `?${query}` : '';
19
+ }
20
+ const searchParams = (query) => captureQuery({
21
+ q: query.q,
22
+ kinds: query.kinds?.join(','),
23
+ app: query.app,
24
+ limit: query.limit,
25
+ from: query.from,
26
+ to: query.to,
27
+ user_id: query.userId,
28
+ device_id: query.deviceId,
29
+ scope: query.scope,
30
+ });
31
+ const windowParams = (query = {}) => ({
32
+ day: query.day,
33
+ from: query.from,
34
+ to: query.to,
35
+ user_id: query.userId,
36
+ device_id: query.deviceId,
37
+ display_id: query.displayId,
38
+ });
39
+ export async function listCaptureDevices(accountId, opts = {}) {
40
+ return unwrap(await backendApi.get(`${base(accountId)}/devices${captureQuery({ user_id: opts.userId, scope: opts.scope })}`));
41
+ }
42
+ export async function revokeCaptureDevice(accountId, deviceId) {
43
+ return unwrap(await backendApi.delete(`${base(accountId)}/devices/${deviceId}`));
44
+ }
45
+ export async function linkCaptureDevice(accountId, deviceId, userId) {
46
+ return unwrap(await backendApi.put(`${base(accountId)}/devices/${deviceId}/link`, { user_id: userId }));
47
+ }
48
+ export async function listCaptureEnrollmentTokens(accountId) {
49
+ return unwrap(await backendApi.get(`${base(accountId)}/enrollment-tokens`));
50
+ }
51
+ export async function createCaptureEnrollmentToken(accountId, input) {
52
+ return unwrap(await backendApi.post(`${base(accountId)}/enrollment-tokens`, input));
53
+ }
54
+ export async function revokeCaptureEnrollmentToken(accountId, tokenId) {
55
+ return unwrap(await backendApi.delete(`${base(accountId)}/enrollment-tokens/${tokenId}`));
56
+ }
57
+ export async function listCaptureEnrollments(accountId, opts = {}) {
58
+ return unwrap(await backendApi.get(`${base(accountId)}/enrollments${captureQuery({ status: opts.status })}`));
59
+ }
60
+ export async function approveCaptureEnrollment(accountId, enrollmentId, userId) {
61
+ return unwrap(await backendApi.post(`${base(accountId)}/enrollments/${enrollmentId}/approve`, userId ? { user_id: userId } : {}));
62
+ }
63
+ export async function denyCaptureEnrollment(accountId, enrollmentId) {
64
+ return unwrap(await backendApi.post(`${base(accountId)}/enrollments/${enrollmentId}/deny`, {}));
65
+ }
66
+ export async function getCapturePolicy(accountId) {
67
+ return unwrap(await backendApi.get(`${base(accountId)}/policy`));
68
+ }
69
+ export async function setCapturePolicy(accountId, policy) {
70
+ return unwrap(await backendApi.put(`${base(accountId)}/policy`, { policy }));
71
+ }
72
+ export async function getCaptureTimeline(accountId, query = {}) {
73
+ return unwrap(await backendApi.get(`${base(accountId)}/timeline${captureQuery(windowParams(query))}`));
74
+ }
75
+ export async function getCaptureTimelineItems(accountId, query = {}) {
76
+ return unwrap(await backendApi.get(`${base(accountId)}/timeline/items${captureQuery(windowParams(query))}`));
77
+ }
78
+ export async function getCaptureDays(accountId, query = {}) {
79
+ return unwrap(await backendApi.get(`${base(accountId)}/days${captureQuery({ tz: query.tz, user_id: query.userId, device_id: query.deviceId })}`));
80
+ }
81
+ export async function searchCapture(accountId, query) {
82
+ return unwrap(await backendApi.get(`${base(accountId)}/search${searchParams(query)}`));
83
+ }
84
+ export async function getCaptureFrame(accountId, frameId, opts = {}) {
85
+ return unwrap(await backendApi.get(`${base(accountId)}/frames/${frameId}${captureQuery({ user_id: opts.userId })}`));
86
+ }
87
+ export async function getCaptureChunkMedia(accountId, chunkId, opts = {}) {
88
+ return unwrap(await backendApi.get(`${base(accountId)}/chunks/${chunkId}/media${captureQuery({ user_id: opts.userId })}`));
89
+ }
90
+ export async function getCaptureAssetUrl(accountId, deviceId, name) {
91
+ return unwrap(await backendApi.get(`${base(accountId)}/devices/${deviceId}/assets/${encodeURIComponent(name)}`));
92
+ }
93
+ export async function getCaptureDeviceGrant(userCode) {
94
+ return unwrap(await backendApi.get(`/capture/device/grants/${encodeURIComponent(userCode)}`));
95
+ }
96
+ export async function approveCaptureDeviceGrant(userCode, accountId) {
97
+ return unwrap(await backendApi.post(`/capture/device/grants/${encodeURIComponent(userCode)}/approve`, accountId ? { account_id: accountId } : {}));
98
+ }
99
+ export async function denyCaptureDeviceGrant(userCode) {
100
+ return unwrap(await backendApi.post(`/capture/device/grants/${encodeURIComponent(userCode)}/deny`, {}));
101
+ }
102
+ export async function getCaptureWorkspace(accountId) {
103
+ return unwrap(await backendApi.get(base(accountId)));
104
+ }
105
+ export async function setCaptureEnabled(accountId, enabled) {
106
+ return unwrap(await backendApi.patch(base(accountId), { enabled }));
107
+ }
108
+ export async function searchMyCapture(query) {
109
+ return unwrap(await backendApi.get(`/capture/me/search${searchParams(query)}`));
110
+ }
111
+ export async function getMyCaptureTimeline(query = {}) {
112
+ return unwrap(await backendApi.get(`/capture/me/timeline${captureQuery(windowParams(query))}`));
113
+ }
114
+ export async function getMyCaptureFrame(frameId) {
115
+ return unwrap(await backendApi.get(`/capture/me/frames/${frameId}`));
116
+ }
@@ -9,3 +9,4 @@ export { getLatestSandboxVersion, getFullChangelog, getAllVersions, type Changel
9
9
  export { HostBoundaryError, listPublicMarketplaceItems, listPublicMarketplaces, getPublicMarketplaceItem, getPublicMarketplaceItemFile, checkAccessEmail, submitAccessRequest, recordPlatformLogout, getOAuthConsentRequest, submitOAuthConsent, getConnectorSetupLink, startConnectorSetupLink, finalizeConnectorSetupLink, getSecretSetupLink, submitSecretSetupLink, getPublicShareByToken, startSessionWithToken, submitDemoRequest, downloadAccountAudit, buildPublicTemplateUrl, getPublicTemplate, type HostRequestOptions, type PublicMarketplaceQuery, type OAuthConsentRequest, type ConnectorSetupLinkInfo, type ConnectorSetupLinkStart, type ConnectorSetupLinkFinalize, type FinalizeConnectorSetupLinkInput, type SecretSetupLinkInfo, type SecretWithheldReason, type SecretSetupLinkWithheld, type SecretSetupLinkSubmitResult, type AccountAuditExport, } from './host-boundary.js';
10
10
  export * from './connector-setup.js';
11
11
  export * from './client-policy.js';
12
+ export * from './capture.js';
@@ -9,3 +9,4 @@ export { getLatestSandboxVersion, getFullChangelog, getAllVersions, } from './up
9
9
  export { HostBoundaryError, listPublicMarketplaceItems, listPublicMarketplaces, getPublicMarketplaceItem, getPublicMarketplaceItemFile, checkAccessEmail, submitAccessRequest, recordPlatformLogout, getOAuthConsentRequest, submitOAuthConsent, getConnectorSetupLink, startConnectorSetupLink, finalizeConnectorSetupLink, getSecretSetupLink, submitSecretSetupLink, getPublicShareByToken, startSessionWithToken, submitDemoRequest, downloadAccountAudit, buildPublicTemplateUrl, getPublicTemplate, } from './host-boundary.js';
10
10
  export * from './connector-setup.js';
11
11
  export * from './client-policy.js';
12
+ export * from './capture.js';
@@ -1,6 +1,6 @@
1
- import { createProjectSession, startProjectSession, listProjects, restartProjectSession, stopProjectSession, } from '../projects-client/index.js';
1
+ import { createProjectSession, getProject, startProjectSession, listProjects, restartProjectSession, stopProjectSession, } from '../projects-client/index.js';
2
2
  import { backendApi } from '../../http/api-client.js';
3
- import { findProjectSessionSandbox, listProjectSessionSandboxes, projectSessionToSandboxInfo, normalizeSandboxId, } from './shared.js';
3
+ import { findProjectSessionSandbox, getSessionById, listProjectSessionSandboxes, projectSessionToSandboxInfo, normalizeSandboxId, resolveProjectSessionId, } from './shared.js';
4
4
  export async function getProviders() {
5
5
  const response = await backendApi.get('/setup/sandbox-providers');
6
6
  if (response.error)
@@ -34,12 +34,18 @@ export async function getSandboxById(sandboxId) {
34
34
  const normalizedSandboxId = normalizeSandboxId(sandboxId);
35
35
  if (!normalizedSandboxId)
36
36
  return null;
37
- const row = await findProjectSessionSandbox(normalizedSandboxId).catch(() => null);
38
- return row?.sandbox ?? null;
37
+ try {
38
+ const session = await getSessionById(normalizedSandboxId);
39
+ if (!session)
40
+ return (await findProjectSessionSandbox(normalizedSandboxId))?.sandbox ?? null;
41
+ return projectSessionToSandboxInfo(await getProject(session.project_id), session, null);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
39
46
  }
40
47
  export async function renameSandbox(sandboxId, _name) {
41
- const row = await findProjectSessionSandbox(sandboxId);
42
- if (!row)
48
+ if (!(await resolveProjectSessionId(sandboxId)))
43
49
  throw new Error('Project session sandbox not found');
44
50
  throw new Error('Renaming project-session sandboxes is not exposed by the current API');
45
51
  }
@@ -59,18 +65,18 @@ export async function restartSandbox(sandboxId) {
59
65
  if (!sandboxId) {
60
66
  throw new Error('No sandbox selected for workload restart');
61
67
  }
62
- const row = await findProjectSessionSandbox(sandboxId);
63
- if (!row)
68
+ const target = await resolveProjectSessionId(sandboxId);
69
+ if (!target)
64
70
  throw new Error('Project session sandbox not found');
65
- await restartProjectSession(row.project.project_id, row.session.session_id);
71
+ await restartProjectSession(target.projectId, target.sessionId);
66
72
  }
67
73
  export async function stopSandbox(sandboxId) {
68
74
  if (!sandboxId)
69
75
  throw new Error('No sandbox selected to stop');
70
- const row = await findProjectSessionSandbox(sandboxId);
71
- if (!row)
76
+ const target = await resolveProjectSessionId(sandboxId);
77
+ if (!target)
72
78
  throw new Error('Project session sandbox not found');
73
- await stopProjectSession(row.project.project_id, row.session.session_id);
79
+ await stopProjectSession(target.projectId, target.sessionId);
74
80
  }
75
81
  export async function cancelSandbox(sandboxId) {
76
82
  throw new Error('Cancellation is not exposed for project-session sandboxes');
@@ -10,6 +10,11 @@ export declare function listProjectSessionSandboxes(): Promise<Array<{
10
10
  runtime: ProjectSessionSandbox | null;
11
11
  sandbox: SandboxInfo;
12
12
  }>>;
13
+ export declare function getSessionById(sessionId: string): Promise<ProjectSession | null>;
14
+ export declare function resolveProjectSessionId(id: string): Promise<{
15
+ projectId: string;
16
+ sessionId: string;
17
+ } | null>;
13
18
  export declare function findProjectSessionSandbox(sandboxId?: string): Promise<{
14
19
  project: BeeuniProject;
15
20
  session: ProjectSession;
@@ -1,3 +1,4 @@
1
+ import { backendApi } from '../../http/api-client.js';
1
2
  import { platformConfig } from '../../http/config.js';
2
3
  import { safeEnv } from '../../http/env.js';
3
4
  import { stripTrailingSlashes } from '../../../platform/strings.js';
@@ -88,6 +89,23 @@ export async function listProjectSessionSandboxes() {
88
89
  return Date.parse(b.sandbox.updated_at) - Date.parse(a.sandbox.updated_at);
89
90
  });
90
91
  }
92
+ export async function getSessionById(sessionId) {
93
+ const response = await backendApi.get(`/sessions/${encodeURIComponent(sessionId)}`, {
94
+ showErrors: false,
95
+ });
96
+ if (response.success && response.data)
97
+ return response.data;
98
+ if (response.error?.status === 400 || response.error?.status === 404)
99
+ return null;
100
+ throw response.error ?? new Error('Session request failed');
101
+ }
102
+ export async function resolveProjectSessionId(id) {
103
+ const session = await getSessionById(id);
104
+ if (session)
105
+ return { projectId: session.project_id, sessionId: session.session_id };
106
+ const row = await findProjectSessionSandbox(id);
107
+ return row ? { projectId: row.project.project_id, sessionId: row.session.session_id } : null;
108
+ }
91
109
  export async function findProjectSessionSandbox(sandboxId) {
92
110
  const rows = await listProjectSessionSandboxes();
93
111
  if (!sandboxId)
@@ -1,4 +1,4 @@
1
- import type { SecretConsumer, SecretDeliveryStrategy } from './secrets.js';
1
+ import type { SecretConsumer, SecretDeliveryStrategy, SecretValueStatus } from './secrets.js';
2
2
  export interface AccountSecretResource {
3
3
  secret_id: string;
4
4
  account_id: string;
@@ -17,6 +17,7 @@ export interface AccountSecretResource {
17
17
  updated_at: string;
18
18
  granted_user_ids: string[];
19
19
  can_use: boolean;
20
+ status?: SecretValueStatus;
20
21
  }
21
22
  export interface CreateAccountSecretResourceInput {
22
23
  project_id?: string;
@@ -202,6 +202,40 @@ export declare function acceptAccountInvite(inviteId: string): Promise<{
202
202
  role: string;
203
203
  }>;
204
204
  }>;
205
+ export type AccountInviteLanding = {
206
+ kind: 'project';
207
+ projectId: string;
208
+ accountId: string;
209
+ } | {
210
+ kind: 'account';
211
+ accountId: string;
212
+ };
213
+ export declare function accountInviteLanding(accepted: {
214
+ account_id: string;
215
+ bootstrap_grants_applied?: ReadonlyArray<{
216
+ project_id: string;
217
+ }>;
218
+ }, invite?: {
219
+ projects?: ReadonlyArray<{
220
+ project_id: string;
221
+ }>;
222
+ } | null): AccountInviteLanding;
223
+ export declare function acceptAccountInviteAndLand(inviteId: string, invite?: {
224
+ projects?: ReadonlyArray<{
225
+ project_id: string;
226
+ }>;
227
+ } | null): Promise<{
228
+ accepted: {
229
+ account_id: string;
230
+ account_role: AccountRole;
231
+ already_accepted?: boolean;
232
+ bootstrap_grants_applied?: Array<{
233
+ project_id: string;
234
+ role: string;
235
+ }>;
236
+ };
237
+ landing: AccountInviteLanding;
238
+ }>;
205
239
  export declare function declineAccountInvite(inviteId: string): Promise<{
206
240
  ok: boolean;
207
241
  }>;
@@ -58,6 +58,16 @@ export async function describeAccountInvite(inviteId) {
58
58
  export async function acceptAccountInvite(inviteId) {
59
59
  return unwrap(await backendApi.post(`/account-invites/${inviteId}/accept`, {}));
60
60
  }
61
+ export function accountInviteLanding(accepted, invite) {
62
+ const project = accepted.bootstrap_grants_applied?.[0] ?? invite?.projects?.[0];
63
+ return project
64
+ ? { kind: 'project', projectId: project.project_id, accountId: accepted.account_id }
65
+ : { kind: 'account', accountId: accepted.account_id };
66
+ }
67
+ export async function acceptAccountInviteAndLand(inviteId, invite) {
68
+ const accepted = await acceptAccountInvite(inviteId);
69
+ return { accepted, landing: accountInviteLanding(accepted, invite) };
70
+ }
61
71
  export async function declineAccountInvite(inviteId) {
62
72
  return unwrap(await backendApi.post(`/account-invites/${inviteId}/decline`, {}));
63
73
  }
@@ -68,64 +68,3 @@ export declare function getAdminProviderFallback(): Promise<{
68
68
  enabled: boolean;
69
69
  }>;
70
70
  export declare function setAdminProviderFallback<T = unknown>(enabled: boolean): Promise<T>;
71
- export type AdminBootMode = 'standard' | 'artifacts' | 'volume';
72
- export interface AdminBootModeRule {
73
- mode: AdminBootMode;
74
- standardFallback: boolean;
75
- }
76
- export interface AdminVolumesPolicy {
77
- enabled: boolean;
78
- percent: number;
79
- orgs: Record<string, boolean>;
80
- }
81
- export interface AdminBootModePolicy {
82
- volumes: AdminVolumesPolicy;
83
- killSwitch: boolean;
84
- default: AdminBootModeRule;
85
- orgs: Record<string, AdminBootModeRule>;
86
- fallback: {
87
- volumeAttempts: number;
88
- artifactsAttempts: number;
89
- };
90
- artifacts: string | null;
91
- }
92
- export interface AdminBootModes {
93
- stored: boolean;
94
- policy: AdminBootModePolicy;
95
- orgs: Array<{
96
- accountId: string;
97
- name: string | null;
98
- volumes: boolean | null;
99
- rule: AdminBootModeRule | null;
100
- }>;
101
- env: {
102
- bootArtifacts: string | null;
103
- volumeOff: boolean;
104
- driveSync: boolean;
105
- };
106
- providers: {
107
- allowed: string[];
108
- default: string;
109
- volumeProvider: string;
110
- volumeProviderConfigured: boolean;
111
- };
112
- stats: {
113
- since: string;
114
- modes: {
115
- mode: AdminBootMode;
116
- requested: number;
117
- booted: number;
118
- }[];
119
- fallbacks: {
120
- from: AdminBootMode;
121
- to: AdminBootMode;
122
- reason: string;
123
- count: number;
124
- sample: string | null;
125
- }[];
126
- } | {
127
- error: string;
128
- };
129
- }
130
- export declare function getAdminBootModes(): Promise<AdminBootModes>;
131
- export declare function setAdminBootModes(policy: AdminBootModePolicy): Promise<AdminBootModes>;
@@ -31,9 +31,3 @@ export function setAdminProviderFallback(enabled) {
31
31
  .put('/admin/api/provider-fallback', { enabled })
32
32
  .then((response) => unwrap(response));
33
33
  }
34
- export function getAdminBootModes() {
35
- return backendApi.get('/admin/api/boot-modes').then((response) => unwrap(response));
36
- }
37
- export function setAdminBootModes(policy) {
38
- return backendApi.put('/admin/api/boot-modes', policy).then((response) => unwrap(response));
39
- }
@@ -26,6 +26,9 @@ export interface AgentConfigBlock {
26
26
  connectors_personal?: string[];
27
27
  secrets?: AgentGrantSetV2;
28
28
  skills?: AgentGrantSetV2;
29
+ subagents?: AgentGrantSetV2;
30
+ commands?: AgentGrantSetV2;
31
+ extensions?: AgentGrantSetV2;
29
32
  apps?: AgentGrantSetV2;
30
33
  beeuni_permissions?: AgentGrantSetV2;
31
34
  beeuni_cli?: AgentGrantSetV2;
@@ -27,6 +27,8 @@ export interface AppVolume {
27
27
  process_group: string;
28
28
  machine_id: string | null;
29
29
  size_gb: number;
30
+ used_bytes?: number | null;
31
+ last_commit_at?: string | null;
30
32
  status: 'creating' | 'ready' | 'destroying' | 'destroyed' | 'error';
31
33
  attached: boolean;
32
34
  snapshot_retention_days: number;
@@ -61,7 +63,9 @@ export declare const startAppMachine: (projectId: string, appId: string, machine
61
63
  export declare const stopAppMachine: (projectId: string, appId: string, machineId: string) => Promise<AppMachine[]>;
62
64
  export declare const restartAppMachine: (projectId: string, appId: string, machineId: string) => Promise<AppMachine[]>;
63
65
  export declare function destroyAppMachine(projectId: string, appId: string, machineId: string): Promise<AppMachine[]>;
64
- export declare function scaleApp(projectId: string, appId: string, count: Record<string, number>): Promise<{
66
+ export declare function scaleApp(projectId: string, appId: string, count: Record<string, number>, options?: {
67
+ newVolumes?: boolean;
68
+ }): Promise<{
65
69
  scale: Record<string, number>;
66
70
  machines: AppMachine[];
67
71
  }>;
@@ -13,8 +13,8 @@ export const restartAppMachine = (projectId, appId, machineId) => machineAction(
13
13
  export async function destroyAppMachine(projectId, appId, machineId) {
14
14
  return unwrap(await backendApi.delete(`${app(projectId, appId)}/machines/${machineId}`), 'Failed to destroy the machine').machines;
15
15
  }
16
- export async function scaleApp(projectId, appId, count) {
17
- return unwrap(await backendApi.put(`${app(projectId, appId)}/scale`, { count }), 'Failed to scale the App');
16
+ export async function scaleApp(projectId, appId, count, options = {}) {
17
+ return unwrap(await backendApi.put(`${app(projectId, appId)}/scale`, { count, ...(options.newVolumes ? { new_volumes: true } : {}) }), 'Failed to scale the App');
18
18
  }
19
19
  export async function execInApp(projectId, appId, input) {
20
20
  return unwrap(await backendApi.post(`${app(projectId, appId)}/exec`, input), 'Failed to run the command');
@@ -100,6 +100,7 @@ export interface App {
100
100
  slug: string;
101
101
  name: string;
102
102
  url: string;
103
+ external_url?: string | null;
103
104
  access_mode: AppAccessMode;
104
105
  access_revision: number;
105
106
  desired_state: AppDesiredState;
@@ -150,6 +151,7 @@ export interface CreateAppInput {
150
151
  idle_timeout_seconds?: number;
151
152
  always_on?: boolean;
152
153
  uses?: string[];
154
+ external_url?: string;
153
155
  }
154
156
  export interface UpdateAppInput {
155
157
  name?: string;
@@ -161,6 +163,7 @@ export interface UpdateAppInput {
161
163
  uses?: string[];
162
164
  labels?: string[];
163
165
  display?: AppDisplay;
166
+ external_url?: string;
164
167
  }
165
168
  export type AppViewerTokenScope = 'off' | 'identity' | 'api';
166
169
  export interface AppAccessConfig {
@@ -77,9 +77,11 @@ export interface ChangeRequestMergeResponse {
77
77
  export interface ListChangeRequestsOptions {
78
78
  originSessionId?: string;
79
79
  limit?: number;
80
+ cursor?: string;
80
81
  }
81
82
  export declare function listChangeRequests(projectId: string, status?: ChangeRequestStatus | 'all', options?: ListChangeRequestsOptions): Promise<{
82
83
  change_requests: ChangeRequest[];
84
+ next_cursor?: string | null;
83
85
  }>;
84
86
  export declare function getChangeRequest(projectId: string, crId: string): Promise<ChangeRequestDetailResponse>;
85
87
  export declare function getChangeRequestDiff(projectId: string, crId: string): Promise<ChangeRequestDiffResponse>;
@@ -12,6 +12,8 @@ export async function listChangeRequests(projectId, status, options) {
12
12
  params.set('origin_session_id', options.originSessionId);
13
13
  if (options?.limit != null)
14
14
  params.set('limit', String(options.limit));
15
+ if (options?.cursor)
16
+ params.set('cursor', options.cursor);
15
17
  const query = params.toString() ? `?${params.toString()}` : '';
16
18
  return unwrap(await backendApi.get(`/projects/${projectId}/change-requests${query}`, {
17
19
  showErrors: false,
@@ -522,6 +522,11 @@ export declare function createConnector(projectId: string, draft: ConnectorDraft
522
522
  authDiscovery?: ConnectorAuthDiscovery;
523
523
  }>;
524
524
  export declare function discoverConnectorAuth(projectId: string, draft: ConnectorDraftInput): Promise<ConnectorAuthDiscovery>;
525
+ export interface McpServerSignInCheck {
526
+ requires_sign_in: boolean;
527
+ one_click: boolean;
528
+ }
529
+ export declare function checkMcpServerSignIn(projectId: string, url: string): Promise<McpServerSignInCheck>;
525
530
  export declare function deleteConnector(projectId: string, slug: string): Promise<{
526
531
  ok: boolean;
527
532
  }>;
@@ -534,6 +539,7 @@ export interface ConnectToolkit {
534
539
  isNoAuth: boolean;
535
540
  connected: boolean;
536
541
  directId?: string | null;
542
+ directMcpUrl?: string | null;
537
543
  }
538
544
  export interface ConnectToolkitsPage {
539
545
  provider: string;
@@ -657,6 +663,7 @@ export declare const getDiscoverIntegration: typeof getDiscoverConnector;
657
663
  export declare function getConnectStatus(): Promise<ConnectorConnectStatus>;
658
664
  export declare function setConnectorCredential(projectId: string, slug: string, credential: string | ConnectionCredentialInput): Promise<{
659
665
  ok: boolean;
666
+ sync?: ConnectorSyncResult;
660
667
  }>;
661
668
  export declare function deleteConnectorCredential(projectId: string, slug: string): Promise<{
662
669
  ok: boolean;
@@ -306,6 +306,9 @@ export async function createConnector(projectId, draft) {
306
306
  export async function discoverConnectorAuth(projectId, draft) {
307
307
  return unwrap(await backendApi.post(`/connectors/projects/${projectId}/connectors/auth-discovery`, draft));
308
308
  }
309
+ export async function checkMcpServerSignIn(projectId, url) {
310
+ return unwrap(await backendApi.post(`/connectors/projects/${projectId}/connectors/mcp-sign-in-check`, { url }));
311
+ }
309
312
  export async function deleteConnector(projectId, slug) {
310
313
  return unwrap(await backendApi.delete(`/connectors/projects/${projectId}/connectors/${encodeURIComponent(slug)}`));
311
314
  }
@@ -12,10 +12,13 @@ export interface ProjectDirectoryEntry {
12
12
  export interface ProjectDirectoryListing {
13
13
  entries: ProjectDirectoryEntry[];
14
14
  truncated: boolean;
15
+ next_cursor?: string | null;
15
16
  }
16
17
  export declare function listProjectDirectory(projectId: string, options?: {
17
18
  ref?: string;
18
19
  path?: string;
20
+ cursor?: string;
21
+ limit?: number;
19
22
  }): Promise<ProjectDirectoryListing>;
20
23
  export interface ProjectFileSearchMatch {
21
24
  path: string;
@@ -19,6 +19,10 @@ export async function listProjectDirectory(projectId, options) {
19
19
  if (options?.path)
20
20
  params.set('path', options.path);
21
21
  params.set('depth', '1');
22
+ if (options?.cursor)
23
+ params.set('cursor', options.cursor);
24
+ if (options?.limit !== undefined)
25
+ params.set('limit', String(options.limit));
22
26
  return unwrap(await backendApi.get(`/projects/${projectId}/files?${params.toString()}`, { showErrors: false }));
23
27
  }
24
28
  export async function searchProjectFiles(projectId, query, options) {
@@ -104,9 +104,13 @@ export interface GatewayBudgetRow {
104
104
  budget_id: string;
105
105
  scope: 'project' | 'member';
106
106
  subject_user_id: string | null;
107
+ subject_email?: string | null;
107
108
  limit_usd: number;
108
109
  period: 'day' | 'week' | 'month';
109
110
  action: 'block' | 'warn';
111
+ spent_usd?: number;
112
+ period_start?: string;
113
+ resets_at?: string;
110
114
  }
111
115
  export interface GatewayMemberSpend {
112
116
  user_id: string | null;
@@ -143,6 +147,7 @@ export interface CreatedGatewayKey {
143
147
  name: string;
144
148
  key_prefix: string;
145
149
  secret_key: string;
150
+ gateway_url?: string | null;
146
151
  }
147
152
  export type GatewayFallbackCondition = 'transient' | 'any-error';
148
153
  export interface GatewayFallbackChain {
@@ -0,0 +1,76 @@
1
+ import type { ReviewVerdict } from './review.js';
2
+ import { type ReviewItem } from './review-items.js';
3
+ export declare const PROJECT_ACTIONS: {
4
+ readonly PROJECT_READ: "project.read";
5
+ readonly PROJECT_WRITE: "project.write";
6
+ readonly PROJECT_DELETE: "project.delete";
7
+ readonly PROJECT_SESSION_READ: "project.session.read";
8
+ readonly PROJECT_SESSION_START: "project.session.start";
9
+ readonly PROJECT_SESSION_STOP: "project.session.stop";
10
+ readonly PROJECT_SESSION_BINDINGS_WRITE: "project.session.bindings.write";
11
+ readonly PROJECT_MEMBERS_READ: "project.members.read";
12
+ readonly PROJECT_MEMBERS_MANAGE: "project.members.manage";
13
+ readonly PROJECT_TRIGGER_READ: "project.trigger.read";
14
+ readonly PROJECT_TRIGGER_CREATE: "project.trigger.create";
15
+ readonly PROJECT_TRIGGER_UPDATE: "project.trigger.update";
16
+ readonly PROJECT_TRIGGER_DELETE: "project.trigger.delete";
17
+ readonly PROJECT_TRIGGER_FIRE: "project.trigger.fire";
18
+ readonly PROJECT_GATEWAY_LOGS_READ: "project.gateway.logs.read";
19
+ readonly PROJECT_GATEWAY_SPEND_READ: "project.gateway.spend.read";
20
+ readonly PROJECT_USAGE_READ: "project.usage.read";
21
+ readonly PROJECT_GATEWAY_BUDGET_SET: "project.gateway.budget.set";
22
+ readonly PROJECT_GATEWAY_KEYS_MANAGE: "project.gateway.keys.manage";
23
+ readonly PROJECT_AGENT_READ: "project.agent.read";
24
+ readonly PROJECT_AGENT_WRITE: "project.agent.write";
25
+ readonly PROJECT_SKILL_READ: "project.skill.read";
26
+ readonly PROJECT_SKILL_WRITE: "project.skill.write";
27
+ readonly PROJECT_COMMAND_READ: "project.command.read";
28
+ readonly PROJECT_COMMAND_WRITE: "project.command.write";
29
+ readonly PROJECT_FILE_READ: "project.file.read";
30
+ readonly PROJECT_FILE_WRITE: "project.file.write";
31
+ readonly PROJECT_SETTINGS_WRITE: "project.settings.write";
32
+ readonly PROJECT_SANDBOX_WRITE: "project.sandbox.write";
33
+ readonly PROJECT_MODEL_READ: "project.model.read";
34
+ readonly PROJECT_MODEL_WRITE: "project.model.write";
35
+ readonly PROJECT_GITOPS_READ: "project.gitops.read";
36
+ readonly PROJECT_GITOPS_PUSH: "project.gitops.push";
37
+ readonly PROJECT_GITOPS_MERGE: "project.gitops.merge";
38
+ readonly PROJECT_GITOPS_REF_ANY: "project.gitops.ref.any";
39
+ readonly PROJECT_GITOPS_REF_DELETE: "project.gitops.ref.delete";
40
+ readonly PROJECT_SECRET_READ: "project.secret.read";
41
+ readonly PROJECT_SECRET_WRITE: "project.secret.write";
42
+ readonly PROJECT_CONNECTOR_READ: "project.connector.read";
43
+ readonly PROJECT_CONNECTOR_CONNECTIONS_MANAGE: "project.connector.connections.manage";
44
+ readonly PROJECT_CONNECTOR_WRITE: "project.connector.write";
45
+ readonly PROJECT_APP_READ: "project.app.read";
46
+ readonly PROJECT_APP_WRITE: "project.app.write";
47
+ readonly PROJECT_APP_DEPLOY: "project.app.deploy";
48
+ readonly PROJECT_APP_ADMIN: "project.app.admin";
49
+ readonly PROJECT_REVIEW_READ: "project.review.read";
50
+ readonly PROJECT_REVIEW_SUBMIT: "project.review.submit";
51
+ readonly PROJECT_REVIEW_ACT: "project.review.act";
52
+ readonly PROJECT_CREDENTIALS_ISSUE: "project.credentials.issue";
53
+ };
54
+ export type ProjectAction = (typeof PROJECT_ACTIONS)[keyof typeof PROJECT_ACTIONS];
55
+ export declare const TRIGGER_CONTROL_ACTIONS: readonly ["project.write", "project.trigger.create", "project.trigger.fire", "project.trigger.update", "project.trigger.delete"];
56
+ export interface TriggerControls {
57
+ canCreate: boolean;
58
+ canFire: boolean;
59
+ canUpdate: boolean;
60
+ canDelete: boolean;
61
+ }
62
+ export declare function triggerControlsFrom(cans: Partial<Record<string, {
63
+ allowed: boolean;
64
+ } | undefined>>): TriggerControls;
65
+ export declare const REVIEW_CONTROL_ACTIONS: readonly ["project.write", "project.gitops.push", "project.gitops.merge", "project.review.act"];
66
+ export interface ChangeRequestControls {
67
+ canOpen: boolean;
68
+ canMerge: boolean;
69
+ canClose: boolean;
70
+ }
71
+ export declare function changeRequestControlsFrom(cans: Partial<Record<string, {
72
+ allowed: boolean;
73
+ } | undefined>>): ChangeRequestControls;
74
+ export declare function reviewVerdictAllowed(item: ReviewItem, verdict: ReviewVerdict, cans: Partial<Record<string, {
75
+ allowed: boolean;
76
+ } | undefined>>): boolean;