1688-cli 0.1.40 → 0.1.42
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/AGENTS.md +112 -318
- package/ARCHITECTURE.md +106 -0
- package/CHANGELOG.md +107 -0
- package/README.md +100 -10
- package/dist/cli.js +165 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/cart-add.js +15 -11
- package/dist/commands/cart-add.js.map +1 -1
- package/dist/commands/cart-list.js +13 -11
- package/dist/commands/cart-list.js.map +1 -1
- package/dist/commands/compare.js +107 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/debug.js +101 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/doctor.js +107 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/image-search.js +2 -6
- package/dist/commands/image-search.js.map +1 -1
- package/dist/commands/inbox.js +16 -32
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/offer.js +7 -5
- package/dist/commands/offer.js.map +1 -1
- package/dist/commands/order-list.js +4 -2
- package/dist/commands/order-list.js.map +1 -1
- package/dist/commands/order-logistics.js +4 -2
- package/dist/commands/order-logistics.js.map +1 -1
- package/dist/commands/profile.js +84 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/research.js +142 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/search.js +157 -111
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/seller-messages.js +7 -4
- package/dist/commands/seller-messages.js.map +1 -1
- package/dist/commands/similar.js +2 -6
- package/dist/commands/similar.js.map +1 -1
- package/dist/commands/sourcing-utils.js +438 -0
- package/dist/commands/sourcing-utils.js.map +1 -0
- package/dist/commands/supplier-inspect.js +559 -0
- package/dist/commands/supplier-inspect.js.map +1 -0
- package/dist/commands/supplier-search.js +522 -0
- package/dist/commands/supplier-search.js.map +1 -0
- package/dist/daemon/client.js +2 -2
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/protocol.js +2 -1
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/io/output.js +31 -2
- package/dist/io/output.js.map +1 -1
- package/dist/session/config.js +82 -0
- package/dist/session/config.js.map +1 -0
- package/dist/session/dispatch.js +26 -3
- package/dist/session/dispatch.js.map +1 -1
- package/dist/session/events.js +151 -0
- package/dist/session/events.js.map +1 -0
- package/dist/session/im-cards.js +183 -0
- package/dist/session/im-cards.js.map +1 -0
- package/dist/session/im-ws.js +8 -5
- package/dist/session/im-ws.js.map +1 -1
- package/dist/session/navigation-guard.js +65 -0
- package/dist/session/navigation-guard.js.map +1 -0
- package/dist/session/paths.js +23 -4
- package/dist/session/paths.js.map +1 -1
- package/dist/session/search-capture.js +56 -6
- package/dist/session/search-capture.js.map +1 -1
- package/dist/session/search-mtop.js +53 -0
- package/dist/session/search-mtop.js.map +1 -1
- package/dist/session/supplier-search.js +403 -0
- package/dist/session/supplier-search.js.map +1 -0
- package/dist/util/encoding.js +8 -0
- package/dist/util/encoding.js.map +1 -0
- package/dist/util/temp.js +6 -0
- package/dist/util/temp.js.map +1 -0
- package/docs/AGENT_MAPS_PLAN.md +171 -0
- package/docs/AGENT_WORKING_PRINCIPLES.md +143 -0
- package/docs/COMMANDS.md +199 -0
- package/docs/FEATURES.md +45 -0
- package/docs/JSON_CONTRACTS.md +390 -0
- package/docs/QUALITY_SCORE.md +60 -0
- package/docs/README.md +35 -0
- package/docs/RELIABILITY.md +61 -0
- package/docs/SAFETY.md +100 -0
- package/docs/WORKFLOW.md +82 -0
- package/docs/exec-plans/README.md +9 -0
- package/docs/exec-plans/active/README.md +4 -0
- package/docs/exec-plans/completed/2026-05-28-sourcing-research-v1.md +125 -0
- package/docs/exec-plans/completed/2026-05-31-supplier-inspect-v1.md +113 -0
- package/docs/exec-plans/completed/2026-06-04-supplier-search-v1.md +81 -0
- package/docs/exec-plans/completed/2026-06-07-windows-cli-compatibility.md +138 -0
- package/docs/exec-plans/completed/README.md +4 -0
- package/docs/exec-plans/tech-debt-tracker.md +5 -0
- package/docs/generated/command-index.md +54 -0
- package/docs/generated/json-shapes.md +111 -0
- package/docs/generated/module-map.md +13 -0
- package/docs/generated/test-index.md +34 -0
- package/docs/playbooks/add-command.md +15 -0
- package/docs/playbooks/add-mtop-capture.md +13 -0
- package/docs/playbooks/change-json-output.md +11 -0
- package/docs/playbooks/debug-risk-control.md +12 -0
- package/docs/playbooks/update-cli-release.md +11 -0
- package/docs/specs/checkout-and-orders.md +30 -0
- package/docs/specs/seller-im.md +28 -0
- package/docs/specs/sourcing-research.md +186 -0
- package/docs/specs/supplier-inspect.md +144 -0
- package/docs/specs/supplier-search.md +179 -0
- package/docs/specs/windows-cli-compatibility.md +123 -0
- package/package.json +12 -2
- package/scripts/check_agent_map.mjs +86 -0
- package/scripts/fix_bin_mode.mjs +18 -0
- package/scripts/generate_agent_context.mjs +253 -0
- package/scripts/postinstall.mjs +12 -4
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { waitWithDeadline } from './wait.js';
|
|
2
|
+
export const COMPANY_SEARCH_SERVICE = 'companySearchBusinessService';
|
|
3
|
+
export function readSupplierSearchRequestMeta(url) {
|
|
4
|
+
if (!url.includes(COMPANY_SEARCH_SERVICE))
|
|
5
|
+
return null;
|
|
6
|
+
const parsed = new URL(url);
|
|
7
|
+
const beginPage = numberFromSearch(parsed.searchParams.get('beginPage'));
|
|
8
|
+
const pageSize = numberFromSearch(parsed.searchParams.get('pageSize'));
|
|
9
|
+
return {
|
|
10
|
+
...(beginPage !== null ? { beginPage } : {}),
|
|
11
|
+
...(pageSize !== null ? { pageSize } : {}),
|
|
12
|
+
...(parsed.searchParams.get('keywords')
|
|
13
|
+
? { keywords: parsed.searchParams.get('keywords') ?? undefined }
|
|
14
|
+
: {}),
|
|
15
|
+
...(parsed.searchParams.get('pageName')
|
|
16
|
+
? { pageName: parsed.searchParams.get('pageName') ?? undefined }
|
|
17
|
+
: {}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function parseSupplierItemsFromCompanySearchText(text) {
|
|
21
|
+
return parseCompanySearchServiceText(text).suppliers;
|
|
22
|
+
}
|
|
23
|
+
export function parseCompanySearchServiceText(text) {
|
|
24
|
+
const root = asRecord(parseJsonLike(text));
|
|
25
|
+
const topData = asRecord(root?.data);
|
|
26
|
+
const payload = asRecord(topData?.data);
|
|
27
|
+
const rawItems = asArray(payload?.companyWithOfferLists);
|
|
28
|
+
return {
|
|
29
|
+
suppliers: rawItems
|
|
30
|
+
.map(mapSupplierWrapper)
|
|
31
|
+
.filter((s) => s !== null),
|
|
32
|
+
pageCount: toNumber(payload?.pageCount),
|
|
33
|
+
docsReturn: toNumber(payload?.docsReturn),
|
|
34
|
+
code: toNumber(topData?.code),
|
|
35
|
+
message: toStringOrNull(topData?.msg),
|
|
36
|
+
requestId: toStringOrNull(root?.requestId),
|
|
37
|
+
pageName: toStringOrNull(root?.pageName),
|
|
38
|
+
rtTime: toNumber(root?.rtTime),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function startSupplierSearchCapture(opts) {
|
|
42
|
+
const maxDiagnosticsEntries = 5;
|
|
43
|
+
const startedAt = new Date().toISOString();
|
|
44
|
+
let endedAt;
|
|
45
|
+
let disposed = false;
|
|
46
|
+
let pageClosed = false;
|
|
47
|
+
let finalStatus;
|
|
48
|
+
let timedOut = false;
|
|
49
|
+
let data = null;
|
|
50
|
+
let bestPayloadSize = 0;
|
|
51
|
+
let lastParsedAt = 0;
|
|
52
|
+
let seenCount = 0;
|
|
53
|
+
let matchedCount = 0;
|
|
54
|
+
let parsedCount = 0;
|
|
55
|
+
let lastSeenUrl;
|
|
56
|
+
let lastMatchedUrl;
|
|
57
|
+
let lastParsedUrl;
|
|
58
|
+
let lastError;
|
|
59
|
+
const failures = [];
|
|
60
|
+
const errorInfo = (error) => {
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
return { name: error.name, message: error.message };
|
|
63
|
+
}
|
|
64
|
+
return { message: String(error) };
|
|
65
|
+
};
|
|
66
|
+
const recordFailure = (url, error) => {
|
|
67
|
+
const info = errorInfo(error);
|
|
68
|
+
lastError = info;
|
|
69
|
+
failures.push({
|
|
70
|
+
at: new Date().toISOString(),
|
|
71
|
+
url,
|
|
72
|
+
...info,
|
|
73
|
+
});
|
|
74
|
+
if (failures.length > maxDiagnosticsEntries)
|
|
75
|
+
failures.shift();
|
|
76
|
+
};
|
|
77
|
+
const diagnostics = () => ({
|
|
78
|
+
startedAt,
|
|
79
|
+
endedAt,
|
|
80
|
+
disposed,
|
|
81
|
+
finalStatus,
|
|
82
|
+
timedOut,
|
|
83
|
+
seenCount,
|
|
84
|
+
matchedCount,
|
|
85
|
+
parsedCount,
|
|
86
|
+
failureCount: failures.length,
|
|
87
|
+
lastSeenUrl,
|
|
88
|
+
lastMatchedUrl,
|
|
89
|
+
lastParsedUrl,
|
|
90
|
+
lastError,
|
|
91
|
+
failures: [...failures],
|
|
92
|
+
});
|
|
93
|
+
const onResponse = async (resp) => {
|
|
94
|
+
if (disposed)
|
|
95
|
+
return;
|
|
96
|
+
const url = resp.url();
|
|
97
|
+
seenCount++;
|
|
98
|
+
lastSeenUrl = url;
|
|
99
|
+
try {
|
|
100
|
+
const meta = readSupplierSearchRequestMeta(url);
|
|
101
|
+
if (!meta)
|
|
102
|
+
return;
|
|
103
|
+
const targetPage = opts.targetPage?.();
|
|
104
|
+
if (targetPage !== undefined && (meta.beginPage ?? 1) !== targetPage)
|
|
105
|
+
return;
|
|
106
|
+
matchedCount++;
|
|
107
|
+
lastMatchedUrl = url;
|
|
108
|
+
const text = await resp.text();
|
|
109
|
+
const parsed = parseCompanySearchServiceText(text);
|
|
110
|
+
if (parsed.suppliers.length === 0)
|
|
111
|
+
return;
|
|
112
|
+
const shouldReplace = !data ||
|
|
113
|
+
opts.keep !== 'largest' ||
|
|
114
|
+
parsed.suppliers.length > data.suppliers.length ||
|
|
115
|
+
(parsed.suppliers.length === data.suppliers.length &&
|
|
116
|
+
text.length > bestPayloadSize);
|
|
117
|
+
if (shouldReplace) {
|
|
118
|
+
data = parsed;
|
|
119
|
+
bestPayloadSize = text.length;
|
|
120
|
+
}
|
|
121
|
+
parsedCount++;
|
|
122
|
+
lastParsedAt = Date.now();
|
|
123
|
+
lastParsedUrl = url;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
recordFailure(url, error);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const onClose = () => {
|
|
130
|
+
pageClosed = true;
|
|
131
|
+
finalStatus ??= 'browser_closed';
|
|
132
|
+
endedAt ??= new Date().toISOString();
|
|
133
|
+
};
|
|
134
|
+
const dispose = () => {
|
|
135
|
+
if (disposed)
|
|
136
|
+
return;
|
|
137
|
+
disposed = true;
|
|
138
|
+
endedAt ??= new Date().toISOString();
|
|
139
|
+
opts.page.off('response', onResponse);
|
|
140
|
+
opts.page.off('close', onClose);
|
|
141
|
+
};
|
|
142
|
+
const wait = async (optsWait) => {
|
|
143
|
+
const settleMs = optsWait.settleMs ?? 1200;
|
|
144
|
+
const result = await waitWithDeadline(async (state) => {
|
|
145
|
+
if (pageClosed || optsWait.isClosed?.())
|
|
146
|
+
return 'browser_closed';
|
|
147
|
+
if (data && state.now - lastParsedAt >= settleMs)
|
|
148
|
+
return 'captured';
|
|
149
|
+
if (await optsWait.isBlocked?.())
|
|
150
|
+
return 'blocked';
|
|
151
|
+
if (disposed)
|
|
152
|
+
return 'stream_closed';
|
|
153
|
+
return null;
|
|
154
|
+
}, {
|
|
155
|
+
timeoutMs: optsWait.timeoutMs,
|
|
156
|
+
intervalMs: optsWait.intervalMs ?? 300,
|
|
157
|
+
onTimeout: () => (data ? 'captured' : 'timeout'),
|
|
158
|
+
});
|
|
159
|
+
finalStatus = result;
|
|
160
|
+
timedOut = result === 'timeout';
|
|
161
|
+
endedAt ??= new Date().toISOString();
|
|
162
|
+
return { status: result, data, diagnostics: diagnostics() };
|
|
163
|
+
};
|
|
164
|
+
const waitForAction = async (action, optsWait) => {
|
|
165
|
+
try {
|
|
166
|
+
const actionResult = await action();
|
|
167
|
+
const result = await wait(optsWait);
|
|
168
|
+
return {
|
|
169
|
+
actionResult,
|
|
170
|
+
status: result.status,
|
|
171
|
+
data: result.data,
|
|
172
|
+
diagnostics: result.diagnostics,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
dispose();
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
opts.page.on('response', onResponse);
|
|
180
|
+
opts.page.on('close', onClose);
|
|
181
|
+
return {
|
|
182
|
+
wait,
|
|
183
|
+
waitForAction,
|
|
184
|
+
dispose,
|
|
185
|
+
diagnostics,
|
|
186
|
+
data: () => data,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function mapSupplierWrapper(raw) {
|
|
190
|
+
const wrapper = asRecord(raw);
|
|
191
|
+
const company = asRecord(wrapper?.companyModel);
|
|
192
|
+
const brand = asRecord(wrapper?.companyBrandSiteVO);
|
|
193
|
+
if (!wrapper || !company)
|
|
194
|
+
return null;
|
|
195
|
+
const companyName = toStringOrNull(company.company) ??
|
|
196
|
+
toStringOrNull(brand?.companyName) ??
|
|
197
|
+
toStringOrNull(brand?.company) ??
|
|
198
|
+
'';
|
|
199
|
+
if (!companyName)
|
|
200
|
+
return null;
|
|
201
|
+
const enterpriseId = toStringOrNull(company.enterpriseId);
|
|
202
|
+
const memberId = normalizeMemberId(toStringOrNull(company.userId) ?? enterpriseId ?? toStringOrNull(wrapper.memberId));
|
|
203
|
+
const domainUri = toStringOrNull(company.domainUri);
|
|
204
|
+
const shopUrl = normalizeUrl(toStringOrNull(brand?.url)) ??
|
|
205
|
+
normalizeDomainUrl(domainUri);
|
|
206
|
+
const factoryTag = toStringOrNull(wrapper.factoryTag) ?? toStringOrNull(company.factoryTag);
|
|
207
|
+
const factoryLevel = toStringOrNull(company.factoryLevel);
|
|
208
|
+
const factoryLevelIsFactory = factoryLevel !== null && /工厂|厂/.test(factoryLevel);
|
|
209
|
+
const shiliFactory = toBool(wrapper.shiliFactory);
|
|
210
|
+
const superFactory = toBool(wrapper.superFactory);
|
|
211
|
+
const factoryInspection = toBool(wrapper.factoryInspection);
|
|
212
|
+
const isFactory = toBool(company.isFactory) ||
|
|
213
|
+
shiliFactory ||
|
|
214
|
+
superFactory ||
|
|
215
|
+
factoryInspection ||
|
|
216
|
+
factoryLevelIsFactory ||
|
|
217
|
+
!!factoryTag;
|
|
218
|
+
return {
|
|
219
|
+
companyName,
|
|
220
|
+
loginId: toStringOrNull(company.loginId),
|
|
221
|
+
memberId,
|
|
222
|
+
enterpriseId,
|
|
223
|
+
realUserId: toStringOrNull(company.realUserId),
|
|
224
|
+
companyId: toStringOrNull(company.id),
|
|
225
|
+
shopUrl,
|
|
226
|
+
factoryCardUrl: memberId
|
|
227
|
+
? `https://sale.1688.com/factory/card.html?memberId=${encodeURIComponent(memberId)}`
|
|
228
|
+
: null,
|
|
229
|
+
domainUri,
|
|
230
|
+
location: {
|
|
231
|
+
province: toStringOrNull(company.province),
|
|
232
|
+
city: toStringOrNull(company.city),
|
|
233
|
+
address: toStringOrNull(company.address),
|
|
234
|
+
latitude: toNumber(company.latitude),
|
|
235
|
+
longitude: toNumber(company.longitude),
|
|
236
|
+
},
|
|
237
|
+
productionService: toStringOrNull(company.productionService),
|
|
238
|
+
businessMode: toStringOrNull(company.businessMode),
|
|
239
|
+
tp: {
|
|
240
|
+
memberLevel: toStringOrNull(company.memberLevel),
|
|
241
|
+
serviceYears: toNumber(company.tpServiceYear),
|
|
242
|
+
tpNum: toNumber(company.tpNum),
|
|
243
|
+
},
|
|
244
|
+
factory: {
|
|
245
|
+
isFactory,
|
|
246
|
+
factoryTag,
|
|
247
|
+
factoryLevel,
|
|
248
|
+
shiliFactory,
|
|
249
|
+
shiliCompany: toBool(wrapper.shiliCompany),
|
|
250
|
+
superFactory,
|
|
251
|
+
businessInspection: toBool(wrapper.businessInspection),
|
|
252
|
+
factoryInspection,
|
|
253
|
+
qiJianCompany: toBool(wrapper.qiJianCompany),
|
|
254
|
+
safePurchase: toBool(wrapper.safePurchase),
|
|
255
|
+
trust: toBool(wrapper.trust),
|
|
256
|
+
},
|
|
257
|
+
service: {
|
|
258
|
+
compositeScore: toNumber(company.compositeNewScore),
|
|
259
|
+
wwResponseRate: toNumber(company.wwResponseRate),
|
|
260
|
+
repeatRate: toNumber(company.repeatRate),
|
|
261
|
+
complianceRate: toNumber(company.complianceRate),
|
|
262
|
+
},
|
|
263
|
+
demand: {
|
|
264
|
+
payOrderCount3m: toNumber(company.payMordCnt3Month),
|
|
265
|
+
payAmount3m: toNumber(company.payOrdAmt3m),
|
|
266
|
+
fuzzyPayAmount3m: toStringOrNull(wrapper.fuzzyPayOrdAmt3m),
|
|
267
|
+
saleQuantity3m: toNumber(company.saleQuantity3Month),
|
|
268
|
+
memberBookedCount: toNumber(wrapper.memberBookedCount),
|
|
269
|
+
},
|
|
270
|
+
tags: uniqueStrings([
|
|
271
|
+
...splitTags(toStringOrNull(company.memberTags)),
|
|
272
|
+
...splitTags(toStringOrNull(company.productionService)),
|
|
273
|
+
factoryTag,
|
|
274
|
+
factoryLevel,
|
|
275
|
+
toStringOrNull(company.memberLevel),
|
|
276
|
+
]),
|
|
277
|
+
offersPreview: asArray(wrapper.companyOffers)
|
|
278
|
+
.map(mapOfferPreview)
|
|
279
|
+
.filter((o) => o !== null),
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function mapOfferPreview(raw) {
|
|
283
|
+
const offer = asRecord(raw);
|
|
284
|
+
if (!offer)
|
|
285
|
+
return null;
|
|
286
|
+
const title = cleanText(toStringOrNull(offer.subject) ?? '');
|
|
287
|
+
if (!title)
|
|
288
|
+
return null;
|
|
289
|
+
const url = normalizeUrl(toStringOrNull(offer.detailUrl));
|
|
290
|
+
const offerId = toStringOrNull(offer.offerId) ??
|
|
291
|
+
(url ? url.match(/\/offer\/(\d+)\.html/)?.[1] ?? null : null);
|
|
292
|
+
const priceValue = toNumber(offer.price);
|
|
293
|
+
return {
|
|
294
|
+
offerId,
|
|
295
|
+
title,
|
|
296
|
+
url,
|
|
297
|
+
price: {
|
|
298
|
+
text: priceValue !== null ? `¥${priceValue}` : toStringOrNull(offer.price),
|
|
299
|
+
value: priceValue,
|
|
300
|
+
},
|
|
301
|
+
unit: toStringOrNull(offer.unit),
|
|
302
|
+
image: normalizeUrl(toStringOrNull(offer.picUrl)),
|
|
303
|
+
bookedCount: toNumber(offer.bookedCount),
|
|
304
|
+
saleQuantity: toNumber(offer.saleQuantity),
|
|
305
|
+
quantitySumMonth: toNumber(offer.quantitySumMonth),
|
|
306
|
+
brief: cleanText(toStringOrNull(offer.brief) ?? '') || null,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function parseJsonLike(text) {
|
|
310
|
+
const trimmed = text.trim();
|
|
311
|
+
try {
|
|
312
|
+
return JSON.parse(trimmed);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
const match = trimmed.match(/^[\w$.]+\((.*)\);?$/s);
|
|
316
|
+
if (!match?.[1])
|
|
317
|
+
throw new Error('Company search response is not JSON.');
|
|
318
|
+
return JSON.parse(match[1]);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
function asRecord(value) {
|
|
322
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
323
|
+
? value
|
|
324
|
+
: null;
|
|
325
|
+
}
|
|
326
|
+
function asArray(value) {
|
|
327
|
+
return Array.isArray(value) ? value : [];
|
|
328
|
+
}
|
|
329
|
+
function toStringOrNull(value) {
|
|
330
|
+
if (typeof value === 'string') {
|
|
331
|
+
const trimmed = cleanText(value);
|
|
332
|
+
return trimmed || null;
|
|
333
|
+
}
|
|
334
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
335
|
+
return String(value);
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
function toNumber(value) {
|
|
340
|
+
if (typeof value === 'number')
|
|
341
|
+
return Number.isFinite(value) ? value : null;
|
|
342
|
+
if (typeof value !== 'string')
|
|
343
|
+
return null;
|
|
344
|
+
const cleaned = value.replace(/,/g, '').trim();
|
|
345
|
+
if (!cleaned || cleaned === '-1')
|
|
346
|
+
return null;
|
|
347
|
+
const n = Number(cleaned);
|
|
348
|
+
return Number.isFinite(n) ? n : null;
|
|
349
|
+
}
|
|
350
|
+
function numberFromSearch(value) {
|
|
351
|
+
if (value === null)
|
|
352
|
+
return null;
|
|
353
|
+
return toNumber(value);
|
|
354
|
+
}
|
|
355
|
+
function toBool(value) {
|
|
356
|
+
if (typeof value === 'boolean')
|
|
357
|
+
return value;
|
|
358
|
+
if (typeof value === 'number')
|
|
359
|
+
return value === 1;
|
|
360
|
+
if (typeof value === 'string') {
|
|
361
|
+
const normalized = value.trim().toLowerCase();
|
|
362
|
+
return ['true', '1', 'y', 'yes', '是'].includes(normalized);
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
function cleanText(value) {
|
|
367
|
+
return value.replace(/<\/?font[^>]*>/g, '').replace(/\s+/g, ' ').trim();
|
|
368
|
+
}
|
|
369
|
+
function normalizeMemberId(value) {
|
|
370
|
+
if (!value)
|
|
371
|
+
return null;
|
|
372
|
+
if (value.startsWith('a-b2b-'))
|
|
373
|
+
return value.slice(2);
|
|
374
|
+
if (value.startsWith('b2b-'))
|
|
375
|
+
return value;
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
function normalizeDomainUrl(value) {
|
|
379
|
+
if (!value)
|
|
380
|
+
return null;
|
|
381
|
+
return normalizeUrl(value.includes('://') || value.startsWith('//') ? value : `https://${value}`);
|
|
382
|
+
}
|
|
383
|
+
function normalizeUrl(value) {
|
|
384
|
+
if (!value)
|
|
385
|
+
return null;
|
|
386
|
+
if (value.startsWith('//'))
|
|
387
|
+
return `https:${value}`;
|
|
388
|
+
if (/^https?:\/\//i.test(value))
|
|
389
|
+
return value;
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
function splitTags(value) {
|
|
393
|
+
if (!value)
|
|
394
|
+
return [];
|
|
395
|
+
return value
|
|
396
|
+
.split(/[;;,,|]/)
|
|
397
|
+
.map((s) => s.trim())
|
|
398
|
+
.filter((s) => !!s && !/^\d+$/.test(s));
|
|
399
|
+
}
|
|
400
|
+
function uniqueStrings(values) {
|
|
401
|
+
return [...new Set(values.filter((v) => !!v))];
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=supplier-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supplier-search.js","sourceRoot":"","sources":["../../src/session/supplier-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import iconv from 'iconv-lite';
|
|
2
|
+
export function encodeGbkPercent(input) {
|
|
3
|
+
const gbkBytes = iconv.encode(input, 'gbk');
|
|
4
|
+
return Array.from(gbkBytes)
|
|
5
|
+
.map((b) => '%' + b.toString(16).padStart(2, '0').toUpperCase())
|
|
6
|
+
.join('');
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/util/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;SAC/D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp.js","sourceRoot":"","sources":["../../src/util/temp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Agent Maps Plan
|
|
2
|
+
|
|
3
|
+
Date: 2026-05-28
|
|
4
|
+
|
|
5
|
+
## Sources Reviewed
|
|
6
|
+
|
|
7
|
+
- OpenAI: <https://openai.com/zh-Hans-CN/index/harness-engineering/>
|
|
8
|
+
- Reference repo: `/Users/nobodyjack2050/code/go-backend`
|
|
9
|
+
|
|
10
|
+
## OpenAI Article Takeaways
|
|
11
|
+
|
|
12
|
+
The article's core lesson is that agent-first engineering needs maps and
|
|
13
|
+
feedback loops more than huge instruction files. The useful pattern is:
|
|
14
|
+
|
|
15
|
+
- Keep `AGENTS.md` short. It should be a table of contents and routing layer,
|
|
16
|
+
not a full manual.
|
|
17
|
+
- Put durable knowledge in versioned repo files, especially `docs/`, because
|
|
18
|
+
knowledge outside the repo is invisible to agents.
|
|
19
|
+
- Use progressive disclosure: start agents at a small map, then point them to
|
|
20
|
+
the precise product spec, playbook, architecture note, or generated index.
|
|
21
|
+
- Make the app and repo readable to agents: logs, metrics, traces, screenshots,
|
|
22
|
+
DOM state, generated indexes, and reproducible commands should all be
|
|
23
|
+
queryable.
|
|
24
|
+
- Encode taste and architecture as mechanical checks where possible. Guidance
|
|
25
|
+
that matters repeatedly should become lint, tests, generated docs checks, or
|
|
26
|
+
verification commands.
|
|
27
|
+
- Treat plans as first-class repo artifacts for complex work so progress,
|
|
28
|
+
decisions, and blockers survive conversation loss.
|
|
29
|
+
- Add recurring cleanup. As agent throughput rises, drift becomes normal unless
|
|
30
|
+
quality rules and doc-gardening are part of the system.
|
|
31
|
+
|
|
32
|
+
## go-backend Agent Map Pattern
|
|
33
|
+
|
|
34
|
+
`go-backend` implements this pattern with several concrete artifacts:
|
|
35
|
+
|
|
36
|
+
- `AGENTS.md`: short "Agent Map" with first-read links, project shape, common
|
|
37
|
+
commands, task routing, hard rules, and done criteria.
|
|
38
|
+
- `ARCHITECTURE.md`: system map with layer responsibilities, dependency rules,
|
|
39
|
+
major domains, generated code rules, and verification surfaces.
|
|
40
|
+
- `docs/README.md`: documentation map and maintenance rules.
|
|
41
|
+
- `docs/specs`, `docs/design-docs`, `docs/integrations`,
|
|
42
|
+
`docs/playbooks`, `docs/references`: durable context split by use.
|
|
43
|
+
- `docs/exec-plans/active` and `docs/exec-plans/completed`: long-running
|
|
44
|
+
state for complex work.
|
|
45
|
+
- `docs/generated/*`: generated repo indexes such as API, proto, DB schema,
|
|
46
|
+
package map, test index, and OpenAPI summary.
|
|
47
|
+
- `scripts/generate_agent_context.sh`: builds generated indexes.
|
|
48
|
+
- `make agent-context`, `make agent-verify`, `make eval-agent`: standard
|
|
49
|
+
commands for regenerating context and proving agent-readiness.
|
|
50
|
+
- `docs/evals/graders/agent-map.sh`: deterministic check that the map exists
|
|
51
|
+
and points to verification/playbooks.
|
|
52
|
+
- `docs/QUALITY_SCORE.md`: blunt scorecard for agent-readiness and known gaps.
|
|
53
|
+
|
|
54
|
+
The important design choice is not the exact file names. It is the loop:
|
|
55
|
+
small map -> routed docs -> generated indexes -> mechanical verification ->
|
|
56
|
+
quality score -> cleanup.
|
|
57
|
+
|
|
58
|
+
## Proposed Agent Maps For 1688-cli
|
|
59
|
+
|
|
60
|
+
`1688-cli` should use a smaller version of the same system. This repo is a
|
|
61
|
+
TypeScript CLI with browser automation, daemon IPC, JSON contracts, and real
|
|
62
|
+
buyer write actions, so the map should emphasize command ownership, output
|
|
63
|
+
shape stability, risk-control recovery, and approval boundaries.
|
|
64
|
+
|
|
65
|
+
### Target Structure
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
AGENTS.md
|
|
69
|
+
ARCHITECTURE.md
|
|
70
|
+
docs/
|
|
71
|
+
README.md
|
|
72
|
+
WORKFLOW.md
|
|
73
|
+
COMMANDS.md
|
|
74
|
+
JSON_CONTRACTS.md
|
|
75
|
+
SAFETY.md
|
|
76
|
+
RELIABILITY.md
|
|
77
|
+
QUALITY_SCORE.md
|
|
78
|
+
specs/
|
|
79
|
+
sourcing-research.md
|
|
80
|
+
seller-im.md
|
|
81
|
+
checkout-and-orders.md
|
|
82
|
+
playbooks/
|
|
83
|
+
add-command.md
|
|
84
|
+
change-json-output.md
|
|
85
|
+
debug-risk-control.md
|
|
86
|
+
add-mtop-capture.md
|
|
87
|
+
update-cli-release.md
|
|
88
|
+
generated/
|
|
89
|
+
command-index.md
|
|
90
|
+
module-map.md
|
|
91
|
+
test-index.md
|
|
92
|
+
json-shapes.md
|
|
93
|
+
exec-plans/
|
|
94
|
+
active/
|
|
95
|
+
completed/
|
|
96
|
+
tech-debt-tracker.md
|
|
97
|
+
scripts/
|
|
98
|
+
generate_agent_context.mjs
|
|
99
|
+
check_agent_map.mjs
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### `AGENTS.md` Target Role
|
|
103
|
+
|
|
104
|
+
Keep only the short, high-signal contract:
|
|
105
|
+
|
|
106
|
+
- First read: `ARCHITECTURE.md`, `docs/README.md`, `docs/SAFETY.md`,
|
|
107
|
+
`docs/COMMANDS.md`, and `docs/JSON_CONTRACTS.md`.
|
|
108
|
+
- Project shape: `src/commands`, `src/session`, `src/daemon`, `src/io`,
|
|
109
|
+
`src/auth`, `src/util`.
|
|
110
|
+
- Common commands: `pnpm build`, `pnpm test`, `pnpm typecheck`, future
|
|
111
|
+
`pnpm agent-context`, future `pnpm agent-verify`.
|
|
112
|
+
- Task routing: new command, JSON shape change, browser/session flow,
|
|
113
|
+
daemon/protocol change, checkout/order safety, seller IM, release/update.
|
|
114
|
+
- Hard rules: never place orders without prepare plus current-turn approval,
|
|
115
|
+
never silently retry login/risk-control loops, preserve JSON compatibility,
|
|
116
|
+
do not handwave browser verification failures.
|
|
117
|
+
|
|
118
|
+
The current detailed CLI operation contract can move into `docs/COMMANDS.md`,
|
|
119
|
+
`docs/JSON_CONTRACTS.md`, and `docs/SAFETY.md`.
|
|
120
|
+
|
|
121
|
+
### Generated Context
|
|
122
|
+
|
|
123
|
+
`scripts/generate_agent_context.mjs` should generate:
|
|
124
|
+
|
|
125
|
+
- `docs/generated/command-index.md`: Commander commands/options from
|
|
126
|
+
`src/cli.ts`, mapped to `src/commands/*.ts`.
|
|
127
|
+
- `docs/generated/module-map.md`: top-level source directories and file counts.
|
|
128
|
+
- `docs/generated/test-index.md`: test files, if present, plus risk notes for
|
|
129
|
+
browser/session/integration-style tests.
|
|
130
|
+
- `docs/generated/json-shapes.md`: exported result interfaces from command
|
|
131
|
+
modules, especially stable agent-facing payloads.
|
|
132
|
+
|
|
133
|
+
This gives agents a fast way to understand the repo without reading every file.
|
|
134
|
+
|
|
135
|
+
### Verification Gate
|
|
136
|
+
|
|
137
|
+
Add scripts/Make targets roughly equivalent to:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
pnpm agent-context # generate docs/generated/*
|
|
141
|
+
pnpm agent-verify # typecheck, tests, generated docs freshness, agent map check
|
|
142
|
+
pnpm eval-agent # deterministic repo-specific graders, later
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Initial `agent-verify` can stay modest:
|
|
146
|
+
|
|
147
|
+
- `pnpm typecheck`
|
|
148
|
+
- `pnpm test`
|
|
149
|
+
- generate context and fail if `docs/generated/*` changes
|
|
150
|
+
- check that `AGENTS.md`, `ARCHITECTURE.md`, `docs/README.md`, and core
|
|
151
|
+
playbooks exist
|
|
152
|
+
|
|
153
|
+
### Rollout Order
|
|
154
|
+
|
|
155
|
+
1. Add `docs/README.md`, `ARCHITECTURE.md`, `docs/COMMANDS.md`,
|
|
156
|
+
`docs/JSON_CONTRACTS.md`, `docs/SAFETY.md`, and `docs/WORKFLOW.md`.
|
|
157
|
+
2. Move durable detail out of `AGENTS.md`, keeping `AGENTS.md` as a concise
|
|
158
|
+
routing map.
|
|
159
|
+
3. Add `scripts/generate_agent_context.mjs` and generated indexes.
|
|
160
|
+
4. Add `agent-context` and `agent-verify` package scripts.
|
|
161
|
+
5. Add playbooks for the workflows that repeat most often.
|
|
162
|
+
6. Add `QUALITY_SCORE.md` and update it whenever the map reveals a new gap.
|
|
163
|
+
|
|
164
|
+
## Open Questions
|
|
165
|
+
|
|
166
|
+
- Whether to preserve the current long `AGENTS.md` for external skill registry
|
|
167
|
+
compatibility, or split it while keeping a compact compatibility section.
|
|
168
|
+
- Whether generated JSON-shape docs should parse TypeScript AST or start with a
|
|
169
|
+
simple regex-based extractor.
|
|
170
|
+
- Whether browser/risk-control verification should be part of the default gate
|
|
171
|
+
or a separate live/manual gate.
|