{"version":3,"sources":["../src/http/HttpError.ts","../src/http/BaseClient.ts","../src/modules/auth/AuthClient.ts","../src/common/envelope.ts","../src/modules/mfa/MfaClient.ts","../src/modules/user/UserClient.ts","../src/modules/organization/OrganizationClient.ts","../src/adapters/projectAdapter.ts","../src/modules/projects/ProjectsClient.ts","../src/adapters/sandboxAdapter.ts","../src/modules/sandboxes/SandboxesClient.ts","../src/modules/credentials/types.ts","../src/modules/credentials/AgentTokensClient.ts","../src/modules/credentials/GatewayTokensClient.ts","../src/modules/credentials/TelegramClient.ts","../src/modules/credentials/CredentialsClient.ts","../src/modules/chat/ChatStream.ts","../src/modules/chat/ChatClient.ts","../src/modules/agentEngine/TemplatesClient.ts","../src/modules/agentEngine/ScheduledTasksClient.ts","../src/modules/resources/ResourcesClient.ts","../src/modules/systemEvents/types.ts","../src/modules/systemEvents/SystemEventsClient.ts","../src/modules/billing/SubscriptionsClient.ts","../src/modules/billing/CreditsClient.ts","../src/modules/usage/UsageClient.ts","../src/modules/budgets/BudgetsClient.ts","../src/modules/referrals/ReferralsClient.ts","../src/modules/reseller/ResellerClient.ts","../src/modules/platformAdmin/PlatformAdminClient.ts","../src/modules/deployments/DeploymentsClient.ts","../src/modules/bi/BIClient.ts","../src/modules/dashboards/DashboardsClient.ts","../src/client.ts","../src/common/types.ts","../src/modules/mfa/types.ts","../src/modules/credentials/providers.ts","../src/modules/budgets/types.ts","../src/modules/dashboards/types.ts","../src/modules/dashboards/validate.ts","../src/modules/dashboards/schema.json","../src/modules/dashboards/schema.ts"],"names":["normalize","BASE_PATH","BASE","ProviderType","AccessType","OrgRoles","MFAType"],"mappings":"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","file":"index.cjs","sourcesContent":["export class HttpError extends Error {\n  readonly status: number;\n  readonly statusText: string;\n  readonly errorCode: string | null;\n  readonly body: unknown;\n\n  constructor(status: number, statusText: string, body: unknown) {\n    const errorCode = extractErrorCode(body);\n    const message = extractMessage(body) ?? `${status} ${statusText}`;\n    super(message);\n    this.name = 'HttpError';\n    this.status = status;\n    this.statusText = statusText;\n    this.errorCode = errorCode;\n    this.body = body;\n  }\n}\n\nfunction extractErrorCode(body: unknown): string | null {\n  if (body && typeof body === 'object') {\n    const code = (body as Record<string, unknown>).error_code ?? (body as Record<string, unknown>).errorCode;\n    if (typeof code === 'string') return code;\n  }\n  return null;\n}\n\nfunction extractMessage(body: unknown): string | null {\n  if (body && typeof body === 'object') {\n    const msg = (body as Record<string, unknown>).message ?? (body as Record<string, unknown>).error;\n    if (typeof msg === 'string') return msg;\n  }\n  return null;\n}\n\nexport class NotImplementedError extends Error {\n  constructor(method: string) {\n    super(`${method} is not implemented in the cloud-agent backend yet.`);\n    this.name = 'NotImplementedError';\n  }\n}\n","import { HttpError } from './HttpError.js';\nimport type { TokenProvider, UnauthorizedHandler } from './tokenProvider.js';\n\n/**\n * Returns the org id the platform admin is currently impersonating, or\n * undefined when not impersonating. Resolved per-request so a UI toggle\n * takes effect on the next call without rebuilding the client. Honored\n * by the server only for users in the configured ADMIN_ORGANIZATION;\n * non-admins receive a 403.\n */\nexport type ImpersonationProvider = () => string | undefined | Promise<string | undefined>;\n\nexport interface BaseClientOptions {\n  baseUrl: string;\n  getToken?: TokenProvider;\n  onUnauthorized?: UnauthorizedHandler;\n  fetch?: typeof fetch;\n  debug?: boolean;\n  defaultHeaders?: Record<string, string>;\n  getImpersonateOrgId?: ImpersonationProvider;\n}\n\nexport type QueryValue = string | number | boolean | string[] | null | undefined;\nexport type Query = Record<string, QueryValue>;\n\nexport interface RequestOptions {\n  /**\n   * Query string params. Plain object; we serialize string/number/boolean,\n   * repeat arrays, and drop undefined/null values.\n   */\n  query?: object;\n  body?: unknown;\n  headers?: Record<string, string>;\n  /** Skip the bearer token (used for public endpoints like /user/login). */\n  skipAuth?: boolean;\n}\n\nexport class BaseClient {\n  readonly baseUrl: string;\n  private readonly getToken?: TokenProvider;\n  private readonly onUnauthorized?: UnauthorizedHandler;\n  private readonly fetchImpl: typeof fetch;\n  private readonly debug: boolean;\n  private readonly defaultHeaders: Record<string, string>;\n  private readonly getImpersonateOrgId?: ImpersonationProvider;\n\n  constructor(options: BaseClientOptions) {\n    if (!options.baseUrl) throw new Error('CloudAgentClient: baseUrl is required');\n    this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n    this.getToken = options.getToken;\n    this.onUnauthorized = options.onUnauthorized;\n    this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n    this.debug = options.debug ?? false;\n    this.defaultHeaders = options.defaultHeaders ?? {};\n    this.getImpersonateOrgId = options.getImpersonateOrgId;\n  }\n\n  get<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>('GET', path, options);\n  }\n  post<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>('POST', path, options);\n  }\n  put<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>('PUT', path, options);\n  }\n  patch<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>('PATCH', path, options);\n  }\n  delete<T>(path: string, options?: RequestOptions): Promise<T> {\n    return this.request<T>('DELETE', path, options);\n  }\n\n  async request<T>(\n    method: string,\n    path: string,\n    options: RequestOptions = {},\n    // Internal: set on the single post-refresh retry so a persistent 401\n    // can't loop. Not part of the public surface.\n    retrying = false,\n  ): Promise<T> {\n    const url = this.buildUrl(path, options.query);\n    const headers: Record<string, string> = { ...this.defaultHeaders, ...(options.headers ?? {}) };\n\n    if (!options.skipAuth && this.getToken) {\n      const token = await this.getToken();\n      if (token) headers['Authorization'] = `Bearer ${token}`;\n    }\n\n    // Impersonation header is opt-in via the constructor callback. The\n    // explicit per-request `headers` win — call sites that already supply\n    // an X-Impersonate-Org-Id (tests, edge cases) keep precedence.\n    if (\n      !options.skipAuth &&\n      this.getImpersonateOrgId &&\n      !('X-Impersonate-Org-Id' in headers) &&\n      !('x-impersonate-org-id' in headers)\n    ) {\n      const target = await this.getImpersonateOrgId();\n      if (target) headers['X-Impersonate-Org-Id'] = target;\n    }\n\n    let body: BodyInit | undefined;\n    if (options.body !== undefined && options.body !== null) {\n      if (options.body instanceof FormData) {\n        body = options.body;\n      } else {\n        if (!('Content-Type' in headers) && !('content-type' in headers)) {\n          headers['Content-Type'] = 'application/json';\n        }\n        body = JSON.stringify(options.body);\n      }\n    }\n\n    if (this.debug) {\n      // eslint-disable-next-line no-console\n      console.debug('[flashbacktech/tsclient] →', method, url, options.body ?? '');\n    }\n\n    const res = await this.fetchImpl(url, { method, headers, body });\n\n    let parsed: unknown = null;\n    const text = await res.text();\n    if (text.length > 0) {\n      try {\n        parsed = JSON.parse(text);\n      } catch {\n        parsed = text;\n      }\n    }\n\n    if (this.debug) {\n      // eslint-disable-next-line no-console\n      console.debug('[flashbacktech/tsclient] ←', res.status, url, parsed);\n    }\n\n    if (!res.ok) {\n      // On a 401 for an authed request, give the handler a chance to refresh\n      // the access token, then retry the original request exactly once with\n      // the new token. `retrying` guards against an infinite loop when the\n      // refreshed token still 401s; `skipAuth` requests (login etc.) carry no\n      // token to refresh, so a 401 there is a real failure, not staleness.\n      if (res.status === 401 && this.onUnauthorized && !options.skipAuth && !retrying) {\n        let refreshed = false;\n        try {\n          // void return ⇒ assume retry is worthwhile (legacy handlers);\n          // explicit false ⇒ refresh failed, surface the original 401.\n          refreshed = (await this.onUnauthorized()) !== false;\n        } catch {\n          // swallow handler failures — the original 401 is still surfaced\n        }\n        if (refreshed) {\n          return this.request<T>(method, path, options, true);\n        }\n      }\n      throw new HttpError(res.status, res.statusText, parsed);\n    }\n\n    return parsed as T;\n  }\n\n  private buildUrl(path: string, query?: object): string {\n    const base = path.startsWith('http') ? path : `${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n    if (!query) return base;\n    const params = new URLSearchParams();\n    for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n      if (value === undefined || value === null) continue;\n      if (Array.isArray(value)) {\n        for (const v of value) params.append(key, String(v));\n      } else {\n        params.set(key, String(value));\n      }\n    }\n    const qs = params.toString();\n    return qs ? `${base}?${qs}` : base;\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  ActivateRequest,\n  ExchangeCodeRequest,\n  LoginRequest,\n  PublicConfig,\n  RefreshRequest,\n  RegisterRequest,\n  ResetPasswordRequest,\n  SessionResponse,\n  SimpleResponse,\n} from './types.js';\n\nexport class AuthClient {\n  constructor(private readonly http: BaseClient) {}\n\n  login(body: LoginRequest): Promise<SessionResponse> {\n    return this.http.post<SessionResponse>('/user/login', { body, skipAuth: true });\n  }\n\n  register(body: RegisterRequest): Promise<SessionResponse> {\n    return this.http.post<SessionResponse>('/user/register', { body, skipAuth: true });\n  }\n\n  /**\n   * Unauthenticated boot config. The SPA reads `openRegistration` to decide\n   * whether to render the self-service signup form (false => invite-only /\n   * preview mode). Safe to call before any session exists.\n   */\n  publicConfig(): Promise<PublicConfig> {\n    return this.http.get<PublicConfig>('/public-config', { skipAuth: true });\n  }\n\n  logout(refreshToken?: string): Promise<SimpleResponse> {\n    return this.http.post<SimpleResponse>('/user/logout', {\n      body: { refreshToken },\n    });\n  }\n\n  refresh(body: RefreshRequest): Promise<SessionResponse> {\n    return this.http.post<SessionResponse>('/user/refresh', { body, skipAuth: true });\n  }\n\n  activate(body: ActivateRequest): Promise<SessionResponse> {\n    return this.http.post<SessionResponse>('/user/activate', { body, skipAuth: true });\n  }\n\n  requestVerification(email: string): Promise<SimpleResponse> {\n    return this.http.post<SimpleResponse>('/user/request-verification', {\n      body: { email },\n      skipAuth: true,\n    });\n  }\n\n  requestPasswordReset(email: string): Promise<SimpleResponse> {\n    return this.http.post<SimpleResponse>('/user/request-reset-password', {\n      body: { email },\n      skipAuth: true,\n    });\n  }\n\n  resetPassword(body: ResetPasswordRequest): Promise<SimpleResponse> {\n    return this.http.post<SimpleResponse>('/user/reset-password', { body, skipAuth: true });\n  }\n\n  exchangeGoogle(body: ExchangeCodeRequest): Promise<SessionResponse> {\n    return this.http.post<SessionResponse>('/auth/google/exchange', { body, skipAuth: true });\n  }\n}\n","/**\n * Most cloud-agent endpoints return `{ success: true, data: T }` or\n * `{ success: true, <key>: T }`. A few (system events, exchange) return\n * bare shapes. These helpers keep envelope handling out of the per-domain\n * clients.\n */\n\nexport interface SuccessEnvelope<T> {\n  success: boolean;\n  data?: T;\n  message?: string;\n  error_code?: string;\n}\n\nexport function unwrapData<T>(payload: { success?: boolean; data?: T } | undefined | null): T {\n  if (!payload || payload.data === undefined) {\n    throw new Error('Response envelope missing `data` field.');\n  }\n  return payload.data;\n}\n\nexport function unwrapKey<T>(payload: Record<string, unknown> | undefined | null, key: string): T {\n  if (!payload || payload[key] === undefined) {\n    throw new Error(`Response envelope missing \\`${key}\\` field.`);\n  }\n  return payload[key] as T;\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  MagicLinkActivateRequest,\n  MagicLinkSendResponse,\n  MFASetupResponse,\n  MFASimpleResponse,\n  MFAStatus,\n  MFAType,\n  MFAVerifyLoginRequest,\n  MFAVerifyLoginResponse,\n  MFAVerifySetupRequest,\n} from './types.js';\n\nexport class MfaClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async getStatus(): Promise<MFAStatus> {\n    const res = await this.http.get<{ success: boolean; data: MFAStatus }>('/mfa/status');\n    return unwrapData(res);\n  }\n\n  async getMethods(): Promise<MFAType[]> {\n    const res = await this.http.get<{ success: boolean; data: { methods: MFAType[] } }>('/mfa/methods');\n    return res.data?.methods ?? [];\n  }\n\n  setup(body: { mfaType: MFAType; email?: string }): Promise<MFASetupResponse> {\n    return this.http.post<MFASetupResponse>('/mfa/setup', { body });\n  }\n\n  verifySetup(body: MFAVerifySetupRequest): Promise<MFASimpleResponse> {\n    return this.http.post<MFASimpleResponse>('/mfa/verify-setup', { body });\n  }\n\n  enable(mfaType: MFAType): Promise<MFASimpleResponse> {\n    return this.http.post<MFASimpleResponse>('/mfa/enable', { body: { mfaType } });\n  }\n\n  disable(mfaType: MFAType): Promise<MFASimpleResponse> {\n    return this.http.post<MFASimpleResponse>('/mfa/disable', { body: { mfaType } });\n  }\n\n  setPrimary(mfaType: MFAType): Promise<MFASimpleResponse> {\n    return this.http.post<MFASimpleResponse>('/mfa/primary', { body: { mfaType } });\n  }\n\n  sendMagicLink(): Promise<MagicLinkSendResponse> {\n    return this.http.post<MagicLinkSendResponse>('/mfa/magic-link/send', {});\n  }\n\n  activateMagicLink(body: MagicLinkActivateRequest): Promise<MFAVerifyLoginResponse> {\n    return this.http.post<MFAVerifyLoginResponse>('/mfa/magic-link/activate', { body, skipAuth: true });\n  }\n\n  verifyLogin(body: MFAVerifyLoginRequest): Promise<MFAVerifyLoginResponse> {\n    return this.http.post<MFAVerifyLoginResponse>('/mfa/verify-login', { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type { UpdateUserRequest, UpdateUserResponse, UserProfile } from './types.js';\n\nexport class UserClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async getProfile(): Promise<UserProfile> {\n    const res = await this.http.get<{ success: boolean; data: UserProfile }>('/me');\n    return unwrapData(res);\n  }\n\n  update(body: UpdateUserRequest): Promise<UpdateUserResponse> {\n    return this.http.put<UpdateUserResponse>('/user', { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  AcceptInviteRequest,\n  AddUserToOrgRequest,\n  AddUserToOrgResult,\n  AdjustOrgCreditsRequest,\n  AdjustOrgCreditsResult,\n  AdminOrgSummaryQuery,\n  AdminOrgSummaryResponse,\n  CreateOrganizationRequest,\n  CreateOrganizationUserRequest,\n  InviteOrgRequest,\n  InviteOrgResult,\n  OrgCreditBalance,\n  OrgInvite,\n  OrgNotifySubscriptions,\n  OrgSearchResult,\n  Organization,\n  OrganizationUser,\n  SetOrgNotifySubscriptionsRequest,\n  SimpleOrgResponse,\n  UpdateOrganizationRequest,\n  UpdateOrgUserRequest,\n} from './types.js';\n\nexport class OrganizationClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async get(orgId: string): Promise<Organization> {\n    const res = await this.http.get<{ success: boolean; data: Organization }>(`/organization/${orgId}`);\n    return unwrapData(res);\n  }\n\n  async update(orgId: string, body: UpdateOrganizationRequest): Promise<Organization> {\n    const res = await this.http.put<{ success: boolean; data: Organization }>(`/organization/${orgId}`, { body });\n    return unwrapData(res);\n  }\n\n  /**\n   * Self-service: create an org for the current (orgless) user and assign them\n   * as Owner. Used by the onboarding wizard so the org exists before the limits\n   * and project/sandbox steps. Fails if the user already belongs to an org.\n   */\n  async create(body: CreateOrganizationRequest): Promise<Organization> {\n    const res = await this.http.post<{ success: boolean; data: Organization }>('/organization', { body });\n    return unwrapData(res);\n  }\n\n  /**\n   * Fetch the org's default-notification-channel config: the per-event\n   * subscriptions, the notify channels available to route to, and whether the\n   * caller's org is the platform-admin org (which unlocks the cross-org\n   * `engine_failure` / `infra_outage` event types).\n   */\n  async getNotifySubscriptions(): Promise<OrgNotifySubscriptions> {\n    const res = await this.http.get<{ success: boolean; data: OrgNotifySubscriptions }>(\n      '/organization/notify-subscriptions',\n    );\n    return unwrapData(res);\n  }\n\n  /**\n   * Replace the org's notify subscriptions (replace-set). Each edge is\n   * validated server-side: the credential must be a notify channel in the org,\n   * and admin-only event types require a platform-admin caller.\n   */\n  setNotifySubscriptions(body: SetOrgNotifySubscriptionsRequest): Promise<SimpleOrgResponse> {\n    return this.http.put<SimpleOrgResponse>('/organization/notify-subscriptions', { body });\n  }\n\n  async listUsers(): Promise<OrganizationUser[]> {\n    const res = await this.http.get<{ success: boolean; data: OrganizationUser[] }>('/organization/users');\n    return res.data ?? [];\n  }\n\n  updateUser(userId: string, body: UpdateOrgUserRequest): Promise<SimpleOrgResponse> {\n    return this.http.put<SimpleOrgResponse>(`/organization/users/${userId}`, { body });\n  }\n\n  /** Backend currently returns 501. Surfaced for forward-compat. */\n  createUser(body: CreateOrganizationUserRequest): Promise<SimpleOrgResponse> {\n    return this.http.post<SimpleOrgResponse>('/organization/users', { body });\n  }\n\n  /** Backend currently returns 501. Surfaced for forward-compat. */\n  deleteUser(userId: string): Promise<SimpleOrgResponse> {\n    return this.http.delete<SimpleOrgResponse>(`/organization/users/${userId}`);\n  }\n\n  /** Accept an org invite: verifies the one-time token and sets the user's password. */\n  acceptInvite(body: AcceptInviteRequest): Promise<SimpleOrgResponse> {\n    return this.http.post<SimpleOrgResponse>('/organization/invite/accept', { body });\n  }\n\n  /**\n   * Platform-admin only: list every org for the impersonation picker.\n   * The server returns 403 when the caller's home org is not the\n   * configured ADMIN_ORGANIZATION; render the picker only when the\n   * authenticated user has `isPlatformAdmin === true`.\n   */\n  async listAll(): Promise<Array<{ id: string; name: string; allowDebug: boolean }>> {\n    const res = await this.http.get<{\n      success: boolean;\n      data: Array<{ id: string; name: string; allowDebug: boolean }>;\n    }>('/orgs/list-all');\n    return res.data ?? [];\n  }\n\n  /**\n   * Platform-admin only: typeahead org search. Returns up to `limit` matches\n   * (id+name) for the case-insensitive name substring `q` (or the first\n   * `limit` orgs when `q` is empty) plus the total match count, so a picker\n   * can show \"N more — refine your search\". Returns 403 unless platform admin.\n   */\n  async searchOrgs(q = '', limit = 10): Promise<OrgSearchResult> {\n    const res = await this.http.get<{ success: boolean; data: OrgSearchResult }>('/orgs/search', {\n      query: { q, limit },\n    });\n    return unwrapData(res);\n  }\n\n  /**\n   * Platform-admin only: one page of the service-wide org summary — per-org\n   * user/project/sandbox counts, trailing 7d/30d metered usage, billed-to-\n   * balance, lifetime purchases and current credit balance — searchable by\n   * name and pageable. Backs the admin Summary screen. Returns 403 unless the\n   * caller's home org is the configured ADMIN_ORGANIZATION.\n   */\n  async adminOrgSummary(query: AdminOrgSummaryQuery = {}): Promise<AdminOrgSummaryResponse> {\n    const res = await this.http.get<{ success: boolean; data: AdminOrgSummaryResponse }>(\n      '/admin/orgs/summary',\n      { query: query as Record<string, unknown> },\n    );\n    return unwrapData(res);\n  }\n\n  /**\n   * Platform-admin only: provision a new organization + founding owner and\n   * email the owner an invite link. The invite-only counterpart to public\n   * self-service registration (used while the backend has OPEN_REGISTRATION\n   * disabled). Returns 403 unless the caller's home org is the configured\n   * ADMIN_ORGANIZATION; 409 when the owner email already exists.\n   */\n  async inviteOrg(body: InviteOrgRequest): Promise<InviteOrgResult> {\n    const res = await this.http.post<{ success: boolean; data: InviteOrgResult }>(\n      '/organization/invite-org',\n      { body },\n    );\n    return unwrapData(res);\n  }\n\n  /**\n   * Platform-admin only: list every outstanding org + member invite (founding-\n   * owner invites from `inviteOrg` and members added via `addUserToOrg`) with\n   * derived status, newest first. Cancelled invites (soft-deleted) and live\n   * non-invited orgs are excluded. Returns 403 unless platform admin.\n   */\n  async listOrgInvites(): Promise<OrgInvite[]> {\n    const res = await this.http.get<{ success: boolean; data: OrgInvite[] }>('/admin/org-invites');\n    return res.data ?? [];\n  }\n\n  /**\n   * Platform-admin only: re-send an invite — mints a fresh 7-day token and\n   * re-emails the link. Returns 403 unless platform admin; 404 when no pending\n   * invite exists; 409 once the invite has been redeemed.\n   */\n  resendOrgInvite(userId: string): Promise<SimpleOrgResponse> {\n    return this.http.post<SimpleOrgResponse>(`/admin/org-invites/${userId}/resend`, {});\n  }\n\n  /**\n   * Platform-admin only: cancel a pending invite. Soft-deletes the invited user\n   * (and the shell org, for a never-redeemed founding-owner invite with no other\n   * members) and revokes the token, freeing the email for re-invite. Returns 403\n   * unless platform admin; 404 when absent; 409 once the invite has been redeemed.\n   */\n  cancelOrgInvite(userId: string): Promise<SimpleOrgResponse> {\n    return this.http.post<SimpleOrgResponse>(`/admin/org-invites/${userId}/cancel`, {});\n  }\n\n  /**\n   * Platform-admin only: enable or disable the debug surface for an org.\n   * Returns the updated org entry with the new allowDebug value.\n   */\n  async setAllowDebug(orgId: string, allow: boolean): Promise<{ id: string; name: string; allowDebug: boolean }> {\n    const res = await this.http.patch<{\n      success: boolean;\n      data: { id: string; name: string; allowDebug: boolean };\n    }>(`/orgs/${orgId}/allow-debug`, { body: { allow } });\n    return res.data!;\n  }\n\n  /**\n   * Platform-admin only: add a new member to an existing org.\n   * Creates the user without a password and sends an invite email via the\n   * same TokenOrgInvite flow as the regular member invite.\n   * Returns 403 unless platform admin; 409 when the email already exists.\n   */\n  async addUserToOrg(orgId: string, body: AddUserToOrgRequest): Promise<AddUserToOrgResult> {\n    const res = await this.http.post<{ success: boolean; data: AddUserToOrgResult }>(\n      `/orgs/${orgId}/users`,\n      { body },\n    );\n    return unwrapData(res);\n  }\n\n  /**\n   * Platform-admin only: fetch an org's two-bucket credit balance.\n   * Returns 403 unless platform admin; 404 when the org doesn't exist.\n   */\n  async getOrgCreditBalance(orgId: string): Promise<OrgCreditBalance> {\n    const res = await this.http.get<{ success: boolean; data: OrgCreditBalance }>(\n      `/orgs/${orgId}/credits`,\n    );\n    return unwrapData(res);\n  }\n\n  /**\n   * Platform-admin only: grant or revoke credits on an org.\n   * amountMicros is signed: positive = grant, negative = revoke.\n   * Records a CreditKindAdminAdjust ledger entry and returns the updated balance.\n   */\n  async adjustOrgCredits(orgId: string, body: AdjustOrgCreditsRequest): Promise<AdjustOrgCreditsResult> {\n    const res = await this.http.post<{ success: boolean; data: AdjustOrgCreditsResult }>(\n      `/orgs/${orgId}/credits/adjust`,\n      { body },\n    );\n    return unwrapData(res);\n  }\n}\n","import type { PreferredAiProvider, ProductKind, Project } from '../modules/projects/types.js';\n\ninterface WireProject {\n  id: string;\n  name: string;\n  orgId: string;\n  default?: boolean;\n  isReferenceProject?: boolean;\n  preferredAiProvider?: string | null;\n  product?: string;\n  users?: unknown[];\n}\n\nexport const projectAdapter = {\n  fromListResponse(payload: unknown): Project[] {\n    const list = (payload as { workspaces?: WireProject[]; projects?: WireProject[] } | null)?.workspaces\n      ?? (payload as { projects?: WireProject[] } | null)?.projects\n      ?? [];\n    return list.map(normalize);\n  },\n\n  fromGetResponse(payload: unknown): Project {\n    const wire = (payload as { workspace?: WireProject; project?: WireProject; data?: WireProject } | null);\n    const value = wire?.workspace ?? wire?.project ?? wire?.data;\n    if (!value) throw new Error('Project response missing body.');\n    return normalize(value);\n  },\n\n  normalize,\n};\n\nfunction normalize(wire: WireProject): Project {\n  return {\n    id: wire.id,\n    name: wire.name,\n    orgId: wire.orgId,\n    default: wire.default ?? false,\n    isReferenceProject: wire.isReferenceProject ?? false,\n    preferredAiProvider: (wire.preferredAiProvider ?? null) as PreferredAiProvider | null,\n    product: (wire.product ?? 'cloud') as ProductKind,\n    users: (wire.users ?? []) as Project['users'],\n  };\n}\n\n// TODO(backend-cleanup): cloud-agent-backend internal/http/routes/project/project.go\n// still returns `workspaces` / `workspace` keys. When those are renamed to\n// `projects` / `project`, this adapter can fall through to a plain unwrap.\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { projectAdapter } from '../../adapters/projectAdapter.js';\nimport type {\n  AddMemberRequest,\n  CreateProjectRequest,\n  ProductKind,\n  Project,\n  UpdateMemberRoleRequest,\n  UpdateProjectRequest,\n} from './types.js';\n\ninterface SimpleResponse {\n  success: boolean;\n  message?: string;\n}\n\nexport class ProjectsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  /**\n   * Lists the caller's projects in one product partition. Omitting `product`\n   * defaults to 'cloud' server-side (the cloud UI). The BI frontend passes\n   * 'bi' so it only ever sees data projects.\n   */\n  async list(product?: ProductKind): Promise<Project[]> {\n    const path = product ? `/project?product=${encodeURIComponent(product)}` : '/project';\n    const res = await this.http.get<unknown>(path);\n    return projectAdapter.fromListResponse(res);\n  }\n\n  async get(projectId: string): Promise<Project> {\n    const res = await this.http.get<unknown>(`/project/${projectId}`);\n    return projectAdapter.fromGetResponse(res);\n  }\n\n  async create(body: CreateProjectRequest): Promise<Project> {\n    const res = await this.http.post<unknown>('/project', { body });\n    return projectAdapter.fromGetResponse(res);\n  }\n\n  async update(projectId: string, body: UpdateProjectRequest): Promise<Project> {\n    const res = await this.http.put<unknown>(`/project/${projectId}`, { body });\n    return projectAdapter.fromGetResponse(res);\n  }\n\n  delete(projectId: string): Promise<SimpleResponse> {\n    return this.http.delete<SimpleResponse>(`/project/${projectId}`);\n  }\n\n  addMember(projectId: string, body: AddMemberRequest): Promise<SimpleResponse> {\n    return this.http.post<SimpleResponse>(`/project/${projectId}/users`, { body });\n  }\n\n  updateMemberRole(projectId: string, userId: string, body: UpdateMemberRoleRequest): Promise<SimpleResponse> {\n    return this.http.put<SimpleResponse>(`/project/${projectId}/users/${userId}`, { body });\n  }\n\n  removeMember(projectId: string, userId: string): Promise<SimpleResponse> {\n    return this.http.delete<SimpleResponse>(`/project/${projectId}/users/${userId}`);\n  }\n}\n","import type { Sandbox } from '../modules/sandboxes/types.js';\n\ninterface WireSandbox {\n  id: string;\n  name: string;\n  storageType: string;\n  mode: string;\n  orgId: string;\n  userId: string;\n  createdAt: string;\n  disabled?: boolean;\n  // Legacy wire alternates: backend may send projectId or workspaceId.\n  projectId?: string | null;\n  workspaceId?: string | null;\n}\n\nexport const sandboxAdapter = {\n  fromListResponse(payload: unknown): Sandbox[] {\n    const list = (payload as { repos?: WireSandbox[]; sandboxes?: WireSandbox[] } | null)?.repos\n      ?? (payload as { sandboxes?: WireSandbox[] } | null)?.sandboxes\n      ?? [];\n    return list.map(normalize);\n  },\n\n  fromGetResponse(payload: unknown): Sandbox {\n    const wire = payload as { repo?: WireSandbox; sandbox?: WireSandbox; data?: WireSandbox } | null;\n    const value = wire?.repo ?? wire?.sandbox ?? wire?.data;\n    if (!value) throw new Error('Sandbox response missing body.');\n    return normalize(value);\n  },\n\n  normalize,\n};\n\nfunction normalize(wire: WireSandbox): Sandbox {\n  return {\n    id: wire.id,\n    name: wire.name,\n    storageType: wire.storageType,\n    mode: wire.mode,\n    orgId: wire.orgId,\n    userId: wire.userId,\n    projectId: wire.projectId ?? wire.workspaceId ?? null,\n    createdAt: wire.createdAt,\n    disabled: wire.disabled ?? false,\n  };\n}\n\n// TODO(backend-cleanup): cloud-agent-backend internal/http/routes/sandbox/sandbox.go\n// still returns `repos` / `repo` response keys, and Sandbox JSON may carry\n// `workspaceId` instead of `projectId` (internal/domain/types.go). When both\n// are renamed, this adapter collapses to a plain unwrap.\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { sandboxAdapter } from '../../adapters/sandboxAdapter.js';\nimport type {\n  CreateSandboxRequest,\n  ListSandboxesQuery,\n  Sandbox,\n  UpdateSandboxRequest,\n} from './types.js';\n\ninterface SimpleResponse {\n  success: boolean;\n  message?: string;\n}\n\nexport class SandboxesClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async list(query: ListSandboxesQuery = {}): Promise<Sandbox[]> {\n    const res = await this.http.get<unknown>('/sandbox', {\n      query: { projectId: query.projectId },\n    });\n    return sandboxAdapter.fromListResponse(res);\n  }\n\n  async get(sandboxId: string): Promise<Sandbox> {\n    const res = await this.http.get<unknown>(`/sandbox/${sandboxId}`);\n    return sandboxAdapter.fromGetResponse(res);\n  }\n\n  async create(body: CreateSandboxRequest): Promise<Sandbox> {\n    const res = await this.http.post<unknown>('/sandbox', {\n      body: {\n        name: body.name,\n        projectId: body.projectId,\n        storageType: body.storageType ?? 'S3',\n        mode: body.mode ?? 'NORMAL',\n      },\n    });\n    return sandboxAdapter.fromGetResponse(res);\n  }\n\n  async update(sandboxId: string, body: UpdateSandboxRequest): Promise<Sandbox> {\n    const res = await this.http.put<unknown>(`/sandbox/${sandboxId}`, { body });\n    return sandboxAdapter.fromGetResponse(res);\n  }\n\n  delete(sandboxId: string): Promise<SimpleResponse> {\n    return this.http.delete<SimpleResponse>(`/sandbox/${sandboxId}`);\n  }\n}\n","// Credential types for @flashbacktech/tsclient.\n//\n// Schema mirrors cloud-agent-backend's Credential row (renamed from APIKey\n// in migration 0010). Every provider — cloud (AWS/GCP/AZURE), infra\n// (SSH), VCS (GitHub/GitLab/Azure DevOps), AI/LLM (OpenAI/Anthropic) —\n// uses the same `(provider, label, secret, metadata)` shape.\n// Provider-specific fields live in `metadata`; the catalog at\n// ./providers.ts is the source of truth for what each provider's fields\n// look like.\n//\n// Sandbox-scoped FOA bearer tokens (formerly RepoAiApiKey) are now\n// modelled separately as GatewayToken — see below.\n\n// ProviderID is open: the catalog defines a default set, but we allow\n// any string so customer-extended catalogs are still typed.\nexport type ProviderID = 'AWS' | 'BEDROCK' | 'GCP' | 'AZURE' | 'OCI' | 'SSH' | 'GITHUB' | 'GITLAB' | 'AZURE_DEVOPS' | 'OPENAI' | 'ANTHROPIC' | 'GEMINI' | string;\n\n// ── Universal credential ─────────────────────────────────────────────\n\n// Credential is the read-projection of one row in the Credential table.\n// Never includes the secret. `displayHint` is the catalog-computed\n// snippet for listings (e.g. \"AKIATEST… / us-east-1\",\n// \"ubuntu@vps.example.com:22\").\nexport interface Credential {\n  id: string;\n  provider: ProviderID;\n  label: string;\n  metadata: Record<string, unknown>;\n  displayHint?: string;\n  createdAt: string;\n}\n\n// CreateCredentialRequest is the universal create body. Provider-specific\n// fields go inside `metadata`; the catalog validates the shape both\n// client-side (./providers.ts:validate) and server-side.\nexport interface CreateCredentialRequest {\n  provider: ProviderID;\n  label: string;\n  secret: string;\n  metadata?: Record<string, unknown>;\n  projectId: string;\n}\n\n// UpdateCredentialRequest is partial. Provider is immutable on update; to\n// change provider, delete and re-create. `metadata` is replace-wholesale\n// when present.\nexport interface UpdateCredentialRequest {\n  label?: string;\n  secret?: string;\n  metadata?: Record<string, unknown>;\n}\n\n// ListCredentialsQuery narrows /credentials by project and optionally by\n// provider id or capability bit (storage|ai|compute|vcs|notify).\nexport interface ListCredentialsQuery {\n  projectId: string;\n  provider?: ProviderID;\n  capability?: 'storage' | 'ai' | 'compute' | 'vcs' | 'notify';\n}\n\n// SandboxCredential is one row in the SandboxCredential join table —\n// links a sandbox to a project-level credential. The PK is\n// (sandboxId, credentialId), so association identity is the pair itself\n// (no synthetic association id).\nexport interface SandboxCredential {\n  sandboxId: string;\n  credentialId: string;\n  provider: ProviderID;\n  label: string;\n  displayHint?: string;\n  createdAt: string;\n}\n\n// ── Sandbox gateway tokens ───────────────────────────────────────────\n\n// GatewayToken is a sandbox-scoped, OpenAI-compatible bearer used by the\n// agent engine to authenticate to FlashOnAI. The plaintext secret is\n// returned exactly once — at creation — and never re-fetchable.\nexport interface GatewayToken {\n  id: string;\n  sandboxId: string;\n  label: string;\n  createdAt: string;\n}\n\nexport interface CreateGatewayTokenRequest {\n  label: string;\n}\n\n// CreateGatewayTokenResponse is the create-time-only shape — `secret`\n// holds the plaintext bearer the caller must surface (\"copy now\")\n// before navigating away.\nexport interface CreateGatewayTokenResponse {\n  token: GatewayToken;\n  secret: string;\n}\n\n// AgentToken is a sandbox-scoped bearer an EXTERNAL agent (Claude Code,\n// Cursor, Codex, …) presents to the MCP server (/mcp) to drive this\n// sandbox's cloud agent. Only a hash is stored server-side; the plaintext\n// (`secret`) is returned exactly once at creation. `tokenPrefix` is a\n// non-secret display fragment (\"fba_AbCd…\") so a list can disambiguate\n// rotated tokens.\nexport interface AgentToken {\n  id: string;\n  sandboxId: string;\n  label: string;\n  tokenPrefix: string;\n  lastUsedAt?: string;\n  createdAt: string;\n}\n\nexport interface CreateAgentTokenRequest {\n  label: string;\n}\n\n// CreateAgentTokenResponse is the create-time-only shape — `secret` holds\n// the plaintext bearer the caller must surface (\"copy now\") before\n// navigating away.\nexport interface CreateAgentTokenResponse {\n  token: AgentToken;\n  secret: string;\n}\n\n// ── Common envelope ──────────────────────────────────────────────────\n\nexport interface SimpleKeysResponse {\n  success: boolean;\n  message?: string;\n  data?: unknown;\n}\n\n// ── Wire shapes (legacy field-name aliases collapse here) ────────────\n\nexport interface WireSandboxCredential {\n  // Backend wire emits sandboxId; older clients may still see repoId.\n  // Normaliser collapses both into SandboxCredential.sandboxId.\n  sandboxId?: string;\n  repoId?: string;\n  credentialId: string;\n  provider: string;\n  label: string;\n  displayHint?: string | null;\n  createdAt: string;\n}\n\nexport interface WireGatewayToken {\n  id: string;\n  // Backend wire emits sandboxId via \"repoId\" today (StorageRepo/Sandbox\n  // alias); accept both.\n  sandboxId?: string;\n  repoId?: string;\n  label: string;\n  createdAt: string;\n}\n\nexport function normalizeSandboxCredential(wire: WireSandboxCredential): SandboxCredential {\n  return {\n    sandboxId: wire.sandboxId ?? wire.repoId ?? '',\n    credentialId: wire.credentialId,\n    provider: wire.provider,\n    label: wire.label,\n    displayHint: wire.displayHint ?? undefined,\n    createdAt: wire.createdAt,\n  };\n}\n\nexport function normalizeGatewayToken(wire: WireGatewayToken): GatewayToken {\n  return {\n    id: wire.id,\n    sandboxId: wire.sandboxId ?? wire.repoId ?? '',\n    label: wire.label,\n    createdAt: wire.createdAt,\n  };\n}\n\nexport interface WireAgentToken {\n  id: string;\n  // Backend emits sandboxId; accept repoId too for forward/backward compat.\n  sandboxId?: string;\n  repoId?: string;\n  label: string;\n  tokenPrefix: string;\n  lastUsedAt?: string | null;\n  createdAt: string;\n}\n\nexport function normalizeAgentToken(wire: WireAgentToken): AgentToken {\n  return {\n    id: wire.id,\n    sandboxId: wire.sandboxId ?? wire.repoId ?? '',\n    label: wire.label,\n    tokenPrefix: wire.tokenPrefix,\n    lastUsedAt: wire.lastUsedAt ?? undefined,\n    createdAt: wire.createdAt,\n  };\n}\n","// AgentTokensClient covers sandbox-scoped agent access tokens — the bearers\n// an EXTERNAL agent (Claude Code, Cursor, Codex, …) presents to the MCP\n// server (/mcp) to drive this sandbox's cloud agent. Each sandbox can have\n// multiple tokens (one per client, rotation).\n//\n// The plaintext bearer is returned EXACTLY ONCE — at create time. The\n// frontend must surface it (\"copy now\") before navigating away; the server\n// stores only a sha256 hash, so a lost plaintext is unrecoverable (delete +\n// recreate).\nimport type { BaseClient } from '../../http/BaseClient.js';\nimport {\n  AgentToken,\n  CreateAgentTokenRequest,\n  CreateAgentTokenResponse,\n  SimpleKeysResponse,\n  WireAgentToken,\n  normalizeAgentToken,\n} from './types.js';\n\nexport class AgentTokensClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async list(sandboxId: string): Promise<AgentToken[]> {\n    const res = await this.http.get<{ success: boolean; tokens?: WireAgentToken[]; data?: WireAgentToken[] }>(\n      `/sandbox/${sandboxId}/agent-token`,\n    );\n    const list = res.tokens ?? res.data ?? [];\n    return list.map(normalizeAgentToken);\n  }\n\n  /**\n   * create returns both the persisted token row and the plaintext bearer\n   * (`secret`). The bearer is shown only here; surface it to the user\n   * immediately. If they navigate away without copying, they must delete the\n   * token and create a new one.\n   */\n  async create(sandboxId: string, body: CreateAgentTokenRequest): Promise<CreateAgentTokenResponse> {\n    const res = await this.http.post<{\n      success: boolean;\n      token?: WireAgentToken;\n      secret?: string;\n    }>(`/sandbox/${sandboxId}/agent-token`, { body });\n    if (!res.token || !res.secret) {\n      throw new Error('createAgentToken response missing token or secret.');\n    }\n    return {\n      token: normalizeAgentToken(res.token),\n      secret: res.secret,\n    };\n  }\n\n  delete(sandboxId: string, tokenId: string): Promise<SimpleKeysResponse> {\n    return this.http.delete<SimpleKeysResponse>(`/sandbox/${sandboxId}/agent-token/${tokenId}`);\n  }\n}\n","// GatewayTokensClient covers sandbox-scoped FOA bearer tokens (the\n// post-redesign replacement for the legacy RepoAiApiKey rows). Each\n// sandbox can have multiple tokens for rotation / dev-prod separation.\n//\n// The plaintext bearer is returned EXACTLY ONCE — at create time. The\n// frontend must surface it (\"copy now\") before navigating away; once\n// the response is dropped, only the encrypted envelope persists and the\n// plaintext is unrecoverable.\nimport type { BaseClient } from '../../http/BaseClient.js';\nimport {\n  CreateGatewayTokenRequest,\n  CreateGatewayTokenResponse,\n  GatewayToken,\n  SimpleKeysResponse,\n  WireGatewayToken,\n  normalizeGatewayToken,\n} from './types.js';\n\nexport class GatewayTokensClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async list(sandboxId: string): Promise<GatewayToken[]> {\n    const res = await this.http.get<{ success: boolean; tokens?: WireGatewayToken[]; data?: WireGatewayToken[] }>(\n      `/sandbox/${sandboxId}/gateway-token`,\n    );\n    const list = res.tokens ?? res.data ?? [];\n    return list.map(normalizeGatewayToken);\n  }\n\n  /**\n   * create returns both the persisted token row and the plaintext bearer\n   * (`secret`). The bearer is shown only here; surface it to the user\n   * immediately. If they navigate away without copying, they have to\n   * delete the token and create a new one.\n   */\n  async create(sandboxId: string, body: CreateGatewayTokenRequest): Promise<CreateGatewayTokenResponse> {\n    const res = await this.http.post<{\n      success: boolean;\n      token?: WireGatewayToken;\n      secret?: string;\n    }>(`/sandbox/${sandboxId}/gateway-token`, { body });\n    if (!res.token || !res.secret) {\n      throw new Error('createGatewayToken response missing token or secret.');\n    }\n    return {\n      token: normalizeGatewayToken(res.token),\n      secret: res.secret,\n    };\n  }\n\n  delete(sandboxId: string, tokenId: string): Promise<SimpleKeysResponse> {\n    return this.http.delete<SimpleKeysResponse>(`/sandbox/${sandboxId}/gateway-token/${tokenId}`);\n  }\n}\n","// TelegramClient covers the inbound-control surface for a sandbox's Telegram\n// bot (Feature 2). The bot is a project-scoped TELEGRAM credential attached to\n// the sandbox; these endpoints enable the inbound webhook, mint single-use link\n// codes (pasted in Telegram as `/link <code>`), and list/revoke chat bindings.\n//\n// The link code is returned EXACTLY ONCE at mint time — surface it immediately.\n// The backend stores only its hash.\nimport type { BaseClient } from '../../http/BaseClient.js';\n\nexport interface TelegramBinding {\n  id: string;\n  telegramChatId: string;\n  telegramUserId?: string | null;\n  label?: string | null;\n  status: string;\n  createdAt: string;\n  lastUsedAt?: string | null;\n}\n\nexport interface MintLinkCodeResponse {\n  code: string;\n  expiresInSeconds: number;\n}\n\n/** A chat the bot has seen, surfaced for chat-ID auto-fill during enrolment. */\nexport interface TelegramDiscoveredChat {\n  id: string;\n  /** private | group | supergroup | channel */\n  type: string;\n  /** friendly display name (group/channel title, or the user's name) */\n  title: string;\n}\n\n/**\n * A chat already linked to a bot credential (via `/link`). Surfaced as a\n * pick-list for the default outbound Chat ID when inbound is enabled and live\n * getUpdates detection is therefore unavailable.\n */\nexport interface TelegramKnownChat {\n  id: string;\n  /** friendly name captured at link time; absent for older bindings */\n  label?: string | null;\n}\n\n/** The bot's identity + state, used to build the \"open your bot\" deep link. */\nexport interface TelegramBotInfo {\n  /** bot @username (without the @) — link is https://t.me/<username> */\n  username: string;\n  name: string;\n  /** true when a webhook is set (inbound enabled) — chat detection won't work */\n  webhookSet: boolean;\n}\n\nexport class TelegramClient {\n  constructor(private readonly http: BaseClient) {}\n\n  /**\n   * Look up a bot's identity (and whether inbound/webhook is active) from its\n   * token, so the UI can show a one-click \"open @bot in Telegram\" link. The\n   * token is used server-side transiently and not stored.\n   */\n  async botInfo(token: string): Promise<TelegramBotInfo> {\n    const res = await this.http.post<{ success: boolean; bot?: { username: string; name: string; webhook_set: boolean } }>(\n      '/credentials/telegram/bot-info',\n      { body: { token } },\n    );\n    const b = res.bot;\n    if (!b) throw new Error('botInfo response missing bot.');\n    return { username: b.username, name: b.name, webhookSet: b.webhook_set };\n  }\n\n  /**\n   * Discover the chats a bot can post to, for chat-ID auto-fill during\n   * enrolment. The user creates the bot, sends it a message (or adds it to a\n   * group/channel), then this returns the chats it has seen — no manual\n   * getUpdates call. The token is used server-side transiently and not stored.\n   * Returns [] when the bot hasn't been messaged yet.\n   */\n  async discoverChats(token: string): Promise<TelegramDiscoveredChat[]> {\n    const res = await this.http.post<{ success: boolean; chats?: TelegramDiscoveredChat[] }>(\n      '/credentials/telegram/discover-chats',\n      { body: { token } },\n    );\n    return res.chats ?? [];\n  }\n\n  /**\n   * List the chats already linked to a bot credential (from `/link`\n   * redemptions). Unlike discoverChats (which calls getUpdates and fails while\n   * a webhook is active), this reads our stored bindings, so it works precisely\n   * when inbound is enabled. Returns [] when nothing has linked yet.\n   */\n  async knownChats(credentialId: string): Promise<TelegramKnownChat[]> {\n    const res = await this.http.get<{ success: boolean; chats?: TelegramKnownChat[] }>(\n      `/credentials/telegram/${credentialId}/chats`,\n    );\n    return res.chats ?? [];\n  }\n\n  /**\n   * Remove the bot's webhook on Telegram (deleteWebhook) so getUpdates chat\n   * detection works again. Used to reclaim a bot that still has a webhook from a\n   * previous setup (an orphan whose owning credential is gone). Note this frees\n   * the bot globally — any inbound on it stops until re-enabled. The token is\n   * used server-side transiently and not stored.\n   */\n  async clearWebhook(token: string): Promise<void> {\n    await this.http.post<{ success: boolean }>('/credentials/telegram/clear-webhook', { body: { token } });\n  }\n\n  /** Enable inbound: register the bot's webhook (anchored at this sandbox). */\n  enableInbound(sandboxId: string, credentialId: string): Promise<{ success: boolean }> {\n    return this.http.post<{ success: boolean }>(`/sandbox/${sandboxId}/telegram/enable`, {\n      body: { credential_id: credentialId },\n    });\n  }\n\n  /** Disable inbound for the bot (bindings are kept; re-enable rekeys). */\n  disableInbound(sandboxId: string, credentialId: string): Promise<{ success: boolean }> {\n    return this.http.post<{ success: boolean }>(`/sandbox/${sandboxId}/telegram/disable`, {\n      body: { credential_id: credentialId },\n    });\n  }\n\n  /**\n   * Mint a single-use link code. The plaintext `code` is returned once — show\n   * it to the user to paste in Telegram as `/link <code>`.\n   */\n  async mintLinkCode(sandboxId: string, credentialId: string): Promise<MintLinkCodeResponse> {\n    const res = await this.http.post<{ success: boolean; code?: string; expires_in_seconds?: number }>(\n      `/sandbox/${sandboxId}/telegram/link-code`,\n      { body: { credential_id: credentialId } },\n    );\n    if (!res.code) {\n      throw new Error('mintLinkCode response missing code.');\n    }\n    return { code: res.code, expiresInSeconds: res.expires_in_seconds ?? 0 };\n  }\n\n  /** List active chat bindings for this sandbox. */\n  async listBindings(sandboxId: string): Promise<TelegramBinding[]> {\n    const res = await this.http.get<{ success: boolean; bindings?: TelegramBinding[] }>(\n      `/sandbox/${sandboxId}/telegram/bindings`,\n    );\n    return res.bindings ?? [];\n  }\n\n  /** Revoke a chat binding — the chat stops driving the agent immediately. */\n  revokeBinding(sandboxId: string, bindingId: string): Promise<{ success: boolean }> {\n    return this.http.delete<{ success: boolean }>(`/sandbox/${sandboxId}/telegram/bindings/${bindingId}`);\n  }\n}\n","// Universal credentials client. Post-credential-redesign (cloud-agent-\n// backend migration 0010) one schema covers every provider: cloud, SSH,\n// GitHub, GitLab, Azure DevOps, OpenAI, Anthropic. Provider-specific\n// fields live inside `metadata`; the catalog at ./providers.ts is the\n// authoritative shape per provider.\n//\n// Surface:\n//   apiClient.credentials.list()           — every credential in the project\n//   apiClient.credentials.create()         — one create endpoint, any provider\n//   apiClient.credentials.update()         — partial update\n//   apiClient.credentials.delete()         — remove\n//   apiClient.credentials.providers()      — fetch the catalog\n//   apiClient.credentials.sandbox.*        — sandbox associations (any provider)\n//   apiClient.credentials.gatewayTokens.*  — sandbox FOA bearer tokens\n//   apiClient.credentials.agentTokens.*    — sandbox MCP agent access tokens\nimport type { BaseClient } from '../../http/BaseClient.js';\nimport { AgentTokensClient } from './AgentTokensClient.js';\nimport { GatewayTokensClient } from './GatewayTokensClient.js';\nimport { TelegramClient } from './TelegramClient.js';\nimport {\n  Credential,\n  CreateCredentialRequest,\n  ListCredentialsQuery,\n  ProviderID,\n  SandboxCredential,\n  SimpleKeysResponse,\n  UpdateCredentialRequest,\n  WireSandboxCredential,\n  normalizeSandboxCredential,\n} from './types.js';\nimport type { ProviderSpec } from './providers.js';\n\n// ── Sandbox associations ───────────────────────────────────────────────\n\nclass SandboxCredentialScope {\n  constructor(private readonly http: BaseClient) {}\n\n  async list(sandboxId: string): Promise<SandboxCredential[]> {\n    const res = await this.http.get<{ success: boolean; items?: WireSandboxCredential[]; data?: WireSandboxCredential[] }>(\n      `/sandbox/${sandboxId}/credential`,\n    );\n    const list = res.items ?? res.data ?? [];\n    return list.map(normalizeSandboxCredential);\n  }\n\n  attach(sandboxId: string, credentialId: string): Promise<SimpleKeysResponse> {\n    return this.http.post<SimpleKeysResponse>(`/sandbox/${sandboxId}/credential`, {\n      body: { credentialId },\n    });\n  }\n\n  detach(sandboxId: string, credentialId: string): Promise<SimpleKeysResponse> {\n    return this.http.delete<SimpleKeysResponse>(`/sandbox/${sandboxId}/credential/${credentialId}`);\n  }\n}\n\n// ── Top-level credentials client ──────────────────────────────────────\n\nexport class CredentialsClient {\n  readonly sandbox: SandboxCredentialScope;\n  readonly gatewayTokens: GatewayTokensClient;\n  /** Sandbox agent access tokens — bearers external agents use against /mcp. */\n  readonly agentTokens: AgentTokensClient;\n  /** Sandbox Telegram inbound control — enable webhook, link codes, bindings. */\n  readonly telegram: TelegramClient;\n\n  constructor(private readonly http: BaseClient) {\n    this.sandbox = new SandboxCredentialScope(http);\n    this.gatewayTokens = new GatewayTokensClient(http);\n    this.agentTokens = new AgentTokensClient(http);\n    this.telegram = new TelegramClient(http);\n  }\n\n  async list(query: ListCredentialsQuery): Promise<Credential[]> {\n    const res = await this.http.get<{ success: boolean; credentials?: Credential[]; data?: Credential[] }>(\n      '/credentials',\n      {\n        query: {\n          projectId: query.projectId,\n          provider: query.provider,\n          capability: query.capability,\n        },\n      },\n    );\n    return res.credentials ?? res.data ?? [];\n  }\n\n  async create(body: CreateCredentialRequest): Promise<Credential> {\n    const res = await this.http.post<{ success: boolean; data?: Credential; credential?: Credential }>(\n      '/credentials',\n      { body },\n    );\n    const value = res.data ?? res.credential;\n    if (!value) throw new Error('createCredential response missing body.');\n    return value;\n  }\n\n  async update(credentialId: string, body: UpdateCredentialRequest): Promise<Credential> {\n    const res = await this.http.put<{ success: boolean; credential?: Credential; data?: Credential }>(\n      `/credentials/${credentialId}`,\n      { body },\n    );\n    const value = res.credential ?? res.data;\n    if (!value) throw new Error('updateCredential response missing body.');\n    return value;\n  }\n\n  delete(credentialId: string): Promise<SimpleKeysResponse> {\n    return this.http.delete<SimpleKeysResponse>(`/credentials/${credentialId}`);\n  }\n\n  /**\n   * listOrgNotify returns the org-scoped notification credentials (Slack /\n   * Teams / PagerDuty / SMTP, workspaceId NULL) — the channels the org owns\n   * for platform-event notifications, managed on Settings → System\n   * notifications. Distinct from project-scoped notify credentials.\n   */\n  async listOrgNotify(): Promise<Credential[]> {\n    const res = await this.http.get<{ success: boolean; credentials?: Credential[]; data?: Credential[] }>(\n      '/credentials/org-notify',\n    );\n    return res.credentials ?? res.data ?? [];\n  }\n\n  /**\n   * createOrgNotify creates an org-scoped notification credential. The body is\n   * the universal credential shape minus projectId/workspaceId (the server\n   * pins workspaceId to NULL); provider must be a notify transport.\n   */\n  async createOrgNotify(\n    body: Omit<CreateCredentialRequest, 'projectId' | 'workspaceId'>,\n  ): Promise<Credential> {\n    const res = await this.http.post<{ success: boolean; data?: Credential; credential?: Credential }>(\n      '/credentials/org-notify',\n      { body },\n    );\n    const value = res.data ?? res.credential;\n    if (!value) throw new Error('createOrgNotify response missing body.');\n    return value;\n  }\n\n  /**\n   * updateOrgNotify applies a partial update to an org-scoped notification\n   * credential. Secret is optional — omit it to keep the stored one, supply a\n   * new value to rotate it. The server republishes the org topology so the\n   * change reaches consumers without a refresh round-trip.\n   */\n  async updateOrgNotify(credentialId: string, body: UpdateCredentialRequest): Promise<Credential> {\n    const res = await this.http.put<{ success: boolean; credential?: Credential; data?: Credential }>(\n      `/credentials/org-notify/${credentialId}`,\n      { body },\n    );\n    const value = res.credential ?? res.data;\n    if (!value) throw new Error('updateOrgNotify response missing body.');\n    return value;\n  }\n\n  deleteOrgNotify(credentialId: string): Promise<SimpleKeysResponse> {\n    return this.http.delete<SimpleKeysResponse>(`/credentials/org-notify/${credentialId}`);\n  }\n\n  /**\n   * adminDeliver seeds a credential into ANOTHER org's project — the\n   * platform-admin delivery path for eval-sandbox credentials. The caller\n   * must be a platform admin; the target org comes from the path (no\n   * impersonation involved) and the audit event lands in the target org's\n   * trail. The server accepts cloud (storage-capable) providers only.\n   * Optional `metadata.expiresAt` (RFC3339) marks a time-bound credential\n   * so the tenant UI can badge the upcoming sandbox expiry.\n   */\n  async adminDeliver(orgId: string, body: CreateCredentialRequest): Promise<Credential> {\n    const res = await this.http.post<{ success: boolean; data?: Credential; credential?: Credential }>(\n      `/admin/orgs/${orgId}/credentials`,\n      { body },\n    );\n    const value = res.data ?? res.credential;\n    if (!value) throw new Error('adminDeliver response missing body.');\n    return value;\n  }\n\n  /**\n   * providers fetches the server-side catalog. The tsclient ships its\n   * own catalog mirror in ./providers.ts that the frontend can use\n   * synchronously; this endpoint is the runtime source of truth and\n   * picks up customer extensions added server-side without a tsclient\n   * republish.\n   */\n  async providers(): Promise<ProviderSpec[]> {\n    const res = await this.http.get<{ success: boolean; providers?: ProviderSpec[]; data?: ProviderSpec[] }>('/providers');\n    return res.providers ?? res.data ?? [];\n  }\n\n  /**\n   * globalAiProviders returns the AI provider ids the platform \"global\" key\n   * pool (admin org's reference project) can serve, e.g. ['ANTHROPIC']. Empty\n   * when no platform keys are configured — the UI then hides the non-BYOK\n   * provider picker entirely (BYOK-only, as before the feature).\n   */\n  async globalAiProviders(): Promise<ProviderID[]> {\n    const res = await this.http.get<{ success: boolean; providers?: ProviderID[]; data?: ProviderID[] }>(\n      '/credentials/global-ai-providers',\n    );\n    return res.providers ?? res.data ?? [];\n  }\n}\n\nexport type { ProviderID };\n","import type { TokenProvider } from '../../http/tokenProvider.js';\nimport type { ChatEvent, ChatScope } from './types.js';\n\nexport interface OpenChatStreamOptions {\n  scope: ChatScope;\n  conversationId: string;\n  onEvent: (event: ChatEvent) => void;\n  onError?: (err: Event) => void;\n  lastEventId?: string;\n  /** Heartbeat in ms before the polyfill considers the connection stale. Default: 60000. */\n  heartbeatTimeout?: number;\n}\n\nexport interface ChatStreamHandle {\n  close(): void;\n}\n\nexport interface ChatStreamDeps {\n  baseUrl: string;\n  getToken?: TokenProvider;\n}\n\nconst STREAM_PATH = '/api/agentengine/v1/agent/chat/sessions';\n\n/**\n * Opens an SSE connection to the chat stream. Requires the consumer to have\n * `event-source-polyfill` installed (peer dep). Browsers' native EventSource\n * does not support custom headers, which we need for auth + scope.\n */\nexport async function openChatStream(\n  deps: ChatStreamDeps,\n  options: OpenChatStreamOptions,\n): Promise<ChatStreamHandle> {\n  // Lazy import so consumers in non-browser contexts (or those who don't use\n  // the chat stream at all) aren't forced to install the polyfill.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const mod: any = await import('event-source-polyfill');\n  const Polyfill = mod.EventSourcePolyfill ?? mod.default?.EventSourcePolyfill ?? mod.default;\n  if (!Polyfill) {\n    throw new Error('event-source-polyfill is required for client.chat.openStream(). Install it as a peer dep.');\n  }\n\n  const url = `${deps.baseUrl.replace(/\\/$/, '')}${STREAM_PATH}/${options.conversationId}/stream`;\n\n  const headers: Record<string, string> = {\n    'X-Org-Id': options.scope.orgId,\n    'X-User-Id': options.scope.userId,\n    'X-Sandbox-Id': options.scope.sandboxId ?? options.scope.repoId ?? '',\n    'X-Repo-Id': options.scope.sandboxId ?? options.scope.repoId ?? '',\n  };\n  if (options.scope.projectId ?? options.scope.workspaceId) {\n    headers['X-Project-Id'] = options.scope.projectId ?? options.scope.workspaceId ?? '';\n    headers['X-Workspace-Id'] = options.scope.projectId ?? options.scope.workspaceId ?? '';\n  }\n  if (deps.getToken) {\n    const token = await deps.getToken();\n    if (token) headers['Authorization'] = `Bearer ${token}`;\n  }\n  if (options.lastEventId) headers['Last-Event-ID'] = options.lastEventId;\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const es = new (Polyfill as any)(url, {\n    headers,\n    heartbeatTimeout: options.heartbeatTimeout ?? 60_000,\n  });\n\n  // The backend sends named SSE events (event: phase, event: question, …).\n  // onmessage only fires for the default unnamed type; addEventListener is required for named events.\n  const KNOWN_EVENTS = [\n    'phase', 'question', 'plan_draft',\n    'step_started', 'step_completed', 'step_failed', 'step_progress',\n    'narration', 'assistant_message', 'done',\n    'session_title',\n    'tool_call_started', 'tool_call_finished',\n    'llm_call_finished',\n    'tool_call_confirmation_required',\n  ];\n\n  const handleRaw = (raw: MessageEvent) => {\n    try {\n      const parsed = JSON.parse(raw.data) as ChatEvent;\n      options.onEvent(parsed);\n    } catch {\n      // Ignore malformed events\n    }\n  };\n\n  for (const name of KNOWN_EVENTS) {\n    es.addEventListener(name, handleRaw);\n  }\n\n  if (options.onError) {\n    es.onerror = (event: Event) => options.onError?.(event);\n  }\n\n  return { close: () => es.close() };\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type { TokenProvider } from '../../http/tokenProvider.js';\nimport { openChatStream, type ChatStreamHandle, type OpenChatStreamOptions } from './ChatStream.js';\nimport type {\n  AnswerChatQuestionRequest,\n  AnswerChatQuestionResponse,\n  CancelChatTurnResponse,\n  ChatFeedbackEnvelope,\n  ChatScheduleEnvelope,\n  ChatScope,\n  ConfirmChatToolCallRequest,\n  ConfirmChatToolCallResponse,\n  CreateChatScheduleRequest,\n  CreateChatSessionRequest,\n  CreateChatSessionResponse,\n  DebugPayload,\n  GetChatSessionResponse,\n  ListChatFeedbackResponse,\n  ListChatSchedulesResponse,\n  ListChatScheduleRunsResponse,\n  ListChatSessionsQuery,\n  ListChatSessionsResponse,\n  PostChatMessageRequest,\n  PostChatMessageResponse,\n  SubmitChatFeedbackRequest,\n  UpdateChatScheduleRequest,\n} from './types.js';\n\nconst BASE_PATH = '/api/agentengine/v1/agent/chat/sessions';\n\nfunction scopeHeaders(scope: ChatScope): Record<string, string> {\n  const sandboxId = scope.sandboxId ?? scope.repoId ?? '';\n  const projectId = scope.projectId ?? scope.workspaceId;\n  const headers: Record<string, string> = {\n    'X-Org-Id': scope.orgId,\n    'X-User-Id': scope.userId,\n    'X-Sandbox-Id': sandboxId,\n    'X-Repo-Id': sandboxId,\n  };\n  if (projectId) {\n    headers['X-Project-Id'] = projectId;\n    headers['X-Workspace-Id'] = projectId;\n  }\n  return headers;\n}\n\nclass ChatSessionsScope {\n  constructor(private readonly http: BaseClient) {}\n\n  create(scope: ChatScope, body: CreateChatSessionRequest): Promise<CreateChatSessionResponse> {\n    return this.http.post<CreateChatSessionResponse>(BASE_PATH, {\n      body,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  list(scope: ChatScope, query: ListChatSessionsQuery = {}): Promise<ListChatSessionsResponse> {\n    return this.http.get<ListChatSessionsResponse>(BASE_PATH, {\n      query,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  get(scope: ChatScope, conversationId: string): Promise<GetChatSessionResponse> {\n    return this.http.get<GetChatSessionResponse>(`${BASE_PATH}/${conversationId}`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  delete(scope: ChatScope, conversationId: string): Promise<void> {\n    return this.http.delete<void>(`${BASE_PATH}/${conversationId}`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n}\n\nclass ChatMessagesScope {\n  constructor(private readonly http: BaseClient) {}\n\n  post(scope: ChatScope, conversationId: string, body: PostChatMessageRequest): Promise<PostChatMessageResponse> {\n    return this.http.post<PostChatMessageResponse>(`${BASE_PATH}/${conversationId}/messages`, {\n      body,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  /**\n   * Interrupts an in-flight chat-loop turn. The engine cancels the turn's\n   * Go context and asks the sandbox service to kill any in-flight docker\n   * exec inside the per-session container (the container itself survives\n   * so the next turn keeps its filesystem state). Returns 404 when no\n   * turn matches `turnId` — covers the race where the user clicks Stop\n   * just after the turn already finished.\n   *\n   * The engine still emits a terminal `done` SSE event with\n   * status=\"context_cancelled\" after this returns; the frontend should\n   * render its \"Cancelled\" marker on that event rather than on this\n   * response, so a reload mid-cancel still ends in the same UI state.\n   */\n  cancel(scope: ChatScope, conversationId: string, turnId: string): Promise<CancelChatTurnResponse> {\n    return this.http.post<CancelChatTurnResponse>(\n      `${BASE_PATH}/${conversationId}/messages/${turnId}/cancel`,\n      { headers: scopeHeaders(scope) },\n    );\n  }\n\n  /**\n   * Deliver the user's allow/deny decision on an M3 confirmation modal\n   * (fired when the policy hook emits a\n   * `tool_call_confirmation_required` SSE event). The chat-loop has\n   * suspended waiting on this call; on allow it dispatches the tool, on\n   * deny it synthesises a \"DENIED:\" tool result so the model can react.\n   * Returns 404 when no pending confirmation exists for the given\n   * (turn, tool_call) — usually means the 4-minute confirmer timeout\n   * already elapsed.\n   */\n  confirmToolCall(\n    scope: ChatScope,\n    conversationId: string,\n    turnId: string,\n    toolCallId: string,\n    body: ConfirmChatToolCallRequest,\n  ): Promise<ConfirmChatToolCallResponse> {\n    return this.http.post<ConfirmChatToolCallResponse>(\n      `${BASE_PATH}/${conversationId}/messages/${turnId}/confirm/${toolCallId}`,\n      { body, headers: scopeHeaders(scope) },\n    );\n  }\n}\n\nclass ChatQuestionsScope {\n  constructor(private readonly http: BaseClient) {}\n\n  answer(\n    scope: ChatScope,\n    conversationId: string,\n    turnId: string,\n    body: AnswerChatQuestionRequest,\n  ): Promise<AnswerChatQuestionResponse> {\n    return this.http.post<AnswerChatQuestionResponse>(\n      `${BASE_PATH}/${conversationId}/messages/${turnId}/answers`,\n      { body, headers: scopeHeaders(scope) },\n    );\n  }\n}\n\n/**\n * Debug scope — fetches the consolidated payload (session, messages) used by\n * the dashboard Debug tab. Keyed by conversation ID.\n */\nclass ChatDebugScope {\n  constructor(private readonly http: BaseClient) {}\n\n  getByConversation(scope: ChatScope, conversationId: string): Promise<DebugPayload> {\n    return this.http.get<DebugPayload>(`${BASE_PATH}/${conversationId}/debug`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n}\n\n/**\n * Schedules scope — manages the M3 Stage 4 cron-driven prompt\n * schedules. Repo-scoped: list / create / get / update / delete are\n * keyed by (repo, schedule_id). The dispatcher fires due schedules\n * server-side on its tick; the SDK only handles the CRUD surface.\n *\n * Endpoint shape:\n *   GET    /v1/agent/repos/:repo_id/schedules\n *   POST   /v1/agent/repos/:repo_id/schedules\n *   GET    /v1/agent/repos/:repo_id/schedules/:id\n *   PUT    /v1/agent/repos/:repo_id/schedules/:id\n *   DELETE /v1/agent/repos/:repo_id/schedules/:id\n */\nclass ChatSchedulesScope {\n  constructor(private readonly http: BaseClient) {}\n\n  private repoPath(scope: ChatScope): string {\n    const repoID = scope.sandboxId ?? scope.repoId ?? '';\n    return `/api/agentengine/v1/agent/repos/${repoID}/schedules`;\n  }\n\n  list(scope: ChatScope): Promise<ListChatSchedulesResponse> {\n    return this.http.get<ListChatSchedulesResponse>(this.repoPath(scope), {\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  create(scope: ChatScope, body: CreateChatScheduleRequest): Promise<ChatScheduleEnvelope> {\n    return this.http.post<ChatScheduleEnvelope>(this.repoPath(scope), {\n      body,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  get(scope: ChatScope, scheduleId: string): Promise<ChatScheduleEnvelope> {\n    return this.http.get<ChatScheduleEnvelope>(`${this.repoPath(scope)}/${scheduleId}`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  update(\n    scope: ChatScope,\n    scheduleId: string,\n    body: UpdateChatScheduleRequest,\n  ): Promise<ChatScheduleEnvelope> {\n    return this.http.put<ChatScheduleEnvelope>(`${this.repoPath(scope)}/${scheduleId}`, {\n      body,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  delete(scope: ChatScope, scheduleId: string): Promise<{ status: 'deleted' }> {\n    return this.http.delete<{ status: 'deleted' }>(`${this.repoPath(scope)}/${scheduleId}`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  /**\n   * List recent chat sessions spawned by a schedule's cron tick — used\n   * by the SchedulesTab \"Runs\" panel to surface real audit trail\n   * instead of dumping the user into the global chat list.\n   *\n   * Each entry is a full ChatSession row; `.id` is the conversation id\n   * the dashboard navigates to (`/chat/:conversationId`). All rows are\n   * unattended (the scheduler is the only writer of `schedule_id`),\n   * which makes the chat session viewer render the \"Scheduled run\"\n   * ribbon and hide the composer.\n   *\n   * Server returns the 50 most-recent rows; no cursor pagination in\n   * v1 (deferred until the long-tail audit case proves real).\n   */\n  listRuns(scope: ChatScope, scheduleId: string): Promise<ListChatScheduleRunsResponse> {\n    return this.http.get<ListChatScheduleRunsResponse>(\n      `${this.repoPath(scope)}/${scheduleId}/runs`,\n      { headers: scopeHeaders(scope) },\n    );\n  }\n}\n\n/**\n * Feedback scope — a user's \"Satisfied? Yes/No\" rating + optional comment on a\n * chat session, and the list of feedback recorded for it (so the UI can\n * pre-fill and so an org admin can review past ratings). Conversation-scoped;\n * pass `turn_id` in the body to scope feedback to a single turn.\n *\n * Endpoint shape:\n *   POST /v1/agent/chat/sessions/:id/feedback\n *   GET  /v1/agent/chat/sessions/:id/feedback\n */\nclass ChatFeedbackScope {\n  constructor(private readonly http: BaseClient) {}\n\n  submit(\n    scope: ChatScope,\n    conversationId: string,\n    body: SubmitChatFeedbackRequest,\n  ): Promise<ChatFeedbackEnvelope> {\n    return this.http.post<ChatFeedbackEnvelope>(`${BASE_PATH}/${conversationId}/feedback`, {\n      body,\n      headers: scopeHeaders(scope),\n    });\n  }\n\n  list(scope: ChatScope, conversationId: string): Promise<ListChatFeedbackResponse> {\n    return this.http.get<ListChatFeedbackResponse>(`${BASE_PATH}/${conversationId}/feedback`, {\n      headers: scopeHeaders(scope),\n    });\n  }\n}\n\nexport class ChatClient {\n  readonly sessions: ChatSessionsScope;\n  readonly messages: ChatMessagesScope;\n  readonly questions: ChatQuestionsScope;\n  readonly debug: ChatDebugScope;\n  readonly schedules: ChatSchedulesScope;\n  readonly feedback: ChatFeedbackScope;\n\n  constructor(\n    private readonly http: BaseClient,\n    private readonly streamDeps: { baseUrl: string; getToken?: TokenProvider },\n  ) {\n    this.sessions = new ChatSessionsScope(http);\n    this.messages = new ChatMessagesScope(http);\n    this.questions = new ChatQuestionsScope(http);\n    this.debug = new ChatDebugScope(http);\n    this.schedules = new ChatSchedulesScope(http);\n    this.feedback = new ChatFeedbackScope(http);\n  }\n\n  openStream(options: OpenChatStreamOptions): Promise<ChatStreamHandle> {\n    return openChatStream(this.streamDeps, options);\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  CreateAgentTemplateRequest,\n  ListAgentTemplatesQuery,\n  ListAgentTemplatesResponse,\n  SimpleAgentResponse,\n  Template,\n} from './types.js';\n\nconst BASE_PATH = '/api/agentengine/v1/agent/templates';\n\nexport class TemplatesClient {\n  constructor(private readonly http: BaseClient) {}\n\n  list(query: ListAgentTemplatesQuery = {}): Promise<ListAgentTemplatesResponse> {\n    return this.http.get<ListAgentTemplatesResponse>(BASE_PATH, { query });\n  }\n\n  create(body: CreateAgentTemplateRequest): Promise<Template> {\n    return this.http.post<Template>(BASE_PATH, { body });\n  }\n\n  delete(templateId: string): Promise<SimpleAgentResponse> {\n    return this.http.delete<SimpleAgentResponse>(`${BASE_PATH}/${templateId}`);\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  CreateScheduledTaskRequest,\n  ListScheduledTasksQuery,\n  ListScheduledTasksResponse,\n  ScheduledTask,\n  SimpleAgentResponse,\n} from './types.js';\n\nconst BASE_PATH = '/api/agentengine/v1/agent/scheduled-tasks';\n\nexport class ScheduledTasksClient {\n  constructor(private readonly http: BaseClient) {}\n\n  list(query: ListScheduledTasksQuery): Promise<ListScheduledTasksResponse> {\n    return this.http.get<ListScheduledTasksResponse>(BASE_PATH, { query });\n  }\n\n  create(body: CreateScheduledTaskRequest): Promise<ScheduledTask> {\n    return this.http.post<ScheduledTask>(BASE_PATH, { body });\n  }\n\n  delete(taskId: string, orgId: string): Promise<SimpleAgentResponse> {\n    return this.http.delete<SimpleAgentResponse>(`${BASE_PATH}/${taskId}`, {\n      query: { org_id: orgId },\n    });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  AcquireScanLeaseRequest,\n  AcquireScanLeaseResponse,\n  ListScanHistoryQuery,\n  ListScanHistoryResponse,\n  PeekScanLeaseResponse,\n  ResourceTreeQuery,\n  ResourceTreeResponse,\n  SubgraphRequest,\n  SubgraphResponse,\n} from './types.js';\n\nexport class ResourcesClient {\n  constructor(private readonly http: BaseClient) {}\n\n  getTree(repoId: string, query?: ResourceTreeQuery): Promise<ResourceTreeResponse> {\n    const params = new URLSearchParams();\n    const search = query?.search?.trim();\n    if (search) params.set('search', search);\n    if (query?.showDefault === true) params.set('showDefault', 'true');\n    const qs = params.size > 0 ? `?${params.toString()}` : '';\n    return this.http.get<ResourceTreeResponse>(`/repos/${repoId}/resources/tree${qs}`);\n  }\n\n  /**\n   * BFS-walks the dependency graph starting from `seedResourceIds` (or\n   * `seedNameTokens`) and returns the matching nodes + edges. Use this\n   * to render an inbound/outbound dependency view for a selected\n   * resource. The server caps the result at maxNodes (default 80,\n   * hard cap 200) and sets `truncated` when the cap was hit.\n   */\n  getSubgraph(repoId: string, request: SubgraphRequest): Promise<SubgraphResponse> {\n    return this.http.post<SubgraphResponse>(`/repos/${repoId}/resources/subgraph`, { body: request });\n  }\n\n  /**\n   * Returns recent scan history for a repo, optionally filtered by\n   * credential. Backed by CloudScanHistory rows written when the\n   * agent's discovery orchestrator releases a lease (or when the\n   * backend's cleanup job sweeps an expired one). Use this to render\n   * \"last refreshed N min ago\" badges and per-scope add/remove counts\n   * next to the resource tree.\n   */\n  listScans(repoId: string, query?: ListScanHistoryQuery): Promise<ListScanHistoryResponse> {\n    const params = new URLSearchParams();\n    if (query?.credentialId) params.set('credentialId', query.credentialId);\n    if (query?.limit != null) params.set('limit', String(query.limit));\n    const qs = params.size > 0 ? `?${params.toString()}` : '';\n    return this.http.get<ListScanHistoryResponse>(`/repos/${repoId}/scans${qs}`);\n  }\n\n  /**\n   * Peeks the active scan lease (if any) for the given credential. Used\n   * by the dashboard to display a \"scan in progress\" badge without\n   * attempting to acquire the lease. Returns `lease: null` when no\n   * scan is running. Expired leases are returned with their stale\n   * timestamps — callers should compare `expiresAt` to `Date.now()`\n   * before treating them as active.\n   */\n  peekScanLease(repoId: string, credentialId: string): Promise<PeekScanLeaseResponse> {\n    const params = new URLSearchParams();\n    params.set('credentialId', credentialId);\n    return this.http.get<PeekScanLeaseResponse>(`/repos/${repoId}/scans/lease?${params.toString()}`);\n  }\n\n  /**\n   * Attempts to claim a scan lease. Returns the acquired lease on\n   * success. The server responds 409 with a `ScanInProgressError`-\n   * shaped body when another scan is already in flight — callers\n   * should catch the HttpError, parse the body, and surface a polite\n   * \"another scan is running\" notice rather than retry automatically.\n   *\n   * NOTE: routine use is the agent's job. The dashboard typically only\n   * calls peekScanLease + listScans; this method is exposed for power-\n   * user tooling and automated test harnesses.\n   */\n  acquireScanLease(repoId: string, request: AcquireScanLeaseRequest): Promise<AcquireScanLeaseResponse> {\n    return this.http.post<AcquireScanLeaseResponse>(`/repos/${repoId}/scans/lease`, { body: request });\n  }\n}\n","export interface SystemEvent {\n  id: number;\n  timestamp: string;\n  contextId: string;\n  context: string;\n  event: string;\n  orgId: string;\n  userId: string;\n  userName: string;\n  userEmail: string;\n  projectId: string | null;\n  jsonData: string | null;\n  showUnread: boolean;\n}\n\nexport interface WireSystemEvent extends Omit<SystemEvent, 'projectId'> {\n  workspaceId?: string | null;\n  projectId?: string | null;\n}\n\nexport interface SystemEventQuery {\n  from_timestamp?: number;\n  to_timestamp?: number;\n  contextId?: string;\n  context?: string;\n  event?: string;\n  userId?: string;\n  projectId?: string;\n  /** @deprecated use `projectId` */\n  workspaceId?: string;\n  showUnread?: boolean;\n  skip?: number;\n  take?: number;\n}\n\nexport interface SystemEventQueryResponse {\n  events: SystemEvent[];\n  total: number;\n  skip: number;\n  take: number;\n}\n\nexport interface SystemEventReadResponse {\n  success: true;\n}\n\nexport function normalizeSystemEvent(wire: WireSystemEvent): SystemEvent {\n  return {\n    id: wire.id,\n    timestamp: wire.timestamp,\n    contextId: wire.contextId,\n    context: wire.context,\n    event: wire.event,\n    orgId: wire.orgId,\n    userId: wire.userId,\n    userName: wire.userName,\n    userEmail: wire.userEmail,\n    projectId: wire.projectId ?? wire.workspaceId ?? null,\n    jsonData: wire.jsonData ?? null,\n    showUnread: wire.showUnread,\n  };\n}\n\n// TODO(backend-cleanup): cloud-agent-backend/internal/domain/types.go SystemEvent\n// still emits `workspaceId`. When that becomes `projectId`, this normalizer\n// collapses to identity.\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport {\n  normalizeSystemEvent,\n  SystemEventQuery,\n  SystemEventQueryResponse,\n  SystemEventReadResponse,\n  WireSystemEvent,\n} from './types.js';\n\ninterface WireQueryResponse {\n  events: WireSystemEvent[];\n  total: number;\n  skip: number;\n  take: number;\n}\n\nexport class SystemEventsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async query(body: SystemEventQuery): Promise<SystemEventQueryResponse> {\n    const wire = await this.http.post<WireQueryResponse>('/systemevent', { body });\n    return {\n      events: (wire.events ?? []).map(normalizeSystemEvent),\n      total: wire.total ?? 0,\n      skip: wire.skip ?? 0,\n      take: wire.take ?? 0,\n    };\n  }\n\n  markRead(eventIdOrIds: number | number[]): Promise<SystemEventReadResponse> {\n    const body = Array.isArray(eventIdOrIds) ? { ids: eventIdOrIds } : { id: eventIdOrIds };\n    return this.http.post<SystemEventReadResponse>('/systemevent/read', { body });\n  }\n\n  markUnread(eventIdOrIds: number | number[]): Promise<SystemEventReadResponse> {\n    const body = Array.isArray(eventIdOrIds) ? { ids: eventIdOrIds } : { id: eventIdOrIds };\n    return this.http.delete<SystemEventReadResponse>('/systemevent/read', { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  BuySubscriptionRequest,\n  BuySubscriptionResponse,\n  CancelSubscriptionResponse,\n  ListPaymentsResponse,\n  OrgSubscription,\n  Payment,\n  PreviewChangeRequest,\n  PreviewChangeResponse,\n  Subscription,\n} from './types.js';\n\nexport class SubscriptionsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async listCatalog(): Promise<Subscription[]> {\n    const res = await this.http.get<{ success: boolean; data: Subscription[] }>('/subscriptions', { skipAuth: true });\n    return res.data ?? [];\n  }\n\n  async getMine(): Promise<OrgSubscription | null> {\n    const res = await this.http.get<{ success: boolean; data: OrgSubscription | null }>('/subscriptions/my');\n    return res.data ?? null;\n  }\n\n  buy(body: BuySubscriptionRequest): Promise<BuySubscriptionResponse> {\n    return this.http.post<BuySubscriptionResponse>('/subscriptions/buy', { body });\n  }\n\n  /**\n   * Preview the cost/credit impact of a plan change (pro-rated charge,\n   * credit delta, effective dates) for the confirmation modal — no change\n   * is made. kind=\"new\" means a first purchase that would go via Checkout.\n   */\n  previewChange(body: PreviewChangeRequest): Promise<PreviewChangeResponse> {\n    return this.http.post<PreviewChangeResponse>('/subscriptions/preview-change', { body });\n  }\n\n  cancel(): Promise<CancelSubscriptionResponse> {\n    return this.http.post<CancelSubscriptionResponse>('/subscriptions/cancel', {});\n  }\n\n  async listPayments(): Promise<Payment[]> {\n    const res = await this.http.get<ListPaymentsResponse>('/subscriptions/payments');\n    return res.data ?? [];\n  }\n\n  /** Stripe-hosted billing portal URL. */\n  async portal(): Promise<{ url: string }> {\n    const res = await this.http.post<{ success: boolean; data: { url: string } }>('/subscriptions/portal', {});\n    return unwrapData(res);\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  BuyCreditPackRequest,\n  BuyCreditPackResponse,\n  BuyCustomCreditRequest,\n  BuyCustomCreditResponse,\n  CreditBalance,\n  CreditPack,\n  CustomCreditPurchaseConfig,\n  ListCreditsTransactionsQuery,\n  ListCreditsTransactionsResponse,\n  MonthlyCreditStats,\n} from './types.js';\n\nexport class CreditsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  async getBalance(): Promise<CreditBalance> {\n    const res = await this.http.get<{ success: boolean; data: CreditBalance }>('/credits/balance');\n    return unwrapData(res);\n  }\n\n  listTransactions(query: ListCreditsTransactionsQuery = {}): Promise<ListCreditsTransactionsResponse> {\n    return this.http.get<ListCreditsTransactionsResponse>('/credits/transactions', { query });\n  }\n\n  /** Per-month credit activity (consumption / purchases / grants). */\n  async getMonthlyStats(): Promise<MonthlyCreditStats[]> {\n    const res = await this.http.get<{ success: boolean; data: MonthlyCreditStats[] }>('/credits/stats/monthly');\n    return res.data ?? [];\n  }\n\n  /** Fixed credit-pack catalog. Public endpoint. */\n  async listPacks(): Promise<CreditPack[]> {\n    const res = await this.http.get<{ success: boolean; data: CreditPack[] }>('/credits/packs', { skipAuth: true });\n    return res.data ?? [];\n  }\n\n  /**\n   * Buy a fixed credit pack. Requires an active paid subscription\n   * (the backend 403s free-tier orgs with SUBSCRIPTION_REQUIRED) and\n   * caps purchases per pack per billing cycle. Returns a Stripe\n   * Checkout URL to redirect to.\n   */\n  buyPack(body: BuyCreditPackRequest): Promise<BuyCreditPackResponse> {\n    return this.http.post<BuyCreditPackResponse>('/credits/packs/buy', { body });\n  }\n\n  /**\n   * \"Other amount\" PAYG config — bounds + presets for the\n   * arbitrary-dollar tile. Public endpoint; returns a disabled\n   * shape (`enabled: false`) when the feature is off so the\n   * frontend can hide the tile without throwing.\n   */\n  async getCustomConfig(): Promise<CustomCreditPurchaseConfig> {\n    const res = await this.http.get<{ success: boolean; data: CustomCreditPurchaseConfig }>('/credits/packs/custom-config');\n    return unwrapData(res);\n  }\n\n  /**\n   * Buy an arbitrary-dollar PAYG amount. The Stripe Checkout\n   * session is built with `price_data` inline (no pre-created\n   * Price), so the catalog has nothing to provision for this — it\n   * is purely a per-purchase flow.\n   */\n  buyCustom(body: BuyCustomCreditRequest): Promise<BuyCustomCreditResponse> {\n    return this.http.post<BuyCustomCreditResponse>('/credits/packs/buy-custom', { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  GetUsageSummaryQuery,\n  GetUsageSummaryResponse,\n  UsageByModelQuery,\n  UsageByModelResponse,\n  UsageReportQuery,\n  UsageReportResponse,\n  UsageSummaryQuery,\n  UsageSummaryResponse,\n} from './types.js';\n\nconst LEGACY_AGENT_PATH = '/api/agentengine/v1/usage'; // legacy proxy path\nconst SCOPED_BASE = '/usage'; // new backend-scoped surface (RBAC + scope routing)\n\nexport class UsageClient {\n  constructor(private readonly http: BaseClient) {}\n\n  // ── legacy ─────────────────────────────────────────────────────────────────\n  // Existing Settings → Usage page calls this. Kept for back-compat until the\n  // new dashboard fully replaces the JSON dump.\n  getSummary(query: GetUsageSummaryQuery): Promise<GetUsageSummaryResponse> {\n    return this.http.get<GetUsageSummaryResponse>(`${LEGACY_AGENT_PATH}/summary`, { query });\n  }\n\n  // ── new scoped surface ─────────────────────────────────────────────────────\n  // Hits the backend-side RBAC wrapper; the backend re-injects the scope id\n  // into the agent query so we don't have to.\n  org(query: UsageSummaryQuery = {}): Promise<UsageSummaryResponse> {\n    return this.http.get(`${SCOPED_BASE}/org`, { query: query as Record<string, string> });\n  }\n  project(projectId: string, query: UsageSummaryQuery = {}): Promise<UsageSummaryResponse> {\n    return this.http.get(`${SCOPED_BASE}/project/${encodeURIComponent(projectId)}`, { query: query as Record<string, string> });\n  }\n  sandbox(sandboxId: string, query: UsageSummaryQuery = {}): Promise<UsageSummaryResponse> {\n    return this.http.get(`${SCOPED_BASE}/sandbox/${encodeURIComponent(sandboxId)}`, { query: query as Record<string, string> });\n  }\n  chat(chatId: string, query: UsageSummaryQuery = {}): Promise<UsageSummaryResponse> {\n    return this.http.get(`${SCOPED_BASE}/chat/${encodeURIComponent(chatId)}`, { query: query as Record<string, string> });\n  }\n\n  // Each report variant exists so the dashboard chart can request hourly /\n  // daily buckets without leaking scope routing into the caller.\n  orgReport(query: UsageReportQuery = {}): Promise<UsageReportResponse> {\n    return this.http.get(`${SCOPED_BASE}/org`, { query: { ...(query as Record<string, string>), kind: 'report' } });\n  }\n  projectReport(projectId: string, query: UsageReportQuery = {}): Promise<UsageReportResponse> {\n    return this.http.get(`${SCOPED_BASE}/project/${encodeURIComponent(projectId)}`, { query: { ...(query as Record<string, string>), kind: 'report' } });\n  }\n  sandboxReport(sandboxId: string, query: UsageReportQuery = {}): Promise<UsageReportResponse> {\n    return this.http.get(`${SCOPED_BASE}/sandbox/${encodeURIComponent(sandboxId)}`, { query: { ...(query as Record<string, string>), kind: 'report' } });\n  }\n  chatReport(chatId: string, query: UsageReportQuery = {}): Promise<UsageReportResponse> {\n    return this.http.get(`${SCOPED_BASE}/chat/${encodeURIComponent(chatId)}`, { query: { ...(query as Record<string, string>), kind: 'report' } });\n  }\n\n  // Per-model breakdown — drives the table under the bar chart.\n  orgByModel(query: UsageByModelQuery = {}): Promise<UsageByModelResponse> {\n    return this.http.get(`${SCOPED_BASE}/org`, { query: { ...(query as Record<string, string>), kind: 'by_model' } });\n  }\n  projectByModel(projectId: string, query: UsageByModelQuery = {}): Promise<UsageByModelResponse> {\n    return this.http.get(`${SCOPED_BASE}/project/${encodeURIComponent(projectId)}`, { query: { ...(query as Record<string, string>), kind: 'by_model' } });\n  }\n  sandboxByModel(sandboxId: string, query: UsageByModelQuery = {}): Promise<UsageByModelResponse> {\n    return this.http.get(`${SCOPED_BASE}/sandbox/${encodeURIComponent(sandboxId)}`, { query: { ...(query as Record<string, string>), kind: 'by_model' } });\n  }\n  chatByModel(chatId: string, query: UsageByModelQuery = {}): Promise<UsageByModelResponse> {\n    return this.http.get(`${SCOPED_BASE}/chat/${encodeURIComponent(chatId)}`, { query: { ...(query as Record<string, string>), kind: 'by_model' } });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  ChatBudget,\n  EffectiveChatBudget,\n  OrgBudget,\n  ScopedBudget,\n  UpdateChatBudgetRequest,\n  UpdateCostLimitRequest,\n  UpdateOrgBudgetRequest,\n  UpdateScopedBudgetRequest,\n} from './types.js';\n\n// Backend routes hang off the root authed group — see internal/http/routes/budgets\n// in cloud-agent-backend. The backend resolves project_id → sandbox_id mapping\n// and handles RBAC; the frontend just hands it the scope ids.\nconst BASE = '/budgets';\n\nexport class BudgetsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  // ── org ──\n  getOrg(): Promise<{ budget: OrgBudget }> {\n    return this.http.get(`${BASE}/org`);\n  }\n  updateOrg(body: UpdateOrgBudgetRequest): Promise<{ budget: OrgBudget; message: string }> {\n    return this.http.put(`${BASE}/org`, { body });\n  }\n\n  // ── project (workspace) ──\n  getProject(projectId: string): Promise<{ budget: ScopedBudget }> {\n    return this.http.get(`${BASE}/project/${encodeURIComponent(projectId)}`);\n  }\n  updateProject(projectId: string, body: UpdateScopedBudgetRequest): Promise<{ budget: ScopedBudget; message: string }> {\n    return this.http.put(`${BASE}/project/${encodeURIComponent(projectId)}`, { body });\n  }\n\n  // ── sandbox (repo) ──\n  getSandbox(sandboxId: string): Promise<{ budget: ScopedBudget }> {\n    return this.http.get(`${BASE}/sandbox/${encodeURIComponent(sandboxId)}`);\n  }\n  updateSandbox(sandboxId: string, body: UpdateScopedBudgetRequest): Promise<{ budget: ScopedBudget; message: string }> {\n    return this.http.put(`${BASE}/sandbox/${encodeURIComponent(sandboxId)}`, { body });\n  }\n\n  // ── chat session ──\n  getChat(chatId: string): Promise<{ budget: ChatBudget }> {\n    return this.http.get(`${BASE}/chat/${encodeURIComponent(chatId)}`);\n  }\n  updateChat(chatId: string, body: UpdateChatBudgetRequest): Promise<{ message: string }> {\n    return this.http.put(`${BASE}/chat/${encodeURIComponent(chatId)}`, { body });\n  }\n  // Resolves chat → sandbox → project → org and returns the first non-zero\n  // per-chat USD cap plus the level it came from. Powers the chat header\n  // budget badge — UI labels inherited values.\n  getEffectiveChat(chatId: string): Promise<EffectiveChatBudget> {\n    return this.http.get(`${BASE}/chat/${encodeURIComponent(chatId)}/effective`);\n  }\n\n  // ── per-template / per-scheduled USD caps ──\n  updateTemplateCostLimit(templateId: string, body: UpdateCostLimitRequest) {\n    return this.http.put(`${BASE}/template/${encodeURIComponent(templateId)}/cost_limit`, { body });\n  }\n  updateScheduleCostLimit(scheduleId: string, body: UpdateCostLimitRequest) {\n    return this.http.put(`${BASE}/schedule/${encodeURIComponent(scheduleId)}/cost_limit`, { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  MintReferralCodeRequest,\n  RedeemReferralCodeRequest,\n  ReferralAdminOverview,\n  ReferralCode,\n  ReferralRedemption,\n  ReferralStats,\n} from './types.js';\n\n/**\n * Org self-service referrals. Any org can mint codes and redeem one (subject\n * to server-side guards: never-attributed, not reseller-associated, and\n * pre-first-purchase). Two-sided credits fire once the referred org's\n * cumulative spend reaches the snapshotted threshold.\n */\nexport class ReferralsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  /** Mint a new referral code for the caller's org. */\n  async mintCode(body: MintReferralCodeRequest = {}): Promise<ReferralCode> {\n    const res = await this.http.post<{ success: boolean; data: ReferralCode }>('/referrals/codes', { body });\n    return unwrapData(res);\n  }\n\n  /** List the caller org's codes with per-code redeemed/qualified counts. */\n  async listCodes(): Promise<ReferralCode[]> {\n    const res = await this.http.get<{ success: boolean; data: ReferralCode[] }>('/referrals/codes');\n    return res.data ?? [];\n  }\n\n  /** Activate or deactivate one of the caller org's codes. */\n  async setCodeActive(codeId: string, isActive: boolean): Promise<ReferralCode> {\n    const res = await this.http.patch<{ success: boolean; data: ReferralCode }>(\n      `/referrals/codes/${codeId}`,\n      { body: { isActive } },\n    );\n    return unwrapData(res);\n  }\n\n  /** Caller org's referral summary as referrer (redemptions, qualified, credits earned). */\n  async stats(): Promise<ReferralStats> {\n    const res = await this.http.get<{ success: boolean; data: ReferralStats }>('/referrals/stats');\n    return unwrapData(res);\n  }\n\n  /**\n   * Redeem a referral code for the caller's org. Fails (4xx with an\n   * `error_code`) when a guard rejects it: `code_inactive`, `self_referral`,\n   * `already_redeemed`, `already_associated`, or `has_purchases`.\n   */\n  async redeem(body: RedeemReferralCodeRequest): Promise<ReferralRedemption> {\n    const res = await this.http.post<{ success: boolean; data: ReferralRedemption }>(\n      '/referrals/redeem',\n      { body },\n    );\n    return unwrapData(res);\n  }\n\n  // --- Platform-admin only ---\n\n  /**\n   * Platform-wide referral monitor: rollup stats + every redemption (with the\n   * code string and both org names). Returns 403 unless platform admin.\n   */\n  async adminOverview(): Promise<ReferralAdminOverview> {\n    const res = await this.http.get<{ success: boolean; data: ReferralAdminOverview }>('/admin/referrals');\n    return unwrapData(res);\n  }\n\n  /**\n   * Void a PENDING redemption (abuse control) so it can never qualify. Fails\n   * with 409 `not_pending` if the redemption is missing, already qualified, or\n   * already void. Platform-admin only.\n   */\n  async voidRedemption(redemptionId: string): Promise<void> {\n    await this.http.post<{ success: boolean }>(`/admin/referrals/${redemptionId}/void`, { body: {} });\n  }\n\n  /**\n   * Force-qualify a PENDING non-reseller redemption: grants the snapshotted\n   * referrer reward + referred welcome credit immediately, bypassing the spend\n   * threshold. Fails with 409 `not_pending` (missing/qualified/void) or 400\n   * `reseller_code`. Platform-admin only. Returns the updated redemption.\n   */\n  async qualifyRedemption(redemptionId: string): Promise<ReferralRedemption> {\n    const res = await this.http.post<{ success: boolean; data: ReferralRedemption }>(\n      `/admin/referrals/${redemptionId}/qualify`,\n      { body: {} },\n    );\n    return unwrapData(res);\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type { Organization } from '../organization/types.js';\nimport type {\n  AppendProgramConfigRequest,\n  AssociatedOrg,\n  BillingProgramConfig,\n  GeneratePayoutsRequest,\n  ResellerCommission,\n  ResellerPayout,\n  ResellerPerformance,\n  SetResellerRequest,\n  UpdatePayoutRequest,\n} from './types.js';\n\n/**\n * Reseller surface. The first three methods are self-service for an org with\n * `isReseller === true` (the server gates on it). The remaining methods are\n * platform-admin only (gated on the caller's home org being the admin org).\n */\nexport class ResellerClient {\n  constructor(private readonly http: BaseClient) {}\n\n  // --- Reseller self-service (org.isReseller) ---\n\n  /** Orgs associated to the caller reseller, with gross + commission rollups. */\n  async listAssociatedOrgs(): Promise<AssociatedOrg[]> {\n    const res = await this.http.get<{ success: boolean; data: AssociatedOrg[] }>('/reseller/associated-orgs');\n    return res.data ?? [];\n  }\n\n  /** The caller reseller's commission ledger. */\n  async listCommissions(): Promise<ResellerCommission[]> {\n    const res = await this.http.get<{ success: boolean; data: ResellerCommission[] }>('/reseller/commissions');\n    return res.data ?? [];\n  }\n\n  /** The caller reseller's payout history. */\n  async listPayouts(): Promise<ResellerPayout[]> {\n    const res = await this.http.get<{ success: boolean; data: ResellerPayout[] }>('/reseller/payouts');\n    return res.data ?? [];\n  }\n\n  // --- Platform-admin only ---\n\n  /** List all reseller orgs with aggregate performance. */\n  async listResellers(): Promise<ResellerPerformance[]> {\n    const res = await this.http.get<{ success: boolean; data: ResellerPerformance[] }>('/admin/resellers');\n    return res.data ?? [];\n  }\n\n  /** Designate an org as a reseller (optionally with a per-reseller bps override). */\n  async setReseller(orgId: string, body: SetResellerRequest = {}): Promise<Organization> {\n    const res = await this.http.post<{ success: boolean; data: Organization }>(\n      `/admin/orgs/${orgId}/reseller`,\n      { body },\n    );\n    return unwrapData(res);\n  }\n\n  /** Revoke an org's reseller status. */\n  async revokeReseller(orgId: string): Promise<Organization> {\n    const res = await this.http.delete<{ success: boolean; data: Organization }>(`/admin/orgs/${orgId}/reseller`);\n    return unwrapData(res);\n  }\n\n  /** End an org's reseller association (stamps resellerDetachedAt). */\n  async detachAssociation(orgId: string): Promise<Organization> {\n    const res = await this.http.post<{ success: boolean; data: Organization }>(\n      `/admin/orgs/${orgId}/detach-reseller`,\n      { body: {} },\n    );\n    return unwrapData(res);\n  }\n\n  /** The billing-program-config journal, newest first. */\n  async getProgramConfig(): Promise<BillingProgramConfig[]> {\n    const res = await this.http.get<{ success: boolean; data: BillingProgramConfig[] }>(\n      '/admin/billing-program-config',\n    );\n    return res.data ?? [];\n  }\n\n  /** Append a new program-config period (closes the prior open row). */\n  async appendProgramConfig(body: AppendProgramConfigRequest): Promise<BillingProgramConfig> {\n    const res = await this.http.post<{ success: boolean; data: BillingProgramConfig }>(\n      '/admin/billing-program-config',\n      { body },\n    );\n    return unwrapData(res);\n  }\n\n  /** Draft payouts from accrued commissions in the given period. */\n  async generatePayouts(body: GeneratePayoutsRequest): Promise<ResellerPayout[]> {\n    const res = await this.http.post<{ success: boolean; data: ResellerPayout[] }>(\n      '/admin/reseller-payouts/generate',\n      { body },\n    );\n    return res.data ?? [];\n  }\n\n  /** Approve or mark-paid a payout (and optionally record an external ref). */\n  async updatePayout(payoutId: string, body: UpdatePayoutRequest): Promise<ResellerPayout> {\n    const res = await this.http.patch<{ success: boolean; data: ResellerPayout }>(\n      `/admin/reseller-payouts/${payoutId}`,\n      { body },\n    );\n    return unwrapData(res);\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport { unwrapData } from '../../common/envelope.js';\nimport type {\n  AvailableModels,\n  ModelPricingRow,\n  ModelSelection,\n  PatchModelSelectionRequest,\n  PlatformSettings,\n  UpdatePlatformSettingsRequest,\n} from './types.js';\n\n/**\n * Platform-admin global config. All endpoints are gated server-side on the\n * caller's home org being a platform-admin org. The model-selection / pricing\n * methods are proxied through the backend to the cloud-agent service.\n */\nexport class PlatformAdminClient {\n  constructor(private readonly http: BaseClient) {}\n\n  // --- Global backend settings (open registration + free-tier credits) ---\n\n  /** Current global settings. */\n  async getPlatformSettings(): Promise<PlatformSettings> {\n    const res = await this.http.get<{ success: boolean; data: PlatformSettings }>('/admin/platform-settings');\n    return unwrapData(res);\n  }\n\n  /** Update the global settings. */\n  async updatePlatformSettings(body: UpdatePlatformSettingsRequest): Promise<PlatformSettings> {\n    const res = await this.http.put<{ success: boolean; data: PlatformSettings }>('/admin/platform-settings', {\n      body,\n    });\n    return unwrapData(res);\n  }\n\n  /** Models the aigateway currently exposes (for validating selection/pricing). */\n  async listAvailableModels(): Promise<AvailableModels> {\n    const res = await this.http.get<{ success: boolean; data: AvailableModels }>(\n      '/admin/available-models',\n    );\n    return unwrapData(res);\n  }\n\n  // --- Chat-model selection (bridged to cloud-agent) ---\n\n  /** Current model selection (provider priority + per-provider/role models). */\n  async getModelSelection(): Promise<ModelSelection> {\n    const res = await this.http.get<{ success: boolean; data: ModelSelection }>('/admin/model-selection');\n    return unwrapData(res);\n  }\n\n  /** Full replace of the model selection. Returns the fresh selection. */\n  async putModelSelection(body: ModelSelection): Promise<ModelSelection> {\n    const res = await this.http.put<{ success: boolean; data: ModelSelection }>('/admin/model-selection', { body });\n    return unwrapData(res);\n  }\n\n  /** Upsert a single (provider, role) → model slot. Returns the fresh selection. */\n  async patchModelSelection(body: PatchModelSelectionRequest): Promise<ModelSelection> {\n    const res = await this.http.patch<{ success: boolean; data: ModelSelection }>('/admin/model-selection', {\n      body,\n    });\n    return unwrapData(res);\n  }\n\n  // --- Model pricing / surcharge (bridged to cloud-agent) ---\n\n  /** All model_pricing rows. */\n  async listModelPricing(): Promise<ModelPricingRow[]> {\n    const res = await this.http.get<{ success: boolean; data: { pricing: ModelPricingRow[] } }>(\n      '/admin/model-pricing',\n    );\n    return unwrapData(res).pricing ?? [];\n  }\n\n  /** Upsert one model_pricing row (also used to add a new row). Returns the fresh list. */\n  async putModelPricing(row: ModelPricingRow): Promise<ModelPricingRow[]> {\n    const res = await this.http.put<{ success: boolean; data: { pricing: ModelPricingRow[] } }>(\n      '/admin/model-pricing',\n      { body: row },\n    );\n    return unwrapData(res).pricing ?? [];\n  }\n\n  /** Delete a model_pricing row by model id. Returns the fresh list. */\n  async deleteModelPricing(model: string): Promise<ModelPricingRow[]> {\n    const res = await this.http.delete<{ success: boolean; data: { pricing: ModelPricingRow[] } }>(\n      `/admin/model-pricing?model=${encodeURIComponent(model)}`,\n    );\n    return unwrapData(res).pricing ?? [];\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  Deployment,\n  RegisterDeploymentRequest,\n  RegisterDeploymentResponse,\n  DeploymentQuota,\n  SetDeploymentQuotaRequest,\n} from './types.js';\n\n// Org-scoped private/sovereign deployment management. Backend routes hang off\n// the root authed group — see internal/http/routes/federation (RegisterPortal)\n// in cloud-agent-backend. The matching machine edge (/federation/enroll,\n// /heartbeat) is driven by the appliance itself, not this SDK.\nconst BASE = '/deployments';\n\nexport class DeploymentsClient {\n  constructor(private readonly http: BaseClient) {}\n\n  /** List the org's deployments, newest first. */\n  list(): Promise<{ deployments: Deployment[] }> {\n    return this.http.get(BASE);\n  }\n\n  /** Fetch one deployment by id. */\n  get(id: string): Promise<{ deployment: Deployment }> {\n    return this.http.get(`${BASE}/${encodeURIComponent(id)}`);\n  }\n\n  /**\n   * Register a new deployment: reserves a quota slot and mints a one-time\n   * enrollment voucher. The voucher + install command in the response are shown\n   * ONCE (only the voucher hash is stored server-side).\n   */\n  register(body: RegisterDeploymentRequest): Promise<RegisterDeploymentResponse> {\n    return this.http.post(BASE, { body });\n  }\n\n  /** Decommission a deployment, freeing its quota slot. */\n  decommission(id: string): Promise<{ success: boolean }> {\n    return this.http.post(`${BASE}/${encodeURIComponent(id)}/decommission`);\n  }\n\n  /**\n   * The caller's org deployment-count quota (used vs cap). Org-scoped: a platform\n   * admin sending X-Impersonate-Org-Id sees the impersonated org's quota.\n   */\n  getQuota(): Promise<{ quota: DeploymentQuota }> {\n    return this.http.get(`${BASE}/quota`);\n  }\n\n  /**\n   * Platform-admin only: set an org's deployment cap (null → revert to the\n   * platform default). Operates on the explicit orgId via the admin pool, so it\n   * is independent of impersonation. Returns the refreshed quota.\n   */\n  setOrgQuota(orgId: string, body: SetDeploymentQuotaRequest): Promise<{ quota: DeploymentQuota }> {\n    return this.http.put(`/admin/orgs/${encodeURIComponent(orgId)}/deployment-quota`, { body });\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  BICatalogSummary,\n  BIEntityDetail,\n  ListBIDatasetsResponse,\n  ListBIModelsResponse,\n  SelectBIDatasetsRequest,\n  SelectBIDatasetsResponse,\n  TriggerBIDiscoveryResponse,\n} from './types.js';\n\n/**\n * BIClient is the Talk-to-Your-BI control-plane surface used by the data-agent\n * frontend: read the discovered semantic-model catalog, list connected models,\n * trigger a re-scan, and start the Power BI OAuth connect flow. All endpoints\n * are org-scoped + product-entitlement-gated server-side (requireProduct(\"bi\")).\n *\n * Catalog upsert + refresh-token rotation are machine-only (HMAC, engine→backend)\n * and deliberately NOT exposed here.\n */\nexport class BIClient {\n  constructor(\n    private readonly http: BaseClient,\n    private readonly baseUrl: string,\n  ) {}\n\n  /**\n   * Compact grounding catalog for a workspace's model: entities + measures +\n   * relationship names, no per-column detail. Pass `entity` to get the full\n   * (ranked) field list for one entity — the get_model_schema detail layer.\n   */\n  getCatalog(workspaceId: string, opts?: { modelId?: string; entity?: string }): Promise<BICatalogSummary | BIEntityDetail> {\n    const params = new URLSearchParams();\n    if (opts?.modelId) params.set('modelId', opts.modelId);\n    if (opts?.entity) params.set('entity', opts.entity);\n    const qs = params.size > 0 ? `?${params.toString()}` : '';\n    return this.http.get<BICatalogSummary | BIEntityDetail>(`/workspaces/${workspaceId}/bi/catalog${qs}`);\n  }\n\n  /** Lists the connected semantic models for a data project. */\n  listModels(workspaceId: string): Promise<ListBIModelsResponse> {\n    return this.http.get<ListBIModelsResponse>(`/workspaces/${workspaceId}/bi/models`);\n  }\n\n  /**\n   * Lists the connected account's workspaces + datasets for the dataset picker.\n   * The backend forwards to the engine (which holds the decrypted token) to make\n   * the Power BI REST calls. `credentialId` selects which connected account.\n   */\n  listDatasets(workspaceId: string, opts: { credentialId: string }): Promise<ListBIDatasetsResponse> {\n    const qs = `?credentialId=${encodeURIComponent(opts.credentialId)}`;\n    return this.http.get<ListBIDatasetsResponse>(`/workspaces/${workspaceId}/bi/datasets${qs}`);\n  }\n\n  /**\n   * Connects the chosen datasets: creates one bi_model per selection (the\n   * workspace GUID is stored on the model). Entities/measures are discovered\n   * lazily on the first chat question.\n   */\n  selectDatasets(workspaceId: string, body: SelectBIDatasetsRequest): Promise<SelectBIDatasetsResponse> {\n    return this.http.post<SelectBIDatasetsResponse>(`/workspaces/${workspaceId}/bi/models`, { body });\n  }\n\n  /**\n   * Triggers an engine-side catalog re-scan of the workspace's connected model\n   * (INFO.* discovery → bi_* upsert). Returns once the backend has accepted the\n   * request; the catalog read reflects the new data when discovery completes.\n   */\n  triggerDiscovery(workspaceId: string): Promise<TriggerBIDiscoveryResponse> {\n    return this.http.post<TriggerBIDiscoveryResponse>(`/workspaces/${workspaceId}/bi/discover`, {});\n  }\n\n  /**\n   * The browser URL that starts the delegated Power BI OAuth flow for a data\n   * project. Navigate the window here; the backend redirects to Microsoft and,\n   * on the callback, creates the POWERBI credential and returns to the frontend.\n   * `workspaceId` tells the backend which project to attach the credential to.\n   */\n  powerBIConnectUrl(workspaceId: string): string {\n    return `${this.baseUrl}/connect/powerbi?workspaceId=${encodeURIComponent(workspaceId)}`;\n  }\n}\n","import type { BaseClient } from '../../http/BaseClient.js';\nimport type {\n  CreateDashboardRequest,\n  CreateSnapshotShareRequest,\n  CreateSnapshotShareResponse,\n  DashboardResponse,\n  ExportAuthorization,\n  ExportRequest,\n  ListDashboardsResponse,\n  ListDashboardVersionsResponse,\n  ListSnapshotsResponse,\n  ListSnapshotSharesResponse,\n  OkResponse,\n  PopulateDashboardParams,\n  PopulateDashboardResult,\n  SnapshotResponse,\n  UpdateDashboardRequest,\n} from './api-types.js';\n\n/**\n * DashboardsClient is the visual-dashboard control plane (Talk-to-Your-BI block\n * B5): save/load/edit the durable Dashboard Spec, refresh it with current data\n * (run-as-owner, model-free), and freeze/share snapshots.\n *\n * Access is org-scoped + product-entitlement-gated (requireProduct(\"bi\")) +\n * project-membership-scoped server-side. Dynamic boards are same-org, member-only;\n * static snapshots are the externally-shareable, governed-PII-egress artifact.\n */\nexport class DashboardsClient {\n  constructor(\n    private readonly http: BaseClient,\n    private readonly baseUrl: string,\n  ) {}\n\n  private base(workspaceId: string): string {\n    return `/workspaces/${workspaceId}/bi/dashboards`;\n  }\n\n  /** Lists a project's saved dashboards (most-recently-updated first). */\n  list(workspaceId: string): Promise<ListDashboardsResponse> {\n    return this.http.get<ListDashboardsResponse>(this.base(workspaceId));\n  }\n\n  /** Fetches one dashboard (spec served verbatim; validate client-side). */\n  get(workspaceId: string, dashboardId: string): Promise<DashboardResponse> {\n    return this.http.get<DashboardResponse>(`${this.base(workspaceId)}/${dashboardId}`);\n  }\n\n  /** Saves a spec as a new dashboard (the spec is a validated DashboardSpec). */\n  create(workspaceId: string, body: CreateDashboardRequest): Promise<DashboardResponse> {\n    return this.http.post<DashboardResponse>(this.base(workspaceId), { body });\n  }\n\n  /**\n   * Updates a dashboard. A new `spec` bumps specVersion and appends an immutable\n   * version row; name/description-only edits do not bump.\n   */\n  update(workspaceId: string, dashboardId: string, body: UpdateDashboardRequest): Promise<DashboardResponse> {\n    return this.http.patch<DashboardResponse>(`${this.base(workspaceId)}/${dashboardId}`, { body });\n  }\n\n  /** Soft-deletes a dashboard (owner or project ADMIN). */\n  remove(workspaceId: string, dashboardId: string): Promise<OkResponse> {\n    return this.http.delete<OkResponse>(`${this.base(workspaceId)}/${dashboardId}`);\n  }\n\n  /** Lists a dashboard's spec history (newest first). */\n  listVersions(workspaceId: string, dashboardId: string): Promise<ListDashboardVersionsResponse> {\n    return this.http.get<ListDashboardVersionsResponse>(`${this.base(workspaceId)}/${dashboardId}/versions`);\n  }\n\n  /** Restores a prior version by forward-writing it as a new version. */\n  restoreVersion(workspaceId: string, dashboardId: string, specVersion: number): Promise<DashboardResponse> {\n    return this.http.post<DashboardResponse>(`${this.base(workspaceId)}/${dashboardId}/versions/${specVersion}/restore`, {});\n  }\n\n  /**\n   * Refreshes the dashboard with CURRENT data — the model-free, run-as-owner\n   * populate. Returns one PanelPayload per panel. `params` are resolved control\n   * values (interactivity rungs 2–3).\n   */\n  populate(workspaceId: string, dashboardId: string, body: PopulateDashboardParams = {}): Promise<PopulateDashboardResult> {\n    return this.http.post<PopulateDashboardResult>(`${this.base(workspaceId)}/${dashboardId}/populate`, { body });\n  }\n\n  /**\n   * Freezes a snapshot — the governed PII egress (explicit action + audit). The\n   * frozen panelData carries re-hydrated names.\n   */\n  createSnapshot(workspaceId: string, dashboardId: string, body: PopulateDashboardParams = {}): Promise<SnapshotResponse> {\n    return this.http.post<SnapshotResponse>(`${this.base(workspaceId)}/${dashboardId}/snapshots`, { body });\n  }\n\n  /** Lists a dashboard's snapshots (newest first). */\n  listSnapshots(workspaceId: string, dashboardId: string): Promise<ListSnapshotsResponse> {\n    return this.http.get<ListSnapshotsResponse>(`${this.base(workspaceId)}/${dashboardId}/snapshots`);\n  }\n\n  /** Reads one snapshot (same-org; no live query, no credential). */\n  getSnapshot(workspaceId: string, dashboardId: string, snapshotId: string): Promise<SnapshotResponse> {\n    return this.http.get<SnapshotResponse>(`${this.base(workspaceId)}/${dashboardId}/snapshots/${snapshotId}`);\n  }\n\n  /**\n   * Mints a snapshot share — an internal/known-user grant or an anonymous link.\n   * External sharing (a link or a cross-org user) requires the org's\n   * allowExternalSharing flag. A minted link's raw secret is returned ONCE in\n   * `linkToken`; only its hash is stored.\n   */\n  createSnapshotShare(\n    workspaceId: string,\n    dashboardId: string,\n    snapshotId: string,\n    body: CreateSnapshotShareRequest,\n  ): Promise<CreateSnapshotShareResponse> {\n    return this.http.post<CreateSnapshotShareResponse>(\n      `${this.base(workspaceId)}/${dashboardId}/snapshots/${snapshotId}/shares`,\n      { body },\n    );\n  }\n\n  /** Lists a snapshot's shares (owner/ADMIN; link secrets never returned). */\n  listSnapshotShares(workspaceId: string, dashboardId: string, snapshotId: string): Promise<ListSnapshotSharesResponse> {\n    return this.http.get<ListSnapshotSharesResponse>(\n      `${this.base(workspaceId)}/${dashboardId}/snapshots/${snapshotId}/shares`,\n    );\n  }\n\n  /** Revokes a share/link. */\n  revokeSnapshotShare(workspaceId: string, dashboardId: string, snapshotId: string, shareId: string): Promise<OkResponse> {\n    return this.http.delete<OkResponse>(\n      `${this.base(workspaceId)}/${dashboardId}/snapshots/${snapshotId}/shares/${shareId}`,\n    );\n  }\n\n  /**\n   * Reads a snapshot shared with the caller via an explicit user grant (internal\n   * or cross-org). Not project-scoped — the grant is the authorization.\n   */\n  getSharedSnapshot(snapshotId: string): Promise<SnapshotResponse> {\n    return this.http.get<SnapshotResponse>(`/bi/snapshots/${snapshotId}/shared`);\n  }\n\n  /**\n   * Reads a snapshot via an anonymous link token (no session). Use `token` = the\n   * raw secret returned by createSnapshotShare({ link: true }).\n   */\n  getPublicSnapshot(token: string): Promise<SnapshotResponse> {\n    return this.http.get<SnapshotResponse>(`/public/bi/snapshots/${encodeURIComponent(token)}`);\n  }\n\n  /** The shareable URL for an anonymous link token (for copy-to-clipboard). */\n  publicSnapshotUrl(token: string): string {\n    return `${this.baseUrl}/public/bi/snapshots/${encodeURIComponent(token)}`;\n  }\n\n  /**\n   * Authorizes + audits a client-side export BEFORE the caller serialises the file\n   * (Talk-to-Your-BI block B7). This makes the O1 \"audit exports always\" guarantee\n   * un-skippable: the file must not be produced until this resolves. A workspace-\n   * scoped export is same-org (project membership), so it is audit-only; the\n   * allowExternalSharing gate governs only the cross-org / anonymous-link recipient\n   * surfaces. Throws HttpError(403) when a gated egress is disallowed.\n   */\n  recordExport(workspaceId: string, dashboardId: string, body: ExportRequest): Promise<ExportAuthorization> {\n    return this.http.post<ExportAuthorization>(`${this.base(workspaceId)}/${dashboardId}/exports`, { body });\n  }\n}\n","import { BaseClient, type BaseClientOptions } from './http/BaseClient.js';\nimport { AuthClient } from './modules/auth/AuthClient.js';\nimport { MfaClient } from './modules/mfa/MfaClient.js';\nimport { UserClient } from './modules/user/UserClient.js';\nimport { OrganizationClient } from './modules/organization/OrganizationClient.js';\nimport { ProjectsClient } from './modules/projects/ProjectsClient.js';\nimport { SandboxesClient } from './modules/sandboxes/SandboxesClient.js';\nimport { CredentialsClient } from './modules/credentials/CredentialsClient.js';\nimport { ChatClient } from './modules/chat/ChatClient.js';\nimport { TemplatesClient } from './modules/agentEngine/TemplatesClient.js';\nimport { ScheduledTasksClient } from './modules/agentEngine/ScheduledTasksClient.js';\nimport { ResourcesClient } from './modules/resources/ResourcesClient.js';\nimport { SystemEventsClient } from './modules/systemEvents/SystemEventsClient.js';\nimport { SubscriptionsClient } from './modules/billing/SubscriptionsClient.js';\nimport { CreditsClient } from './modules/billing/CreditsClient.js';\nimport { UsageClient } from './modules/usage/UsageClient.js';\nimport { BudgetsClient } from './modules/budgets/BudgetsClient.js';\nimport { ReferralsClient } from './modules/referrals/ReferralsClient.js';\nimport { ResellerClient } from './modules/reseller/ResellerClient.js';\nimport { PlatformAdminClient } from './modules/platformAdmin/PlatformAdminClient.js';\nimport { DeploymentsClient } from './modules/deployments/DeploymentsClient.js';\nimport { BIClient } from './modules/bi/BIClient.js';\nimport { DashboardsClient } from './modules/dashboards/DashboardsClient.js';\n\nexport type CloudAgentClientOptions = BaseClientOptions;\n\nclass AgentEngineFacade {\n  constructor(\n    public readonly templates: TemplatesClient,\n    public readonly scheduledTasks: ScheduledTasksClient,\n  ) {}\n}\n\nclass BillingFacade {\n  constructor(\n    public readonly subscriptions: SubscriptionsClient,\n    public readonly credits: CreditsClient,\n  ) {}\n}\n\nexport class CloudAgentClient {\n  readonly http: BaseClient;\n  readonly auth: AuthClient;\n  readonly mfa: MfaClient;\n  readonly user: UserClient;\n  readonly organization: OrganizationClient;\n  readonly projects: ProjectsClient;\n  readonly sandboxes: SandboxesClient;\n  readonly credentials: CredentialsClient;\n  readonly chat: ChatClient;\n  readonly agentEngine: AgentEngineFacade;\n  readonly resources: ResourcesClient;\n  readonly systemEvents: SystemEventsClient;\n  readonly billing: BillingFacade;\n  readonly usage: UsageClient;\n  readonly budgets: BudgetsClient;\n  readonly referrals: ReferralsClient;\n  readonly reseller: ResellerClient;\n  readonly platformAdmin: PlatformAdminClient;\n  readonly deployments: DeploymentsClient;\n  readonly bi: BIClient;\n  readonly dashboards: DashboardsClient;\n\n  constructor(options: CloudAgentClientOptions) {\n    this.http = new BaseClient(options);\n    this.auth = new AuthClient(this.http);\n    this.mfa = new MfaClient(this.http);\n    this.user = new UserClient(this.http);\n    this.organization = new OrganizationClient(this.http);\n    this.projects = new ProjectsClient(this.http);\n    this.sandboxes = new SandboxesClient(this.http);\n    this.credentials = new CredentialsClient(this.http);\n    this.chat = new ChatClient(this.http, { baseUrl: this.http.baseUrl, getToken: options.getToken });\n    this.agentEngine = new AgentEngineFacade(\n      new TemplatesClient(this.http),\n      new ScheduledTasksClient(this.http),\n    );\n    this.resources = new ResourcesClient(this.http);\n    this.systemEvents = new SystemEventsClient(this.http);\n    this.billing = new BillingFacade(new SubscriptionsClient(this.http), new CreditsClient(this.http));\n    this.usage = new UsageClient(this.http);\n    this.budgets = new BudgetsClient(this.http);\n    this.referrals = new ReferralsClient(this.http);\n    this.reseller = new ResellerClient(this.http);\n    this.platformAdmin = new PlatformAdminClient(this.http);\n    this.deployments = new DeploymentsClient(this.http);\n    this.bi = new BIClient(this.http, this.http.baseUrl);\n    this.dashboards = new DashboardsClient(this.http, this.http.baseUrl);\n  }\n}\n","export enum ProviderType {\n  LOCAL = 'LOCAL',\n  GOOGLE = 'GOOGLE',\n  MICROSOFT = 'MICROSOFT',\n  GITHUB = 'GITHUB',\n  WEB3_STELLAR = 'WEB3_STELLAR',\n}\n\nexport enum AccessType {\n  READ = 'READ',\n  WRITE = 'WRITE',\n  ADMIN = 'ADMIN',\n}\n\nexport enum OrgRoles {\n  USER           = 0x00,\n  BILLING        = 0x01,\n  WORKSPACES     = 0x02,\n  ADMINISTRATORS = 0xfe,\n  OWNER          = 0xff,\n}\n\nexport interface UserSummary {\n  id: string;\n  name: string;\n  lastName: string;\n  email: string;\n  orgRole?: number | null;\n}\n","export enum MFAType {\n  GOOGLE_AUTH = 'GOOGLE_AUTH',\n  MAGIC_LINK = 'MAGIC_LINK',\n  PASSKEY = 'PASSKEY',\n}\n\nexport interface MFAStatus {\n  isEnabled: boolean;\n  isRequired: boolean;\n  isEnforced: boolean;\n  enabledMethods: MFAType[];\n  primaryMethod?: MFAType | null;\n  sessionVerified: boolean;\n}\n\nexport interface MFASetupResponse {\n  success: boolean;\n  data?: {\n    mfaType: MFAType;\n    secret?: string;\n    qrCode?: string;\n    backupCodes?: string[];\n  };\n  message?: string;\n}\n\nexport interface MFAVerifySetupRequest {\n  mfaType: MFAType;\n  code?: string;\n  credential?: Record<string, unknown>;\n}\n\nexport interface MFAVerifyLoginRequest {\n  mfaType: MFAType;\n  code?: string;\n  credential?: Record<string, unknown>;\n}\n\nexport interface MFASimpleResponse {\n  success: boolean;\n  message?: string;\n  data?: unknown;\n}\n\nexport interface MFAVerifyLoginResponse {\n  success: boolean;\n  accessToken?: string;\n  refreshToken?: string;\n  tokenId?: string;\n  expiresAt?: number;\n  user?: unknown;\n  message?: string;\n  error_code?: string;\n}\n\nexport interface MagicLinkSendResponse {\n  success: boolean;\n  message?: string;\n}\n\nexport interface MagicLinkActivateRequest {\n  token: string;\n}\n","// Provider catalog — TypeScript mirror of cloud-agent-backend's\n// internal/providers package. Drives the dynamic key form (one component\n// renders any provider) and pre-validates payloads client-side before\n// submitting. The server-side catalog is the safety net; this mirror\n// lets the UI fail fast and produce friendlier inline errors.\n//\n// Keep this file in sync with cloud-agent-backend/internal/providers/specs.go\n// when adding/changing providers. The shapes are intentionally identical.\n\n// ── Field-descriptor types ─────────────────────────────────────────────\n\nexport type FieldType = 'text' | 'password' | 'number' | 'textarea' | 'pem' | 'json' | 'stringList';\n\nexport interface FieldSpec {\n  /** JSON-pointer-ish: \"secret\" | \"metadata.<key>\". */\n  path: string;\n  label: string;\n  type: FieldType;\n  required: boolean;\n  /** True for fields that hold credential material — UI hides the value. */\n  secret?: boolean;\n  default?: unknown;\n  placeholder?: string;\n  help?: string;\n}\n\n// Capability bitmask values mirrored from cloud-agent-backend's\n// internal/providers package and the \"Provider\" master table seeded by\n// migration 0005. Frontends drive tab/section filtering by AND-ing\n// against these bits — adding a new capability is a backend migration,\n// not a frontend deploy.\n//\n//   CAP_STORAGE — cloud ops / resource discovery (S3/GCS/Blob, EC2, …)\n//   CAP_AI      — LLM / embedding inference\n//   CAP_COMPUTE — SSH and similar infra-runtime credentials\n//   CAP_VCS     — source-code platforms (GitHub, future GitLab)\n//   CAP_NOTIFY  — outbound notification transports (Slack, Teams, PagerDuty, SMTP)\n//   CAP_GENERAL — catch-all for the legacy \"OTHER\" row\nexport const CAP_STORAGE = 0x1;\nexport const CAP_AI = 0x2;\nexport const CAP_COMPUTE = 0x4;\nexport const CAP_VCS = 0x8;\nexport const CAP_NOTIFY = 0x10;\nexport const CAP_GENERAL = 0xff;\n\nexport interface ProviderSpec {\n  id: string;\n  displayName: string;\n  /**\n   * Bitmask of CAP_* values describing what kinds of operations this\n   * credential can drive. Sourced from the Provider master table; mirror\n   * declared inline below so the frontend can render its tabs / filters\n   * without a runtime round-trip.\n   */\n  capabilities: number;\n  fields: FieldSpec[];\n}\n\n// ── Catalog ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_CATALOG: Record<string, ProviderSpec> = {\n  AWS: {\n    id: 'AWS',\n    displayName: 'Amazon Web Services',\n    capabilities: CAP_STORAGE,\n    fields: [\n      { path: 'metadata.accessKeyId', label: 'Access Key ID', type: 'text', required: true,\n        placeholder: 'AKIAxxxxxxxxxxxxxxxx',\n        help: 'The AKIA-prefixed identifier from IAM. Stored in plain text — only the secret access key is encrypted.' },\n      { path: 'secret', label: 'Secret Access Key', type: 'password', required: true, secret: true,\n        help: 'The 40-character secret. Encrypted at rest.' },\n      { path: 'metadata.region', label: 'Region', type: 'text', required: false,\n        placeholder: 'us-east-1',\n        help: 'Default region for boto3 clients. Optional — leave blank to use the SDK default.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://s3.amazonaws.com',\n        help: 'Override for non-AWS S3-compatible endpoints (MinIO, Wasabi, etc.). Most users leave blank.' },\n    ],\n  },\n  BEDROCK: {\n    id: 'BEDROCK',\n    displayName: 'AWS Bedrock',\n    capabilities: CAP_AI,\n    fields: [\n      { path: 'metadata.accessKeyId', label: 'Access Key ID', type: 'text', required: true,\n        placeholder: 'AKIAxxxxxxxxxxxxxxxx',\n        help: 'IAM access key allowed to invoke Bedrock. Stored in plain text — only the secret access key is encrypted.' },\n      { path: 'secret', label: 'Secret Access Key', type: 'password', required: true, secret: true,\n        help: 'The IAM secret. Encrypted at rest.' },\n      { path: 'metadata.region', label: 'Region', type: 'text', required: false,\n        placeholder: 'us-east-1',\n        help: 'Default region for Bedrock Runtime. Optional — leave blank to use the SDK default.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://bedrock-runtime.us-east-1.amazonaws.com',\n        help: 'Override for VPC endpoints or testing. Most users leave blank.' },\n    ],\n  },\n  GCP: {\n    id: 'GCP',\n    displayName: 'Google Cloud',\n    capabilities: CAP_STORAGE,\n    fields: [\n      { path: 'secret', label: 'Service Account JSON', type: 'json', required: true, secret: true,\n        placeholder: '{\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"}',\n        help: 'Paste the service-account JSON, or drop the file you downloaded from the IAM console. The full document is encrypted; project_id and client_email are extracted automatically for display.' },\n    ],\n  },\n  AZURE: {\n    id: 'AZURE',\n    displayName: 'Microsoft Azure',\n    capabilities: CAP_STORAGE,\n    fields: [\n      { path: 'metadata.clientId', label: 'Client ID (Application ID)', type: 'text', required: true,\n        placeholder: '00000000-0000-0000-0000-000000000000' },\n      { path: 'secret', label: 'Client Secret', type: 'password', required: true, secret: true,\n        help: 'The secret value generated when you registered the app. Encrypted at rest.' },\n      { path: 'metadata.tenantId', label: 'Tenant ID', type: 'text', required: true,\n        placeholder: '00000000-0000-0000-0000-000000000000' },\n      { path: 'metadata.subscriptionId', label: 'Subscription ID', type: 'text', required: false,\n        placeholder: '00000000-0000-0000-0000-000000000000' },\n    ],\n  },\n  OCI: {\n    id: 'OCI',\n    displayName: 'Oracle Cloud Infrastructure',\n    capabilities: CAP_STORAGE,\n    fields: [\n      { path: 'metadata.tenancyOcid', label: 'Tenancy OCID', type: 'text', required: true,\n        placeholder: 'ocid1.tenancy.oc1..aaaa…',\n        help: \"The tenancy's OCID, from the OCI console (Profile → Tenancy).\" },\n      { path: 'metadata.userOcid', label: 'User OCID', type: 'text', required: true,\n        placeholder: 'ocid1.user.oc1..aaaa…',\n        help: 'The OCID of the user the API signing key belongs to.' },\n      { path: 'metadata.fingerprint', label: 'Key Fingerprint', type: 'text', required: true,\n        placeholder: 'aa:bb:cc:dd:…',\n        help: 'Fingerprint of the uploaded API signing key (shown next to the key in the console).' },\n      { path: 'secret', label: 'API Private Key (PEM)', type: 'pem', required: true, secret: true,\n        placeholder: '-----BEGIN PRIVATE KEY-----\\n…\\n-----END PRIVATE KEY-----',\n        help: 'Paste the PEM, or drop the .pem file. Passphrase-protected keys are rejected — the agent runs unattended. Encrypted at rest.' },\n      { path: 'metadata.region', label: 'Region', type: 'text', required: false,\n        placeholder: 'us-phoenix-1',\n        help: 'Default region for the oci CLI / SDK. Optional — leave blank to use the SDK default.' },\n    ],\n  },\n  SSH: {\n    id: 'SSH',\n    displayName: 'SSH',\n    capabilities: CAP_COMPUTE,\n    fields: [\n      { path: 'metadata.user', label: 'User', type: 'text', required: true,\n        placeholder: 'ubuntu',\n        help: 'Linux user the agent will SSH as.' },\n      { path: 'metadata.host', label: 'Host', type: 'text', required: true,\n        placeholder: 'vps.example.com  or  *  for wildcard',\n        help: \"Hostname or IP. Use '*' for a key that's valid across multiple hosts; the agent will require the prompt to name the target host.\" },\n      { path: 'metadata.port', label: 'Port', type: 'number', required: false, default: 22,\n        placeholder: '22' },\n      { path: 'secret', label: 'PEM Private Key', type: 'pem', required: true, secret: true,\n        placeholder: '-----BEGIN OPENSSH PRIVATE KEY-----\\n…\\n-----END OPENSSH PRIVATE KEY-----',\n        help: 'Paste the PEM, or drop the private key file (e.g. id_ed25519). Passphrase-encrypted keys are rejected — the agent runs unattended.' },\n    ],\n  },\n  GITHUB: {\n    id: 'GITHUB',\n    displayName: 'GitHub',\n    capabilities: CAP_VCS,\n    fields: [\n      { path: 'secret', label: 'Personal Access Token (PAT)', type: 'password', required: true, secret: true,\n        placeholder: 'ghp_xxxxxxxxxxxxxxxxxxxxxxxx',\n        help: 'A classic or fine-grained PAT. Encrypted at rest. The first 7 characters are kept in metadata for display.' },\n      { path: 'metadata.org', label: 'Org (optional)', type: 'text', required: false,\n        placeholder: 'my-github-org',\n        help: 'Restrict this credential to a single org if you scoped the PAT that way. Optional — leave blank for personal-account access.' },\n      { path: 'metadata.repoSlugs', label: 'Allowed Repos (optional)', type: 'stringList', required: false,\n        placeholder: 'owner/repo',\n        help: \"Repos the agent is allowed to operate on with this credential, as 'owner/name'. Drives the awareness block injected into the planner. Leave empty to grant the full PAT scope (the agent will still only act on repos the user names in prompts).\" },\n      { path: 'metadata.protectedBranches', label: 'Protected Branches (optional)', type: 'stringList', required: false,\n        placeholder: 'main',\n        help: \"Branches that require explicit user approval for write operations (push, merge, delete). 'main' / 'master' / 'release/*' are good defaults.\" },\n    ],\n  },\n  GITLAB: {\n    id: 'GITLAB',\n    displayName: 'GitLab',\n    capabilities: CAP_VCS,\n    fields: [\n      { path: 'secret', label: 'Access Token', type: 'password', required: true, secret: true,\n        placeholder: 'glpat-xxxxxxxxxxxxxxxxxxxx',\n        help: 'A personal, project, or group access token. Encrypted at rest. The first 9 characters are kept in metadata for display.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://gitlab.example.com/api/v4',\n        help: 'Override for self-hosted GitLab. Leave blank to use https://gitlab.com/api/v4.' },\n      { path: 'metadata.group', label: 'Top-level Group (optional)', type: 'text', required: false,\n        placeholder: 'my-gitlab-group',\n        help: 'Restrict this credential to a single top-level group if you scoped the token that way. Optional — leave blank for personal-account or wider scope.' },\n      { path: 'metadata.repoSlugs', label: 'Allowed Projects (optional)', type: 'stringList', required: false,\n        placeholder: 'group/subgroup/project',\n        help: 'Project paths the agent is allowed to operate on with this credential. GitLab project paths can be arbitrarily deep (group/subgroup/.../project). Leave empty to grant the full token scope.' },\n      { path: 'metadata.protectedBranches', label: 'Protected Branches (optional)', type: 'stringList', required: false,\n        placeholder: 'main',\n        help: \"Branches that require explicit user approval for write operations. 'main' / 'master' / 'release/*' are good defaults.\" },\n    ],\n  },\n  AZURE_DEVOPS: {\n    id: 'AZURE_DEVOPS',\n    displayName: 'Azure DevOps',\n    capabilities: CAP_VCS,\n    fields: [\n      { path: 'secret', label: 'Personal Access Token (PAT)', type: 'password', required: true, secret: true,\n        placeholder: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n        help: 'An ADO PAT with the scopes you want the agent to use (Code, Build, Release, Work Items …). Encrypted at rest. The first 7 characters are kept in metadata for display.' },\n      { path: 'metadata.organization', label: 'Organization', type: 'text', required: true,\n        placeholder: 'my-ado-org',\n        help: 'The ADO organization name (the segment after dev.azure.com/, or the prefix in your-org.visualstudio.com).' },\n      { path: 'metadata.project', label: 'Project (optional)', type: 'text', required: false,\n        placeholder: 'Engineering',\n        help: 'Restrict this credential to a single ADO project. Optional — leave blank if the PAT spans multiple projects in the org.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://dev.azure.com',\n        help: 'Override for ADO Server (on-prem) deployments. Leave blank to use https://dev.azure.com.' },\n      { path: 'metadata.repoSlugs', label: 'Allowed Repos (optional)', type: 'stringList', required: false,\n        placeholder: 'project/repo',\n        help: \"Repos the agent is allowed to operate on. Use 'project/repo' when 'Project' is blank, or just 'repo' when scoped to one project. Leave empty to grant the full PAT scope.\" },\n      { path: 'metadata.protectedBranches', label: 'Protected Branches (optional)', type: 'stringList', required: false,\n        placeholder: 'main',\n        help: 'Branches that require explicit user approval for write operations and pipeline triggers.' },\n    ],\n  },\n  OPENAI: {\n    id: 'OPENAI',\n    displayName: 'OpenAI',\n    capabilities: CAP_AI,\n    fields: [\n      { path: 'secret', label: 'API Key', type: 'password', required: true, secret: true,\n        placeholder: 'sk-…',\n        help: 'Your OpenAI API key. Encrypted at rest. The first ~7 characters are kept in metadata for display.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://api.openai.com/v1',\n        help: 'Override for OpenAI-compatible endpoints (Azure OpenAI, self-hosted gateways). Most users leave blank.' },\n    ],\n  },\n  ANTHROPIC: {\n    id: 'ANTHROPIC',\n    displayName: 'Anthropic',\n    capabilities: CAP_AI,\n    fields: [\n      { path: 'secret', label: 'API Key', type: 'password', required: true, secret: true,\n        placeholder: 'sk-ant-…',\n        help: 'Your Anthropic API key. Encrypted at rest. The first ~10 characters are kept in metadata for display.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://api.anthropic.com',\n        help: 'Override for Anthropic-compatible endpoints. Most users leave blank.' },\n    ],\n  },\n  GEMINI: {\n    id: 'GEMINI',\n    displayName: 'Google Gemini',\n    capabilities: CAP_AI,\n    fields: [\n      { path: 'secret', label: 'API Key', type: 'password', required: true, secret: true,\n        placeholder: 'AIza…',\n        help: 'Your Gemini API key from Google AI Studio. Encrypted at rest. The first ~7 characters are kept in metadata for display.' },\n      { path: 'metadata.endpoint', label: 'Endpoint (optional)', type: 'text', required: false,\n        placeholder: 'https://generativelanguage.googleapis.com',\n        help: 'Override for proxies or regional endpoints. Most users leave blank to use the default Gemini API base URL.' },\n    ],\n  },\n  SLACK: {\n    id: 'SLACK',\n    displayName: 'Slack',\n    capabilities: CAP_NOTIFY,\n    fields: [\n      { path: 'secret', label: 'Incoming Webhook URL', type: 'password', required: true, secret: true,\n        placeholder: 'https://hooks.slack.com/services/T000/B000/xxxxxxxx',\n        help: 'A Slack Incoming Webhook URL. The target channel is fixed by the webhook. Encrypted at rest; never injected into the sandbox.' },\n      { path: 'metadata.channelHint', label: 'Channel Hint (optional)', type: 'text', required: false,\n        placeholder: '#oncall',\n        help: 'Display-only label for the channel this webhook posts to. Does not change routing — the webhook URL controls the destination.' },\n    ],\n  },\n  TEAMS: {\n    id: 'TEAMS',\n    displayName: 'Microsoft Teams',\n    capabilities: CAP_NOTIFY,\n    fields: [\n      { path: 'secret', label: 'Incoming Webhook URL', type: 'password', required: true, secret: true,\n        placeholder: 'https://outlook.office.com/webhook/...',\n        help: 'A Teams Incoming Webhook (connector) URL. The target channel is fixed by the webhook. Encrypted at rest; never injected into the sandbox.' },\n    ],\n  },\n  PAGERDUTY: {\n    id: 'PAGERDUTY',\n    displayName: 'PagerDuty',\n    capabilities: CAP_NOTIFY,\n    fields: [\n      { path: 'secret', label: 'Integration / Routing Key', type: 'password', required: true, secret: true,\n        placeholder: 'R0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',\n        help: 'An Events API v2 integration (routing) key from a PagerDuty service. Encrypted at rest; never injected into the sandbox.' },\n    ],\n  },\n  SMTP: {\n    id: 'SMTP',\n    displayName: 'Email (SMTP)',\n    capabilities: CAP_NOTIFY,\n    fields: [\n      { path: 'metadata.host', label: 'SMTP Host', type: 'text', required: true,\n        placeholder: 'smtp.example.com',\n        help: 'Hostname of the SMTP relay.' },\n      { path: 'metadata.port', label: 'Port', type: 'number', required: false, default: 587,\n        placeholder: '587',\n        help: 'SMTP port. Defaults to 587 (STARTTLS). TLS is always required.' },\n      { path: 'metadata.fromAddress', label: 'From Address', type: 'text', required: true,\n        placeholder: 'alerts@example.com',\n        help: 'Envelope-from / From header for messages the agent sends. Also used as the SMTP AUTH username.' },\n      { path: 'metadata.toAddresses', label: 'To Addresses', type: 'stringList', required: true,\n        placeholder: 'oncall@example.com',\n        help: 'One or more recipient addresses. Every notify message is sent to all of them.' },\n      { path: 'secret', label: 'Password', type: 'password', required: true, secret: true,\n        help: 'SMTP AUTH password for the From address. Encrypted at rest; never injected into the sandbox.' },\n    ],\n  },\n  TELEGRAM: {\n    id: 'TELEGRAM',\n    displayName: 'Telegram',\n    capabilities: CAP_NOTIFY,\n    fields: [\n      { path: 'secret', label: 'Bot Token', type: 'password', required: true, secret: true,\n        placeholder: '123456789:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n        help: 'Bot token from @BotFather. Encrypted at rest; never injected into the sandbox. One bot per project keeps projects isolated.' },\n      { path: 'metadata.chatId', label: 'Chat ID', type: 'text', required: false,\n        placeholder: '-1001234567890  or  @mychannel',\n        help: 'Default chat the agent posts to. Use Detect to fill it automatically, or enter a numeric id (groups are negative) / @username for a public channel. Optional — leave blank for inbound-only (driving the agent from a chat); inbound replies go to whoever messages the bot.' },\n      { path: 'metadata.threadId', label: 'Topic / Thread ID (optional)', type: 'number', required: false,\n        placeholder: '12',\n        help: 'For forum-style groups, the message_thread_id to post into. Leave blank for the main chat.' },\n    ],\n  },\n};\n\n// Stable display order for dropdowns. Matches the Go catalog's List().\nconst PROVIDER_ORDER = ['AWS', 'BEDROCK', 'GCP', 'AZURE', 'OCI', 'SSH', 'GITHUB', 'GITLAB', 'AZURE_DEVOPS', 'OPENAI', 'ANTHROPIC', 'GEMINI', 'SLACK', 'TEAMS', 'PAGERDUTY', 'SMTP', 'TELEGRAM'];\n\nexport function listProviders(): ProviderSpec[] {\n  return PROVIDER_ORDER.flatMap((id) => (PROVIDER_CATALOG[id] ? [PROVIDER_CATALOG[id]] : []));\n}\n\nexport function getProvider(id: string): ProviderSpec | undefined {\n  return PROVIDER_CATALOG[id];\n}\n\n// ── Path helpers ───────────────────────────────────────────────────────\n\nconst SECRET_PATH = 'secret';\nconst METADATA_PREFIX = 'metadata.';\n\nexport function isSecretPath(path: string): boolean {\n  return path === SECRET_PATH;\n}\n\nexport function isMetadataPath(path: string): path is `metadata.${string}` {\n  return path.startsWith(METADATA_PREFIX);\n}\n\nexport function metadataKey(path: string): string | undefined {\n  return isMetadataPath(path) ? path.slice(METADATA_PREFIX.length) : undefined;\n}\n\n/** getValueAt reads the FieldSpec.path from a separate (secret, metadata) tuple. */\nexport function getValueAt(secret: string, metadata: Record<string, unknown>, path: string): unknown {\n  if (path === SECRET_PATH) return secret;\n  const k = metadataKey(path);\n  return k ? metadata[k] : undefined;\n}\n\n/** setValueAt writes to (secret, metadata). Returns the updated tuple. */\nexport function setValueAt(\n  secret: string,\n  metadata: Record<string, unknown>,\n  path: string,\n  value: unknown,\n): { secret: string; metadata: Record<string, unknown> } {\n  if (path === SECRET_PATH) return { secret: typeof value === 'string' ? value : '', metadata };\n  const k = metadataKey(path);\n  if (!k) return { secret, metadata };\n  const nextMeta = { ...metadata };\n  if (value === undefined || value === null || value === '') delete nextMeta[k];\n  else nextMeta[k] = value;\n  return { secret, metadata: nextMeta };\n}\n\n// ── Validation ─────────────────────────────────────────────────────────\n\n/**\n * validate runs the structural checks for a credential payload. Returns\n * an error string on failure, or null on success. Mirrors the Go-side\n * Validate() in internal/providers/validators.go.\n */\nexport function validate(\n  providerId: string,\n  label: string,\n  secret: string,\n  metadata: Record<string, unknown>,\n): string | null {\n  const spec = getProvider(providerId);\n  if (!spec) {\n    return `Unknown provider \"${providerId}\". Known providers: ${Object.keys(PROVIDER_CATALOG).join(', ')}`;\n  }\n  if (!label || label.trim() === '') {\n    return 'Label is required';\n  }\n\n  // Required-field + type checks.\n  for (const f of spec.fields) {\n    const present = isFieldPresent(secret, metadata, f.path);\n    if (f.required && !present) {\n      return `${spec.id}.${f.label} is required`;\n    }\n    if (!present) continue;\n    const value = getValueAt(secret, metadata, f.path);\n    const typeErr = typeCheck(f, value);\n    if (typeErr) return typeErr;\n  }\n\n  // Reject any caller-supplied metadata keys not declared in the spec\n  // and any reserved underscore-prefixed keys (catalog-managed).\n  const allowed = allowedMetadataKeys(spec);\n  for (const k of Object.keys(metadata)) {\n    if (k.startsWith('_')) {\n      return `Metadata key \"${k}\" is reserved (the leading underscore is catalog-managed); remove it from the payload`;\n    }\n    if (!allowed.has(k)) {\n      return `Metadata key \"${k}\" is not part of the ${spec.id} spec. Allowed keys: ${[...allowed].join(', ')}`;\n    }\n  }\n  return null;\n}\n\nfunction isFieldPresent(secret: string, metadata: Record<string, unknown>, path: string): boolean {\n  const v = getValueAt(secret, metadata, path);\n  if (v === undefined || v === null) return false;\n  if (typeof v === 'string') return v.trim() !== '';\n  // Mirror the Go getAtPath: empty arrays count as absent so required-field\n  // checks fire and stringList fields can be cleared by submitting [].\n  if (Array.isArray(v)) return v.length > 0;\n  return true;\n}\n\nfunction typeCheck(f: FieldSpec, value: unknown): string | null {\n  switch (f.type) {\n    case 'text':\n    case 'password':\n    case 'textarea':\n      return typeof value === 'string' ? null : `${f.label} must be a string`;\n    case 'number':\n      if (typeof value === 'number' && Number.isInteger(value) && value >= 0) return null;\n      if (typeof value === 'string' && /^\\d+$/.test(value)) return null;\n      return `${f.label} must be a non-negative integer`;\n    case 'json':\n      if (typeof value !== 'string') return `${f.label} must be a JSON string`;\n      try {\n        JSON.parse(value);\n        return null;\n      } catch {\n        return `${f.label} is not valid JSON`;\n      }\n    case 'pem':\n      if (typeof value !== 'string') return `${f.label} must be a PEM string`;\n      return validatePEM(value, f.label);\n    case 'stringList': {\n      if (!Array.isArray(value)) return `${f.label} must be a list of strings`;\n      for (let i = 0; i < value.length; i++) {\n        const item = value[i];\n        if (typeof item !== 'string') return `${f.label}[${i}] must be a string`;\n        if (item.trim() === '') return `${f.label}[${i}] is empty`;\n      }\n      return null;\n    }\n    default:\n      return `${f.label} has unsupported field type ${f.type}`;\n  }\n}\n\nconst PEM_BEGIN_RE = /-----BEGIN [^-]+-----/;\nconst PEM_END_RE = /-----END [^-]+-----/;\nconst PEM_PROC_TYPE_ENCRYPTED = /^Proc-Type:\\s*\\d+,\\s*ENCRYPTED/m;\nconst PEM_DEK_INFO = /^DEK-Info:/m;\n\nfunction validatePEM(s: string, label: string): string | null {\n  const t = s.trim();\n  if (!t) return `${label}: empty PEM`;\n  if (!PEM_BEGIN_RE.test(t) || !PEM_END_RE.test(t)) {\n    return `${label}: no valid PEM block found (expected '-----BEGIN ... PRIVATE KEY-----')`;\n  }\n  if (PEM_PROC_TYPE_ENCRYPTED.test(t) || PEM_DEK_INFO.test(t)) {\n    return `${label}: passphrase-encrypted PEM is not supported (the agent runs unattended)`;\n  }\n  return null;\n}\n\nfunction allowedMetadataKeys(spec: ProviderSpec): Set<string> {\n  const out = new Set<string>();\n  for (const f of spec.fields) {\n    const k = metadataKey(f.path);\n    if (k) out.add(k);\n  }\n  // Mirror the Go-side allow-list of SecretParser-derived metadata keys\n  // so a round-trip read→edit→write doesn't trip the unknown-key check.\n  switch (spec.id) {\n    case 'GCP':\n      out.add('clientEmail');\n      out.add('projectId');\n      break;\n    case 'GITHUB':\n    case 'AZURE_DEVOPS':\n    case 'OPENAI':\n    case 'ANTHROPIC':\n    case 'GEMINI':\n      out.add('tokenPrefix');\n      break;\n    case 'GITLAB':\n      out.add('tokenPrefix');\n      out.add('host'); // derived from endpoint by the parser\n      break;\n  }\n  return out;\n}\n\n// ── Display hints ──────────────────────────────────────────────────────\n//\n// Used for client-side previews when forms are filled in but not yet\n// submitted. The persisted value comes from the server (cached in\n// metadata._displayHint) — this function is a fallback / preview helper.\n\nexport function computeDisplayHint(providerId: string, metadata: Record<string, unknown>): string {\n  const cached = metadata['_displayHint'];\n  if (typeof cached === 'string' && cached) return cached;\n\n  switch (providerId) {\n    case 'AWS':\n    case 'BEDROCK': {\n      const key = str(metadata['accessKeyId']);\n      const region = str(metadata['region']);\n      return shortPrefix(key, 8) + (region ? ` / ${region}` : '');\n    }\n    case 'GCP': {\n      const email = str(metadata['clientEmail']);\n      const proj = str(metadata['projectId']);\n      if (!email && !proj) return '';\n      if (!email) return proj;\n      if (!proj) return email;\n      return `${email} / ${proj}`;\n    }\n    case 'AZURE': {\n      const client = str(metadata['clientId']);\n      const sub = str(metadata['subscriptionId']);\n      const head = shortPrefix(client, 8);\n      return head + (sub ? ` / sub:${shortPrefix(sub, 8)}` : '');\n    }\n    case 'OCI': {\n      const tenancy = str(metadata['tenancyOcid']);\n      const region = str(metadata['region']);\n      const head = shortPrefix(tenancy, 12);\n      return head + (region ? ` / ${region}` : '');\n    }\n    case 'SSH': {\n      const user = str(metadata['user']);\n      const host = str(metadata['host']);\n      const port = metadata['port'];\n      let portStr = '';\n      if (typeof port === 'number' && port > 0 && port !== 22) portStr = `:${port}`;\n      else if (typeof port === 'string' && /^\\d+$/.test(port) && port !== '22') portStr = `:${port}`;\n      if (!user && !host) return '';\n      return `${user}@${host}${portStr}`.replace(/^@/, '');\n    }\n    case 'GITHUB': {\n      const prefix = str(metadata['tokenPrefix']);\n      const org = str(metadata['org']);\n      const head = prefix ? `${prefix}…` : '';\n      return [head, org].filter(Boolean).join(' / ');\n    }\n    case 'GITLAB': {\n      const prefix = str(metadata['tokenPrefix']);\n      const group = str(metadata['group']);\n      let host = str(metadata['host']);\n      if (!host) {\n        const endpoint = str(metadata['endpoint']);\n        host = endpoint ? hostFromURL(endpoint) : 'gitlab.com';\n      }\n      let out = prefix ? `${prefix}…` : '';\n      if (group) out = out ? `${out} / ${group}` : group;\n      if (host && host !== 'gitlab.com') out = out ? `${out} @ ${host}` : host;\n      return out;\n    }\n    case 'AZURE_DEVOPS': {\n      const prefix = str(metadata['tokenPrefix']);\n      const org = str(metadata['organization']);\n      const project = str(metadata['project']);\n      let out = prefix ? `${prefix}…` : '';\n      if (org) {\n        const orgSeg = project ? `${org}/${project}` : org;\n        out = out ? `${out} / ${orgSeg}` : orgSeg;\n      }\n      return out;\n    }\n    case 'OPENAI':\n    case 'ANTHROPIC':\n    case 'GEMINI': {\n      const prefix = str(metadata['tokenPrefix']);\n      return prefix ? `${prefix}…` : '';\n    }\n    case 'SLACK':\n      return str(metadata['channelHint']);\n    case 'TELEGRAM':\n      return str(metadata['chatId']);\n    case 'SMTP': {\n      const from = str(metadata['fromAddress']);\n      const host = str(metadata['host']);\n      return from + (host ? ` @ ${host}` : '');\n    }\n    default:\n      return '';\n  }\n}\n\nfunction str(v: unknown): string {\n  return typeof v === 'string' ? v : '';\n}\n\nfunction shortPrefix(s: string, n: number): string {\n  if (!s) return '';\n  if (s.length <= n) return s;\n  return s.slice(0, n) + '…';\n}\n\nfunction hostFromURL(raw: string): string {\n  let s = raw.trim();\n  const schemeIdx = s.indexOf('://');\n  if (schemeIdx >= 0) s = s.slice(schemeIdx + 3);\n  const cut = s.search(/[/?#]/);\n  if (cut >= 0) s = s.slice(0, cut);\n  return s;\n}\n","// Hierarchical USD budgets. All wire values are USD micros (1 USD = 1_000_000);\n// 0 means \"no cap / inherit from parent\" — never \"free\".\n\nexport type BudgetScope = 'org' | 'workspace' | 'repo' | 'chat';\n\nexport interface OrgBudget {\n  id: string;\n  org_id: string;\n  daily_limit: number; // legacy token caps — NOT enforced; counters below are telemetry only\n  monthly_limit: number;\n  tokens_today: number;\n  tokens_month: number;\n  daily_cost_limit_usd_micros: number;\n  monthly_cost_limit_usd_micros: number;\n  cost_today_usd_micros: number;\n  cost_month_usd_micros: number;\n  chat_session_cost_limit_usd_micros: number;\n  reset_day_at: string;\n  reset_month_at: string;\n  updated_at: string;\n  /** M3 Stage 3: action categories allowed at this scope. `read` is\n   * implicit and never appears here. Lower scopes (workspace, repo,\n   * schedule) intersect with this set. */\n  granted_categories: string[];\n  /** M3 Stage 4: inheritable schedule auto-disable threshold. Null\n   * means \"inherit from parent\"; engine default is 5 when every\n   * level in the chain is null. */\n  max_consecutive_failures?: number;\n}\n\nexport interface ScopedBudget {\n  id: string;\n  org_id: string;\n  workspace_id?: string;\n  repo_id?: string;\n  daily_cost_limit_usd_micros: number;\n  monthly_cost_limit_usd_micros: number;\n  chat_session_cost_limit_usd_micros: number;\n  cost_today_usd_micros: number;\n  cost_month_usd_micros: number;\n  reset_day_at: string;\n  reset_month_at: string;\n  updated_at: string;\n  /** M3 Stage 3: see OrgBudget.granted_categories. Subset of parent. */\n  granted_categories: string[];\n  /** M3 Stage 4: see OrgBudget.max_consecutive_failures. */\n  max_consecutive_failures?: number;\n}\n\nexport interface ChatBudget {\n  id: string;\n  org_id: string;\n  workspace_id: string;\n  repo_id: string;\n  chat_session_id: string;\n  cost_limit_usd_micros: number;\n  cost_total_usd_micros: number;\n  created_by_user_id: string;\n  updated_at: string;\n}\n\nexport interface EffectiveChatBudget {\n  limit_usd_micros: number;\n  source: BudgetScope;\n  spent_usd_micros: number;\n}\n\nexport interface UpdateOrgBudgetRequest {\n  daily_cost_limit_usd_micros?: number;\n  monthly_cost_limit_usd_micros?: number;\n  chat_session_cost_limit_usd_micros?: number;\n  /** M3 Stage 3: replace the action-category grant set. Omit to leave\n   * unchanged; empty array relaxes to read-only. */\n  granted_categories?: string[];\n  /** M3 Stage 4: per-scope schedule auto-disable cap. Omit to leave\n   * unchanged. */\n  max_consecutive_failures?: number;\n}\n\nexport interface UpdateScopedBudgetRequest {\n  daily_cost_limit_usd_micros?: number;\n  monthly_cost_limit_usd_micros?: number;\n  chat_session_cost_limit_usd_micros?: number;\n  /** M3 Stage 3: replace the action-category grant set. Server rejects\n   * (422 grants_outside_parent) when the requested set isn't a subset\n   * of the parent scope's effective grant. */\n  granted_categories?: string[];\n  /** M3 Stage 4: per-scope schedule auto-disable cap. */\n  max_consecutive_failures?: number;\n}\n\nexport interface UpdateChatBudgetRequest {\n  cost_limit_usd_micros: number;\n}\n\nexport interface UpdateCostLimitRequest {\n  cost_limit_usd_micros: number;\n}\n\nexport const usdMicros = {\n  toDollars: (micros: number): number => micros / 1_000_000,\n  fromDollars: (dollars: number): number => Math.round(dollars * 1_000_000),\n};\n","// Dashboard Spec types — TypeScript mirror of the canonical JSON Schema\n//   cloud-agent/internal/chat/dashboardspec/schema/flashback.dashboard.v1.schema.json\n// (copied into this package as ./schema.json). The JSON Schema is the single\n// source of truth (Visual-Dashboards block B1); these types and ./schema.json\n// must stay byte-for-shape in sync with the engine schema when it changes.\n//\n// The Dashboard Spec is the durable, data-free, PII-free recipe the BI agent's\n// compose_dashboard tool emits. Each panel carries a `binding` (a parameterized\n// query against a semantic model) and a `viz` (how to draw the result). Data is\n// transient; the spec is forever.\n\n/** The spec major-version discriminator carried in DashboardSpec.schema. */\nexport const DASHBOARD_SCHEMA_VERSION = 'flashback.dashboard/v1';\n\nexport type PanelType =\n  | 'kpi' | 'gauge' | 'table'\n  | 'bar' | 'line' | 'area' | 'point' | 'arc' | 'rule' | 'tick' | 'rect';\n\n/** Chart marks = the curated, recursion-stripped Vega-Lite subset. */\nexport type ChartMark = 'bar' | 'line' | 'area' | 'point' | 'arc' | 'rule' | 'tick' | 'rect';\n\n/** Semantic color roles (D6) — the spec picks a role, never a raw hex. */\nexport type ColorRole = 'sequential' | 'categorical' | 'diverging' | 'goodBad';\n\nexport type ChannelType = 'nominal' | 'quantitative' | 'temporal' | 'ordinal';\nexport type Aggregate = 'sum' | 'mean' | 'min' | 'max' | 'count' | 'distinct';\nexport type ChannelSort = '-x' | 'x' | '-y' | 'y' | 'ascending' | 'descending' | null;\nexport type ParameterType = 'daterange' | 'dimension' | 'scalar';\nexport type FilterOp = 'eq' | 'in' | 'gt' | 'gte' | 'lt' | 'lte' | 'between';\nexport type SortDir = 'asc' | 'desc';\n/** Rehydration strategy (distinct from B0's piiClass field classification). */\nexport type PIITier = 'none' | 'rehydrate';\n\n/** The whole authored artifact. */\nexport interface DashboardSpec {\n  /** Always DASHBOARD_SCHEMA_VERSION for v1. */\n  schema: typeof DASHBOARD_SCHEMA_VERSION;\n  title: string;\n  description?: string;\n  scope: DashboardScope;\n  /** Dashboard-level controls; bindings reference them by id (cross-filter-ready). */\n  parameters?: Parameter[];\n  /** react-grid-layout-shaped 12-col grid; one entry per panel id. */\n  layout: LayoutItem[];\n  panels: Panel[];\n}\n\nexport interface DashboardScope {\n  repoId: string;\n  /** Default model for any panel binding that omits modelId. */\n  defaultModelId?: string;\n}\n\nexport interface Parameter {\n  id: string;\n  type: ParameterType;\n  label: string;\n  /** Required when type === 'dimension'. A field ref, e.g. \"Branch[Name]\". */\n  field?: string;\n  multi?: boolean;\n  /** Shape depends on type: daterange => {relative}|{from,to}; etc. */\n  default?: unknown;\n}\n\nexport interface LayoutItem {\n  /** Matches a Panel.id. */\n  i: string;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n/** A param-bound filter ({param}) or a literal ({field,op,value}). */\nexport type Filter = ParamFilter | LiteralFilter;\nexport interface ParamFilter { param: string; }\nexport interface LiteralFilter { field: string; op: FilterOp; value: unknown; }\n\nexport interface TopN { by: string; n: number; dir: SortDir; }\n\n/** The durable, data-free, PII-free query. */\nexport interface Binding {\n  modelId?: string;\n  /** Measure refs, e.g. \"[Efficiency %]\". Non-empty. */\n  measures: string[];\n  /** Field refs, e.g. \"Mechanic[MechanicId]\" (PII ids, never names). */\n  dimensions?: string[];\n  filters?: Filter[];\n  /** An entity localKey or \"total\"; B3 checks it ∈ measure.validGrains. */\n  grain: string;\n  topN?: TopN;\n}\n\n/** Last-mile PII re-hydration hook (resolved engine-side by B4). */\nexport interface Display {\n  /** Field ref whose value fills the synthetic __label column. */\n  labelField: string;\n  piiTier?: PIITier;\n}\n\nexport interface ColorScale {\n  scheme: { role: ColorRole };\n  domainMid?: number;\n}\n\nexport interface Channel {\n  /** A measure ref, a field ref, or the synthetic \"__label\". */\n  field: string;\n  type: ChannelType;\n  aggregate?: Aggregate;\n  sort?: ChannelSort;\n  scale?: ColorScale;\n  axis?: { title?: string; format?: string };\n  format?: string;\n}\n\n/** Flat, fixed channel set — no layer/concat/facet (envelope's job) and no transform. */\nexport interface Encoding {\n  x?: Channel;\n  y?: Channel;\n  color?: Channel;\n  size?: Channel;\n  theta?: Channel;\n  row?: Channel;\n  column?: Channel;\n}\n\nexport interface ChartViz { mark: ChartMark; encoding: Encoding; }\nexport interface KpiViz {\n  format: string;\n  delta?: { vs: 'previous_period' | 'prior_year' | 'none' };\n  spark?: boolean;\n}\nexport interface GaugeViz {\n  format: string;\n  min: number;\n  max: number;\n  thresholds?: Array<{ value: number; role: ColorRole }>;\n}\nexport interface TableViz {\n  columns?: Array<{ field: string; label?: string; format?: string; conditional?: boolean }>;\n  sort?: { field: string; dir: SortDir };\n  pageSize?: number;\n}\n\nexport type Viz = ChartViz | KpiViz | GaugeViz | TableViz;\n\n/** Cross-filter reservation (rung 3); runtime is the frontend (B6). */\nexport interface PanelInteraction {\n  emits?: Array<{ param: string; from: 'x' | 'y' | 'color' | 'size' | 'theta' | 'row' | 'column' }>;\n}\n\ninterface PanelBase {\n  id: string;\n  title: string;\n  binding: Binding;\n  display?: Display;\n  interaction?: PanelInteraction;\n}\n\n/** A chart panel: type is one of the curated marks; viz is the VL subset. */\nexport interface ChartPanel extends PanelBase { type: ChartMark; viz: ChartViz; }\nexport interface KpiPanel extends PanelBase { type: 'kpi'; viz: KpiViz; }\nexport interface GaugePanel extends PanelBase { type: 'gauge'; viz: GaugeViz; }\nexport interface TablePanel extends PanelBase { type: 'table'; viz: TableViz; }\n\n/** A panel — discriminated on `type` (mirrors the schema's if/then union). */\nexport type Panel = ChartPanel | KpiPanel | GaugePanel | TablePanel;\n","// Pure, dependency-free pre-validation for a Dashboard Spec — mirrors the cheap,\n// high-value checks the engine validator runs (cloud-agent\n// internal/chat/dashboardspec). This is for fast, friendly UX in the dashboard\n// editor (block B6): fail fast on obvious mistakes before a round-trip. It is\n// deliberately NOT a full JSON-Schema validator — the engine (santhosh-tekuri\n// against ./schema.json) is the authoritative safety net. Keep it consistent\n// with providers.ts's pure-validate philosophy.\n\nimport { DASHBOARD_SCHEMA_VERSION, type DashboardSpec, type PanelType } from './types.js';\n\n/** One structural problem, shaped like the engine's SpecError. */\nexport interface SpecError {\n  /** JSON-pointer-ish path into the spec, e.g. \"/panels/0/binding\". */\n  path: string;\n  /** Short failing-rule tag, e.g. \"required\", \"enum\", \"integrity.layout\". */\n  keyword: string;\n  message: string;\n}\n\nexport interface ValidateResult {\n  ok: boolean;\n  errors: SpecError[];\n}\n\nconst PANEL_TYPES: ReadonlySet<string> = new Set<PanelType>([\n  'kpi', 'gauge', 'table', 'bar', 'line', 'area', 'point', 'arc', 'rule', 'tick', 'rect',\n]);\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n  return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction nonEmptyString(v: unknown): v is string {\n  return typeof v === 'string' && v.length > 0;\n}\n\n/**\n * Validates the envelope + cross-reference integrity of a candidate spec. Returns\n * `{ ok, errors }`; `ok` is true only when `errors` is empty. Never throws.\n */\nexport function validateDashboardSpec(input: unknown): ValidateResult {\n  const errors: SpecError[] = [];\n  const push = (path: string, keyword: string, message: string) => errors.push({ path, keyword, message });\n\n  if (!isObject(input)) {\n    return { ok: false, errors: [{ path: '', keyword: 'type', message: 'spec must be a JSON object' }] };\n  }\n\n  if (input.schema !== DASHBOARD_SCHEMA_VERSION) {\n    push('/schema', 'const', `schema must be \"${DASHBOARD_SCHEMA_VERSION}\"`);\n  }\n  if (!nonEmptyString(input.title)) {\n    push('/title', 'required', 'title is required and must be a non-empty string');\n  }\n  if (!isObject(input.scope) || !nonEmptyString(input.scope.repoId)) {\n    push('/scope', 'required', 'scope.repoId is required');\n  }\n\n  const layout = Array.isArray(input.layout) ? input.layout : [];\n  if (layout.length === 0) {\n    push('/layout', 'minItems', 'layout must have at least one entry');\n  }\n  const panels = Array.isArray(input.panels) ? input.panels : [];\n  if (panels.length === 0) {\n    push('/panels', 'minItems', 'panels must have at least one panel');\n  }\n\n  // Per-panel envelope checks.\n  const panelIds = new Map<string, number>();\n  panels.forEach((p, i) => {\n    if (!isObject(p)) {\n      push(`/panels/${i}`, 'type', 'panel must be an object');\n      return;\n    }\n    if (!nonEmptyString(p.id)) {\n      push(`/panels/${i}/id`, 'required', 'panel id is required');\n    } else {\n      if (panelIds.has(p.id)) push(`/panels/${i}/id`, 'integrity.duplicateId', `duplicate panel id \"${p.id}\"`);\n      panelIds.set(p.id, i);\n    }\n    if (typeof p.type !== 'string' || !PANEL_TYPES.has(p.type)) {\n      push(`/panels/${i}/type`, 'enum', `panel type \"${String(p.type)}\" is not a known type`);\n    }\n    if (!nonEmptyString(p.title)) push(`/panels/${i}/title`, 'required', 'panel title is required');\n    if (!isObject(p.viz)) push(`/panels/${i}/viz`, 'required', 'panel viz is required');\n\n    const b = p.binding;\n    if (!isObject(b)) {\n      push(`/panels/${i}/binding`, 'required', 'panel binding is required');\n    } else {\n      if (!Array.isArray(b.measures) || b.measures.length === 0) {\n        push(`/panels/${i}/binding/measures`, 'minItems', 'binding.measures must be a non-empty array');\n      }\n      if (!nonEmptyString(b.grain)) {\n        push(`/panels/${i}/binding/grain`, 'required', 'binding.grain is required (an entity localKey or \"total\")');\n      }\n    }\n  });\n\n  // Integrity 1: id <-> layout 1:1.\n  const layoutIds = new Map<string, number>();\n  layout.forEach((l, i) => {\n    if (!isObject(l) || !nonEmptyString(l.i)) {\n      push(`/layout/${i}/i`, 'required', 'layout entry needs a string id \"i\"');\n      return;\n    }\n    if (layoutIds.has(l.i)) push(`/layout/${i}/i`, 'integrity.duplicateLayout', `duplicate layout entry for id \"${l.i}\"`);\n    layoutIds.set(l.i, i);\n    if (!panelIds.has(l.i)) push(`/layout/${i}/i`, 'integrity.layout', `layout references id \"${l.i}\" with no matching panel`);\n  });\n  for (const [id, i] of panelIds) {\n    if (!layoutIds.has(id)) push(`/panels/${i}`, 'integrity.layout', `panel \"${id}\" has no layout entry`);\n  }\n\n  // Integrity 2: param references resolve.\n  const paramIds = new Set<string>();\n  if (Array.isArray(input.parameters)) {\n    for (const p of input.parameters) {\n      if (isObject(p) && nonEmptyString(p.id)) paramIds.add(p.id);\n    }\n  }\n  panels.forEach((p, pi) => {\n    if (!isObject(p)) return;\n    const b = isObject(p.binding) ? p.binding : undefined;\n    const filters = b && Array.isArray(b.filters) ? b.filters : [];\n    filters.forEach((f, fi) => {\n      if (isObject(f) && typeof f.param === 'string' && f.param.length > 0 && !paramIds.has(f.param)) {\n        push(`/panels/${pi}/binding/filters/${fi}/param`, 'integrity.paramRef', `filter references undeclared parameter \"${f.param}\"`);\n      }\n    });\n    const inter = isObject(p.interaction) ? p.interaction : undefined;\n    const emits = inter && Array.isArray(inter.emits) ? inter.emits : [];\n    emits.forEach((e, ei) => {\n      if (isObject(e) && typeof e.param === 'string' && e.param.length > 0 && !paramIds.has(e.param)) {\n        push(`/panels/${pi}/interaction/emits/${ei}/param`, 'integrity.paramRef', `interaction emits undeclared parameter \"${e.param}\"`);\n      }\n    });\n  });\n\n  return { ok: errors.length === 0, errors };\n}\n\n/** Convenience type guard: true when `input` passes pre-validation. */\nexport function isDashboardSpec(input: unknown): input is DashboardSpec {\n  return validateDashboardSpec(input).ok;\n}\n","{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://flashback.tech/schemas/dashboard/v1\",\n  \"title\": \"Flashback Dashboard Spec v1\",\n  \"description\": \"The durable, data-free, PII-free Dashboard Spec authored by the BI agent's compose_dashboard tool. Each panel carries a binding (a parameterized query against a semantic model) and a viz (how to draw the result). Data is transient; this spec is forever. Flat and recursion-free by construction so it is safe as a structured-output target and as a validation target (Visual-Dashboards design D1=B / D2=C).\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\"schema\", \"title\", \"scope\", \"layout\", \"panels\"],\n  \"properties\": {\n    \"schema\": {\n      \"description\": \"Spec major-version discriminator. The validator binds to the major it embeds; forward/back compatibility is handled by upgraders-on-read, not by lax schemas (O7).\",\n      \"const\": \"flashback.dashboard/v1\"\n    },\n    \"title\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 200 },\n    \"description\": { \"type\": \"string\", \"maxLength\": 1000 },\n    \"scope\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"repoId\"],\n      \"properties\": {\n        \"repoId\": { \"type\": \"string\", \"minLength\": 1 },\n        \"defaultModelId\": {\n          \"description\": \"Model used by any panel binding that omits modelId. Panels may bind different models (O3); a single panel is one model (no cross-model join).\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"parameters\": {\n      \"description\": \"Dashboard-level interactive controls. binding.filters reference these by id, so one control re-filters every panel and re-population just re-reads them. Locked cross-filter-ready now; rung-2 (global controls) ships early.\",\n      \"type\": \"array\",\n      \"maxItems\": 24,\n      \"items\": { \"$ref\": \"#/$defs/parameter\" }\n    },\n    \"layout\": {\n      \"description\": \"react-grid-layout-shaped, 12-column grid. Persisted verbatim; user-editable. Every item.i must match a panels[].id (enforced by the Go integrity check, not the schema).\",\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 64,\n      \"items\": { \"$ref\": \"#/$defs/layoutItem\" }\n    },\n    \"panels\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 64,\n      \"items\": { \"$ref\": \"#/$defs/panel\" }\n    }\n  },\n\n  \"$defs\": {\n    \"measureRef\": {\n      \"description\": \"A measure reference, e.g. \\\"[Efficiency %]\\\". The bracketed measure name; existence is B3's catalog bind-check, not structural.\",\n      \"type\": \"string\",\n      \"pattern\": \"^\\\\[.+\\\\]$\"\n    },\n    \"fieldRef\": {\n      \"description\": \"A field/dimension reference in DAX style, e.g. \\\"Mechanic[MechanicId]\\\". Entity = entity localKey (table name); Column = field column name. The synthetic \\\"__label\\\" (filled engine-side by B4) is also a legal viz field but is NOT a binding fieldRef.\",\n      \"type\": \"string\",\n      \"pattern\": \"^.+\\\\[.+\\\\]$\"\n    },\n\n    \"parameter\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"id\", \"type\", \"label\"],\n      \"properties\": {\n        \"id\": { \"type\": \"string\", \"minLength\": 1 },\n        \"type\": { \"enum\": [\"daterange\", \"dimension\", \"scalar\"] },\n        \"label\": { \"type\": \"string\", \"minLength\": 1 },\n        \"field\": { \"$ref\": \"#/$defs/fieldRef\" },\n        \"multi\": { \"type\": \"boolean\" },\n        \"default\": {\n          \"description\": \"Default control value. Shape depends on type: daterange => {relative} or {from,to}; dimension => null | string | array; scalar => a literal. Left unconstrained on purpose.\"\n        }\n      },\n      \"allOf\": [\n        {\n          \"if\": { \"properties\": { \"type\": { \"const\": \"dimension\" } }, \"required\": [\"type\"] },\n          \"then\": { \"required\": [\"field\"] }\n        }\n      ]\n    },\n\n    \"layoutItem\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"i\", \"x\", \"y\", \"w\", \"h\"],\n      \"properties\": {\n        \"i\": { \"type\": \"string\", \"minLength\": 1 },\n        \"x\": { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 11 },\n        \"y\": { \"type\": \"integer\", \"minimum\": 0 },\n        \"w\": { \"type\": \"integer\", \"minimum\": 1, \"maximum\": 12 },\n        \"h\": { \"type\": \"integer\", \"minimum\": 1, \"maximum\": 64 }\n      }\n    },\n\n    \"filter\": {\n      \"oneOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"param\"],\n          \"properties\": { \"param\": { \"type\": \"string\", \"minLength\": 1 } }\n        },\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"field\", \"op\", \"value\"],\n          \"properties\": {\n            \"field\": { \"$ref\": \"#/$defs/fieldRef\" },\n            \"op\": { \"enum\": [\"eq\", \"in\", \"gt\", \"gte\", \"lt\", \"lte\", \"between\"] },\n            \"value\": {\n              \"description\": \"Literal filter value. NOTE: a literal filter on a PII field is rejected by B4/B3 bind-check, not structurally.\"\n            }\n          }\n        }\n      ]\n    },\n\n    \"topN\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"by\", \"n\", \"dir\"],\n      \"properties\": {\n        \"by\": { \"$ref\": \"#/$defs/measureRef\" },\n        \"n\": { \"type\": \"integer\", \"minimum\": 1, \"maximum\": 10000 },\n        \"dir\": { \"enum\": [\"asc\", \"desc\"] }\n      }\n    },\n\n    \"binding\": {\n      \"description\": \"The durable, data-free, PII-free query. Shape only — DAX compilation (B2) and catalog bind-check (B3: existence, grain in validGrains, cardinality != 'empty', PII labelField) are downstream.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"measures\", \"grain\"],\n      \"properties\": {\n        \"modelId\": { \"type\": \"string\" },\n        \"measures\": { \"type\": \"array\", \"minItems\": 1, \"items\": { \"$ref\": \"#/$defs/measureRef\" } },\n        \"dimensions\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/fieldRef\" } },\n        \"filters\": { \"type\": \"array\", \"items\": { \"$ref\": \"#/$defs/filter\" } },\n        \"grain\": {\n          \"description\": \"The grouping grain: an entity localKey or the literal \\\"total\\\". B3 checks grain is in the measure's validGrains (itself a list of localKeys + \\\"total\\\"). Grain is validated ONCE at authoring and trusted on every refresh (the runtime verifier ignores grain).\",\n          \"type\": \"string\",\n          \"minLength\": 1\n        },\n        \"topN\": { \"$ref\": \"#/$defs/topN\" }\n      }\n    },\n\n    \"display\": {\n      \"description\": \"The reserved last-mile PII re-hydration hook. B4 implements the two-query trick: it fills the synthetic __label column from labelField after the LLM is out of the loop. piiTier (a rehydration strategy) is distinct from B0's piiClass (a field classification).\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"labelField\"],\n      \"properties\": {\n        \"labelField\": { \"$ref\": \"#/$defs/fieldRef\" },\n        \"piiTier\": { \"enum\": [\"none\", \"rehydrate\"] }\n      }\n    },\n\n    \"colorScale\": {\n      \"description\": \"Semantic color contract (D6): the spec picks a role, never a raw hex or vendor palette. B6's theme module maps each role to an indigo-derived palette from the theme tokens (light + dark).\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"scheme\"],\n      \"properties\": {\n        \"scheme\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"role\"],\n          \"properties\": { \"role\": { \"enum\": [\"sequential\", \"categorical\", \"diverging\", \"goodBad\"] } }\n        },\n        \"domainMid\": { \"type\": \"number\" }\n      }\n    },\n\n    \"channel\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"field\", \"type\"],\n      \"properties\": {\n        \"field\": {\n          \"description\": \"A measureRef, a fieldRef, or the synthetic \\\"__label\\\".\",\n          \"type\": \"string\",\n          \"minLength\": 1\n        },\n        \"type\": { \"enum\": [\"nominal\", \"quantitative\", \"temporal\", \"ordinal\"] },\n        \"aggregate\": { \"enum\": [\"sum\", \"mean\", \"min\", \"max\", \"count\", \"distinct\"] },\n        \"sort\": {\n          \"anyOf\": [\n            { \"enum\": [\"-x\", \"x\", \"-y\", \"y\", \"ascending\", \"descending\"] },\n            { \"type\": \"null\" }\n          ]\n        },\n        \"scale\": { \"$ref\": \"#/$defs/colorScale\" },\n        \"axis\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"properties\": {\n            \"title\": { \"type\": \"string\" },\n            \"format\": { \"type\": \"string\" }\n          }\n        },\n        \"format\": { \"type\": \"string\" }\n      }\n    },\n\n    \"encoding\": {\n      \"description\": \"Flat, fixed channel set. No layer/concat/facet/repeat (multi-view is the envelope's job via panels[]+layout[]) and no transform/condition/expression (anything computed is precomputed by the binding). This flatness is what removes Vega-Lite's recursion.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"x\": { \"$ref\": \"#/$defs/channel\" },\n        \"y\": { \"$ref\": \"#/$defs/channel\" },\n        \"color\": { \"$ref\": \"#/$defs/channel\" },\n        \"size\": { \"$ref\": \"#/$defs/channel\" },\n        \"theta\": { \"$ref\": \"#/$defs/channel\" },\n        \"row\": { \"$ref\": \"#/$defs/channel\" },\n        \"column\": { \"$ref\": \"#/$defs/channel\" }\n      }\n    },\n\n    \"chartViz\": {\n      \"description\": \"The curated, recursion-stripped Vega-Lite subset for chart panels.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"mark\", \"encoding\"],\n      \"properties\": {\n        \"mark\": { \"enum\": [\"bar\", \"line\", \"area\", \"point\", \"arc\", \"rule\", \"tick\", \"rect\"] },\n        \"encoding\": { \"$ref\": \"#/$defs/encoding\" }\n      }\n    },\n\n    \"kpiViz\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"format\"],\n      \"properties\": {\n        \"format\": { \"type\": \"string\", \"minLength\": 1 },\n        \"delta\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"vs\"],\n          \"properties\": { \"vs\": { \"enum\": [\"previous_period\", \"prior_year\", \"none\"] } }\n        },\n        \"spark\": { \"type\": \"boolean\" }\n      }\n    },\n\n    \"gaugeViz\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"format\", \"min\", \"max\"],\n      \"properties\": {\n        \"format\": { \"type\": \"string\", \"minLength\": 1 },\n        \"min\": { \"type\": \"number\" },\n        \"max\": { \"type\": \"number\" },\n        \"thresholds\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"required\": [\"value\", \"role\"],\n            \"properties\": {\n              \"value\": { \"type\": \"number\" },\n              \"role\": { \"enum\": [\"sequential\", \"categorical\", \"diverging\", \"goodBad\"] }\n            }\n          }\n        }\n      }\n    },\n\n    \"tableViz\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"columns\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"required\": [\"field\"],\n            \"properties\": {\n              \"field\": { \"type\": \"string\", \"minLength\": 1 },\n              \"label\": { \"type\": \"string\" },\n              \"format\": { \"type\": \"string\" },\n              \"conditional\": { \"type\": \"boolean\" }\n            }\n          }\n        },\n        \"sort\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"field\", \"dir\"],\n          \"properties\": {\n            \"field\": { \"type\": \"string\", \"minLength\": 1 },\n            \"dir\": { \"enum\": [\"asc\", \"desc\"] }\n          }\n        },\n        \"pageSize\": { \"type\": \"integer\", \"minimum\": 1, \"maximum\": 1000 }\n      }\n    },\n\n    \"interaction\": {\n      \"description\": \"Cross-filter reservation (interactivity rung 3). Reserved in the schema for forward-compat; the runtime (a click writes a param) is B6, not B1.\",\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"emits\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"required\": [\"param\", \"from\"],\n            \"properties\": {\n              \"param\": { \"type\": \"string\", \"minLength\": 1 },\n              \"from\": { \"enum\": [\"x\", \"y\", \"color\", \"size\", \"theta\", \"row\", \"column\"] }\n            }\n          }\n        }\n      }\n    },\n\n    \"panel\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"id\", \"type\", \"title\", \"binding\", \"viz\"],\n      \"properties\": {\n        \"id\": { \"type\": \"string\", \"minLength\": 1 },\n        \"type\": { \"enum\": [\"kpi\", \"gauge\", \"table\", \"bar\", \"line\", \"area\", \"point\", \"arc\", \"rule\", \"tick\", \"rect\"] },\n        \"title\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 200 },\n        \"binding\": { \"$ref\": \"#/$defs/binding\" },\n        \"display\": { \"$ref\": \"#/$defs/display\" },\n        \"viz\": { \"type\": \"object\" },\n        \"interaction\": { \"$ref\": \"#/$defs/interaction\" }\n      },\n      \"allOf\": [\n        {\n          \"if\": { \"properties\": { \"type\": { \"const\": \"kpi\" } }, \"required\": [\"type\"] },\n          \"then\": { \"properties\": { \"viz\": { \"$ref\": \"#/$defs/kpiViz\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"type\": { \"const\": \"gauge\" } }, \"required\": [\"type\"] },\n          \"then\": { \"properties\": { \"viz\": { \"$ref\": \"#/$defs/gaugeViz\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"type\": { \"const\": \"table\" } }, \"required\": [\"type\"] },\n          \"then\": { \"properties\": { \"viz\": { \"$ref\": \"#/$defs/tableViz\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"type\": { \"enum\": [\"bar\", \"line\", \"area\", \"point\", \"arc\", \"rule\", \"tick\", \"rect\"] } },\n            \"required\": [\"type\"]\n          },\n          \"then\": { \"properties\": { \"viz\": { \"$ref\": \"#/$defs/chartViz\" } } }\n        }\n      ]\n    }\n  }\n}\n","// The canonical Dashboard Spec JSON Schema, exposed as an importable object\n// (Visual-Dashboards block B1). The single source of truth is the engine file\n//   cloud-agent/internal/chat/dashboardspec/schema/flashback.dashboard.v1.schema.json\n// mirrored into this package as ./schema.json (byte-identical). esbuild inlines\n// this JSON import into the published bundle, so consumers get the schema as a\n// plain object — feed it straight to a JSON-Schema validator (e.g. ajv) for full\n// client-side spec validation, with no asset loading or fetch.\n//\n// Note: validate.ts is the cheap, dependency-free pre-check; DASHBOARD_SCHEMA is\n// here for callers that want full-fidelity validation against the exact engine\n// schema. Both ultimately defer to the engine validator as the safety net.\nimport schemaJson from './schema.json';\n\n/** The flashback.dashboard/v1 JSON Schema (Draft 2020-12). ajv-ready. */\nexport const DASHBOARD_SCHEMA: Readonly<Record<string, unknown>> = schemaJson as Record<string, unknown>;\n"]}