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 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).
@@ -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
+ }