ysagc-agent 0.2.0 → 0.4.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.
Files changed (58) hide show
  1. package/README.md +36 -66
  2. package/dist/agent.d.ts +17 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +293 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/cli.d.ts +14 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +267 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +52 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +135 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/executor.d.ts +46 -0
  15. package/dist/executor.d.ts.map +1 -0
  16. package/dist/executor.js +397 -0
  17. package/dist/executor.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +34 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +37 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +121 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/path-utils.d.ts +44 -0
  27. package/dist/path-utils.d.ts.map +1 -0
  28. package/dist/path-utils.js +206 -0
  29. package/dist/path-utils.js.map +1 -0
  30. package/dist/protocol.d.ts +77 -0
  31. package/dist/protocol.d.ts.map +1 -0
  32. package/dist/protocol.js +94 -0
  33. package/dist/protocol.js.map +1 -0
  34. package/dist/security.d.ts +32 -0
  35. package/dist/security.d.ts.map +1 -0
  36. package/dist/security.js +228 -0
  37. package/dist/security.js.map +1 -0
  38. package/dist/tools.d.ts +36 -0
  39. package/dist/tools.d.ts.map +1 -0
  40. package/dist/tools.js +498 -0
  41. package/dist/tools.js.map +1 -0
  42. package/package.json +36 -21
  43. package/src/config.js +0 -94
  44. package/src/http-fs.js +0 -178
  45. package/src/index.js +0 -439
  46. package/src/logger.js +0 -84
  47. package/src/methods/dialog.js +0 -84
  48. package/src/methods/fs.js +0 -674
  49. package/src/methods/git.js +0 -391
  50. package/src/methods/project.js +0 -57
  51. package/src/methods/scaffold.js +0 -131
  52. package/src/methods/skill.js +0 -347
  53. package/src/methods/system.js +0 -82
  54. package/src/methods/terminal.js +0 -234
  55. package/src/origin.js +0 -38
  56. package/src/pairing.js +0 -168
  57. package/src/rpc.js +0 -62
  58. package/src/sandbox.js +0 -178
package/README.md CHANGED
@@ -1,90 +1,60 @@
1
1
  # ysagc-agent
2
2
 
3
- 代码工作台本机代理:替浏览器在本机执行**文件 / Git / 终端**操作。只处理工作台发来的指令,不偷传数据、不常驻收集信息。
3
+ 一个在用户本机运行的**本地执行 Agent**:它通过 WebSocket 连接到平台后端,接收工具指令,在**授权根目录内**安全地读写文件、执行命令、联网检索,并把结果回传。它本身**无状态**——不保存余额、不做计费判断、不持有平台密钥。
4
4
 
5
- - 仅监听 `127.0.0.1`(浏览器可信源),HTTPS 页面不拦截
6
- - 通信:JSON-RPC 2.0 over WebSocket(控制通道)+ 二进制帧(终端通道)
7
- - 路径沙箱:只能操作 allowlist(用户显式添加的项目根目录)内路径
8
- - 终端:node-pty(Windows: PowerShell / macOS·Linux: 默认 shell),输入输出**不经过网站后端**
9
- - **免配对码**(v0.2.0):浏览器打开网站「工作台」自动识别并连接本机代理,无需输入配对码、无需安装 exe
5
+ A state-agnostic local execution agent: it connects to a platform backend over WebSocket, executes tool instructions inside an **authorization root**, and reports results back. It never stores balance, never makes billing decisions, and never holds platform secrets.
10
6
 
11
- ## 安装(npm 方式,全球通用)
7
+ ---
12
8
 
13
- 要求 Node.js ≥ 20(Windows / macOS / Linux 均可)。
9
+ ## 快速开始 / Quick Start
14
10
 
