1688-cli 0.1.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 (80) hide show
  1. package/AGENTS.md +118 -0
  2. package/README.md +48 -0
  3. package/dist/auth/cookies.js +31 -0
  4. package/dist/auth/cookies.js.map +1 -0
  5. package/dist/auth/verify.js +25 -0
  6. package/dist/auth/verify.js.map +1 -0
  7. package/dist/cli.js +373 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/cart-add.js +199 -0
  10. package/dist/commands/cart-add.js.map +1 -0
  11. package/dist/commands/cart-list.js +168 -0
  12. package/dist/commands/cart-list.js.map +1 -0
  13. package/dist/commands/cart-remove.js +119 -0
  14. package/dist/commands/cart-remove.js.map +1 -0
  15. package/dist/commands/checkout-confirm.js +407 -0
  16. package/dist/commands/checkout-confirm.js.map +1 -0
  17. package/dist/commands/checkout-prepare.js +244 -0
  18. package/dist/commands/checkout-prepare.js.map +1 -0
  19. package/dist/commands/doctor.js +246 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/image-search.js +210 -0
  22. package/dist/commands/image-search.js.map +1 -0
  23. package/dist/commands/login.js +209 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logout.js +59 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/offer.js +185 -0
  28. package/dist/commands/offer.js.map +1 -0
  29. package/dist/commands/order-get.js +76 -0
  30. package/dist/commands/order-get.js.map +1 -0
  31. package/dist/commands/order-list.js +176 -0
  32. package/dist/commands/order-list.js.map +1 -0
  33. package/dist/commands/order-logistics.js +152 -0
  34. package/dist/commands/order-logistics.js.map +1 -0
  35. package/dist/commands/search.js +250 -0
  36. package/dist/commands/search.js.map +1 -0
  37. package/dist/commands/seller-chat.js +213 -0
  38. package/dist/commands/seller-chat.js.map +1 -0
  39. package/dist/commands/seller-inquire.js +110 -0
  40. package/dist/commands/seller-inquire.js.map +1 -0
  41. package/dist/commands/seller-lookup-ww.js +6 -0
  42. package/dist/commands/seller-lookup-ww.js.map +1 -0
  43. package/dist/commands/seller-messages.js +181 -0
  44. package/dist/commands/seller-messages.js.map +1 -0
  45. package/dist/commands/whoami.js +53 -0
  46. package/dist/commands/whoami.js.map +1 -0
  47. package/dist/commands/workflows.js +264 -0
  48. package/dist/commands/workflows.js.map +1 -0
  49. package/dist/daemon/client.js +75 -0
  50. package/dist/daemon/client.js.map +1 -0
  51. package/dist/daemon/manager.js +128 -0
  52. package/dist/daemon/manager.js.map +1 -0
  53. package/dist/daemon/protocol.js +5 -0
  54. package/dist/daemon/protocol.js.map +1 -0
  55. package/dist/daemon/server.js +197 -0
  56. package/dist/daemon/server.js.map +1 -0
  57. package/dist/daemon/throttle.js +17 -0
  58. package/dist/daemon/throttle.js.map +1 -0
  59. package/dist/io/errors.js +10 -0
  60. package/dist/io/errors.js.map +1 -0
  61. package/dist/io/output.js +17 -0
  62. package/dist/io/output.js.map +1 -0
  63. package/dist/io/prompt.js +17 -0
  64. package/dist/io/prompt.js.map +1 -0
  65. package/dist/session/context.js +91 -0
  66. package/dist/session/context.js.map +1 -0
  67. package/dist/session/dispatch.js +50 -0
  68. package/dist/session/dispatch.js.map +1 -0
  69. package/dist/session/lock.js +23 -0
  70. package/dist/session/lock.js.map +1 -0
  71. package/dist/session/paths.js +31 -0
  72. package/dist/session/paths.js.map +1 -0
  73. package/dist/session/shared.js +104 -0
  74. package/dist/session/shared.js.map +1 -0
  75. package/dist/session/state.js +27 -0
  76. package/dist/session/state.js.map +1 -0
  77. package/dist/util/time.js +17 -0
  78. package/dist/util/time.js.map +1 -0
  79. package/package.json +44 -0
  80. package/scripts/postinstall.mjs +49 -0
