@iicp/client 0.7.37 → 0.7.39

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.
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * CIP consumer dispatch gates (S.12 §2.2) — TS port of iicp_client.proxy.cip
5
+ * (gates.py + dispatch.py). Decides LOCAL / REMOTE / ERROR for a cooperative-inference
6
+ * request and surfaces the two structured errors the proxy maps to HTTP status:
7
+ * CIPInsufficientCredits → IICP-E036 → 402
8
+ * CIPNoEligibleWorkers → IICP-E022 → 503
9
+ *
10
+ * Faithful to the Python reference (full-parity, #482b). The gateway pure-consumer path
11
+ * passes no local node_list, so Gate 4 (local-first loopback preference) is skipped.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.CIPNoEligibleWorkers = exports.CIPInsufficientCredits = void 0;
15
+ exports.validateCipRequestFields = validateCipRequestFields;
16
+ exports.decideDispatch = decideDispatch;
17
+ exports.buildCipEnvelope = buildCipEnvelope;
18
+ exports.computeCipEnvelope = computeCipEnvelope;
19
+ exports.cipConfigFromEnv = cipConfigFromEnv;
20
+ const VALID_CIP_POLICIES = new Set(["best_of_n", "majority_vote", "map_reduce"]);
21
+ const REALTIME_QOS = new Set(["realtime"]);
22
+ class CIPInsufficientCredits extends Error {
23
+ code;
24
+ constructor(code = "IICP-E036") {
25
+ super(`CIP insufficient credits (${code})`);
26
+ this.name = "CIPInsufficientCredits";
27
+ this.code = code;
28
+ }
29
+ }
30
+ exports.CIPInsufficientCredits = CIPInsufficientCredits;
31
+ class CIPNoEligibleWorkers extends Error {
32
+ code;
33
+ constructor(code = "IICP-E022") {
34
+ super(`CIP no eligible workers (${code})`);
35
+ this.name = "CIPNoEligibleWorkers";
36
+ this.code = code;
37
+ }
38
+ }
39
+ exports.CIPNoEligibleWorkers = CIPNoEligibleWorkers;
40
+ /** Parse-time validation of cip.policy / cip.replicas / cip.quorum (S.12 §5.2). */
41
+ function validateCipRequestFields(body) {
42
+ const cip = body.cip;
43
+ if (cip === null || typeof cip !== "object" || Array.isArray(cip))
44
+ return null;
45
+ const c = cip;
46
+ const policy = c.policy;
47
+ if (policy !== undefined && policy !== null && !VALID_CIP_POLICIES.has(String(policy)))
48
+ return "IICP-E028";
49
+ const replicas = c.replicas;
50
+ if (replicas !== undefined && replicas !== null) {
51
+ if (!Number.isInteger(replicas) || replicas < 1 || replicas > 10)
52
+ return "IICP-E028";
53
+ if (policy === "majority_vote" && replicas % 2 === 0)
54
+ return "IICP-E025";
55
+ }
56
+ const quorum = c.quorum;
57
+ if (quorum !== undefined && quorum !== null) {
58
+ if (!Number.isInteger(quorum) || quorum < 1)
59
+ return "IICP-E028";
60
+ const effReplicas = Number.isInteger(replicas) ? replicas : 1;
61
+ if (quorum > effReplicas)
62
+ return "IICP-E028";
63
+ }
64
+ return null;
65
+ }
66
+ function blockedRemote(config, errorCode) {
67
+ // local-first runs locally (graceful); other strategies surface the structured error.
68
+ if (config.strategy === "local-first")
69
+ return { result: "local" };
70
+ return { result: "error", errorCode };
71
+ }
72
+ /** Evaluate the §2.2 normative gates → dispatch decision (port of gates.decide_dispatch). */
73
+ function decideDispatch(args) {
74
+ const { estimatedCredits, sensitivity, eligibleWorkers, config } = args;
75
+ const replicas = args.replicas ?? 1;
76
+ const consumerBalance = args.consumerBalance ?? null;
77
+ const sessionSpent = args.sessionSpent ?? 0;
78
+ // Gate 1 — not enabled → local.
79
+ if (!config.enabled)
80
+ return { result: "local" };
81
+ // Gates 2a–2c — affordability.
82
+ if (estimatedCredits > config.maxCreditsPerTask)
83
+ return { result: "local" };
84
+ if (config.sessionCreditBudget !== null && sessionSpent + estimatedCredits > config.sessionCreditBudget) {
85
+ return { result: "local" };
86
+ }
87
+ if (consumerBalance !== null && estimatedCredits > consumerBalance) {
88
+ return blockedRemote(config, "IICP-E036");
89
+ }
90
+ // Gate 3 — sensitivity opt-in.
91
+ if (sensitivity === "high" && !config.sendSensitivePrompts)
92
+ return { result: "local" };
93
+ // Gate 4 (local-first loopback preference) is skipped — the proxy is a pure consumer.
94
+ // Gate 5/6 — eligible worker count must satisfy the replica requirement.
95
+ if (eligibleWorkers.length < Math.max(replicas, 1)) {
96
+ if (config.strategy === "local-first")
97
+ return { result: "local" };
98
+ return { result: "error", errorCode: "IICP-E022" };
99
+ }
100
+ return { result: "remote", cipSessionKey: `cip-sess-${args.estimatedCredits}-${Math.random().toString(36).slice(2, 10)}` };
101
+ }
102
+ /** Build the cip envelope object for a CALL body from a REMOTE decision (CIP-CALL-01). */
103
+ function buildCipEnvelope(decision, parentTaskId) {
104
+ if (decision.result !== "remote" || !decision.cipSessionKey)
105
+ return null;
106
+ return { cip_role: "worker", cip_session_key: decision.cipSessionKey, cip_parent_task_id: parentTaskId };
107
+ }
108
+ /**
109
+ * Evaluate CIP consumer gates and build the dispatch envelope (port of
110
+ * dispatch.compute_cip_envelope). Returns null for LOCAL/disabled/invalid; throws
111
+ * CIPInsufficientCredits (E036) / CIPNoEligibleWorkers (E022) for the blocking errors.
112
+ */
113
+ function computeCipEnvelope(nodes, body, config, taskId, qos, consumerBalance) {
114
+ if (!config || !config.enabled || (qos != null && REALTIME_QOS.has(qos)))
115
+ return null;
116
+ if (validateCipRequestFields(body) !== null)
117
+ return null; // invalid cip fields → local fallback
118
+ let eligible = nodes
119
+ .filter((n) => n.allow_remote_inference && n.node_id && (n.reputation_score ?? 0) >= config.minReputation)
120
+ .map((n) => n.node_id);
121
+ if (config.trustedPeers.length > 0) {
122
+ const trusted = new Set(config.trustedPeers);
123
+ eligible = eligible.filter((id) => trusted.has(id));
124
+ }
125
+ const cip = body.cip;
126
+ const replicas = cip && typeof cip === "object" ? Number(cip.replicas ?? 1) : 1;
127
+ const decision = decideDispatch({
128
+ estimatedCredits: 1.0,
129
+ sensitivity: body.sensitivity ?? null,
130
+ eligibleWorkers: eligible,
131
+ config,
132
+ replicas,
133
+ consumerBalance: consumerBalance ?? null,
134
+ });
135
+ if (decision.result === "error" && decision.errorCode === "IICP-E036")
136
+ throw new CIPInsufficientCredits(decision.errorCode);
137
+ if (decision.result === "error" && decision.errorCode === "IICP-E022")
138
+ throw new CIPNoEligibleWorkers(decision.errorCode);
139
+ return buildCipEnvelope(decision, taskId);
140
+ }
141
+ /** Load CIP config from IICP_PROXY_CIP_* env (enabled defaults OFF — §2.2 ¶1). */
142
+ function cipConfigFromEnv() {
143
+ const env = process.env;
144
+ const truthy = (v) => ["1", "true", "yes"].includes((v ?? "").trim().toLowerCase());
145
+ const strat = (env.IICP_PROXY_CIP_STRATEGY ?? "local-first").trim();
146
+ return {
147
+ enabled: truthy(env.IICP_PROXY_CIP_ENABLED),
148
+ strategy: ["local-first", "remote-first", "balanced"].includes(strat) ? strat : "local-first",
149
+ maxCreditsPerTask: Number(env.IICP_PROXY_CIP_MAX_CREDITS_PER_TASK ?? 10) || 10,
150
+ sessionCreditBudget: env.IICP_PROXY_CIP_SESSION_CREDIT_BUDGET ? Number(env.IICP_PROXY_CIP_SESSION_CREDIT_BUDGET) : null,
151
+ sendSensitivePrompts: truthy(env.IICP_PROXY_CIP_SEND_SENSITIVE_PROMPTS),
152
+ trustedPeers: (env.IICP_PROXY_CIP_TRUSTED_PEERS ?? "").split(",").map((s) => s.trim()).filter(Boolean),
153
+ minReputation: Number(env.IICP_PROXY_CIP_MIN_REPUTATION ?? 0) || 0,
154
+ };
155
+ }
156
+ //# sourceMappingURL=cip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cip.js","sourceRoot":"","sources":["../../src/proxy/cip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * iicp-node proxy (ADR-050) — local OpenAI/Ollama/Anthropic-compat gateway.
3
+ *
4
+ * A loopback HTTP server that translates external chat-API requests into IICP mesh
5
+ * calls via {@link IicpClient} and translates responses back. It does NOT register
6
+ * with the directory (consumer gateway). Mirrors the Python `iicp_client.proxy`
7
+ * behaviour per project/proxy-unification-contract.md; verified against
8
+ * tests/conformance/proxy_fixtures.json.
9
+ *
10
+ * v1 covers the non-CIP fixtures (success / upstream-502 / no-nodes-502 / 500 /
11
+ * static endpoints / streaming). The CIP affordability + no-eligible-workers gates
12
+ * (402 IICP-E036 / 503 IICP-E022) require porting the proxy CIP dispatch to TS and
13
+ * are tracked under the conformance issue (#482).
14
+ */
15
+ import * as http from "node:http";
16
+ export interface ProxyConfig {
17
+ host: string;
18
+ port: number;
19
+ directoryUrl?: string;
20
+ region?: string;
21
+ token?: string;
22
+ }
23
+ /** Minimal IICP task surface the gateway needs — lets tests inject a mock. */
24
+ export interface TaskClient {
25
+ submit(req: {
26
+ intent: string;
27
+ payload: Record<string, unknown>;
28
+ constraints?: Record<string, unknown>;
29
+ }): Promise<{
30
+ status: string;
31
+ result?: unknown;
32
+ error?: {
33
+ code?: string;
34
+ };
35
+ }>;
36
+ /** Optional — used only for CIP consumer gating (S.12 §2.2) when CIP is enabled. */
37
+ discover?(intent: string): Promise<Array<{
38
+ node_id?: string;
39
+ allow_remote_inference?: boolean;
40
+ reputation_score?: number;
41
+ }>>;
42
+ }
43
+ /** Build the gateway HTTP server. `client` is injectable for tests. */
44
+ export declare function createProxyServer(client: TaskClient): http.Server;
45
+ /** CLI entry: build a real IicpClient gateway and listen (loopback by default). */
46
+ export declare function runProxy(cfg: ProxyConfig): Promise<number>;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAmBlC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC7E,oFAAoF;IACpF,QAAQ,CAAC,CACP,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACtG;AAmND,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,MAAM,CA6BjE;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB1D"}
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProxyServer = createProxyServer;
4
+ exports.runProxy = runProxy;
5
+ // SPDX-License-Identifier: Apache-2.0
6
+ /**
7
+ * iicp-node proxy (ADR-050) — local OpenAI/Ollama/Anthropic-compat gateway.
8
+ *
9
+ * A loopback HTTP server that translates external chat-API requests into IICP mesh
10
+ * calls via {@link IicpClient} and translates responses back. It does NOT register
11
+ * with the directory (consumer gateway). Mirrors the Python `iicp_client.proxy`
12
+ * behaviour per project/proxy-unification-contract.md; verified against
13
+ * tests/conformance/proxy_fixtures.json.
14
+ *
15
+ * v1 covers the non-CIP fixtures (success / upstream-502 / no-nodes-502 / 500 /
16
+ * static endpoints / streaming). The CIP affordability + no-eligible-workers gates
17
+ * (402 IICP-E036 / 503 IICP-E022) require porting the proxy CIP dispatch to TS and
18
+ * are tracked under the conformance issue (#482).
19
+ */
20
+ const http = require("node:http");
21
+ const client_js_1 = require("../client.js");
22
+ const errors_js_1 = require("../errors.js");
23
+ const cip_js_1 = require("./cip.js");
24
+ const INTENT = "urn:iicp:intent:llm:chat:v1";
25
+ /** CIP consumer config (env IICP_PROXY_CIP_*); enabled defaults OFF (§2.2 ¶1). */
26
+ const CIP_CONFIG = (0, cip_js_1.cipConfigFromEnv)();
27
+ const OLLAMA_VERSION = "0.1.0";
28
+ /** The proxy self-identifies as `iicp-proxy` on every response (Server header). */
29
+ const SERVER_ID = "iicp-proxy";
30
+ // ── translators (mirror iicp_client.proxy.*_compat.translator) ───────────────
31
+ function firstMessage(resp) {
32
+ const result = (resp.result ?? {});
33
+ const choices = result.choices ?? [{}];
34
+ const msg = choices[0]?.message ?? {};
35
+ return { role: msg.role ?? "assistant", content: msg.content ?? "" };
36
+ }
37
+ function usageOf(resp) {
38
+ const result = (resp.result ?? {});
39
+ return result.usage ?? {};
40
+ }
41
+ function nowIso() {
42
+ return new Date().toISOString().replace(/\.\d+Z$/, "Z");
43
+ }
44
+ function toOpenAI(resp, model) {
45
+ const m = firstMessage(resp);
46
+ return {
47
+ id: `chatcmpl-iicp`,
48
+ object: "chat.completion",
49
+ created: Math.floor(Date.now() / 1000),
50
+ model,
51
+ choices: [{ index: 0, message: { role: m.role, content: m.content }, finish_reason: "stop" }],
52
+ usage: usageOf(resp),
53
+ };
54
+ }
55
+ function toOllama(resp, model) {
56
+ const m = firstMessage(resp);
57
+ return {
58
+ model,
59
+ created_at: nowIso(),
60
+ message: { role: m.role, content: m.content },
61
+ done: true,
62
+ done_reason: "stop",
63
+ };
64
+ }
65
+ function toOllamaGenerate(resp, model) {
66
+ const m = firstMessage(resp);
67
+ return { model, created_at: nowIso(), response: m.content, done: true, done_reason: "stop" };
68
+ }
69
+ function toAnthropic(resp, model, taskId) {
70
+ const m = firstMessage(resp);
71
+ return {
72
+ id: `msg_${taskId || "iicp"}`,
73
+ type: "message",
74
+ role: "assistant",
75
+ model,
76
+ content: [{ type: "text", text: m.content }],
77
+ stop_reason: "end_turn",
78
+ usage: usageOf(resp),
79
+ };
80
+ }
81
+ // ── error bodies (per-surface, per the contract error map) ───────────────────
82
+ function openaiErr(code, message) {
83
+ return { error: { code, message } };
84
+ }
85
+ function ollamaErr(code, message) {
86
+ return { error: `${code}: ${message}` };
87
+ }
88
+ function anthropicErr(code, message) {
89
+ return { type: "error", error: { type: "api_error", message: `${code}: ${message}` } };
90
+ }
91
+ async function runChatTask(client, messages, model, extra, body) {
92
+ try {
93
+ let payloadExtra = extra;
94
+ // CIP consumer gating (§2.2) — only when enabled; throws CIPInsufficientCredits
95
+ // (E036→402) / CIPNoEligibleWorkers (E022→503), else returns an envelope to attach.
96
+ if (CIP_CONFIG.enabled && client.discover) {
97
+ const taskId = `cip-${Date.now()}`;
98
+ const nodes = await client.discover(INTENT);
99
+ const balance = body.billing?.consumer_balance ?? null;
100
+ const envelope = (0, cip_js_1.computeCipEnvelope)(nodes, body, CIP_CONFIG, taskId, body.qos, balance);
101
+ if (envelope) {
102
+ payloadExtra = { ...extra, cip: { ...(extra.cip ?? {}), ...envelope } };
103
+ }
104
+ }
105
+ const resp = await client.submit({
106
+ intent: INTENT,
107
+ payload: { messages, model, ...payloadExtra },
108
+ constraints: { timeout_ms: 30000 },
109
+ });
110
+ if (resp.status !== "success" && resp.status !== "completed") {
111
+ return { kind: "error", status: 502, code: resp.error?.code ?? "proxy_error" };
112
+ }
113
+ return { kind: "ok", resp };
114
+ }
115
+ catch (err) {
116
+ // CIP gating errors map to dedicated statuses (S.12 §2.2 / §10.1).
117
+ if (err instanceof cip_js_1.CIPInsufficientCredits)
118
+ return { kind: "error", status: 402, code: err.code };
119
+ if (err instanceof cip_js_1.CIPNoEligibleWorkers)
120
+ return { kind: "error", status: 503, code: err.code };
121
+ if (err instanceof errors_js_1.IicpError) {
122
+ // No nodes from discover → IICP-E033 (parity with the Python empty-discover path).
123
+ if (err.code === "SDK-03")
124
+ return { kind: "error", status: 502, code: "IICP-E033" };
125
+ return { kind: "error", status: 502, code: err.code };
126
+ }
127
+ return { kind: "error", status: 500, code: "proxy_error" };
128
+ }
129
+ }
130
+ // ── HTTP plumbing ────────────────────────────────────────────────────────────
131
+ async function readJson(req) {
132
+ const chunks = [];
133
+ for await (const c of req)
134
+ chunks.push(c);
135
+ const raw = Buffer.concat(chunks).toString("utf8");
136
+ return raw ? JSON.parse(raw) : {};
137
+ }
138
+ function sendJson(res, status, body) {
139
+ const data = JSON.stringify(body);
140
+ res.writeHead(status, { "Content-Type": "application/json", "Server": SERVER_ID });
141
+ res.end(data);
142
+ }
143
+ function messagesOf(body) {
144
+ return body.messages ?? [];
145
+ }
146
+ function extraOf(body) {
147
+ const e = {};
148
+ for (const k of ["temperature", "max_tokens", "cip", "billing", "qos"]) {
149
+ if (body[k] !== undefined)
150
+ e[k] = body[k];
151
+ }
152
+ return e;
153
+ }
154
+ function errMsg(status) {
155
+ if (status === 402)
156
+ return "Insufficient credits";
157
+ if (status === 503)
158
+ return "No eligible workers";
159
+ if (status === 502)
160
+ return "Upstream error";
161
+ return "Internal proxy error";
162
+ }
163
+ // ── per-surface handlers ─────────────────────────────────────────────────────
164
+ async function handleOpenAIChat(client, req, res) {
165
+ const body = await readJson(req);
166
+ const model = body.model ?? "iicp";
167
+ const out = await runChatTask(client, messagesOf(body), model, extraOf(body), body);
168
+ if (out.kind === "error")
169
+ return sendJson(res, out.status, openaiErr(out.code, errMsg(out.status)));
170
+ return sendJson(res, 200, toOpenAI(out.resp, model));
171
+ }
172
+ async function handleOllamaChat(client, req, res, generate) {
173
+ const body = await readJson(req);
174
+ const model = body.model ?? "iicp";
175
+ const stream = body.stream === undefined ? true : Boolean(body.stream); // Ollama default true
176
+ const messages = generate
177
+ ? [{ role: "user", content: String(body.prompt ?? "") }]
178
+ : messagesOf(body);
179
+ const out = await runChatTask(client, messages, model, extraOf(body), body);
180
+ if (out.kind === "error")
181
+ return sendJson(res, out.status, ollamaErr(out.code, errMsg(out.status)));
182
+ const payload = generate ? toOllamaGenerate(out.resp, model) : toOllama(out.resp, model);
183
+ if (stream) {
184
+ res.writeHead(200, { "Content-Type": "application/x-ndjson", "Server": SERVER_ID });
185
+ res.end(JSON.stringify(payload) + "\n"); // one terminal NDJSON line (done=true)
186
+ return;
187
+ }
188
+ return sendJson(res, 200, payload);
189
+ }
190
+ async function handleAnthropicMessages(client, req, res) {
191
+ const body = await readJson(req);
192
+ const model = body.model ?? "iicp";
193
+ const stream = Boolean(body.stream); // Anthropic default false
194
+ const out = await runChatTask(client, messagesOf(body), model, extraOf(body), body);
195
+ if (out.kind === "error")
196
+ return sendJson(res, out.status, anthropicErr(out.code, errMsg(out.status)));
197
+ const msg = toAnthropic(out.resp, model, "iicp");
198
+ if (stream) {
199
+ const text = firstMessage(out.resp).content;
200
+ res.writeHead(200, { "Content-Type": "text/event-stream", "Server": SERVER_ID });
201
+ const ev = (type, data) => res.write(`event: ${type}\ndata: ${JSON.stringify({ type, ...data })}\n\n`);
202
+ ev("message_start", { message: msg });
203
+ ev("content_block_start", { index: 0, content_block: { type: "text", text: "" } });
204
+ ev("content_block_delta", { index: 0, delta: { type: "text_delta", text } });
205
+ ev("content_block_stop", { index: 0 });
206
+ ev("message_delta", { delta: { stop_reason: "end_turn" } });
207
+ ev("message_stop", {});
208
+ res.end();
209
+ return;
210
+ }
211
+ return sendJson(res, 200, msg);
212
+ }
213
+ // ── server ───────────────────────────────────────────────────────────────────
214
+ const MODELS_LIST = { object: "list", data: [{ id: "iicp", object: "model", created: 1700000000, owned_by: "iicp" }] };
215
+ const OLLAMA_TAGS = { models: [{ name: "iicp", model: "iicp", modified_at: "", size: 0, digest: "" }] };
216
+ /** Build the gateway HTTP server. `client` is injectable for tests. */
217
+ function createProxyServer(client) {
218
+ return http.createServer((req, res) => {
219
+ const method = req.method ?? "GET";
220
+ const path = (req.url ?? "/").split("?")[0];
221
+ const route = `${method} ${path}`;
222
+ (async () => {
223
+ try {
224
+ switch (route) {
225
+ case "POST /v1/chat/completions": return await handleOpenAIChat(client, req, res);
226
+ case "POST /api/chat": return await handleOllamaChat(client, req, res, false);
227
+ case "POST /api/generate": return await handleOllamaChat(client, req, res, true);
228
+ case "GET /api/tags": return sendJson(res, 200, OLLAMA_TAGS);
229
+ case "GET /api/version": return sendJson(res, 200, { version: OLLAMA_VERSION });
230
+ case "POST /v1/messages": return await handleAnthropicMessages(client, req, res);
231
+ case "GET /v1/models": return sendJson(res, 200, MODELS_LIST);
232
+ case "GET /status": return sendJson(res, 200, { status: "ok", role: "proxy" });
233
+ case "GET /metrics": {
234
+ res.writeHead(200, { "Content-Type": "text/plain; version=0.0.4", "Server": SERVER_ID });
235
+ res.end("# iicp-proxy metrics\n");
236
+ return;
237
+ }
238
+ default:
239
+ return sendJson(res, 404, openaiErr("not_found", `no route for ${route}`));
240
+ }
241
+ }
242
+ catch {
243
+ return sendJson(res, 500, openaiErr("proxy_error", "Internal proxy error"));
244
+ }
245
+ })();
246
+ });
247
+ }
248
+ /** CLI entry: build a real IicpClient gateway and listen (loopback by default). */
249
+ function runProxy(cfg) {
250
+ const client = new client_js_1.IicpClient({
251
+ directory_url: cfg.directoryUrl,
252
+ region: cfg.region,
253
+ api_token: cfg.token,
254
+ });
255
+ const server = createProxyServer(client);
256
+ return new Promise((resolve) => {
257
+ server.listen(cfg.port, cfg.host, () => {
258
+ process.stdout.write(`iicp-node proxy → http://${cfg.host}:${cfg.port} (OpenAI/Ollama/Anthropic compat; no directory registration)\n`);
259
+ });
260
+ server.on("error", (e) => {
261
+ process.stderr.write(`proxy error: ${String(e)}\n`);
262
+ resolve(1);
263
+ });
264
+ });
265
+ }
266
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iicp/client",
3
- "version": "0.7.37",
3
+ "version": "0.7.39",
4
4
  "description": "Official TypeScript/JavaScript SDK for the IICP protocol (ADR-016)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",