@harrylabsj/kiwi 0.7.15 → 0.7.17

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.
@@ -31,13 +31,41 @@
31
31
  */
32
32
  import { spawnSync } from "node:child_process";
33
33
  import { randomBytes } from "node:crypto";
34
- import { existsSync, writeFileSync } from "node:fs";
34
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
35
+ import { homedir } from "node:os";
35
36
  import path from "node:path";
36
37
  import { stringify as stringifyYaml } from "yaml";
37
38
  import { agentDataDir, ensurePathsForDir } from "./agent/agent-db.js";
38
39
  import { RUNTIME_VERSION } from "./config/profile.js";
39
40
  import { PROTOCOL_VERSION } from "./negotiation/types.js";
40
41
  import { detectShoppingCli, writeDefaultProfile } from "./product-cli.js";
42
+ /**
43
+ * shopping-cli 商品库缺省路径(与 shopping-cli 的 DEFAULT_DB_PATH 一致:
44
+ * `~/.local/share/shopping-cli/shopping-cli.sqlite`)。商家无需设置
45
+ * `SHOPPING_DB_PATH`——import / publish 都用此缺省。
46
+ */
47
+ export const DEFAULT_SHOPPING_DB_PATH = path.join(homedir(), ".local", "share", "shopping-cli", "shopping-cli.sqlite");
48
+ /** 商家令牌 credentials 文件(0600;secret 不入 profile,命令启动时自动加载)。 */
49
+ export const DEFAULT_CREDENTIALS_ENV_PATH = path.join(homedir(), ".kiwi", "credentials.env");
50
+ /**
51
+ * 读取商家 credentials 文件(KEY=VALUE,0600)并填充 process.env(已存在不覆盖)。
52
+ * 让 `kiwi merchant init` 引导写入的 `KIWI_MERCHANT_TOKEN` 对 publish / start 生效。
53
+ */
54
+ export function loadMerchantCredentials(credentialsPath = DEFAULT_CREDENTIALS_ENV_PATH) {
55
+ if (!existsSync(credentialsPath))
56
+ return;
57
+ const content = readFileSync(credentialsPath, "utf-8");
58
+ for (const line of content.split(/\r?\n/)) {
59
+ const eq = line.indexOf("=");
60
+ if (eq <= 0)
61
+ continue;
62
+ const key = line.slice(0, eq).trim();
63
+ const value = line.slice(eq + 1).trim();
64
+ if (/^[A-Z][A-Z0-9_]*$/.test(key) && value !== "" && process.env[key] === undefined) {
65
+ process.env[key] = value;
66
+ }
67
+ }
68
+ }
41
69
  export function slugifyMerchantId(name) {
42
70
  const slug = name
43
71
  .trim()
@@ -153,6 +181,9 @@ export async function merchantInit(options) {
153
181
  auto_negotiate: options.autoNegotiate ?? false,
154
182
  human_review_on: ["below_floor", "exceptional_warranty", "suspicious_content"],
155
183
  },
184
+ ...(options.publicUrl !== undefined && options.publicUrl.trim() !== ""
185
+ ? { merchant_public: { public_url: options.publicUrl.trim().toLowerCase() } }
186
+ : {}),
156
187
  };
157
188
  const outputPath = options.outputPath ?? path.resolve("merchant.yaml");
158
189
  let written;
@@ -176,6 +207,22 @@ export async function merchantInit(options) {
176
207
  };
177
208
  }
178
209
  }
210
+ // ── Step 3.5: 商家令牌 → 独立 credentials 文件(0600;secret 不入 profile)──
211
+ let credentialsWritten;
212
+ if (options.merchantToken !== undefined && options.merchantToken.trim() !== "") {
213
+ const credentialsPath = options.credentialsPath ?? DEFAULT_CREDENTIALS_ENV_PATH;
214
+ try {
215
+ mkdirSync(path.dirname(credentialsPath), { recursive: true, mode: 0o700 });
216
+ writeFileSync(credentialsPath, `KIWI_MERCHANT_TOKEN=${options.merchantToken.trim()}\n`, { mode: 0o600 });
217
+ credentialsWritten = { ok: true, detail: credentialsPath };
218
+ }
219
+ catch (err) {
220
+ credentialsWritten = {
221
+ ok: false,
222
+ detail: `写凭据失败:${err instanceof Error ? err.message : String(err)}`,
223
+ };
224
+ }
225
+ }
179
226
  // ── Step 4: 初始化数据目录(AgentKernel state/sessions,0700)───────────
