diff --git a/src/client.ts b/src/client.ts index abf9129..da2242f 100644 --- a/src/client.ts +++ b/src/client.ts @@ -2,10 +2,13 @@ import type { ElydoraClientConfig, CreateOperationParams, EOR, + IntegrationType, RegisterAgentRequest, RegisterAgentResponse, GetAgentResponse, ListAgentsResponse, + UpdateAgentResponse, + FreezeAgentResponse, UnfreezeAgentResponse, DeleteAgentResponse, SubmitOperationResponse, @@ -24,6 +27,11 @@ import type { RotateApiTokenResponse, JWKSResponse, HealthResponse, + DeepHealthResponse, + ListWebhooksResponse, + RegisterWebhookResponse, + ListMembersResponse, + ListAdminEventsResponse, AuthRegisterResponse, AuthLoginResponse, ErrorResponse, @@ -90,6 +98,9 @@ export class ElydoraClient { // Auth (static methods — no instance needed) // ------------------------------------------------------------------------- + /** + * @deprecated Use Better Auth endpoints directly. See docs. + */ static async register( baseUrl: string, email: string, @@ -111,6 +122,9 @@ export class ElydoraClient { return handleResponse(res); } + /** + * @deprecated Use Better Auth endpoints directly. See docs. + */ static async login( baseUrl: string, email: string, @@ -154,8 +168,12 @@ export class ElydoraClient { return this.request('GET', `/v1/agents/${encodeURIComponent(agentId)}`); } - async freezeAgent(agentId: string, reason: string): Promise { - await this.request('POST', `/v1/agents/${encodeURIComponent(agentId)}/freeze`, { reason }); + async updateAgent(agentId: string, integType: IntegrationType): Promise { + return this.request('PATCH', `/v1/agents/${encodeURIComponent(agentId)}`, { integration_type: integType }); + } + + async freezeAgent(agentId: string, reason: string): Promise { + return this.request('POST', `/v1/agents/${encodeURIComponent(agentId)}/freeze`, { reason }); } async listAgents(): Promise { @@ -328,6 +346,45 @@ export class ElydoraClient { return handleResponse(res); } + async deepHealth(): Promise { + const url = `${this.baseUrl}/v1/health/deep`; + const res = await fetch(url, { method: 'GET', headers: { 'Accept': 'application/json' } }); + return handleResponse(res); + } + + // ------------------------------------------------------------------------- + // Webhooks + // ------------------------------------------------------------------------- + + async listWebhooks(): Promise { + return this.request('GET', '/v1/webhooks'); + } + + async registerWebhook(endpointUrl: string, events: string[], secret: string): Promise { + return this.request('POST', '/v1/webhooks', { endpoint_url: endpointUrl, events, secret }); + } + + async deleteWebhook(webhookId: string): Promise { + await this.request('DELETE', `/v1/webhooks/${encodeURIComponent(webhookId)}`); + } + + // ------------------------------------------------------------------------- + // Members + // ------------------------------------------------------------------------- + + async listMembers(): Promise { + return this.request('GET', '/v1/members'); + } + + // ------------------------------------------------------------------------- + // Admin events + // ------------------------------------------------------------------------- + + async listAdminEvents(limit?: number): Promise { + const query = limit ? `?limit=${limit}` : ''; + return this.request('GET', `/v1/admin/events${query}`); + } + // ------------------------------------------------------------------------- // Internal HTTP helpers // ------------------------------------------------------------------------- diff --git a/src/index.ts b/src/index.ts index cc56bf8..6c209a6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,6 +24,8 @@ export type { KeyStatus, ExportStatus, RbacRole, + IntegrationType, + AdminAction, ErrorCode, // Entities @@ -33,6 +35,8 @@ export type { Receipt, Epoch, Organization, + AdminEvent, + AgentAssignment, User, Export, @@ -47,6 +51,9 @@ export type { RegisterAgentResponse, GetAgentResponse, ListAgentsResponse, + UpdateAgentRequest, + UpdateAgentResponse, + FreezeAgentResponse, UnfreezeAgentResponse, DeleteAgentResponse, SubmitOperationResponse, @@ -66,6 +73,11 @@ export type { JWK, JWKSResponse, HealthResponse, + DeepHealthResponse, + ListWebhooksResponse, + RegisterWebhookResponse, + ListMembersResponse, + ListAdminEventsResponse, AuthRegisterResponse, AuthLoginResponse, ErrorResponse, diff --git a/src/types.ts b/src/types.ts index 4f7b5fa..cc66d0d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -11,6 +11,16 @@ export type RbacRole = | 'compliance_auditor' | 'readonly_investigator' | 'integration_engineer'; +export type IntegrationType = + | 'claudecode' | 'cursor' | 'gemini' | 'kirocli' | 'kiroide' + | 'opencode' | 'copilot' | 'letta' | 'codex' | 'kimi' + | 'enterprise' | 'gui' | 'sdk' | 'other'; +export type AdminAction = + | 'agent.register' | 'agent.update' | 'agent.freeze' | 'agent.unfreeze' + | 'agent.revoke' | 'agent.delete' | 'key.revoke' | 'export.create' + | 'org.create' | 'org.update' + | 'member.invite' | 'member.remove' | 'member.role_change' + | 'agent.assign' | 'agent.unassign'; export type ErrorCode = | 'INVALID_SIGNATURE' | 'UNKNOWN_AGENT' @@ -36,6 +46,7 @@ export interface Agent { readonly org_id: string; readonly display_name: string; readonly responsible_entity: string; + readonly integration_type: IntegrationType; readonly status: AgentStatus; readonly created_at: number; readonly updated_at: number; @@ -92,10 +103,32 @@ export interface Epoch { export interface Organization { readonly org_id: string; readonly name: string; + readonly description: string; + readonly ba_org_id: string | null; readonly created_at: number; readonly updated_at: number; } +export interface AdminEvent { + readonly event_id: string; + readonly org_id: string; + readonly actor: string; + readonly action: string; + readonly target_type: string; + readonly target_id: string; + readonly details: string | null; + readonly created_at: number; +} + +export interface AgentAssignment { + readonly id: string; + readonly agent_id: string; + readonly user_id: string; + readonly org_id: string; + readonly assigned_by: string; + readonly created_at: number; +} + export interface User { readonly user_id: string; readonly org_id: string; @@ -219,6 +252,8 @@ export interface GetEpochResponse { readonly epoch: Epoch; readonly anchor?: { readonly tsa_token?: string; + readonly tsa_url?: string; + readonly anchored_at?: number; }; } @@ -251,14 +286,66 @@ export interface ListAgentsResponse { readonly agents: Agent[]; } +export interface UpdateAgentRequest { + readonly integration_type: IntegrationType; +} + +export interface UpdateAgentResponse { + readonly agent: Agent; +} + +export interface FreezeAgentResponse { + readonly agent: Agent; + readonly previous_status: AgentStatus; +} + export interface UnfreezeAgentResponse { readonly agent: Agent; + readonly previous_status: AgentStatus; } export interface DeleteAgentResponse { readonly deleted: boolean; } +export interface ListWebhooksResponse { + readonly webhooks: unknown[]; +} + +export interface RegisterWebhookResponse { + readonly webhook_id: string; + readonly endpoint_url: string; + readonly events: string[]; + readonly created_at: number; +} + +export interface ListMembersResponse { + readonly members: { + readonly member_id: string; + readonly user_id: string; + readonly role: string; + readonly joined_at: string; + readonly email: string; + readonly display_name: string; + }[]; +} + +export interface ListAdminEventsResponse { + readonly events: AdminEvent[]; +} + +export interface DeepHealthResponse { + readonly status: 'healthy' | 'degraded'; + readonly version: string; + readonly protocol_version: string; + readonly timestamp: number; + readonly dependencies: { + readonly d1: { status: 'ok' | 'failed'; latency_ms: number; error?: string }; + readonly r2: { status: 'ok' | 'failed'; latency_ms: number; error?: string }; + readonly kv: { status: 'ok' | 'failed'; latency_ms: number; error?: string }; + }; +} + export interface GetMeResponse { readonly user: User; }