@ahkohd/yagami 0.1.2
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/.beads/.beads-credential-key +1 -0
- package/.beads/README.md +81 -0
- package/.beads/config.yaml +54 -0
- package/.beads/hooks/post-checkout +24 -0
- package/.beads/hooks/post-merge +24 -0
- package/.beads/hooks/pre-commit +24 -0
- package/.beads/hooks/pre-push +24 -0
- package/.beads/hooks/prepare-commit-msg +24 -0
- package/.beads/metadata.json +7 -0
- package/.github/workflows/ci.yml +43 -0
- package/.github/workflows/release.yml +115 -0
- package/AGENTS.md +150 -0
- package/README.md +210 -0
- package/biome.json +36 -0
- package/config/mcporter.json +8 -0
- package/dist/cli/theme.js +202 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli.js +1883 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +223 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.js +745 -0
- package/dist/daemon.js.map +1 -0
- package/dist/engine/constants.js +131 -0
- package/dist/engine/constants.js.map +1 -0
- package/dist/engine/deep-research.js +167 -0
- package/dist/engine/deep-research.js.map +1 -0
- package/dist/engine/defuddle-utils.js +57 -0
- package/dist/engine/defuddle-utils.js.map +1 -0
- package/dist/engine/github-fetch.js +232 -0
- package/dist/engine/github-fetch.js.map +1 -0
- package/dist/engine/helpers.js +372 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/limiter.js +75 -0
- package/dist/engine/limiter.js.map +1 -0
- package/dist/engine/policy.js +313 -0
- package/dist/engine/policy.js.map +1 -0
- package/dist/engine/runtime-utils.js +65 -0
- package/dist/engine/runtime-utils.js.map +1 -0
- package/dist/engine/search-discovery.js +275 -0
- package/dist/engine/search-discovery.js.map +1 -0
- package/dist/engine/url-utils.js +72 -0
- package/dist/engine/url-utils.js.map +1 -0
- package/dist/engine.js +2030 -0
- package/dist/engine.js.map +1 -0
- package/dist/mcp.js +282 -0
- package/dist/mcp.js.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/daemon.js +2 -0
- package/dist/types/daemon.js.map +1 -0
- package/dist/types/engine.js +2 -0
- package/dist/types/engine.js.map +1 -0
- package/package.json +66 -0
- package/packages/pi-yagami-search/README.md +39 -0
- package/packages/pi-yagami-search/extensions/yagami-search.ts +273 -0
- package/packages/pi-yagami-search/package.json +41 -0
- package/src/cli/theme.ts +260 -0
- package/src/cli.ts +2226 -0
- package/src/config.ts +250 -0
- package/src/daemon.ts +990 -0
- package/src/engine/constants.ts +147 -0
- package/src/engine/deep-research.ts +207 -0
- package/src/engine/defuddle-utils.ts +75 -0
- package/src/engine/github-fetch.ts +265 -0
- package/src/engine/helpers.ts +394 -0
- package/src/engine/limiter.ts +97 -0
- package/src/engine/policy.ts +392 -0
- package/src/engine/runtime-utils.ts +79 -0
- package/src/engine/search-discovery.ts +351 -0
- package/src/engine/url-utils.ts +86 -0
- package/src/engine.ts +2516 -0
- package/src/mcp.ts +337 -0
- package/src/shims-cli.d.ts +3 -0
- package/src/types/cli.ts +7 -0
- package/src/types/config.ts +53 -0
- package/src/types/daemon.ts +22 -0
- package/src/types/engine.ts +194 -0
- package/tsconfig.json +18 -0
package/README.md
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Yagami
|
|
2
|
+
|
|
3
|
+
Local-first web search agent
|
|
4
|
+
|
|
5
|
+
YAGAMI gives you:
|
|
6
|
+
- **Agentic web search**: `search`, `search-advanced`, `code`, `company`, `similar`
|
|
7
|
+
- **Deterministic extraction**: `fetch` (`browse & present`)
|
|
8
|
+
- **Async deep agentic web search**: `deep start` / `deep check`
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm i -g @ahkohd/yagami
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quick start
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
yagami start
|
|
20
|
+
yagami doctor
|
|
21
|
+
yagami search "latest updates in browser automation"
|
|
22
|
+
yagami fetch https://example.com --max-chars 2000
|
|
23
|
+
|
|
24
|
+
yagami deep start "Research FlashAttention in LLMs with citations" --effort thorough
|
|
25
|
+
yagami deep check <researchId>
|
|
26
|
+
|
|
27
|
+
yagami stop
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Pi package (pi-yagami-search)
|
|
31
|
+
|
|
32
|
+
- [`packages/pi-yagami-search`](./packages/pi-yagami-search/) — Pi extension package.
|
|
33
|
+
|
|
34
|
+
## Commands
|
|
35
|
+
|
|
36
|
+
- `yagami start` / `stop` / `status` / `reload` / `doctor` — Daemon lifecycle & health checks (`status --cache --tokens` for detailed stats)
|
|
37
|
+
- `yagami search <query>` — Agentic web search (default: collated source records)
|
|
38
|
+
- `yagami search-advanced <query>` — Agentic web search with filters (`--include-domains`, `--category`, etc.)
|
|
39
|
+
- `yagami code <query>` — Agentic code/docs-focused search
|
|
40
|
+
- `yagami company <name>` — Agentic company search
|
|
41
|
+
- `yagami similar <url>` — Agentic alternative/similar-site discovery
|
|
42
|
+
- `yagami fetch <url>` — Deterministic single-page extraction
|
|
43
|
+
- `yagami deep start <instructions>` — Starts async deep agentic web search
|
|
44
|
+
- `yagami deep check <researchId>` — Checks deep agentic search status/result
|
|
45
|
+
- `yagami config ...` — Read/write `~/.config/yagami/config.json`
|
|
46
|
+
- `yagami theme preview` — Preview CLI theme styling
|
|
47
|
+
|
|
48
|
+
Useful flags:
|
|
49
|
+
- `--json` for machine-readable output
|
|
50
|
+
- `--profile` for latency breakdown on search commands
|
|
51
|
+
|
|
52
|
+
## HTTP API
|
|
53
|
+
|
|
54
|
+
The CLI talks to a local HTTP daemon (default: `http://127.0.0.1:43111`).
|
|
55
|
+
|
|
56
|
+
Core endpoints:
|
|
57
|
+
- `GET /health`
|
|
58
|
+
- `POST /stats`
|
|
59
|
+
- `POST /reload`
|
|
60
|
+
- `POST /stop`
|
|
61
|
+
- `POST /mcp` (MCP over HTTP JSON-RPC)
|
|
62
|
+
- `GET /mcp` (returns 405; SSE stream not enabled)
|
|
63
|
+
- `DELETE /mcp` (terminate MCP session)
|
|
64
|
+
- `POST /search`, `POST /search/stream`
|
|
65
|
+
- `POST /search/advanced`, `POST /search/advanced/stream`
|
|
66
|
+
- `POST /code-context`, `POST /code-context/stream`
|
|
67
|
+
- `POST /company-research`, `POST /company-research/stream`
|
|
68
|
+
- `POST /find-similar`, `POST /find-similar/stream`
|
|
69
|
+
- `POST /fetch`
|
|
70
|
+
- `POST /deep-research/start`, `POST /deep-research/check`
|
|
71
|
+
|
|
72
|
+
You can configure daemon bind address with config keys (`host`, `port`) or env (`YAGAMI_HOST`, `YAGAMI_PORT`).
|
|
73
|
+
|
|
74
|
+
Search-family POST bodies return source records (collation mode). Use `/deep-research/start` for synthesized reports.
|
|
75
|
+
|
|
76
|
+
## MCP over HTTP
|
|
77
|
+
|
|
78
|
+
`POST /mcp` exposes the Yagami MCP server (tools are discoverable via `tools/list`).
|
|
79
|
+
|
|
80
|
+
## Configuration
|
|
81
|
+
|
|
82
|
+
### 1) Config file (recommended)
|
|
83
|
+
|
|
84
|
+
Default path: `~/.config/yagami/config.json` (or `$XDG_CONFIG_HOME/yagami/config.json`).
|
|
85
|
+
|
|
86
|
+
Recommended local setup:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"host": "127.0.0.1",
|
|
91
|
+
"port": 43111,
|
|
92
|
+
"llmApi": "openai-completions",
|
|
93
|
+
"llmBaseUrl": "http://127.0.0.1:1234/v1",
|
|
94
|
+
"llmApiKey": "",
|
|
95
|
+
"llmModel": "qwen3.5-9b",
|
|
96
|
+
"searchEngine": "duckduckgo",
|
|
97
|
+
"browseLinkTimeoutMs": 7000,
|
|
98
|
+
"cacheTtlMs": 600000,
|
|
99
|
+
"maxMarkdownChars": 120000,
|
|
100
|
+
"operationConcurrency": 4,
|
|
101
|
+
"browseConcurrency": 8,
|
|
102
|
+
"theme": "ansi"
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
Common local endpoints:
|
|
106
|
+
- vLLM: `http://127.0.0.1:8000/v1`
|
|
107
|
+
- SGLang: `http://127.0.0.1:30000/v1`
|
|
108
|
+
- Ollama: `http://127.0.0.1:11434/v1`
|
|
109
|
+
- LM Studio: `http://127.0.0.1:1234/v1`
|
|
110
|
+
|
|
111
|
+
If you run an `anthropic-messages` compatible **local** gateway:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"llmApi": "anthropic-messages",
|
|
116
|
+
"llmBaseUrl": "http://127.0.0.1:4000",
|
|
117
|
+
"llmApiKey": "",
|
|
118
|
+
"llmModel": "minimax-m2.5"
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`llmApiKey` is empty by default. If your local endpoint ignores auth, leave it empty.
|
|
123
|
+
|
|
124
|
+
For a custom search endpoint template:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"searchEngine": "custom",
|
|
129
|
+
"searchEngineUrlTemplate": "https://searx.example/search?q={query}&language=en"
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Canonical `config.json` keys
|
|
134
|
+
|
|
135
|
+
- `host` (string, default: `127.0.0.1`)
|
|
136
|
+
- `port` (integer, default: `43111`)
|
|
137
|
+
- `llmApi` (`openai-completions` | `anthropic-messages`, default: `openai-completions`)
|
|
138
|
+
- `llmBaseUrl` (string; default: `http://127.0.0.1:1234/v1`, or `https://api.anthropic.com` for `anthropic-messages`)
|
|
139
|
+
- `llmApiKey` (string, default: empty string)
|
|
140
|
+
- `llmModel` (string, optional; if empty YAGAMI auto-detects via provider model-list endpoint)
|
|
141
|
+
- `searchEngine` (`duckduckgo` | `bing` | `google` | `brave` | `custom`, default: `duckduckgo`)
|
|
142
|
+
- `searchEngineUrlTemplate` (string URL template, optional; supports `{query}` placeholder; if set, overrides presets)
|
|
143
|
+
- `browseLinkTimeoutMs` (integer milliseconds, default: `7000`)
|
|
144
|
+
- `cacheTtlMs` (integer milliseconds for URL browse cache TTL, default: `600000`)
|
|
145
|
+
- `maxMarkdownChars` (integer markdown extraction cap for `present()`, default: `120000`)
|
|
146
|
+
- `operationConcurrency` (integer concurrent operation slots, default: `4`)
|
|
147
|
+
- `browseConcurrency` (integer concurrent browse slots, default: `8`)
|
|
148
|
+
- `theme` (`ansi` | `none`, default: `ansi`)
|
|
149
|
+
- `themeTokens` (object of token overrides, e.g. `{ "domain": "cyan", "error": "red bold" }`)
|
|
150
|
+
- built-in token names: `domain`, `title`, `duration`, `error`, `dim`, `cyan`, `bold`
|
|
151
|
+
|
|
152
|
+
#### File parsing notes
|
|
153
|
+
|
|
154
|
+
- `ui.<key>`: same keys as above under a `ui` object (merged over top-level)
|
|
155
|
+
- `colors` / `themeColors`: compatibility aliases for `themeTokens`
|
|
156
|
+
|
|
157
|
+
### 2) Config CLI
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
yagami config path
|
|
161
|
+
yagami config show
|
|
162
|
+
yagami config get llmApi
|
|
163
|
+
yagami config set llmApi openai-completions
|
|
164
|
+
yagami config set port 43111 --json-value
|
|
165
|
+
yagami config set browseLinkTimeoutMs 7000 --json-value
|
|
166
|
+
yagami config set cacheTtlMs 600000 --json-value
|
|
167
|
+
yagami config set maxMarkdownChars 120000 --json-value
|
|
168
|
+
yagami config set operationConcurrency 4 --json-value
|
|
169
|
+
yagami config set browseConcurrency 8 --json-value
|
|
170
|
+
yagami config unset themeTokens.domain
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 3) Environment variables
|
|
174
|
+
|
|
175
|
+
- `YAGAMI_CONFIG_FILE` (default: `$YAGAMI_RUNTIME_DIR/config.json`)
|
|
176
|
+
- `YAGAMI_RUNTIME_DIR` (default: `$XDG_CONFIG_HOME/yagami` or `~/.config/yagami`)
|
|
177
|
+
- `YAGAMI_HOST` (default: `127.0.0.1`)
|
|
178
|
+
- `YAGAMI_PORT` (default: `43111`)
|
|
179
|
+
|
|
180
|
+
- `YAGAMI_LLM_API` (`openai-completions` | `anthropic-messages`, default: `openai-completions`)
|
|
181
|
+
- `YAGAMI_LLM_BASE_URL` (default: `http://127.0.0.1:1234/v1`, or `https://api.anthropic.com` for `anthropic-messages`)
|
|
182
|
+
- `YAGAMI_LLM_API_KEY` (default: empty string)
|
|
183
|
+
- `YAGAMI_LLM_MODEL` (optional)
|
|
184
|
+
- `YAGAMI_SEARCH_ENGINE` (`duckduckgo` | `bing` | `google` | `brave` | `custom`, default: `duckduckgo`)
|
|
185
|
+
- `YAGAMI_SEARCH_ENGINE_URL_TEMPLATE` (optional URL template, e.g. `https://searx.example/search?q={query}`)
|
|
186
|
+
|
|
187
|
+
- `YAGAMI_CDP_URL` (default: `ws://127.0.0.1:9222`)
|
|
188
|
+
- `YAGAMI_LIGHTPANDA_HOST` (default: host parsed from `YAGAMI_CDP_URL`)
|
|
189
|
+
- `YAGAMI_LIGHTPANDA_PORT` (default: port parsed from `YAGAMI_CDP_URL`)
|
|
190
|
+
- `YAGAMI_LIGHTPANDA_AUTO_START` (default: `true`)
|
|
191
|
+
- `YAGAMI_LIGHTPANDA_AUTO_STOP` (default: `true`)
|
|
192
|
+
|
|
193
|
+
- `YAGAMI_BROWSE_LINK_TIMEOUT_MS` (default: `7000`)
|
|
194
|
+
- `YAGAMI_QUERY_TIMEOUT_MS` (default: `180000`)
|
|
195
|
+
- `YAGAMI_CACHE_TTL_MS` (default: `600000`)
|
|
196
|
+
- `YAGAMI_MAX_HTML_CHARS` (default: `250000`)
|
|
197
|
+
- `YAGAMI_MAX_MARKDOWN_CHARS` (default: value from `config.json`, else `120000`)
|
|
198
|
+
- `YAGAMI_MAX_DOCUMENTS` (default: `200`)
|
|
199
|
+
- `YAGAMI_OPERATION_CONCURRENCY` (default: `4`)
|
|
200
|
+
- `YAGAMI_BROWSE_CONCURRENCY` (default: `8`)
|
|
201
|
+
|
|
202
|
+
- `YAGAMI_RESEARCH_MAX_PAGES` (default: `12`)
|
|
203
|
+
- `YAGAMI_RESEARCH_MAX_HOPS` (default: `2`)
|
|
204
|
+
- `YAGAMI_RESEARCH_SAME_DOMAIN_ONLY` (default: `false`)
|
|
205
|
+
|
|
206
|
+
- `YAGAMI_TOOL_EXECUTION` (`sequential` | `parallel`, default: `parallel`)
|
|
207
|
+
- `YAGAMI_THEME` (`ansi` | `none`, default: `ansi`)
|
|
208
|
+
- `YAGAMI_THEME_TOKENS` (JSON token overrides)
|
|
209
|
+
- `YAGAMI_NO_COLOR` (disable color when truthy)
|
|
210
|
+
- `YAGAMI_MARKDOWN_RENDER` (default: render markdown only on TTY; set `0`, `false`, `off`, or `no` to force plain text output)
|
package/biome.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.4.9/schema.json",
|
|
3
|
+
"vcs": {
|
|
4
|
+
"enabled": true,
|
|
5
|
+
"clientKind": "git",
|
|
6
|
+
"useIgnoreFile": true
|
|
7
|
+
},
|
|
8
|
+
"files": {
|
|
9
|
+
"includes": ["**", "!!**/dist"]
|
|
10
|
+
},
|
|
11
|
+
"formatter": {
|
|
12
|
+
"enabled": true,
|
|
13
|
+
"indentStyle": "space",
|
|
14
|
+
"indentWidth": 2,
|
|
15
|
+
"lineWidth": 120
|
|
16
|
+
},
|
|
17
|
+
"linter": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"rules": {
|
|
20
|
+
"recommended": true
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"javascript": {
|
|
24
|
+
"formatter": {
|
|
25
|
+
"quoteStyle": "double"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"assist": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"actions": {
|
|
31
|
+
"source": {
|
|
32
|
+
"organizeImports": "on"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
const THEMES = {
|
|
2
|
+
ansi: {
|
|
3
|
+
domain: "3;94",
|
|
4
|
+
title: "97",
|
|
5
|
+
duration: "3;93",
|
|
6
|
+
error: "91",
|
|
7
|
+
dim: "2",
|
|
8
|
+
cyan: "96",
|
|
9
|
+
bold: "1",
|
|
10
|
+
},
|
|
11
|
+
none: {
|
|
12
|
+
domain: "",
|
|
13
|
+
title: "",
|
|
14
|
+
duration: "",
|
|
15
|
+
error: "",
|
|
16
|
+
dim: "",
|
|
17
|
+
cyan: "",
|
|
18
|
+
bold: "",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
const THEME_TOKENS = ["domain", "title", "duration", "error", "dim", "cyan", "bold"];
|
|
22
|
+
const FIXED_ICONS = {
|
|
23
|
+
success: "ok",
|
|
24
|
+
error: "x",
|
|
25
|
+
cache: "[cache]",
|
|
26
|
+
pass: "ok",
|
|
27
|
+
fail: "x",
|
|
28
|
+
bullet: "•",
|
|
29
|
+
web: "•",
|
|
30
|
+
webError: "•",
|
|
31
|
+
connector: "│",
|
|
32
|
+
};
|
|
33
|
+
function normalizeThemeCode(rawValue, token, baseTheme) {
|
|
34
|
+
if (rawValue === undefined || rawValue === null)
|
|
35
|
+
return null;
|
|
36
|
+
const raw = String(rawValue).trim();
|
|
37
|
+
if (!raw)
|
|
38
|
+
return null;
|
|
39
|
+
const hexMatch = raw.match(/^#?([0-9a-fA-F]{6})$/);
|
|
40
|
+
if (hexMatch) {
|
|
41
|
+
const hex = hexMatch[1];
|
|
42
|
+
if (!hex)
|
|
43
|
+
return null;
|
|
44
|
+
const r = Number.parseInt(hex.slice(0, 2), 16);
|
|
45
|
+
const g = Number.parseInt(hex.slice(2, 4), 16);
|
|
46
|
+
const b = Number.parseInt(hex.slice(4, 6), 16);
|
|
47
|
+
if (![r, g, b].every((value) => Number.isFinite(value)))
|
|
48
|
+
return null;
|
|
49
|
+
const stylePrefix = String(baseTheme[token] || "")
|
|
50
|
+
.split(";")
|
|
51
|
+
.filter((part) => part === "1" || part === "2" || part === "3")
|
|
52
|
+
.join(";");
|
|
53
|
+
const colorPart = `38;2;${r};${g};${b}`;
|
|
54
|
+
return stylePrefix ? `${stylePrefix};${colorPart}` : colorPart;
|
|
55
|
+
}
|
|
56
|
+
if (/^[0-9;]+$/.test(raw)) {
|
|
57
|
+
return raw;
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function applyThemeOverrides(themeName, overridesRaw) {
|
|
62
|
+
const baseTheme = (THEMES[themeName] || THEMES.ansi);
|
|
63
|
+
const overrides = {};
|
|
64
|
+
for (const token of THEME_TOKENS) {
|
|
65
|
+
const code = normalizeThemeCode(overridesRaw[token], token, baseTheme);
|
|
66
|
+
if (code !== null)
|
|
67
|
+
overrides[token] = code;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
...baseTheme,
|
|
71
|
+
...overrides,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function supportsColor(theme) {
|
|
75
|
+
if (theme === "none")
|
|
76
|
+
return false;
|
|
77
|
+
if (process.env.NO_COLOR !== undefined)
|
|
78
|
+
return false;
|
|
79
|
+
const noColor = String(process.env.YAGAMI_NO_COLOR || "")
|
|
80
|
+
.trim()
|
|
81
|
+
.toLowerCase();
|
|
82
|
+
if (noColor === "1" || noColor === "true" || noColor === "yes")
|
|
83
|
+
return false;
|
|
84
|
+
const forceColor = String(process.env.FORCE_COLOR || "").trim();
|
|
85
|
+
if (forceColor && forceColor !== "0")
|
|
86
|
+
return true;
|
|
87
|
+
return Boolean(process.stdout.isTTY);
|
|
88
|
+
}
|
|
89
|
+
function colorize(text, code, enabled) {
|
|
90
|
+
if (!enabled || !code)
|
|
91
|
+
return text;
|
|
92
|
+
return `\x1b[${code}m${text}\x1b[0m`;
|
|
93
|
+
}
|
|
94
|
+
function styleToken(text, token, theme, colorEnabled) {
|
|
95
|
+
return colorize(text, theme[token], colorEnabled);
|
|
96
|
+
}
|
|
97
|
+
function icon(name) {
|
|
98
|
+
return FIXED_ICONS[name] || "";
|
|
99
|
+
}
|
|
100
|
+
export function createCliThemeRuntime(config) {
|
|
101
|
+
const activeThemeName = THEMES[config.theme] ? config.theme : "ansi";
|
|
102
|
+
const activeTheme = applyThemeOverrides(activeThemeName, config.themeTokens || {});
|
|
103
|
+
const colorEnabled = supportsColor(config.theme);
|
|
104
|
+
const style = (token, text) => styleToken(text, token, activeTheme, colorEnabled);
|
|
105
|
+
const styleDimItalic = (text) => {
|
|
106
|
+
if (!colorEnabled)
|
|
107
|
+
return text;
|
|
108
|
+
const dimCode = String(activeTheme.dim || "2");
|
|
109
|
+
const parts = dimCode.split(";").filter(Boolean);
|
|
110
|
+
if (!parts.includes("3"))
|
|
111
|
+
parts.push("3");
|
|
112
|
+
return colorize(text, parts.join(";"), true);
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
colorEnabled,
|
|
116
|
+
icon: (name) => icon(name),
|
|
117
|
+
styleDomain: (text) => style("domain", text),
|
|
118
|
+
styleTitle: (text) => style("title", text),
|
|
119
|
+
styleDuration: (text) => style("duration", text),
|
|
120
|
+
styleError: (text) => style("error", text),
|
|
121
|
+
styleDim: (text) => style("dim", text),
|
|
122
|
+
styleDimItalic,
|
|
123
|
+
styleCyan: (text) => style("cyan", text),
|
|
124
|
+
styleBold: (text) => style("bold", text),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function parseCliArgs(args) {
|
|
128
|
+
const positional = [];
|
|
129
|
+
for (const token of args) {
|
|
130
|
+
if (!token.startsWith("--"))
|
|
131
|
+
positional.push(token);
|
|
132
|
+
}
|
|
133
|
+
return { positional };
|
|
134
|
+
}
|
|
135
|
+
export async function cmdTheme(config, args, options = { printUsage: () => { } }) {
|
|
136
|
+
const asJson = options.asJson ?? false;
|
|
137
|
+
const { positional } = parseCliArgs(args);
|
|
138
|
+
const action = String(positional[0] || "preview")
|
|
139
|
+
.trim()
|
|
140
|
+
.toLowerCase();
|
|
141
|
+
if (action && action !== "preview") {
|
|
142
|
+
console.error("theme command supports: preview\n");
|
|
143
|
+
options.printUsage();
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const activeThemeName = THEMES[config.theme] ? config.theme : "ansi";
|
|
148
|
+
const activeTheme = applyThemeOverrides(activeThemeName, config.themeTokens || {});
|
|
149
|
+
const colorEnabled = supportsColor(config.theme);
|
|
150
|
+
const samples = {
|
|
151
|
+
domain: "example.com",
|
|
152
|
+
title: "Example page title",
|
|
153
|
+
duration: "1.4s",
|
|
154
|
+
error: "request failed",
|
|
155
|
+
dim: "secondary text",
|
|
156
|
+
cyan: "https://example.com",
|
|
157
|
+
bold: "strong label",
|
|
158
|
+
};
|
|
159
|
+
if (asJson) {
|
|
160
|
+
console.log(JSON.stringify({
|
|
161
|
+
theme: activeThemeName,
|
|
162
|
+
themeName: activeThemeName,
|
|
163
|
+
requestedTheme: config.theme,
|
|
164
|
+
configFile: config.configFile,
|
|
165
|
+
overrides: config.themeTokens || {},
|
|
166
|
+
resolvedTokens: activeTheme,
|
|
167
|
+
samples,
|
|
168
|
+
}, null, 2));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const styleBold = (text) => styleToken(text, "bold", activeTheme, colorEnabled);
|
|
172
|
+
const styleDim = (text) => styleToken(text, "dim", activeTheme, colorEnabled);
|
|
173
|
+
const styleDuration = (text) => styleToken(text, "duration", activeTheme, colorEnabled);
|
|
174
|
+
const styleDimItalic = (text) => {
|
|
175
|
+
if (!colorEnabled)
|
|
176
|
+
return text;
|
|
177
|
+
const dimCode = String(activeTheme.dim || "2");
|
|
178
|
+
const parts = dimCode.split(";").filter(Boolean);
|
|
179
|
+
if (!parts.includes("3"))
|
|
180
|
+
parts.push("3");
|
|
181
|
+
return colorize(text, parts.join(";"), true);
|
|
182
|
+
};
|
|
183
|
+
console.log(styleBold("Theme preview"));
|
|
184
|
+
console.log(styleDim(`theme=${config.theme} · config=${config.configFile}`));
|
|
185
|
+
for (const token of THEME_TOKENS) {
|
|
186
|
+
const sample = samples[token] || token;
|
|
187
|
+
const code = activeTheme[token] || "-";
|
|
188
|
+
const label = `${token}:`.padEnd(10, " ");
|
|
189
|
+
console.log(` ${styleDim(label)} ${styleToken(sample, token, activeTheme, colorEnabled)} ${styleDim(`(${code})`)}`);
|
|
190
|
+
}
|
|
191
|
+
const sampleSuccessDomain = styleToken("duckduckgo.com", "domain", activeTheme, colorEnabled);
|
|
192
|
+
const sampleSuccessTitle = styleToken("Google AI news March 2026 at DuckDuckGo", "title", activeTheme, colorEnabled);
|
|
193
|
+
const sampleErrorDomain = styleToken("deccanherald.com", "domain", activeTheme, colorEnabled);
|
|
194
|
+
const sampleError = styleToken("— Timeout 7000ms exceeded.", "error", activeTheme, colorEnabled);
|
|
195
|
+
console.log(`\n${styleDim("Stream markers:")}`);
|
|
196
|
+
console.log(`${icon("bullet")} ${sampleSuccessDomain} ${sampleSuccessTitle}`);
|
|
197
|
+
console.log(`${styleDim(icon("connector"))}`);
|
|
198
|
+
console.log(`${icon("bullet")} ${sampleErrorDomain} ${sampleError}`);
|
|
199
|
+
console.log(`\n${styleDim("Spinner line:")}`);
|
|
200
|
+
console.log(`${styleDuration("⠋")} ${styleDim("Reading")} ${styleDimItalic("duckduckgo.com")} ${styleDim("·")} ${styleDim("1.2s")}`);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"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"}
|