@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.
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +310 -12
- package/dist/cli.js.map +1 -1
- package/dist/config/profile.d.ts +16 -0
- package/dist/config/profile.js +31 -0
- package/dist/config/profile.js.map +1 -1
- package/dist/merchant/decision-backend.js +8 -11
- package/dist/merchant/decision-backend.js.map +1 -1
- package/dist/product-cli.d.ts +1 -1
- package/dist/product-cli.js +15 -3
- package/dist/product-cli.js.map +1 -1
- package/dist/product-init.d.ts +19 -0
- package/dist/product-init.js +50 -2
- package/dist/product-init.js.map +1 -1
- package/dist/product-setup-public.d.ts +51 -0
- package/dist/product-setup-public.js +165 -0
- package/dist/product-setup-public.js.map +1 -0
- package/examples/profiles/merchant.deepseek.yaml +2 -5
- package/examples/profiles/merchant.fake.yaml +2 -4
- package/package.json +1 -1
package/dist/product-init.js
CHANGED
|
@@ -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,
|
package/dist/product-init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"product-init.js","sourceRoot":"","sources":["../src/product-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
#
|
|
19
|
-
#
|
|
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
|
-
#
|
|
18
|
-
|
|
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