15
11
  ```bash
16
- # 方式一:免安装,直接跑(推荐,首次会下载依赖包)
17
- npx ysagc-agent
18
-
19
- # 方式二:全局安装后运行
20
12
  npm i -g ysagc-agent
21
- ysagc-agent
22
- ```
23
-
24
- 启动后终端会显示 `ysagc-agent 运行中: ws://127.0.0.1:37890`,保持该终端窗口开启即可(最小化没问题,不要关闭)。
25
-
26
- ## 使用流程
27
-
28
- 1. 打开终端执行 `npx ysagc-agent`(保持运行)。
29
- 2. 打开网站「工作台」,点击「新增工作区」→ 选择本机文件夹。
30
- 3. 在聊天中把话题「绑定工作区」后,AI 就能在对应文件夹里读文件、改代码、跑命令了。
31
-
32
- > 旧版(0.1.x)安装包渠道与配对码流程已不再需要;如需卸载:`npm rm -g ysagc-agent`。
33
-
34
- ## 配置(agent.json)
35
-
36
- 位置:`~/.ysagc-agent/agent.json`(Windows 为 `C:\Users\<你>\.ysagc-agent`)。非法 JSON 会自动备份恢复。
37
-
38
- ```jsonc
39
- {
40
- "port": 37890, // 端口被占用自动 +1(最多 5 次)
41
- "allowedRoots": [], // 授权项目根目录(网站添加工作区时自动写入)
42
- "deviceTokenWhitelist": [], // 旧版配对令牌(sha256,兼容保留)
43
- "originWhitelist": [], // 允许直连的浏览器 Origin;留空=自动信任站点与 localhost
44
- "trashEnabled": true, // 删除进回收站
45
- "trashRetentionDays": 7,
46
- "enableTerminal": true, // 终端开关
47
- "terminalMaxSessions": 3,
48
- "terminalIdleTimeoutMin": 30,
49
- "terminalPermission": "ask", // ask=每次询问 / allow=始终允许 / deny=拒绝
50
- "backendUrl": "https://chat.ysagc.top",
51
- "logLevel": "info"
52
- }
13
+ ysagc-agent --server ws://your-platform.com/agent \
14
+ --token YOUR_DEVICE_TOKEN \
15
+ --root "C:/Users/you/projects"
53
16
  ```
54
17
 
55
- ## 常见问题
18
+ ## 配置 / Configuration(环境变量 / CLI)
56
19
 
57
- **Q:端口被占用怎么办?** 自动尝试 37891–37894;也可 `ysagc-agent --port <端口>` 指定。
20
+ | 参数 | 环境变量 | 说明 |
21
+ |---|---|---|
22
+ | `--server` | `WS_URL` | 平台 WebSocket 地址(必填) |
23
+ | `--token` | `YSAGC_TOKEN` | 设备/Agent 鉴权 token(必填) |
24
+ | `--device-id` | `DEVICE_ID` | 设备标识 |
25
+ | `--root` | `WORKSPACE_ROOT` | 授权根目录(文件操作必须在此之内) |
26
+ | `--mode` | `PERMISSION_MODE` | `supervise`/`smart`/`auto`(默认 `smart`) |
27
+ | `--web` | `--web` | 是否开启联网检索 |
28
+ | `--timeout` | `--timeout` | 单条命令超时(毫秒,默认 120000) |
29
+ | `--max-bytes` | `--max-bytes` | 单流输出上限(字节,默认 64000) |
30
+ | `--selftest` | | 运行本地自检并退出(0/1) |
58
31
 
59
- **Q:网页提示"未检测到本机代理"?** 确认 Agent 已在终端运行(能看到 `运行中: ws://127.0.0.1:37890`);首次 `npx` 会先下载依赖,稍等片刻。
32
+ ## 工具 / Tools
60
33
 
61
- **Q:macOS 提示"无法打开"?** npm 方式无需处理;仅安装包渠道需要右键 → 打开。
34
+ - `list_dir`(列目录)、`read_file`(读文件)、`write_file`(写文件)、`edit_file`(编辑文件)
35
+ - `run_command`(运行命令,含超时/输出上限)、`git`(Git 包装)、`generate`(生成骨架)、`web_search`(联网检索,平台侧执行)
62
36
 
63
- **Q:日志在哪?** `~/.ysagc-agent/logs/agent.log`。日志**永不记录**密钥文件内容与 Git 凭证。
37
+ 每个工具都会:**规范化路径**、**断言在授权根内**、拒绝根外/敏感路径,并保证**幂等**(相同 `idempotencyKey` 不重复执行/不重复写)。
64
38
 
