@sensigo/realm-cli 0.1.0 → 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/dist/agent/providers/agent-utils.d.ts +2 -2
- package/dist/agent/providers/agent-utils.d.ts.map +1 -1
- package/dist/agent/providers/agent-utils.js +7 -4
- package/dist/agent/providers/agent-utils.js.map +1 -1
- package/dist/agent/providers/anthropic-provider.d.ts +3 -1
- package/dist/agent/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/agent/providers/anthropic-provider.js +15 -4
- package/dist/agent/providers/anthropic-provider.js.map +1 -1
- package/dist/agent/providers/llm-provider.d.ts +3 -1
- package/dist/agent/providers/llm-provider.d.ts.map +1 -1
- package/dist/agent/providers/llm-provider.js.map +1 -1
- package/dist/agent/providers/openai-provider.d.ts +3 -1
- package/dist/agent/providers/openai-provider.d.ts.map +1 -1
- package/dist/agent/providers/openai-provider.js +18 -4
- package/dist/agent/providers/openai-provider.js.map +1 -1
- package/dist/agent/providers/openai-reasoning-provider.d.ts +1 -1
- package/dist/agent/providers/openai-reasoning-provider.d.ts.map +1 -1
- package/dist/agent/providers/openai-reasoning-provider.js +2 -2
- package/dist/agent/providers/openai-reasoning-provider.js.map +1 -1
- package/dist/agent/run-agent.d.ts.map +1 -1
- package/dist/agent/run-agent.js +29 -2
- package/dist/agent/run-agent.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/dist/agent/agent-utils.d.ts +0 -27
- package/dist/agent/agent-utils.d.ts.map +0 -1
- package/dist/agent/agent-utils.js +0 -79
- package/dist/agent/agent-utils.js.map +0 -1
- package/dist/agent/anthropic-provider.d.ts +0 -23
- package/dist/agent/anthropic-provider.d.ts.map +0 -1
- package/dist/agent/anthropic-provider.js +0 -245
- package/dist/agent/anthropic-provider.js.map +0 -1
- package/dist/agent/gate-intent-interpreter.d.ts +0 -29
- package/dist/agent/gate-intent-interpreter.d.ts.map +0 -1
- package/dist/agent/gate-intent-interpreter.js +0 -33
- package/dist/agent/gate-intent-interpreter.js.map +0 -1
- package/dist/agent/llm-provider.d.ts +0 -46
- package/dist/agent/llm-provider.d.ts.map +0 -1
- package/dist/agent/llm-provider.js +0 -55
- package/dist/agent/llm-provider.js.map +0 -1
- package/dist/agent/mcp-client.d.ts +0 -18
- package/dist/agent/mcp-client.d.ts.map +0 -1
- package/dist/agent/mcp-client.js +0 -108
- package/dist/agent/mcp-client.js.map +0 -1
- package/dist/agent/mcp-types.d.ts +0 -40
- package/dist/agent/mcp-types.d.ts.map +0 -1
- package/dist/agent/mcp-types.js +0 -2
- package/dist/agent/mcp-types.js.map +0 -1
- package/dist/agent/openai-provider.d.ts +0 -30
- package/dist/agent/openai-provider.d.ts.map +0 -1
- package/dist/agent/openai-provider.js +0 -253
- package/dist/agent/openai-provider.js.map +0 -1
- package/dist/agent/openai-reasoning-provider.d.ts +0 -18
- package/dist/agent/openai-reasoning-provider.d.ts.map +0 -1
- package/dist/agent/openai-reasoning-provider.js +0 -76
- package/dist/agent/openai-reasoning-provider.js.map +0 -1
- package/dist/agent/slack-gate-notifier.d.ts +0 -80
- package/dist/agent/slack-gate-notifier.d.ts.map +0 -1
- package/dist/agent/slack-gate-notifier.js +0 -315
- package/dist/agent/slack-gate-notifier.js.map +0 -1
- package/dist/agent/slack-gate-poller.d.ts +0 -28
- package/dist/agent/slack-gate-poller.d.ts.map +0 -1
- package/dist/agent/slack-gate-poller.js +0 -66
- package/dist/agent/slack-gate-poller.js.map +0 -1
- package/dist/agent/slack-gate-server.d.ts +0 -30
- package/dist/agent/slack-gate-server.d.ts.map +0 -1
- package/dist/agent/slack-gate-server.js +0 -99
- package/dist/agent/slack-gate-server.js.map +0 -1
- package/dist/agent/slack-socket-client.d.ts +0 -20
- package/dist/agent/slack-socket-client.d.ts.map +0 -1
- package/dist/agent/slack-socket-client.js +0 -141
- package/dist/agent/slack-socket-client.js.map +0 -1
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// slack-gate-server.ts — Minimal HTTP server for Slack Events API callbacks.
|
|
2
|
-
// Handles POST /slack/events with HMAC-SHA256 signature verification.
|
|
3
|
-
import { createServer } from 'node:http';
|
|
4
|
-
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
5
|
-
/**
|
|
6
|
-
* Starts a local HTTP server that receives Slack Events API callbacks.
|
|
7
|
-
* Verifies request signatures before processing any payload.
|
|
8
|
-
* Returns a handle to close the server.
|
|
9
|
-
*/
|
|
10
|
-
export function startSlackGateServer(options) {
|
|
11
|
-
const { port, signingSecret, onEvent } = options;
|
|
12
|
-
const server = createServer((req, res) => {
|
|
13
|
-
if (req.method !== 'POST' || req.url !== '/slack/events') {
|
|
14
|
-
res.writeHead(404);
|
|
15
|
-
res.end();
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const chunks = [];
|
|
19
|
-
req.on('data', (chunk) => chunks.push(chunk));
|
|
20
|
-
req.on('end', () => {
|
|
21
|
-
const rawBody = Buffer.concat(chunks).toString('utf8');
|
|
22
|
-
const timestamp = req.headers['x-slack-request-timestamp'];
|
|
23
|
-
const signature = req.headers['x-slack-signature'];
|
|
24
|
-
if (typeof timestamp !== 'string' || typeof signature !== 'string') {
|
|
25
|
-
res.writeHead(403);
|
|
26
|
-
res.end('Missing Slack signature headers');
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
// Reject stale requests before performing HMAC — prevents replay attacks.
|
|
30
|
-
const requestTime = parseInt(timestamp, 10);
|
|
31
|
-
if (isNaN(requestTime)) {
|
|
32
|
-
res.writeHead(400);
|
|
33
|
-
res.end('Invalid timestamp');
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const nowSec = Math.floor(Date.now() / 1000);
|
|
37
|
-
if (Math.abs(nowSec - requestTime) > 300) {
|
|
38
|
-
res.writeHead(403);
|
|
39
|
-
res.end('Stale request');
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
// Verify HMAC-SHA256 signature using timing-safe comparison.
|
|
43
|
-
const baseString = `v0:${timestamp}:${rawBody}`;
|
|
44
|
-
const expected = 'v0=' + createHmac('sha256', signingSecret).update(baseString).digest('hex');
|
|
45
|
-
const expectedBuf = Buffer.from(expected, 'utf8');
|
|
46
|
-
const receivedBuf = Buffer.from(signature, 'utf8');
|
|
47
|
-
const signaturesMatch = expectedBuf.length === receivedBuf.length && timingSafeEqual(expectedBuf, receivedBuf);
|
|
48
|
-
if (!signaturesMatch) {
|
|
49
|
-
res.writeHead(403);
|
|
50
|
-
res.end('Invalid signature');
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
// Parse the verified payload.
|
|
54
|
-
let payload;
|
|
55
|
-
try {
|
|
56
|
-
payload = JSON.parse(rawBody);
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
res.writeHead(400);
|
|
60
|
-
res.end('Invalid JSON');
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
// Handle Slack URL verification challenge.
|
|
64
|
-
if (payload['type'] === 'url_verification') {
|
|
65
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
66
|
-
res.end(JSON.stringify({ challenge: payload['challenge'] }));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
// Acknowledge immediately — Slack requires a response within 3 seconds.
|
|
70
|
-
res.writeHead(200);
|
|
71
|
-
res.end();
|
|
72
|
-
if (payload['type'] !== 'event_callback')
|
|
73
|
-
return;
|
|
74
|
-
const event = payload['event'];
|
|
75
|
-
if (event === undefined)
|
|
76
|
-
return;
|
|
77
|
-
if (event['type'] !== 'message')
|
|
78
|
-
return;
|
|
79
|
-
// Filter bot messages — only route human replies.
|
|
80
|
-
if (event['subtype'] === 'bot_message' || event['bot_id'] !== undefined)
|
|
81
|
-
return;
|
|
82
|
-
const threadTs = event['thread_ts'];
|
|
83
|
-
const user = event['user'];
|
|
84
|
-
const text = event['text'];
|
|
85
|
-
const ts = event['ts'];
|
|
86
|
-
const eventId = payload['event_id'];
|
|
87
|
-
if (!threadTs || !user || !text || !ts || !eventId)
|
|
88
|
-
return;
|
|
89
|
-
onEvent({ event_id: eventId, thread_ts: threadTs, user, text, ts });
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
server.listen(port);
|
|
93
|
-
return {
|
|
94
|
-
close() {
|
|
95
|
-
server.close();
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=slack-gate-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack-gate-server.js","sourceRoot":"","sources":["../../src/agent/slack-gate-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { SlackGateEvent } from './slack-gate-server.js';
|
|
2
|
-
export interface SlackSocketConfig {
|
|
3
|
-
/** SLACK_APP_TOKEN — App-level token (starts with xapp-). */
|
|
4
|
-
appToken: string;
|
|
5
|
-
/** Gate thread timestamp — only events in this thread are forwarded to onEvent. */
|
|
6
|
-
threadTs: string;
|
|
7
|
-
/** Called for each valid human message in the gate thread. */
|
|
8
|
-
onEvent: (event: SlackGateEvent) => void;
|
|
9
|
-
/** When aborted, the connection is closed and no reconnects are attempted. */
|
|
10
|
-
signal?: AbortSignal;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Opens a Slack Socket Mode WebSocket connection and begins delivering gate thread events.
|
|
14
|
-
* Handles reconnection transparently on drops or Slack-requested refreshes.
|
|
15
|
-
* Returns a handle to close the connection immediately.
|
|
16
|
-
*/
|
|
17
|
-
export declare function connectSocketMode(config: SlackSocketConfig): {
|
|
18
|
-
close(): void;
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=slack-socket-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack-socket-client.d.ts","sourceRoot":"","sources":["../../src/agent/slack-socket-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACzC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAAE,KAAK,IAAI,IAAI,CAAA;CAAE,CAoJ9E"}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Opens a Slack Socket Mode WebSocket connection and begins delivering gate thread events.
|
|
3
|
-
* Handles reconnection transparently on drops or Slack-requested refreshes.
|
|
4
|
-
* Returns a handle to close the connection immediately.
|
|
5
|
-
*/
|
|
6
|
-
export function connectSocketMode(config) {
|
|
7
|
-
const { appToken, threadTs, onEvent, signal } = config;
|
|
8
|
-
let stopped = false;
|
|
9
|
-
let currentWs;
|
|
10
|
-
let backoffMs = 1000;
|
|
11
|
-
const stop = () => {
|
|
12
|
-
stopped = true;
|
|
13
|
-
currentWs?.close();
|
|
14
|
-
};
|
|
15
|
-
const connect = async () => {
|
|
16
|
-
if (stopped || signal?.aborted)
|
|
17
|
-
return;
|
|
18
|
-
// Step 1 — obtain the WebSocket URL from Slack.
|
|
19
|
-
let wsUrl;
|
|
20
|
-
try {
|
|
21
|
-
const response = await fetch('https://slack.com/api/apps.connections.open', {
|
|
22
|
-
method: 'POST',
|
|
23
|
-
headers: {
|
|
24
|
-
'Content-Type': 'application/json',
|
|
25
|
-
Authorization: `Bearer ${appToken}`,
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
const data = (await response.json());
|
|
29
|
-
if (!data.ok || data.url === undefined) {
|
|
30
|
-
const delay = backoffMs;
|
|
31
|
-
backoffMs = Math.min(backoffMs * 2, 30_000);
|
|
32
|
-
console.warn(` ⚠ Socket Mode: apps.connections.open failed (${data.error ?? 'unknown'}) — retrying in ${delay}ms.`);
|
|
33
|
-
setTimeout(() => {
|
|
34
|
-
if (!stopped && !signal?.aborted) {
|
|
35
|
-
void connect();
|
|
36
|
-
}
|
|
37
|
-
}, delay);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
wsUrl = data.url;
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
const delay = backoffMs;
|
|
44
|
-
backoffMs = Math.min(backoffMs * 2, 30_000);
|
|
45
|
-
console.warn(` ⚠ Socket Mode: failed to obtain WebSocket URL — ${err instanceof Error ? err.message : String(err)}. Retrying in ${delay}ms.`);
|
|
46
|
-
setTimeout(() => {
|
|
47
|
-
if (!stopped && !signal?.aborted) {
|
|
48
|
-
void connect();
|
|
49
|
-
}
|
|
50
|
-
}, delay);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (stopped || signal?.aborted)
|
|
54
|
-
return;
|
|
55
|
-
// Step 2 — open the WebSocket connection.
|
|
56
|
-
const ws = new WebSocket(wsUrl);
|
|
57
|
-
currentWs = ws;
|
|
58
|
-
// Tracks deliberate closes (disconnect message) to skip backoff on the close event.
|
|
59
|
-
let intentionalClose = false;
|
|
60
|
-
ws.addEventListener('message', (event) => {
|
|
61
|
-
// A successful message indicates a live connection — reset backoff.
|
|
62
|
-
backoffMs = 1000;
|
|
63
|
-
let msg;
|
|
64
|
-
try {
|
|
65
|
-
msg = JSON.parse(event.data);
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const type = msg['type'];
|
|
71
|
-
if (type === 'hello') {
|
|
72
|
-
console.log(' ℹ Socket Mode connected.');
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Slack requesting a reconnect — close and reconnect immediately, no backoff.
|
|
76
|
-
if (type === 'disconnect') {
|
|
77
|
-
intentionalClose = true;
|
|
78
|
-
ws.close();
|
|
79
|
-
if (!stopped && !signal?.aborted) {
|
|
80
|
-
void connect();
|
|
81
|
-
}
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
if (type === 'events_api') {
|
|
85
|
-
const envelopeId = msg['envelope_id'];
|
|
86
|
-
// ACK immediately (within 3 s as required by Slack).
|
|
87
|
-
if (envelopeId !== undefined) {
|
|
88
|
-
ws.send(JSON.stringify({ envelope_id: envelopeId }));
|
|
89
|
-
}
|
|
90
|
-
const payload = msg['payload'];
|
|
91
|
-
if (payload === undefined)
|
|
92
|
-
return;
|
|
93
|
-
const msgEvent = payload['event'];
|
|
94
|
-
if (msgEvent === undefined)
|
|
95
|
-
return;
|
|
96
|
-
// Use envelope_id as the dedup event_id (outer envelope is the authoritative key).
|
|
97
|
-
const eventId = envelopeId ?? payload['event_id'];
|
|
98
|
-
if (!eventId)
|
|
99
|
-
return;
|
|
100
|
-
// Apply all required filters before forwarding to onEvent.
|
|
101
|
-
if (msgEvent['type'] !== 'message')
|
|
102
|
-
return;
|
|
103
|
-
if (msgEvent['bot_id'] !== undefined)
|
|
104
|
-
return;
|
|
105
|
-
if (msgEvent['subtype'] === 'bot_message')
|
|
106
|
-
return;
|
|
107
|
-
if (msgEvent['thread_ts'] !== threadTs)
|
|
108
|
-
return;
|
|
109
|
-
const user = msgEvent['user'];
|
|
110
|
-
if (!user)
|
|
111
|
-
return;
|
|
112
|
-
const text = msgEvent['text'];
|
|
113
|
-
if (!text)
|
|
114
|
-
return;
|
|
115
|
-
const ts = msgEvent['ts'];
|
|
116
|
-
if (!ts)
|
|
117
|
-
return;
|
|
118
|
-
onEvent({ event_id: eventId, thread_ts: threadTs, user, text, ts });
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
ws.addEventListener('close', () => {
|
|
122
|
-
if (stopped || signal?.aborted || intentionalClose)
|
|
123
|
-
return;
|
|
124
|
-
// Unexpected close — reconnect with exponential backoff (max 30 s).
|
|
125
|
-
const delay = backoffMs;
|
|
126
|
-
backoffMs = Math.min(backoffMs * 2, 30_000);
|
|
127
|
-
setTimeout(() => {
|
|
128
|
-
if (!stopped && !signal?.aborted) {
|
|
129
|
-
void connect();
|
|
130
|
-
}
|
|
131
|
-
}, delay);
|
|
132
|
-
});
|
|
133
|
-
signal?.addEventListener('abort', () => {
|
|
134
|
-
stopped = true;
|
|
135
|
-
ws.close();
|
|
136
|
-
}, { once: true });
|
|
137
|
-
};
|
|
138
|
-
void connect();
|
|
139
|
-
return { close: stop };
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=slack-socket-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slack-socket-client.js","sourceRoot":"","sources":["../../src/agent/slack-socket-client.ts"],"names":[],"mappings":"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"}
|