scoutline 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/LICENSE +21 -0
- package/README.md +146 -0
- package/bin/scoutline.js +17 -0
- package/dist/commands/code.d.ts +13 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +94 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +70 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/quota.d.ts +9 -0
- package/dist/commands/quota.d.ts.map +1 -0
- package/dist/commands/quota.js +77 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/read.d.ts +20 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +166 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/repo.d.ts +22 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +219 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/search.d.ts +19 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +235 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/tools.d.ts +22 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +173 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/vision.d.ts +15 -0
- package/dist/commands/vision.d.ts.map +1 -0
- package/dist/commands/vision.js +168 -0
- package/dist/commands/vision.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +443 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +133 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +150 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/cache.d.ts +34 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +168 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/code-mode.d.ts +19 -0
- package/dist/lib/code-mode.d.ts.map +1 -0
- package/dist/lib/code-mode.js +83 -0
- package/dist/lib/code-mode.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +59 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +29 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +69 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/extract.d.ts +37 -0
- package/dist/lib/extract.d.ts.map +1 -0
- package/dist/lib/extract.js +106 -0
- package/dist/lib/extract.js.map +1 -0
- package/dist/lib/image.d.ts +13 -0
- package/dist/lib/image.d.ts.map +1 -0
- package/dist/lib/image.js +102 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +10 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mcp-client.d.ts +161 -0
- package/dist/lib/mcp-client.d.ts.map +1 -0
- package/dist/lib/mcp-client.js +494 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +24 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +129 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/monitor-client.d.ts +51 -0
- package/dist/lib/monitor-client.d.ts.map +1 -0
- package/dist/lib/monitor-client.js +115 -0
- package/dist/lib/monitor-client.js.map +1 -0
- package/dist/lib/output.d.ts +24 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +59 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/redact.d.ts +7 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/redact.js +50 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/silence.d.ts +16 -0
- package/dist/lib/silence.d.ts.map +1 -0
- package/dist/lib/silence.js +56 -0
- package/dist/lib/silence.js.map +1 -0
- package/dist/lib/tty.d.ts +60 -0
- package/dist/lib/tty.d.ts.map +1 -0
- package/dist/lib/tty.js +103 -0
- package/dist/lib/tty.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Numman Ali
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<h1 align="center">Scoutline</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
A command-line field kit for investigating web, repository, and visual sources.
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/scoutline"><img src="https://img.shields.io/npm/v/scoutline.svg" alt="npm version"></a>
|
|
9
|
+
<a href="https://github.com/vikasagarwal101/scoutline/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
> Independently maintained by Vikas Agarwal. See [CREDITS.md](https://github.com/vikasagarwal101/scoutline/blob/main/CREDITS.md) for project attribution.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
- **Vision** - Analyze images, screenshots, diagrams, charts, videos using GLM-4.6V
|
|
19
|
+
- **Search** - Real-time web search with domain and recency filtering
|
|
20
|
+
- **Reader** - Fetch and parse web pages to markdown
|
|
21
|
+
- **Repo** - Search and read GitHub repository code via ZRead
|
|
22
|
+
- **Tools** - MCP tool discovery, schemas, and raw calls
|
|
23
|
+
- **Code Mode** - TypeScript tool chaining for agent automation
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export Z_AI_API_KEY="your-api-key"
|
|
29
|
+
|
|
30
|
+
npx scoutline --help
|
|
31
|
+
npx scoutline vision analyze ./screenshot.png "What errors do you see?"
|
|
32
|
+
npx scoutline search "React 19 new features" --count 5
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Get your API key at: https://z.ai/manage-apikey/apikey-list
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
### As an Agent Skill
|
|
40
|
+
|
|
41
|
+
**OpenSkills** (universal - works with any AI coding agent):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx openskills install vikasagarwal101/scoutline
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Claude Code** (native skill marketplace):
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
claude skill install vikasagarwal101/scoutline --skill scoutline
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### As a CLI Tool
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm i -g scoutline
|
|
57
|
+
scoutline --help
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Or use directly with npx:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npx scoutline --help
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Usage
|
|
67
|
+
|
|
68
|
+
The CLI is self-documenting. Use `--help` at any level:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
scoutline --help # All commands
|
|
72
|
+
scoutline vision --help # Vision commands
|
|
73
|
+
scoutline search --help # Search options
|
|
74
|
+
scoutline repo --help # GitHub repo commands
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Examples
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Vision - analyze images
|
|
81
|
+
scoutline vision analyze ./image.png "Describe this"
|
|
82
|
+
scoutline vision ui-to-code ./design.png --output code
|
|
83
|
+
scoutline vision extract-text ./screenshot.png --language python
|
|
84
|
+
scoutline vision diagnose-error ./error.png
|
|
85
|
+
|
|
86
|
+
# Search - web search
|
|
87
|
+
scoutline search "TypeScript best practices" --count 10
|
|
88
|
+
scoutline search "security news" --recency oneDay
|
|
89
|
+
|
|
90
|
+
# Reader - fetch web content
|
|
91
|
+
scoutline read https://docs.example.com/api
|
|
92
|
+
scoutline read https://blog.example.com --format text
|
|
93
|
+
|
|
94
|
+
# Repo - GitHub exploration
|
|
95
|
+
scoutline repo tree facebook/react
|
|
96
|
+
scoutline repo search vercel/next.js "app router"
|
|
97
|
+
scoutline repo read anthropics/anthropic-sdk-python README.md
|
|
98
|
+
scoutline repo search openai/codex "config" --language en
|
|
99
|
+
scoutline repo tree openai/codex --path codex-rs --depth 2
|
|
100
|
+
|
|
101
|
+
# Doctor - check setup
|
|
102
|
+
scoutline doctor
|
|
103
|
+
scoutline doctor --no-vision
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Output Format
|
|
107
|
+
|
|
108
|
+
Default output is **data-only** for token efficiency. Use `--output-format json` for structured responses:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"success": true,
|
|
113
|
+
"data": "...",
|
|
114
|
+
"timestamp": 1234567890
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Notes
|
|
119
|
+
|
|
120
|
+
- `repo search` defaults to English results. Use `--language zh` for Chinese.
|
|
121
|
+
- `repo tree` supports `--path` (directory scope) and `--depth` (expand subtrees).
|
|
122
|
+
- `tools`, `tool`, `call`, `doctor` accept `--no-vision` to speed startup when vision tools are not needed.
|
|
123
|
+
- `read` supports `--with-images-summary`, `--no-gfm`, and `--keep-img-data-url` for richer parsing control.
|
|
124
|
+
- Vision tool calls automatically retry transient 5xx/network errors (default: 2 retries). Configure with `ZAI_MCP_VISION_RETRY_COUNT` (or `ZAI_MCP_RETRY_COUNT` for all tools).
|
|
125
|
+
- Tool discovery can be cached to speed `tools`/`tool`/`doctor` (default: on, 24h TTL). Configure with `ZAI_MCP_TOOL_CACHE`, `ZAI_MCP_TOOL_CACHE_TTL_MS`, `ZAI_MCP_CACHE_DIR`.
|
|
126
|
+
|
|
127
|
+
## Contributing
|
|
128
|
+
|
|
129
|
+
See [CONTRIBUTING.md](https://github.com/vikasagarwal101/scoutline/blob/main/CONTRIBUTING.md) for development setup and guidelines.
|
|
130
|
+
|
|
131
|
+
## Performance
|
|
132
|
+
|
|
133
|
+
Benchmark tool discovery (cache on/off):
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
node scripts/bench-tools.mjs
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT - see [LICENSE](https://github.com/vikasagarwal101/scoutline/blob/main/LICENSE).
|
|
142
|
+
|
|
143
|
+
## Links
|
|
144
|
+
|
|
145
|
+
- [GitHub Repository](https://github.com/vikasagarwal101/scoutline)
|
|
146
|
+
- [Documentation](https://github.com/vikasagarwal101/scoutline/tree/main/docs)
|
package/bin/scoutline.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import("../dist/index.js").catch((err) => {
|
|
4
|
+
console.error(
|
|
5
|
+
JSON.stringify(
|
|
6
|
+
{
|
|
7
|
+
success: false,
|
|
8
|
+
error: err.message,
|
|
9
|
+
code: "LOAD_ERROR",
|
|
10
|
+
help: 'Make sure to run "npm run build" before running scoutline',
|
|
11
|
+
},
|
|
12
|
+
null,
|
|
13
|
+
2,
|
|
14
|
+
),
|
|
15
|
+
);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Mode commands for tool chaining
|
|
3
|
+
*/
|
|
4
|
+
export interface CodeRunOptions {
|
|
5
|
+
timeout?: number;
|
|
6
|
+
includeLogs?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function runCodeFile(filePath: string, options?: CodeRunOptions): Promise<void>;
|
|
9
|
+
export declare function evalCode(code: string, options?: CodeRunOptions): Promise<void>;
|
|
10
|
+
export declare function printInterfaces(): Promise<void>;
|
|
11
|
+
export declare function printPromptTemplate(): void;
|
|
12
|
+
export declare const CODE_HELP: string;
|
|
13
|
+
//# sourceMappingURL=code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAGD,eAAO,MAAM,SAAS,QAkBd,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Mode commands for tool chaining
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "node:fs/promises";
|
|
5
|
+
import { ZaiCodeModeClient } from "../lib/code-mode.js";
|
|
6
|
+
import { outputSuccess } from "../lib/output.js";
|
|
7
|
+
import { formatErrorOutput } from "../lib/errors.js";
|
|
8
|
+
import { silenceConsole, restoreConsole } from "../lib/silence.js";
|
|
9
|
+
export async function runCodeFile(filePath, options = {}) {
|
|
10
|
+
const code = await fs.readFile(filePath, "utf8");
|
|
11
|
+
silenceConsole();
|
|
12
|
+
const codeClient = new ZaiCodeModeClient();
|
|
13
|
+
try {
|
|
14
|
+
const result = await codeClient.callToolChain(code, options.timeout);
|
|
15
|
+
if (options.includeLogs) {
|
|
16
|
+
outputSuccess(result);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
outputSuccess(result.result);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
restoreConsole();
|
|
24
|
+
console.error(formatErrorOutput(error));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
await codeClient.close().catch(() => { });
|
|
29
|
+
restoreConsole();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function evalCode(code, options = {}) {
|
|
33
|
+
silenceConsole();
|
|
34
|
+
const codeClient = new ZaiCodeModeClient();
|
|
35
|
+
try {
|
|
36
|
+
const result = await codeClient.callToolChain(code, options.timeout);
|
|
37
|
+
if (options.includeLogs) {
|
|
38
|
+
outputSuccess(result);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
outputSuccess(result.result);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
restoreConsole();
|
|
46
|
+
console.error(formatErrorOutput(error));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await codeClient.close().catch(() => { });
|
|
51
|
+
restoreConsole();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function printInterfaces() {
|
|
55
|
+
silenceConsole();
|
|
56
|
+
const codeClient = new ZaiCodeModeClient();
|
|
57
|
+
try {
|
|
58
|
+
const interfaces = await codeClient.getAllInterfaces();
|
|
59
|
+
outputSuccess(interfaces);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
restoreConsole();
|
|
63
|
+
console.error(formatErrorOutput(error));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await codeClient.close().catch(() => { });
|
|
68
|
+
restoreConsole();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function printPromptTemplate() {
|
|
72
|
+
outputSuccess(ZaiCodeModeClient.getPromptTemplate());
|
|
73
|
+
}
|
|
74
|
+
// Help text
|
|
75
|
+
export const CODE_HELP = `
|
|
76
|
+
Code Mode - Execute TypeScript tool chains
|
|
77
|
+
|
|
78
|
+
Usage:
|
|
79
|
+
scoutline code run <file> [options]
|
|
80
|
+
scoutline code eval <code> [options]
|
|
81
|
+
scoutline code interfaces
|
|
82
|
+
scoutline code prompt
|
|
83
|
+
|
|
84
|
+
Options:
|
|
85
|
+
--timeout <ms> Execution timeout (default: 30000)
|
|
86
|
+
--logs Include console logs in output
|
|
87
|
+
|
|
88
|
+
Examples:
|
|
89
|
+
scoutline code run ./chain.ts
|
|
90
|
+
scoutline code eval "const r = await scoutline.zai.search.webSearchPrime({search_query:'ZAI'}); return r;"
|
|
91
|
+
scoutline code interfaces
|
|
92
|
+
scoutline code prompt
|
|
93
|
+
`.trim();
|
|
94
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/commands/code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAO,GAAmB,EAAE;IAC9E,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEjD,cAAc,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,aAAa,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,cAAc,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAO,GAAmB,EAAE;IACvE,cAAc,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,aAAa,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,cAAc,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,cAAc,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;QACvD,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,cAAc,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,YAAY;AACZ,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;CAkBxB,CAAC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command for environment and MCP diagnostics
|
|
3
|
+
*/
|
|
4
|
+
export interface DoctorOptions {
|
|
5
|
+
noTools?: boolean;
|
|
6
|
+
enableVision?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function doctor(options?: DoctorOptions): Promise<void>;
|
|
9
|
+
export declare const DOCTOR_HELP: string;
|
|
10
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAOD,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CvE;AAED,eAAO,MAAM,WAAW,QAYhB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command for environment and MCP diagnostics
|
|
3
|
+
*/
|
|
4
|
+
import { ZaiMcpClient } from "../lib/mcp-client.js";
|
|
5
|
+
import { outputSuccess } from "../lib/output.js";
|
|
6
|
+
import { formatErrorOutput } from "../lib/errors.js";
|
|
7
|
+
import { silenceConsole, restoreConsole } from "../lib/silence.js";
|
|
8
|
+
function getNodeMajor() {
|
|
9
|
+
const [major] = process.versions.node.split(".");
|
|
10
|
+
return parseInt(major, 10);
|
|
11
|
+
}
|
|
12
|
+
export async function doctor(options = {}) {
|
|
13
|
+
const apiKey = process.env.Z_AI_API_KEY || process.env.ZAI_API_KEY;
|
|
14
|
+
const mode = (process.env.Z_AI_MODE || process.env.PLATFORM_MODE || "ZAI").toUpperCase();
|
|
15
|
+
const nodeMajor = getNodeMajor();
|
|
16
|
+
const report = {
|
|
17
|
+
env: {
|
|
18
|
+
apiKeyPresent: Boolean(apiKey),
|
|
19
|
+
mode,
|
|
20
|
+
baseUrl: process.env.Z_AI_BASE_URL || undefined,
|
|
21
|
+
},
|
|
22
|
+
node: {
|
|
23
|
+
version: process.versions.node,
|
|
24
|
+
visionMcpCompatible: nodeMajor >= 22,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
if (options.noTools || !apiKey) {
|
|
28
|
+
outputSuccess(report);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
silenceConsole();
|
|
32
|
+
const client = new ZaiMcpClient({ enableVision: options.enableVision });
|
|
33
|
+
try {
|
|
34
|
+
const tools = await client.listTools();
|
|
35
|
+
const byServer = tools.reduce((acc, tool) => {
|
|
36
|
+
const parts = tool.name.split(".");
|
|
37
|
+
const server = parts.length >= 2 ? parts[1] : "unknown";
|
|
38
|
+
acc[server] = (acc[server] || 0) + 1;
|
|
39
|
+
return acc;
|
|
40
|
+
}, {});
|
|
41
|
+
report.mcp = {
|
|
42
|
+
toolCount: tools.length,
|
|
43
|
+
servers: byServer,
|
|
44
|
+
};
|
|
45
|
+
outputSuccess(report);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
restoreConsole();
|
|
49
|
+
console.error(formatErrorOutput(error));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await client.close().catch(() => { });
|
|
54
|
+
restoreConsole();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export const DOCTOR_HELP = `
|
|
58
|
+
Doctor - Check environment and MCP connectivity
|
|
59
|
+
|
|
60
|
+
Usage: scoutline doctor [options]
|
|
61
|
+
|
|
62
|
+
Options:
|
|
63
|
+
--no-tools Skip tool discovery (env-only check)
|
|
64
|
+
--no-vision Skip vision MCP server (faster startup)
|
|
65
|
+
|
|
66
|
+
Examples:
|
|
67
|
+
scoutline doctor
|
|
68
|
+
scoutline doctor --no-tools
|
|
69
|
+
`.trim();
|
|
70
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quota command — authoritative Z.AI Coding Plan usage from the monitor API.
|
|
3
|
+
*/
|
|
4
|
+
export interface QuotaOptions {
|
|
5
|
+
window?: "current";
|
|
6
|
+
}
|
|
7
|
+
export declare function quota(_options?: QuotaOptions): Promise<void>;
|
|
8
|
+
export declare const QUOTA_HELP: string;
|
|
9
|
+
//# sourceMappingURL=quota.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/commands/quota.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAsB,KAAK,CAAC,QAAQ,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CtE;AAED,eAAO,MAAM,UAAU,QAwBf,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quota command — authoritative Z.AI Coding Plan usage from the monitor API.
|
|
3
|
+
*/
|
|
4
|
+
import { getQuotaLimit, getTimeLimit, getTokensLimit, formatResetTime, } from "../lib/monitor-client.js";
|
|
5
|
+
import { outputSuccess, getOutputMode } from "../lib/output.js";
|
|
6
|
+
import { formatErrorOutput } from "../lib/errors.js";
|
|
7
|
+
import { formatQuotaPretty } from "../lib/tty.js";
|
|
8
|
+
export async function quota(_options = {}) {
|
|
9
|
+
try {
|
|
10
|
+
const data = await getQuotaLimit();
|
|
11
|
+
const timeLimit = getTimeLimit(data);
|
|
12
|
+
const tokensLimit = getTokensLimit(data);
|
|
13
|
+
const formatted = {
|
|
14
|
+
plan: data.level,
|
|
15
|
+
timeWindow: timeLimit
|
|
16
|
+
? {
|
|
17
|
+
used: timeLimit.currentValue,
|
|
18
|
+
limit: timeLimit.usage,
|
|
19
|
+
remaining: timeLimit.remaining,
|
|
20
|
+
percentage: timeLimit.percentage,
|
|
21
|
+
windowHours: timeLimit.unit,
|
|
22
|
+
resetsAt: timeLimit.nextResetTime
|
|
23
|
+
? new Date(timeLimit.nextResetTime).toISOString()
|
|
24
|
+
: null,
|
|
25
|
+
resetsIn: timeLimit.nextResetTime ? formatResetTime(timeLimit.nextResetTime) : null,
|
|
26
|
+
byTool: timeLimit.usageDetails,
|
|
27
|
+
}
|
|
28
|
+
: null,
|
|
29
|
+
tokens: tokensLimit
|
|
30
|
+
? {
|
|
31
|
+
percentage: tokensLimit.percentage,
|
|
32
|
+
resetsAt: tokensLimit.nextResetTime
|
|
33
|
+
? new Date(tokensLimit.nextResetTime).toISOString()
|
|
34
|
+
: null,
|
|
35
|
+
resetsIn: tokensLimit.nextResetTime ? formatResetTime(tokensLimit.nextResetTime) : null,
|
|
36
|
+
}
|
|
37
|
+
: null,
|
|
38
|
+
};
|
|
39
|
+
const mode = getOutputMode();
|
|
40
|
+
if (mode === "tty") {
|
|
41
|
+
outputSuccess(formatQuotaPretty(formatted));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
outputSuccess(formatted);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error(formatErrorOutput(error));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export const QUOTA_HELP = `
|
|
53
|
+
Quota Command - Authoritative Z.AI Coding Plan usage from the monitor API
|
|
54
|
+
|
|
55
|
+
Usage: scoutline quota [options]
|
|
56
|
+
|
|
57
|
+
Hits GET https://api.z.ai/api/monitor/usage/quota/limit directly (NOT the MCP
|
|
58
|
+
endpoint) to return real-time plan usage, including:
|
|
59
|
+
- Plan tier (pro / lite / max)
|
|
60
|
+
- 5-hour rolling window: calls used / limit / remaining / reset time
|
|
61
|
+
- Per-tool breakdown (search-prime, web-reader, zread)
|
|
62
|
+
- Token budget percentage + reset time
|
|
63
|
+
|
|
64
|
+
Options:
|
|
65
|
+
(none yet — future versions may add --history for 24h/7d/30d windows)
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
scoutline quota
|
|
69
|
+
scoutline quota -O pretty # human-readable with progress bars
|
|
70
|
+
scoutline quota -O json # envelope-wrapped for scripts
|
|
71
|
+
|
|
72
|
+
Notes:
|
|
73
|
+
- This call hits a different endpoint than search/read/repo and is not
|
|
74
|
+
cached by the local response cache.
|
|
75
|
+
- Auth: tries raw API key first, falls back to Bearer prefix on 401.
|
|
76
|
+
`.trim();
|
|
77
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/commands/quota.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMlD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAQ,GAAiB,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,UAAU,EAAE,SAAS;gBACnB,CAAC,CAAC;oBACE,IAAI,EAAE,SAAS,CAAC,YAAY;oBAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,WAAW,EAAE,SAAS,CAAC,IAAI;oBAC3B,QAAQ,EAAE,SAAS,CAAC,aAAa;wBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;wBACjD,CAAC,CAAC,IAAI;oBACR,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;oBACnF,MAAM,EAAE,SAAS,CAAC,YAAY;iBAC/B;gBACH,CAAC,CAAC,IAAI;YACR,MAAM,EAAE,WAAW;gBACjB,CAAC,CAAC;oBACE,UAAU,EAAE,WAAW,CAAC,UAAU;oBAClC,QAAQ,EAAE,WAAW,CAAC,aAAa;wBACjC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;wBACnD,CAAC,CAAC,IAAI;oBACR,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;iBACxF;gBACH,CAAC,CAAC,IAAI;SACT,CAAC;QAEF,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web reader command using Z.AI WebReader MCP
|
|
3
|
+
*/
|
|
4
|
+
import { type ExtractMode } from "../lib/extract.js";
|
|
5
|
+
export interface ReadOptions {
|
|
6
|
+
format?: "markdown" | "text";
|
|
7
|
+
noImages?: boolean;
|
|
8
|
+
withLinks?: boolean;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
noCache?: boolean;
|
|
11
|
+
noGfm?: boolean;
|
|
12
|
+
keepImgDataUrl?: boolean;
|
|
13
|
+
withImagesSummary?: boolean;
|
|
14
|
+
maxChars?: number;
|
|
15
|
+
fullEnvelope?: boolean;
|
|
16
|
+
extract?: ExtractMode;
|
|
17
|
+
}
|
|
18
|
+
export declare function read(url: string, options?: ReadOptions): Promise<void>;
|
|
19
|
+
export declare const READ_HELP: string;
|
|
20
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAwDD,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFhF;AAGD,eAAO,MAAM,SAAS,QAuCd,CAAC"}
|