65
- **Q:Agent 会读取我电脑上的所有文件吗?** 不会。Agent 只能访问你在网站显式添加的工作区目录(allowlist),越界操作一律拒绝并记录审计;终端除外(终端等同于你的命令行,可操作整台电脑——首次使用会在网页端弹安全确认)。
39
+ ## 安全模型 / Security Model
66
40
 
67
- **Q:其他网站能控制我的 Agent 吗?** 不能。Agent 只信任站点域名与 localhost 来源(Origin 白名单),其他网页发起的连接会被拒绝。
41
+ - **授权根**:文件操作只能发生在 `--root` 之内;根外与符号链接逃逸一律拒绝。
42
+ - **危险命令**:`rm -rf`、`sudo`、`format`、`del /f`、`shutdown`、`git reset --hard` 等命中即按严重级别拦截(跨 bash / powershell / cmd)。
43
+ - **敏感路径**:`/etc/passwd`、`~/.ssh`、含密钥的 `.env`、`.npmrc` 等一律拒绝。
44
+ - **密钥脱敏**:所有日志/结果对 `sk-***`、token、密码打码。
45
+ - **本地不存账**:不信任、不保存余额,一切余额/计费以平台下发为准。
68
46
 
69
- ## 开发
47
+ ## 自检 / Self-test
70
48
 
71
49
  ```bash
72
- npm ci
73
- npm start # 启动
74
- npm run smoke # 冒烟测试(WS 鉴权 / RPC / 终端全链路)
75
- node scripts/smoke.js <token> <port> # 自定义参数
50
+ ysagc-agent --selftest
51
+ # [PASS] ... 27/27 passed.
76
52
  ```
77
53
 
78
- 打包(单文件,可选):
79
-
80
- ```bash
81
- npx @yao-pkg/pkg . --target node22-win-x64 --output dist/ysagc-agent.exe
82
- # 三平台(Linux 环境可交叉产出):
83
- npx @yao-pkg/pkg . --target node22-win-x64,node22-macos-x64,node22-linux-x64 --output dist/ysagc-agent
84
- ```
54
+ ## 协议 / Protocol
85
55
 
86
- CI:`.gitlab-ci.yml`(build 产物 + tag 触发发布到 Package Registry / npm)。
56
+ WebSocket 上行 JSON 消息:`hello`、`pong`、`tool_result`、`status`;下行:`welcome`、`ping`、`tool_call`、`cancel`。心跳 + 指数退避自动重连。
87
57
 
88
- ## 隐私
58
+ ## License
89
59
 
