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/dist/security.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security helpers: dangerous-command detection, sensitive-path detection and
|
|
4
|
+
* secret masking. These are intentionally conservative — when in doubt the
|
|
5
|
+
* path/command is treated as unsafe.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MASK = void 0;
|
|
9
|
+
exports.isDangerCommand = isDangerCommand;
|
|
10
|
+
exports.isSensitivePath = isSensitivePath;
|
|
11
|
+
exports.maskSecrets = maskSecrets;
|
|
12
|
+
/**
|
|
13
|
+
* Rules that flag destructive / privilege-escalating commands. Matching is
|
|
14
|
+
* case-insensitive and uses word boundaries so ordinary words ("removal",
|
|
15
|
+
* "formatting") do not trigger a false positive. Rules are cross-platform:
|
|
16
|
+
* bash, powershell and cmd are all covered.
|
|
17
|
+
*/
|
|
18
|
+
const DANGER_RULES = [
|
|
19
|
+
// rm -rf / rm -fr / rm -fir etc. (any order of r/f flags)
|
|
20
|
+
{
|
|
21
|
+
severity: 'critical',
|
|
22
|
+
reason: 'recursive/force delete (rm -rf, rm -fr)',
|
|
23
|
+
re: /\brm\b[^\n]*\s+-[a-z]*r[a-z]*f[a-z]*\b|\brm\b[^\n]*\s+-[a-z]*f[a-z]*r[a-z]*\b/i,
|
|
24
|
+
},
|
|
25
|
+
// rm -r on the filesystem root or a system-ish path
|
|
26
|
+
{
|
|
27
|
+
severity: 'critical',
|
|
28
|
+
reason: 'recursive delete targeting a system path (/ , ~, /var, /etc, /dev, /usr, /tmp)',
|
|
29
|
+
re: /\brm\b[^\n]*\s+-[a-z]*r[a-z]*\s+(?:\\|~\/|\$HOME|\/tmp|\/var|\/etc|\/dev|\/usr|\/boot|\/home)\b/i,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
severity: 'critical',
|
|
33
|
+
reason: 'privilege escalation (sudo)',
|
|
34
|
+
re: /\bsudo\b/i,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
severity: 'critical',
|
|
38
|
+
reason: 'disk format',
|
|
39
|
+
re: /\bformat\b/i,
|
|
40
|
+
},
|
|
41
|
+
// Windows: del /f /q /s (force/quiet/subdirs)
|
|
42
|
+
{
|
|
43
|
+
severity: 'critical',
|
|
44
|
+
reason: 'forced recursive delete (del /f, del /s, del /q)',
|
|
45
|
+
re: /\bdel\b[^\n]*\s+\/[a-z]*[fsq][a-z]*\b/i,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
severity: 'critical',
|
|
49
|
+
reason: 'system shutdown',
|
|
50
|
+
re: /\bshutdown\b/i,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
severity: 'critical',
|
|
54
|
+
reason: 'system reboot',
|
|
55
|
+
re: /\breboot\b/i,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
severity: 'danger',
|
|
59
|
+
reason: 'git hard reset (git reset --hard)',
|
|
60
|
+
re: /\bgit\b[^\n]*\breset\b[^\n]*--hard\b/i,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
severity: 'danger',
|
|
64
|
+
reason: 'git clean (git clean -fdx)',
|
|
65
|
+
re: /\bgit\b[^\n]*\bclean\b[^\n]*-(?:fd?x?|xfd?|dxf|fx)\b/i,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
severity: 'danger',
|
|
69
|
+
reason: 'find ... -delete',
|
|
70
|
+
re: /\bfind\b[^\n]*\s-delete\b/i,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
severity: 'critical',
|
|
74
|
+
reason: 'Remove-Item -Recurse -Force',
|
|
75
|
+
re: /\bRemove-Item\b[^\n]*-Recurse\b[^\n]*-Force\b/i,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
severity: 'critical',
|
|
79
|
+
reason: 'move /y to a drive root',
|
|
80
|
+
re: /\bmove\b[^\n]*\/y\b[^\n]*[a-z]:\\/i,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
severity: 'critical',
|
|
84
|
+
reason: 'diskpart',
|
|
85
|
+
re: /\bdiskpart\b/i,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
severity: 'critical',
|
|
89
|
+
reason: 'registry delete',
|
|
90
|
+
re: /\breg\b[^\n]*\bdelete\b/i,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
severity: 'danger',
|
|
94
|
+
reason: 'chmod -R 777 /',
|
|
95
|
+
re: /\bchmod\b[^\n]*\s+-R\b[^\n]*777\b[^\n]*(?:\\|~|\$HOME|\/etc|\/var|\/dev|\/usr|\/home)\b/i,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
severity: 'danger',
|
|
99
|
+
reason: 'mkfs (filesystem creation)',
|
|
100
|
+
re: /\bmkfs\b/i,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
severity: 'critical',
|
|
104
|
+
reason: 'dd writing to a block device',
|
|
105
|
+
re: /\bdd\b[^\n]*\bof=\/dev\/\S+/i,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
severity: 'critical',
|
|
109
|
+
reason: 'redirection to a block device',
|
|
110
|
+
re: />>?\s*\/dev\/(?:sda|sdb|sd\w|nvme\w*|mmcblk\w*|disk\w*)\b/i,
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
severity: 'danger',
|
|
114
|
+
reason: 'force-kill all processes',
|
|
115
|
+
re: /\b(?:killall|pkill)\b[^\n]*\s+-9\b|\bkill\b[^\n]*\s+-9\b[^\n]*-?\d+\b/i,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
severity: 'danger',
|
|
119
|
+
reason: 'fork bomb',
|
|
120
|
+
re: /:\(\)\s*\{\s*:\|:&\s*\};:/i,
|
|
121
|
+
},
|
|
122
|
+
// Truncating the filesystem root or a system file.
|
|
123
|
+
{
|
|
124
|
+
severity: 'critical',
|
|
125
|
+
reason: 'truncate a system path',
|
|
126
|
+
re: />>?\s*(?:\/etc\/(?:passwd|shadow|hosts)|\/var\/log\b|\/dev\/null\b)/i,
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
/**
|
|
130
|
+
* Assess whether a shell command is too dangerous to run automatically.
|
|
131
|
+
* Cross-platform (bash / powershell / cmd). Returns a severity and reason.
|
|
132
|
+
*/
|
|
133
|
+
function isDangerCommand(command) {
|
|
134
|
+
if (typeof command !== 'string' || command.trim() === '') {
|
|
135
|
+
return { danger: false, severity: 'none', reason: 'empty command' };
|
|
136
|
+
}
|
|
137
|
+
const trimmedTrimmed = command.trim();
|
|
138
|
+
for (const rule of DANGER_RULES) {
|
|
139
|
+
if (rule.re.test(trimmedTrimmed)) {
|
|
140
|
+
return {
|
|
141
|
+
danger: rule.severity === 'critical' || rule.severity === 'danger',
|
|
142
|
+
severity: rule.severity,
|
|
143
|
+
reason: rule.reason,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { danger: false, severity: 'none', reason: 'allowed' };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* High-value / credential paths that are blocked regardless of authorisation
|
|
151
|
+
* mode. Matched against the lower-cased, slash-normalised path so both POSIX
|
|
152
|
+
* and Windows spellings are covered.
|
|
153
|
+
*/
|
|
154
|
+
const SENSITIVE_PATTERN = [
|
|
155
|
+
// System config / credential stores
|
|
156
|
+
/(^|\/)(etc\/passwd|etc\/shadow|etc\/sudoers|etc\/hosts|etc\/group|etc\/fstab)$/,
|
|
157
|
+
/(^|\/)(etc\/ssh|etc\/ssl\/private|etc\/ssl\/certs|etc\/pkcs11)/,
|
|
158
|
+
/(^|\/)(dev\/(sda|sdb|sd[a-z]|nvme[0-9n]+|mmcblk[0-9]+|disk[a-z0-9]+|mem|kmem|initctl|loop[0-9]+|tty))$/,
|
|
159
|
+
/(^|\/)(proc|sys|boot|run|sbin|bin|usr\/lib|usr\/share|lib|lib64|var\/log|var\/lib|var\/run)\b/,
|
|
160
|
+
/(^|\/)(system\/library|library\/keychains|library\/preferences|applications)\b/,
|
|
161
|
+
// Windows system directories
|
|
162
|
+
/^([a-z]:)?\/(windows|winnt|program files|programdata|users\/(?:default|public)\/appdata)/,
|
|
163
|
+
/\/windows\/(system32|syswow64|system|security|systemroot|boot)\b/,
|
|
164
|
+
// Private keys and credential files
|
|
165
|
+
/(^|\/)(id_rsa|id_dsa|id_ecdsa|id_ed25519)(\.pub)?$/,
|
|
166
|
+
/(^|\/)\.(ssh|gnupg|aws|azure|kube|docker-npm|config)\b/,
|
|
167
|
+
/(^|\/)\.env(\.|$)/i,
|
|
168
|
+
/(^|\/)\.npmrc$/,
|
|
169
|
+
/(^|\/)(\.netrc|\.pgpass|\.htpasswd|\.htaccess|\.git-credentials|\.boto|\.s3cfg)$/,
|
|
170
|
+
/(^|\/)(credentials|credentials\.json|secrets?\.json|service-account[^/]*\.json|google-credentials[^/]*\.json|application_default_credentials[^/]*\.json)$/,
|
|
171
|
+
/(^|\/)(keystore|\.keystore|\.jks|\.p12|\.pfx|\.pem|\.key|cert\.pem|server\.pem)$/,
|
|
172
|
+
/(^|\/)(\.npmrc|\.yarnrc|\.pypirc|\.gemrc|\.dockerconfigjson)$/,
|
|
173
|
+
// Files that typically bundle tokens/config keys
|
|
174
|
+
/(^|\/)(config\.json|settings\.json|secrets\.yml|secrets\.yaml|\.env\.(local|prod|production|dev|development|test))$/,
|
|
175
|
+
];
|
|
176
|
+
/**
|
|
177
|
+
* Whether a (canonical absolute) path should never be read/written by a tool.
|
|
178
|
+
* These are blocked no matter what permission mode is in effect.
|
|
179
|
+
*/
|
|
180
|
+
function isSensitivePath(p) {
|
|
181
|
+
if (typeof p !== 'string' || p === '')
|
|
182
|
+
return false;
|
|
183
|
+
const norm = p.replace(/\\/g, '/').toLowerCase();
|
|
184
|
+
for (const re of SENSITIVE_PATTERN) {
|
|
185
|
+
if (re.test(norm))
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
/** Emitted value when any secret has been redacted. */
|
|
191
|
+
exports.MASK = '***';
|
|
192
|
+
/**
|
|
193
|
+
* Redact secrets from a string: provider keys, bearer tokens, JWTs, private
|
|
194
|
+
* keys, and `key=value` / `key: value` pairs for obvious secret names. Used
|
|
195
|
+
* before logging or returning tool output so internal keys never leak.
|
|
196
|
+
*/
|
|
197
|
+
function maskSecrets(text) {
|
|
198
|
+
if (typeof text !== 'string' || text === '')
|
|
199
|
+
return text;
|
|
200
|
+
let out = text;
|
|
201
|
+
// Named secret pairs: password=..., token=..., api_key=..., authorization: ...
|
|
202
|
+
out = out.replace(/(password|passwd|secret|token|api[_-]?key|access[_-]?key|auth(?:orization)?|session|refresh[_-]?token|private[_-]?key|cookie|client[_-]?secret)\s*(?:[:=]\s*|["']?\s+)(["']?)([^\s,;'"&]+)\2/gi, (_m, _key, _q, value) => {
|
|
203
|
+
// Never redact a placeholder already present.
|
|
204
|
+
if (value === exports.MASK)
|
|
205
|
+
return _m;
|
|
206
|
+
return `${_q}${exports.MASK}${_q}`;
|
|
207
|
+
});
|
|
208
|
+
// Bearer / Basic auth headers.
|
|
209
|
+
out = out.replace(/\b(Bearer|Basic)\s+[A-Za-z0-9+/=_-]{8,}/gi, `$1 ${exports.MASK}`);
|
|
210
|
+
// OpenAI / Anthropic style sk- keys.
|
|
211
|
+
out = out.replace(/\bsk-[A-Za-z0-9_-]{16,}\b/g, `sk-${exports.MASK}`);
|
|
212
|
+
// Stripe live/test keys.
|
|
213
|
+
out = out.replace(/\bsk_(?:live|test)_[A-Za-z0-9]{16,}\b/g, `sk_${exports.MASK}`);
|
|
214
|
+
// GitHub tokens.
|
|
215
|
+
out = out.replace(/\bgh[pousr]_[A-Za-z0-9]{16,}\b/g, `gh${exports.MASK}`.replace('***', exports.MASK));
|
|
216
|
+
// Slack tokens.
|
|
217
|
+
out = out.replace(/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, `xox${exports.MASK}`.replace('***', exports.MASK));
|
|
218
|
+
// Google API keys.
|
|
219
|
+
out = out.replace(/\bAIza[0-9A-Za-z_-]{30,}\b/g, `AIza${exports.MASK}`);
|
|
220
|
+
// AWS access key ID.
|
|
221
|
+
out = out.replace(/\b(AKIA|ASIA)[0-9A-Z]{16}\b/g, `$1${exports.MASK}`);
|
|
222
|
+
// JWT.
|
|
223
|
+
out = out.replace(/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g, `eyJ${exports.MASK}`);
|
|
224
|
+
// PEM / OpenSSH private-key blocks.
|
|
225
|
+
out = out.replace(/-----BEGIN ([A-Z ]*)?PRIVATE KEY-----[\s\S]*?-----END ([A-Z ]*)?PRIVATE KEY-----/g, '-----BEGIN PRIVATE KEY-----\n' + exports.MASK + '\n-----END PRIVATE KEY-----');
|
|
226
|
+
return out;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { PermissionMode } from './config';
|
|
2
|
+
import type { Logger } from './logger';
|
|
3
|
+
/** Thrown when a tool invocation is invalid or unsafe. */
|
|
4
|
+
export declare class ToolError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(code: string, message: string);
|
|
7
|
+
}
|
|
8
|
+
export interface ToolContext {
|
|
9
|
+
/** Canonical authorised root; all file operations stay inside it. */
|
|
10
|
+
root: string;
|
|
11
|
+
mode: PermissionMode;
|
|
12
|
+
webEnabled: boolean;
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
maxBytes: number;
|
|
15
|
+
logger: Logger;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolOutcome {
|
|
18
|
+
ok: boolean;
|
|
19
|
+
result?: unknown;
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ToolResult extends ToolOutcome {
|
|
23
|
+
durationMs: number;
|
|
24
|
+
/** Set when the result came from the idempotency cache. */
|
|
25
|
+
cached?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export type ToolExecutor = (ctx: ToolContext, args: Record<string, unknown>, signal?: AbortSignal) => Promise<ToolOutcome>;
|
|
28
|
+
export interface ToolRegistry {
|
|
29
|
+
readonly ctx: ToolContext;
|
|
30
|
+
readonly tools: readonly string[];
|
|
31
|
+
has(name: string): boolean;
|
|
32
|
+
dispatch(name: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<ToolResult>;
|
|
33
|
+
}
|
|
34
|
+
/** Build a tool registry bound to a single execution context. */
|
|
35
|
+
export declare function createToolRegistry(ctx: ToolContext): ToolRegistry;
|
|
36
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,0DAA0D;AAC1D,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,WAAW,CAAC,CAAC;AA8b1B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAClG;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CA6BjE"}
|