@heysummon/consumer-sdk 0.1.1
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/cli.d.ts +14 -0
- package/dist/cli.js +589 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +37 -0
- package/dist/client.js +80 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto.d.ts +41 -0
- package/dist/crypto.js +122 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/poller.d.ts +28 -0
- package/dist/poller.js +57 -0
- package/dist/poller.js.map +1 -0
- package/dist/provider-store.d.ts +25 -0
- package/dist/provider-store.js +73 -0
- package/dist/provider-store.js.map +1 -0
- package/dist/request-tracker.d.ts +22 -0
- package/dist/request-tracker.js +66 -0
- package/dist/request-tracker.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -0
- package/src/cli.ts +683 -0
- package/src/client.ts +117 -0
- package/src/crypto.ts +205 -0
- package/src/index.ts +23 -0
- package/src/poller.ts +72 -0
- package/src/provider-store.ts +88 -0
- package/src/request-tracker.ts +72 -0
- package/src/types.ts +92 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HeySummon Consumer SDK CLI
|
|
4
|
+
*
|
|
5
|
+
* Shared CLI entry point used by both Claude Code and OpenClaw skill scripts.
|
|
6
|
+
* Subcommands: submit, submit-and-poll, add-provider, list-providers,
|
|
7
|
+
* check-status, watch, keygen
|
|
8
|
+
*
|
|
9
|
+
* All config comes from environment variables (set by the calling bash wrapper):
|
|
10
|
+
* HEYSUMMON_BASE_URL, HEYSUMMON_API_KEY, HEYSUMMON_PROVIDERS_FILE,
|
|
11
|
+
* HEYSUMMON_KEY_DIR, HEYSUMMON_REQUESTS_DIR, HEYSUMMON_TIMEOUT,
|
|
12
|
+
* HEYSUMMON_POLL_INTERVAL
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HeySummon Consumer SDK CLI
|
|
4
|
+
*
|
|
5
|
+
* Shared CLI entry point used by both Claude Code and OpenClaw skill scripts.
|
|
6
|
+
* Subcommands: submit, submit-and-poll, add-provider, list-providers,
|
|
7
|
+
* check-status, watch, keygen
|
|
8
|
+
*
|
|
9
|
+
* All config comes from environment variables (set by the calling bash wrapper):
|
|
10
|
+
* HEYSUMMON_BASE_URL, HEYSUMMON_API_KEY, HEYSUMMON_PROVIDERS_FILE,
|
|
11
|
+
* HEYSUMMON_KEY_DIR, HEYSUMMON_REQUESTS_DIR, HEYSUMMON_TIMEOUT,
|
|
12
|
+
* HEYSUMMON_POLL_INTERVAL
|
|
13
|
+
*/
|
|
14
|
+
import { HeySummonClient, HeySummonHttpError } from "./client.js";
|
|
15
|
+
import { ProviderStore } from "./provider-store.js";
|
|
16
|
+
import { RequestTracker } from "./request-tracker.js";
|
|
17
|
+
import { generateEphemeralKeys, generatePersistentKeys, loadPublicKeys, } from "./crypto.js";
|
|
18
|
+
import { execSync } from "node:child_process";
|
|
19
|
+
import { existsSync } from "node:fs";
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Arg parsing helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
function getArg(args, flag) {
|
|
24
|
+
const idx = args.indexOf(flag);
|
|
25
|
+
if (idx === -1 || idx + 1 >= args.length)
|
|
26
|
+
return undefined;
|
|
27
|
+
return args[idx + 1];
|
|
28
|
+
}
|
|
29
|
+
function requireEnv(name) {
|
|
30
|
+
const val = process.env[name];
|
|
31
|
+
if (!val) {
|
|
32
|
+
process.stderr.write(`Missing required env var: ${name}\n`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
return val;
|
|
36
|
+
}
|
|
37
|
+
function optEnv(name, fallback) {
|
|
38
|
+
return process.env[name] || fallback;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Commands
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
async function cmdSubmit(args) {
|
|
44
|
+
const question = getArg(args, "--question");
|
|
45
|
+
if (!question) {
|
|
46
|
+
process.stderr.write("Usage: cli submit --question <q> [--provider <name>] [--context <json>]\n");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const providerArg = getArg(args, "--provider");
|
|
50
|
+
const contextArg = getArg(args, "--context");
|
|
51
|
+
const baseUrl = requireEnv("HEYSUMMON_BASE_URL");
|
|
52
|
+
const providersFile = optEnv("HEYSUMMON_PROVIDERS_FILE", "");
|
|
53
|
+
const keyDir = optEnv("HEYSUMMON_KEY_DIR", "");
|
|
54
|
+
const requestsDir = optEnv("HEYSUMMON_REQUESTS_DIR", "");
|
|
55
|
+
// Resolve API key from provider store or env
|
|
56
|
+
let apiKey = process.env.HEYSUMMON_API_KEY || "";
|
|
57
|
+
let resolvedProvider = "";
|
|
58
|
+
if (providersFile && existsSync(providersFile)) {
|
|
59
|
+
const store = new ProviderStore(providersFile);
|
|
60
|
+
if (providerArg) {
|
|
61
|
+
const match = store.findByName(providerArg);
|
|
62
|
+
if (match) {
|
|
63
|
+
apiKey = match.apiKey;
|
|
64
|
+
resolvedProvider = match.name;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
process.stderr.write(`Provider '${providerArg}' not found.\n`);
|
|
68
|
+
const all = store.load();
|
|
69
|
+
if (all.length) {
|
|
70
|
+
process.stderr.write("Available:\n");
|
|
71
|
+
for (const p of all) {
|
|
72
|
+
process.stderr.write(` - ${p.name} (${p.providerName})\n`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (!apiKey) {
|
|
79
|
+
const def = store.getDefault();
|
|
80
|
+
if (def) {
|
|
81
|
+
apiKey = def.apiKey;
|
|
82
|
+
resolvedProvider = def.name;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!apiKey) {
|
|
87
|
+
process.stderr.write("No API key. Set HEYSUMMON_API_KEY or register a provider.\n");
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Generate or load keys
|
|
91
|
+
let signPublicKey;
|
|
92
|
+
let encryptPublicKey;
|
|
93
|
+
if (keyDir && existsSync(`${keyDir}/sign_public.pem`)) {
|
|
94
|
+
const keys = loadPublicKeys(keyDir);
|
|
95
|
+
signPublicKey = keys.signPublicKey;
|
|
96
|
+
encryptPublicKey = keys.encryptPublicKey;
|
|
97
|
+
}
|
|
98
|
+
else if (keyDir) {
|
|
99
|
+
process.stderr.write(`Generating keypairs in ${keyDir}...\n`);
|
|
100
|
+
const keys = generatePersistentKeys(keyDir);
|
|
101
|
+
signPublicKey = keys.signPublicKey;
|
|
102
|
+
encryptPublicKey = keys.encryptPublicKey;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const keys = generateEphemeralKeys();
|
|
106
|
+
signPublicKey = keys.signPublicKey;
|
|
107
|
+
encryptPublicKey = keys.encryptPublicKey;
|
|
108
|
+
}
|
|
109
|
+
// Parse context messages
|
|
110
|
+
let messages = [];
|
|
111
|
+
if (contextArg) {
|
|
112
|
+
try {
|
|
113
|
+
messages = JSON.parse(contextArg);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// ignore parse errors
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const client = new HeySummonClient({ baseUrl, apiKey });
|
|
120
|
+
if (resolvedProvider) {
|
|
121
|
+
process.stderr.write(`Provider: ${resolvedProvider}\n`);
|
|
122
|
+
}
|
|
123
|
+
const result = await client.submitRequest({
|
|
124
|
+
question,
|
|
125
|
+
messages: messages.length > 0 ? messages : undefined,
|
|
126
|
+
signPublicKey,
|
|
127
|
+
encryptPublicKey,
|
|
128
|
+
providerName: providerArg || undefined,
|
|
129
|
+
});
|
|
130
|
+
if (!result.requestId) {
|
|
131
|
+
process.stderr.write(`Request failed: ${JSON.stringify(result)}\n`);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
// Track request
|
|
135
|
+
if (requestsDir) {
|
|
136
|
+
const tracker = new RequestTracker(requestsDir);
|
|
137
|
+
tracker.track(result.requestId, result.refCode, resolvedProvider || undefined);
|
|
138
|
+
}
|
|
139
|
+
// Sync provider name
|
|
140
|
+
if (providersFile && existsSync(providersFile) && apiKey) {
|
|
141
|
+
try {
|
|
142
|
+
const whoami = await client.whoami();
|
|
143
|
+
const pName = whoami.provider?.name || "";
|
|
144
|
+
if (pName) {
|
|
145
|
+
const store = new ProviderStore(providersFile);
|
|
146
|
+
const entry = store.findByKey(apiKey);
|
|
147
|
+
if (entry && entry.providerName !== pName) {
|
|
148
|
+
store.add({ ...entry, providerName: pName });
|
|
149
|
+
process.stderr.write(`Provider name updated: ${pName}\n`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// non-fatal
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Output result as JSON
|
|
158
|
+
process.stdout.write(JSON.stringify(result) + "\n");
|
|
159
|
+
}
|
|
160
|
+
async function cmdSubmitAndPoll(args) {
|
|
161
|
+
const question = getArg(args, "--question");
|
|
162
|
+
if (!question) {
|
|
163
|
+
process.stderr.write("Usage: cli submit-and-poll --question <q> [--provider <name>] [--context <json>]\n");
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
const providerArg = getArg(args, "--provider");
|
|
167
|
+
const contextArg = getArg(args, "--context");
|
|
168
|
+
const baseUrl = requireEnv("HEYSUMMON_BASE_URL");
|
|
169
|
+
const timeout = parseInt(optEnv("HEYSUMMON_TIMEOUT", "900"), 10);
|
|
170
|
+
const pollInterval = parseInt(optEnv("HEYSUMMON_POLL_INTERVAL", "3"), 10);
|
|
171
|
+
const providersFile = optEnv("HEYSUMMON_PROVIDERS_FILE", "");
|
|
172
|
+
// Resolve API key
|
|
173
|
+
let apiKey = process.env.HEYSUMMON_API_KEY || "";
|
|
174
|
+
let resolvedProvider = "";
|
|
175
|
+
if (providersFile && existsSync(providersFile)) {
|
|
176
|
+
const store = new ProviderStore(providersFile);
|
|
177
|
+
if (providerArg) {
|
|
178
|
+
const match = store.findByName(providerArg);
|
|
179
|
+
if (match) {
|
|
180
|
+
apiKey = match.apiKey;
|
|
181
|
+
resolvedProvider = match.name;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
process.stderr.write(`Provider '${providerArg}' not found.\n`);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else if (!apiKey) {
|
|
189
|
+
const def = store.getDefault();
|
|
190
|
+
if (def) {
|
|
191
|
+
apiKey = def.apiKey;
|
|
192
|
+
resolvedProvider = def.name;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (!apiKey) {
|
|
197
|
+
process.stderr.write("No API key. Set HEYSUMMON_API_KEY or register a provider.\n");
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
// Generate ephemeral keys (Claude Code style — no persistence needed)
|
|
201
|
+
const keys = generateEphemeralKeys();
|
|
202
|
+
const client = new HeySummonClient({ baseUrl, apiKey });
|
|
203
|
+
process.stderr.write("HeySummon: Submitting request to human...\n");
|
|
204
|
+
// Parse context
|
|
205
|
+
let messages = [];
|
|
206
|
+
if (contextArg) {
|
|
207
|
+
try {
|
|
208
|
+
messages = JSON.parse(contextArg);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// ignore
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const result = await client.submitRequest({
|
|
215
|
+
question,
|
|
216
|
+
messages: messages.length > 0 ? messages : undefined,
|
|
217
|
+
signPublicKey: keys.signPublicKey,
|
|
218
|
+
encryptPublicKey: keys.encryptPublicKey,
|
|
219
|
+
providerName: providerArg || undefined,
|
|
220
|
+
});
|
|
221
|
+
if (result.providerUnavailable) {
|
|
222
|
+
const next = result.nextAvailableAt
|
|
223
|
+
? ` (available at ${new Date(result.nextAvailableAt).toLocaleTimeString()})`
|
|
224
|
+
: "";
|
|
225
|
+
process.stderr.write(`Provider currently unavailable${next} — request queued, waiting for response...\n`);
|
|
226
|
+
}
|
|
227
|
+
if (!result.requestId) {
|
|
228
|
+
process.stderr.write(`Failed to submit request: ${JSON.stringify(result)}\n`);
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
const ref = result.refCode || result.requestId;
|
|
232
|
+
process.stderr.write(`Request submitted [${ref}] — waiting for human response...\n`);
|
|
233
|
+
process.stderr.write(` (timeout: ${timeout}s, polling every ${pollInterval}s)\n`);
|
|
234
|
+
// Polling loop
|
|
235
|
+
let elapsed = 0;
|
|
236
|
+
while (elapsed < timeout) {
|
|
237
|
+
await sleep(pollInterval * 1000);
|
|
238
|
+
elapsed += pollInterval;
|
|
239
|
+
try {
|
|
240
|
+
// Check status endpoint
|
|
241
|
+
const status = await client.getRequestStatus(result.requestId);
|
|
242
|
+
if ((status.status === "responded" || status.status === "closed") &&
|
|
243
|
+
status.response) {
|
|
244
|
+
process.stderr.write(`\nHuman responded [${ref}]\n`);
|
|
245
|
+
process.stdout.write(status.response + "\n");
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// Fallback: check messages for plaintext replies
|
|
249
|
+
const { messages: msgs } = await client.getMessages(result.requestId);
|
|
250
|
+
const providerMsg = msgs.filter((m) => m.from === "provider").pop();
|
|
251
|
+
if (providerMsg) {
|
|
252
|
+
if (providerMsg.plaintext) {
|
|
253
|
+
process.stderr.write(`\nHuman responded [${ref}]\n`);
|
|
254
|
+
process.stdout.write(providerMsg.plaintext + "\n");
|
|
255
|
+
await client.ackEvent(result.requestId).catch(() => { });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (providerMsg.ciphertext) {
|
|
259
|
+
process.stderr.write(`\nHuman responded [${ref}]\n`);
|
|
260
|
+
process.stdout.write("(encrypted response received)\n");
|
|
261
|
+
await client.ackEvent(result.requestId).catch(() => { });
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// polling error, continue
|
|
268
|
+
}
|
|
269
|
+
// Progress indicator
|
|
270
|
+
if (elapsed % 30 === 0) {
|
|
271
|
+
process.stderr.write(` Still waiting... (${elapsed}s elapsed)\n`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
process.stderr.write(`\nTimeout after ${timeout}s — no response received.\n`);
|
|
275
|
+
process.stderr.write(` Request ref: ${ref}\n`);
|
|
276
|
+
process.stdout.write(`TIMEOUT: No response received after ${timeout}s for request ${ref}. The provider may still respond later.\n`);
|
|
277
|
+
}
|
|
278
|
+
async function cmdAddProvider(args) {
|
|
279
|
+
const key = getArg(args, "--key");
|
|
280
|
+
const alias = getArg(args, "--alias");
|
|
281
|
+
if (!key) {
|
|
282
|
+
process.stderr.write("Usage: cli add-provider --key <api-key> [--alias <name>]\n");
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
// Validate key prefix
|
|
286
|
+
if (key.startsWith("hs_prov_") || key.startsWith("htl_prov_")) {
|
|
287
|
+
process.stderr.write("This is a provider key. Use a CLIENT key (hs_cli_... or htl_...).\n");
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
if (!key.startsWith("hs_cli_") && !key.startsWith("htl_")) {
|
|
291
|
+
process.stderr.write("Invalid key format. Must start with 'hs_cli_' or 'htl_'.\n");
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
const baseUrl = requireEnv("HEYSUMMON_BASE_URL");
|
|
295
|
+
const providersFile = requireEnv("HEYSUMMON_PROVIDERS_FILE");
|
|
296
|
+
const client = new HeySummonClient({ baseUrl, apiKey: key });
|
|
297
|
+
const whoami = await client.whoami();
|
|
298
|
+
const providerName = whoami.provider?.name || "";
|
|
299
|
+
const providerId = whoami.provider?.id || "";
|
|
300
|
+
if (!providerName) {
|
|
301
|
+
process.stderr.write("Could not fetch provider info. Is the key valid?\n");
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
const name = alias || providerName;
|
|
305
|
+
const store = new ProviderStore(providersFile);
|
|
306
|
+
store.add({
|
|
307
|
+
name,
|
|
308
|
+
apiKey: key,
|
|
309
|
+
providerId,
|
|
310
|
+
providerName,
|
|
311
|
+
});
|
|
312
|
+
const count = store.load().length;
|
|
313
|
+
process.stdout.write(`Provider added: ${name} (${providerName})\n`);
|
|
314
|
+
process.stdout.write(`Providers registered: ${count}\n`);
|
|
315
|
+
}
|
|
316
|
+
async function cmdListProviders() {
|
|
317
|
+
const providersFile = optEnv("HEYSUMMON_PROVIDERS_FILE", "");
|
|
318
|
+
if (!providersFile || !existsSync(providersFile)) {
|
|
319
|
+
process.stdout.write("No providers registered yet.\n");
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const store = new ProviderStore(providersFile);
|
|
323
|
+
const providers = store.load();
|
|
324
|
+
if (providers.length === 0) {
|
|
325
|
+
process.stdout.write("No providers registered yet.\n");
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
process.stdout.write(`Registered providers (${providers.length}):\n`);
|
|
329
|
+
for (let i = 0; i < providers.length; i++) {
|
|
330
|
+
const p = providers[i];
|
|
331
|
+
const nameExtra = p.providerName !== p.name ? ` (provider: ${p.providerName})` : "";
|
|
332
|
+
process.stdout.write(` ${i + 1}. ${p.name}${nameExtra} — key: ${p.apiKey.slice(0, 12)}...\n`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
async function cmdCheckStatus(args) {
|
|
336
|
+
const ref = getArg(args, "--ref") || args[args.indexOf("check-status") + 1];
|
|
337
|
+
if (!ref) {
|
|
338
|
+
process.stderr.write("Usage: cli check-status --ref <refCode|requestId>\n");
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
const baseUrl = requireEnv("HEYSUMMON_BASE_URL");
|
|
342
|
+
const apiKey = requireEnv("HEYSUMMON_API_KEY");
|
|
343
|
+
const client = new HeySummonClient({ baseUrl, apiKey });
|
|
344
|
+
try {
|
|
345
|
+
const data = await client.getRequestStatus(ref);
|
|
346
|
+
const icons = {
|
|
347
|
+
pending: "⏳",
|
|
348
|
+
responded: "✅",
|
|
349
|
+
resolved: "✅",
|
|
350
|
+
expired: "⏰",
|
|
351
|
+
cancelled: "❌",
|
|
352
|
+
};
|
|
353
|
+
const status = data.status || "unknown";
|
|
354
|
+
process.stdout.write(`${icons[status] || "•"} Status: ${status}\n`);
|
|
355
|
+
if (data.refCode)
|
|
356
|
+
process.stdout.write(` Ref: ${data.refCode}\n`);
|
|
357
|
+
if (data.response || data.lastMessage) {
|
|
358
|
+
process.stdout.write(` Response: ${data.response || data.lastMessage}\n`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
363
|
+
process.exit(1);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
async function cmdWatch(args) {
|
|
367
|
+
const notifyScript = getArg(args, "--notify-script");
|
|
368
|
+
const baseUrl = requireEnv("HEYSUMMON_BASE_URL");
|
|
369
|
+
const providersFile = requireEnv("HEYSUMMON_PROVIDERS_FILE");
|
|
370
|
+
const requestsDir = optEnv("HEYSUMMON_REQUESTS_DIR", "");
|
|
371
|
+
const pollInterval = parseInt(optEnv("HEYSUMMON_POLL_INTERVAL", "5"), 10);
|
|
372
|
+
const store = new ProviderStore(providersFile);
|
|
373
|
+
const tracker = requestsDir ? new RequestTracker(requestsDir) : null;
|
|
374
|
+
// In-memory dedup set
|
|
375
|
+
const seen = new Set();
|
|
376
|
+
// Track persistent auth errors per provider — auto-shutdown after 30 min
|
|
377
|
+
const AUTH_SHUTDOWN_MS = 30 * 60 * 1000; // 30 minutes
|
|
378
|
+
const authErrors = new Map();
|
|
379
|
+
process.stderr.write(`Platform watcher started (pid ${process.pid})\n`);
|
|
380
|
+
process.stderr.write(` Polling every ${pollInterval}s\n`);
|
|
381
|
+
// Write PID file for signaling
|
|
382
|
+
if (requestsDir) {
|
|
383
|
+
const { writeFileSync } = await import("node:fs");
|
|
384
|
+
const { join } = await import("node:path");
|
|
385
|
+
writeFileSync(join(requestsDir, ".watcher.pid"), String(process.pid));
|
|
386
|
+
}
|
|
387
|
+
while (true) {
|
|
388
|
+
const providers = store.load();
|
|
389
|
+
if (providers.length === 0) {
|
|
390
|
+
process.stderr.write("No providers registered.\n");
|
|
391
|
+
await sleep(pollInterval * 1000);
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
for (const provider of providers) {
|
|
395
|
+
try {
|
|
396
|
+
const client = new HeySummonClient({
|
|
397
|
+
baseUrl,
|
|
398
|
+
apiKey: provider.apiKey,
|
|
399
|
+
});
|
|
400
|
+
const { events } = await client.getPendingEvents();
|
|
401
|
+
for (const event of events) {
|
|
402
|
+
const from = event.from || "unknown";
|
|
403
|
+
const dedupKey = `${event.type}:${from}:${event.requestId}`;
|
|
404
|
+
// Stale check (>30 min)
|
|
405
|
+
if (event.createdAt) {
|
|
406
|
+
const age = (Date.now() - new Date(event.createdAt).getTime()) / 1000 / 60;
|
|
407
|
+
if (age > 30) {
|
|
408
|
+
seen.add(dedupKey);
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (seen.has(dedupKey))
|
|
413
|
+
continue;
|
|
414
|
+
seen.add(dedupKey);
|
|
415
|
+
// Fetch response text for provider messages
|
|
416
|
+
let responseText = "";
|
|
417
|
+
if (event.type === "new_message" &&
|
|
418
|
+
event.from === "provider" &&
|
|
419
|
+
event.requestId) {
|
|
420
|
+
try {
|
|
421
|
+
const { messages } = await client.getMessages(event.requestId);
|
|
422
|
+
const last = messages
|
|
423
|
+
.filter((m) => m.from === "provider")
|
|
424
|
+
.pop();
|
|
425
|
+
if (last?.plaintext) {
|
|
426
|
+
responseText = last.plaintext;
|
|
427
|
+
}
|
|
428
|
+
else if (last?.ciphertext) {
|
|
429
|
+
responseText = "(encrypted)";
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
// non-fatal
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// Build notification
|
|
437
|
+
const fileRef = tracker?.getRefCode(event.requestId) || "";
|
|
438
|
+
const ref = event.refCode || fileRef || event.requestId || "?";
|
|
439
|
+
let msg = "";
|
|
440
|
+
switch (event.type) {
|
|
441
|
+
case "keys_exchanged":
|
|
442
|
+
msg = `Key exchange completed for ${ref} — provider connected`;
|
|
443
|
+
break;
|
|
444
|
+
case "new_message":
|
|
445
|
+
if (event.from === "provider") {
|
|
446
|
+
msg = `New response from provider for ${ref}`;
|
|
447
|
+
if (responseText)
|
|
448
|
+
msg += `\n${responseText}`;
|
|
449
|
+
}
|
|
450
|
+
break;
|
|
451
|
+
case "responded":
|
|
452
|
+
msg = `Provider responded to ${ref}`;
|
|
453
|
+
break;
|
|
454
|
+
case "closed":
|
|
455
|
+
msg = `Conversation ${ref} closed`;
|
|
456
|
+
if (tracker)
|
|
457
|
+
tracker.remove(event.requestId);
|
|
458
|
+
break;
|
|
459
|
+
default:
|
|
460
|
+
msg = `HeySummon event (${event.type}) for ${ref}`;
|
|
461
|
+
}
|
|
462
|
+
if (!msg)
|
|
463
|
+
continue;
|
|
464
|
+
// Build wake text with original question context
|
|
465
|
+
let wakeText = msg;
|
|
466
|
+
if (responseText && event.requestId) {
|
|
467
|
+
try {
|
|
468
|
+
const reqData = await client.getRequestByRef(fileRef || event.requestId);
|
|
469
|
+
const origQuestion = reqData.question || "";
|
|
470
|
+
const provName = reqData.provider?.name || reqData.providerName || "the provider";
|
|
471
|
+
wakeText = `${ref} — ${provName} responded!`;
|
|
472
|
+
if (origQuestion)
|
|
473
|
+
wakeText += `\n\nYour question was: ${origQuestion}`;
|
|
474
|
+
wakeText += `\n\nAnswer: ${responseText}`;
|
|
475
|
+
wakeText += `\n\nProceed based on this answer.`;
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
// non-fatal, use plain msg
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
// Deliver notification
|
|
482
|
+
if (notifyScript) {
|
|
483
|
+
try {
|
|
484
|
+
const eventJson = JSON.stringify({
|
|
485
|
+
event,
|
|
486
|
+
msg,
|
|
487
|
+
wakeText,
|
|
488
|
+
responseText,
|
|
489
|
+
ref,
|
|
490
|
+
});
|
|
491
|
+
execSync(`bash "${notifyScript}"`, {
|
|
492
|
+
input: eventJson,
|
|
493
|
+
stdio: ["pipe", "inherit", "inherit"],
|
|
494
|
+
timeout: 30_000,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
process.stderr.write(`Notify script failed for ${ref}\n`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
process.stdout.write(`${msg}\n`);
|
|
503
|
+
}
|
|
504
|
+
// ACK the event
|
|
505
|
+
await client.ackEvent(event.requestId).catch(() => { });
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
catch (err) {
|
|
509
|
+
const isAuth = err instanceof HeySummonHttpError && err.isAuthError;
|
|
510
|
+
if (isAuth) {
|
|
511
|
+
const key = provider.apiKey;
|
|
512
|
+
const existing = authErrors.get(key);
|
|
513
|
+
if (!existing) {
|
|
514
|
+
authErrors.set(key, { firstAt: Date.now(), count: 1 });
|
|
515
|
+
process.stderr.write(`Auth error for "${provider.name}" (${err instanceof HeySummonHttpError ? `HTTP ${err.status}` : "unknown"}). Will retry...\n`);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
existing.count++;
|
|
519
|
+
const elapsed = Date.now() - existing.firstAt;
|
|
520
|
+
if (elapsed >= AUTH_SHUTDOWN_MS) {
|
|
521
|
+
const status = err instanceof HeySummonHttpError ? err.status : "?";
|
|
522
|
+
const detail = err instanceof HeySummonHttpError ? err.body : String(err);
|
|
523
|
+
process.stderr.write(`\n` +
|
|
524
|
+
`══════════════════════════════════════════════════════\n` +
|
|
525
|
+
` HeySummon watcher shutting down\n` +
|
|
526
|
+
`\n` +
|
|
527
|
+
` Provider "${provider.name}" has returned HTTP ${status}\n` +
|
|
528
|
+
` for ${Math.round(elapsed / 60000)} minutes (${existing.count} attempts).\n` +
|
|
529
|
+
`\n` +
|
|
530
|
+
` This usually means the API key was deleted or\n` +
|
|
531
|
+
` deactivated on the HeySummon platform.\n` +
|
|
532
|
+
`\n` +
|
|
533
|
+
` Detail: ${detail}\n` +
|
|
534
|
+
`\n` +
|
|
535
|
+
` To fix: ask your provider for a new setup link,\n` +
|
|
536
|
+
` then re-run the setup to get fresh credentials.\n` +
|
|
537
|
+
`══════════════════════════════════════════════════════\n`);
|
|
538
|
+
process.exit(1);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
// Clear auth error streak on non-auth errors (network issues etc.)
|
|
544
|
+
authErrors.delete(provider.apiKey);
|
|
545
|
+
process.stderr.write(`Poll error for ${provider.name}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
await sleep(pollInterval * 1000);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
async function cmdKeygen(args) {
|
|
553
|
+
const dir = getArg(args, "--dir") || optEnv("HEYSUMMON_KEY_DIR", "");
|
|
554
|
+
if (!dir) {
|
|
555
|
+
process.stderr.write("Usage: cli keygen --dir <path>\n");
|
|
556
|
+
process.exit(1);
|
|
557
|
+
}
|
|
558
|
+
const keys = generatePersistentKeys(dir);
|
|
559
|
+
process.stderr.write(`Keypairs generated in ${dir}\n`);
|
|
560
|
+
process.stdout.write(JSON.stringify(keys) + "\n");
|
|
561
|
+
}
|
|
562
|
+
// ---------------------------------------------------------------------------
|
|
563
|
+
// Helpers
|
|
564
|
+
// ---------------------------------------------------------------------------
|
|
565
|
+
function sleep(ms) {
|
|
566
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
567
|
+
}
|
|
568
|
+
// ---------------------------------------------------------------------------
|
|
569
|
+
// Main
|
|
570
|
+
// ---------------------------------------------------------------------------
|
|
571
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
572
|
+
const commands = {
|
|
573
|
+
submit: cmdSubmit,
|
|
574
|
+
"submit-and-poll": cmdSubmitAndPoll,
|
|
575
|
+
"add-provider": cmdAddProvider,
|
|
576
|
+
"list-providers": cmdListProviders,
|
|
577
|
+
"check-status": cmdCheckStatus,
|
|
578
|
+
watch: cmdWatch,
|
|
579
|
+
keygen: cmdKeygen,
|
|
580
|
+
};
|
|
581
|
+
if (!command || !commands[command]) {
|
|
582
|
+
process.stderr.write(`Usage: cli <command> [args]\n\nCommands:\n ${Object.keys(commands).join("\n ")}\n`);
|
|
583
|
+
process.exit(1);
|
|
584
|
+
}
|
|
585
|
+
commands[command](rest).catch((err) => {
|
|
586
|
+
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
587
|
+
process.exit(1);
|
|
588
|
+
});
|
|
589
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|