90
- Agent 与网站后端的交互仅限:设备自动注册、版本握手、审计元数据。**项目文件内容、终端输入输出、Git 凭证一律不经过网站后端**。
60
+ MIT
@@ -0,0 +1,17 @@
1
+ import { type ClientState } from './protocol';
2
+ import { type AgentConfig } from './config';
3
+ /** Kept in sync with package.json. */
4
+ export declare const AGENT_VERSION = "0.4.0";
5
+ export interface AgentHandle {
6
+ stop(): void;
7
+ }
8
+ export interface AgentEvents {
9
+ /** Called when the agent transitions connectivity state. */
10
+ onState?: (state: ClientState) => void;
11
+ }
12
+ /** Start the local agent. Throws {@link ConfigError} for missing required
13
+ * config (no server/token/device-id) with a friendly message. */
14
+ export declare function startAgent(config: AgentConfig, events?: AgentEvents): AgentHandle;
15
+ /** Convenience wrapper that loads config from env/CLI and starts the agent. */
16
+ export declare function startAgentFromEnv(overrides?: Partial<AgentConfig>): AgentHandle;
17
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAWL,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAgE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAG1G,sCAAsC;AACtC,eAAO,MAAM,aAAa,UAAU,CAAC;AAQrC,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC;AAyRD;iEACiE;AACjE,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,CAGjF;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAG/E"}
package/dist/agent.js ADDED
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AGENT_VERSION = void 0;
7
+ exports.startAgent = startAgent;
8
+ exports.startAgentFromEnv = startAgentFromEnv;
9
+ const ws_1 = __importDefault(require("ws"));
10
+ const protocol_1 = require("./protocol");
11
+ const tools_1 = require("./tools");
12
+ const config_1 = require("./config");
13
+ /** Kept in sync with package.json. */
14
+ exports.AGENT_VERSION = '0.4.0';
15
+ const MAX_IDEMPOTENCY_ENTRIES = 512;
16
+ const RECONNECT_BASE_MS = 1000;
17
+ const RECONNECT_CAP_MS = 60000;
18
+ const HEARTBEAT_MS = 30000;
19
+ const READY_OPEN = 1; // ws.WebSocket.OPEN
20
+ class Agent {
21
+ constructor(config, events) {
22
+ this.ws = null;
23
+ this.sessionId = '';
24
+ this.state = 'error';
25
+ this.stopped = false;
26
+ this.intentionalClose = false;
27
+ this.reconnectAttempt = 0;
28
+ this.jobs = new Map();
29
+ this.idempotencyCache = new Map();
30
+ this.config = config;
31
+ this.events = events;
32
+ this.log = (0, config_1.loggerFromConfig)(config);
33
+ this.registry = (0, tools_1.createToolRegistry)({
34
+ root: config.root,
35
+ mode: config.mode,
36
+ webEnabled: config.web,
37
+ timeoutMs: config.timeoutMs,
38
+ maxBytes: config.maxBytes,
39
+ logger: this.log.child('tools'),
40
+ });
41
+ }
42
+ start() {
43
+ (0, config_1.validateConfig)(this.config);
44
+ this.log.info('starting agent', (0, config_1.describeConfig)(this.config));
45
+ this.connect();
46
+ this.startHeartbeat();
47
+ return { stop: () => this.stop() };
48
+ }
49
+ connect() {
50
+ if (this.stopped)
51
+ return;
52
+ if (this.ws) {
53
+ this.log.debug('already connected, ignoring connect()');
54
+ return;
55
+ }
56
+ this.log.info('connecting', { url: this.config.server });
57
+ const ws = new ws_1.default(this.config.server, { handshakeTimeout: 15000, perMessageDeflate: false });
58
+ this.ws = ws;
59
+ ws.on('open', () => {
60
+ this.log.info('socket open; sending hello');
61
+ this.sendHello();
62
+ });
63
+ ws.on('message', (data) => {
64
+ this.handleMessage(data);
65
+ });
66
+ ws.on('pong', () => {
67
+ this.log.debug('pong received');
68
+ });
69
+ ws.on('unexpected-response', (_req, res) => {
70
+ this.log.warn('unexpected ws response', { status: res.statusCode });
71
+ });
72
+ ws.on('error', (err) => {
73
+ this.log.error('ws error', { error: err.message });
74
+ });
75
+ ws.on('close', (code, reason) => {
76
+ this.ws = null;
77
+ this.setStatus('error');
78
+ const reasonText = reason.toString();
79
+ this.log.warn('socket closed', { code, reason: reasonText });
80
+ if (this.intentionalClose || this.stopped)
81
+ return;
82
+ this.scheduleReconnect();
83
+ });
84
+ }
85
+ sendHello() {
86
+ const { token, deviceId, platform } = this.config;
87
+ this.send({
88
+ type: 'hello',
89
+ token,
90
+ deviceId,
91
+ version: exports.AGENT_VERSION,
92
+ platform,
93
+ });
94
+ }
95
+ send(msg) {
96
+ if (this.ws && this.ws.readyState === READY_OPEN) {
97
+ this.ws.send((0, protocol_1.encodeMessage)(msg));
98
+ }
99
+ else {
100
+ this.log.debug('dropping outbound message (socket not open)', { type: msg.type });
101
+ }
102
+ }
103
+ handleMessage(data) {
104
+ const text = rawToString(data);
105
+ const msg = (0, protocol_1.decodeMessage)(text);
106
+ if (!msg) {
107
+ this.log.warn('ignoring malformed frame');
108
+ return;
109
+ }
110
+ switch (msg.type) {
111
+ case 'welcome':
112
+ this.onWelcome(msg);
113
+ break;
114
+ case 'ping':
115
+ this.onPing(msg);
116
+ break;
117
+ case 'tool_call':
118
+ this.onToolCall(msg);
119
+ break;
120
+ case 'cancel':
121
+ this.onCancel(msg);
122
+ break;
123
+ default:
124
+ this.log.warn('unhandled message type', { type: msg.type });
125
+ }
126
+ }
127
+ onWelcome(msg) {
128
+ if (!(0, protocol_1.isWelcome)(msg))
129
+ return;
130
+ this.sessionId = msg.sessionId;
131
+ // A successful handshake resets the backoff ramp.
132
+ this.reconnectAttempt = 0;
133
+ this.setStatus('online');
134
+ this.log.info('welcomed', { sessionId: this.sessionId });
135
+ }
136
+ onPing(msg) {
137
+ if (!(0, protocol_1.isPing)(msg))
138
+ return;
139
+ this.send({ type: 'pong', t: msg.t });
140
+ this.log.debug('replied to ping');
141
+ }
142
+ async onToolCall(msg) {
143
+ if (!(0, protocol_1.isToolCall)(msg))
144
+ return;
145
+ const { jobId, tool, args, idempotencyKey } = msg;
146
+ const key = (0, protocol_1.computeIdempotencyKey)(tool, args ?? {}, idempotencyKey);
147
+ if (this.idempotencyCache.has(key)) {
148
+ const cached = this.idempotencyCache.get(key);
149
+ this.log.info('serving cached result', { jobId, tool });
150
+ this.sendResult({ ...cached, cached: true, durationMs: cached.durationMs }, jobId);
151
+ return;
152
+ }
153
+ this.setStatus('busy');
154
+ const controller = new AbortController();
155
+ this.jobs.set(jobId, controller);
156
+ this.log.info('running tool', { jobId, tool });
157
+ try {
158
+ const result = await this.registry.dispatch(tool, args ?? {}, controller.signal);
159
+ if (controller.signal.aborted) {
160
+ // The platform sent a cancel for this job; report it explicitly.
161
+ this.sendResult({ ok: false, error: 'Job cancelled by platform', durationMs: result.durationMs }, jobId);
162
+ return;
163
+ }
164
+ this.cacheResult(key, result);
165
+ this.sendResult(result, jobId);
166
+ }
167
+ finally {
168
+ this.jobs.delete(jobId);
169
+ if (this.jobs.size === 0)
170
+ this.setStatus('online');
171
+ }
172
+ }
173
+ onCancel(msg) {
174
+ if (!(0, protocol_1.isCancel)(msg))
175
+ return;
176
+ const controller = this.jobs.get(msg.jobId);
177
+ if (controller) {
178
+ controller.abort();
179
+ this.log.info('cancelled job', { jobId: msg.jobId });
180
+ }
181
+ else {
182
+ this.log.warn('cancel for unknown/job already finished', { jobId: msg.jobId });
183
+ }
184
+ }
185
+ sendResult(result, jobId) {
186
+ const message = {
187
+ type: 'tool_result',
188
+ jobId,
189
+ ok: result.ok,
190
+ durationMs: result.durationMs,
191
+ ...(result.result !== undefined ? { result: result.result } : {}),
192
+ ...(result.error !== undefined ? { error: result.error } : {}),
193
+ ...(result.cached ? { cached: true } : {}),
194
+ };
195
+ this.send(message);
196
+ if (result.ok) {
197
+ this.log.info('sent result', { jobId, ok: true, durationMs: result.durationMs, cached: !!result.cached });
198
+ }
199
+ else {
200
+ this.log.info('sent result', { jobId, ok: false, error: result.error, durationMs: result.durationMs });
201
+ }
202
+ }
203
+ cacheResult(key, result) {
204
+ if (this.idempotencyCache.size >= MAX_IDEMPOTENCY_ENTRIES) {
205
+ const oldest = this.idempotencyCache.keys().next().value;
206
+ if (oldest !== undefined)
207
+ this.idempotencyCache.delete(oldest);
208
+ }
209
+ this.idempotencyCache.set(key, result);
210
+ }
211
+ setStatus(state) {
212
+ if (this.state === state)
213
+ return;
214
+ this.state = state;
215
+ this.send({ type: 'status', state, ...(this.sessionId ? { sessionId: this.sessionId } : {}), ts: Date.now() });
216
+ this.events?.onState?.(state);
217
+ this.log.info('status', { state });
218
+ }
219
+ startHeartbeat() {
220
+ if (this.heartbeatTimer)
221
+ return;
222
+ this.heartbeatTimer = setInterval(() => {
223
+ if (!this.stopped && this.state !== 'error' && this.ws) {
224
+ this.send({ type: 'status', state: this.state, ...(this.sessionId ? { sessionId: this.sessionId } : {}), ts: Date.now() });
225
+ }
226
+ }, HEARTBEAT_MS);
227
+ this.heartbeatTimer.unref?.();
228
+ }
229
+ scheduleReconnect() {
230
+ if (this.stopped)
231
+ return;
232
+ if (this.reconnectTimer)
233
+ return;
234
+ const delay = Math.min(RECONNECT_CAP_MS, RECONNECT_BASE_MS * Math.pow(2, this.reconnectAttempt));
235
+ this.reconnectAttempt += 1;
236
+ this.log.info('reconnecting', { delayMs: delay, attempt: this.reconnectAttempt });
237
+ this.reconnectTimer = setTimeout(() => {
238
+ this.reconnectTimer = undefined;
239
+ this.connect();
240
+ }, delay);
241
+ this.reconnectTimer.unref?.();
242
+ }
243
+ stop() {
244
+ this.log.info('stopping agent');
245
+ this.stopped = true;
246
+ this.intentionalClose = true;
247
+ if (this.reconnectTimer) {
248
+ clearTimeout(this.reconnectTimer);
249
+ this.reconnectTimer = undefined;
250
+ }
251
+ if (this.heartbeatTimer) {
252
+ clearInterval(this.heartbeatTimer);
253
+ this.heartbeatTimer = undefined;
254
+ }
255
+ for (const controller of this.jobs.values())
256
+ controller.abort();
257
+ this.jobs.clear();
258
+ if (this.ws) {
259
+ try {
260
+ this.ws.close(1000, 'agent stopping');
261
+ }
262
+ catch {
263
+ /* ignore */
264
+ }
265
+ this.ws = null;
266
+ }
267
+ }
268
+ }
269
+ /** Convert a ws RawData frame into a UTF-8 string. */
270
+ function rawToString(data) {
271
+ if (typeof data === 'string')
272
+ return data;
273
+ if (Array.isArray(data)) {
274
+ return Buffer.concat(data).toString('utf8');
275
+ }
276
+ if (data instanceof ArrayBuffer) {
277
+ return Buffer.from(data).toString('utf8');
278
+ }
279
+ // Buffer (or other Uint8Array)
280
+ return Buffer.from(data).toString('utf8');
281
+ }
282
+ /** Start the local agent. Throws {@link ConfigError} for missing required
283
+ * config (no server/token/device-id) with a friendly message. */
284
+ function startAgent(config, events) {
285
+ const agent = new Agent(config, events);
286
+ return agent.start();
287
+ }
288
+ /** Convenience wrapper that loads config from env/CLI and starts the agent. */
289
+ function startAgentFromEnv(overrides) {
290
+ const config = (0, config_1.loadConfig)(overrides);
291
+ return startAgent(config);
292
+ }
293
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ export interface SelfTest {
3
+ name: string;
4
+ ok: boolean;
5
+ details?: string;
6
+ error?: string;
7
+ }
8
+ /**
9
+ * Run a local smoke test of path safety, danger-command detection, sensitive
10
+ * path detection, secret masking and the tool registry. Returns structured
11
+ * PASS/FAIL results; the CLI prints them and picks the exit code.
12
+ */
13
+ export declare function runSelfTest(): Promise<SelfTest[]>;
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAYA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0FD;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CA0IvD"}