@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.
- package/LICENSE +83 -61
- package/README.md +2 -2
- package/dist/backends/openai_compat.d.ts +3 -0
- package/dist/backends/openai_compat.d.ts.map +1 -1
- package/dist/backends/openai_compat.js +119 -0
- package/dist/backends/openai_compat.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +264 -39
- package/dist/cli.js.map +1 -1
- package/dist/iicp_tcp.d.ts +38 -0
- package/dist/iicp_tcp.d.ts.map +1 -1
- package/dist/iicp_tcp.js +164 -0
- package/dist/iicp_tcp.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp_negotiation.d.ts +23 -0
- package/dist/mcp_negotiation.d.ts.map +1 -0
- package/dist/mcp_negotiation.js +94 -0
- package/dist/mcp_negotiation.js.map +1 -0
- package/dist/native_call_identity.d.ts +12 -0
- package/dist/native_call_identity.d.ts.map +1 -0
- package/dist/native_call_identity.js +44 -0
- package/dist/native_call_identity.js.map +1 -0
- package/dist/native_response_sequence.d.ts +32 -0
- package/dist/native_response_sequence.d.ts.map +1 -0
- package/dist/native_response_sequence.js +59 -0
- package/dist/native_response_sequence.js.map +1 -0
- package/dist/node.d.ts +5 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +59 -7
- package/dist/node.js.map +1 -1
- package/dist/operator_profile.d.ts +18 -0
- package/dist/operator_profile.d.ts.map +1 -0
- package/dist/operator_profile.js +22 -0
- package/dist/operator_profile.js.map +1 -0
- package/dist/relay_session.d.ts +16 -4
- package/dist/relay_session.d.ts.map +1 -1
- package/dist/relay_session.js +116 -1
- package/dist/relay_session.js.map +1 -1
- package/dist/runtime_health.d.ts +77 -0
- package/dist/runtime_health.d.ts.map +1 -0
- package/dist/runtime_health.js +65 -0
- package/dist/runtime_health.js.map +1 -0
- package/dist/service.d.ts +7 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +44 -0
- package/dist/service.js.map +1 -1
- 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;
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAOH,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
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 [{
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|