@iicp/client 0.7.100 → 0.7.102

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.
Files changed (50) hide show
  1. package/LICENSE +83 -61
  2. package/README.md +2 -2
  3. package/dist/backends/openai_compat.d.ts +3 -0
  4. package/dist/backends/openai_compat.d.ts.map +1 -1
  5. package/dist/backends/openai_compat.js +119 -0
  6. package/dist/backends/openai_compat.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +264 -39
  9. package/dist/cli.js.map +1 -1
  10. package/dist/iicp_tcp.d.ts +38 -0
  11. package/dist/iicp_tcp.d.ts.map +1 -1
  12. package/dist/iicp_tcp.js +164 -0
  13. package/dist/iicp_tcp.js.map +1 -1
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +10 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/mcp_negotiation.d.ts +23 -0
  19. package/dist/mcp_negotiation.d.ts.map +1 -0
  20. package/dist/mcp_negotiation.js +94 -0
  21. package/dist/mcp_negotiation.js.map +1 -0
  22. package/dist/native_call_identity.d.ts +12 -0
  23. package/dist/native_call_identity.d.ts.map +1 -0
  24. package/dist/native_call_identity.js +44 -0
  25. package/dist/native_call_identity.js.map +1 -0
  26. package/dist/native_response_sequence.d.ts +32 -0
  27. package/dist/native_response_sequence.d.ts.map +1 -0
  28. package/dist/native_response_sequence.js +59 -0
  29. package/dist/native_response_sequence.js.map +1 -0
  30. package/dist/node.d.ts +5 -1
  31. package/dist/node.d.ts.map +1 -1
  32. package/dist/node.js +59 -7
  33. package/dist/node.js.map +1 -1
  34. package/dist/operator_profile.d.ts +18 -0
  35. package/dist/operator_profile.d.ts.map +1 -0
  36. package/dist/operator_profile.js +22 -0
  37. package/dist/operator_profile.js.map +1 -0
  38. package/dist/relay_session.d.ts +16 -4
  39. package/dist/relay_session.d.ts.map +1 -1
  40. package/dist/relay_session.js +116 -1
  41. package/dist/relay_session.js.map +1 -1
  42. package/dist/runtime_health.d.ts +77 -0
  43. package/dist/runtime_health.d.ts.map +1 -0
  44. package/dist/runtime_health.js +65 -0
  45. package/dist/runtime_health.js.map +1 -0
  46. package/dist/service.d.ts +7 -0
  47. package/dist/service.d.ts.map +1 -1
  48. package/dist/service.js +44 -0
  49. package/dist/service.js.map +1 -1
  50. package/package.json +6 -3
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /** MCP protocol-era negotiation and stateless request helpers. */
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.McpNegotiationError = exports.SUPPORTED_MCP_REVISIONS = exports.MODERN_MCP_REVISION = exports.LEGACY_MCP_REVISION = void 0;
6
+ exports.evaluateMcpEra = evaluateMcpEra;
7
+ exports.buildModernMcpRequest = buildModernMcpRequest;
8
+ exports.validateModernMcpResponse = validateModernMcpResponse;
9
+ exports.LEGACY_MCP_REVISION = "2025-11-25";
10
+ exports.MODERN_MCP_REVISION = "2026-07-28";
11
+ exports.SUPPORTED_MCP_REVISIONS = [exports.LEGACY_MCP_REVISION, exports.MODERN_MCP_REVISION];
12
+ const SUPPORTED_EXTENSIONS = new Set(["tasks", "skills", "apps"]);
13
+ class McpNegotiationError extends Error {
14
+ reason;
15
+ constructor(reason) {
16
+ super(reason);
17
+ this.reason = reason;
18
+ }
19
+ }
20
+ exports.McpNegotiationError = McpNegotiationError;
21
+ function evaluateMcpEra(input) {
22
+ const authorizationFailures = [
23
+ ["oauth_issuer_matches", "oauth_issuer_mismatch"],
24
+ ["oauth_audience_matches", "oauth_audience_mismatch"],
25
+ ["resource_indicator_present", "missing_resource_indicator"],
26
+ ["protected_resource_metadata_valid", "invalid_protected_resource_metadata"],
27
+ ["pkce_valid", "pkce_required"],
28
+ ["consent_granted", "consent_required"],
29
+ ["audit_output_redacted", "audit_redaction_required"],
30
+ ];
31
+ for (const [field, reason] of authorizationFailures) {
32
+ if (input[field] === false)
33
+ return { accepted: false, reason };
34
+ }
35
+ if (input["downstream_credential_source"] === "caller")
36
+ return { accepted: false, reason: "credential_passthrough_prohibited" };
37
+ if (input["server_identity_matches_selected_endpoint"] === false)
38
+ return { accepted: false, reason: "server_identity_mismatch" };
39
+ if (input["modern_request_failed"] && !input["legacy_authentication_available"])
40
+ return { accepted: false, reason: "unauthenticated_downgrade" };
41
+ const extension = input["extension"];
42
+ if (typeof extension === "string" && !SUPPORTED_EXTENSIONS.has(extension))
43
+ return { accepted: false, reason: "unsupported_extension" };
44
+ const offered = input["offered_revision"];
45
+ if (offered === exports.MODERN_MCP_REVISION) {
46
+ if (input["protocol_header_present"] === false)
47
+ return { accepted: false, reason: "missing_protocol_version" };
48
+ if (input["method_header_matches"] === false || input["name_header_matches"] === false)
49
+ return { accepted: false, reason: "header_body_mismatch" };
50
+ if (input["reserved_meta_valid"] === false)
51
+ return { accepted: false, reason: "malformed_reserved_metadata" };
52
+ const peer = Array.isArray(input["peer_supported_revisions"]) ? input["peer_supported_revisions"] : [];
53
+ if (peer.length === 0 || peer.includes(exports.MODERN_MCP_REVISION)) {
54
+ return input["request_state_explicit"]
55
+ ? { accepted: true, state_source: "request" }
56
+ : { accepted: true, era: "modern", session_mode: "stateless" };
57
+ }
58
+ if (peer.includes(exports.LEGACY_MCP_REVISION) && input["legacy_revision_explicitly_offered"] && input["security_requirements_preserved"])
59
+ return { accepted: true, era: "legacy", reason: "explicit_mutual_downgrade" };
60
+ return { accepted: false, reason: "unsupported_revision" };
61
+ }
62
+ if (offered === exports.LEGACY_MCP_REVISION) {
63
+ const peer = Array.isArray(input["peer_supported_revisions"]) ? input["peer_supported_revisions"] : [];
64
+ if (peer.length === 0 || peer.includes(exports.LEGACY_MCP_REVISION))
65
+ return { accepted: true, era: "legacy", session_mode: "negotiated" };
66
+ }
67
+ return { accepted: false, reason: "unsupported_revision" };
68
+ }
69
+ function buildModernMcpRequest(input) {
70
+ const extensions = input.extensions ?? [];
71
+ if (extensions.some((extension) => !SUPPORTED_EXTENSIONS.has(extension)))
72
+ throw new McpNegotiationError("unsupported_extension");
73
+ const meta = {
74
+ protocolVersion: exports.MODERN_MCP_REVISION,
75
+ client: { name: input.clientName ?? "iicp-gateway" },
76
+ };
77
+ if (extensions.length)
78
+ meta["extensions"] = extensions;
79
+ if (input.requestState)
80
+ meta["requestState"] = input.requestState;
81
+ return {
82
+ headers: { "MCP-Protocol-Version": exports.MODERN_MCP_REVISION, "Mcp-Method": input.method, "Mcp-Name": input.name },
83
+ body: { jsonrpc: "2.0", id: input.requestId, method: input.method, params: { ...input.params, _meta: meta } },
84
+ };
85
+ }
86
+ function validateModernMcpResponse(data, expectedServerName) {
87
+ const meta = data["_meta"];
88
+ if (!meta || meta["protocolVersion"] !== exports.MODERN_MCP_REVISION)
89
+ throw new McpNegotiationError("malformed_reserved_metadata");
90
+ const server = meta["server"];
91
+ if (!server || server["name"] !== expectedServerName)
92
+ throw new McpNegotiationError("server_identity_mismatch");
93
+ }
94
+ //# sourceMappingURL=mcp_negotiation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_negotiation.js","sourceRoot":"","sources":["../src/mcp_negotiation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Fail-closed identity validation for negotiated native lifecycle CALLs. */
2
+ export declare const LIFECYCLE_PROFILE = "urn:iicp:profile:service-lifecycle:v1";
3
+ export declare class NativeCallIdentityError extends Error {
4
+ readonly code: string;
5
+ constructor(code: string);
6
+ }
7
+ export declare class NativeCallIdentityRegistry {
8
+ private readonly tasks;
9
+ private readonly calls;
10
+ accept(call: Record<string, unknown>): void;
11
+ }
12
+ //# sourceMappingURL=native_call_identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_call_identity.d.ts","sourceRoot":"","sources":["../src/native_call_identity.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AAEzE,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAIlC;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAsB5C"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /** Fail-closed identity validation for negotiated native lifecycle CALLs. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NativeCallIdentityRegistry = exports.NativeCallIdentityError = exports.LIFECYCLE_PROFILE = void 0;
5
+ exports.LIFECYCLE_PROFILE = "urn:iicp:profile:service-lifecycle:v1";
6
+ class NativeCallIdentityError extends Error {
7
+ code;
8
+ constructor(code) {
9
+ super(code);
10
+ this.code = code;
11
+ this.name = "NativeCallIdentityError";
12
+ }
13
+ }
14
+ exports.NativeCallIdentityError = NativeCallIdentityError;
15
+ class NativeCallIdentityRegistry {
16
+ tasks = new Map();
17
+ calls = new Set();
18
+ accept(call) {
19
+ if (call.profile !== exports.LIFECYCLE_PROFILE)
20
+ return;
21
+ const taskId = call.task_id;
22
+ const callId = call.call_id;
23
+ const idempotencyKey = call.idempotency_key;
24
+ if (typeof taskId !== "string" || taskId.length === 0) {
25
+ throw new NativeCallIdentityError("missing_task_id");
26
+ }
27
+ if (typeof callId !== "string" || callId.length === 0) {
28
+ throw new NativeCallIdentityError("missing_call_id");
29
+ }
30
+ if (typeof idempotencyKey !== "string" || idempotencyKey.length === 0) {
31
+ throw new NativeCallIdentityError("missing_idempotency_key");
32
+ }
33
+ if (this.calls.has(callId))
34
+ throw new NativeCallIdentityError("call_id_reuse");
35
+ const knownKey = this.tasks.get(taskId);
36
+ if (knownKey !== undefined && knownKey !== idempotencyKey) {
37
+ throw new NativeCallIdentityError("task_identity_conflict");
38
+ }
39
+ this.tasks.set(taskId, idempotencyKey);
40
+ this.calls.add(callId);
41
+ }
42
+ }
43
+ exports.NativeCallIdentityRegistry = NativeCallIdentityRegistry;
44
+ //# sourceMappingURL=native_call_identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_call_identity.js","sourceRoot":"","sources":["../src/native_call_identity.ts"],"names":[],"mappings":";AAAA,6EAA6E;;;AAEhE,QAAA,iBAAiB,GAAG,uCAAuC,CAAC;AAEzE,MAAa,uBAAwB,SAAQ,KAAK;IAC3B;IAArB,YAAqB,IAAY;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC;QADO,SAAI,GAAJ,IAAI,CAAQ;QAE/B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC;AAED,MAAa,0BAA0B;IACpB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,MAAM,CAAC,IAA6B;QAClC,IAAI,IAAI,CAAC,OAAO,KAAK,yBAAiB;YAAE,OAAO;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,uBAAuB,CAAC,yBAAyB,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,uBAAuB,CAAC,eAAe,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC1D,MAAM,IAAI,uBAAuB,CAAC,wBAAwB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;CACF;AA1BD,gEA0BC"}
@@ -0,0 +1,32 @@
1
+ /** Transport-independent validation for negotiated native RESPONSE sequences. */
2
+ export type NativeLifecycleEnvelope = {
3
+ task_id: string;
4
+ sequence: number;
5
+ event: string;
6
+ is_final: boolean;
7
+ };
8
+ export type NativeResponseFrame = {
9
+ session_id: string;
10
+ call_id: string;
11
+ status: string;
12
+ is_final: boolean;
13
+ lifecycle: NativeLifecycleEnvelope;
14
+ result?: unknown;
15
+ error?: unknown;
16
+ tokens_used?: number;
17
+ };
18
+ export declare class NativeResponseSequenceError extends Error {
19
+ readonly code: string;
20
+ constructor(code: string);
21
+ }
22
+ export declare class NativeResponseSequence {
23
+ private readonly sessionId;
24
+ private readonly callId;
25
+ private readonly taskId;
26
+ private nextSequence;
27
+ private terminalSeen;
28
+ constructor(sessionId: string, callId: string, taskId: string);
29
+ accept(frame: NativeResponseFrame): void;
30
+ finish(): void;
31
+ }
32
+ //# sourceMappingURL=native_response_sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_response_sequence.d.ts","sourceRoot":"","sources":["../src/native_response_sequence.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,uBAAuB,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,qBAAa,2BAA4B,SAAQ,KAAK;aACxB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAGzC;AAED,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;gBAGV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;IAGjC,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAyBxC,MAAM,IAAI,IAAI;CAGf"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NativeResponseSequence = exports.NativeResponseSequenceError = void 0;
4
+ class NativeResponseSequenceError extends Error {
5
+ code;
6
+ constructor(code) {
7
+ super(code);
8
+ this.code = code;
9
+ }
10
+ }
11
+ exports.NativeResponseSequenceError = NativeResponseSequenceError;
12
+ class NativeResponseSequence {
13
+ sessionId;
14
+ callId;
15
+ taskId;
16
+ nextSequence = 0;
17
+ terminalSeen = false;
18
+ constructor(sessionId, callId, taskId) {
19
+ this.sessionId = sessionId;
20
+ this.callId = callId;
21
+ this.taskId = taskId;
22
+ }
23
+ accept(frame) {
24
+ if (this.terminalSeen)
25
+ throw new NativeResponseSequenceError("response_after_terminal");
26
+ if (!frame.lifecycle)
27
+ throw new NativeResponseSequenceError("missing_lifecycle");
28
+ if (frame.session_id !== this.sessionId)
29
+ throw new NativeResponseSequenceError("session_id_drift");
30
+ if (frame.call_id !== this.callId)
31
+ throw new NativeResponseSequenceError("call_id_drift");
32
+ if (frame.lifecycle.task_id !== this.taskId)
33
+ throw new NativeResponseSequenceError("task_id_drift");
34
+ if (frame.lifecycle.sequence !== this.nextSequence)
35
+ throw new NativeResponseSequenceError("sequence_drift");
36
+ if (frame.is_final !== frame.lifecycle.is_final)
37
+ throw new NativeResponseSequenceError("finality_disagreement");
38
+ const expectedEvents = {
39
+ partial: new Set(["partial"]),
40
+ success: new Set(["completed"]),
41
+ error: new Set(["failed", "cancelled"]),
42
+ timeout: new Set(["timed_out", "expired"]),
43
+ };
44
+ if (!expectedEvents[frame.status]?.has(frame.lifecycle.event)) {
45
+ throw new NativeResponseSequenceError("status_event_disagreement");
46
+ }
47
+ if ((frame.status === "partial" && frame.is_final) || (frame.status !== "partial" && !frame.is_final)) {
48
+ throw new NativeResponseSequenceError("terminal_flag_mismatch");
49
+ }
50
+ this.nextSequence += 1;
51
+ this.terminalSeen = frame.is_final;
52
+ }
53
+ finish() {
54
+ if (!this.terminalSeen)
55
+ throw new NativeResponseSequenceError("missing_terminal_response");
56
+ }
57
+ }
58
+ exports.NativeResponseSequence = NativeResponseSequence;
59
+ //# sourceMappingURL=native_response_sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_response_sequence.js","sourceRoot":"","sources":["../src/native_response_sequence.ts"],"names":[],"mappings":";;;AAmBA,MAAa,2BAA4B,SAAQ,KAAK;IACxB;IAA5B,YAA4B,IAAY;QACtC,KAAK,CAAC,IAAI,CAAC,CAAC;QADc,SAAI,GAAJ,IAAI,CAAQ;IAExC,CAAC;CACF;AAJD,kEAIC;AAED,MAAa,sBAAsB;IAKd;IACA;IACA;IANX,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,GAAG,KAAK,CAAC;IAE7B,YACmB,SAAiB,EACjB,MAAc,EACd,MAAc;QAFd,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,MAAM,CAAC,KAA0B;QAC/B,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,2BAA2B,CAAC,yBAAyB,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,MAAM,IAAI,2BAA2B,CAAC,mBAAmB,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;QACnG,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,2BAA2B,CAAC,eAAe,CAAC,CAAC;QAC1F,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,2BAA2B,CAAC,eAAe,CAAC,CAAC;QACpG,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;QAC5G,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM,IAAI,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;QAEhH,MAAM,cAAc,GAAgC;YAClD,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;YAC7B,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;YAC/B,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACvC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;SAC3C,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,2BAA2B,CAAC,2BAA2B,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtG,MAAM,IAAI,2BAA2B,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,2BAA2B,CAAC,2BAA2B,CAAC,CAAC;IAC7F,CAAC;CACF;AAtCD,wDAsCC"}
package/dist/node.d.ts CHANGED
@@ -54,11 +54,12 @@ export declare function deriveNativeEndpoint(endpoint: string): string | null;
54
54
  * per-(intent,modality) model from discover. Back-compatible: a single text chat
