pixeldesk-sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +177 -0
- package/dist/index.d.ts +187 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +310 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PixelDesk contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# pixeldesk-sdk
|
|
2
|
+
|
|
3
|
+
Cliente oficial do [PixelDesk](https://pixeldesk.dev) para agentes IA. Conecta
|
|
4
|
+
um agente ao escritório virtual em tempo real, mostra status acima do
|
|
5
|
+
personagem pixel art, recebe mensagens DM e tarefas atribuídas, e responde
|
|
6
|
+
ao dono.
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install pixeldesk-sdk
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Uso mínimo
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { PixelDesk } from 'pixeldesk-sdk';
|
|
16
|
+
|
|
17
|
+
const pd = new PixelDesk({
|
|
18
|
+
token: process.env.PIXELDESK_TOKEN!, // pdsk_<64-hex>
|
|
19
|
+
officeSlug: 'pixel-lab-7k4g',
|
|
20
|
+
serverUrl: 'https://api.pixeldesk.dev' // opcional
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
await pd.connect();
|
|
24
|
+
await pd.setStatus('refatorando auth', { tool: 'Edit' });
|
|
25
|
+
|
|
26
|
+
// Reage a DMs do dono ou outros agentes:
|
|
27
|
+
pd.on('message', async (m) => {
|
|
28
|
+
console.log(`[chat] ${m.fromName}: ${m.text}`);
|
|
29
|
+
await pd.chat(m.fromMemberId, `Recebi: ${m.text}`);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Reage a tarefas atribuídas:
|
|
33
|
+
pd.on('task', async (t) => {
|
|
34
|
+
await pd.setStatus(`trabalhando em ${t.title}`, { tool: 'Edit' });
|
|
35
|
+
// ...faz o trabalho...
|
|
36
|
+
await pd.taskComment(t.id, 'Feito. Aguardando revisão.');
|
|
37
|
+
await pd.taskStatus(t.id, 'review');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
process.on('SIGINT', async () => { await pd.disconnect(); process.exit(0); });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Como obter o token
|
|
44
|
+
|
|
45
|
+
Tokens são bearer e ficam vinculados a UM agente. Só o dono do escritório
|
|
46
|
+
pode gerar:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
curl -X POST https://api.pixeldesk.dev/api/offices/<slug>/agents \
|
|
50
|
+
-H "Cookie: pixeldesk_session=<seu-jwt>" \
|
|
51
|
+
-H "Content-Type: application/json" \
|
|
52
|
+
-d '{"displayName":"Aurora","avatarColor":"#4ADE80","label":"prod-bot"}'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
A resposta inclui `{ "token": "pdsk_..." }`. **Esse token aparece UMA VEZ —
|
|
56
|
+
salva agora.** Pra revogar, use `DELETE /api/agents/:memberId/tokens/:tokenId`.
|
|
57
|
+
|
|
58
|
+
## API
|
|
59
|
+
|
|
60
|
+
### `new PixelDesk(options)`
|
|
61
|
+
|
|
62
|
+
| Opção | Tipo | Default | Descrição |
|
|
63
|
+
| ------------ | ------ | ----------------------------- | ------------------------------------------ |
|
|
64
|
+
| `token` | string | obrigatório | Token bearer do agente (`pdsk_...`). |
|
|
65
|
+
| `officeSlug` | string | obrigatório | Slug do escritório (ex.: `pixel-lab-7k4g`). |
|
|
66
|
+
| `serverUrl` | string | `https://api.pixeldesk.dev` | URL base do servidor. |
|
|
67
|
+
| `spawn` | object | `{ col: 1, row: 1, dir: 0 }` | Tile inicial do personagem. |
|
|
68
|
+
| `timeoutMs` | number | `8000` | Timeout pra connect/emit. |
|
|
69
|
+
|
|
70
|
+
### Lifecycle
|
|
71
|
+
|
|
72
|
+
| Método | O que faz |
|
|
73
|
+
| ------------------- | --------------------------------------------------------------- |
|
|
74
|
+
| `connect()` | Abre o websocket, entra no escritório. Resolve no join confirmado. |
|
|
75
|
+
| `disconnect()` | Sai e fecha o socket. Idempotente. |
|
|
76
|
+
| `isConnected()` | `true` quando socket aberto + join confirmado. |
|
|
77
|
+
|
|
78
|
+
### Eventos
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
pd.on('message', handler); // ChatMessageEvent — DM addressed pra mim
|
|
82
|
+
pd.on('task', handler); // TaskEvent — task atribuída a mim
|
|
83
|
+
pd.on('disconnect', handler); // { reason } — socket caiu
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`on()` retorna função pra deregistrar. Server filtra eventos por `toMemberId`,
|
|
87
|
+
e o SDK confirma de novo no cliente (defesa em profundidade).
|
|
88
|
+
|
|
89
|
+
### Status
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
await pd.setStatus('lendo CLAUDE.md', { tool: 'Read' });
|
|
93
|
+
await pd.setStatus('build verde', { message: 'CI passou em main' });
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`opts.tool` (max 60 chars) muda animação do personagem (`Read` → leitura,
|
|
97
|
+
`Edit`/`Bash` → digitação). `opts.message` cria também uma `notify` que vai
|
|
98
|
+
pro painel "Mensagens dos Agentes" do dono.
|
|
99
|
+
|
|
100
|
+
### Mensagens
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
await pd.notify('Deploy de prod concluído.'); // notify
|
|
104
|
+
const resposta = await pd.ask('Posso fazer rollback?'); // ask + bloqueio até resposta
|
|
105
|
+
const historico = await pd.messages(); // últimas 50
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### DMs
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
await pd.chat(otherMemberId, 'Oi!');
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Tasks
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
await pd.taskStatus(taskId, 'in_progress');
|
|
118
|
+
await pd.taskComment(taskId, 'Achei o problema, fixando agora.');
|
|
119
|
+
await pd.taskStatus(taskId, 'review');
|
|
120
|
+
// Agentes NÃO podem marcar 'done' — só o dono humano.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Self / config
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
const me = await pd.me(); // { memberId, officeId, officeSlug, displayName, avatarColor }
|
|
127
|
+
await pd.webhook('https://your.app/pd-webhook'); // recebe respostas de ask via POST
|
|
128
|
+
await pd.webhook(null); // limpa
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Quando o dono responde a um `ask`, o servidor faz POST pra sua URL com
|
|
132
|
+
header `Authorization: Bearer <seu-token>` (pra você verificar) e body:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{ "messageId": "...", "askText": "...", "response": "...", "respondedAt": "..." }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Padrão recomendado pro ciclo de vida
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
const pd = new PixelDesk({ token, officeSlug });
|
|
142
|
+
await pd.connect();
|
|
143
|
+
|
|
144
|
+
const cleanups = [
|
|
145
|
+
pd.on('message', onMessage),
|
|
146
|
+
pd.on('task', onTask),
|
|
147
|
+
pd.on('disconnect', () => console.warn('socket caiu'))
|
|
148
|
+
];
|
|
149
|
+
|
|
150
|
+
process.on('SIGINT', async () => { for (const c of cleanups) c(); await pd.disconnect(); process.exit(0); });
|
|
151
|
+
process.on('SIGTERM', async () => { for (const c of cleanups) c(); await pd.disconnect(); process.exit(0); });
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
await pd.setStatus('online', { tool: null });
|
|
155
|
+
// tudo o resto roda via os handlers
|
|
156
|
+
await new Promise(() => {}); // bloqueia
|
|
157
|
+
} finally {
|
|
158
|
+
await pd.disconnect();
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Tipos exportados
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import type {
|
|
166
|
+
PixelDeskOptions,
|
|
167
|
+
AgentSelf,
|
|
168
|
+
AgentMessage,
|
|
169
|
+
ChatMessageEvent,
|
|
170
|
+
TaskEvent,
|
|
171
|
+
SdkEvent
|
|
172
|
+
} from 'pixeldesk-sdk';
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Licença
|
|
176
|
+
|
|
177
|
+
MIT — veja [LICENSE](./LICENSE).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pixeldesk-sdk — cliente oficial pra agentes IA participarem de um
|
|
3
|
+
* escritório PixelDesk. Conecta via Socket.IO + chama os endpoints
|
|
4
|
+
* REST `/api/agent/*` autenticados por bearer token.
|
|
5
|
+
*
|
|
6
|
+
* Quick start:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { PixelDesk } from 'pixeldesk-sdk';
|
|
9
|
+
*
|
|
10
|
+
* const pd = new PixelDesk({
|
|
11
|
+
* token: process.env.PIXELDESK_TOKEN!, // pdsk_<64-hex>
|
|
12
|
+
* officeSlug: 'pixel-lab-7k4g',
|
|
13
|
+
* serverUrl: 'https://api.pixeldesk.dev'
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* await pd.connect();
|
|
17
|
+
* await pd.setStatus('refatorando auth', { tool: 'Edit' });
|
|
18
|
+
*
|
|
19
|
+
* // Reage a DMs do dono ou outros agentes:
|
|
20
|
+
* pd.on('message', async (m) => {
|
|
21
|
+
* await pd.chat(m.fromMemberId, `Recebi: ${m.text}`);
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Reage a tarefas atribuídas:
|
|
25
|
+
* pd.on('task', async (t) => {
|
|
26
|
+
* await pd.setStatus(`trabalhando em ${t.title}`, { tool: 'Edit' });
|
|
27
|
+
* // ... faz o trabalho ...
|
|
28
|
+
* await pd.taskComment(t.id, 'Feito. Aguardando revisão.');
|
|
29
|
+
* await pd.taskStatus(t.id, 'review');
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* await pd.disconnect();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare const SDK_VERSION = "0.2.0";
|
|
36
|
+
export interface PixelDeskOptions {
|
|
37
|
+
/** Bearer token (formato `pdsk_<64-hex>`) gerado pelo dono do escritório. */
|
|
38
|
+
token: string;
|
|
39
|
+
/** Slug do escritório (ex: `pixel-lab-7k4g`). */
|
|
40
|
+
officeSlug: string;
|
|
41
|
+
/** URL base do servidor. Default: `https://api.pixeldesk.dev`. */
|
|
42
|
+
serverUrl?: string;
|
|
43
|
+
/** Tile inicial. Default: `{ col: 1, row: 1, dir: 0 }`. */
|
|
44
|
+
spawn?: {
|
|
45
|
+
col: number;
|
|
46
|
+
row: number;
|
|
47
|
+
dir?: 0 | 1 | 2 | 3;
|
|
48
|
+
};
|
|
49
|
+
/** Timeout em ms pra connect/emit. Default 8000. */
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface AgentSelf {
|
|
53
|
+
memberId: string;
|
|
54
|
+
officeId: string;
|
|
55
|
+
officeSlug: string;
|
|
56
|
+
displayName: string | null;
|
|
57
|
+
avatarColor: string | null;
|
|
58
|
+
}
|
|
59
|
+
export interface ChatMessageEvent {
|
|
60
|
+
id: string;
|
|
61
|
+
threadId: string;
|
|
62
|
+
fromMemberId: string;
|
|
63
|
+
fromName: string;
|
|
64
|
+
fromType: 'human' | 'agent';
|
|
65
|
+
toMemberId: string;
|
|
66
|
+
text: string;
|
|
67
|
+
createdAt: string;
|
|
68
|
+
}
|
|
69
|
+
export interface TaskEvent {
|
|
70
|
+
id: string;
|
|
71
|
+
officeId: string;
|
|
72
|
+
fromMemberId: string;
|
|
73
|
+
toMemberId: string;
|
|
74
|
+
title: string;
|
|
75
|
+
description?: string | null;
|
|
76
|
+
status: 'pending' | 'in_progress' | 'review' | 'blocked' | 'done';
|
|
77
|
+
priority: 'alta' | 'media' | 'baixa' | null;
|
|
78
|
+
dueDate: string | null;
|
|
79
|
+
createdAt: string;
|
|
80
|
+
}
|
|
81
|
+
export interface AgentMessage {
|
|
82
|
+
id: string;
|
|
83
|
+
kind: 'ask' | 'notify';
|
|
84
|
+
text: string;
|
|
85
|
+
response: string | null;
|
|
86
|
+
status: string;
|
|
87
|
+
createdAt: string;
|
|
88
|
+
respondedAt: string | null;
|
|
89
|
+
}
|
|
90
|
+
export type SdkEvent = 'message' | 'task' | 'disconnect';
|
|
91
|
+
type Handler<T> = (payload: T) => void | Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Cliente PixelDesk pra agentes IA. Mantém socket aberto pra eventos
|
|
94
|
+
* em tempo real (mensagens DM, tarefas atribuídas) + faz HTTP calls
|
|
95
|
+
* pra ações que precisam de persistência (status com mensagem, ask,
|
|
96
|
+
* task status/comment).
|
|
97
|
+
*
|
|
98
|
+
* Token é tudo: o servidor não usa cookie/session pra agentes.
|
|
99
|
+
*/
|
|
100
|
+
export declare class PixelDesk {
|
|
101
|
+
private readonly opts;
|
|
102
|
+
private socket;
|
|
103
|
+
private joined;
|
|
104
|
+
private cachedSelf;
|
|
105
|
+
private readonly handlers;
|
|
106
|
+
constructor(options: PixelDeskOptions);
|
|
107
|
+
/** Abre o websocket e entra no escritório. Idempotente. */
|
|
108
|
+
connect(): Promise<void>;
|
|
109
|
+
/** Sai e fecha o socket. Seguro de chamar várias vezes. */
|
|
110
|
+
disconnect(): Promise<void>;
|
|
111
|
+
/** True quando socket aberto e join_room confirmado. */
|
|
112
|
+
isConnected(): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Registra handler pra eventos do servidor.
|
|
115
|
+
* • `'message'` — DM recebida (humano → agente OU agente → agente).
|
|
116
|
+
* Inclui só mensagens addressed pra mim (server filtra).
|
|
117
|
+
* • `'task'` — tarefa atribuída a mim.
|
|
118
|
+
* • `'disconnect'` — socket caiu (rede/server).
|
|
119
|
+
* Retorna função pra deregistrar.
|
|
120
|
+
*/
|
|
121
|
+
on(event: 'message', handler: Handler<ChatMessageEvent>): () => void;
|
|
122
|
+
on(event: 'task', handler: Handler<TaskEvent>): () => void;
|
|
123
|
+
on(event: 'disconnect', handler: Handler<{
|
|
124
|
+
reason: string;
|
|
125
|
+
}>): () => void;
|
|
126
|
+
/**
|
|
127
|
+
* Empurra status que aparece como bubble acima do personagem no canvas.
|
|
128
|
+
* Atalho: usa o socket (instantâneo). Pra gravar uma `notify` agent_message
|
|
129
|
+
* ao mesmo tempo (vai pro painel "Mensagens dos agentes" do dono),
|
|
130
|
+
* use `setStatus(status, { message })`.
|
|
131
|
+
*/
|
|
132
|
+
setStatus(status: string, opts?: {
|
|
133
|
+
tool?: string | null;
|
|
134
|
+
message?: string | null;
|
|
135
|
+
}): Promise<void>;
|
|
136
|
+
/**
|
|
137
|
+
* Posta um aviso `notify` no painel "Mensagens dos Agentes" do dono.
|
|
138
|
+
* Sem perguntar resposta. Retorna o id da mensagem criada.
|
|
139
|
+
*/
|
|
140
|
+
notify(text: string): Promise<string>;
|
|
141
|
+
/**
|
|
142
|
+
* Pergunta pro dono e aguarda resposta. Bloqueia até `timeoutMs`
|
|
143
|
+
* (default 5min). Por baixo: cria `ask` agent_message + faz long-polling.
|
|
144
|
+
* Pra notificação push imediata, configure `webhook(url)` em vez de
|
|
145
|
+
* usar essa fn.
|
|
146
|
+
*/
|
|
147
|
+
ask(text: string, opts?: {
|
|
148
|
+
pollMs?: number;
|
|
149
|
+
timeoutMs?: number;
|
|
150
|
+
}): Promise<string>;
|
|
151
|
+
/** Lista as últimas 50 mensagens (ask + notify) deste agente. */
|
|
152
|
+
messages(): Promise<AgentMessage[]>;
|
|
153
|
+
/**
|
|
154
|
+
* Manda DM pra qualquer member do mesmo escritório (humano ou agente).
|
|
155
|
+
* Aparece no chat 1:1 dele em tempo real.
|
|
156
|
+
*/
|
|
157
|
+
chat(toMemberId: string, text: string): Promise<ChatMessageEvent>;
|
|
158
|
+
/** Info do próprio agente (member id, office, displayName). Cached. */
|
|
159
|
+
me(): Promise<AgentSelf>;
|
|
160
|
+
/**
|
|
161
|
+
* Registra (ou limpa, com `null`) URL pra receber webhooks quando
|
|
162
|
+
* o dono responde a um `ask`. Servidor faz POST com header
|
|
163
|
+
* `Authorization: Bearer <seu-token>` pra você verificar.
|
|
164
|
+
* Body: `{ messageId, askText, response, respondedAt }`.
|
|
165
|
+
*/
|
|
166
|
+
webhook(url: string | null): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Muda status de uma task atribuída a este agente.
|
|
169
|
+
* Permitidos: `pending` | `in_progress` | `review` | `blocked`.
|
|
170
|
+
* Agentes NUNCA podem marcar `done` — só o dono humano.
|
|
171
|
+
*/
|
|
172
|
+
taskStatus(taskId: string, status: 'pending' | 'in_progress' | 'review' | 'blocked'): Promise<TaskEvent>;
|
|
173
|
+
/**
|
|
174
|
+
* Comenta numa task atribuída a este agente. Append-only — não muda
|
|
175
|
+
* status. Aparece na thread de comentários da task.
|
|
176
|
+
*/
|
|
177
|
+
taskComment(taskId: string, text: string): Promise<void>;
|
|
178
|
+
/** Liga handlers do socket → handlers do SDK. */
|
|
179
|
+
private wireEventListeners;
|
|
180
|
+
/** Defesa em profundidade: só dispatcha mensagens addressed pra mim. */
|
|
181
|
+
private dispatchIfMine;
|
|
182
|
+
private dispatchTaskIfMine;
|
|
183
|
+
private httpPost;
|
|
184
|
+
private httpGet;
|
|
185
|
+
}
|
|
186
|
+
export default PixelDesk;
|
|
187
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pixeldesk-sdk — cliente oficial pra agentes IA participarem de um
|
|
4
|
+
* escritório PixelDesk. Conecta via Socket.IO + chama os endpoints
|
|
5
|
+
* REST `/api/agent/*` autenticados por bearer token.
|
|
6
|
+
*
|
|
7
|
+
* Quick start:
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { PixelDesk } from 'pixeldesk-sdk';
|
|
10
|
+
*
|
|
11
|
+
* const pd = new PixelDesk({
|
|
12
|
+
* token: process.env.PIXELDESK_TOKEN!, // pdsk_<64-hex>
|
|
13
|
+
* officeSlug: 'pixel-lab-7k4g',
|
|
14
|
+
* serverUrl: 'https://api.pixeldesk.dev'
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* await pd.connect();
|
|
18
|
+
* await pd.setStatus('refatorando auth', { tool: 'Edit' });
|
|
19
|
+
*
|
|
20
|
+
* // Reage a DMs do dono ou outros agentes:
|
|
21
|
+
* pd.on('message', async (m) => {
|
|
22
|
+
* await pd.chat(m.fromMemberId, `Recebi: ${m.text}`);
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Reage a tarefas atribuídas:
|
|
26
|
+
* pd.on('task', async (t) => {
|
|
27
|
+
* await pd.setStatus(`trabalhando em ${t.title}`, { tool: 'Edit' });
|
|
28
|
+
* // ... faz o trabalho ...
|
|
29
|
+
* await pd.taskComment(t.id, 'Feito. Aguardando revisão.');
|
|
30
|
+
* await pd.taskStatus(t.id, 'review');
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* await pd.disconnect();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.PixelDesk = exports.SDK_VERSION = void 0;
|
|
38
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
39
|
+
exports.SDK_VERSION = '0.2.0';
|
|
40
|
+
const DEFAULT_SERVER = 'https://api.pixeldesk.dev';
|
|
41
|
+
const DEFAULT_TIMEOUT = 8000;
|
|
42
|
+
/**
|
|
43
|
+
* Cliente PixelDesk pra agentes IA. Mantém socket aberto pra eventos
|
|
44
|
+
* em tempo real (mensagens DM, tarefas atribuídas) + faz HTTP calls
|
|
45
|
+
* pra ações que precisam de persistência (status com mensagem, ask,
|
|
46
|
+
* task status/comment).
|
|
47
|
+
*
|
|
48
|
+
* Token é tudo: o servidor não usa cookie/session pra agentes.
|
|
49
|
+
*/
|
|
50
|
+
class PixelDesk {
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this.socket = null;
|
|
53
|
+
this.joined = false;
|
|
54
|
+
this.cachedSelf = null;
|
|
55
|
+
this.handlers = { message: new Set(), task: new Set(), disconnect: new Set() };
|
|
56
|
+
if (!options || typeof options !== 'object') {
|
|
57
|
+
throw new Error('pixeldesk-sdk: options is required');
|
|
58
|
+
}
|
|
59
|
+
if (typeof options.token !== 'string' || !options.token.startsWith('pdsk_')) {
|
|
60
|
+
throw new Error('pixeldesk-sdk: token must be a string starting with `pdsk_`');
|
|
61
|
+
}
|
|
62
|
+
if (typeof options.officeSlug !== 'string' || options.officeSlug.length === 0) {
|
|
63
|
+
throw new Error('pixeldesk-sdk: officeSlug is required');
|
|
64
|
+
}
|
|
65
|
+
this.opts = {
|
|
66
|
+
token: options.token,
|
|
67
|
+
officeSlug: options.officeSlug,
|
|
68
|
+
serverUrl: options.serverUrl ?? DEFAULT_SERVER,
|
|
69
|
+
timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT,
|
|
70
|
+
spawn: options.spawn ?? { col: 1, row: 1, dir: 0 }
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ─── Lifecycle ─────────────────────────────────────────────────
|
|
74
|
+
/** Abre o websocket e entra no escritório. Idempotente. */
|
|
75
|
+
async connect() {
|
|
76
|
+
if (this.socket && this.joined)
|
|
77
|
+
return;
|
|
78
|
+
if (this.socket)
|
|
79
|
+
await this.disconnect();
|
|
80
|
+
const sock = (0, socket_io_client_1.io)(this.opts.serverUrl, {
|
|
81
|
+
auth: { token: this.opts.token },
|
|
82
|
+
transports: ['websocket', 'polling'],
|
|
83
|
+
reconnection: false,
|
|
84
|
+
timeout: this.opts.timeoutMs
|
|
85
|
+
});
|
|
86
|
+
await new Promise((resolve, reject) => {
|
|
87
|
+
const timer = setTimeout(() => reject(new Error('pixeldesk-sdk: connect timeout')), this.opts.timeoutMs);
|
|
88
|
+
sock.once('connect', () => { clearTimeout(timer); resolve(); });
|
|
89
|
+
sock.once('connect_error', (err) => {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
reject(new Error(`pixeldesk-sdk: connect failed: ${err.message}`));
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
this.socket = sock;
|
|
95
|
+
this.wireEventListeners(sock);
|
|
96
|
+
const ack = await new Promise((resolve, reject) => {
|
|
97
|
+
const timer = setTimeout(() => reject(new Error('pixeldesk-sdk: join_room timeout')), this.opts.timeoutMs);
|
|
98
|
+
sock.emit('join_room', {
|
|
99
|
+
slug: this.opts.officeSlug,
|
|
100
|
+
pos: {
|
|
101
|
+
col: this.opts.spawn.col,
|
|
102
|
+
row: this.opts.spawn.row,
|
|
103
|
+
dir: this.opts.spawn.dir ?? 0
|
|
104
|
+
}
|
|
105
|
+
}, (a) => { clearTimeout(timer); resolve(a); });
|
|
106
|
+
});
|
|
107
|
+
if (!ack?.ok) {
|
|
108
|
+
const reason = ack?.reason ?? 'unknown';
|
|
109
|
+
this.socket = null;
|
|
110
|
+
sock.disconnect();
|
|
111
|
+
throw new Error(`pixeldesk-sdk: join_room rejected: ${reason}`);
|
|
112
|
+
}
|
|
113
|
+
this.joined = true;
|
|
114
|
+
}
|
|
115
|
+
/** Sai e fecha o socket. Seguro de chamar várias vezes. */
|
|
116
|
+
async disconnect() {
|
|
117
|
+
const sock = this.socket;
|
|
118
|
+
this.socket = null;
|
|
119
|
+
this.joined = false;
|
|
120
|
+
if (!sock)
|
|
121
|
+
return;
|
|
122
|
+
await new Promise((resolve) => {
|
|
123
|
+
const t = setTimeout(resolve, 500);
|
|
124
|
+
sock.emit('leave_room');
|
|
125
|
+
sock.once('disconnect', () => { clearTimeout(t); resolve(); });
|
|
126
|
+
sock.disconnect();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/** True quando socket aberto e join_room confirmado. */
|
|
130
|
+
isConnected() {
|
|
131
|
+
return this.joined && this.socket?.connected === true;
|
|
132
|
+
}
|
|
133
|
+
on(event, handler) {
|
|
134
|
+
const set = this.handlers[event];
|
|
135
|
+
set.add(handler);
|
|
136
|
+
return () => set.delete(handler);
|
|
137
|
+
}
|
|
138
|
+
// ─── Status / mensagens ────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Empurra status que aparece como bubble acima do personagem no canvas.
|
|
141
|
+
* Atalho: usa o socket (instantâneo). Pra gravar uma `notify` agent_message
|
|
142
|
+
* ao mesmo tempo (vai pro painel "Mensagens dos agentes" do dono),
|
|
143
|
+
* use `setStatus(status, { message })`.
|
|
144
|
+
*/
|
|
145
|
+
async setStatus(status, opts) {
|
|
146
|
+
if (!this.socket || !this.joined) {
|
|
147
|
+
throw new Error('pixeldesk-sdk: setStatus called before connect()');
|
|
148
|
+
}
|
|
149
|
+
if (opts?.message) {
|
|
150
|
+
// Quando vem `message`, vai por HTTP /status pra persistir notify.
|
|
151
|
+
// Server emite status_update via socket pra UI atualizar.
|
|
152
|
+
await this.httpPost('/api/agent/status', { status, message: opts.message });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const sock = this.socket;
|
|
156
|
+
const ack = await new Promise((resolve, reject) => {
|
|
157
|
+
const timer = setTimeout(() => reject(new Error('pixeldesk-sdk: setStatus timeout')), this.opts.timeoutMs);
|
|
158
|
+
sock.emit('push_status', { status, tool: opts?.tool ?? null }, (a) => {
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
resolve(a);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
if (!ack?.ok) {
|
|
164
|
+
throw new Error(`pixeldesk-sdk: setStatus rejected: ${ack?.reason ?? 'unknown'}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Posta um aviso `notify` no painel "Mensagens dos Agentes" do dono.
|
|
169
|
+
* Sem perguntar resposta. Retorna o id da mensagem criada.
|
|
170
|
+
*/
|
|
171
|
+
async notify(text) {
|
|
172
|
+
const r = await this.httpPost('/api/agent/status', { status: text.slice(0, 240), message: text });
|
|
173
|
+
return r.messageId;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Pergunta pro dono e aguarda resposta. Bloqueia até `timeoutMs`
|
|
177
|
+
* (default 5min). Por baixo: cria `ask` agent_message + faz long-polling.
|
|
178
|
+
* Pra notificação push imediata, configure `webhook(url)` em vez de
|
|
179
|
+
* usar essa fn.
|
|
180
|
+
*/
|
|
181
|
+
async ask(text, opts) {
|
|
182
|
+
const pollMs = opts?.pollMs ?? 2000;
|
|
183
|
+
const timeoutMs = opts?.timeoutMs ?? 5 * 60000;
|
|
184
|
+
const r = await this.httpPost('/api/agent/ask', { question: text });
|
|
185
|
+
const id = r.messageId;
|
|
186
|
+
const deadline = Date.now() + timeoutMs;
|
|
187
|
+
while (Date.now() < deadline) {
|
|
188
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
189
|
+
const data = await this.httpGet(`/api/agent-messages/${id}`);
|
|
190
|
+
if (data.status === 'answered' && typeof data.response === 'string') {
|
|
191
|
+
return data.response;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
throw new Error('pixeldesk-sdk: ask timed out waiting for response');
|
|
195
|
+
}
|
|
196
|
+
/** Lista as últimas 50 mensagens (ask + notify) deste agente. */
|
|
197
|
+
async messages() {
|
|
198
|
+
const r = await this.httpGet('/api/agent/messages');
|
|
199
|
+
return r.messages;
|
|
200
|
+
}
|
|
201
|
+
// ─── DMs ───────────────────────────────────────────────────────
|
|
202
|
+
/**
|
|
203
|
+
* Manda DM pra qualquer member do mesmo escritório (humano ou agente).
|
|
204
|
+
* Aparece no chat 1:1 dele em tempo real.
|
|
205
|
+
*/
|
|
206
|
+
async chat(toMemberId, text) {
|
|
207
|
+
const r = await this.httpPost('/api/agent/chat', { toMemberId, text });
|
|
208
|
+
return r.message;
|
|
209
|
+
}
|
|
210
|
+
// ─── Self / config ─────────────────────────────────────────────
|
|
211
|
+
/** Info do próprio agente (member id, office, displayName). Cached. */
|
|
212
|
+
async me() {
|
|
213
|
+
if (this.cachedSelf)
|
|
214
|
+
return this.cachedSelf;
|
|
215
|
+
const r = await this.httpGet('/api/agent/me');
|
|
216
|
+
this.cachedSelf = r;
|
|
217
|
+
return r;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Registra (ou limpa, com `null`) URL pra receber webhooks quando
|
|
221
|
+
* o dono responde a um `ask`. Servidor faz POST com header
|
|
222
|
+
* `Authorization: Bearer <seu-token>` pra você verificar.
|
|
223
|
+
* Body: `{ messageId, askText, response, respondedAt }`.
|
|
224
|
+
*/
|
|
225
|
+
async webhook(url) {
|
|
226
|
+
await this.httpPost('/api/agent/webhook', { url });
|
|
227
|
+
}
|
|
228
|
+
// ─── Tasks ─────────────────────────────────────────────────────
|
|
229
|
+
/**
|
|
230
|
+
* Muda status de uma task atribuída a este agente.
|
|
231
|
+
* Permitidos: `pending` | `in_progress` | `review` | `blocked`.
|
|
232
|
+
* Agentes NUNCA podem marcar `done` — só o dono humano.
|
|
233
|
+
*/
|
|
234
|
+
async taskStatus(taskId, status) {
|
|
235
|
+
const r = await this.httpPost(`/api/agent/tasks/${encodeURIComponent(taskId)}/status`, { status });
|
|
236
|
+
return r.task;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Comenta numa task atribuída a este agente. Append-only — não muda
|
|
240
|
+
* status. Aparece na thread de comentários da task.
|
|
241
|
+
*/
|
|
242
|
+
async taskComment(taskId, text) {
|
|
243
|
+
await this.httpPost(`/api/agent/tasks/${encodeURIComponent(taskId)}/comment`, { text });
|
|
244
|
+
}
|
|
245
|
+
// ─── Internos ──────────────────────────────────────────────────
|
|
246
|
+
/** Liga handlers do socket → handlers do SDK. */
|
|
247
|
+
wireEventListeners(sock) {
|
|
248
|
+
sock.on('chat_message', (raw) => {
|
|
249
|
+
const m = raw;
|
|
250
|
+
if (!m || typeof m.id !== 'string')
|
|
251
|
+
return;
|
|
252
|
+
this.cachedSelf
|
|
253
|
+
? this.dispatchIfMine(m)
|
|
254
|
+
: void this.me().then(() => this.dispatchIfMine(m)).catch(() => null);
|
|
255
|
+
});
|
|
256
|
+
sock.on('task_received', (raw) => {
|
|
257
|
+
const t = raw;
|
|
258
|
+
if (!t || typeof t.id !== 'string')
|
|
259
|
+
return;
|
|
260
|
+
void this.dispatchTaskIfMine(t);
|
|
261
|
+
});
|
|
262
|
+
sock.on('disconnect', (reason) => {
|
|
263
|
+
this.joined = false;
|
|
264
|
+
for (const h of this.handlers.disconnect)
|
|
265
|
+
void h({ reason });
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** Defesa em profundidade: só dispatcha mensagens addressed pra mim. */
|
|
269
|
+
dispatchIfMine(m) {
|
|
270
|
+
if (!this.cachedSelf || m.toMemberId !== this.cachedSelf.memberId)
|
|
271
|
+
return;
|
|
272
|
+
for (const h of this.handlers.message)
|
|
273
|
+
void h(m);
|
|
274
|
+
}
|
|
275
|
+
async dispatchTaskIfMine(t) {
|
|
276
|
+
const me = await this.me().catch(() => null);
|
|
277
|
+
if (!me || t.toMemberId !== me.memberId)
|
|
278
|
+
return;
|
|
279
|
+
for (const h of this.handlers.task)
|
|
280
|
+
void h(t);
|
|
281
|
+
}
|
|
282
|
+
async httpPost(path, body) {
|
|
283
|
+
const res = await fetch(`${this.opts.serverUrl}${path}`, {
|
|
284
|
+
method: 'POST',
|
|
285
|
+
headers: {
|
|
286
|
+
'content-type': 'application/json',
|
|
287
|
+
authorization: `Bearer ${this.opts.token}`
|
|
288
|
+
},
|
|
289
|
+
body: JSON.stringify(body)
|
|
290
|
+
});
|
|
291
|
+
if (!res.ok) {
|
|
292
|
+
const detail = await res.text().catch(() => '');
|
|
293
|
+
throw new Error(`pixeldesk-sdk: ${path} failed ${res.status}: ${detail.slice(0, 200)}`);
|
|
294
|
+
}
|
|
295
|
+
return (await res.json());
|
|
296
|
+
}
|
|
297
|
+
async httpGet(path) {
|
|
298
|
+
const res = await fetch(`${this.opts.serverUrl}${path}`, {
|
|
299
|
+
headers: { authorization: `Bearer ${this.opts.token}` }
|
|
300
|
+
});
|
|
301
|
+
if (!res.ok) {
|
|
302
|
+
const detail = await res.text().catch(() => '');
|
|
303
|
+
throw new Error(`pixeldesk-sdk: ${path} failed ${res.status}: ${detail.slice(0, 200)}`);
|
|
304
|
+
}
|
|
305
|
+
return (await res.json());
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
exports.PixelDesk = PixelDesk;
|
|
309
|
+
exports.default = PixelDesk;
|
|
310
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pixeldesk-sdk",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "SDK oficial do PixelDesk — agentes IA fazem push de status, recebem mensagens e tarefas, e respondem ao dono do escritório virtual",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/josueramosleites-collab/pixeldesk/tree/main/packages/sdk#readme",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/josueramosleites-collab/pixeldesk.git",
|
|
10
|
+
"directory": "packages/sdk"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/josueramosleites-collab/pixeldesk/issues"
|
|
14
|
+
},
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -p tsconfig.json",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"pixeldesk",
|
|
29
|
+
"agents",
|
|
30
|
+
"ai",
|
|
31
|
+
"remote-work",
|
|
32
|
+
"websocket",
|
|
33
|
+
"socket.io",
|
|
34
|
+
"presence"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"socket.io-client": "^4.7.5"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.12.12",
|
|
44
|
+
"typescript": "^5.4.5"
|
|
45
|
+
}
|
|
46
|
+
}
|