@harrylabsj/kiwi 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +1 -1
  2. package/dist/a2a/negotiate.d.ts +6 -2
  3. package/dist/a2a/negotiate.js +10 -3
  4. package/dist/a2a/negotiate.js.map +1 -1
  5. package/dist/a2a/node.d.ts +4 -1
  6. package/dist/a2a/node.js +56 -3
  7. package/dist/a2a/node.js.map +1 -1
  8. package/dist/a2a/server/merchant-handler.d.ts +11 -3
  9. package/dist/a2a/server/merchant-handler.js +84 -26
  10. package/dist/a2a/server/merchant-handler.js.map +1 -1
  11. package/dist/agent/buyer/buyer-tools.js +2 -2
  12. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  13. package/dist/agent/kernel.js +5 -1
  14. package/dist/agent/kernel.js.map +1 -1
  15. package/dist/agent/memory/schema.d.ts +1 -1
  16. package/dist/agent/memory/schema.js +9 -1
  17. package/dist/agent/memory/schema.js.map +1 -1
  18. package/dist/agent/merchant/action-candidate.d.ts +18 -0
  19. package/dist/agent/merchant/action-candidate.js +51 -0
  20. package/dist/agent/merchant/action-candidate.js.map +1 -1
  21. package/dist/agent/merchant/fake-merchant-client.js +6 -1
  22. package/dist/agent/merchant/fake-merchant-client.js.map +1 -1
  23. package/dist/agent/merchant/intelligence/default-backend.js +25 -2
  24. package/dist/agent/merchant/intelligence/default-backend.js.map +1 -1
  25. package/dist/agent/merchant/merchant-client.d.ts +50 -1
  26. package/dist/agent/merchant/merchant-client.js +157 -8
  27. package/dist/agent/merchant/merchant-client.js.map +1 -1
  28. package/dist/agent/merchant/merchant-presentations.js +25 -2
  29. package/dist/agent/merchant/merchant-presentations.js.map +1 -1
  30. package/dist/agent/merchant/merchant-tools.js +102 -188
  31. package/dist/agent/merchant/merchant-tools.js.map +1 -1
  32. package/dist/agent/merchant/types.d.ts +6 -2
  33. package/dist/agent/merchant/types.js +45 -0
  34. package/dist/agent/merchant/types.js.map +1 -1
  35. package/dist/auth/merchant-authorization.d.ts +49 -0
  36. package/dist/auth/merchant-authorization.js +61 -0
  37. package/dist/auth/merchant-authorization.js.map +1 -0
  38. package/dist/auth/merchant-oauth.d.ts +255 -0
  39. package/dist/auth/merchant-oauth.js +764 -0
  40. package/dist/auth/merchant-oauth.js.map +1 -0
  41. package/dist/auth/merchant-pairing.d.ts +62 -0
  42. package/dist/auth/merchant-pairing.js +199 -0
  43. package/dist/auth/merchant-pairing.js.map +1 -0
  44. package/dist/auth/merchant-sessions.d.ts +71 -0
  45. package/dist/auth/merchant-sessions.js +168 -0
  46. package/dist/auth/merchant-sessions.js.map +1 -0
  47. package/dist/buyer-core/build-service.d.ts +5 -0
  48. package/dist/buyer-core/build-service.js +12 -0
  49. package/dist/buyer-core/build-service.js.map +1 -1
  50. package/dist/buyer-core/errors.d.ts +1 -1
  51. package/dist/buyer-core/errors.js +2 -0
  52. package/dist/buyer-core/errors.js.map +1 -1
  53. package/dist/buyer-core/merchant-index.d.ts +19 -4
  54. package/dist/buyer-core/merchant-index.js +137 -16
  55. package/dist/buyer-core/merchant-index.js.map +1 -1
  56. package/dist/buyer-core/negotiator.d.ts +0 -10
  57. package/dist/buyer-core/negotiator.js +12 -1
  58. package/dist/buyer-core/negotiator.js.map +1 -1
  59. package/dist/buyer-core/quote-fetcher.js +2 -1
  60. package/dist/buyer-core/quote-fetcher.js.map +1 -1
  61. package/dist/buyer-core/service.d.ts +104 -0
  62. package/dist/buyer-core/service.js +105 -1
  63. package/dist/buyer-core/service.js.map +1 -1
  64. package/dist/cli.d.ts +4 -2
  65. package/dist/cli.js +612 -20
  66. package/dist/cli.js.map +1 -1
  67. package/dist/config/profile.d.ts +30 -0
  68. package/dist/config/profile.js +126 -61
  69. package/dist/config/profile.js.map +1 -1
  70. package/dist/demo/demo-runner.js +12 -9
  71. package/dist/demo/demo-runner.js.map +1 -1
  72. package/dist/discovery/catalog-source/buyer-follows.d.ts +82 -0
  73. package/dist/discovery/catalog-source/buyer-follows.js +228 -0
  74. package/dist/discovery/catalog-source/buyer-follows.js.map +1 -0
  75. package/dist/discovery/catalog-source/connector-identity.d.ts +75 -0
  76. package/dist/discovery/catalog-source/connector-identity.js +175 -0
  77. package/dist/discovery/catalog-source/connector-identity.js.map +1 -0
  78. package/dist/discovery/catalog-source/errors.d.ts +1 -1
  79. package/dist/discovery/catalog-source/errors.js +2 -0
  80. package/dist/discovery/catalog-source/errors.js.map +1 -1
  81. package/dist/discovery/catalog-source/merchant-publications.d.ts +65 -0
  82. package/dist/discovery/catalog-source/merchant-publications.js +207 -0
  83. package/dist/discovery/catalog-source/merchant-publications.js.map +1 -0
  84. package/dist/discovery/catalog-source/register.d.ts +24 -0
  85. package/dist/discovery/catalog-source/register.js +46 -0
  86. package/dist/discovery/catalog-source/register.js.map +1 -1
  87. package/dist/discovery/catalog-source/source.js +2 -1
  88. package/dist/discovery/catalog-source/source.js.map +1 -1
  89. package/dist/fs/atomic-write.d.ts +18 -0
  90. package/dist/fs/atomic-write.js +29 -0
  91. package/dist/fs/atomic-write.js.map +1 -0
  92. package/dist/http/server.js +4 -1
  93. package/dist/http/server.js.map +1 -1
  94. package/dist/mcp/cli.d.ts +2 -0
  95. package/dist/mcp/cli.js +7 -6
  96. package/dist/mcp/cli.js.map +1 -1
  97. package/dist/mcp/merchant-auth.d.ts +78 -0
  98. package/dist/mcp/merchant-auth.js +146 -0
  99. package/dist/mcp/merchant-auth.js.map +1 -0
  100. package/dist/mcp/merchant-dirs.d.ts +26 -0
  101. package/dist/mcp/merchant-dirs.js +44 -0
  102. package/dist/mcp/merchant-dirs.js.map +1 -0
  103. package/dist/mcp/merchant-resources.d.ts +38 -0
  104. package/dist/mcp/merchant-resources.js +146 -0
  105. package/dist/mcp/merchant-resources.js.map +1 -0
  106. package/dist/mcp/merchant-server.d.ts +106 -0
  107. package/dist/mcp/merchant-server.js +615 -0
  108. package/dist/mcp/merchant-server.js.map +1 -0
  109. package/dist/mcp/merchant-tools.d.ts +103 -0
  110. package/dist/mcp/merchant-tools.js +517 -0
  111. package/dist/mcp/merchant-tools.js.map +1 -0
  112. package/dist/mcp/server.js +4 -3
  113. package/dist/mcp/server.js.map +1 -1
  114. package/dist/mcp/tools.d.ts +5 -3
  115. package/dist/mcp/tools.js +102 -5
  116. package/dist/mcp/tools.js.map +1 -1
  117. package/dist/mcp/types.d.ts +1 -1
  118. package/dist/mcp/types.js +4 -0
  119. package/dist/mcp/types.js.map +1 -1
  120. package/dist/merchant/ops.d.ts +0 -11
  121. package/dist/merchant/ops.js +13 -1
  122. package/dist/merchant/ops.js.map +1 -1
  123. package/dist/merchant/workbench-service.d.ts +189 -0
  124. package/dist/merchant/workbench-service.js +417 -0
  125. package/dist/merchant/workbench-service.js.map +1 -0
  126. package/dist/merchant-admin/pending-page.d.ts +35 -0
  127. package/dist/merchant-admin/pending-page.js +69 -0
  128. package/dist/merchant-admin/pending-page.js.map +1 -0
  129. package/dist/merchant-core/commands.d.ts +99 -0
  130. package/dist/merchant-core/commands.js +179 -0
  131. package/dist/merchant-core/commands.js.map +1 -0
  132. package/dist/merchant-core/executor.d.ts +69 -0
  133. package/dist/merchant-core/executor.js +218 -0
  134. package/dist/merchant-core/executor.js.map +1 -0
  135. package/dist/merchant-core/negotiation-adapters.d.ts +55 -0
  136. package/dist/merchant-core/negotiation-adapters.js +55 -0
  137. package/dist/merchant-core/negotiation-adapters.js.map +1 -0
  138. package/dist/merchant-core/network-checks.d.ts +65 -0
  139. package/dist/merchant-core/network-checks.js +111 -0
  140. package/dist/merchant-core/network-checks.js.map +1 -0
  141. package/dist/merchant-core/operations.d.ts +64 -0
  142. package/dist/merchant-core/operations.js +136 -0
  143. package/dist/merchant-core/operations.js.map +1 -0
  144. package/dist/merchant-core/policy-runtime.d.ts +70 -0
  145. package/dist/merchant-core/policy-runtime.js +181 -0
  146. package/dist/merchant-core/policy-runtime.js.map +1 -0
  147. package/dist/merchant-core/product-import.d.ts +67 -0
  148. package/dist/merchant-core/product-import.js +160 -0
  149. package/dist/merchant-core/product-import.js.map +1 -0
  150. package/dist/merchant-core/service.d.ts +203 -0
  151. package/dist/merchant-core/service.js +402 -0
  152. package/dist/merchant-core/service.js.map +1 -0
  153. package/dist/merchant-gateway/catalog-publications.d.ts +96 -0
  154. package/dist/merchant-gateway/catalog-publications.js +212 -0
  155. package/dist/merchant-gateway/catalog-publications.js.map +1 -0
  156. package/dist/merchant-gateway/catalog-tools.d.ts +46 -0
  157. package/dist/merchant-gateway/catalog-tools.js +315 -0
  158. package/dist/merchant-gateway/catalog-tools.js.map +1 -0
  159. package/dist/merchant-gateway/cli.d.ts +75 -0
  160. package/dist/merchant-gateway/cli.js +461 -0
  161. package/dist/merchant-gateway/cli.js.map +1 -0
  162. package/dist/merchant-gateway/credential-vault.d.ts +44 -0
  163. package/dist/merchant-gateway/credential-vault.js +111 -0
  164. package/dist/merchant-gateway/credential-vault.js.map +1 -0
  165. package/dist/merchant-gateway/entry-server.d.ts +117 -0
  166. package/dist/merchant-gateway/entry-server.js +747 -0
  167. package/dist/merchant-gateway/entry-server.js.map +1 -0
  168. package/dist/merchant-gateway/instance-registration.d.ts +144 -0
  169. package/dist/merchant-gateway/instance-registration.js +391 -0
  170. package/dist/merchant-gateway/instance-registration.js.map +1 -0
  171. package/dist/merchant-gateway/instance-tools.d.ts +58 -0
  172. package/dist/merchant-gateway/instance-tools.js +186 -0
  173. package/dist/merchant-gateway/instance-tools.js.map +1 -0
  174. package/dist/merchant-gateway/mcp-proxy.d.ts +25 -0
  175. package/dist/merchant-gateway/mcp-proxy.js +192 -0
  176. package/dist/merchant-gateway/mcp-proxy.js.map +1 -0
  177. package/dist/merchant-gateway/pinned-fetch.d.ts +54 -0
  178. package/dist/merchant-gateway/pinned-fetch.js +231 -0
  179. package/dist/merchant-gateway/pinned-fetch.js.map +1 -0
  180. package/dist/merchant-gateway/tenant-registry.d.ts +82 -0
  181. package/dist/merchant-gateway/tenant-registry.js +190 -0
  182. package/dist/merchant-gateway/tenant-registry.js.map +1 -0
  183. package/dist/merchant-gateway/tool-bundle.d.ts +26 -0
  184. package/dist/merchant-gateway/tool-bundle.js +56 -0
  185. package/dist/merchant-gateway/tool-bundle.js.map +1 -0
  186. package/dist/merchant-runtime/backup.d.ts +48 -0
  187. package/dist/merchant-runtime/backup.js +226 -0
  188. package/dist/merchant-runtime/backup.js.map +1 -0
  189. package/dist/merchant-runtime/health.d.ts +99 -0
  190. package/dist/merchant-runtime/health.js +206 -0
  191. package/dist/merchant-runtime/health.js.map +1 -0
  192. package/dist/merchant-runtime/jobs.d.ts +64 -0
  193. package/dist/merchant-runtime/jobs.js +107 -0
  194. package/dist/merchant-runtime/jobs.js.map +1 -0
  195. package/dist/merchant-runtime/manager.d.ts +94 -0
  196. package/dist/merchant-runtime/manager.js +305 -0
  197. package/dist/merchant-runtime/manager.js.map +1 -0
  198. package/dist/merchant-runtime/services.d.ts +30 -0
  199. package/dist/merchant-runtime/services.js +51 -0
  200. package/dist/merchant-runtime/services.js.map +1 -0
  201. package/dist/net/url.d.ts +26 -0
  202. package/dist/net/url.js +32 -0
  203. package/dist/net/url.js.map +1 -0
  204. package/dist/product-cli.js +22 -3
  205. package/dist/product-cli.js.map +1 -1
  206. package/dist/product-compat.d.ts +9 -1
  207. package/dist/product-compat.js +12 -1
  208. package/dist/product-compat.js.map +1 -1
  209. package/dist/product-init.js +17 -5
  210. package/dist/product-init.js.map +1 -1
  211. package/dist/product-publish.js +2 -1
  212. package/dist/product-publish.js.map +1 -1
  213. package/package.json +3 -2
  214. package/skills/kiwi-buyer/SKILL.md +2 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /**
17
+ * 商家连接器入口的凭据保管(AES-256-GCM,密钥来自部署环境)。
18
+ *
19
+ * 入口在商家确认连接时兑换到**目录商家作用域凭据**(`cmt_…`),它需要长期
20
+ * 持有(入口重启后仍要代表该商家读写公开资料)。与既有做法一致,明文不落库:
21
+ * 这里用 `KIWI_GATEWAY_CREDENTIAL_KEY` 派生的 32 字节密钥做 AES-256-GCM
22
+ * 加密后存储,密钥缺失时 fail-closed(入口无法保管凭据 → 商家工具不可用,
23
+ * 而不是退回明文)。
24
+ *
25
+ * 存储位置:入口自己的 oauth.sqlite(0600),表 `gateway_merchant_credentials`。
26
+ * 每个商家一行(merchant_id 主键);重新连接覆盖旧凭据。
27
+ */
28
+ import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
29
+ export const CREDENTIAL_KEY_ENV = "KIWI_GATEWAY_CREDENTIAL_KEY";
30
+ const VAULT_SCHEMA = `
31
+ CREATE TABLE IF NOT EXISTS gateway_merchant_credentials (
32
+ merchant_id TEXT PRIMARY KEY,
33
+ ciphertext TEXT NOT NULL,
34
+ expires_at TEXT NOT NULL,
35
+ updated_at TEXT NOT NULL
36
+ );
37
+ `;
38
+ /** 从环境读取保管密钥;未配置返回 undefined(调用方据此 fail-closed)。 */
39
+ export function credentialKeyFromEnv(env = process.env) {
40
+ const raw = (env[CREDENTIAL_KEY_ENV] ?? "").trim();
41
+ return raw === "" ? undefined : raw;
42
+ }
43
+ /** 任意长度的部署密钥 → 32 字节 AES 密钥(sha256 派生)。 */
44
+ function deriveKey(secret) {
45
+ return createHash("sha256").update(secret).digest();
46
+ }
47
+ export class GatewayCredentialVault {
48
+ db;
49
+ key;
50
+ now;
51
+ constructor(options) {
52
+ if (typeof options.secret !== "string" || options.secret.trim() === "") {
53
+ throw new Error("GatewayCredentialVault requires a non-empty credential secret");
54
+ }
55
+ this.db = options.db;
56
+ this.key = deriveKey(options.secret);
57
+ this.now = options.now ?? (() => new Date().toISOString());
58
+ this.db.exec(VAULT_SCHEMA);
59
+ }
60
+ encrypt(plaintext) {
61
+ const iv = randomBytes(12);
62
+ const cipher = createCipheriv("aes-256-gcm", this.key, iv);
63
+ const ciphertext = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
64
+ const tag = cipher.getAuthTag();
65
+ return Buffer.concat([iv, tag, ciphertext]).toString("base64");
66
+ }
67
+ decrypt(payload) {
68
+ const raw = Buffer.from(payload, "base64");
69
+ const iv = raw.subarray(0, 12);
70
+ const tag = raw.subarray(12, 28);
71
+ const ciphertext = raw.subarray(28);
72
+ const decipher = createDecipheriv("aes-256-gcm", this.key, iv);
73
+ decipher.setAuthTag(tag);
74
+ return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
75
+ }
76
+ put(merchantId, token, expiresAt) {
77
+ if (merchantId === "" || token === "") {
78
+ throw new Error("credential vault requires merchant_id and token");
79
+ }
80
+ this.db
81
+ .prepare(`INSERT INTO gateway_merchant_credentials(merchant_id, ciphertext, expires_at, updated_at)
82
+ VALUES (?, ?, ?, ?)
83
+ ON CONFLICT(merchant_id) DO UPDATE SET
84
+ ciphertext = excluded.ciphertext,
85
+ expires_at = excluded.expires_at,
86
+ updated_at = excluded.updated_at`)
87
+ .run(merchantId, this.encrypt(token), expiresAt, this.now());
88
+ }
89
+ get(merchantId) {
90
+ const row = this.db
91
+ .prepare("SELECT ciphertext, expires_at FROM gateway_merchant_credentials WHERE merchant_id = ?")
92
+ .get(merchantId);
93
+ if (row === undefined)
94
+ return undefined;
95
+ if (row.expires_at <= this.now())
96
+ return undefined;
97
+ try {
98
+ return { token: this.decrypt(row.ciphertext), expiresAt: row.expires_at };
99
+ }
100
+ catch {
101
+ // 密钥轮换/数据损坏:当作没有凭据(工具报「需要重新连接」),绝不返回噪音。
102
+ return undefined;
103
+ }
104
+ }
105
+ delete(merchantId) {
106
+ this.db
107
+ .prepare("DELETE FROM gateway_merchant_credentials WHERE merchant_id = ?")
108
+ .run(merchantId);
109
+ }
110
+ }
111
+ //# sourceMappingURL=credential-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-vault.js","sourceRoot":"","sources":["../../src/merchant-gateway/credential-vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { MerchantAuthorization } from "../auth/merchant-authorization.js";
17
+ import type { MerchantOAuthServer } from "../auth/merchant-oauth.js";
18
+ import { type MerchantAdminSessions } from "../auth/merchant-sessions.js";
19
+ import type { MerchantMcpAuthVerifier } from "../mcp/merchant-auth.js";
20
+ import { type ScopedMcpTools } from "../mcp/merchant-server.js";
21
+ import type { MerchantCredentialStore } from "./credential-vault.js";
22
+ import { type InstanceRegistrationWriter, type ProbeResult } from "./instance-registration.js";
23
+ export declare const DEFAULT_GATEWAY_ENTRY_PORT = 9200;
24
+ export declare const DEFAULT_GATEWAY_ENTRY_PATH = "/mcp";
25
+ /** catalog 连接能力(生产实现见 discovery/catalog-source/connector-identity.ts)。 */
26
+ export interface GatewayIdentityProvider {
27
+ createRequest(input: {
28
+ returnUrl: string;
29
+ clientLabel?: string;
30
+ }): Promise<{
31
+ requestId: string;
32
+ loginUrl: string;
33
+ expiresAt: string;
34
+ }>;
35
+ exchange(input: {
36
+ requestId: string;
37
+ code: string;
38
+ }): Promise<{
39
+ merchantId: string;
40
+ merchantName: string;
41
+ credential: {
42
+ accessToken: string;
43
+ scope: string;
44
+ expiresAt: string;
45
+ };
46
+ }>;
47
+ }
48
+ export interface GatewayEntryServerOptions {
49
+ /** 入口对外地址(OAuth issuer;https,loopback 开发可为 http)。 */
50
+ publicBaseUrl: string;
51
+ oauth: MerchantOAuthServer;
52
+ sessions: MerchantAdminSessions;
53
+ identity: GatewayIdentityProvider;
54
+ /** 入口提供的工具束(V0 目录工具 / V1 商家工具)。 */
55
+ tools?: ScopedMcpTools;
56
+ /**
57
+ * 按已验证主体构造工具束(推荐):商户隔离要求工具只能看到令牌绑定的
58
+ * merchant_id,而不是所有租户共用一份 bundler。
59
+ */
60
+ toolsFor?: (authorization: MerchantAuthorization | undefined) => ScopedMcpTools | undefined;
61
+ /** 商家目录凭据保管(连接成功时写入;工具按 merchant_id 取用)。 */
62
+ credentials?: MerchantCredentialStore;
63
+ /**
64
+ * 实例自助绑定(§8.4 第一期):提供时挂载 `/instance` 页面(需商家会话)。
65
+ * 令牌只经该页面表单提交,**不进对话/模型上下文**;页面永不回显令牌。
66
+ */
67
+ instanceBinding?: {
68
+ registrations: InstanceRegistrationWriter;
69
+ credentials: MerchantCredentialStore;
70
+ /** 探活实现(缺省走真实网络);测试可注入。 */
71
+ probe?: (mcpUrl: string, token: string) => Promise<ProbeResult>;
72
+ /** 配对码兑换替身(缺省走真实网络);测试可注入。 */
73
+ redeem?: (mcpUrl: string, code: string) => Promise<{
74
+ credential: string;
75
+ ownerId: string;
76
+ principalId: string;
77
+ serverName: string;
78
+ serverVersion: string;
79
+ }>;
80
+ };
81
+ /** 入站 Bearer 校验器(OAuth access token → 主体 + scope)。 */
82
+ auth?: MerchantMcpAuthVerifier;
83
+ host?: string;
84
+ port?: number;
85
+ mcpPath?: string;
86
+ /** https 部署置 true(会话 cookie 加 Secure)。 */
87
+ secureCookies?: boolean;
88
+ /**
89
+ * 由本进程直接终止 TLS(生产可选形态之一)。缺省时进程不做 TLS:
90
+ * 只应监听 loopback,由受信反向代理终止 TLS(部署侧保证,见 CLI 校验)。
91
+ */
92
+ tls?: {
93
+ certPath: string;
94
+ keyPath: string;
95
+ };
96
+ serverInfo?: {
97
+ name: string;
98
+ version: string;
99
+ };
100
+ /** 商家连接器在目录确认页展示的来源名(缺省「Kiwi 商家运营」)。 */
101
+ clientLabel?: string;
102
+ }
103
+ export interface GatewayEntryServerHandle {
104
+ host: string;
105
+ port: number;
106
+ path: string;
107
+ url: string;
108
+ /** true = 本进程直接终止 TLS(否则应由受信反向代理终止)。 */
109
+ secure: boolean;
110
+ close: () => Promise<void>;
111
+ }
112
+ /** 只接受站内相对路径(拒绝协议相对 URL 与反斜杠变体,防开放重定向)。 */
113
+ export declare function safeRelativePath(value: string | undefined): string | undefined;
114
+ /**
115
+ * 启动商家连接器入口。返回 handle 含实际 host/port 与优雅关闭。
116
+ */
117
+ export declare function startGatewayEntryServer(options: GatewayEntryServerOptions): Promise<GatewayEntryServerHandle>;