55
55
  * model yields the same single ["text"] capability. First-seen group leads.
56
56
  */
57
- export declare function buildCapabilities(models: string[], defaultIntent: string, maxTokens: number): Array<{
57
+ export declare function buildCapabilities(models: string[], defaultIntent: string, maxTokens: number, supportedProfiles?: string[]): Array<{
58
58
  intent: string;
59
59
  models: string[];
60
60
  max_tokens: number;
61
61
  input_modalities: string[];
62
+ supported_profiles?: string[];
62
63
  }>;
63
64
  export interface NodeConfig {
64
65
  nodeId: string;
@@ -71,6 +72,8 @@ export interface NodeConfig {
71
72
  excludedModels?: string[];
72
73
  /** Pre-normative receipt profiles explicitly enabled by the operator. */
73
74
  supportedReceiptProfiles?: string[];
75
+ /** Explicit opt-in capability profiles. Empty means no profile claim. */
76
+ supportedProfiles?: string[];
74
77
  region?: string;
75
78
  capabilities?: string[];
76
79
  directoryUrl?: string;
@@ -191,6 +194,7 @@ export declare class IicpNode {
191
194
  private _tokensCounter;
192
195
  private _backendStability;
193
196
  private _savedNodeName;
197
+ private readonly _runtimeHealth;
194
198
  private _promLoaded;
195
199
  private readonly _cxPublicKey;
196
200
  private readonly _cxPrivateKeyBytes;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
package/dist/node.js CHANGED
@@ -31,6 +31,7 @@ const relay_ticket_js_1 = require("./relay_ticket.js");
31
31
  const backend_stability_js_1 = require("./backend_stability.js");
32
32
  const updater_js_1 = require("./updater.js");
33
33
  const identity_js_1 = require("./identity.js");
34
+ const runtime_health_js_1 = require("./runtime_health.js");
34
35
  const recovery_js_1 = require("./recovery.js");
35
36
  const DEFAULT_DIRECTORY = "https://iicp.network/api";
36
37
  const HEARTBEAT_INTERVAL_MS = 30_000;
@@ -143,9 +144,16 @@ function deriveNativeEndpoint(endpoint) {
143
144
  * per-(intent,modality) model from discover. Back-compatible: a single text chat
144
145
  * model yields the same single ["text"] capability. First-seen group leads.
145
146
  */
146
- function buildCapabilities(models, defaultIntent, maxTokens) {
147
+ function buildCapabilities(models, defaultIntent, maxTokens, supportedProfiles = []) {
148
+ const profiles = [...new Set(supportedProfiles)];
147
149
  if (models.length === 0) {
148
- return [{ intent: defaultIntent, models: [], max_tokens: maxTokens, input_modalities: ["text"] }];
150
+ return [{
151
+ intent: defaultIntent,
152
+ models: [],
153
+ max_tokens: maxTokens,
154
+ input_modalities: ["text"],
155
+ ...(profiles.length > 0 ? { supported_profiles: profiles } : {}),
156
+ }];
149
157
  }
150
158
  const order = [];
151
159
  const groups = new Map();
@@ -163,7 +171,13 @@ function buildCapabilities(models, defaultIntent, maxTokens) {
163
171
  }
164
172
  return order.map((key) => {
165
173
  const g = groups.get(key);
166
- return { intent: g.intent, models: g.models, max_tokens: maxTokens, input_modalities: g.input_modalities };
174
+ return {
175
+ intent: g.intent,
176
+ models: g.models,
177
+ max_tokens: maxTokens,
178
+ input_modalities: g.input_modalities,
179
+ ...(profiles.length > 0 ? { supported_profiles: [...profiles] } : {}),
180
+ };
167
181
  });
168
182
  }
169
183
  // ── IicpNode ──────────────────────────────────────────────────────────────────
@@ -210,6 +224,7 @@ class IicpNode {
210
224
  _tokensCounter = null;
211
225
  _backendStability = new backend_stability_js_1.BackendStabilityObservation();
212
226
  _savedNodeName;
227
+ _runtimeHealth = new runtime_health_js_1.RuntimeHealth();
213
228
  _promLoaded = false;
214
229
  _cxPublicKey;
215
230
  _cxPrivateKeyBytes;
@@ -220,6 +235,7 @@ class IicpNode {
220
235
  backend: config.backend,
221
236
  excludedModels: config.excludedModels ?? [],
222
237
  supportedReceiptProfiles: config.supportedReceiptProfiles ?? [],
238
+ supportedProfiles: config.supportedProfiles ?? [],
223
239
  endpoint: config.endpoint,
224
240
  intent: config.intent,
225
241
  model: config.model,
@@ -436,7 +452,7 @@ class IicpNode {
436
452
  region: this._cfg.region ?? "eu-central",
437
453
  // #409 — one capability object per intent the backend can serve (e.g.
438
454
  // chat + embedding), classified from the detected model set.
439
- capabilities: buildCapabilities(models, this._cfg.intent, this._cfg.maxTokens),
455
+ capabilities: buildCapabilities(models, this._cfg.intent, this._cfg.maxTokens, this._cfg.supportedProfiles),
440
456
  limits: {
441
457
  max_concurrent: this._cfg.maxConcurrent,
442
458
  tokens_per_min: this._cfg.tokensPerMin,
@@ -696,8 +712,11 @@ class IicpNode {
696
712
  * is unit-testable (the interval loop itself isn't).
697
713
  */
698
714
  async _heartbeatTick(token) {
715
+ this._runtimeHealth.advanceSupervisor();
699
716
  try {
700
717
  await this.heartbeat(token);
718
+ this._runtimeHealth.setExternal("directory", "healthy");
719
+ this._runtimeHealth.advanceSupervisor();
701
720
  // #494 — detect model list drift and re-register with the updated list.
702
721
  let nextToken = await this._maybeReregisterOnModelDrift(token);
703
722
  this._recoveryHeartbeatSeq += 1;
@@ -753,6 +772,8 @@ class IicpNode {
753
772
  return nextToken;
754
773
  }
755
774
  catch (err) {
775
+ this._runtimeHealth.setExternal("directory", "unavailable");
776
+ this._runtimeHealth.advanceSupervisor();
756
777
  const status = err?.status;
757
778
  if (status === 401 || status === 404 || status === 410) {
758
779
  try {
@@ -926,11 +947,27 @@ class IicpNode {
926
947
  });
927
948
  socket.on("error", () => undefined);
928
949
  });
929
- mux.listen(port, host);
950
+ mux.listen(port, host, () => this._runtimeHealth.markRunning());
930
951
  let hbTimer;
952
+ let healthTimer;
953
+ if (this._savedNodeName) {
954
+ const healthPath = (0, runtime_health_js_1.runtimeHealthPath)(this._savedNodeName);
955
+ const publish = () => {
956
+ this._runtimeHealth.advanceRuntime();
957
+ try {
958
+ (0, runtime_health_js_1.writeRuntimeHealthSnapshot)(healthPath, this._runtimeHealth.snapshot());
959
+ }
960
+ catch (error) {
961
+ console.warn(`[iicp-node] runtime-health snapshot write failed: ${error instanceof Error ? error.message : String(error)}`);
962
+ }
963
+ };
964
+ publish();
965
+ healthTimer = setInterval(publish, 5_000);
966
+ }
931
967
  // #404 — start the heartbeat loop when a token is present OR empty (register
932
968
  // failed → loop self-heals via re-register on 401). undefined = --skip-registration.
933
969
  if (nodeToken !== undefined) {
970
+ this._runtimeHealth.setSupervisorRequired(true);
934
971
  let currentToken = nodeToken;
935
972
  hbTimer = setInterval(() => {
936
973
  void this._heartbeatTick(currentToken).then((t) => {
@@ -1054,8 +1091,17 @@ class IicpNode {
1054
1091
  }).catch(() => undefined);
1055
1092
  }
1056
1093
  return () => {
1094
+ this._runtimeHealth.markStopping();
1095
+ if (this._savedNodeName) {
1096
+ try {
1097
+ (0, runtime_health_js_1.writeRuntimeHealthSnapshot)((0, runtime_health_js_1.runtimeHealthPath)(this._savedNodeName), this._runtimeHealth.snapshot());
1098
+ }
1099
+ catch { /* best effort */ }
1100
+ }
1057
1101
  if (hbTimer)
1058
1102
  clearInterval(hbTimer);
1103
+ if (healthTimer)
1104
+ clearInterval(healthTimer);
1059
1105
  this._peerManager.stop();
1060
1106
  if (stopRelayWorker)
1061
1107
  stopRelayWorker();
@@ -1290,11 +1336,17 @@ class IicpNode {
1290
1336
  }
1291
1337
  const callId = payload.call_id ?? "";
1292
1338
  const result = payload.result;
1293
- if (!callId || typeof result !== "object" || result === null) {
1339
+ const event = payload.event;
1340
+ if (!callId || ((typeof result !== "object" || result === null) && (typeof event !== "object" || event === null))) {
1294
1341
  this._relayJson(res, 422, { error: { code: "IICP-E001", message: "call_id and result are required" } });
1295
1342
  return;
1296
1343
  }
1297
- session.onResponse(callId, result);
1344
+ if (typeof event === "object" && event !== null) {
1345
+ session.onStreamResponse(callId, event);
1346
+ }
1347
+ else {
1348
+ session.onResponse(callId, result);
1349
+ }
1298
1350
  res.writeHead(204, { ...RELAY_CORS_HEADERS });
1299
1351
  res.end();
1300
1352
  });