dsclaw 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.
- package/dist/cli/index.js +1901 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +707 -0
- package/dist/index.js +40149 -0
- package/dist/index.js.map +1 -0
- package/dist/web/chat.html +406 -0
- package/openclaw.plugin.json +19 -0
- package/package.json +73 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>DropClaw</title>
|
|
7
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🤖</text></svg>">
|
|
8
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.11.1/build/styles/github-dark.min.css">
|
|
9
|
+
<style>
|
|
10
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
11
|
+
:root{
|
|
12
|
+
--bg:#ffffff;--bg2:#f9fafb;--bg3:#f3f4f6;
|
|
13
|
+
--text:#111827;--text2:#6b7280;--text3:#9ca3af;
|
|
14
|
+
--border:#e5e7eb;--accent:#2563eb;--accent-light:#eff6ff;
|
|
15
|
+
--user-bg:#eff6ff;--radius:16px;
|
|
16
|
+
--font:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',sans-serif;
|
|
17
|
+
}
|
|
18
|
+
html,body{height:100%;font-family:var(--font);background:var(--bg);color:var(--text)}
|
|
19
|
+
body{display:flex;flex-direction:column}
|
|
20
|
+
|
|
21
|
+
/* Header */
|
|
22
|
+
.header{
|
|
23
|
+
padding:14px 24px;border-bottom:1px solid var(--border);
|
|
24
|
+
display:flex;align-items:center;gap:10px;
|
|
25
|
+
background:var(--bg);z-index:10;
|
|
26
|
+
}
|
|
27
|
+
.header-logo{font-size:18px;font-weight:700;color:var(--text);letter-spacing:-0.3px}
|
|
28
|
+
.header-dot{width:8px;height:8px;border-radius:50%;background:#22c55e;flex-shrink:0}
|
|
29
|
+
.header-sub{font-size:13px;color:var(--text3)}
|
|
30
|
+
|
|
31
|
+
/* Messages */
|
|
32
|
+
.messages{
|
|
33
|
+
flex:1;overflow-y:auto;padding:24px 0 100px;
|
|
34
|
+
scroll-behavior:smooth;
|
|
35
|
+
}
|
|
36
|
+
.msg-wrap{max-width:740px;margin:0 auto;padding:0 24px}
|
|
37
|
+
.msg{padding:20px 0;display:flex;gap:14px;animation:fadeIn .3s ease}
|
|
38
|
+
.msg+.msg{border-top:1px solid #f3f4f6}
|
|
39
|
+
.msg.user{justify-content:flex-end}
|
|
40
|
+
.msg.user .msg-body{
|
|
41
|
+
background:var(--user-bg);border-radius:var(--radius) var(--radius) 4px var(--radius);
|
|
42
|
+
padding:12px 18px;max-width:75%;color:var(--text);
|
|
43
|
+
}
|
|
44
|
+
.msg.bot{align-items:flex-start}
|
|
45
|
+
.msg.bot .msg-body{flex:1;line-height:1.75;font-size:15px;min-width:0}
|
|
46
|
+
.avatar{
|
|
47
|
+
width:30px;height:30px;border-radius:50%;
|
|
48
|
+
display:flex;align-items:center;justify-content:center;
|
|
49
|
+
font-size:16px;flex-shrink:0;background:#fef3c7;
|
|
50
|
+
border:1px solid #fde68a;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Markdown content */
|
|
54
|
+
.msg-body p{margin:6px 0}
|
|
55
|
+
.msg-body ul,.msg-body ol{padding-left:24px;margin:8px 0}
|
|
56
|
+
.msg-body li{margin:4px 0}
|
|
57
|
+
.msg-body strong{font-weight:600}
|
|
58
|
+
.msg-body em{font-style:italic;color:var(--text2)}
|
|
59
|
+
.msg-body a{color:var(--accent);text-decoration:none}
|
|
60
|
+
.msg-body a:hover{text-decoration:underline}
|
|
61
|
+
.msg-body pre{
|
|
62
|
+
background:#1e1e2e;color:#cdd6f4;border-radius:10px;
|
|
63
|
+
padding:16px;overflow-x:auto;margin:10px 0;font-size:13px;
|
|
64
|
+
line-height:1.6;
|
|
65
|
+
}
|
|
66
|
+
.msg-body code{
|
|
67
|
+
background:var(--bg3);padding:2px 6px;border-radius:5px;
|
|
68
|
+
font-size:0.88em;font-family:'SF Mono',Monaco,Consolas,monospace;
|
|
69
|
+
}
|
|
70
|
+
.msg-body pre code{background:none;padding:0;font-size:inherit;border-radius:0}
|
|
71
|
+
.msg-body blockquote{
|
|
72
|
+
border-left:3px solid var(--border);padding-left:14px;
|
|
73
|
+
margin:8px 0;color:var(--text2);
|
|
74
|
+
}
|
|
75
|
+
.msg-body hr{border:none;border-top:1px solid var(--border);margin:16px 0}
|
|
76
|
+
.msg-body table{border-collapse:collapse;margin:10px 0;width:100%}
|
|
77
|
+
.msg-body th,.msg-body td{border:1px solid var(--border);padding:8px 12px;text-align:left;font-size:14px}
|
|
78
|
+
.msg-body th{background:var(--bg2);font-weight:600}
|
|
79
|
+
|
|
80
|
+
/* Streaming cursor */
|
|
81
|
+
.cursor{
|
|
82
|
+
display:inline-block;width:2px;height:1.15em;
|
|
83
|
+
background:var(--accent);vertical-align:text-bottom;
|
|
84
|
+
margin-left:2px;animation:blink .7s step-end infinite;
|
|
85
|
+
}
|
|
86
|
+
@keyframes blink{0%,100%{opacity:1}50%{opacity:0}}
|
|
87
|
+
|
|
88
|
+
/* Typing dots */
|
|
89
|
+
.typing{display:flex;gap:4px;padding:4px 0}
|
|
90
|
+
.typing span{
|
|
91
|
+
width:7px;height:7px;border-radius:50%;background:var(--text3);
|
|
92
|
+
animation:bounce 1.4s infinite ease-in-out;
|
|
93
|
+
}
|
|
94
|
+
.typing span:nth-child(2){animation-delay:.2s}
|
|
95
|
+
.typing span:nth-child(3){animation-delay:.4s}
|
|
96
|
+
@keyframes bounce{0%,60%,100%{transform:translateY(0)}30%{transform:translateY(-5px)}}
|
|
97
|
+
|
|
98
|
+
/* Card buttons */
|
|
99
|
+
.card-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
|
|
100
|
+
.card-btn{
|
|
101
|
+
padding:9px 20px;border:1.5px solid var(--accent);border-radius:24px;
|
|
102
|
+
background:var(--bg);color:var(--accent);cursor:pointer;
|
|
103
|
+
font-size:14px;font-weight:500;font-family:var(--font);
|
|
104
|
+
transition:all .15s ease;
|
|
105
|
+
}
|
|
106
|
+
.card-btn:hover{background:var(--accent);color:#fff}
|
|
107
|
+
|
|
108
|
+
/* Input area */
|
|
109
|
+
.input-area{
|
|
110
|
+
position:fixed;bottom:0;left:0;right:0;
|
|
111
|
+
padding:16px 24px 24px;background:var(--bg);
|
|
112
|
+
border-top:1px solid var(--border);
|
|
113
|
+
}
|
|
114
|
+
.input-wrap{
|
|
115
|
+
max-width:740px;margin:0 auto;display:flex;align-items:center;gap:10px;
|
|
116
|
+
background:var(--bg2);border:1.5px solid var(--border);
|
|
117
|
+
border-radius:26px;padding:6px 8px 6px 20px;
|
|
118
|
+
transition:border-color .2s;
|
|
119
|
+
}
|
|
120
|
+
.input-wrap:focus-within{border-color:var(--accent)}
|
|
121
|
+
.input-wrap input{
|
|
122
|
+
flex:1;border:none;background:transparent;outline:none;
|
|
123
|
+
font-size:15px;padding:10px 0;font-family:var(--font);color:var(--text);
|
|
124
|
+
}
|
|
125
|
+
.input-wrap input::placeholder{color:var(--text3)}
|
|
126
|
+
.send-btn{
|
|
127
|
+
width:40px;height:40px;border-radius:50%;border:none;
|
|
128
|
+
background:var(--accent);color:#fff;cursor:pointer;
|
|
129
|
+
display:flex;align-items:center;justify-content:center;
|
|
130
|
+
transition:opacity .15s;flex-shrink:0;
|
|
131
|
+
}
|
|
132
|
+
.send-btn:hover{opacity:.85}
|
|
133
|
+
.send-btn:disabled{opacity:.4;cursor:default}
|
|
134
|
+
.send-btn svg{width:18px;height:18px}
|
|
135
|
+
|
|
136
|
+
/* Animations */
|
|
137
|
+
@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
|
|
138
|
+
|
|
139
|
+
/* Responsive */
|
|
140
|
+
@media(max-width:640px){
|
|
141
|
+
.msg-wrap{padding:0 14px}
|
|
142
|
+
.input-area{padding:12px 14px 18px}
|
|
143
|
+
.msg.user .msg-body{max-width:85%}
|
|
144
|
+
}
|
|
145
|
+
</style>
|
|
146
|
+
</head>
|
|
147
|
+
<body>
|
|
148
|
+
<div class="header">
|
|
149
|
+
<span style="font-size:22px">🤖</span>
|
|
150
|
+
<span class="header-logo">DropClaw</span>
|
|
151
|
+
<span class="header-dot" id="statusDot"></span>
|
|
152
|
+
<span class="header-sub" id="statusText">Connecting...</span>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<div class="messages" id="messages">
|
|
156
|
+
<div class="msg-wrap" id="msgWrap"></div>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="input-area">
|
|
160
|
+
<div class="input-wrap">
|
|
161
|
+
<input id="input" type="text" placeholder="Message DropClaw..." autocomplete="off" autofocus>
|
|
162
|
+
<button class="send-btn" id="sendBtn" title="Send">
|
|
163
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>
|
|
164
|
+
</button>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@15/marked.min.js"></script>
|
|
169
|
+
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.11.1/build/highlight.min.js"></script>
|
|
170
|
+
<script>
|
|
171
|
+
(function(){
|
|
172
|
+
const $ = s => document.querySelector(s);
|
|
173
|
+
const msgWrap = $('#msgWrap');
|
|
174
|
+
const messagesEl = $('#messages');
|
|
175
|
+
const input = $('#input');
|
|
176
|
+
const sendBtn = $('#sendBtn');
|
|
177
|
+
const statusDot = $('#statusDot');
|
|
178
|
+
const statusText = $('#statusText');
|
|
179
|
+
|
|
180
|
+
let ws, userId = localStorage.getItem('dc_uid') || '';
|
|
181
|
+
let streaming = false, streamBuf = '', streamEl = null;
|
|
182
|
+
let inputMode = 'text';
|
|
183
|
+
let reconnectTimer = null, reconnectDelay = 1000;
|
|
184
|
+
|
|
185
|
+
marked.setOptions({
|
|
186
|
+
breaks: true,
|
|
187
|
+
gfm: true,
|
|
188
|
+
highlight: function(code, lang) {
|
|
189
|
+
if (lang && hljs.getLanguage(lang)) {
|
|
190
|
+
return hljs.highlight(code, { language: lang }).value;
|
|
191
|
+
}
|
|
192
|
+
return hljs.highlightAuto(code).value;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
/* ─── WebSocket ─── */
|
|
197
|
+
function connect() {
|
|
198
|
+
const proto = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
199
|
+
const url = `${proto}://${location.host}/ws` + (userId ? `?userId=${userId}` : '');
|
|
200
|
+
ws = new WebSocket(url);
|
|
201
|
+
|
|
202
|
+
ws.onopen = () => {
|
|
203
|
+
setStatus(true);
|
|
204
|
+
reconnectDelay = 1000;
|
|
205
|
+
if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
ws.onmessage = (e) => {
|
|
209
|
+
try { handle(JSON.parse(e.data)); } catch {}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
ws.onclose = () => {
|
|
213
|
+
setStatus(false);
|
|
214
|
+
reconnectTimer = setTimeout(() => {
|
|
215
|
+
reconnectDelay = Math.min(reconnectDelay * 1.5, 10000);
|
|
216
|
+
connect();
|
|
217
|
+
}, reconnectDelay);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
ws.onerror = () => ws.close();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function setStatus(ok) {
|
|
224
|
+
statusDot.style.background = ok ? '#22c55e' : '#ef4444';
|
|
225
|
+
statusText.textContent = ok ? 'Online' : 'Reconnecting...';
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* ─── Protocol Handler ─── */
|
|
229
|
+
function handle(d) {
|
|
230
|
+
switch(d.type) {
|
|
231
|
+
case 'session':
|
|
232
|
+
userId = d.userId;
|
|
233
|
+
localStorage.setItem('dc_uid', userId);
|
|
234
|
+
break;
|
|
235
|
+
case 'message':
|
|
236
|
+
hideTyping();
|
|
237
|
+
addBot(d.text);
|
|
238
|
+
break;
|
|
239
|
+
case 'stream_start':
|
|
240
|
+
hideTyping();
|
|
241
|
+
startStream();
|
|
242
|
+
break;
|
|
243
|
+
case 'stream_delta':
|
|
244
|
+
appendDelta(d.delta);
|
|
245
|
+
break;
|
|
246
|
+
case 'stream_end':
|
|
247
|
+
endStream();
|
|
248
|
+
break;
|
|
249
|
+
case 'card':
|
|
250
|
+
hideTyping();
|
|
251
|
+
addCard(d);
|
|
252
|
+
break;
|
|
253
|
+
case 'typing':
|
|
254
|
+
d.active ? showTyping() : hideTyping();
|
|
255
|
+
break;
|
|
256
|
+
case 'clear_input':
|
|
257
|
+
input.value = '';
|
|
258
|
+
break;
|
|
259
|
+
case 'set_input_type':
|
|
260
|
+
inputMode = d.inputType;
|
|
261
|
+
input.type = d.inputType;
|
|
262
|
+
input.placeholder = d.inputType === 'password'
|
|
263
|
+
? 'Type securely (hidden)...' : 'Message DropClaw...';
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* ─── Send ─── */
|
|
269
|
+
function send() {
|
|
270
|
+
const text = input.value.trim();
|
|
271
|
+
if (!text || !ws || ws.readyState !== 1) return;
|
|
272
|
+
addUser(inputMode === 'password' ? '••••••••' : text);
|
|
273
|
+
ws.send(JSON.stringify({ type: 'message', text, userId }));
|
|
274
|
+
input.value = '';
|
|
275
|
+
input.focus();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function sendCallback(data) {
|
|
279
|
+
if (!ws || ws.readyState !== 1) return;
|
|
280
|
+
ws.send(JSON.stringify({ type: 'callback', data, userId }));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/* ─── Message Rendering ─── */
|
|
284
|
+
function addUser(text) {
|
|
285
|
+
const el = document.createElement('div');
|
|
286
|
+
el.className = 'msg user';
|
|
287
|
+
el.innerHTML = `<div class="msg-body">${esc(text)}</div>`;
|
|
288
|
+
msgWrap.appendChild(el);
|
|
289
|
+
scroll();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function addBot(text) {
|
|
293
|
+
const el = botEl();
|
|
294
|
+
el.querySelector('.msg-body').innerHTML = md(text);
|
|
295
|
+
msgWrap.appendChild(el);
|
|
296
|
+
hlAll();
|
|
297
|
+
scroll();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function startStream() {
|
|
301
|
+
streaming = true;
|
|
302
|
+
streamBuf = '';
|
|
303
|
+
const el = botEl();
|
|
304
|
+
el.id = 'stream';
|
|
305
|
+
el.querySelector('.msg-body').innerHTML = '<span class="cursor"></span>';
|
|
306
|
+
msgWrap.appendChild(el);
|
|
307
|
+
streamEl = el.querySelector('.msg-body');
|
|
308
|
+
scroll();
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function appendDelta(delta) {
|
|
312
|
+
streamBuf += delta;
|
|
313
|
+
if (streamEl) {
|
|
314
|
+
streamEl.innerHTML = md(streamBuf) + '<span class="cursor"></span>';
|
|
315
|
+
scroll();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function endStream() {
|
|
320
|
+
streaming = false;
|
|
321
|
+
if (streamEl) {
|
|
322
|
+
streamEl.innerHTML = md(streamBuf);
|
|
323
|
+
hlAll();
|
|
324
|
+
}
|
|
325
|
+
const el = document.getElementById('stream');
|
|
326
|
+
if (el) el.removeAttribute('id');
|
|
327
|
+
streamEl = null;
|
|
328
|
+
streamBuf = '';
|
|
329
|
+
scroll();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function addCard(d) {
|
|
333
|
+
const el = botEl();
|
|
334
|
+
let h = '';
|
|
335
|
+
if (d.title) h += `<p><strong>${esc(d.title)}</strong></p>`;
|
|
336
|
+
if (d.summary) h += md(d.summary);
|
|
337
|
+
if (d.actions && d.actions.length) {
|
|
338
|
+
h += '<div class="card-actions">';
|
|
339
|
+
d.actions.forEach(a => {
|
|
340
|
+
h += `<button class="card-btn" data-cb="${esc(a.callbackData)}">${esc(a.label)}</button>`;
|
|
341
|
+
});
|
|
342
|
+
h += '</div>';
|
|
343
|
+
}
|
|
344
|
+
el.querySelector('.msg-body').innerHTML = h;
|
|
345
|
+
el.querySelectorAll('.card-btn').forEach(btn => {
|
|
346
|
+
btn.addEventListener('click', () => sendCallback(btn.dataset.cb));
|
|
347
|
+
});
|
|
348
|
+
msgWrap.appendChild(el);
|
|
349
|
+
scroll();
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function showTyping() {
|
|
353
|
+
if (document.getElementById('typing')) return;
|
|
354
|
+
const el = botEl();
|
|
355
|
+
el.id = 'typing';
|
|
356
|
+
el.querySelector('.msg-body').innerHTML = '<div class="typing"><span></span><span></span><span></span></div>';
|
|
357
|
+
msgWrap.appendChild(el);
|
|
358
|
+
scroll();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function hideTyping() {
|
|
362
|
+
const el = document.getElementById('typing');
|
|
363
|
+
if (el) el.remove();
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* ─── Helpers ─── */
|
|
367
|
+
function botEl() {
|
|
368
|
+
const el = document.createElement('div');
|
|
369
|
+
el.className = 'msg bot';
|
|
370
|
+
el.innerHTML = '<div class="avatar">🤖</div><div class="msg-body"></div>';
|
|
371
|
+
return el;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function md(text) {
|
|
375
|
+
try { return marked.parse(text); } catch { return esc(text); }
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function esc(t) {
|
|
379
|
+
const d = document.createElement('div');
|
|
380
|
+
d.textContent = t;
|
|
381
|
+
return d.innerHTML;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function hlAll() {
|
|
385
|
+
document.querySelectorAll('.msg-body pre code').forEach(b => {
|
|
386
|
+
if (!b.dataset.hl) { hljs.highlightElement(b); b.dataset.hl = '1'; }
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function scroll() {
|
|
391
|
+
requestAnimationFrame(() => {
|
|
392
|
+
messagesEl.scrollTop = messagesEl.scrollHeight;
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* ─── Events ─── */
|
|
397
|
+
input.addEventListener('keydown', e => {
|
|
398
|
+
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); send(); }
|
|
399
|
+
});
|
|
400
|
+
sendBtn.addEventListener('click', send);
|
|
401
|
+
|
|
402
|
+
connect();
|
|
403
|
+
})();
|
|
404
|
+
</script>
|
|
405
|
+
</body>
|
|
406
|
+
</html>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dropclaw",
|
|
3
|
+
"name": "DropClaw",
|
|
4
|
+
"description": "DSers dropshipping integration for OpenClaw — product import, order management, logistics tracking via AI agents.",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"apiBaseUrl": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"default": "https://bff-api-gw.dsers.com"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"channels": [],
|
|
17
|
+
"providers": [],
|
|
18
|
+
"skills": []
|
|
19
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dsclaw",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-powered dropshipping agent system built on OpenClaw. Two agents (Navigator + Claw-Ops) automate DSers workflows via Telegram, WhatsApp, and Feishu.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"dsclaw": "./dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup && mkdir -p dist/web && cp src/web/chat.html dist/web/chat.html",
|
|
13
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
14
|
+
"start": "node dist/cli/index.js start",
|
|
15
|
+
"lint": "eslint src/",
|
|
16
|
+
"lint:fix": "eslint src/ --fix",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"dropclaw",
|
|
23
|
+
"dropshipping",
|
|
24
|
+
"ai-agent",
|
|
25
|
+
"dsers",
|
|
26
|
+
"openclaw",
|
|
27
|
+
"telegram",
|
|
28
|
+
"whatsapp",
|
|
29
|
+
"feishu",
|
|
30
|
+
"mcp",
|
|
31
|
+
"automation"
|
|
32
|
+
],
|
|
33
|
+
"author": "lofder",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=20"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"openclaw.plugin.json"
|
|
41
|
+
],
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@ai-sdk/anthropic": "^3.0.64",
|
|
44
|
+
"@ai-sdk/google": "^3.0.53",
|
|
45
|
+
"@ai-sdk/openai": "^3.0.48",
|
|
46
|
+
"ai": "^6.0.138",
|
|
47
|
+
"commander": "^14.0.3",
|
|
48
|
+
"grammy": "^1.41.1",
|
|
49
|
+
"inquirer": "^13.3.2",
|
|
50
|
+
"nanoid": "^5.1.7",
|
|
51
|
+
"opossum": "^5.0.1",
|
|
52
|
+
"p-limit": "^7.3.0",
|
|
53
|
+
"pino": "^10.3.1",
|
|
54
|
+
"pino-pretty": "^13.1.3",
|
|
55
|
+
"uuid": "^13.0.0",
|
|
56
|
+
"ws": "^8.20.0",
|
|
57
|
+
"zod": "^4.3.6"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@eslint/js": "^10.0.1",
|
|
61
|
+
"@types/inquirer": "^9.0.9",
|
|
62
|
+
"@types/node": "^25.5.0",
|
|
63
|
+
"@types/opossum": "^8.1.9",
|
|
64
|
+
"@types/uuid": "^10.0.0",
|
|
65
|
+
"@types/ws": "^8.18.1",
|
|
66
|
+
"eslint": "^10.1.0",
|
|
67
|
+
"typescript": "^6.0.2",
|
|
68
|
+
"tsup": "^8.5.1",
|
|
69
|
+
"tsx": "^4.21.0",
|
|
70
|
+
"typescript-eslint": "^8.57.2",
|
|
71
|
+
"vitest": "^4.1.1"
|
|
72
|
+
}
|
|
73
|
+
}
|