@iicp/client 0.7.36 → 0.7.38

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 CHANGED
@@ -308,6 +308,30 @@ IICP_RELAY_WORKER_ENDPOINT=host:9485 # specific relay instead of auto-elect
308
308
 
309
309
  ---
310
310
 
311
+ ## Operator identity
312
+
313
+ Your **operator identity** is an ed25519 keypair — its public key *is* your `operator_id` (the
314
+ directory stores it as `operator_pubkey`). One identity spans every node you run: it binds them to
315
+ you (nodes show **`Operated by <your name>` ✓**), earns a
316
+ [founder ordinal](https://iicp.network/founders), and rolls each node's credits into one operator
317
+ wallet. Your `display_name` is the public, mutable handle; your contact stays local.
318
+
319
+ ```bash
320
+ iicp-node init # create your key-backed identity (~/.iicp/operator.json)
321
+ iicp-node serve --node mynode # signs an operator→node delegation; binds the node to you
322
+ iicp-node operator rename "NewName" # change your public display_name (signed)
323
+ iicp-node operator encrypt # password-encrypt the secret at rest ($IICP_OPERATOR_PASSPHRASE)
324
+ iicp-node operator decrypt # remove at-rest encryption
325
+ ```
326
+
327
+ **The key is the identity** — whoever holds `~/.iicp/operator.json` controls it (its nodes, ordinal,
328
+ and wallet); there is no central recovery. Back it up (encrypted), never commit or share it; lose it
329
+ and the identity, with its founder ordinal, is gone.
330
+
331
+ Full guide: **[iicp.network/docs/operator-identity](https://iicp.network/docs/operator-identity)**
332
+
333
+ ---
334
+
311
335
  ## SDK conformance
312
336
 
313
337
  | Rule | Description | Status |
@@ -9,6 +9,14 @@
9
9
  * Port of iicp-adapter backends/{base,vllm,llamacpp,openai_compat} into the SDK's
10
10
  * handler-factory style (tracker iicp.network#340; parity Block B).
11
11
  */
12
+ /** #414 — speech-to-text. Multipart file upload (distinct path below), not JSON. */
13
+ export declare const AUDIO_TRANSCRIBE_INTENT = "urn:iicp:intent:audio:transcribe:v1";
14
+ /** #414 — text-to-speech. JSON request but a *binary* audio response (distinct path). */
15
+ export declare const AUDIO_SPEECH_INTENT = "urn:iicp:intent:audio:speech:v1";
16
+ /** #414 — content moderation. Plain JSON in/out (shared path), but model-OPTIONAL. */
17
+ export declare const SAFETY_MODERATE_INTENT = "urn:iicp:intent:safety:moderate:v1";
18
+ /** Intents whose request body does NOT require a model (the backend supplies it). */
19
+ export declare const MODEL_OPTIONAL_INTENTS: Set<string>;
12
20
  export declare const INTENT_TO_PATH: Record<string, string>;
13
21
  export interface BackendOptions {
14
22
  /** Provider HTTP root (no trailing slash needed). */
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIjD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,cAAc,CA+EhB"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,wCAAwC,CAAC;AAC7E,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAE3E,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,aAA4C,CAAC;AAEhF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOjD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,cAAc,CAyMhB"}
@@ -12,12 +12,23 @@
12
12
  * handler-factory style (tracker iicp.network#340; parity Block B).
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.INTENT_TO_PATH = void 0;
15
+ exports.INTENT_TO_PATH = exports.MODEL_OPTIONAL_INTENTS = exports.SAFETY_MODERATE_INTENT = exports.AUDIO_SPEECH_INTENT = exports.AUDIO_TRANSCRIBE_INTENT = void 0;
16
16
  exports.buildOpenAiDialectHandler = buildOpenAiDialectHandler;
17
+ /** #414 — speech-to-text. Multipart file upload (distinct path below), not JSON. */
18
+ exports.AUDIO_TRANSCRIBE_INTENT = "urn:iicp:intent:audio:transcribe:v1";
19
+ /** #414 — text-to-speech. JSON request but a *binary* audio response (distinct path). */
20
+ exports.AUDIO_SPEECH_INTENT = "urn:iicp:intent:audio:speech:v1";
21
+ /** #414 — content moderation. Plain JSON in/out (shared path), but model-OPTIONAL. */
22
+ exports.SAFETY_MODERATE_INTENT = "urn:iicp:intent:safety:moderate:v1";
23
+ /** Intents whose request body does NOT require a model (the backend supplies it). */
24
+ exports.MODEL_OPTIONAL_INTENTS = new Set([exports.SAFETY_MODERATE_INTENT]);
17
25
  exports.INTENT_TO_PATH = {
18
26
  "urn:iicp:intent:llm:chat:v1": "/chat/completions",
19
27
  "urn:iicp:intent:llm:completion:v1": "/completions",
20
28
  "urn:iicp:intent:llm:embedding:v1": "/embeddings",
29
+ [exports.AUDIO_TRANSCRIBE_INTENT]: "/audio/transcriptions",
30
+ [exports.AUDIO_SPEECH_INTENT]: "/audio/speech",
31
+ [exports.SAFETY_MODERATE_INTENT]: "/moderations",
21
32
  };
22
33
  /**
23
34
  * Build a TaskHandler that proxies CALLs to an OpenAI-dialect server. `engine` is the
@@ -43,10 +54,141 @@ function buildOpenAiDialectHandler(engine, baseUrlRaw, model, apiKey, timeoutMs)
43
54
  error_message: `${engine}: unsupported intent ${JSON.stringify(intent)}; supported: ${JSON.stringify(Object.keys(exports.INTENT_TO_PATH).sort())}`,
44
55
  };
45
56
  }
57
+ // #414 — audio:transcribe is a multipart file upload (OpenAI
58
+ // /v1/audio/transcriptions). Audio rides as base64 in payload.audio; model is
59
+ // OPTIONAL (whisper.cpp ignores it, vLLM/OpenAI use it). Native FormData/Blob —
60
+ // no new dependency.
61
+ if (intent === exports.AUDIO_TRANSCRIBE_INTENT) {
62
+ const p = payload ?? {};
63
+ const audioB64 = (p.audio ?? p.audio_b64);
64
+ if (typeof audioB64 !== "string" || !audioB64) {
65
+ return {
66
+ error_code: 400,
67
+ error_message: `${engine}: audio:transcribe requires payload.audio (base64-encoded audio bytes)`,
68
+ };
69
+ }
70
+ const cleaned = audioB64.trim();
71
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(cleaned) || cleaned.length % 4 !== 0) {
72
+ return { error_code: 400, error_message: `${engine}: payload.audio is not valid base64` };
73
+ }
74
+ const audioBytes = Buffer.from(cleaned, "base64");
75
+ const filename = typeof p.filename === "string" ? p.filename : "audio.wav";
76
+ const form = new FormData();
77
+ form.append("file", new Blob([audioBytes]), filename);
78
+ const reqModel = (typeof p.model === "string" ? p.model : undefined) ?? model;
79
+ if (reqModel)
80
+ form.append("model", reqModel);
81
+ let haveRf = false;
82
+ for (const k of ["language", "response_format", "prompt", "temperature"]) {
83
+ if (p[k] !== undefined && p[k] !== null) {
84
+ if (k === "response_format")
85
+ haveRf = true;
86
+ form.append(k, String(p[k]));
87
+ }
88
+ }
89
+ if (!haveRf)
90
+ form.append("response_format", "json");
91
+ const mpHeaders = {};
92
+ if (apiKey)
93
+ mpHeaders["Authorization"] = `Bearer ${apiKey}`;
94
+ const ctrlA = new AbortController();
95
+ const tA = setTimeout(() => ctrlA.abort(), timeoutMs);
96
+ let respA;
97
+ try {
98
+ respA = await fetch(`${baseUrl}${path}`, {
99
+ method: "POST",
100
+ headers: mpHeaders,
101
+ body: form,
102
+ signal: ctrlA.signal,
103
+ });
104
+ }
105
+ catch (exc) {
106
+ clearTimeout(tA);
107
+ const msg = exc instanceof Error ? exc.message : String(exc);
108
+ if (ctrlA.signal.aborted)
109
+ return { error_code: 408, error_message: `${engine}: backend timed out` };
110
+ return { error_code: 502, error_message: `${engine}: HTTP transport error: ${msg}` };
111
+ }
112
+ clearTimeout(tA);
113
+ if (!respA.ok) {
114
+ const text = await respA.text().catch(() => "");
115
+ return {
116
+ error_code: respA.status,
117
+ error_message: `${engine}: upstream ${respA.status}: ${text.slice(0, 512)}`,
118
+ };
119
+ }
120
+ const text = await respA.text();
121
+ try {
122
+ return { result: JSON.parse(text) };
123
+ }
124
+ catch {
125
+ return { result: { text } }; // response_format=text → plain body
126
+ }
127
+ }
128
+ // #414 — audio:speech (TTS): JSON request, but the response is BINARY audio. We
129
+ // base64-encode the bytes into result.audio so it rides the JSON task pipe.
130
+ if (intent === exports.AUDIO_SPEECH_INTENT) {
131
+ const p = payload ?? {};
132
+ const text = p.input;
133
+ if (typeof text !== "string" || !text) {
134
+ return {
135
+ error_code: 400,
136
+ error_message: `${engine}: audio:speech requires payload.input (text to synthesize)`,
137
+ };
138
+ }
139
+ const speechBody = { input: text };
140
+ const reqModel = (typeof p.model === "string" ? p.model : undefined) ?? model;
141
+ if (reqModel)
142
+ speechBody.model = reqModel;
143
+ for (const k of ["voice", "response_format", "speed"]) {
144
+ if (p[k] !== undefined && p[k] !== null)
145
+ speechBody[k] = p[k];
146
+ }
147
+ if (speechBody.voice === undefined)
148
+ speechBody.voice = "alloy";
149
+ const headersS = { "Content-Type": "application/json" };
150
+ if (apiKey)
151
+ headersS["Authorization"] = `Bearer ${apiKey}`;
152
+ const ctrlS = new AbortController();
153
+ const tS = setTimeout(() => ctrlS.abort(), timeoutMs);
154
+ let respS;
155
+ try {
156
+ respS = await fetch(`${baseUrl}${path}`, {
157
+ method: "POST",
158
+ headers: headersS,
159
+ body: JSON.stringify(speechBody),
160
+ signal: ctrlS.signal,
161
+ });
162
+ }
163
+ catch (exc) {
164
+ clearTimeout(tS);
165
+ const msg = exc instanceof Error ? exc.message : String(exc);
166
+ if (ctrlS.signal.aborted)
167
+ return { error_code: 408, error_message: `${engine}: backend timed out` };
168
+ return { error_code: 502, error_message: `${engine}: HTTP transport error: ${msg}` };
169
+ }
170
+ clearTimeout(tS);
171
+ if (!respS.ok) {
172
+ const errText = await respS.text().catch(() => "");
173
+ return {
174
+ error_code: respS.status,
175
+ error_message: `${engine}: upstream ${respS.status}: ${errText.slice(0, 512)}`,
176
+ };
177
+ }
178
+ const contentType = respS.headers.get("content-type") ?? "audio/mpeg";
179
+ const buf = Buffer.from(await respS.arrayBuffer());
180
+ return {
181
+ result: {
182
+ audio: buf.toString("base64"),
183
+ content_type: contentType,
184
+ format: speechBody.response_format ?? contentType.split("/").pop(),
185
+ },
186
+ };
187
+ }
46
188
  const body = { ...(payload ?? {}) };
47
189
  if (body.model === undefined && model !== undefined)
48
190
  body.model = model;
49
- if (!body.model) {
191
+ if (!body.model && !exports.MODEL_OPTIONAL_INTENTS.has(intent)) {
50
192
  return {
51
193
  error_code: 400,
52
194
  error_message: `${engine}: no model — either pass \`model\` to the backend factory ` +
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -23,5 +23,16 @@ export interface ServeOpts {
23
23
  logDir?: string;
24
24
  }
25
25
  export declare function applySavedNode(opts: ServeOpts, saved: NodeIdentity): ServeOpts;
26
+ /**
27
+ * #456 --verify: cryptographically confirm this node's CREDIT_AWARD income against the
28
+ * directory's signed event log (defends against a lying directory). Resolves the directory's
29
+ * Ed25519 key from /.well-known/did.json and re-derives + verifies each award signature.
30
+ * Free-tier CREDIT_ALLOCATION is unsigned by design, so it is not counted here (no cry-wolf).
31
+ */
32
+ export declare function verifyCreditAwards(directoryUrl: string, nodeId: string): Promise<{
33
+ sum: number;
34
+ verified: number;
35
+ failed: number;
36
+ }>;
26
37
  export declare function main(argv?: string[]): Promise<number>;
27
38
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAiCA,OAAO,EASL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkXD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,CAqB9E;AA2aD,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FlF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAuCA,OAAO,EAcL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsXD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,CAqB9E;AA6lBD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+D5D;AA6RD,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgGlF"}