180
227
  let dataDirOk = true;
181
228
  let dataDirDetail = "";
@@ -187,7 +234,7 @@ export async function merchantInit(options) {
187
234
  dataDirOk = false;
188
235
  dataDirDetail = err instanceof Error ? err.message : String(err);
189
236
  }
190
- const ok = written.ok && dataDirOk;
237
+ const ok = written.ok && dataDirOk && (credentialsWritten === undefined || credentialsWritten.ok);
191
238
  return {
192
239
  ok,
193
240
  profile_path: outputPath,
@@ -198,6 +245,7 @@ export async function merchantInit(options) {
198
245
  : { ok: false, detail: detected.error ?? "not found" },
199
246
  shopping_cli_reachable: reachable,
200
247
  profile_written: written,
248
+ ...(credentialsWritten !== undefined ? { credentials_written: credentialsWritten } : {}),
201
249
  data_dir_initialized: dataDirOk ? { ok: true, detail: dataDirDetail } : { ok: false, detail: dataDirDetail },
202
250
  },
203
251
  warnings,
@@ -1 +1 @@
1
- {"version":3,"file":"product-init.js","sourceRoot":"","sources":["../src/product-init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-init.js","sourceRoot":"","sources":["../src/product-init.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAC/C,OAAO,EAAE,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACd,qBAAqB,CACtB,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAE7F;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,kBAA0B,4BAA4B;IAC5F,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC;YAAE,SAAS;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,IAAI,GAAG,IAAI;SACd,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACtD,CAAC;AAqED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,mCAAmC;IACnC,6CAA6C;IAC7C,oBAAoB;IACpB,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;QAClE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QAC3B,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9C,4DAA4D;IAC5D,IAAI,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;QAC7C,IAAI,OAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE;gBAClD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,MAAM,EAAE,CAAC,CAAC;gBACV,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACd,CAAC;QAC/C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,0BAA0B;YAC1B,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CACX,kDAAkD;oBAChD,sBAAsB,CACzB,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CACX,sCAAsC,OAAO,CAAC,MAAM,IAAI,GAAG,KAAK;gBAC9D,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CACX,qBAAqB,QAAQ,CAAC,KAAK,IAAI,GAAG,uBAAuB;YAC/D,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/F,IAAI,SAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,cAAc,SAAS,EAAE;YAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QACH,SAAS,GAAG,QAAQ,CAAC,EAAE;YACrB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;YACtC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,SAAS,cAAc,EAAE,EAAE,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,GAAG;YACV,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,cAAc,QAAQ,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACpF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CACX,oBAAoB,cAAc,QAAQ;YACxC,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,8CAA8C;IAC1E,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IACrD,MAAM,OAAO,GAA4B;QACvC,6DAA6D;QAC7D,+BAA+B;QAC/B,eAAe,EAAE,eAAe,EAAE,6BAA6B;QAC/D,gBAAgB,EAAE,gBAAgB;QAClC,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,yBAAyB;YACpC,OAAO,EAAE,mBAAmB;SAC7B;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO,CAAC,aAAa,IAAI,UAAU;YAC7C,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,mBAAmB;YAC/C,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;SACrD;QACD,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,qBAAqB,EAAE,CAAC;YACxB,oBAAoB,EAAE,EAAE;YACxB,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;SACf;QACD,eAAe,EAAE;YACf,sBAAsB,EAAE,eAAe,GAAG,GAAG;YAC7C,cAAc,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK;YAC9C,eAAe,EAAE,CAAC,aAAa,EAAE,sBAAsB,EAAE,oBAAoB,CAAC;SAC/E;QACD,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YACpE,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE;YAC7E,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvE,IAAI,OAAyB,CAAC;IAC9B,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,UAAU,gBAAgB,EAAE,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,kEAAkE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK;gBAC1G,eAAe,OAAO,CAAC,YAAY,IAAI;gBACvC,aAAa,CAAC,OAAO,CAAC,CAAC;YACzB,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,4CAA4C;YAC5C,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACtD,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,QAAQ,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI,kBAAgD,CAAC;IACrD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/E,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,4BAA4B,CAAC;QAChF,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3E,aAAa,CAAC,eAAe,EAAE,uBAAuB,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzG,kBAAkB,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,GAAG;gBACnB,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,GAAG,KAAK,CAAC;QAClB,aAAa,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,SAAS,IAAI,CAAC,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO;QACL,EAAE;QACF,YAAY,EAAE,UAAU;QACxB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE;YACL,qBAAqB,EAAE,QAAQ,CAAC,EAAE;gBAChC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,OAAO,EAAE;gBACnD,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,WAAW,EAAE;YACxD,sBAAsB,EAAE,SAAS;YACjC,eAAe,EAAE,OAAO;YACxB,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;SAC7G;QACD,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /** setup-public 类型化错误(fail-closed)。 */
2
+ export declare class SetupPublicError extends Error {
3
+ code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ /** 从 `KIWI_A2A_PUBLIC_URL`(https://<domain>)提取公网域名;无效返回 null。 */
7
+ export declare function extractPublicDomain(publicUrl: string | undefined): string | null;
8
+ /** 校验并归一化公网域名(无 scheme/path/port/userinfo)。 */
9
+ export declare function validatePublicDomain(domain: string): string;
10
+ /** 生成 Caddy 反代配置(把 `<domain>` 转发到本机 A2A 节点)。 */
11
+ export declare function buildCaddyfile(domain: string, port: number): string;
12
+ /** 检测本机公网 IP;不可达/失败返回 null(降级为手动确认,不 crash)。 */
13
+ export declare function detectPublicIp(fetchImpl?: typeof fetch): Promise<string | null>;
14
+ export interface DnsCheckResult {
15
+ status: "ok" | "mismatch" | "unresolved" | "skipped";
16
+ resolved: string | null;
17
+ expected: string | null;
18
+ }
19
+ /** 解析域名 A 记录并对比期望 IP(服务器公网 IP)。 */
20
+ export declare function checkDomainDns(domain: string, expectedIp: string | null, lookupImpl?: (hostname: string) => Promise<string | null>): Promise<DnsCheckResult>;
21
+ export interface WellKnownCheck {
22
+ url: string;
23
+ httpStatus: number | null;
24
+ }
25
+ /** `--check`:验证 `https://<domain>/.well-known/agent-card.json` 可达。 */
26
+ export declare function verifyWellKnown(domain: string, fetchImpl?: typeof fetch): Promise<WellKnownCheck>;
27
+ export interface SetupPublicOptions {
28
+ domain: string;
29
+ port: number;
30
+ caddyfilePath: string;
31
+ merchantAgentId: string;
32
+ profilePath?: string;
33
+ checkNow?: boolean;
34
+ publicIpOverride?: string | null;
35
+ fetchImpl?: typeof fetch;
36
+ lookupImpl?: (hostname: string) => Promise<string | null>;
37
+ writeFileImpl?: (path: string, content: string) => Promise<void>;
38
+ }
39
+ export interface SetupPublicReport {
40
+ merchantAgentId: string;
41
+ domain: string;
42
+ port: number;
43
+ publicIp: string | null;
44
+ dns: DnsCheckResult;
45
+ caddyfilePath: string;
46
+ caddyfile: string;
47
+ check: WellKnownCheck | null;
48
+ instructions: string[];
49
+ }
50
+ /** 编排 setup-public:检测 IP → DNS 检查 → 生成/写 Caddyfile → 可选验证。 */
51
+ export declare function runMerchantSetupPublic(opts: SetupPublicOptions): Promise<SetupPublicReport>;
@@ -0,0 +1,165 @@
1
+ /*
2
+ * Copyright 2026 Harrylabs
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
+ * `kiwi merchant setup-public`(产品层 D3)——公网 A2A 暴露引导。
18
+ *
19
+ * well-known 文件(`/.well-known/agent-card.json`、`/.well-known/ucp`)由跑着的
20
+ * `kiwi merchant start` 节点自动生成并服务(a2a/server),商家无需手写。本模块把
21
+ * 「域名 → A2A endpoint」这一步变成引导向导:检测本机公网 IP、检查域名 DNS、生成
22
+ * Caddy 反代配置、输出启动与验证命令。
23
+ *
24
+ * 幂等:只生成配置 + 打印指引 + 可选 `--check` 验证,不改 profile/DB。
25
+ */
26
+ import { promises as dnsPromises } from "node:dns";
27
+ import { writeFile } from "node:fs/promises";
28
+ const DEFAULT_IP_SERVICE = "https://api.ipify.org";
29
+ const DEFAULT_WELL_KNOWN_PATH = "/.well-known/agent-card.json";
30
+ /** setup-public 类型化错误(fail-closed)。 */
31
+ export class SetupPublicError extends Error {
32
+ code;
33
+ constructor(code, message) {
34
+ super(message);
35
+ this.name = "SetupPublicError";
36
+ this.code = code;
37
+ }
38
+ }
39
+ /** 从 `KIWI_A2A_PUBLIC_URL`(https://<domain>)提取公网域名;无效返回 null。 */
40
+ export function extractPublicDomain(publicUrl) {
41
+ if (publicUrl === undefined || publicUrl.trim() === "")
42
+ return null;
43
+ try {
44
+ const u = new URL(publicUrl.trim());
45
+ if (u.protocol !== "https:")
46
+ return null;
47
+ if (u.username !== "" || u.password !== "")
48
+ return null;
49
+ if (u.pathname !== "/" && u.pathname !== "")
50
+ return null;
51
+ if (u.search !== "" || u.hash !== "")
52
+ return null;
53
+ return u.hostname.toLowerCase();
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ /** 校验并归一化公网域名(无 scheme/path/port/userinfo)。 */
60
+ export function validatePublicDomain(domain) {
61
+ const raw = String(domain ?? "").trim().toLowerCase();
62
+ if (raw === "") {
63
+ throw new SetupPublicError("domain_required", "请提供公网域名(如 merchant.example.com)");
64
+ }
65
+ if (raw.includes("://")) {
66
+ throw new SetupPublicError("domain_scheme", "域名不应含 scheme(只需 merchant.example.com)");
67
+ }
68
+ if (raw.includes("/")) {
69
+ throw new SetupPublicError("domain_path", "域名不应含路径");
70
+ }
71
+ if (raw.includes(":") || raw.includes("@") || raw.includes("?") || raw.includes("#")) {
72
+ throw new SetupPublicError("domain_invalid", `域名含非法字符(: @ ? #): "${raw}"`);
73
+ }
74
+ if (!/^[a-z0-9.-]+$/.test(raw)) {
75
+ throw new SetupPublicError("domain_invalid", `域名含非法字符: "${raw}"`);
76
+ }
77
+ if (!raw.includes(".")) {
78
+ throw new SetupPublicError("domain_tld", `域名缺少点(应形如 merchant.example.com): "${raw}"`);
79
+ }
80
+ return raw;
81
+ }
82
+ /** 生成 Caddy 反代配置(把 `<domain>` 转发到本机 A2A 节点)。 */
83
+ export function buildCaddyfile(domain, port) {
84
+ const safePort = Number.isInteger(port) && port > 0 ? port : 9000;
85
+ return `${domain} {
86
+ reverse_proxy 127.0.0.1:${safePort}
87
+ }`;
88
+ }
89
+ /** 检测本机公网 IP;不可达/失败返回 null(降级为手动确认,不 crash)。 */
90
+ export async function detectPublicIp(fetchImpl = fetch) {
91
+ try {
92
+ const res = await fetchImpl(DEFAULT_IP_SERVICE, { signal: AbortSignal.timeout(8000) });
93
+ if (!res.ok)
94
+ return null;
95
+ const text = (await res.text()).trim();
96
+ return /^\d{1,3}(\.\d{1,3}){3}$/.test(text) ? text : null;
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ /** 解析域名 A 记录并对比期望 IP(服务器公网 IP)。 */
103
+ export async function checkDomainDns(domain, expectedIp, lookupImpl = async (hostname) => {
104
+ try {
105
+ const { address } = await dnsPromises.lookup(hostname, { family: 4 });
106
+ return address;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }) {
112
+ const resolved = await lookupImpl(domain);
113
+ if (resolved === null) {
114
+ return { status: "unresolved", resolved: null, expected: expectedIp };
115
+ }
116
+ if (expectedIp === null) {
117
+ return { status: "skipped", resolved, expected: null };
118
+ }
119
+ return resolved === expectedIp
120
+ ? { status: "ok", resolved, expected: expectedIp }
121
+ : { status: "mismatch", resolved, expected: expectedIp };
122
+ }
123
+ /** `--check`:验证 `https://<domain>/.well-known/agent-card.json` 可达。 */
124
+ export async function verifyWellKnown(domain, fetchImpl = fetch) {
125
+ const url = `https://${domain}${DEFAULT_WELL_KNOWN_PATH}`;
126
+ try {
127
+ const res = await fetchImpl(url, { signal: AbortSignal.timeout(8000) });
128
+ return { url, httpStatus: res.status };
129
+ }
130
+ catch {
131
+ return { url, httpStatus: null };
132
+ }
133
+ }
134
+ /** 编排 setup-public:检测 IP → DNS 检查 → 生成/写 Caddyfile → 可选验证。 */
135
+ export async function runMerchantSetupPublic(opts) {
136
+ const publicIp = opts.publicIpOverride !== undefined ? opts.publicIpOverride : await detectPublicIp(opts.fetchImpl);
137
+ const dns = await checkDomainDns(opts.domain, publicIp, opts.lookupImpl);
138
+ const caddyfile = `${buildCaddyfile(opts.domain, opts.port)}\n`;
139
+ const writeImpl = opts.writeFileImpl ?? writeFile;
140
+ await writeImpl(opts.caddyfilePath, caddyfile);
141
+ const check = opts.checkNow === true ? await verifyWellKnown(opts.domain, opts.fetchImpl) : null;
142
+ const profileFlag = opts.profilePath !== undefined && opts.profilePath !== "" ? ` --profile ${opts.profilePath}` : "";
143
+ const instructions = [
144
+ `1) 安装并启动 Caddy(TLS 自动签发):`,
145
+ ` caddy run --config ${opts.caddyfilePath}`,
146
+ ``,
147
+ `2) 启动 A2A 节点(广告公网地址,well-known 由节点自动生成):`,
148
+ ` KIWI_A2A_PUBLIC_URL=https://${opts.domain} kiwi merchant start${profileFlag} --port ${opts.port} &`,
149
+ ``,
150
+ `3) 验证 well-known(期望 200):`,
151
+ ` curl -sI https://${opts.domain}${DEFAULT_WELL_KNOWN_PATH}`,
152
+ ];
153
+ return {
154
+ merchantAgentId: opts.merchantAgentId,
155
+ domain: opts.domain,
156
+ port: opts.port,
157
+ publicIp,
158
+ dns,
159
+ caddyfilePath: opts.caddyfilePath,
160
+ caddyfile,
161
+ check,
162
+ instructions,
163
+ };
164
+ }
165
+ //# sourceMappingURL=product-setup-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-setup-public.js","sourceRoot":"","sources":["../src/product-setup-public.ts"],"names":[],"mappings":"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"}
@@ -15,11 +15,8 @@ model:
15
15
  provider: deepseek
16
16
  model: deepseek-v4-flash
17
17
  api_key_env: DEEPSEEK_API_KEY
18
- # DeepSeek Harness 运行时插件(§6.9):DeepSeek 作为受限推理后端产出不可信
19
- # 决策候选,merchant handler 验证 + floor/discount 硬约束后应用;backend 从不写。
20
- decision:
21
- backend: deepseek
22
- enabled: true
18
+ # merchant 定价确定性(不依赖 LLM):买家还价在 [floor, list] 内响应;
19
+ # 促销(批量门槛/折扣)可配置,见 merchant_policy.promos。
23
20
  runtime:
24
21
  mode: once
25
22
  poll_interval_seconds: 5
@@ -14,10 +14,8 @@ commerce:
14
14
  model:
15
15
  provider: fake
16
16
  model: fake-merchant-model
17
- # 离线冒烟:确定性 mock 推理后端(不依赖模型/密钥)。
18
- decision:
19
- backend: mock
20
- enabled: true
17
+ # 离线冒烟:merchant 定价确定性([floor, list] 内响应),促销可配置见
18
+ # merchant_policy.promos。
21
19
  runtime:
22
20
  mode: once
23
21
  poll_interval_seconds: 5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harrylabsj/kiwi",
3
- "version": "0.7.15",
3
+ "version": "0.7.17",
4
4
  "description": "Kiwi: standalone A2A commerce negotiation agent runtime (Pi Agent Core + shopping-cli Commerce API)",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",