@@ -0,0 +1,181 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ import { readState } from '../session/state.js';
5
+ const IM_BASE = 'https://air.1688.com/app/ocms-fusion-components-1688/def_cbu_web_im/index.html';
6
+ export async function execute(ctx, args) {
7
+ const page = await ctx.newPage();
8
+ try {
9
+ let url;
10
+ if (args.sellerLoginId && args.orderId) {
11
+ url =
12
+ `${IM_BASE}?` +
13
+ `touid=cnalichn${encodeURIComponent(args.sellerLoginId)}` +
14
+ `&siteid=cnalichn` +
15
+ `&status=1` +
16
+ `&portalId=` +
17
+ `&gid=` +
18
+ `&offerId=` +
19
+ `&itemsId=` +
20
+ `&orderId=${encodeURIComponent(args.orderId)}` +
21
+ `#/`;
22
+ info(`Opening 旺旺 (order-scoped: orderId=${args.orderId})...`);
23
+ }
24
+ else {
25
+ url = `${IM_BASE}?fromid=cnalichn${encodeURIComponent(args.myLoginId)}`;
26
+ info('Opening 旺旺 IM (sidebar mode)...');
27
+ }
28
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
29
+ if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
30
+ throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
31
+ }
32
+ const imFrame = page.frameLocator('iframe[src*="def_cbu_web_im_core"]');
33
+ const input = imFrame.locator('pre.edit[contenteditable="true"]').first();
34
+ try {
35
+ await input.waitFor({ state: 'visible', timeout: 20000 });
36
+ }
37
+ catch {
38
+ throw new CliError(22, 'CHAT_NOT_LOADED', 'Failed to open 旺旺 IM.');
39
+ }
40
+ await new Promise((r) => setTimeout(r, 3000));
41
+ // If sidebar mode: find + click the seller
42
+ let matched = null;
43
+ if (!args.sellerLoginId || !args.orderId) {
44
+ for (const name of args.searchNames) {
45
+ if (!name)
46
+ continue;
47
+ const item = imFrame.locator(`text=${name}`).first();
48
+ if (await item.isVisible({ timeout: 2000 }).catch(() => false)) {
49
+ await item.click({ force: true });
50
+ matched = name;
51
+ break;
52
+ }
53
+ }
54
+ if (!matched) {
55
+ throw new CliError(29, 'SELLER_NOT_IN_SIDEBAR', `Seller not in 旺旺 sidebar: ${args.searchNames.join(', ')}. ` +
56
+ 'Use orderId instead to auto-activate via order context.');
57
+ }
58
+ }
59
+ else {
60
+ matched = args.searchNames[0] ?? args.sellerLoginId;
61
+ }
62
+ // Wait for conversation panel to activate
63
+ const activated = await page
64
+ .waitForFunction(() => {
65
+ const iframe = document.querySelector('iframe[src*="def_cbu_web_im_core"]');
66
+ const body = iframe?.contentDocument?.body?.innerText ?? '';
67
+ return !/您尚未选择联系人/.test(body) && body.length > 50;
68
+ }, { timeout: 25000 })
69
+ .then(() => true)
70
+ .catch(() => false);
71
+ if (!activated) {
72
+ throw new CliError(26, 'CONVERSATION_NOT_SELECTED', `Conversation did not activate for ${matched}.`);
73
+ }
74
+ await new Promise((r) => setTimeout(r, 2500)); // let messages render
75
+ // Extract messages from .message-item elements
76
+ const frame = page
77
+ .frames()
78
+ .find((f) => /def_cbu_web_im_core/.test(f.url()));
79
+ if (!frame) {
80
+ throw new CliError(22, 'CHAT_NOT_LOADED', 'IM iframe not available.');
81
+ }
82
+ const raw = await frame.evaluate(() => {
83
+ const items = Array.from(document.querySelectorAll('.message-item'));
84
+ return items.map((item) => {
85
+ const cls = item.className?.toString?.() ?? '';
86
+ const isMine = / self(\s|$)/.test(' ' + cls);
87
+ const full = (item.innerText ?? '').replace(/\s+/g, ' ').trim();
88
+ const tsRe = /(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/;
89
+ const tsMatch = full.match(tsRe);
90
+ const time = tsMatch ? tsMatch[1] : null;
91
+ let sender = '';
92
+ let content = full;
93
+ if (tsMatch) {
94
+ sender = full.slice(0, tsMatch.index).trim();
95
+ content = full.slice(tsMatch.index + tsMatch[0].length).trim();
96
+ }
97
+ // Seller side shows "shop_name:operator_name" — keep just shop part.
98
+ const colonIdx = sender.indexOf(':');
99
+ const senderShort = colonIdx > -1 ? sender.slice(0, colonIdx) : sender;
100
+ const read = /已读\s*$/.test(content);
101
+ const cleanContent = content.replace(/\s*已读\s*$/, '').trim();
102
+ return {
103
+ sender: senderShort.trim(),
104
+ time,
105
+ isMine,
106
+ content: cleanContent,
107
+ read,
108
+ };
109
+ });
110
+ });
111
+ return {
112
+ conversation: matched ?? '?',
113
+ total: raw.length,
114
+ messages: raw.slice(-Math.max(1, args.limit)),
115
+ };
116
+ }
117
+ finally {
118
+ await page.close().catch(() => { });
119
+ }
120
+ }
121
+ export async function run(opts) {
122
+ if (!opts.target) {
123
+ throw new CliError(2, 'BAD_INPUT', 'target required (orderId or seller name).');
124
+ }
125
+ const limit = Math.min(200, Math.max(1, parseInt(opts.limit ?? '20', 10)));
126
+ const sinceMs = opts.since ? Date.parse(opts.since) : 0;
127
+ const state = await readState();
128
+ if (!state.nick) {
129
+ throw new CliError(3, 'NOT_LOGGED_IN', 'Cannot determine your loginId. Run `1688 whoami`.');
130
+ }
131
+ let args;
132
+ if (/^\d+$/.test(opts.target)) {
133
+ info(`Looking up seller for order ${opts.target}...`);
134
+ const order = await dispatch('order-get', { orderId: opts.target, maxScanPages: 5 }, { headed: opts.headed, profile: opts.profile });
135
+ args = {
136
+ searchNames: [order.seller.loginId, order.seller.name].filter(Boolean),
137
+ sellerLoginId: order.seller.loginId ?? undefined,
138
+ orderId: opts.target,
139
+ myLoginId: state.nick,
140
+ limit,
141
+ };
142
+ }
143
+ else {
144
+ args = {
145
+ searchNames: [opts.target],
146
+ myLoginId: state.nick,
147
+ limit,
148
+ };
149
+ }
150
+ let data = await dispatch('seller-messages', args, { headed: opts.headed, profile: opts.profile });
151
+ // Apply --since filter
152
+ if (sinceMs > 0) {
153
+ data = {
154
+ ...data,
155
+ messages: data.messages.filter((m) => {
156
+ if (!m.time)
157
+ return false;
158
+ const t = Date.parse(m.time.replace(' ', 'T') + '+08:00');
159
+ return Number.isFinite(t) && t > sinceMs;
160
+ }),
161
+ total: data.messages.length,
162
+ };
163
+ }
164
+ emit({
165
+ human: () => printMessages(data),
166
+ data,
167
+ });
168
+ }
169
+ function printMessages(r) {
170
+ process.stdout.write(`Conversation: ${r.conversation}\n`);
171
+ if (r.messages.length === 0) {
172
+ process.stdout.write(' (no messages)\n');
173
+ return;
174
+ }
175
+ for (const m of r.messages) {
176
+ const who = m.isMine ? '我' : m.sender || '对方';
177
+ const tail = m.read && m.isMine ? ' [已读]' : '';
178
+ process.stdout.write(` [${m.time ?? '?'}] ${who}: ${m.content}${tail}\n`);
179
+ }
180
+ }
181
+ //# sourceMappingURL=seller-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-messages.js","sourceRoot":"","sources":["../../src/commands/seller-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { parseIdentity } from '../auth/cookies.js';
3
+ import { verifyOnline } from '../auth/verify.js';
4
+ import { readState, writeState } from '../session/state.js';
5
+ import { emit, info } from '../io/output.js';
6
+ import { CliError } from '../io/errors.js';
7
+ import { nowIso, relative } from '../util/time.js';
8
+ export async function execute(ctx, args) {
9
+ const cookies = await ctx.cookies();
10
+ const id = parseIdentity(cookies);
11
+ if (!id)
12
+ return { loggedIn: false };
13
+ if (args.verify) {
14
+ const ok = await verifyOnline(ctx);
15
+ if (!ok)
16
+ return { loggedIn: false };
17
+ }
18
+ const state = await readState();
19
+ const lastVerifiedAt = args.verify ? nowIso() : state.lastVerifiedAt;
20
+ await writeState({
21
+ ...state,
22
+ memberId: id.memberId,
23
+ nick: id.nick ?? undefined,
24
+ lastVerifiedAt,
25
+ });
26
+ return {
27
+ loggedIn: true,
28
+ memberId: id.memberId,
29
+ nick: id.nick,
30
+ lastVerifiedAt: lastVerifiedAt ?? null,
31
+ };
32
+ }
33
+ export async function run(opts) {
34
+ const data = await dispatch('whoami', { verify: opts.verify }, { profile: opts.profile });
35
+ if (!data.loggedIn) {
36
+ emit({
37
+ human: () => info('Not logged in. Run `1688 login` to sign in.'),
38
+ data: { loggedIn: false },
39
+ });
40
+ throw new CliError(3, 'NOT_LOGGED_IN', '');
41
+ }
42
+ emit({
43
+ human: () => {
44
+ const name = data.nick ?? data.memberId;
45
+ const tail = data.lastVerifiedAt
46
+ ? ` (verified ${relative(data.lastVerifiedAt)})`
47
+ : '';
48
+ process.stdout.write(`${name} (memberId: ${data.memberId})${tail}\n`);
49
+ },
50
+ data,
51
+ });
52
+ }
53
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAkBnD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAmB,EACnB,IAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IACrE,MAAM,UAAU,CAAC;QACf,GAAG,KAAK;QACR,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,SAAS;QAC1B,cAAc;KACf,CAAC,CAAC;IACH,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,cAAc,EAAE,cAAc,IAAI,IAAI;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAgB;IACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,QAAQ,EACR,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EACvB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC;YAChE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACH,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAS,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc;gBAC9B,CAAC,CAAC,cAAc,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG;gBAChD,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,264 @@
1
+ // High-level "shortcut" workflows that compose existing commands.
2
+ import { dispatch } from '../session/dispatch.js';
3
+ import { emit, info } from '../io/output.js';
4
+ import { CliError } from '../io/errors.js';
5
+ async function listOrders(status, page, pageSize, opts) {
6
+ return dispatch('order-list', { status, page, pageSize }, { headed: opts.headed, profile: opts.profile });
7
+ }
8
+ async function getLogistics(orderId, opts, statusHint) {
9
+ return dispatch('order-logistics', { orderId, maxScanPages: 5, statusHint }, { headed: opts.headed, profile: opts.profile });
10
+ }
11
+ function daysSince(iso) {
12
+ if (!iso)
13
+ return null;
14
+ const t = Date.parse(iso);
15
+ if (!Number.isFinite(t))
16
+ return null;
17
+ return Math.floor((Date.now() - t) / 86_400_000);
18
+ }
19
+ export async function runShipped(opts) {
20
+ if (!opts.orderId || !/^\d+$/.test(opts.orderId)) {
21
+ throw new CliError(2, 'BAD_INPUT', 'Valid orderId required.');
22
+ }
23
+ info(`Fetching order ${opts.orderId}...`);
24
+ const order = await dispatch('order-get', { orderId: opts.orderId, maxScanPages: 5 }, { headed: opts.headed, profile: opts.profile });
25
+ info(`Fetching logistics...`);
26
+ const logistics = await getLogistics(opts.orderId, opts).catch(() => null);
27
+ const data = {
28
+ orderId: order.orderId,
29
+ status: order.statusLabel,
30
+ createdAt: order.createdAt,
31
+ paidAt: order.paidAt,
32
+ shippedAt: order.shippedAt,
33
+ daysSincePaid: daysSince(order.paidAt),
34
+ daysSinceShipped: daysSince(order.shippedAt),
35
+ totalAmount: order.totalAmount,
36
+ seller: order.seller,
37
+ items: order.items.map((i) => ({
38
+ name: i.productName,
39
+ qty: i.quantity,
40
+ amount: i.amount,
41
+ })),
42
+ logistics: logistics?.trace?.[0] ?? null,
43
+ };
44
+ emit({
45
+ human: () => {
46
+ process.stdout.write(`Order ${data.orderId}\n`);
47
+ process.stdout.write(` ${data.status} ¥${data.totalAmount.toFixed(2)}\n`);
48
+ process.stdout.write(` seller: ${data.seller.name}\n`);
49
+ process.stdout.write(` paid: ${data.paidAt ?? '-'} (${data.daysSincePaid ?? '?'} days ago)\n`);
50
+ process.stdout.write(` shipped: ${data.shippedAt ?? '-'} (${data.daysSinceShipped ?? '?'} days ago)\n`);
51
+ if (data.logistics) {
52
+ const lg = data.logistics;
53
+ process.stdout.write(` carrier: ${lg.carrier ?? '?'} · ${lg.mailNo}\n`);
54
+ process.stdout.write(` status: ${lg.currentStatus}\n`);
55
+ process.stdout.write(` remark: ${lg.remark}\n`);
56
+ }
57
+ else {
58
+ process.stdout.write(` (no logistics yet)\n`);
59
+ }
60
+ process.stdout.write(' items:\n');
61
+ for (const it of data.items) {
62
+ process.stdout.write(` * ${it.qty}× ¥${it.amount.toFixed(2)} — ${it.name}\n`);
63
+ }
64
+ },
65
+ data,
66
+ });
67
+ }
68
+ export async function runStuck(opts) {
69
+ const days = Math.max(0, parseInt(opts.days ?? '3', 10));
70
+ const limit = Math.max(1, parseInt(opts.limit ?? '50', 10));
71
+ info(`Finding waitsellersend orders paid more than ${days} days ago...`);
72
+ const all = [];
73
+ for (let p = 1; p <= 5; p++) {
74
+ const r = await listOrders('waitsellersend', p, 50, opts);
75
+ all.push(...r.orders);
76
+ if (r.orders.length === 0 || p >= r.totalPages)
77
+ break;
78
+ }
79
+ const stuck = all
80
+ .map((o) => ({ o, days: daysSince(o.paidAt) }))
81
+ .filter((x) => x.days !== null && x.days >= days)
82
+ .sort((a, b) => (b.days ?? 0) - (a.days ?? 0))
83
+ .slice(0, limit);
84
+ const data = {
85
+ threshold: days,
86
+ total: stuck.length,
87
+ orders: stuck.map((x) => ({
88
+ orderId: x.o.orderId,
89
+ daysSincePaid: x.days,
90
+ paidAt: x.o.paidAt,
91
+ totalAmount: x.o.totalAmount,
92
+ seller: x.o.seller.name,
93
+ sellerLoginId: x.o.seller.loginId,
94
+ item: x.o.items[0]?.productName?.slice(0, 50) ?? '',
95
+ })),
96
+ };
97
+ emit({
98
+ human: () => {
99
+ if (stuck.length === 0) {
100
+ process.stdout.write(`No orders stuck > ${days} days.\n`);
101
+ return;
102
+ }
103
+ process.stdout.write(`Stuck orders (paid > ${days} days, not shipped):\n\n`);
104
+ for (const x of data.orders) {
105
+ process.stdout.write(` ${x.orderId} ${x.daysSincePaid}d ¥${x.totalAmount?.toFixed(2)} ${x.seller}\n`);
106
+ process.stdout.write(` ${x.item}\n`);
107
+ }
108
+ },
109
+ data,
110
+ });
111
+ }
112
+ export async function runFakeShipped(opts) {
113
+ const days = Math.max(0, parseInt(opts.days ?? '1', 10));
114
+ const limit = Math.max(1, parseInt(opts.limit ?? '50', 10));
115
+ const maxPages = Math.max(1, parseInt(opts.maxPages ?? '2', 10));
116
+ const maxCheck = Math.max(1, parseInt(opts.maxCheck ?? '20', 10));
117
+ info(`Finding waitbuyerreceive orders shipped > ${days} days ago...`);
118
+ const all = [];
119
+ for (let p = 1; p <= maxPages; p++) {
120
+ const r = await listOrders('waitbuyerreceive', p, 50, opts);
121
+ all.push(...r.orders);
122
+ if (r.orders.length === 0 || p >= r.totalPages)
123
+ break;
124
+ }
125
+ const candidates = all
126
+ .map((o) => ({ o, days: daysSince(o.shippedAt) }))
127
+ .filter((x) => x.days !== null && x.days >= days)
128
+ .sort((a, b) => (b.days ?? 0) - (a.days ?? 0))
129
+ .slice(0, maxCheck);
130
+ info(`Checking logistics for ${candidates.length} oldest candidates (cap --max-check=${maxCheck})...`);
131
+ const flagged = [];
132
+ for (let i = 0; i < candidates.length; i++) {
133
+ if (flagged.length >= limit)
134
+ break;
135
+ const c = candidates[i];
136
+ info(` [${i + 1}/${candidates.length}] ${c.o.orderId} (${c.days}d)...`);
137
+ const lg = await getLogistics(c.o.orderId, opts, 'waitbuyerreceive').catch((e) => ({ __error: e.message }));
138
+ if ('__error' in lg) {
139
+ if (opts.debug)
140
+ info(` fetch failed: ${lg.__error}`);
141
+ continue;
142
+ }
143
+ const trace = lg.trace?.[0];
144
+ if (!trace) {
145
+ if (opts.debug)
146
+ info(` no trace data (order found but logistics empty)`);
147
+ continue;
148
+ }
149
+ if (opts.debug) {
150
+ info(` status="${trace.currentStatus}" remark="${trace.remark}"`);
151
+ }
152
+ // Heuristic: waybill exists but courier never picked up. Match common
153
+ // 1688 / 菜鸟 / 快递 phrasing for "waiting for pickup".
154
+ const isFake = /等待揽收|待揽收|未揽收|等待快递员揽收|包裹.*揽收|尚未揽收/.test(trace.remark) ||
155
+ (trace.currentStatus === '已发货' && /已发货/.test(trace.remark));
156
+ if (isFake) {
157
+ flagged.push({
158
+ orderId: c.o.orderId,
159
+ daysSinceShipped: c.days ?? 0,
160
+ seller: c.o.seller.name,
161
+ sellerLoginId: c.o.seller.loginId,
162
+ mailNo: trace.mailNo,
163
+ carrier: trace.carrier,
164
+ currentStatus: trace.currentStatus,
165
+ remark: trace.remark,
166
+ totalAmount: c.o.totalAmount,
167
+ item: c.o.items[0]?.productName?.slice(0, 50) ?? '',
168
+ });
169
+ }
170
+ }
171
+ emit({
172
+ human: () => {
173
+ if (flagged.length === 0) {
174
+ process.stdout.write(`No fake-shipped orders found (criteria: shipped > ${days} days, logistics frozen at "等待揽收").\n`);
175
+ return;
176
+ }
177
+ process.stdout.write(`⚠ ${flagged.length} suspicious orders (waybill printed > ${days} days ago, courier never collected):\n\n`);
178
+ for (const f of flagged) {
179
+ process.stdout.write(` ${f.orderId} ${f.daysSinceShipped}d ¥${f.totalAmount.toFixed(2)} ${f.seller}\n`);
180
+ process.stdout.write(` ${f.carrier ?? '?'} ${f.mailNo}\n`);
181
+ process.stdout.write(` "${f.remark}"\n`);
182
+ process.stdout.write(` ${f.item}\n\n`);
183
+ }
184
+ },
185
+ data: { threshold: days, total: flagged.length, orders: flagged },
186
+ });
187
+ }
188
+ export async function runSellerHistory(opts) {
189
+ if (!opts.seller) {
190
+ throw new CliError(2, 'BAD_INPUT', 'Seller required (loginId or company name).');
191
+ }
192
+ const maxPages = Math.max(1, parseInt(opts.maxPages ?? '10', 10));
193
+ const needle = opts.seller;
194
+ info(`Scanning orders (up to ${maxPages * 50} most recent)...`);
195
+ const matches = [];
196
+ for (let p = 1; p <= maxPages; p++) {
197
+ const r = await listOrders('all', p, 50, opts);
198
+ for (const o of r.orders) {
199
+ if (o.seller.loginId === needle ||
200
+ o.seller.name === needle ||
201
+ o.seller.loginId?.includes(needle) ||
202
+ o.seller.name?.includes(needle)) {
203
+ matches.push(o);
204
+ }
205
+ }
206
+ if (r.orders.length === 0 || p >= r.totalPages)
207
+ break;
208
+ }
209
+ // Compute shipping times for orders that have both paidAt and shippedAt
210
+ const shipTimes = [];
211
+ for (const o of matches) {
212
+ if (o.paidAt && o.shippedAt) {
213
+ const d = (Date.parse(o.shippedAt) - Date.parse(o.paidAt)) / 86_400_000;
214
+ if (Number.isFinite(d) && d >= 0)
215
+ shipTimes.push(d);
216
+ }
217
+ }
218
+ const avgShipDays = shipTimes.length
219
+ ? shipTimes.reduce((s, d) => s + d, 0) / shipTimes.length
220
+ : null;
221
+ const onTimeRate = shipTimes.length
222
+ ? shipTimes.filter((d) => d < 2).length / shipTimes.length
223
+ : null;
224
+ const totalSpent = matches.reduce((s, o) => s + o.totalAmount, 0);
225
+ const data = {
226
+ seller: needle,
227
+ totalOrders: matches.length,
228
+ totalSpent,
229
+ avgShipDays,
230
+ onTimeRate,
231
+ recent: matches.slice(0, 10).map((o) => ({
232
+ orderId: o.orderId,
233
+ createdAt: o.createdAt,
234
+ status: o.statusLabel,
235
+ amount: o.totalAmount,
236
+ shipDays: o.paidAt && o.shippedAt
237
+ ? Math.round((Date.parse(o.shippedAt) - Date.parse(o.paidAt)) / 86_400_000 * 10) / 10
238
+ : null,
239
+ })),
240
+ };
241
+ emit({
242
+ human: () => {
243
+ process.stdout.write(`Seller: ${needle}\n`);
244
+ process.stdout.write(` total orders: ${data.totalOrders}\n`);
245
+ process.stdout.write(` total spent: ¥${data.totalSpent.toFixed(2)}\n`);
246
+ if (data.avgShipDays !== null) {
247
+ process.stdout.write(` avg ship days: ${data.avgShipDays.toFixed(1)}\n`);
248
+ }
249
+ if (data.onTimeRate !== null) {
250
+ process.stdout.write(` on-time (<2d): ${(data.onTimeRate * 100).toFixed(0)}%\n`);
251
+ }
252
+ if (data.recent.length) {
253
+ process.stdout.write('\n Recent orders:\n');
254
+ for (const o of data.recent) {
255
+ process.stdout.write(` ${o.orderId} ${o.createdAt} ¥${o.amount?.toFixed(2)} ${o.status}` +
256
+ (o.shipDays !== null ? ` (shipped ${o.shipDays}d)` : '') +
257
+ '\n');
258
+ }
259
+ }
260
+ },
261
+ data,
262
+ });
263
+ }
264
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import net from 'node:net';
2
+ import fs from 'node:fs/promises';
3
+ import { socketPath } from '../session/paths.js';
4
+ import { CliError } from '../io/errors.js';
5
+ import { makeRequestId } from './protocol.js';
6
+ const PING_TIMEOUT_MS = 800;
7
+ const CALL_TIMEOUT_MS = 5 * 60 * 1000;
8
+ export async function isDaemonReachable() {
9
+ try {
10
+ await fs.access(socketPath());
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ return new Promise((resolve) => {
16
+ const sock = net.createConnection(socketPath());
17
+ const timer = setTimeout(() => {
18
+ sock.destroy();
19
+ resolve(false);
20
+ }, PING_TIMEOUT_MS);
21
+ sock.once('connect', () => {
22
+ clearTimeout(timer);
23
+ sock.end();
24
+ resolve(true);
25
+ });
26
+ sock.once('error', () => {
27
+ clearTimeout(timer);
28
+ resolve(false);
29
+ });
30
+ });
31
+ }
32
+ export async function daemonCall(cmd, args) {
33
+ return new Promise((resolve, reject) => {
34
+ const sock = net.createConnection(socketPath());
35
+ let buf = '';
36
+ const timer = setTimeout(() => {
37
+ sock.destroy();
38
+ reject(new Error('daemon call timed out'));
39
+ }, CALL_TIMEOUT_MS);
40
+ sock.on('connect', () => {
41
+ const req = { id: makeRequestId(), cmd, args };
42
+ sock.write(JSON.stringify(req) + '\n');
43
+ });
44
+ sock.on('data', (chunk) => {
45
+ buf += chunk.toString('utf8');
46
+ const nl = buf.indexOf('\n');
47
+ if (nl === -1)
48
+ return;
49
+ const line = buf.slice(0, nl);
50
+ let resp;
51
+ try {
52
+ resp = JSON.parse(line);
53
+ }
54
+ catch (e) {
55
+ clearTimeout(timer);
56
+ sock.destroy();
57
+ reject(new Error('daemon: malformed response'));
58
+ return;
59
+ }
60
+ clearTimeout(timer);
61
+ sock.end();
62
+ if (resp.ok) {
63
+ resolve(resp.data);
64
+ }
65
+ else {
66
+ reject(new CliError(resp.exitCode, resp.code, resp.message));
67
+ }
68
+ });
69
+ sock.on('error', (e) => {
70
+ clearTimeout(timer);
71
+ reject(e);
72
+ });
73
+ });
74
+ }
75
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}