@darksol/terminal 0.9.2 → 0.11.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/README.md +111 -1
- package/package.json +4 -1
- package/src/browser/actions.js +58 -0
- package/src/cli.js +327 -24
- package/src/config/keys.js +12 -2
- package/src/daemon/index.js +225 -0
- package/src/daemon/manager.js +148 -0
- package/src/daemon/pid.js +80 -0
- package/src/services/browser.js +659 -0
- package/src/services/poker.js +937 -0
- package/src/services/telegram.js +570 -0
- package/src/web/commands.js +387 -1
- package/src/web/server.js +27 -6
- package/src/web/terminal.js +1 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ A unified CLI for market intel, trading, AI-powered analysis, on-chain oracle, c
|
|
|
15
15
|
[](https://www.gnu.org/licenses/gpl-3.0)
|
|
16
16
|
[](https://nodejs.org/)
|
|
17
17
|
|
|
18
|
-
- Current release: **0.
|
|
18
|
+
- Current release: **0.11.0**
|
|
19
19
|
- Changelog: `CHANGELOG.md`
|
|
20
20
|
|
|
21
21
|
## Install
|
|
@@ -81,6 +81,27 @@ darksol serve
|
|
|
81
81
|
|
|
82
82
|
# Start agent signer for OpenClaw
|
|
83
83
|
darksol agent start main
|
|
84
|
+
|
|
85
|
+
# Telegram bot — AI chat through Telegram
|
|
86
|
+
darksol telegram setup
|
|
87
|
+
darksol telegram start
|
|
88
|
+
darksol telegram status
|
|
89
|
+
darksol telegram send 123456789 "Hello from DARKSOL"
|
|
90
|
+
|
|
91
|
+
# Background daemon — manage persistent services
|
|
92
|
+
darksol daemon start
|
|
93
|
+
darksol daemon status
|
|
94
|
+
darksol daemon stop
|
|
95
|
+
|
|
96
|
+
# Browser automation (requires: npm i playwright-core)
|
|
97
|
+
darksol browser launch --headed
|
|
98
|
+
darksol browser navigate https://app.uniswap.org
|
|
99
|
+
darksol browser screenshot swap-page.png
|
|
100
|
+
darksol browser click "#swap-button"
|
|
101
|
+
darksol browser type "#amount-input" "1.0"
|
|
102
|
+
darksol browser eval "document.title"
|
|
103
|
+
darksol browser close
|
|
104
|
+
darksol browser install
|
|
84
105
|
```
|
|
85
106
|
|
|
86
107
|
## `darksol serve` (Web Terminal UX)
|
|
@@ -147,11 +168,100 @@ ai <prompt> # chat with trading assistant
|
|
|
147
168
|
| `cards` | Crypto → prepaid Visa/MC cards | Service fees |
|
|
148
169
|
| `builders` | ERC-8021 builder directory + leaderboard | Free |
|
|
149
170
|
| `facilitator` | x402 payment verification & settlement | Free |
|
|
171
|
+
| `telegram` | Telegram bot — AI chat via Telegram Bot API | Provider dependent |
|
|
172
|
+
| `daemon` | Background service daemon (manages TG, browser, etc.) | Free |
|
|
173
|
+
| `browser` | Playwright-powered browser automation | Free |
|
|
150
174
|
| `serve` | Local interactive web terminal (xterm.js) | Free |
|
|
151
175
|
| `config` | Terminal configuration | Free |
|
|
152
176
|
|
|
153
177
|
---
|
|
154
178
|
|
|
179
|
+
## 📱 Telegram Bot
|
|
180
|
+
|
|
181
|
+
Turn your terminal into a Telegram AI agent. Same brain (LLM + soul + memory), different mouth.
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Guided setup — walks you through BotFather
|
|
185
|
+
darksol telegram setup
|
|
186
|
+
|
|
187
|
+
# Start the bot (foreground, or managed by daemon)
|
|
188
|
+
darksol telegram start
|
|
189
|
+
|
|
190
|
+
# Check bot status
|
|
191
|
+
darksol telegram status
|
|
192
|
+
|
|
193
|
+
# Send a direct message
|
|
194
|
+
darksol telegram send <chat_id> "Hello from DARKSOL"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Setup walkthrough:**
|
|
198
|
+
1. Open Telegram → search `@BotFather` → send `/newbot`
|
|
199
|
+
2. Follow BotFather's prompts to name your bot
|
|
200
|
+
3. Copy the bot token
|
|
201
|
+
4. Run `darksol telegram setup` → paste token → auto-validates via `getMe`
|
|
202
|
+
5. Token encrypted and stored in your key vault
|
|
203
|
+
6. `darksol telegram start` → bot goes live
|
|
204
|
+
|
|
205
|
+
**Features:**
|
|
206
|
+
- Per-chat session memory (remembers conversation context)
|
|
207
|
+
- Soul system prompt (your agent's personality carries over)
|
|
208
|
+
- Built-in commands: `/start`, `/help`, `/status`
|
|
209
|
+
- Typing indicators while LLM processes
|
|
210
|
+
- Rate limiting (1 req/sec per chat)
|
|
211
|
+
- 429 auto-retry for Telegram API limits
|
|
212
|
+
- Daemon-aware: runs foreground solo, or as a managed service
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 🖥️ Background Daemon
|
|
217
|
+
|
|
218
|
+
One process to rule them all. Manages persistent services (Telegram bot, browser, future channels).
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
darksol daemon start # Detached background process
|
|
222
|
+
darksol daemon status # PID, uptime, active services
|
|
223
|
+
darksol daemon stop # Graceful shutdown
|
|
224
|
+
darksol daemon restart # Stop + start
|
|
225
|
+
darksol daemon start --port 9999 # Custom health port
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Health endpoint:** `http://localhost:18792/health` — returns uptime, version, active services list.
|
|
229
|
+
|
|
230
|
+
**Service registry:** Services (Telegram, browser, etc.) register with the daemon for managed lifecycle. Start once, everything runs.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 🌐 Browser Automation
|
|
235
|
+
|
|
236
|
+
Playwright-powered browser control — automate dApps, scrape data, take screenshots.
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Install browser binary (one-time)
|
|
240
|
+
darksol browser install
|
|
241
|
+
|
|
242
|
+
# Launch and control
|
|
243
|
+
darksol browser launch --headed --type chromium
|
|
244
|
+
darksol browser navigate https://app.uniswap.org
|
|
245
|
+
darksol browser screenshot swap-page.png
|
|
246
|
+
darksol browser click "#connect-wallet"
|
|
247
|
+
darksol browser type "#search" "AERO"
|
|
248
|
+
darksol browser eval "document.title"
|
|
249
|
+
darksol browser status
|
|
250
|
+
darksol browser close
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Requires:** `npm install playwright-core` (optional dependency — only needed if you use browser features).
|
|
254
|
+
|
|
255
|
+
**Features:**
|
|
256
|
+
- Chromium, Firefox, or WebKit
|
|
257
|
+
- Headless (default) or headed mode
|
|
258
|
+
- Named profiles with persistent cookies/sessions (`~/.darksol/browser/profiles/`)
|
|
259
|
+
- IPC via named pipes — CLI commands talk to a running browser instance
|
|
260
|
+
- Web shell integration (`browser` command in `darksol serve`)
|
|
261
|
+
- Daemon-managed when running
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
155
265
|
## 🔐 Secure Agent Signer
|
|
156
266
|
|
|
157
267
|
**The killer feature.** A PK-isolated signing proxy for AI agents (OpenClaw, etc.).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darksol/terminal",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "DARKSOL Terminal — unified CLI for all DARKSOL services. Market intel, trading, oracle, casino, and more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,6 +46,9 @@
|
|
|
46
46
|
"update-notifier": "^7.3.1",
|
|
47
47
|
"ws": "^8.19.0"
|
|
48
48
|
},
|
|
49
|
+
"optionalDependencies": {
|
|
50
|
+
"playwright-core": "^1.52.0"
|
|
51
|
+
},
|
|
49
52
|
"engines": {
|
|
50
53
|
"node": ">=18.0.0"
|
|
51
54
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { sendBrowserCommand } from '../services/browser.js';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_TIMEOUT = 30_000;
|
|
4
|
+
|
|
5
|
+
export async function waitForPage(target, opts = {}) {
|
|
6
|
+
const expression = JSON.stringify(target);
|
|
7
|
+
return sendBrowserCommand('eval', {
|
|
8
|
+
expression: `
|
|
9
|
+
new Promise((resolve) => {
|
|
10
|
+
const target = ${expression};
|
|
11
|
+
const timeout = ${Number(opts.timeout || DEFAULT_TIMEOUT)};
|
|
12
|
+
const start = Date.now();
|
|
13
|
+
const check = () => {
|
|
14
|
+
const matches = typeof target === 'string'
|
|
15
|
+
? window.location.href.includes(target)
|
|
16
|
+
: true;
|
|
17
|
+
if (matches) return resolve({ ok: true, url: window.location.href });
|
|
18
|
+
if (Date.now() - start > timeout) return resolve({ ok: false, url: window.location.href });
|
|
19
|
+
setTimeout(check, 250);
|
|
20
|
+
};
|
|
21
|
+
check();
|
|
22
|
+
})
|
|
23
|
+
`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export async function fillForm(fields = [], opts = {}) {
|
|
28
|
+
for (const field of fields) {
|
|
29
|
+
await sendBrowserCommand('type', {
|
|
30
|
+
selector: field.selector,
|
|
31
|
+
text: field.value,
|
|
32
|
+
timeout: opts.timeout || DEFAULT_TIMEOUT,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function runLoginFlow(flow = {}) {
|
|
39
|
+
if (flow.url) {
|
|
40
|
+
await sendBrowserCommand('navigate', {
|
|
41
|
+
url: flow.url,
|
|
42
|
+
timeout: flow.timeout || DEFAULT_TIMEOUT,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (Array.isArray(flow.fields) && flow.fields.length) {
|
|
46
|
+
await fillForm(flow.fields, flow);
|
|
47
|
+
}
|
|
48
|
+
if (flow.submitSelector) {
|
|
49
|
+
await sendBrowserCommand('click', {
|
|
50
|
+
selector: flow.submitSelector,
|
|
51
|
+
timeout: flow.timeout || DEFAULT_TIMEOUT,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (flow.waitFor) {
|
|
55
|
+
await waitForPage(flow.waitFor, flow);
|
|
56
|
+
}
|
|
57
|
+
return sendBrowserCommand('status');
|
|
58
|
+
}
|