@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.
Files changed (81) hide show
  1. package/.beads/.beads-credential-key +1 -0
  2. package/.beads/README.md +81 -0
  3. package/.beads/config.yaml +54 -0
  4. package/.beads/hooks/post-checkout +24 -0
  5. package/.beads/hooks/post-merge +24 -0
  6. package/.beads/hooks/pre-commit +24 -0
  7. package/.beads/hooks/pre-push +24 -0
  8. package/.beads/hooks/prepare-commit-msg +24 -0
  9. package/.beads/metadata.json +7 -0
  10. package/.github/workflows/ci.yml +43 -0
  11. package/.github/workflows/release.yml +115 -0
  12. package/AGENTS.md +150 -0
  13. package/README.md +210 -0
  14. package/biome.json +36 -0
  15. package/config/mcporter.json +8 -0
  16. package/dist/cli/theme.js +202 -0
  17. package/dist/cli/theme.js.map +1 -0
  18. package/dist/cli.js +1883 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config.js +223 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/daemon.js +745 -0
  23. package/dist/daemon.js.map +1 -0
  24. package/dist/engine/constants.js +131 -0
  25. package/dist/engine/constants.js.map +1 -0
  26. package/dist/engine/deep-research.js +167 -0
  27. package/dist/engine/deep-research.js.map +1 -0
  28. package/dist/engine/defuddle-utils.js +57 -0
  29. package/dist/engine/defuddle-utils.js.map +1 -0
  30. package/dist/engine/github-fetch.js +232 -0
  31. package/dist/engine/github-fetch.js.map +1 -0
  32. package/dist/engine/helpers.js +372 -0
  33. package/dist/engine/helpers.js.map +1 -0
  34. package/dist/engine/limiter.js +75 -0
  35. package/dist/engine/limiter.js.map +1 -0
  36. package/dist/engine/policy.js +313 -0
  37. package/dist/engine/policy.js.map +1 -0
  38. package/dist/engine/runtime-utils.js +65 -0
  39. package/dist/engine/runtime-utils.js.map +1 -0
  40. package/dist/engine/search-discovery.js +275 -0
  41. package/dist/engine/search-discovery.js.map +1 -0
  42. package/dist/engine/url-utils.js +72 -0
  43. package/dist/engine/url-utils.js.map +1 -0
  44. package/dist/engine.js +2030 -0
  45. package/dist/engine.js.map +1 -0
  46. package/dist/mcp.js +282 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/types/cli.js +2 -0
  49. package/dist/types/cli.js.map +1 -0
  50. package/dist/types/config.js +2 -0
  51. package/dist/types/config.js.map +1 -0
  52. package/dist/types/daemon.js +2 -0
  53. package/dist/types/daemon.js.map +1 -0
  54. package/dist/types/engine.js +2 -0
  55. package/dist/types/engine.js.map +1 -0
  56. package/package.json +66 -0
  57. package/packages/pi-yagami-search/README.md +39 -0
  58. package/packages/pi-yagami-search/extensions/yagami-search.ts +273 -0
  59. package/packages/pi-yagami-search/package.json +41 -0
  60. package/src/cli/theme.ts +260 -0
  61. package/src/cli.ts +2226 -0
  62. package/src/config.ts +250 -0
  63. package/src/daemon.ts +990 -0
  64. package/src/engine/constants.ts +147 -0
  65. package/src/engine/deep-research.ts +207 -0
  66. package/src/engine/defuddle-utils.ts +75 -0
  67. package/src/engine/github-fetch.ts +265 -0
  68. package/src/engine/helpers.ts +394 -0
  69. package/src/engine/limiter.ts +97 -0
  70. package/src/engine/policy.ts +392 -0
  71. package/src/engine/runtime-utils.ts +79 -0
  72. package/src/engine/search-discovery.ts +351 -0
  73. package/src/engine/url-utils.ts +86 -0
  74. package/src/engine.ts +2516 -0
  75. package/src/mcp.ts +337 -0
  76. package/src/shims-cli.d.ts +3 -0
  77. package/src/types/cli.ts +7 -0
  78. package/src/types/config.ts +53 -0
  79. package/src/types/daemon.ts +22 -0
  80. package/src/types/engine.ts +194 -0
  81. 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,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "yagami": {
4
+ "baseUrl": "http://127.0.0.1:43111/mcp"
5
+ }
6
+ },
7
+ "imports": []
8
+ }
@@ -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":"AAEA,MAAM,MAAM,GAAG;IACb,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,GAAG;KACV;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;KACT;CACO,CAAC;AAEX,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAE9F,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,GAAG;CACN,CAAC;AAKX,SAAS,kBAAkB,CAAC,QAAiB,EAAE,KAAqB,EAAE,SAAuB;IAC3F,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAErE,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC/C,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;aAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiC,EAAE,YAAoC;IAClG,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI,CAAiB,CAAC;IACrE,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACvE,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,GAAG,SAAS;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAA6B;IAClD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAErD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;SACtD,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IAEjB,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAE7E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,UAAU,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAElD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,OAAgB;IAC5D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAqB,EAAE,KAAmB,EAAE,YAAqB;IACjG,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,IAAI,CAAC,IAA8B;IAC1C,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAiBD,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,WAAW,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAG,CAAC,KAAqB,EAAE,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAElH,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;QAC9C,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,IAAI,EAAE,CAAC,IAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,WAAW,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;QACpD,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAClD,aAAa,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC;QACxD,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAClD,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;QAC9C,cAAc;QACd,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QAChD,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAqB,EACrB,IAAc,EACd,UAAwD,EAAE,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;IAEhF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;SAC9C,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IAEjB,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,WAAW,GAAG,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,OAAO,GAAmC;QAC9C,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,gBAAgB;QACvB,GAAG,EAAE,gBAAgB;QACrB,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,cAAc;KACrB,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,eAAe;YAC1B,cAAc,EAAE,MAAM,CAAC,KAAK;YAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACnC,cAAc,EAAE,WAAW;YAC3B,OAAO;SACR,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACxG,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;QAC9C,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAE7E,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;QACvC,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CACT,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,IAAI,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CACxG,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,UAAU,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9F,MAAM,kBAAkB,GAAG,UAAU,CAAC,yCAAyC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACrH,MAAM,iBAAiB,GAAG,UAAU,CAAC,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9F,MAAM,WAAW,GAAG,UAAU,CAAC,4BAA4B,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjG,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,iBAAiB,IAAI,WAAW,EAAE,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CACT,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CACxH,CAAC;AACJ,CAAC"}