sentinel-agentos 0.1.1 → 0.1.3
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 +211 -7
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +106 -43
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -261,10 +261,12 @@ Total: 156 | Failures: 2 | High-Risk: 3
|
|
|
261
261
|
## 📦 安装 · Installation
|
|
262
262
|
|
|
263
263
|
```bash
|
|
264
|
-
npm install
|
|
264
|
+
npm install sentinel-agentos
|
|
265
265
|
```
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
即可使用所有功能。
|
|
268
|
+
|
|
269
|
+
如果从源码开发:
|
|
268
270
|
|
|
269
271
|
```bash
|
|
270
272
|
git clone git@github.com:jishuanjimingtian/Sentinel AgentOS.git
|
|
@@ -278,7 +280,52 @@ npm run build # 编译到 dist/
|
|
|
278
280
|
|
|
279
281
|
## 🚀 使用说明 · Usage
|
|
280
282
|
|
|
281
|
-
###
|
|
283
|
+
### 三种接入方式 · Three Integration Modes
|
|
284
|
+
|
|
285
|
+
Sentinel AgentOS 支持三种接入方式,从轻到重按需选择。
|
|
286
|
+
|
|
287
|
+
| 方式 | 适用场景 | 代码量 | 说明 |
|
|
288
|
+
|------|---------|--------|------|
|
|
289
|
+
| **CLI** | 快速测试 / CI/CD | 1 行命令 | 直接命令行检验工具调用 |
|
|
290
|
+
| **SDK** | 嵌入 Agent 框架 | 5 行代码 | `import { AgentOS }` 在进程内调用 |
|
|
291
|
+
| **HTTP API** | 跨语言 / 远程服务 | HTTP 请求 | 独立 HTTP 服务,任何语言都能调 |
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### 方式一:CLI(命令行)
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# 安装
|
|
299
|
+
npm install -g sentinel-agentos
|
|
300
|
+
|
|
301
|
+
# 校验参数
|
|
302
|
+
sentinel-agentos validate exec command="rm -rf /"
|
|
303
|
+
sentinel-agentos validate write_file path=src/main.ts content="console.log(1)"
|
|
304
|
+
|
|
305
|
+
# 风险评分
|
|
306
|
+
sentinel-agentos risk exec command="sudo reboot"
|
|
307
|
+
sentinel-agentos risk exec command="npm test"
|
|
308
|
+
|
|
309
|
+
# 查看审计日志
|
|
310
|
+
sentinel-agentos audit --limit 10
|
|
311
|
+
|
|
312
|
+
# 查看状态报告
|
|
313
|
+
sentinel-agentos status
|
|
314
|
+
|
|
315
|
+
# 启动 HTTP 服务
|
|
316
|
+
sentinel-agentos server --port 3300 --token ***
|
|
317
|
+
|
|
318
|
+
# 查看帮助
|
|
319
|
+
sentinel-agentos help
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**支持的命令**:`validate` / `risk` / `audit` / `stats` / `profile` / `status` / `server` / `memory` / `help`
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
### 方式二:SDK(代码嵌入)
|
|
327
|
+
|
|
328
|
+
#### 2.1 基础用法 · Basic
|
|
282
329
|
|
|
283
330
|
```typescript
|
|
284
331
|
import { AgentOS } from 'sentinel-agentos';
|
|
@@ -400,6 +447,163 @@ sandbox.validate('rm', { path: 'src/main.ts' });
|
|
|
400
447
|
await sandbox.execute('exec', { command: 'npm test', cwd: process.cwd() });
|
|
401
448
|
```
|
|
402
449
|
|
|
450
|
+
#### 2.2 中间件(一行接入) · Middleware (one-liner)
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
import { wrapAgent } from 'sentinel-agentos';
|
|
454
|
+
|
|
455
|
+
// 一行接入——包裹你的 Agent 工具调用
|
|
456
|
+
const sentinel = wrapAgent({ workspaceRoot: process.cwd() });
|
|
457
|
+
|
|
458
|
+
// 每次工具调用前后调用即可
|
|
459
|
+
const { allowed, reason } = sentinel.preCheck('exec', { command: 'rm -rf /' });
|
|
460
|
+
// → { allowed: false, reason: 'Risk 9.18 → DENY' }
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
#### 2.3 OpenClaw 插件
|
|
464
|
+
|
|
465
|
+
如果你在用 OpenClaw Agent 框架,直接以插件形式集成:
|
|
466
|
+
|
|
467
|
+
```typescript
|
|
468
|
+
import { sentinelPlugin } from 'sentinel-agentos';
|
|
469
|
+
|
|
470
|
+
// 注册为 OpenClaw 插件,自动 hook 所有工具调用
|
|
471
|
+
const plugin = sentinelPlugin({
|
|
472
|
+
workspaceRoot: process.cwd(),
|
|
473
|
+
preRegisteredRules: true,
|
|
474
|
+
});
|
|
475
|
+
// → onBeforeTool → 校验 + 风险评分
|
|
476
|
+
// → onAfterTool → 验证 + 审计
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
### 方式三:HTTP API(远程调用,跨语言通用)
|
|
482
|
+
|
|
483
|
+
Sentinel AgentOS 可启动为独立 HTTP 服务,任何语言(Python/Go/Rust/Java...)都能调用。
|
|
484
|
+
|
|
485
|
+
#### 3.1 启动服务
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
# CLI 一行启动
|
|
489
|
+
npx sentinel-agentos server --port 3300 --token ***
|
|
490
|
+
|
|
491
|
+
# 或代码中启动
|
|
492
|
+
import { createServer } from 'sentinel-agentos';
|
|
493
|
+
createServer({ port: 3300, apiToken: '***' }).start();
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
启动后健康检查(免 token):
|
|
497
|
+
```bash
|
|
498
|
+
curl http://localhost:3300/health
|
|
499
|
+
# → {"ok":true,"uptime":12.3}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
#### 3.2 鉴权
|
|
503
|
+
|
|
504
|
+
除 `/health` 外所有端点需要 `Authorization: Bearer <token>` header。否则返回 `401`。
|
|
505
|
+
|
|
506
|
+
#### 3.3 API 端点参考 · API Reference
|
|
507
|
+
|
|
508
|
+
**基础端点:**
|
|
509
|
+
|
|
510
|
+
| 端点 | 方法 | 鉴权 | 说明 |
|
|
511
|
+
|------|:--:|:--:|------|
|
|
512
|
+
| `/health` | GET | ❌ | 服务健康检查 |
|
|
513
|
+
| `/pipeline/pre` | POST | ✅ | 执行前校验(Schema + Risk + Snapshot) |
|
|
514
|
+
| `/pipeline/post` | POST | ✅ | 执行后验证(Verify + Audit + Feedback) |
|
|
515
|
+
| `/pipeline/report` | GET | ✅ | 质量状态报告(文本) |
|
|
516
|
+
| `/pipeline/profile` | GET | ✅ | 质量画像(JSON) |
|
|
517
|
+
|
|
518
|
+
**Guard / Memory / Feedback / Audit 端点:**
|
|
519
|
+
|
|
520
|
+
| 端点 | 方法 | 说明 |
|
|
521
|
+
|------|:--:|------|
|
|
522
|
+
| `/guard/schema` | POST | 注册 Schema 校验规则 |
|
|
523
|
+
| `/memory/preference` | POST | 设置用户偏好 `{"key":"language","value":"zh-CN"}` |
|
|
524
|
+
| `/memory/fact` | POST | 添加事实 `{"fact":"用户在上海"}` |
|
|
525
|
+
| `/memory/context` | GET | 获取当前记忆上下文 |
|
|
526
|
+
| `/feedback` | POST | 记录隐性反馈 `{"signal":"user_explicit_approval"}` |
|
|
527
|
+
| `/audit` | GET | 查询审计日志(支持 `?limit=&sessionId=&toolName=&status=`) |
|
|
528
|
+
|
|
529
|
+
**反馈信号类型:**
|
|
530
|
+
|
|
531
|
+
| 信号 | 强度 | 说明 |
|
|
532
|
+
|------|------|------|
|
|
533
|
+
| `user_explicit_approval` | +0.6 | 用户明确说"做得好" |
|
|
534
|
+
| `user_immediate_continue` | +0.3 | 用户立即继续对话 |
|
|
535
|
+
| `user_used_result` | +0.7 | 用户使用了 Agent 的结果 |
|
|
536
|
+
| `user_shared_output` | +0.8 | 用户分享了 Agent 输出 |
|
|
537
|
+
| `user_modified_output` | -0.5 | 用户修改了 Agent 输出 |
|
|
538
|
+
| `user_deleted_code` | -0.8 | 用户删除了 Agent 创建的代码 |
|
|
539
|
+
| `user_interrupted` | -0.6 | 用户打断了 Agent |
|
|
540
|
+
| `user_repeated_instruction` | -0.3 | 用户重复了相同指令 |
|
|
541
|
+
|
|
542
|
+
#### 3.4 完整调用示例
|
|
543
|
+
|
|
544
|
+
```bash
|
|
545
|
+
# 1. Pre-exec — 校验 + 风险评分
|
|
546
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
547
|
+
-X POST http://localhost:3300/pipeline/pre \
|
|
548
|
+
-H 'Content-Type: application/json' \
|
|
549
|
+
-d '{"toolName":"exec","parameters":{"command":"npm test"}}'
|
|
550
|
+
# → {"preExec":{"schemaCheck":{"pass":true},"riskScore":{"score":0.19,"action":"auto"}},"snapshot":{...}}
|
|
551
|
+
|
|
552
|
+
# 2. Post-exec — 验证 + 审计
|
|
553
|
+
# (传入 pre 返回的 snapshot)
|
|
554
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
555
|
+
-X POST http://localhost:3300/pipeline/post \
|
|
556
|
+
-H 'Content-Type: application/json' \
|
|
557
|
+
-d '{"toolName":"exec","toolParameters":{"command":"npm test"},"toolResult":"all passed","snapshot":{...},"startTime":1718123456000,"endTime":1718123457000,"retryCount":0,"wasSelfCorrected":false,"hadTimeout":false,"userAccepted":true,"userProvidedEdit":false,"resultWasUsed":true}'
|
|
558
|
+
|
|
559
|
+
# 3. 查看报告
|
|
560
|
+
curl -s -H "Authorization: Bearer $TOKEN" http://localhost:3300/pipeline/report
|
|
561
|
+
|
|
562
|
+
# 4. 查询审计
|
|
563
|
+
curl -s -H "Authorization: Bearer $TOKEN" "http://localhost:3300/audit?limit=10&toolName=exec"
|
|
564
|
+
|
|
565
|
+
# 5. 记录反馈
|
|
566
|
+
curl -s -H "Authorization: Bearer $TOKEN" \
|
|
567
|
+
-X POST http://localhost:3300/feedback \
|
|
568
|
+
-H 'Content-Type: application/json' \
|
|
569
|
+
-d '{"signal":"user_immediate_continue","sessionId":"session_1"}'
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
#### 3.5 跨语言(Python 示例)
|
|
573
|
+
|
|
574
|
+
```python
|
|
575
|
+
import requests
|
|
576
|
+
|
|
577
|
+
BASE = "http://localhost:3300"
|
|
578
|
+
HEADERS = {"Authorization": "Bearer ***"}
|
|
579
|
+
|
|
580
|
+
# Pre-exec
|
|
581
|
+
resp = requests.post(f"{BASE}/pipeline/pre", json={
|
|
582
|
+
"toolName": "exec", "parameters": {"command": "npm test"}
|
|
583
|
+
}, headers=HEADERS)
|
|
584
|
+
data = resp.json()
|
|
585
|
+
print(f"Risk: {data['preExec']['riskScore']['score']} → {data['preExec']['riskScore']['action']}")
|
|
586
|
+
|
|
587
|
+
# Post-exec (pass snapshot from pre)
|
|
588
|
+
snapshot = data["snapshot"]
|
|
589
|
+
resp2 = requests.post(f"{BASE}/pipeline/post", json={
|
|
590
|
+
"toolName": "exec",
|
|
591
|
+
"toolParameters": {"command": "npm test"},
|
|
592
|
+
"toolResult": "all passed",
|
|
593
|
+
"snapshot": snapshot,
|
|
594
|
+
"startTime": 1718123456000, "endTime": 1718123457000,
|
|
595
|
+
"retryCount": 0, "wasSelfCorrected": False,
|
|
596
|
+
"hadTimeout": False, "userAccepted": True,
|
|
597
|
+
"userProvidedEdit": False, "resultWasUsed": True
|
|
598
|
+
}, headers=HEADERS)
|
|
599
|
+
print(f"Verify: {resp2.json()['postExec']['verifyPassed']}")
|
|
600
|
+
|
|
601
|
+
# Report
|
|
602
|
+
print(requests.get(f"{BASE}/pipeline/report", headers=HEADERS).text)
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
403
607
|
### API 层 · SDK API
|
|
404
608
|
|
|
405
609
|
```typescript
|
|
@@ -562,10 +766,10 @@ v1.0 已完成 100% 设计文档覆盖率、99 个测试全通过、TypeScript
|
|
|
562
766
|
</details>
|
|
563
767
|
|
|
564
768
|
<details>
|
|
565
|
-
<summary><b>Q: npm
|
|
769
|
+
<summary><b>Q: npm 包已经发布了吗? · Is npm package published?</b></summary>
|
|
566
770
|
|
|
567
|
-
|
|
568
|
-
*
|
|
771
|
+
已发布。`npm install sentinel-agentos` 即可使用。当前版本 v0.1.x。
|
|
772
|
+
*Published. Just `npm install sentinel-agentos`. Current version v0.1.x.*
|
|
569
773
|
</details>
|
|
570
774
|
|
|
571
775
|
<details>
|
|
@@ -600,7 +804,7 @@ const entries = api.auditQuery({ minScore: 3.0 }); // 高风险操作 · High-ri
|
|
|
600
804
|
| v0.3 | Memory 层(3 层)· *Memory layer (3 layers)* | ✅ |
|
|
601
805
|
| v0.4 | Evaluator 层(评估 + 反馈 + 画像)· *Evaluator* | ✅ |
|
|
602
806
|
| v1.0 | 沙箱 + API + x- 扩展 + 校验补齐 · *Sandbox + API + x-ext* | ✅ |
|
|
603
|
-
| v1.1 | npm 发布 · *npm publish* |
|
|
807
|
+
| v1.1 | npm 发布 + 三种接入方式 · *npm publish + 3 modes* | ✅ |
|
|
604
808
|
| v2.0 | Docker 沙箱、Dashboard、SaaS · *Docker sandbox, Dashboard, SaaS* | 📋 |
|
|
605
809
|
|
|
606
810
|
---
|
package/dist/cli.d.ts
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* Command-line interface for Sentinel AgentOS operations.
|
|
6
6
|
*
|
|
7
7
|
* Quick start:
|
|
8
|
-
* npx sentinel-agentos validate
|
|
8
|
+
* npx sentinel-agentos validate exec "command=rm -rf /"
|
|
9
|
+
* npx sentinel-agentos validate write_file path=demo.ts content=hello
|
|
10
|
+
* npx sentinel-agentos risk exec command="npm test"
|
|
9
11
|
* npx sentinel-agentos audit --limit 10
|
|
10
12
|
* npx sentinel-agentos status
|
|
11
13
|
* npx sentinel-agentos server --port 3300
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
|
package/dist/cli.js
CHANGED
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* Command-line interface for Sentinel AgentOS operations.
|
|
7
7
|
*
|
|
8
8
|
* Quick start:
|
|
9
|
-
* npx sentinel-agentos validate
|
|
9
|
+
* npx sentinel-agentos validate exec "command=rm -rf /"
|
|
10
|
+
* npx sentinel-agentos validate write_file path=demo.ts content=hello
|
|
11
|
+
* npx sentinel-agentos risk exec command="npm test"
|
|
10
12
|
* npx sentinel-agentos audit --limit 10
|
|
11
13
|
* npx sentinel-agentos status
|
|
12
14
|
* npx sentinel-agentos server --port 3300
|
|
@@ -51,82 +53,143 @@ function printHelp() {
|
|
|
51
53
|
🛡️ Sentinel AgentOS CLI
|
|
52
54
|
|
|
53
55
|
Usage:
|
|
54
|
-
sentinel-agentos <
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
server Start HTTP API server
|
|
64
|
-
memory Show memory context
|
|
65
|
-
help Show this help
|
|
56
|
+
sentinel-agentos validate <tool> [key=value...]
|
|
57
|
+
sentinel-agentos risk <tool> [key=value...]
|
|
58
|
+
sentinel-agentos audit [--limit N]
|
|
59
|
+
sentinel-agentos stats
|
|
60
|
+
sentinel-agentos profile
|
|
61
|
+
sentinel-agentos status
|
|
62
|
+
sentinel-agentos server [--port N] [--token ***
|
|
63
|
+
sentinel-agentos memory
|
|
64
|
+
sentinel-agentos help
|
|
66
65
|
|
|
67
66
|
Examples:
|
|
68
|
-
sentinel-agentos validate
|
|
69
|
-
sentinel-agentos
|
|
67
|
+
sentinel-agentos validate exec command="rm -rf /"
|
|
68
|
+
sentinel-agentos validate write_file path=src/main.ts content="console.log(1)"
|
|
69
|
+
sentinel-agentos risk exec command="sudo reboot"
|
|
70
70
|
sentinel-agentos audit --limit 10
|
|
71
71
|
sentinel-agentos status
|
|
72
|
-
sentinel-agentos server --port 3300
|
|
72
|
+
sentinel-agentos server --port 3300 --token ***
|
|
73
73
|
`);
|
|
74
74
|
}
|
|
75
75
|
function fatal(msg) {
|
|
76
76
|
console.error(`❌ ${msg}`);
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Parse positional key=value pairs into a params object.
|
|
81
|
+
* Supports: key=value, key="value with spaces", key='value'
|
|
82
|
+
*/
|
|
83
|
+
function parseParams(args) {
|
|
84
|
+
const params = {};
|
|
85
|
+
for (const arg of args) {
|
|
86
|
+
const eqIdx = arg.indexOf('=');
|
|
87
|
+
if (eqIdx === -1)
|
|
88
|
+
continue;
|
|
89
|
+
const key = arg.slice(0, eqIdx);
|
|
90
|
+
let val = arg.slice(eqIdx + 1);
|
|
91
|
+
// Strip quotes if present
|
|
92
|
+
if ((val.startsWith('"') && val.endsWith('"')) ||
|
|
93
|
+
(val.startsWith("'") && val.endsWith("'"))) {
|
|
94
|
+
val = val.slice(1, -1);
|
|
95
|
+
}
|
|
96
|
+
// Auto-detect type
|
|
97
|
+
if (val === 'true')
|
|
98
|
+
params[key] = true;
|
|
99
|
+
else if (val === 'false')
|
|
100
|
+
params[key] = false;
|
|
101
|
+
else if (val === 'null')
|
|
102
|
+
params[key] = null;
|
|
103
|
+
else if (/^\d+$/.test(val))
|
|
104
|
+
params[key] = parseInt(val, 10);
|
|
105
|
+
else if (/^\d+\.\d+$/.test(val))
|
|
106
|
+
params[key] = parseFloat(val);
|
|
107
|
+
else
|
|
108
|
+
params[key] = val;
|
|
109
|
+
}
|
|
110
|
+
return params;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse --flag value options from args.
|
|
114
|
+
* Skips positional key=value items.
|
|
115
|
+
*/
|
|
116
|
+
function parseFlags(args) {
|
|
80
117
|
const result = {};
|
|
81
118
|
for (let i = 0; i < args.length; i++) {
|
|
82
119
|
const arg = args[i];
|
|
83
120
|
if (arg && arg.startsWith('--')) {
|
|
84
121
|
const key = arg.replace(/^--/, '');
|
|
85
122
|
const next = args[i + 1];
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
123
|
+
// Don't consume if next is a flag or key=value
|
|
124
|
+
if (next && !next.startsWith('--') && !next.includes('=')) {
|
|
125
|
+
result[key] = next;
|
|
89
126
|
i++;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
result[key] = 'true';
|
|
130
|
+
}
|
|
90
131
|
}
|
|
91
132
|
}
|
|
92
133
|
return result;
|
|
93
134
|
}
|
|
94
135
|
async function main() {
|
|
95
|
-
const
|
|
96
|
-
const cmd =
|
|
97
|
-
const opts = parseArgs(args.slice(1));
|
|
136
|
+
const rawArgs = process.argv.slice(2);
|
|
137
|
+
const cmd = rawArgs[0] ?? '';
|
|
98
138
|
if (!cmd || cmd === 'help') {
|
|
99
139
|
printHelp();
|
|
100
140
|
return;
|
|
101
141
|
}
|
|
102
142
|
const aos = new core_1.AgentOS();
|
|
103
143
|
switch (cmd) {
|
|
104
|
-
case 'validate':
|
|
105
|
-
const tool = opts.tool ?? fatal('--tool required');
|
|
106
|
-
const params = opts.params ? JSON.parse(opts.params) : {};
|
|
107
|
-
const result = aos.executePipeline({
|
|
108
|
-
sessionId: 'cli',
|
|
109
|
-
agentId: 'cli',
|
|
110
|
-
toolName: tool,
|
|
111
|
-
parameters: params,
|
|
112
|
-
});
|
|
113
|
-
console.log(JSON.stringify(result.preExec.schemaCheck, null, 2));
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
144
|
+
case 'validate':
|
|
116
145
|
case 'risk': {
|
|
117
|
-
|
|
118
|
-
|
|
146
|
+
// New syntax: sentinel-agentos validate <tool> [key=value...]
|
|
147
|
+
// Old syntax still works: --tool <tool> --params '<json>'
|
|
148
|
+
const flags = parseFlags(rawArgs.slice(1));
|
|
149
|
+
let tool;
|
|
150
|
+
let params;
|
|
151
|
+
// New positional syntax
|
|
152
|
+
const positional = rawArgs.slice(1).filter(a => !a.startsWith('--'));
|
|
153
|
+
const firstPos = positional[0];
|
|
154
|
+
const isNewSyntax = positional.length > 0 && firstPos !== undefined && !firstPos.includes('=');
|
|
155
|
+
if (isNewSyntax && positional[0]) {
|
|
156
|
+
tool = positional[0];
|
|
157
|
+
params = parseParams(positional.slice(1));
|
|
158
|
+
}
|
|
159
|
+
else if (isNewSyntax) {
|
|
160
|
+
fatal(`Usage: sentinel-agentos ${cmd} <tool> [key=value...]`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// Old --tool + --params syntax
|
|
164
|
+
const toolFlag = flags.tool ?? rawArgs[1];
|
|
165
|
+
tool = toolFlag ?? '';
|
|
166
|
+
if (!tool)
|
|
167
|
+
fatal(`Usage: sentinel-agentos ${cmd} <tool> [key=value...]`);
|
|
168
|
+
const paramsJson = flags.params ?? '{}';
|
|
169
|
+
try {
|
|
170
|
+
params = JSON.parse(paramsJson);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
params = parseParams(rawArgs.slice(2));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
119
176
|
const result = aos.executePipeline({
|
|
120
177
|
sessionId: 'cli',
|
|
121
178
|
agentId: 'cli',
|
|
122
179
|
toolName: tool,
|
|
123
180
|
parameters: params,
|
|
124
181
|
});
|
|
125
|
-
|
|
182
|
+
if (cmd === 'validate') {
|
|
183
|
+
console.log(JSON.stringify(result.preExec.schemaCheck, null, 2));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(JSON.stringify(result.preExec.riskScore, null, 2));
|
|
187
|
+
}
|
|
126
188
|
break;
|
|
127
189
|
}
|
|
128
190
|
case 'audit': {
|
|
129
|
-
const
|
|
191
|
+
const flags = parseFlags(rawArgs.slice(1));
|
|
192
|
+
const limit = parseInt(flags.limit ?? '20', 10);
|
|
130
193
|
const entries = aos.guard.audit.query({ limit });
|
|
131
194
|
console.log(JSON.stringify(entries, null, 2));
|
|
132
195
|
break;
|
|
@@ -146,10 +209,10 @@ async function main() {
|
|
|
146
209
|
break;
|
|
147
210
|
}
|
|
148
211
|
case 'server': {
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
|
|
212
|
+
const flags = parseFlags(rawArgs.slice(1));
|
|
213
|
+
const port = parseInt(flags.port ?? '3300', 10);
|
|
214
|
+
const host = flags.host ?? '127.0.0.1';
|
|
215
|
+
const token = flags.token;
|
|
153
216
|
try {
|
|
154
217
|
const { createServer } = await Promise.resolve().then(() => __importStar(require('./server')));
|
|
155
218
|
const server = createServer({ port, host, apiToken: token });
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,iCAAiC;AAEjC,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAc;IACjC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAS;QAE3B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE/B,0BAA0B;QAC1B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,mBAAmB;QACnB,IAAI,GAAG,KAAK,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;aAClC,IAAI,GAAG,KAAK,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aACzC,IAAI,GAAG,KAAK,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;aACvC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aACvD,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;;YAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,+CAA+C;YAC/C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACnB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC3B,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,cAAO,EAAE,CAAC;IAE1B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,8DAA8D;YAC9D,0DAA0D;YAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAY,CAAC;YACjB,IAAI,MAA+B,CAAC;YAEpC,wBAAwB;YACxB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAE/F,IAAI,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,2BAA2B,GAAG,wBAAwB,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI;oBAAE,KAAK,CAAC,2BAA2B,GAAG,wBAAwB,CAAC,CAAC;gBACzE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;gBACxC,IAAI,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;YAC5F,CAAC;YAED,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC;gBACjC,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YAEH,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM;QACR,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAE1B,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBAEpC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;oBAC9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBAClC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC;YAClD,MAAM;QACR,CAAC;QAED;YACE,KAAK,CAAC,oBAAoB,GAAG,0CAA0C,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|