@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 CHANGED
@@ -15,7 +15,7 @@ A unified CLI for market intel, trading, AI-powered analysis, on-chain oracle, c
15
15
  [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-gold.svg)](https://www.gnu.org/licenses/gpl-3.0)
16
16
  [![Node](https://img.shields.io/badge/node-%3E%3D18.0.0-green.svg)](https://nodejs.org/)
17
17
 
18
- - Current release: **0.9.2**
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.9.2",
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
+ }