@agentvault/agentvault 0.17.5 → 0.19.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 +10 -11
- package/dist/__tests__/crypto-helpers.test.d.ts +2 -0
- package/dist/__tests__/crypto-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/functional.test.d.ts +21 -0
- package/dist/__tests__/functional.test.d.ts.map +1 -0
- package/dist/__tests__/multi-session.test.d.ts +2 -0
- package/dist/__tests__/multi-session.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.d.ts +2 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/transport.test.d.ts +2 -0
- package/dist/__tests__/transport.test.d.ts.map +1 -0
- package/dist/_cp.d.ts +10 -0
- package/dist/_cp.d.ts.map +1 -0
- package/dist/account-config.d.ts +20 -0
- package/dist/account-config.d.ts.map +1 -0
- package/dist/channel.d.ts +393 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +2257 -0
- package/dist/channel.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +344 -2
- package/dist/cli.js.map +4 -4
- package/dist/create-agent.d.ts +28 -0
- package/dist/create-agent.d.ts.map +1 -0
- package/dist/credential-store.d.ts +62 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/crypto-helpers.d.ts +2 -0
- package/dist/crypto-helpers.d.ts.map +1 -0
- package/dist/crypto-helpers.js +4 -0
- package/dist/crypto-helpers.js.map +1 -0
- package/dist/doctor.d.ts +41 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/fetch-interceptor.d.ts +32 -0
- package/dist/fetch-interceptor.d.ts.map +1 -0
- package/dist/gateway-send.d.ts +98 -0
- package/dist/gateway-send.d.ts.map +1 -0
- package/dist/http-handlers.d.ts +53 -0
- package/dist/http-handlers.d.ts.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +359 -11
- package/dist/index.js.map +4 -4
- package/dist/mcp-handlers.d.ts +26 -0
- package/dist/mcp-handlers.d.ts.map +1 -0
- package/dist/mcp-proxy-helpers.d.ts +9 -0
- package/dist/mcp-proxy-helpers.d.ts.map +1 -0
- package/dist/mcp-server.d.ts +90 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/openclaw-compat.d.ts +33 -0
- package/dist/openclaw-compat.d.ts.map +1 -0
- package/dist/openclaw-entry.d.ts +27 -0
- package/dist/openclaw-entry.d.ts.map +1 -0
- package/dist/openclaw-entry.js +45184 -195
- package/dist/openclaw-entry.js.map +4 -4
- package/dist/openclaw-plugin.d.ts +102 -0
- package/dist/openclaw-plugin.d.ts.map +1 -0
- package/dist/openclaw-plugin.js +222 -0
- package/dist/openclaw-plugin.js.map +1 -0
- package/dist/openclaw-types.d.ts +155 -0
- package/dist/openclaw-types.d.ts.map +1 -0
- package/dist/policy-enforcer.d.ts +78 -0
- package/dist/policy-enforcer.d.ts.map +1 -0
- package/dist/setup.d.ts +27 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +329 -0
- package/dist/setup.js.map +1 -0
- package/dist/skill-invoker.d.ts +30 -0
- package/dist/skill-invoker.d.ts.map +1 -0
- package/dist/skill-manifest.d.ts +30 -0
- package/dist/skill-manifest.d.ts.map +1 -0
- package/dist/skill-telemetry.d.ts +36 -0
- package/dist/skill-telemetry.d.ts.map +1 -0
- package/dist/skills-publish.d.ts +8 -0
- package/dist/skills-publish.d.ts.map +1 -0
- package/dist/state.d.ts +32 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +61 -0
- package/dist/state.js.map +1 -0
- package/dist/transport.d.ts +24 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +43 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +417 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-handlers.d.ts +62 -0
- package/dist/workspace-handlers.d.ts.map +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/dist/setup.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentVault one-time setup command.
|
|
3
|
+
*
|
|
4
|
+
* Runs enrollment + waits for owner approval + persists state,
|
|
5
|
+
* then auto-registers the agentvault channel in openclaw config.
|
|
6
|
+
*
|
|
7
|
+
* Usage: npx @agentvault/agentvault setup --token=av_tok_...
|
|
8
|
+
*/
|
|
9
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
10
|
+
import * as readline from "node:readline";
|
|
11
|
+
import { resolve } from "node:path";
|
|
12
|
+
import { SecureChannel } from "./channel.js";
|
|
13
|
+
import { VERSION } from "./index.js";
|
|
14
|
+
export async function runSetupCommand(options) {
|
|
15
|
+
const { token, name, apiUrl } = options;
|
|
16
|
+
const dataDir = resolve(options.dataDir.replace(/^~/, process.env.HOME ?? "~"));
|
|
17
|
+
console.log(`
|
|
18
|
+
╔══════════════════════════════════════════════╗
|
|
19
|
+
║ AgentVault — First-Time Setup ║
|
|
20
|
+
╚══════════════════════════════════════════════╝
|
|
21
|
+
|
|
22
|
+
Agent name : ${name}
|
|
23
|
+
Data dir : ${dataDir}
|
|
24
|
+
API : ${apiUrl}
|
|
25
|
+
`);
|
|
26
|
+
let enrollDone = false;
|
|
27
|
+
const channel = new SecureChannel({
|
|
28
|
+
inviteToken: token,
|
|
29
|
+
dataDir,
|
|
30
|
+
apiUrl,
|
|
31
|
+
agentName: name,
|
|
32
|
+
onMessage: () => { }, // Not handling messages during setup
|
|
33
|
+
onStateChange: (state) => {
|
|
34
|
+
switch (state) {
|
|
35
|
+
case "enrolling":
|
|
36
|
+
console.log(" Enrolling with AgentVault server...");
|
|
37
|
+
break;
|
|
38
|
+
case "polling":
|
|
39
|
+
console.log(" Waiting for approval in your AgentVault dashboard...");
|
|
40
|
+
if (channel.fingerprint) {
|
|
41
|
+
console.log(`\n Fingerprint: ${channel.fingerprint}`);
|
|
42
|
+
console.log(" Verify this fingerprint matches the one shown in your dashboard");
|
|
43
|
+
console.log(" before clicking Approve.\n");
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
case "activating":
|
|
47
|
+
console.log(" Approved! Setting up encryption...");
|
|
48
|
+
break;
|
|
49
|
+
case "ready":
|
|
50
|
+
enrollDone = true;
|
|
51
|
+
console.log(" ✅ Enrollment complete! Secure channel established.\n");
|
|
52
|
+
break;
|
|
53
|
+
case "error":
|
|
54
|
+
console.error(" ❌ Setup encountered an error.");
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
channel.on("error", (err) => {
|
|
60
|
+
console.error(`\n ❌ Setup failed: ${err.message}\n`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
});
|
|
63
|
+
// Start enrollment — blocks until ready or error
|
|
64
|
+
await new Promise((res, rej) => {
|
|
65
|
+
const check = setInterval(() => {
|
|
66
|
+
if (enrollDone) {
|
|
67
|
+
clearInterval(check);
|
|
68
|
+
res();
|
|
69
|
+
}
|
|
70
|
+
}, 500);
|
|
71
|
+
channel.start().catch((err) => {
|
|
72
|
+
clearInterval(check);
|
|
73
|
+
rej(err);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
// Stop the live connection — OpenClaw's gateway will own it after restart
|
|
77
|
+
await channel.stop();
|
|
78
|
+
// --- Install plugin + register in OpenClaw config ---
|
|
79
|
+
console.log(" Installing AgentVault plugin in OpenClaw...\n");
|
|
80
|
+
// Extend PATH to find openclaw regardless of how npx was invoked
|
|
81
|
+
const home = process.env.HOME ?? "";
|
|
82
|
+
const extraPaths = [
|
|
83
|
+
`${home}/.local/bin`,
|
|
84
|
+
`${home}/.pnpm/bin`,
|
|
85
|
+
`${home}/Library/pnpm/bin`,
|
|
86
|
+
"/usr/local/bin",
|
|
87
|
+
"/opt/homebrew/bin",
|
|
88
|
+
].join(":");
|
|
89
|
+
const env = { ...process.env, PATH: `${extraPaths}:${process.env.PATH ?? ""}` };
|
|
90
|
+
const pluginInstalled = installPlugin(env);
|
|
91
|
+
if (!pluginInstalled) {
|
|
92
|
+
// openclaw not in PATH — print full manual instructions and bail
|
|
93
|
+
console.log(`
|
|
94
|
+
⚠️ Could not auto-configure OpenClaw (is 'openclaw' in your PATH?).
|
|
95
|
+
|
|
96
|
+
1. Install the plugin:
|
|
97
|
+
openclaw plugins install @agentvault/agentvault
|
|
98
|
+
|
|
99
|
+
2. Register the plugin in the allow list:
|
|
100
|
+
openclaw config set plugins.allow '["agentvault"]'
|
|
101
|
+
|
|
102
|
+
3. Add this to your OpenClaw config (openclaw.yaml or openclaw.json):
|
|
103
|
+
channels:
|
|
104
|
+
agentvault:
|
|
105
|
+
dataDir: "${dataDir}"
|
|
106
|
+
apiUrl: "${apiUrl}"
|
|
107
|
+
agentName: "${name}"
|
|
108
|
+
|
|
109
|
+
4. (Recommended) Install pm2 for auto-restart and crash recovery:
|
|
110
|
+
npm install -g pm2
|
|
111
|
+
pm2 start "openclaw gateway start" --name openclaw-gateway
|
|
112
|
+
pm2 startup
|
|
113
|
+
pm2 save
|
|
114
|
+
|
|
115
|
+
5. Restart the gateway:
|
|
116
|
+
openclaw gateway restart
|
|
117
|
+
`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log("\n Registering AgentVault channel in OpenClaw config...\n");
|
|
121
|
+
const patchCommands = [
|
|
122
|
+
`openclaw config set channels.agentvault.dataDir "${dataDir}"`,
|
|
123
|
+
`openclaw config set channels.agentvault.apiUrl "${apiUrl}"`,
|
|
124
|
+
`openclaw config set channels.agentvault.agentName "${name}"`,
|
|
125
|
+
`openclaw config set plugins.allow '["agentvault"]'`,
|
|
126
|
+
];
|
|
127
|
+
let configPatched = false;
|
|
128
|
+
for (const cmd of patchCommands) {
|
|
129
|
+
try {
|
|
130
|
+
execSync(cmd, { stdio: "pipe", env });
|
|
131
|
+
configPatched = true;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// config write failed — fall through to manual
|
|
135
|
+
configPatched = false;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (configPatched) {
|
|
140
|
+
console.log(` ✅ Channel registered in OpenClaw config.\n`);
|
|
141
|
+
// --- Step 6: Configure pm2 process management ---
|
|
142
|
+
console.log(" Configuring pm2 process management...\n");
|
|
143
|
+
configurePm2(env);
|
|
144
|
+
await promptAndRestart(env);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(` ⚠️ Could not auto-configure OpenClaw channel.
|
|
148
|
+
Add this to your OpenClaw config (openclaw.yaml or openclaw.json) manually:
|
|
149
|
+
|
|
150
|
+
channels:
|
|
151
|
+
agentvault:
|
|
152
|
+
dataDir: "${dataDir}"
|
|
153
|
+
apiUrl: "${apiUrl}"
|
|
154
|
+
agentName: "${name}"
|
|
155
|
+
|
|
156
|
+
Then restart OpenClaw:
|
|
157
|
+
openclaw gateway restart
|
|
158
|
+
`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Install/update the plugin in OpenClaw's extensions directory.
|
|
163
|
+
* Returns true if the plugin is installed (or was already up-to-date).
|
|
164
|
+
*/
|
|
165
|
+
export function installPlugin(env) {
|
|
166
|
+
// Check if already installed
|
|
167
|
+
try {
|
|
168
|
+
const info = execSync("openclaw plugins info agentvault", {
|
|
169
|
+
stdio: "pipe",
|
|
170
|
+
env,
|
|
171
|
+
});
|
|
172
|
+
const infoStr = info.toString();
|
|
173
|
+
const versionMatch = infoStr.match(/version[:\s]+(\S+)/i);
|
|
174
|
+
const installedVersion = versionMatch?.[1];
|
|
175
|
+
if (installedVersion && installedVersion !== VERSION) {
|
|
176
|
+
console.log(` Updating plugin ${installedVersion} → ${VERSION}...`);
|
|
177
|
+
spawnSync("openclaw", ["plugins", "uninstall", "agentvault"], {
|
|
178
|
+
stdio: "pipe",
|
|
179
|
+
input: "y\n",
|
|
180
|
+
env,
|
|
181
|
+
});
|
|
182
|
+
execSync("openclaw plugins install @agentvault/agentvault", {
|
|
183
|
+
stdio: "pipe",
|
|
184
|
+
env,
|
|
185
|
+
});
|
|
186
|
+
console.log(" ✅ Plugin updated.");
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
console.log(` Plugin already installed (v${installedVersion ?? "unknown"}).`);
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Not installed — install fresh
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
execSync("openclaw plugins install @agentvault/agentvault", {
|
|
198
|
+
stdio: "pipe",
|
|
199
|
+
env,
|
|
200
|
+
});
|
|
201
|
+
console.log(" ✅ Plugin installed in OpenClaw.");
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
console.log(" ⚠️ Could not auto-install plugin.");
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Configure pm2 to manage the OpenClaw gateway process.
|
|
211
|
+
* Returns true if pm2 was configured (or already configured).
|
|
212
|
+
*/
|
|
213
|
+
export function configurePm2(env) {
|
|
214
|
+
// Check if pm2 is available
|
|
215
|
+
try {
|
|
216
|
+
execSync("pm2 --version", { stdio: "pipe", env });
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
console.log(`
|
|
220
|
+
ℹ️ pm2 not found. For best reliability, install pm2:
|
|
221
|
+
npm install -g pm2
|
|
222
|
+
|
|
223
|
+
Then configure the gateway to auto-restart:
|
|
224
|
+
pm2 start "openclaw gateway start" --name openclaw-gateway
|
|
225
|
+
pm2 startup
|
|
226
|
+
pm2 save
|
|
227
|
+
`);
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
// Check if already configured
|
|
231
|
+
try {
|
|
232
|
+
const info = execSync("pm2 describe openclaw-gateway", { stdio: "pipe", env });
|
|
233
|
+
const infoStr = info.toString();
|
|
234
|
+
if (infoStr.includes("online") || infoStr.includes("stopped")) {
|
|
235
|
+
console.log(" pm2 process 'openclaw-gateway' already exists.");
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Not configured yet — continue
|
|
241
|
+
}
|
|
242
|
+
// Determine platform-specific command
|
|
243
|
+
const isMac = process.platform === "darwin";
|
|
244
|
+
const startCmd = isMac
|
|
245
|
+
? "caffeinate -i openclaw gateway start"
|
|
246
|
+
: "openclaw gateway start";
|
|
247
|
+
try {
|
|
248
|
+
execSync(`pm2 start "${startCmd}" --name openclaw-gateway`, { stdio: "pipe", env });
|
|
249
|
+
console.log(" ✅ Gateway registered with pm2.");
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
console.log(` ⚠️ Failed to register with pm2: ${err}`);
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
// Generate startup script
|
|
256
|
+
try {
|
|
257
|
+
execSync("pm2 startup", { stdio: "pipe", env });
|
|
258
|
+
console.log(" ✅ pm2 startup configured (auto-start on boot).");
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
console.log(" ⚠️ pm2 startup failed — you may need to run 'pm2 startup' manually with sudo.");
|
|
262
|
+
}
|
|
263
|
+
// Save process list
|
|
264
|
+
try {
|
|
265
|
+
execSync("pm2 save", { stdio: "pipe", env });
|
|
266
|
+
console.log(" ✅ pm2 process list saved.");
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
console.log(" ⚠️ pm2 save failed.");
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Prompt the user to restart the OpenClaw gateway now or later.
|
|
275
|
+
* Runs `openclaw gateway restart` synchronously if they confirm.
|
|
276
|
+
*/
|
|
277
|
+
async function promptAndRestart(env) {
|
|
278
|
+
const answer = await ask(" ⚠️ OpenClaw gateway will restart, briefly interrupting any active conversations.\n" +
|
|
279
|
+
" Restart now? [y/N] ");
|
|
280
|
+
if (answer.trim().toLowerCase() === "y") {
|
|
281
|
+
console.log("\n Restarting OpenClaw gateway...");
|
|
282
|
+
const result = spawnSync("openclaw", ["gateway", "restart"], {
|
|
283
|
+
stdio: "inherit",
|
|
284
|
+
env,
|
|
285
|
+
});
|
|
286
|
+
if (result.status === 0) {
|
|
287
|
+
console.log(`
|
|
288
|
+
✅ Gateway restarted. AgentVault is now active.
|
|
289
|
+
Your AgentVault UI will route encrypted messages
|
|
290
|
+
directly into your agent.
|
|
291
|
+
`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
console.log(`
|
|
295
|
+
⚠️ Restart command failed (exit ${result.status ?? "unknown"}).
|
|
296
|
+
Please restart manually:
|
|
297
|
+
|
|
298
|
+
openclaw gateway restart
|
|
299
|
+
`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log(`
|
|
304
|
+
──────────────────────────────────────────────
|
|
305
|
+
Run this when you're ready to activate:
|
|
306
|
+
|
|
307
|
+
openclaw gateway restart
|
|
308
|
+
|
|
309
|
+
After restart, your AgentVault UI will route
|
|
310
|
+
encrypted messages directly into your agent.
|
|
311
|
+
──────────────────────────────────────────────
|
|
312
|
+
`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/** Prompt helper — resolves with the user's input line. */
|
|
316
|
+
function ask(question) {
|
|
317
|
+
return new Promise((resolve) => {
|
|
318
|
+
const rl = readline.createInterface({
|
|
319
|
+
input: process.stdin,
|
|
320
|
+
output: process.stdout,
|
|
321
|
+
terminal: true,
|
|
322
|
+
});
|
|
323
|
+
rl.question(question, (answer) => {
|
|
324
|
+
rl.close();
|
|
325
|
+
resolve(answer);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill invocation lifecycle — auth, execute, record, bill.
|
|
3
|
+
*
|
|
4
|
+
* Sets _instrument.skillName so all child spans are attributed to the skill.
|
|
5
|
+
*/
|
|
6
|
+
export interface InvocationResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
data?: unknown;
|
|
9
|
+
error?: string;
|
|
10
|
+
latencyMs: number;
|
|
11
|
+
toolsUsed?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface InvocationOpts {
|
|
14
|
+
skillName: string;
|
|
15
|
+
skillVersion?: string;
|
|
16
|
+
args: Record<string, unknown>;
|
|
17
|
+
sptToken?: string;
|
|
18
|
+
apiUrl: string;
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute a skill invocation with full lifecycle tracking.
|
|
23
|
+
*
|
|
24
|
+
* 1. Validates SPT token (if provided)
|
|
25
|
+
* 2. Dispatches to the skill handler
|
|
26
|
+
* 3. Records invocation via POST /capabilities/invocations
|
|
27
|
+
* 4. Returns result with timing data
|
|
28
|
+
*/
|
|
29
|
+
export declare function invokeSkill(opts: InvocationOpts, handler: (skillName: string, args: Record<string, unknown>) => Promise<unknown>): Promise<InvocationResult>;
|
|
30
|
+
//# sourceMappingURL=skill-invoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-invoker.d.ts","sourceRoot":"","sources":["../src/skill-invoker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9E,OAAO,CAAC,gBAAgB,CAAC,CA6C3B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SkillDefinition } from "./mcp-server.js";
|
|
2
|
+
export interface SkillManifest {
|
|
3
|
+
skills: SkillDefinition[];
|
|
4
|
+
source: "local" | "remote" | "merged";
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parse a SKILL.md file into a SkillDefinition.
|
|
8
|
+
*
|
|
9
|
+
* Extracts YAML frontmatter between --- delimiters.
|
|
10
|
+
* Everything after the closing --- is treated as instructions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseSkillMd(content: string): SkillDefinition | null;
|
|
13
|
+
/**
|
|
14
|
+
* Load skills from a directory by scanning for SKILL.md files.
|
|
15
|
+
*
|
|
16
|
+
* Matches:
|
|
17
|
+
* - SKILL.md (exact match)
|
|
18
|
+
* - *-SKILL.md or *_SKILL.md (e.g., Cortina-SKILL.md)
|
|
19
|
+
* - Subdirectories containing SKILL.md (one level deep)
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadSkillsFromDirectory(dir: string): SkillDefinition[];
|
|
22
|
+
/**
|
|
23
|
+
* Load skills from backend API.
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadSkillsFromApi(apiUrl: string, apiKey: string, hubId: string): Promise<SkillDefinition[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Merge local and remote skills. Local definitions take precedence.
|
|
28
|
+
*/
|
|
29
|
+
export declare function mergeSkills(local: SkillDefinition[], remote: SkillDefinition[]): SkillManifest;
|
|
30
|
+
//# sourceMappingURL=skill-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../src/skill-manifest.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACvC;AAoCD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAmDpE;AAsFD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAuCtE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CA+B5B;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,eAAe,EAAE,EACxB,MAAM,EAAE,eAAe,EAAE,GACxB,aAAa,CAwBf"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TelemetrySpan, InstrumentationContext } from "@agentvault/crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Get and clear the buffered spans (for batch reporting).
|
|
4
|
+
*/
|
|
5
|
+
export declare function drainSkillSpans(): TelemetrySpan[];
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a skill execution with lifecycle telemetry spans.
|
|
8
|
+
*
|
|
9
|
+
* Creates two spans:
|
|
10
|
+
* 1. start — emitted immediately when invocation begins
|
|
11
|
+
* 2. completion — emitted when execution completes (success or error)
|
|
12
|
+
*
|
|
13
|
+
* @param skillName — name of the skill being executed
|
|
14
|
+
* @param version — semver version of the skill
|
|
15
|
+
* @param fn — the async function to execute
|
|
16
|
+
* @param instrument — optional InstrumentationContext for direct reporting
|
|
17
|
+
* @returns The result of fn()
|
|
18
|
+
*/
|
|
19
|
+
export declare function wrapSkillExecution<T>(skillName: string, version: string | undefined, fn: () => Promise<T>, instrument?: InstrumentationContext): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Report a completed skill invocation with full metadata.
|
|
22
|
+
* Used for post-hoc reporting when the caller has already collected metrics.
|
|
23
|
+
*/
|
|
24
|
+
export declare function reportSkillInvocation(opts: {
|
|
25
|
+
skillName: string;
|
|
26
|
+
version?: string;
|
|
27
|
+
latencyMs: number;
|
|
28
|
+
success: boolean;
|
|
29
|
+
inputTokens?: number;
|
|
30
|
+
outputTokens?: number;
|
|
31
|
+
costCents?: number;
|
|
32
|
+
toolsUsed?: string[];
|
|
33
|
+
schemaMatch?: boolean;
|
|
34
|
+
errorMessage?: string;
|
|
35
|
+
}): TelemetrySpan;
|
|
36
|
+
//# sourceMappingURL=skill-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-telemetry.d.ts","sourceRoot":"","sources":["../src/skill-telemetry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAIhF;;GAEG;AACH,wBAAgB,eAAe,IAAI,aAAa,EAAE,CAIjD;AAeD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,CAAC,EAAE,sBAAsB,GAClC,OAAO,CAAC,CAAC,CAAC,CAsFZ;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,aAAa,CAkBhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-publish.d.ts","sourceRoot":"","sources":["../src/skills-publish.ts"],"names":[],"mappings":"AAiCA,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJpE"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PersistedState } from "./types.js";
|
|
2
|
+
export declare function saveState(dataDir: string, state: PersistedState): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Load raw persisted state from disk.
|
|
5
|
+
* Returns the raw parsed JSON — caller is responsible for migration
|
|
6
|
+
* from legacy format to current PersistedState.
|
|
7
|
+
*
|
|
8
|
+
* Checks agentvault.json first, falls back to secure-channel.json
|
|
9
|
+
* for backward compatibility. Auto-migrates on first legacy load.
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadState(dataDir: string): Promise<any | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Check whether persisted state is valid and usable (has deviceId, deviceJwt, and at least one session).
|
|
14
|
+
*/
|
|
15
|
+
export declare function isStateValid(dataDir: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Create a backup of the state file (atomic write via tmp + rename).
|
|
18
|
+
* Silent no-op if no state file exists.
|
|
19
|
+
*/
|
|
20
|
+
export declare function backupState(dataDir: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Restore state from backup if primary state is missing/empty/invalid but .bak exists and is valid.
|
|
23
|
+
* Returns true if state was successfully restored.
|
|
24
|
+
*/
|
|
25
|
+
export declare function restoreState(dataDir: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Upload encrypted backup to server. Converts PersistedState → BackupBundle,
|
|
28
|
+
* encrypts with backup code, and PUTs to the backend.
|
|
29
|
+
*/
|
|
30
|
+
export declare function uploadBackupToServer(state: PersistedState, backupCode: string, apiUrl: string, deviceJwt: string): Promise<void>;
|
|
31
|
+
export declare function clearState(dataDir: string): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,GAEd,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAuBrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAepE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBpE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const STATE_FILE = "agentvault.json";
|
|
4
|
+
const LEGACY_STATE_FILE = "secure-channel.json";
|
|
5
|
+
export async function saveState(dataDir, state) {
|
|
6
|
+
await mkdir(dataDir, { recursive: true });
|
|
7
|
+
const filePath = join(dataDir, STATE_FILE);
|
|
8
|
+
await writeFile(filePath, JSON.stringify(state, null, 2), "utf-8");
|
|
9
|
+
// Clean up legacy file after migration
|
|
10
|
+
try {
|
|
11
|
+
await rm(join(dataDir, LEGACY_STATE_FILE));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Already removed or never existed
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load raw persisted state from disk.
|
|
19
|
+
* Returns the raw parsed JSON — caller is responsible for migration
|
|
20
|
+
* from legacy format to current PersistedState.
|
|
21
|
+
*
|
|
22
|
+
* Checks agentvault.json first, falls back to secure-channel.json
|
|
23
|
+
* for backward compatibility. Auto-migrates on first legacy load.
|
|
24
|
+
*/
|
|
25
|
+
export async function loadState(dataDir) {
|
|
26
|
+
// Try new filename first
|
|
27
|
+
const filePath = join(dataDir, STATE_FILE);
|
|
28
|
+
try {
|
|
29
|
+
const raw = await readFile(filePath, "utf-8");
|
|
30
|
+
return JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Fall through to legacy
|
|
34
|
+
}
|
|
35
|
+
// Fall back to legacy filename
|
|
36
|
+
const legacyPath = join(dataDir, LEGACY_STATE_FILE);
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(legacyPath, "utf-8");
|
|
39
|
+
const parsed = JSON.parse(raw);
|
|
40
|
+
// Auto-migrate: write to new filename, remove legacy
|
|
41
|
+
await mkdir(dataDir, { recursive: true });
|
|
42
|
+
await writeFile(filePath, JSON.stringify(parsed, null, 2), "utf-8");
|
|
43
|
+
await rm(legacyPath);
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function clearState(dataDir) {
|
|
51
|
+
// Remove both files to cover migration edge cases
|
|
52
|
+
for (const filename of [STATE_FILE, LEGACY_STATE_FILE]) {
|
|
53
|
+
try {
|
|
54
|
+
await rm(join(dataDir, filename));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// File doesn't exist — nothing to clear
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AACrC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,KAAqB;IAErB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEnE,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe;IAGf,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,+BAA+B;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,qDAAqD;QACrD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,kDAAkD;IAClD,KAAK,MAAM,QAAQ,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface EnrollResponse {
|
|
2
|
+
device_id: string;
|
|
3
|
+
fingerprint: string;
|
|
4
|
+
status: string;
|
|
5
|
+
}
|
|
6
|
+
export interface StatusResponse {
|
|
7
|
+
device_id: string;
|
|
8
|
+
status: string;
|
|
9
|
+
fingerprint: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ActivateResponse {
|
|
12
|
+
device_id: string;
|
|
13
|
+
conversation_id: string;
|
|
14
|
+
status: string;
|
|
15
|
+
device_jwt: string;
|
|
16
|
+
owner_identity_public_key: string;
|
|
17
|
+
owner_ephemeral_public_key: string | null;
|
|
18
|
+
}
|
|
19
|
+
export declare function enrollDevice(apiUrl: string, inviteToken: string, identityPkHex: string, ephemeralPkHex: string, proofHex: string, platform?: string): Promise<EnrollResponse>;
|
|
20
|
+
export declare function pollDeviceStatus(apiUrl: string, deviceId: string): Promise<StatusResponse & {
|
|
21
|
+
rateLimited?: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function activateDevice(apiUrl: string, deviceId: string): Promise<ActivateResponse>;
|
|
24
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAiBzB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAWrD;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAW3B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export async function enrollDevice(apiUrl, inviteToken, identityPkHex, ephemeralPkHex, proofHex, platform) {
|
|
2
|
+
const res = await fetch(`${apiUrl}/api/v1/enroll`, {
|
|
3
|
+
method: "POST",
|
|
4
|
+
headers: { "Content-Type": "application/json" },
|
|
5
|
+
body: JSON.stringify({
|
|
6
|
+
invite_token: inviteToken,
|
|
7
|
+
identity_public_key: identityPkHex,
|
|
8
|
+
ephemeral_public_key: ephemeralPkHex,
|
|
9
|
+
proof_of_possession: proofHex,
|
|
10
|
+
platform: platform ?? "node",
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
const detail = await res.text();
|
|
15
|
+
throw new Error(`Enrollment failed (${res.status}): ${detail}`);
|
|
16
|
+
}
|
|
17
|
+
return res.json();
|
|
18
|
+
}
|
|
19
|
+
export async function pollDeviceStatus(apiUrl, deviceId) {
|
|
20
|
+
const res = await fetch(`${apiUrl}/api/v1/devices/${deviceId}/status`);
|
|
21
|
+
if (res.status === 429) {
|
|
22
|
+
// Rate limited — caller should back off and retry
|
|
23
|
+
return { device_id: deviceId, status: "PENDING", fingerprint: "", rateLimited: true };
|
|
24
|
+
}
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
const detail = await res.text();
|
|
27
|
+
throw new Error(`Status poll failed (${res.status}): ${detail}`);
|
|
28
|
+
}
|
|
29
|
+
return res.json();
|
|
30
|
+
}
|
|
31
|
+
export async function activateDevice(apiUrl, deviceId) {
|
|
32
|
+
const res = await fetch(`${apiUrl}/api/v1/devices/${deviceId}/activate`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: { "Content-Type": "application/json" },
|
|
35
|
+
body: JSON.stringify({}),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
const detail = await res.text();
|
|
39
|
+
throw new Error(`Activation failed (${res.status}): ${detail}`);
|
|
40
|
+
}
|
|
41
|
+
return res.json();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,WAAmB,EACnB,aAAqB,EACrB,cAAsB,EACtB,QAAgB,EAChB,QAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,WAAW;YACzB,mBAAmB,EAAE,aAAa;YAClC,oBAAoB,EAAE,cAAc;YACpC,mBAAmB,EAAE,QAAQ;YAC7B,QAAQ,EAAE,QAAQ,IAAI,MAAM;SAC7B,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,QAAQ,SAAS,CAAC,CAAC;IACvE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,kDAAkD;QAClD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,QAAQ,WAAW,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|