@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
@@ -1,8 +1,10 @@
1
1
  import { type BeeuniPlatformConfig } from '../http/config.js';
2
+ import type { ProjectSession } from '../rest/projects-client/sessions.js';
2
3
  import { type SessionRuntimeEntry } from '../session/session-runtime-registry.js';
3
4
  export declare function bindSessionReadiness(projectId: string, sessionId: string, config: BeeuniPlatformConfig): {
4
5
  ensureReady: (opts?: {
5
6
  readyTimeoutMs?: number;
7
+ session?: ProjectSession;
6
8
  }) => Promise<SessionRuntimeEntry>;
7
9
  tryResolveReady: () => SessionRuntimeEntry | null;
8
10
  requireReady: (action: string) => SessionRuntimeEntry;
@@ -1,6 +1,9 @@
1
1
  import { platformConfig } from '../http/config.js';
2
+ import { projectSessionStartSeed } from '../rest/projects-client/session-sandbox.js';
3
+ import { setCurrentRuntime } from '../session/current-runtime.js';
2
4
  import { loadPreviewUrlTemplate } from '../session/preview-config.js';
3
- import { clearSessionRuntime, getSessionRuntime, } from '../session/session-runtime-registry.js';
5
+ import { getSandboxUrlForExternalId } from '../session/server-store/url-helpers.js';
6
+ import { clearSessionRuntime, getSessionRuntime, setSessionRuntime, } from '../session/session-runtime-registry.js';
4
7
  import { SessionNotReadyError, inFlightSessionStarts } from './session-shared.js';
5
8
  import { bindSessionStart } from './session-start.js';
6
9
  export function bindSessionReadiness(projectId, sessionId, config) {
@@ -20,6 +23,22 @@ export function bindSessionReadiness(projectId, sessionId, config) {
20
23
  return cached;
21
24
  const readyTimeoutMs = opts?.readyTimeoutMs ?? 180_000;
22
25
  const previewConfig = loadPreviewUrlTemplate(platformConfig().backendUrl ?? config.backendUrl).catch(() => null);
26
+ const seed = opts?.session?.session_id === sessionId ? projectSessionStartSeed(opts.session) : null;
27
+ const seededSandbox = seed?.sandbox?.external_id;
28
+ const seededRuntimeSession = seed?.runtime_session_id;
29
+ if (seededSandbox && seededRuntimeSession) {
30
+ const runtimeUrl = getSandboxUrlForExternalId(seededSandbox);
31
+ setCurrentRuntime(runtimeUrl, seededSandbox);
32
+ _ready = {
33
+ runtimeSessionId: seededRuntimeSession,
34
+ opencodeSessionId: seededRuntimeSession,
35
+ runtimeUrl,
36
+ sandboxId: seededSandbox,
37
+ };
38
+ setSessionRuntime(projectId, sessionId, _ready);
39
+ await previewConfig;
40
+ return _ready;
41
+ }
23
42
  const key = `${projectId}\n${sessionId}`;
24
43
  const inFlight = inFlightSessionStarts.get(key);
25
44
  if (inFlight) {
@@ -21,6 +21,7 @@ export interface ApiResponse<T = any> {
21
21
  export declare const FEATURE_NOT_SUPPORTED_CODE = "feature_not_supported";
22
22
  export declare const MODEL_NOT_SERVABLE_CODE = "model_not_servable";
23
23
  export declare const PROVISION_IN_FLIGHT_CODE = "provision_in_flight";
24
+ export declare const SANDBOX_STATE_CHANGE_IN_PROGRESS_CODE = "sandbox_state_change_in_progress";
24
25
  export declare const ANALYTICS_UNAVAILABLE_CODE = "analytics_unavailable";
25
26
  export declare const ACCOUNTS_LIST_UNAVAILABLE_CODE = "accounts_list_unavailable";
26
27
  declare function postStream(endpoint: string, data: unknown, options?: ApiClientOptions): Promise<Response>;
@@ -8,6 +8,7 @@ export { ApiError, AuthError, BillingError, RequestTooLargeError, parseBillingEr
8
8
  export const FEATURE_NOT_SUPPORTED_CODE = 'feature_not_supported';
9
9
  export const MODEL_NOT_SERVABLE_CODE = 'model_not_servable';
10
10
  export const PROVISION_IN_FLIGHT_CODE = 'provision_in_flight';
11
+ export const SANDBOX_STATE_CHANGE_IN_PROGRESS_CODE = 'sandbox_state_change_in_progress';
11
12
  export const ANALYTICS_UNAVAILABLE_CODE = 'analytics_unavailable';
12
13
  export const ACCOUNTS_LIST_UNAVAILABLE_CODE = 'accounts_list_unavailable';
13
14
  async function postStream(endpoint, data, options = {}) {
@@ -10,11 +10,13 @@ export interface BeeuniPlatformConfig {
10
10
  getToken: (() => Promise<string | null>) & {
11
11
  invalidate?: (rejectedToken: string) => void;
12
12
  };
13
+ credentialHeader?: string;
13
14
  fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
14
15
  eventStreamTransport?: RuntimeEventTransport;
15
16
  clientSource?: 'api' | 'cli' | 'mobile' | 'tui' | 'web';
16
17
  clientVersion?: string;
17
18
  onError?: (error: unknown, context?: unknown) => void;
19
+ onAccessRemedy?: (code: 'sso_required' | 'account_mfa_required') => void;
18
20
  sandboxId?: string | null;
19
21
  billingEnabled?: boolean;
20
22
  getUserId?: () => Promise<string | null>;
@@ -1,5 +1,5 @@
1
1
  import { abortable, createAbortError } from './abort.js';
2
- import { ACCOUNTS_LIST_UNAVAILABLE_CODE, ANALYTICS_UNAVAILABLE_CODE, FEATURE_NOT_SUPPORTED_CODE, MODEL_NOT_SERVABLE_CODE, PROVISION_IN_FLIGHT_CODE, } from './api-client.js';
2
+ import { ACCOUNTS_LIST_UNAVAILABLE_CODE, ANALYTICS_UNAVAILABLE_CODE, FEATURE_NOT_SUPPORTED_CODE, MODEL_NOT_SERVABLE_CODE, PROVISION_IN_FLIGHT_CODE, SANDBOX_STATE_CHANGE_IN_PROGRESS_CODE, } from './api-client.js';
3
3
  import { ApiError, RequestTooLargeError, parseBillingError } from './api/errors.js';
4
4
  import { platformConfig } from './config.js';
5
5
  const REQUEST_DEADLINE_CODE = 'request_deadline';
@@ -22,6 +22,15 @@ const isGitMirrorUnavailableResponse = (status, errorData, message) => {
22
22
  : undefined;
23
23
  return (code === GIT_MIRROR_UNAVAILABLE_CODE || LEGACY_GIT_MIRROR_UNAVAILABLE_MESSAGE.test(message));
24
24
  };
25
+ const CONNECTORS_PROVIDER_UNAVAILABLE_CODE = 'connectors_provider_unavailable';
26
+ const isConnectorsProviderUnavailableResponse = (status, errorData) => {
27
+ if (status !== 503)
28
+ return false;
29
+ const code = typeof errorData === 'object' && errorData !== null && 'code' in errorData
30
+ ? errorData.code
31
+ : undefined;
32
+ return code === CONNECTORS_PROVIDER_UNAVAILABLE_CODE;
33
+ };
25
34
  async function readErrorBody(response, signal) {
26
35
  let message = `HTTP ${response.status}: ${response.statusText}`;
27
36
  let data = null;
@@ -46,9 +55,12 @@ async function readErrorBody(response, signal) {
46
55
  function isExpectedResponse(status, data, message) {
47
56
  return (isRequestDeadlineResponse(status, data, message) ||
48
57
  isGitMirrorUnavailableResponse(status, data, message) ||
58
+ isConnectorsProviderUnavailableResponse(status, data) ||
49
59
  (status === 501 && data?.code === FEATURE_NOT_SUPPORTED_CODE) ||
50
60
  (status === 409 &&
51
- (data?.code === MODEL_NOT_SERVABLE_CODE || data?.code === PROVISION_IN_FLIGHT_CODE)) ||
61
+ (data?.code === MODEL_NOT_SERVABLE_CODE ||
62
+ data?.code === PROVISION_IN_FLIGHT_CODE ||
63
+ data?.code === SANDBOX_STATE_CHANGE_IN_PROGRESS_CODE)) ||
52
64
  (status === 503 &&
53
65
  (data?.code === ANALYTICS_UNAVAILABLE_CODE || data?.code === ACCOUNTS_LIST_UNAVAILABLE_CODE)));
54
66
  }
@@ -66,18 +78,21 @@ export async function handleErrorResponse(response, signal, showErrors, errorCon
66
78
  });
67
79
  if (response.status === 402)
68
80
  error = parseBillingError(error);
69
- const remedyEvent = response.status !== 403
70
- ? null
71
- : data?.code === 'account_mfa_required'
72
- ? 'beeuni:mfa-required'
73
- : data?.code === 'sso_required'
74
- ? 'beeuni:sso-required'
75
- : null;
76
- if (remedyEvent && typeof window !== 'undefined' && typeof window.dispatchEvent === 'function') {
81
+ const remedyCode = response.status === 403 &&
82
+ (data?.code === 'account_mfa_required' || data?.code === 'sso_required')
83
+ ? data.code
84
+ : null;
85
+ if (remedyCode) {
77
86
  try {
78
- window.dispatchEvent(new CustomEvent(remedyEvent));
87
+ platformConfig().onAccessRemedy?.(remedyCode);
79
88
  }
80
89
  catch { }
90
+ if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function') {
91
+ try {
92
+ window.dispatchEvent(new CustomEvent(remedyCode === 'account_mfa_required' ? 'beeuni:mfa-required' : 'beeuni:sso-required'));
93
+ }
94
+ catch { }
95
+ }
81
96
  }
82
97
  if (response.status === 431) {
83
98
  error = new RequestTooLargeError(431, {
@@ -45,7 +45,12 @@ function withPlatformHeaders(url, base, token) {
45
45
  setHeader(headers, 'x-beeuni-admin-bypass', '1');
46
46
  for (const [name, value] of Object.entries(impersonationHeaders(url)))
47
47
  setHeader(headers, name, value);
48
- if (!hasHeader(headers, 'authorization'))
48
+ const credentialHeader = platformConfig().credentialHeader?.trim();
49
+ if (credentialHeader) {
50
+ if (!hasHeader(headers, credentialHeader))
51
+ setHeader(headers, credentialHeader, token);
52
+ }
53
+ else if (!hasHeader(headers, 'authorization'))
49
54
  setHeader(headers, 'Authorization', `Bearer ${token}`);
50
55
  return headers;
51
56
  }
@@ -3,6 +3,20 @@ import type { ModelDefaultsResponse } from '../rest/projects-client/model-defaul
3
3
  import { type FlatModel } from './model-flatten.js';
4
4
  import { type ModelKey } from './model-key.js';
5
5
  export declare function resolveModelDefault(data: ModelDefaultsResponse | undefined, agentName: string | undefined): ModelKey | undefined;
6
+ export declare function latestPromptModel(messages: ReadonlyArray<{
7
+ role: string;
8
+ model?: {
9
+ provider?: string;
10
+ model?: string;
11
+ } | null;
12
+ }> | null | undefined): ModelKey | undefined;
13
+ export declare function sessionModelCandidates(input: {
14
+ session?: {
15
+ metadata?: Record<string, unknown> | null;
16
+ } | null;
17
+ lastPromptModel?: ModelKey;
18
+ gatewayEnabled: boolean;
19
+ }): ModelKey[];
6
20
  export interface ComposerModelResolution {
7
21
  model: ModelKey | undefined;
8
22
  explicit: ModelKey | undefined;
@@ -1,7 +1,8 @@
1
1
  import { autoSeedableModels } from '@beeuni/llm-catalog/lite';
2
+ import { sessionModelPin } from '../rest/projects-client/sessions.js';
2
3
  import { healBedrockModelKey } from './bedrock-invokable.js';
3
4
  import { isOfferedModel } from './model-flatten.js';
4
- import { wireToModelKey } from './model-key.js';
5
+ import { modelRefToKey, wireToModelKey } from './model-key.js';
5
6
  export function resolveModelDefault(data, agentName) {
6
7
  const wire = (agentName ? data?.agentDefaults?.[agentName] : undefined) ??
7
8
  data?.projectDefault ??
@@ -9,6 +10,25 @@ export function resolveModelDefault(data, agentName) {
9
10
  data?.platformDefault;
10
11
  return wire ? wireToModelKey(wire) : undefined;
11
12
  }
13
+ export function latestPromptModel(messages) {
14
+ for (let i = (messages?.length ?? 0) - 1; i >= 0; i--) {
15
+ const message = messages[i];
16
+ const { provider, model } = message.model ?? {};
17
+ if (message.role === 'user' && provider && model)
18
+ return { providerID: provider, modelID: model };
19
+ }
20
+ return undefined;
21
+ }
22
+ const CHOSEN_PIN_SOURCES = new Set(['explicit', 'repointed']);
23
+ export function sessionModelCandidates(input) {
24
+ const pin = input.session ? sessionModelPin(input.session) : null;
25
+ const pinKey = pin ? modelRefToKey(pin, input.gatewayEnabled) : undefined;
26
+ const chosen = CHOSEN_PIN_SOURCES.has(String(input.session?.metadata?.opencode_model_source));
27
+ const ordered = chosen
28
+ ? [pinKey, input.lastPromptModel]
29
+ : [input.lastPromptModel, pinKey];
30
+ return ordered.filter((model) => !!model);
31
+ }
12
32
  export function resolveComposerModel(input) {
13
33
  const { models, providers } = input;
14
34
  const isValid = (model) => isOfferedModel(models, model);
@@ -0,0 +1,363 @@
1
+ import type { CaptureExclusionGroup, CaptureLayer, CaptureMaxHeight } from '../../capture/rules.js';
2
+ export * from '../../capture/rules.js';
3
+ export type CaptureLiveState = 'recording' | 'paused' | 'permission_missing' | 'not_recording' | 'offline' | 'unknown' | (string & {});
4
+ export interface CapturePolicy {
5
+ layers: {
6
+ screen: boolean;
7
+ actions: boolean;
8
+ audio: boolean;
9
+ };
10
+ privacy: {
11
+ redact_pii: boolean;
12
+ excluded_bundle_ids: string[];
13
+ excluded_domains: string[];
14
+ exclusion_groups: CaptureExclusionGroup[];
15
+ exclude_private_browsing: boolean;
16
+ };
17
+ retention: {
18
+ local_hours: number;
19
+ remote_days: number;
20
+ };
21
+ recording: {
22
+ paused: boolean;
23
+ paused_until_ms: number | null;
24
+ interval_ms?: number | null;
25
+ max_height?: CaptureMaxHeight | null;
26
+ };
27
+ notice: string;
28
+ experimental?: {
29
+ privacy_controls: boolean;
30
+ };
31
+ }
32
+ export interface CapturePolicyRecord {
33
+ policy: CapturePolicy;
34
+ updated_at: string | null;
35
+ updated_by: string | null;
36
+ }
37
+ export interface CaptureDisplay {
38
+ id: number;
39
+ name: string | null;
40
+ x: number;
41
+ y: number;
42
+ w: number;
43
+ h: number;
44
+ scale: number | null;
45
+ main: boolean;
46
+ }
47
+ export interface CaptureFocusSpan {
48
+ device_id: string;
49
+ display_id: number;
50
+ start_at: string;
51
+ end_at: string;
52
+ }
53
+ export type CaptureHealthReason = 'offline' | 'stalled' | 'error' | 'never_reported' | 'unseen' | 'permission_missing' | 'paused' | 'sync_error' | 'backlog' | 'behind_version';
54
+ export interface CaptureDeviceHealth {
55
+ state: 'healthy' | 'attention' | 'not_recording';
56
+ idle: boolean;
57
+ reasons: CaptureHealthReason[];
58
+ since: string | null;
59
+ latest_version: string | null;
60
+ }
61
+ export interface CaptureHealthSummary {
62
+ recording: number;
63
+ idle: number;
64
+ attention: number;
65
+ not_recording: number;
66
+ latest_version: string | null;
67
+ }
68
+ export type CaptureHealthBucket = 'recording' | 'idle' | 'attention' | 'not_recording';
69
+ export declare function captureHealthBucket(device: Pick<CaptureDevice, 'health'>): CaptureHealthBucket;
70
+ export interface CaptureDevice {
71
+ device_id: string;
72
+ user_id: string | null;
73
+ name: string | null;
74
+ os: string | null;
75
+ os_version: string | null;
76
+ arch: string | null;
77
+ app_version: string | null;
78
+ displays: CaptureDisplay[];
79
+ live: {
80
+ state: CaptureLiveState;
81
+ status: Record<string, unknown> | null;
82
+ reported_at: string | null;
83
+ };
84
+ last_credentials_at: string | null;
85
+ revoked_at: string | null;
86
+ health: CaptureDeviceHealth;
87
+ enrollment_token_id?: string | null;
88
+ created_at: string;
89
+ }
90
+ export interface CaptureEnrollmentToken {
91
+ token_id: string;
92
+ name: string;
93
+ token_prefix: string;
94
+ state: 'active' | 'revoked' | 'expired';
95
+ email_domains: string[];
96
+ max_devices: number | null;
97
+ device_count: number;
98
+ require_approval: boolean;
99
+ user_id: string | null;
100
+ expires_at: string | null;
101
+ revoked_at: string | null;
102
+ last_used_at: string | null;
103
+ created_by: string;
104
+ created_at: string;
105
+ }
106
+ export interface CaptureEnrollmentTokenSecret extends CaptureEnrollmentToken {
107
+ token: string;
108
+ }
109
+ export interface CaptureEnrollmentTokenInput {
110
+ name: string;
111
+ email_domains?: string[];
112
+ max_devices?: number | null;
113
+ require_approval?: boolean;
114
+ expires_in_days?: number | null;
115
+ user_id?: string | null;
116
+ }
117
+ export type CaptureEnrollmentStatus = 'pending' | 'approved' | 'denied' | 'enrolled';
118
+ export interface CaptureEnrollment {
119
+ enrollment_id: string;
120
+ token_id: string;
121
+ token_name: string | null;
122
+ status: CaptureEnrollmentStatus;
123
+ reason: 'approval_required' | null;
124
+ principal_name: string | null;
125
+ account_name: string | null;
126
+ device: {
127
+ name: string | null;
128
+ os: string | null;
129
+ os_version: string | null;
130
+ arch: string | null;
131
+ app_version: string | null;
132
+ };
133
+ user_id: string | null;
134
+ device_id: string | null;
135
+ decided_by: string | null;
136
+ decided_at: string | null;
137
+ created_at: string;
138
+ last_seen_at: string;
139
+ }
140
+ export interface CaptureWindowQuery {
141
+ day?: string;
142
+ from?: string;
143
+ to?: string;
144
+ userId?: string;
145
+ deviceId?: string;
146
+ displayId?: number | 'all';
147
+ }
148
+ export interface CaptureActivityRun {
149
+ device_id: string;
150
+ app: string | null;
151
+ title: string | null;
152
+ url: string | null;
153
+ start_at: string;
154
+ end_at: string;
155
+ frames: number;
156
+ }
157
+ export interface CaptureChunk {
158
+ chunk_id: string;
159
+ device_id: string;
160
+ kind: 'chunk' | 'audio' | 'actions';
161
+ start_at: string;
162
+ end_at: string;
163
+ item_count: number;
164
+ encrypted: boolean;
165
+ display_id: number | null;
166
+ display: CaptureDisplay | null;
167
+ }
168
+ export interface CaptureTimeline {
169
+ user_id: string;
170
+ from: string;
171
+ to: string;
172
+ displays: CaptureDisplay[];
173
+ focus: CaptureFocusSpan[];
174
+ runs: CaptureActivityRun[];
175
+ chunks: CaptureChunk[];
176
+ }
177
+ export interface CaptureFrame {
178
+ frame_id: string;
179
+ ts: string;
180
+ device_id: string;
181
+ chunk_id: string;
182
+ frame_index: number | null;
183
+ app: string | null;
184
+ bundle_id: string | null;
185
+ title: string | null;
186
+ url: string | null;
187
+ domain: string | null;
188
+ ocr_text: string | null;
189
+ inactive: boolean;
190
+ display_id: number | null;
191
+ focused: boolean;
192
+ ocr_boxes?: Array<{
193
+ text: string;
194
+ x: number;
195
+ y: number;
196
+ w: number;
197
+ h: number;
198
+ }> | null;
199
+ }
200
+ export interface CaptureAction {
201
+ action_id: string;
202
+ ts: string;
203
+ device_id: string;
204
+ chunk_id: string;
205
+ kind: string;
206
+ app: string | null;
207
+ window_title: string | null;
208
+ description: string | null;
209
+ target: Record<string, unknown> | null;
210
+ screenshot: string | null;
211
+ }
212
+ export interface CaptureAudioLine {
213
+ line_id: string;
214
+ ts: string;
215
+ end_at: string;
216
+ device_id: string;
217
+ chunk_id: string;
218
+ text: string;
219
+ }
220
+ export interface CaptureTimelineItems {
221
+ user_id: string;
222
+ from: string;
223
+ to: string;
224
+ frames: CaptureFrame[];
225
+ actions: CaptureAction[];
226
+ audio: CaptureAudioLine[];
227
+ }
228
+ export interface CaptureDaysQuery {
229
+ tz?: string;
230
+ userId?: string;
231
+ deviceId?: string;
232
+ }
233
+ export interface CaptureDay {
234
+ day: string;
235
+ start_at: string;
236
+ end_at: string;
237
+ screen_seconds: number;
238
+ }
239
+ export interface CaptureDays {
240
+ user_id: string;
241
+ tz: string;
242
+ days: CaptureDay[];
243
+ }
244
+ export type CaptureSearchKind = CaptureLayer;
245
+ export interface CaptureSearchQuery extends Omit<CaptureWindowQuery, 'day' | 'displayId'> {
246
+ q: string;
247
+ kinds?: CaptureSearchKind[];
248
+ app?: string;
249
+ limit?: number;
250
+ scope?: 'mine' | 'account';
251
+ }
252
+ export interface CaptureSearchHit {
253
+ kind: CaptureSearchKind;
254
+ id: string;
255
+ ts: string;
256
+ user_id: string;
257
+ device_id: string;
258
+ chunk_id: string;
259
+ app: string | null;
260
+ title: string | null;
261
+ url: string | null;
262
+ display_id: number | null;
263
+ display_name: string | null;
264
+ snippet: string;
265
+ }
266
+ export interface CaptureSearchResult {
267
+ user_id: string | null;
268
+ q: string;
269
+ hits: CaptureSearchHit[];
270
+ }
271
+ export interface CaptureSignedUrl {
272
+ url: string;
273
+ expires_at: string;
274
+ }
275
+ export interface CaptureMediaUrl extends CaptureSignedUrl {
276
+ encrypted: boolean;
277
+ }
278
+ export interface CaptureFrameDetail {
279
+ frame: CaptureFrame;
280
+ display?: CaptureDisplay | null;
281
+ video: (CaptureMediaUrl & {
282
+ offset_ms: number;
283
+ }) | null;
284
+ screenshot?: (CaptureMediaUrl & {
285
+ name: string;
286
+ ts: string;
287
+ }) | null;
288
+ }
289
+ export interface CaptureChunkMedia {
290
+ chunk_id: string;
291
+ kind: CaptureChunk['kind'];
292
+ video: CaptureMediaUrl | null;
293
+ audio: CaptureMediaUrl | null;
294
+ }
295
+ export interface CaptureDeviceGrant {
296
+ user_code: string;
297
+ status: 'pending' | 'approved' | 'denied' | 'consumed' | 'expired';
298
+ expires_at: string;
299
+ device: {
300
+ name: string | null;
301
+ os: string | null;
302
+ os_version: string | null;
303
+ arch: string | null;
304
+ app_version: string | null;
305
+ };
306
+ account_id: string | null;
307
+ device_id: string | null;
308
+ }
309
+ export interface CaptureDeviceGrantDetail extends CaptureDeviceGrant {
310
+ accounts: {
311
+ account_id: string;
312
+ name: string;
313
+ }[];
314
+ }
315
+ export interface CaptureWorkspace {
316
+ account_id: string;
317
+ enabled: boolean;
318
+ can_read_all: boolean;
319
+ can_manage: boolean;
320
+ updated_at: string | null;
321
+ }
322
+ export declare function listCaptureDevices(accountId: string, opts?: {
323
+ userId?: string;
324
+ scope?: 'mine' | 'account';
325
+ }): Promise<{
326
+ devices: CaptureDevice[];
327
+ health: CaptureHealthSummary;
328
+ }>;
329
+ export declare function revokeCaptureDevice(accountId: string, deviceId: string): Promise<CaptureDevice>;
330
+ export declare function linkCaptureDevice(accountId: string, deviceId: string, userId: string | null): Promise<CaptureDevice>;
331
+ export declare function listCaptureEnrollmentTokens(accountId: string): Promise<{
332
+ tokens: CaptureEnrollmentToken[];
333
+ }>;
334
+ export declare function createCaptureEnrollmentToken(accountId: string, input: CaptureEnrollmentTokenInput): Promise<CaptureEnrollmentTokenSecret>;
335
+ export declare function revokeCaptureEnrollmentToken(accountId: string, tokenId: string): Promise<CaptureEnrollmentToken>;
336
+ export declare function listCaptureEnrollments(accountId: string, opts?: {
337
+ status?: CaptureEnrollmentStatus;
338
+ }): Promise<{
339
+ enrollments: CaptureEnrollment[];
340
+ }>;
341
+ export declare function approveCaptureEnrollment(accountId: string, enrollmentId: string, userId?: string | null): Promise<CaptureEnrollment>;
342
+ export declare function denyCaptureEnrollment(accountId: string, enrollmentId: string): Promise<CaptureEnrollment>;
343
+ export declare function getCapturePolicy(accountId: string): Promise<CapturePolicyRecord>;
344
+ export declare function setCapturePolicy(accountId: string, policy: CapturePolicy): Promise<CapturePolicyRecord>;
345
+ export declare function getCaptureTimeline(accountId: string, query?: CaptureWindowQuery): Promise<CaptureTimeline>;
346
+ export declare function getCaptureTimelineItems(accountId: string, query?: CaptureWindowQuery): Promise<CaptureTimelineItems>;
347
+ export declare function getCaptureDays(accountId: string, query?: CaptureDaysQuery): Promise<CaptureDays>;
348
+ export declare function searchCapture(accountId: string, query: CaptureSearchQuery): Promise<CaptureSearchResult>;
349
+ export declare function getCaptureFrame(accountId: string, frameId: string, opts?: {
350
+ userId?: string;
351
+ }): Promise<CaptureFrameDetail>;
352
+ export declare function getCaptureChunkMedia(accountId: string, chunkId: string, opts?: {
353
+ userId?: string;
354
+ }): Promise<CaptureChunkMedia>;
355
+ export declare function getCaptureAssetUrl(accountId: string, deviceId: string, name: string): Promise<CaptureSignedUrl>;
356
+ export declare function getCaptureDeviceGrant(userCode: string): Promise<CaptureDeviceGrantDetail>;
357
+ export declare function approveCaptureDeviceGrant(userCode: string, accountId?: string): Promise<CaptureDeviceGrant>;
358
+ export declare function denyCaptureDeviceGrant(userCode: string): Promise<CaptureDeviceGrant>;
359
+ export declare function getCaptureWorkspace(accountId: string): Promise<CaptureWorkspace>;
360
+ export declare function setCaptureEnabled(accountId: string, enabled: boolean): Promise<CaptureWorkspace>;
361
+ export declare function searchMyCapture(query: CaptureSearchQuery): Promise<CaptureSearchResult>;
362
+ export declare function getMyCaptureTimeline(query?: Omit<CaptureWindowQuery, 'userId'>): Promise<CaptureTimeline>;
363
+ export declare function getMyCaptureFrame(frameId: string): Promise<CaptureFrameDetail>;