@zihin/agent-client 0.1.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/README.md +156 -0
- package/dist/agents.d.ts +21 -0
- package/dist/agents.js +52 -0
- package/dist/agents.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.js +75 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.js +89 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +98 -0
- package/dist/http.js +281 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +13 -0
- package/dist/internal.js +40 -0
- package/dist/internal.js.map +1 -0
- package/dist/invoke.d.ts +18 -0
- package/dist/invoke.js +233 -0
- package/dist/invoke.js.map +1 -0
- package/dist/security.d.ts +82 -0
- package/dist/security.js +251 -0
- package/dist/security.js.map +1 -0
- package/dist/sse.d.ts +27 -0
- package/dist/sse.js +138 -0
- package/dist/sse.js.map +1 -0
- package/dist/triggers.d.ts +43 -0
- package/dist/triggers.js +241 -0
- package/dist/triggers.js.map +1 -0
- package/dist/types.d.ts +268 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
package/dist/sse.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Parser de Server-Sent Events. Converte o corpo (ReadableStream) num async iterator de
|
|
4
|
+
* eventos `{ event, data }`, com `data` já parseado de JSON quando possível.
|
|
5
|
+
*
|
|
6
|
+
* Robustez:
|
|
7
|
+
* - limites de tamanho (maxEventBytes / maxTotalBytes) → aborta com `protocol` (anti-DoS de memória).
|
|
8
|
+
* - parse incremental O(n) (sem replace global no buffer acumulado).
|
|
9
|
+
* - `reader.cancel()` no finally → fecha a conexão mesmo em `break`/erro (sem socket vazado).
|
|
10
|
+
*
|
|
11
|
+
* @module sse
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.parseSse = parseSse;
|
|
15
|
+
const errors_1 = require("./errors");
|
|
16
|
+
const internal_1 = require("./internal");
|
|
17
|
+
const DEFAULT_MAX_EVENT_BYTES = 1 * 1024 * 1024;
|
|
18
|
+
const DEFAULT_MAX_TOTAL_BYTES = 64 * 1024 * 1024;
|
|
19
|
+
async function* parseSse(response, opts = {}) {
|
|
20
|
+
if (!response.body) {
|
|
21
|
+
throw new errors_1.ZihinAgentError('protocol', 'SSE response has no body.');
|
|
22
|
+
}
|
|
23
|
+
const maxEventBytes = opts.maxEventBytes ?? DEFAULT_MAX_EVENT_BYTES;
|
|
24
|
+
const maxTotalBytes = opts.maxTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES;
|
|
25
|
+
const reader = response.body.getReader();
|
|
26
|
+
const decoder = new TextDecoder('utf-8');
|
|
27
|
+
let buffer = '';
|
|
28
|
+
let eventName = '';
|
|
29
|
+
let dataLines = [];
|
|
30
|
+
let dataBytes = 0;
|
|
31
|
+
let totalBytes = 0;
|
|
32
|
+
const flush = () => {
|
|
33
|
+
const had = dataLines.length > 0 || eventName !== '';
|
|
34
|
+
const rawData = dataLines.join('\n');
|
|
35
|
+
const evt = eventName || 'message';
|
|
36
|
+
eventName = '';
|
|
37
|
+
dataLines = [];
|
|
38
|
+
dataBytes = 0;
|
|
39
|
+
if (!had || rawData === '')
|
|
40
|
+
return null;
|
|
41
|
+
let data = rawData;
|
|
42
|
+
try {
|
|
43
|
+
data = JSON.parse(rawData);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* mantém string crua */
|
|
47
|
+
}
|
|
48
|
+
return { event: evt, data, rawData };
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
// eslint-disable-next-line no-constant-condition
|
|
52
|
+
while (true) {
|
|
53
|
+
if (opts.signal?.aborted) {
|
|
54
|
+
throw opts.onAbortError ? opts.onAbortError() : new errors_1.ZihinAgentError('aborted', 'Stream aborted.');
|
|
55
|
+
}
|
|
56
|
+
let chunk;
|
|
57
|
+
try {
|
|
58
|
+
chunk = await reader.read();
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw opts.onAbortError ? opts.onAbortError() : (0, errors_1.errorFromThrow)(err);
|
|
62
|
+
}
|
|
63
|
+
if (chunk.done)
|
|
64
|
+
break;
|
|
65
|
+
totalBytes += chunk.value.byteLength;
|
|
66
|
+
if (totalBytes > maxTotalBytes) {
|
|
67
|
+
throw new errors_1.ZihinAgentError('protocol', `SSE stream exceeded ${maxTotalBytes} bytes.`);
|
|
68
|
+
}
|
|
69
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
70
|
+
let nl;
|
|
71
|
+
while ((nl = buffer.indexOf('\n')) !== -1) {
|
|
72
|
+
let line = buffer.slice(0, nl);
|
|
73
|
+
buffer = buffer.slice(nl + 1);
|
|
74
|
+
if (line.endsWith('\r'))
|
|
75
|
+
line = line.slice(0, -1); // \r\n sem replace global (P3)
|
|
76
|
+
if (line === '') {
|
|
77
|
+
const e = flush();
|
|
78
|
+
if (e)
|
|
79
|
+
yield e;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (line.startsWith(':'))
|
|
83
|
+
continue; // comentário/keep-alive
|
|
84
|
+
const colon = line.indexOf(':');
|
|
85
|
+
const field = colon === -1 ? line : line.slice(0, colon);
|
|
86
|
+
let val = colon === -1 ? '' : line.slice(colon + 1);
|
|
87
|
+
if (val.startsWith(' '))
|
|
88
|
+
val = val.slice(1);
|
|
89
|
+
if (field === 'event') {
|
|
90
|
+
eventName = val;
|
|
91
|
+
}
|
|
92
|
+
else if (field === 'data') {
|
|
93
|
+
dataBytes += (0, internal_1.utf8Len)(val) + 1;
|
|
94
|
+
if (dataBytes > maxEventBytes) {
|
|
95
|
+
throw new errors_1.ZihinAgentError('protocol', `SSE event exceeded ${maxEventBytes} bytes.`);
|
|
96
|
+
}
|
|
97
|
+
dataLines.push(val);
|
|
98
|
+
}
|
|
99
|
+
// `id`/`retry` ignorados (sem reconexão automática aqui).
|
|
100
|
+
}
|
|
101
|
+
// Linha sem `\n` ainda em buffer não pode crescer sem teto (S2).
|
|
102
|
+
if ((0, internal_1.utf8Len)(buffer) > maxEventBytes) {
|
|
103
|
+
throw new errors_1.ZihinAgentError('protocol', `SSE line exceeded ${maxEventBytes} bytes.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Flush final do decoder (caractere multibyte partido no fim do stream) e processa
|
|
107
|
+
// uma última linha `data:`/`event:` que tenha chegado sem o `\n` terminal.
|
|
108
|
+
buffer += decoder.decode();
|
|
109
|
+
if (buffer.length > 0) {
|
|
110
|
+
let line = buffer.endsWith('\r') ? buffer.slice(0, -1) : buffer;
|
|
111
|
+
if (line && !line.startsWith(':')) {
|
|
112
|
+
const colon = line.indexOf(':');
|
|
113
|
+
const field = colon === -1 ? line : line.slice(0, colon);
|
|
114
|
+
let val = colon === -1 ? '' : line.slice(colon + 1);
|
|
115
|
+
if (val.startsWith(' '))
|
|
116
|
+
val = val.slice(1);
|
|
117
|
+
if (field === 'data')
|
|
118
|
+
dataLines.push(val);
|
|
119
|
+
else if (field === 'event')
|
|
120
|
+
eventName = val;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const tail = flush();
|
|
124
|
+
if (tail)
|
|
125
|
+
yield tail;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
// Fecha a conexão também em break/throw (P2: sem socket vazado). cancel() libera o lock.
|
|
129
|
+
try {
|
|
130
|
+
await reader.cancel();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* ignore */
|
|
134
|
+
}
|
|
135
|
+
opts.onEnd?.();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=sse.js.map
|
package/dist/sse.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caminho B — invocação assíncrona/desacoplada via sistema de triggers.
|
|
3
|
+
* - createTrigger: provisiona (1x) um webhook ligado a um agente (POST /api/triggers).
|
|
4
|
+
* - dispatchAgent: dispara o trigger (POST /api/triggers/webhook/:id) → 202 (async) | JSON (sync).
|
|
5
|
+
* - getExecution: consulta o resultado (GET /api/triggers/:id/executions/:execId).
|
|
6
|
+
*
|
|
7
|
+
* Requer key role admin/editor (triggers:create / telemetry:read). Keys `member` → 403.
|
|
8
|
+
*
|
|
9
|
+
* @module triggers
|
|
10
|
+
*/
|
|
11
|
+
import { type ResolvedConfig } from './http';
|
|
12
|
+
import type { CreateTriggerParams, DeleteTriggerParams, DispatchAgentParams, DispatchResult, ExecutionStatus, FindOrCreateResult, GetExecutionParams, GetTriggerParams, ListTriggersParams, TriggerInfo, TriggerRef } from './types';
|
|
13
|
+
/**
|
|
14
|
+
* Provisiona um trigger de webhook ligado a um agente. Faça isto uma vez; depois dispare
|
|
15
|
+
* quantas vezes quiser com `dispatchAgent`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createTrigger(cfg: ResolvedConfig, params: CreateTriggerParams): Promise<TriggerRef>;
|
|
18
|
+
/**
|
|
19
|
+
* Dispara um trigger. Em modo async retorna `{ accepted, executionId }` (202);
|
|
20
|
+
* em modo sync retorna também `{ agentResponse, usage }` (200).
|
|
21
|
+
*/
|
|
22
|
+
export declare function dispatchAgent(cfg: ResolvedConfig, params: DispatchAgentParams): Promise<DispatchResult>;
|
|
23
|
+
/** Lista os triggers do tenant (opcionalmente filtrando por agente/tipo/habilitados). */
|
|
24
|
+
export declare function listTriggers(cfg: ResolvedConfig, params?: ListTriggersParams): Promise<TriggerInfo[]>;
|
|
25
|
+
/** Obtém um trigger pelo id (inclui webhookUrl para webhooks). */
|
|
26
|
+
export declare function getTrigger(cfg: ResolvedConfig, params: GetTriggerParams): Promise<TriggerInfo>;
|
|
27
|
+
/** Remove um trigger. Requer key role admin/owner (editor NÃO pode deletar → 403). */
|
|
28
|
+
export declare function deleteTrigger(cfg: ResolvedConfig, params: DeleteTriggerParams): Promise<{
|
|
29
|
+
deleted: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Reaproveita um trigger existente do mesmo agente+nome, ou cria um novo. Evita o footgun de
|
|
33
|
+
* duplicação (o BE não tem unicidade de nome). Retorna `created: false` se reusou.
|
|
34
|
+
*
|
|
35
|
+
* Nota: se um trigger com o mesmo nome já existe mas com config diferente (ex.: outra callbackUrl),
|
|
36
|
+
* ele é REAPROVEITADO como está — atualize explicitamente com o BE se precisar reconciliar.
|
|
37
|
+
*/
|
|
38
|
+
export declare function findOrCreateTrigger(cfg: ResolvedConfig, params: CreateTriggerParams): Promise<FindOrCreateResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Consulta o status/resultado de uma execução disparada por trigger.
|
|
41
|
+
* Útil para polling no modo async (alternativa ao callback).
|
|
42
|
+
*/
|
|
43
|
+
export declare function getExecution(cfg: ResolvedConfig, params: GetExecutionParams): Promise<ExecutionStatus>;
|
package/dist/triggers.js
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Caminho B — invocação assíncrona/desacoplada via sistema de triggers.
|
|
4
|
+
* - createTrigger: provisiona (1x) um webhook ligado a um agente (POST /api/triggers).
|
|
5
|
+
* - dispatchAgent: dispara o trigger (POST /api/triggers/webhook/:id) → 202 (async) | JSON (sync).
|
|
6
|
+
* - getExecution: consulta o resultado (GET /api/triggers/:id/executions/:execId).
|
|
7
|
+
*
|
|
8
|
+
* Requer key role admin/editor (triggers:create / telemetry:read). Keys `member` → 403.
|
|
9
|
+
*
|
|
10
|
+
* @module triggers
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.createTrigger = createTrigger;
|
|
14
|
+
exports.dispatchAgent = dispatchAgent;
|
|
15
|
+
exports.listTriggers = listTriggers;
|
|
16
|
+
exports.getTrigger = getTrigger;
|
|
17
|
+
exports.deleteTrigger = deleteTrigger;
|
|
18
|
+
exports.findOrCreateTrigger = findOrCreateTrigger;
|
|
19
|
+
exports.getExecution = getExecution;
|
|
20
|
+
const errors_1 = require("./errors");
|
|
21
|
+
const http_1 = require("./http");
|
|
22
|
+
const internal_1 = require("./internal");
|
|
23
|
+
const security_1 = require("./security");
|
|
24
|
+
/** Request JSON (com deadline/retry conforme política); lança ZihinAgentError em não-2xx. */
|
|
25
|
+
async function requestJson(cfg, args) {
|
|
26
|
+
const res = await (0, http_1.requestBuffered)({
|
|
27
|
+
method: args.method,
|
|
28
|
+
url: `${cfg.baseUrl}${args.path}`,
|
|
29
|
+
headers: (0, http_1.buildHeaders)(cfg.apiKey),
|
|
30
|
+
body: args.body !== undefined ? JSON.stringify(args.body) : undefined,
|
|
31
|
+
timeoutMs: cfg.timeoutMs,
|
|
32
|
+
maxRetries: cfg.maxRetries,
|
|
33
|
+
policy: args.policy,
|
|
34
|
+
callerSignal: args.signal,
|
|
35
|
+
fetchImpl: cfg.fetchImpl,
|
|
36
|
+
onRetry: cfg.onRetry,
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
throw (0, errors_1.errorFromResponse)(res.status, (0, http_1.parseBody)(res.text), { endpoint: res.endpoint, attempts: res.attempts });
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(res.text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new errors_1.ZihinAgentError('protocol', 'Expected JSON response.', { endpoint: res.endpoint });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Provisiona um trigger de webhook ligado a um agente. Faça isto uma vez; depois dispare
|
|
50
|
+
* quantas vezes quiser com `dispatchAgent`.
|
|
51
|
+
*/
|
|
52
|
+
async function createTrigger(cfg, params) {
|
|
53
|
+
if (!params.agentId)
|
|
54
|
+
throw new errors_1.ZihinAgentError('config', 'agentId is required.');
|
|
55
|
+
if (!params.name)
|
|
56
|
+
throw new errors_1.ZihinAgentError('config', 'name is required.');
|
|
57
|
+
const mode = params.mode ?? 'async';
|
|
58
|
+
if (mode === 'async' && !params.callbackUrl) {
|
|
59
|
+
throw new errors_1.ZihinAgentError('config', 'callbackUrl is required for async triggers.');
|
|
60
|
+
}
|
|
61
|
+
// S3: valida a callbackUrl (HTTPS + sem IP privado) antes de registrá-la no BE.
|
|
62
|
+
if (params.callbackUrl) {
|
|
63
|
+
const cb = (0, security_1.validateBaseUrl)(params.callbackUrl, { allowCustomDomains: true });
|
|
64
|
+
if (!cb.valid) {
|
|
65
|
+
throw new errors_1.ZihinAgentError('config', `Invalid callbackUrl: ${cb.error}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const execution = { mode };
|
|
69
|
+
if (params.callbackUrl) {
|
|
70
|
+
execution.callback = {
|
|
71
|
+
url: params.callbackUrl,
|
|
72
|
+
method: params.callbackMethod ?? 'POST',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const body = {
|
|
76
|
+
agent_id: params.agentId,
|
|
77
|
+
name: params.name,
|
|
78
|
+
trigger_type: 'webhook',
|
|
79
|
+
trigger_config: {
|
|
80
|
+
query_extraction: { mode: 'field', field: params.queryField ?? 'message' },
|
|
81
|
+
auth: { type: params.dispatchAuth ?? 'api_key' },
|
|
82
|
+
execution,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
const json = (0, internal_1.rec)(await requestJson(cfg, { method: 'POST', path: '/api/triggers', body, policy: 'side-effecting', signal: params.signal }));
|
|
86
|
+
const data = (0, internal_1.rec)(json.data);
|
|
87
|
+
const triggerId = (0, internal_1.str)(data.id) ?? (0, internal_1.str)(json.id);
|
|
88
|
+
const webhookUrl = (0, internal_1.str)(json.webhook_url) ?? (triggerId ? `${cfg.baseUrl}/api/triggers/webhook/${triggerId}` : undefined);
|
|
89
|
+
if (!triggerId || !webhookUrl) {
|
|
90
|
+
throw new errors_1.ZihinAgentError('protocol', 'createTrigger: missing trigger id / webhook url in response.');
|
|
91
|
+
}
|
|
92
|
+
return { triggerId, webhookUrl };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Dispara um trigger. Em modo async retorna `{ accepted, executionId }` (202);
|
|
96
|
+
* em modo sync retorna também `{ agentResponse, usage }` (200).
|
|
97
|
+
*/
|
|
98
|
+
async function dispatchAgent(cfg, params) {
|
|
99
|
+
if (!params.triggerId)
|
|
100
|
+
throw new errors_1.ZihinAgentError('config', 'triggerId is required.');
|
|
101
|
+
const res = await (0, http_1.requestBuffered)({
|
|
102
|
+
method: 'POST',
|
|
103
|
+
url: `${cfg.baseUrl}/api/triggers/webhook/${encodeURIComponent(params.triggerId)}`,
|
|
104
|
+
headers: (0, http_1.buildHeaders)(cfg.apiKey),
|
|
105
|
+
body: JSON.stringify(params.payload ?? {}),
|
|
106
|
+
timeoutMs: cfg.timeoutMs,
|
|
107
|
+
maxRetries: cfg.maxRetries,
|
|
108
|
+
policy: 'side-effecting', // S1: nunca duplica disparo por erro de rede
|
|
109
|
+
callerSignal: params.signal,
|
|
110
|
+
fetchImpl: cfg.fetchImpl,
|
|
111
|
+
onRetry: cfg.onRetry,
|
|
112
|
+
});
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
throw (0, errors_1.errorFromResponse)(res.status, (0, http_1.parseBody)(res.text), { endpoint: res.endpoint, attempts: res.attempts });
|
|
115
|
+
}
|
|
116
|
+
const json = (0, http_1.parseBody)(res.text);
|
|
117
|
+
const j = (0, internal_1.rec)(json);
|
|
118
|
+
return {
|
|
119
|
+
accepted: true,
|
|
120
|
+
triggerId: (0, internal_1.str)(j.trigger_id) ?? params.triggerId,
|
|
121
|
+
executionId: (0, internal_1.str)(j.execution_id),
|
|
122
|
+
agentResponse: (0, internal_1.str)(j.agent_response),
|
|
123
|
+
usage: (0, internal_1.parseUsage)(j.usage),
|
|
124
|
+
raw: json,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function webhookUrlFor(cfg, t) {
|
|
128
|
+
if ((0, internal_1.str)(t.webhook_url))
|
|
129
|
+
return (0, internal_1.str)(t.webhook_url);
|
|
130
|
+
const id = (0, internal_1.str)(t.id);
|
|
131
|
+
return t.trigger_type === 'webhook' && id ? `${cfg.baseUrl}/api/triggers/webhook/${id}` : undefined;
|
|
132
|
+
}
|
|
133
|
+
function mapTriggerInfo(cfg, raw) {
|
|
134
|
+
const t = (0, internal_1.rec)(raw);
|
|
135
|
+
return {
|
|
136
|
+
id: (0, internal_1.str)(t.id) ?? '',
|
|
137
|
+
agentId: (0, internal_1.str)(t.agent_id),
|
|
138
|
+
name: (0, internal_1.str)(t.name),
|
|
139
|
+
description: (0, internal_1.str)(t.description),
|
|
140
|
+
triggerType: (0, internal_1.str)(t.trigger_type),
|
|
141
|
+
enabled: typeof t.enabled === 'boolean' ? t.enabled : undefined,
|
|
142
|
+
triggerCount: (0, internal_1.num)(t.trigger_count),
|
|
143
|
+
lastError: (0, internal_1.str)(t.last_error),
|
|
144
|
+
webhookUrl: webhookUrlFor(cfg, t),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** Lista os triggers do tenant (opcionalmente filtrando por agente/tipo/habilitados). */
|
|
148
|
+
async function listTriggers(cfg, params = {}) {
|
|
149
|
+
const qs = new URLSearchParams();
|
|
150
|
+
if (params.agentId)
|
|
151
|
+
qs.set('agentId', params.agentId);
|
|
152
|
+
if (params.triggerType)
|
|
153
|
+
qs.set('triggerType', params.triggerType);
|
|
154
|
+
if (params.enabledOnly)
|
|
155
|
+
qs.set('enabledOnly', 'true');
|
|
156
|
+
const query = qs.toString();
|
|
157
|
+
const path = `/api/triggers${query ? `?${query}` : ''}`;
|
|
158
|
+
const json = await requestJson(cfg, { method: 'GET', path, policy: 'idempotent', signal: params.signal });
|
|
159
|
+
const list = Array.isArray(json) ? json : Array.isArray((0, internal_1.rec)(json).data) ? (0, internal_1.rec)(json).data : [];
|
|
160
|
+
return list.map((t) => mapTriggerInfo(cfg, t));
|
|
161
|
+
}
|
|
162
|
+
/** Obtém um trigger pelo id (inclui webhookUrl para webhooks). */
|
|
163
|
+
async function getTrigger(cfg, params) {
|
|
164
|
+
if (!params.triggerId)
|
|
165
|
+
throw new errors_1.ZihinAgentError('config', 'triggerId is required.');
|
|
166
|
+
const json = await requestJson(cfg, {
|
|
167
|
+
method: 'GET',
|
|
168
|
+
path: `/api/triggers/${encodeURIComponent(params.triggerId)}`,
|
|
169
|
+
policy: 'idempotent',
|
|
170
|
+
signal: params.signal,
|
|
171
|
+
});
|
|
172
|
+
return mapTriggerInfo(cfg, (0, internal_1.rec)(json).data ?? json);
|
|
173
|
+
}
|
|
174
|
+
/** Remove um trigger. Requer key role admin/owner (editor NÃO pode deletar → 403). */
|
|
175
|
+
async function deleteTrigger(cfg, params) {
|
|
176
|
+
if (!params.triggerId)
|
|
177
|
+
throw new errors_1.ZihinAgentError('config', 'triggerId is required.');
|
|
178
|
+
const res = await (0, http_1.requestBuffered)({
|
|
179
|
+
method: 'DELETE',
|
|
180
|
+
url: `${cfg.baseUrl}/api/triggers/${encodeURIComponent(params.triggerId)}`,
|
|
181
|
+
headers: (0, http_1.buildHeaders)(cfg.apiKey),
|
|
182
|
+
timeoutMs: cfg.timeoutMs,
|
|
183
|
+
maxRetries: cfg.maxRetries,
|
|
184
|
+
policy: 'idempotent', // DELETE é idempotente
|
|
185
|
+
callerSignal: params.signal,
|
|
186
|
+
fetchImpl: cfg.fetchImpl,
|
|
187
|
+
onRetry: cfg.onRetry,
|
|
188
|
+
});
|
|
189
|
+
if (!res.ok) {
|
|
190
|
+
throw (0, errors_1.errorFromResponse)(res.status, (0, http_1.parseBody)(res.text), { endpoint: res.endpoint, attempts: res.attempts });
|
|
191
|
+
}
|
|
192
|
+
const j = (0, internal_1.rec)((0, http_1.parseBody)(res.text));
|
|
193
|
+
return { deleted: j.deleted === true || res.status === 200 };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Reaproveita um trigger existente do mesmo agente+nome, ou cria um novo. Evita o footgun de
|
|
197
|
+
* duplicação (o BE não tem unicidade de nome). Retorna `created: false` se reusou.
|
|
198
|
+
*
|
|
199
|
+
* Nota: se um trigger com o mesmo nome já existe mas com config diferente (ex.: outra callbackUrl),
|
|
200
|
+
* ele é REAPROVEITADO como está — atualize explicitamente com o BE se precisar reconciliar.
|
|
201
|
+
*/
|
|
202
|
+
async function findOrCreateTrigger(cfg, params) {
|
|
203
|
+
if (!params.agentId)
|
|
204
|
+
throw new errors_1.ZihinAgentError('config', 'agentId is required.');
|
|
205
|
+
if (!params.name)
|
|
206
|
+
throw new errors_1.ZihinAgentError('config', 'name is required.');
|
|
207
|
+
const existing = await listTriggers(cfg, { agentId: params.agentId, signal: params.signal });
|
|
208
|
+
const match = existing.find((t) => t.name === params.name);
|
|
209
|
+
if (match && match.id) {
|
|
210
|
+
const webhookUrl = match.webhookUrl ?? `${cfg.baseUrl}/api/triggers/webhook/${match.id}`;
|
|
211
|
+
return { triggerId: match.id, webhookUrl, created: false };
|
|
212
|
+
}
|
|
213
|
+
const ref = await createTrigger(cfg, params);
|
|
214
|
+
return { ...ref, created: true };
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Consulta o status/resultado de uma execução disparada por trigger.
|
|
218
|
+
* Útil para polling no modo async (alternativa ao callback).
|
|
219
|
+
*/
|
|
220
|
+
async function getExecution(cfg, params) {
|
|
221
|
+
if (!params.triggerId || !params.executionId) {
|
|
222
|
+
throw new errors_1.ZihinAgentError('config', 'triggerId and executionId are required.');
|
|
223
|
+
}
|
|
224
|
+
const path = `/api/triggers/${encodeURIComponent(params.triggerId)}/executions/${encodeURIComponent(params.executionId)}`;
|
|
225
|
+
const json = (0, internal_1.rec)(await requestJson(cfg, { method: 'GET', path, policy: 'idempotent', signal: params.signal }));
|
|
226
|
+
// O BE aninha sob o envelope `data`: { success, data: { execution, metrics } }.
|
|
227
|
+
const data = (0, internal_1.rec)(json.data);
|
|
228
|
+
const exec = (0, internal_1.rec)(data.execution ?? json.execution);
|
|
229
|
+
const metrics = (0, internal_1.rec)(data.metrics ?? json.metrics);
|
|
230
|
+
return {
|
|
231
|
+
executionId: (0, internal_1.str)(exec.id) ?? params.executionId,
|
|
232
|
+
status: (0, internal_1.str)(exec.status) ?? 'unknown',
|
|
233
|
+
startedAt: (0, internal_1.str)(exec.started_at),
|
|
234
|
+
finishedAt: (0, internal_1.str)(exec.finished_at),
|
|
235
|
+
executionTimeMs: (0, internal_1.num)(exec.execution_time_ms),
|
|
236
|
+
usage: (0, internal_1.parseUsage)(metrics.usage ?? metrics) ?? (0, internal_1.parseUsage)(exec.usage),
|
|
237
|
+
result: (0, internal_1.str)(exec.agent_response) ?? (0, internal_1.str)(exec.result),
|
|
238
|
+
raw: json,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../src/triggers.ts"],"names":[],"mappings":"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"}
|