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.
- package/README.md +36 -66
- package/dist/agent.d.ts +17 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +293 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +267 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +135 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.d.ts +46 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +397 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +37 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +121 -0
- package/dist/logger.js.map +1 -0
- package/dist/path-utils.d.ts +44 -0
- package/dist/path-utils.d.ts.map +1 -0
- package/dist/path-utils.js +206 -0
- package/dist/path-utils.js.map +1 -0
- package/dist/protocol.d.ts +77 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +94 -0
- package/dist/protocol.js.map +1 -0
- package/dist/security.d.ts +32 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +228 -0
- package/dist/security.js.map +1 -0
- package/dist/tools.d.ts +36 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +498 -0
- package/dist/tools.js.map +1 -0
- package/package.json +36 -21
- package/src/config.js +0 -94
- package/src/http-fs.js +0 -178
- package/src/index.js +0 -439
- package/src/logger.js +0 -84
- package/src/methods/dialog.js +0 -84
- package/src/methods/fs.js +0 -674
- package/src/methods/git.js +0 -391
- package/src/methods/project.js +0 -57
- package/src/methods/scaffold.js +0 -131
- package/src/methods/skill.js +0 -347
- package/src/methods/system.js +0 -82
- package/src/methods/terminal.js +0 -234
- package/src/origin.js +0 -38
- package/src/pairing.js +0 -168
- package/src/rpc.js +0 -62
- package/src/sandbox.js +0 -178
package/README.md
CHANGED
|
@@ -1,90 +1,60 @@
|
|
|
1
1
|
# ysagc-agent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个在用户本机运行的**本地执行 Agent**:它通过 WebSocket 连接到平台后端,接收工具指令,在**授权根目录内**安全地读写文件、执行命令、联网检索,并把结果回传。它本身**无状态**——不保存余额、不做计费判断、不持有平台密钥。
|
|
4
4
|
|
|
5
|
-
-
|
|
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
|
-
|
|
7
|
+
---
|
|
12
8
|
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
+
## 工具 / Tools
|
|
60
33
|
|
|
61
|
-
|
|
34
|
+
- `list_dir`(列目录)、`read_file`(读文件)、`write_file`(写文件)、`edit_file`(编辑文件)
|
|
35
|
+
- `run_command`(运行命令,含超时/输出上限)、`git`(Git 包装)、`generate`(生成骨架)、`web_search`(联网检索,平台侧执行)
|
|
62
36
|
|
|
63
|
-
|
|
37
|
+
每个工具都会:**规范化路径**、**断言在授权根内**、拒绝根外/敏感路径,并保证**幂等**(相同 `idempotencyKey` 不重复执行/不重复写)。
|
|
64
38
|
|
|
65
|
-
|
|
39
|
+
## 安全模型 / Security Model
|
|
66
40
|
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
56
|
+
WebSocket 上行 JSON 消息:`hello`、`pong`、`tool_result`、`status`;下行:`welcome`、`ping`、`tool_call`、`cancel`。心跳 + 指数退避自动重连。
|
|
87
57
|
|
|
88
|
-
##
|
|
58
|
+
## License
|
|
89
59
|
|
|
90
|
-
|
|
60
|
+
MIT
|
package/dist/agent.d.ts
ADDED
|
@@ -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"}
|