mitra-interactions-sdk 1.0.60-beta.23 → 1.0.60-beta.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -244,123 +244,130 @@ const result2 = await listRecordsMitra({
244
244
  });
245
245
  ```
246
246
 
247
- ## Agent Chat (embedded)
247
+ ## Agent Chat (copilot)
248
248
 
249
- Chat com o agente de IA embarcado, sobre um WebSocket compartilhado. Uma única conexão atende todas as sessions — o roteamento de eventos é feito por `taskId`.
249
+ Chat com o agente de IA embarcado. **REST-first**: credenciais e modelos vão pela **BFF no `baseURL` normal** (`/agentAiShortcut/*` — herdam `fetchWithRefresh` e CORS); chats e histórico via `{origin}/copilot/api/v1`. **Só o prompt é streaming** — um WebSocket por task em `wss://{origin}/copilot/ws/tasks/{taskId}?token=JWT`, aberto pela SDK quando a conversa começa (WS não passa por preflight de CORS).
250
250
 
251
- A URL do WebSocket é derivada da `baseURL` configurada: mesmo domínio/path, protocolo `http(s)` → `ws(s)`, endpoint `/sdk-ws`. Ex.: `baseURL: 'https://stg.mitralab.io/legacy'` → `wss://stg.mitralab.io/legacy/sdk-ws`. Precisa de `token` configurado (faça login antes ou passe em `configureSdkMitra`).
251
+ Precisa de `token` e `baseURL` configurados (o login já deixa pronto). O transporte do prompt aceita `transport: 'ws' | 'http'` — `'ws'` é o default; `'http'` é reservado pra ambientes serverless e hoje lança erro claro (o backend ainda não expõe prompt por HTTP).
252
252
 
253
253
  ### Gerenciar os chats — `manageAgentChatMitra`
254
254
 
255
- Operações stateless sobre a coleção de chats do usuário: listar, renomear, deletar.
255
+ Tudo HTTP: listar (com filtros), renomear e deletar (= arquivar).
256
256
 
257
257
  ```typescript
258
258
  import { manageAgentChatMitra } from 'mitra-interactions-sdk';
259
259
 
260
- const chats = await manageAgentChatMitra({ action: 'list' }); // AgentChat[]
261
- const renamed = await manageAgentChatMitra({ action: 'rename', taskId, name: 'Novo nome' });
262
- const deleted = await manageAgentChatMitra({ action: 'delete', taskId });
260
+ const chats = await manageAgentChatMitra({ action: 'list' }); // AgentChat[]
261
+ const doAgente = await manageAgentChatMitra({ action: 'list', agentId: 'uuid-do-agente' }); // só os chats de um agente business
262
+ const busca = await manageAgentChatMitra({ action: 'list', search: 'vendas', page: 0, size: 20 });
263
+ const renamed = await manageAgentChatMitra({ action: 'rename', taskId, name: 'Novo nome' });
264
+ const deleted = await manageAgentChatMitra({ action: 'delete', taskId }); // arquiva (some da lista default)
263
265
  ```
264
266
 
265
- - `action: 'list'` → `AgentChat[]` — `{ id, name, agentType?, provider?, createdAt, updatedAt }`. Aceita `projectId?` pra sobrescrever o global e `agentId?` pra filtrar os chats de um agente business (omitido = todos).
266
- - `action: 'rename'` → `{ taskId, name }`
267
- - `action: 'delete'` → `{ taskId, deleted }`
267
+ - `action: 'list'` → `AgentChat[]` — `{ id, name, agentType, agentId, archived, createdAt, updatedAt }`. Filtros: `agentId?`, `archived?`, `search?`, `page?`, `size?`.
268
+ - `action: 'rename'` → `{ taskId, name }` (PATCH `/tasks/{id}`)
269
+ - `action: 'delete'` → `{ taskId, deleted }` (PATCH `/tasks/{id}/archive` — o histórico não é destruído)
268
270
 
269
271
  ### Abrir uma session — `getAgentTaskMitra`
270
272
 
271
- Retorna uma `AgentTaskSession` que encapsula todo o ciclo de vida de um chat (histórico, streaming, fila, cancel, eventos). Abrir a mesma `taskId` duas vezes devolve a **mesma** instância (cache).
273
+ Retorna uma `AgentTaskSession` que encapsula o ciclo de vida do chat. A task é criada via REST (`POST /tasks`) no primeiro `send()`; o WS da task conecta em seguida. Abrir a mesma `taskId` duas vezes devolve a **mesma** instância (cache).
272
274
 
273
275
  ```typescript
274
276
  import { getAgentTaskMitra } from 'mitra-interactions-sdk';
275
277
 
276
- // Chat novo — taskId é preenchido depois do primeiro send()
277
- const session = getAgentTaskMitra({ create: true, agentType: 'claudecode', modelId: 'openai/gpt-5.5:medium' });
278
+ // Chat novo — taskId é preenchido no primeiro send() (evento taskCreated)
279
+ const session = getAgentTaskMitra({ create: true, agentType: 'ANTHROPIC_CLAUDE_OPUS', name: 'Meu chat' });
278
280
 
279
- // Chat existente — detecta automaticamente se já há stream ativo
280
- const existing = getAgentTaskMitra({ taskId: 'abc123' });
281
+ // Chat com um agente business (system prompt + SFs do agente; token escopado)
282
+ const sales = getAgentTaskMitra({ create: true, agentId: 'uuid-do-agente' });
283
+
284
+ // Chat existente
285
+ const existing = getAgentTaskMitra({ taskId: 'uuid-da-task' });
281
286
  await existing.loadHistory({ limit: 50 });
282
287
  ```
283
288
 
284
- `getAgentTaskMitra({ create: true, projectId?, agentType?, modelId?, name?, agentId? })` ou `getAgentTaskMitra({ taskId })`.
285
-
286
- **Agente business (`agentId`)**: passe o `id` de um agente business (CRUD via `mitra-sdk`: `listAgentsMitra` e família) pra sessão subir com o system prompt do agente e um token escopado — as tools enxergam só as Server Functions daquele agente. Sem `agentId`, é o chat de desenvolvimento de sempre.
289
+ `getAgentTaskMitra({ create: true, agentType?, name?, agentId?, transport? })` ou `getAgentTaskMitra({ taskId, transport? })`.
287
290
 
288
- ```typescript
289
- // Chat com um agente business (prompt + SFs do agente)
290
- const sales = getAgentTaskMitra({ create: true, agentId: 'uuid-do-agente' });
291
- ```
291
+ - `agentType` vem de `manageAgentCredentialMitra({ action: 'list_models' })` — ex.: `'ANTHROPIC_CLAUDE_OPUS'`, `'OPENAI_GPT5'`, `'GOOGLE_GEMINI_PRO'`. Default: `'ANTHROPIC_CLAUDE_OPUS'`.
292
+ - **`agentId`**: id de um agente business (CRUD via `mitra-sdk`: `listAgentsMitra` e família). A sessão sobe com o system prompt do agente e um token escopado — as tools enxergam só as Server Functions dele. Sem `agentId`, é o chat de desenvolvimento.
292
293
 
293
294
  #### Propriedades (somente leitura)
294
295
 
295
296
  | Propriedade | Tipo | Descrição |
296
297
  |-------------|------|-----------|
297
298
  | `taskId` | `string \| null` | `null` até o primeiro `send()` num chat novo |
298
- | `task` | `AgentChat \| null` | Metadados do chat após criado |
299
+ | `task` | `AgentChat \| null` | Metadados do chat |
299
300
  | `isNew` | `boolean` | Se foi aberto via `{ create: true }` |
300
301
  | `status` | `AgentTaskStatus` | `opening` · `idle` · `streaming` · `cancelled` · `error` · `closed` |
301
- | `history` | `AgentMessage[]` | Histórico carregado |
302
+ | `history` | `AgentMessage[]` | Histórico carregado (`{ id, sender, type, content, createdAt }`) |
302
303
  | `content` | `string` | Conteúdo acumulado do turno atual |
303
304
  | `queue` | `QueuedItem[]` | Mensagens enfileiradas (enviadas enquanto streamava) |
304
305
 
305
306
  #### Métodos
306
307
 
307
- - `send(prompt, options?)` → `void` — dispara um turno. Se já está streamando, **enfileira** (FIFO, máx 10). `options`: `{ agentType?, modelId? }`.
308
- - `cancel()` → `Promise<void>` — cancela o turno atual; resolve quando o backend confirma (ou safety net de 30s).
309
- - `loadHistory({ limit? })` → `Promise<AgentMessage[]>` — carrega o histórico do chat.
308
+ - `send(prompt)` → `void` — dispara um turno (WS `message`). Se já está streamando, **enfileira** (FIFO, máx 10).
309
+ - `cancel()` → `Promise<void>` — interrompe o turno atual (WS `interrupt`, safety net de 10s).
310
+ - `respondApproval(approved)` → `void` — responde um pedido de aprovação do agente (WS `approval_response`).
311
+ - `loadHistory({ limit? })` → `Promise<AgentMessage[]>` — histórico persistido via REST.
310
312
  - `editQueueItem(id, text)` / `removeQueueItem(id)` / `clearQueue()` — manipulam a fila.
311
313
  - `on(event, handler)` → função de unsubscribe — assina eventos da session.
312
- - `close()` — encerra a session e libera os listeners.
314
+ - `close()` — encerra a session, fecha o WS e libera os listeners.
313
315
 
314
316
  #### Eventos (`session.on`)
315
317
 
316
- `statusChange` · `historyLoaded` · `taskCreated` · `turnStart` · `delta` · `tool` · `turnEnd` · `cancelled` · `queueChange` · `error`.
318
+ `statusChange` · `historyLoaded` · `taskCreated` · `turnStart` · `delta` (`{ delta, kind: 'text' | 'thinking' }`) · `tool` (`{ tool, toolId?, input?, content?, phase: 'call' | 'result' }`) · `turnEnd` (`{ content }`) · `cancelled` · `queueChange` · `error` (`{ code?, error }`) · `raw` (eventos não mapeados do stream, ex.: `workspace`).
317
319
 
318
320
  ```typescript
319
321
  const session = getAgentTaskMitra({ create: true });
320
322
 
321
- session.on('delta', ({ delta, kind }) => process.stdout.write(delta)); // kind: 'text' | 'tool'
322
- session.on('tool', ({ tool, input }) => console.log('🔧', tool));
323
+ session.on('delta', ({ delta, kind }) => { if (kind === 'text') process.stdout.write(delta); });
324
+ session.on('tool', ({ tool, phase }) => console.log('🔧', phase, tool));
323
325
  session.on('turnEnd', ({ content }) => console.log('\n✓ fim do turno'));
324
326
  session.on('taskCreated', ({ task }) => console.log('chat criado:', task.id));
325
327
  session.on('error', ({ error }) => console.error(error));
326
328
 
327
329
  session.send('Analise estas vendas e gere um resumo');
328
-
329
- // Modelo por turno (sobrescreve o default da session)
330
- session.send('Refaça com mais detalhes', { modelId: 'subscription:anthropic:claude-opus-4-7' });
331
330
  ```
332
331
 
333
332
  ### Credenciais do agente — `manageAgentCredentialMitra`
334
333
 
335
- Função única (sobre `/sdk-ws`) para API keys (8 providers: `anthropic`, `openai`, `gemini`, `kimi`, `minimax`, `glm`, `qwen`, `openrouter`) e subscriptions OAuth (Claude paste-código / OpenAI device flow via Codex).
334
+ Função única, toda HTTP **via BFF** (`/agentAiShortcut/listProviders`, `saveCredential`, `oauthStart`...). Providers: `'anthropic'`, `'openai'`, `'google'`. API key via `save`/`remove`; OAuth via `auth`/`connect`; device flow via `device_auth`/`device_poll`.
335
+
336
+ **`projectId` é obrigatório** em todas as actions (opcional na chamada se já veio do `configureSdkMitra`) — é ele que define de qual app é a credencial; o BFF resolve `projectId → appId` e cunha o token de app.
336
337
 
337
- > 🔒 Segurança: o token de subscription **nunca volta cru** pro cliente — fica server-side e é injetado no sandbox direto de lá.
338
+ > 🔒 Tokens/keys nunca voltam crus — o backend devolve só status, e-mail da conta e a key mascarada.
338
339
 
339
340
  ```typescript
340
341
  import { manageAgentCredentialMitra } from 'mitra-interactions-sdk';
341
342
 
342
- // Listar providers + status (pra montar a UI de conexão)
343
+ // Status por provider (pra montar a UI de conexão)
343
344
  const { providers } = await manageAgentCredentialMitra({ action: 'list_providers' });
345
+ // AgentCredentialStatus[]: { provider, connected, credentialType, accountEmail, maskedApiKey }
344
346
 
345
- // Listar modelos disponíveis (só dos providers com credencial) → use o modelId em send()/getAgentTaskMitra
346
- const { providers: groups } = await manageAgentCredentialMitra({ action: 'list_models' });
347
+ // Modelos selecionáveis → use o agentType em getAgentTaskMitra
348
+ const { models } = await manageAgentCredentialMitra({ action: 'list_models' });
349
+ // AgentModel[]: { model, name, provider, agentType }
347
350
 
348
351
  // API key
349
- await manageAgentCredentialMitra({ action: 'validate', target: 'openai', key: 'sk-...' });
350
- await manageAgentCredentialMitra({ action: 'save', target: 'glm', key: '...' });
352
+ await manageAgentCredentialMitra({ action: 'save', target: 'openai', key: 'sk-...' });
351
353
  await manageAgentCredentialMitra({ action: 'remove', target: 'anthropic' });
352
354
  ```
353
355
 
354
- Subscriptions (alto nível, sem redirect/callback page) — `auth` inicia e retorna o que mostrar; `connect` finaliza:
356
+ OAuth (ex.: Anthropic) — `auth` devolve o que mostrar, `connect` finaliza:
355
357
 
356
358
  ```typescript
357
- // Claude — abra a authUrl, colete o código que a Anthropic mostra
358
- const { authUrl, state } = await manageAgentCredentialMitra({ action: 'auth', target: 'claude' });
359
- await manageAgentCredentialMitra({ action: 'connect', target: 'claude', code, state });
359
+ const { authUrl, state } = await manageAgentCredentialMitra({ action: 'auth', target: 'anthropic' });
360
+ // app abre authUrl; usuário autoriza e copia o código
361
+ const { connected, email } = await manageAgentCredentialMitra({ action: 'connect', target: 'anthropic', code, state });
362
+ ```
360
363
 
361
- // Codex (OpenAI device flow) — mostre verificationUrl + userCode; a SDK faz o polling
362
- const { verificationUrl, userCode, pollId } = await manageAgentCredentialMitra({ action: 'auth', target: 'codex' });
363
- await manageAgentCredentialMitra({ action: 'connect', target: 'codex', pollId });
364
+ Device flow (ex.: OpenAI) — mostre `userCode` + `verificationUri` e faça polling:
365
+
366
+ ```typescript
367
+ const { deviceAuthId, userCode, verificationUri, intervalSeconds } =
368
+ await manageAgentCredentialMitra({ action: 'device_auth', target: 'openai' });
369
+ // app mostra: "abra {verificationUri} e digite {userCode}"; depois, a cada intervalSeconds:
370
+ const { connected } = await manageAgentCredentialMitra({ action: 'device_poll', target: 'openai', deviceAuthId });
364
371
  ```
365
372
 
366
373
  ## Tipos TypeScript