ysagc-agent 0.3.0 → 0.5.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 (67) hide show
  1. package/README.md +132 -60
  2. package/dist/agent.d.ts +17 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +331 -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 +320 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +58 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +152 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/executor.d.ts +48 -0
  15. package/dist/executor.d.ts.map +1 -0
  16. package/dist/executor.js +458 -0
  17. package/dist/executor.js.map +1 -0
  18. package/dist/index.d.ts +23 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +45 -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 +92 -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/skills.d.ts +16 -0
  39. package/dist/skills.d.ts.map +1 -0
  40. package/dist/skills.js +105 -0
  41. package/dist/skills.js.map +1 -0
  42. package/dist/tokens.d.ts +26 -0
  43. package/dist/tokens.d.ts.map +1 -0
  44. package/dist/tokens.js +50 -0
  45. package/dist/tokens.js.map +1 -0
  46. package/dist/tools.d.ts +69 -0
  47. package/dist/tools.d.ts.map +1 -0
  48. package/dist/tools.js +694 -0
  49. package/dist/tools.js.map +1 -0
  50. package/package.json +36 -21
  51. package/src/config.js +0 -94
  52. package/src/http-fs.js +0 -178
  53. package/src/index.js +0 -442
  54. package/src/logger.js +0 -84
  55. package/src/methods/browse.js +0 -91
  56. package/src/methods/dialog.js +0 -84
  57. package/src/methods/fs.js +0 -674
  58. package/src/methods/git.js +0 -391
  59. package/src/methods/project.js +0 -57
  60. package/src/methods/scaffold.js +0 -131
  61. package/src/methods/skill.js +0 -472
  62. package/src/methods/system.js +0 -82
  63. package/src/methods/terminal.js +0 -234
  64. package/src/origin.js +0 -38
  65. package/src/pairing.js +0 -168
  66. package/src/rpc.js +0 -62
  67. package/src/sandbox.js +0 -178
package/dist/cli.js ADDED
@@ -0,0 +1,320 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.runSelfTest = runSelfTest;
38
+ const commander_1 = require("commander");
39
+ const fs = __importStar(require("node:fs"));
40
+ const os = __importStar(require("node:os"));
41
+ const path = __importStar(require("node:path"));
42
+ const agent_1 = require("./agent");
43
+ const config_1 = require("./config");
44
+ const logger_1 = require("./logger");
45
+ const path_utils_1 = require("./path-utils");
46
+ const security_1 = require("./security");
47
+ const tools_1 = require("./tools");
48
+ const tokens_1 = require("./tokens");
49
+ const program = new commander_1.Command();
50
+ program
51
+ .name('ysagc-agent')
52
+ .description('Local execution agent for ysagc (state-agnostic, safety-bounded)')
53
+ .version(agent_1.AGENT_VERSION)
54
+ .option('--server <url>', 'platform WebSocket URL for the agent channel')
55
+ .option('--token <token>', 'device/agent auth token')
56
+ .option('--device-id <id>', 'stable device identifier')
57
+ .option('--root <dir>', 'authorisation root for all file operations')
58
+ .option('--mode <mode>', 'permission mode: supervise | smart | auto', 'smart')
59
+ .option('--permission-preset <preset>', 'permission preset: workspace-write | read-only | danger-full-access', 'workspace-write')
60
+ .option('--web', 'enable the local web_search (stub) tool')
61
+ .option('--timeout <ms>', 'command timeout in milliseconds')
62
+ .option('--max-bytes <n>', 'per-stream output cap in bytes')
63
+ .option('--log-level <level>', 'silent | error | warn | info | debug', 'info')
64
+ .option('--selftest', 'run a local self-test and exit');
65
+ program.parse(process.argv);
66
+ const opts = program.opts();
67
+ function toInt(value) {
68
+ if (value === undefined || value === null)
69
+ return undefined;
70
+ const n = Number(value);
71
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : undefined;
72
+ }
73
+ function asStr(value) {
74
+ return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
75
+ }
76
+ function shutdown(handle, signal) {
77
+ // eslint-disable-next-line no-console
78
+ console.log(`\n${signal} received; shutting down`);
79
+ handle?.stop();
80
+ process.exit(0);
81
+ }
82
+ async function main() {
83
+ if (opts.selftest) {
84
+ const results = await runSelfTest();
85
+ runAndPrintSelfTest(results);
86
+ return;
87
+ }
88
+ try {
89
+ const config = (0, config_1.loadConfig)({
90
+ server: asStr(opts.server),
91
+ token: asStr(opts.token),
92
+ deviceId: asStr(opts.deviceId),
93
+ root: asStr(opts.root),
94
+ mode: asStr(opts.mode),
95
+ preset: asStr(opts.permissionPreset),
96
+ web: opts.web === true ? true : undefined,
97
+ timeoutMs: toInt(opts.timeout),
98
+ maxBytes: toInt(opts.maxBytes),
99
+ logLevel: asStr(opts.logLevel),
100
+ });
101
+ const log = new logger_1.Logger({ level: config.logLevel, name: 'cli' });
102
+ log.info('agent config', (0, config_1.describeConfig)(config));
103
+ const handle = (0, agent_1.startAgent)(config);
104
+ process.on('SIGINT', () => shutdown(handle, 'SIGINT'));
105
+ process.on('SIGTERM', () => shutdown(handle, 'SIGTERM'));
106
+ }
107
+ catch (err) {
108
+ if (err instanceof config_1.ConfigError) {
109
+ // eslint-disable-next-line no-console
110
+ console.error(`\nConfiguration error: ${err.message}\n`);
111
+ // eslint-disable-next-line no-console
112
+ console.error('Run `ysagc-agent --help` for usage, or set the matching environment variables.');
113
+ process.exit(1);
114
+ }
115
+ throw err;
116
+ }
117
+ }
118
+ function runAndPrintSelfTest(results) {
119
+ let failed = 0;
120
+ for (const r of results) {
121
+ const status = r.ok ? 'PASS' : 'FAIL';
122
+ const detail = [r.details, r.error].filter(Boolean).join(' — ');
123
+ // eslint-disable-next-line no-console
124
+ console.log(`[${status}] ${r.name}${detail ? ` — ${detail}` : ''}`);
125
+ if (!r.ok)
126
+ failed += 1;
127
+ }
128
+ // eslint-disable-next-line no-console
129
+ console.log(`\nSelf-test: ${results.length - failed}/${results.length} passed.`);
130
+ process.exit(failed === 0 ? 0 : 1);
131
+ }
132
+ /**
133
+ * Run a local smoke test of path safety, danger-command detection, sensitive
134
+ * path detection, secret masking and the tool registry. Returns structured
135
+ * PASS/FAIL results; the CLI prints them and picks the exit code.
136
+ */
137
+ async function runSelfTest() {
138
+ const results = [];
139
+ const add = (name, ok, details, error) => {
140
+ results.push({ name, ok, details, error });
141
+ };
142
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ysagc-test-'));
143
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'ysagc-outside-'));
144
+ const sync = (name, fn) => {
145
+ try {
146
+ add(name, fn());
147
+ }
148
+ catch (err) {
149
+ add(name, false, undefined, err instanceof Error ? err.message : String(err));
150
+ }
151
+ };
152
+ const asyncCheck = async (name, fn) => {
153
+ try {
154
+ add(name, await fn());
155
+ }
156
+ catch (err) {
157
+ add(name, false, undefined, err instanceof Error ? err.message : String(err));
158
+ }
159
+ };
160
+ try {
161
+ // --- path safety ------------------------------------------------------
162
+ sync('canonicalize resolves ..', () => {
163
+ const cwd = dir;
164
+ const resolved = (0, path_utils_1.canonicalize)('sub/dir/../file.txt', cwd);
165
+ return resolved === path.resolve(dir, 'sub', 'file.txt');
166
+ });
167
+ sync('isWithinRoot: child inside root', () => (0, path_utils_1.isWithinRoot)(dir, path.join(dir, 'a', 'b')));
168
+ sync('isWithinRoot: .. escape rejected', () => !(0, path_utils_1.isWithinRoot)(dir, path.join(dir, '..', 'escape')));
169
+ sync('isWithinRoot: equal root rejected when writing', () => !(0, path_utils_1.isWithinRoot)(dir, dir));
170
+ sync('isWithinRoot: equal root allowed when reading', () => (0, path_utils_1.isWithinRoot)(dir, dir, { allowEqual: true }));
171
+ sync('windows reserved name detected', () => (0, path_utils_1.isWindowsReservedName)('CON'));
172
+ sync('non-reserved name ok', () => !(0, path_utils_1.isWindowsReservedName)('hello'));
173
+ sync('symlink escape rejected', () => {
174
+ try {
175
+ const link = path.join(dir, 'linkdir');
176
+ fs.symlinkSync(outside, link, 'junction');
177
+ return !(0, path_utils_1.isWithinRoot)(dir, path.join(link, 'file.txt'));
178
+ }
179
+ catch {
180
+ return true; // skipped when symlinks are unsupported (e.g. unprivileged Windows)
181
+ }
182
+ });
183
+ // --- danger detection -------------------------------------------------
184
+ const dangerCases = [
185
+ ['rm -rf /tmp/foo', true],
186
+ ['sudo apt-get update', true],
187
+ ['git reset --hard', true],
188
+ ['format d:', true],
189
+ ['echo hello world', false],
190
+ ['ls -la', false],
191
+ ['cat package.json', false],
192
+ ];
193
+ for (const [cmd, shouldBlock] of dangerCases) {
194
+ const a = (0, security_1.isDangerCommand)(cmd);
195
+ add(`danger: ${cmd}`, a.danger === shouldBlock, `severity=${a.severity}`);
196
+ }
197
+ // --- sensitive path ---------------------------------------------------
198
+ sync('sensitive /etc/passwd blocked', () => (0, security_1.isSensitivePath)('/etc/passwd'));
199
+ sync('sensitive .env blocked', () => (0, security_1.isSensitivePath)('/some/root/.env'));
200
+ sync('normal file allowed', () => !(0, security_1.isSensitivePath)(path.join(dir, 'x.txt')));
201
+ // --- secret masking ---------------------------------------------------
202
+ sync('maskSecrets redacts sk- keys', () => {
203
+ const masked = (0, security_1.maskSecrets)('key=sk-abcdefghijklmnopqrstuvwxyz123456 extra');
204
+ return !/sk-[a-f0-9]{6,}/i.test(masked) && masked.includes('***');
205
+ });
206
+ sync('maskSecrets redacts bearer/JWT', () => {
207
+ const masked = (0, security_1.maskSecrets)('Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIn0.sig');
208
+ return !masked.includes('eyJhbGci') && masked.includes('***');
209
+ });
210
+ // --- tools ------------------------------------------------------------
211
+ const logger = new logger_1.Logger({ level: 'error', name: 'selftest' });
212
+ const registry = (0, tools_1.createToolRegistry)({
213
+ root: dir,
214
+ mode: 'smart',
215
+ permissionPreset: 'workspace-write',
216
+ webEnabled: false,
217
+ timeoutMs: 10000,
218
+ maxBytes: 8000,
219
+ logger,
220
+ });
221
+ await asyncCheck('write_file', async () => {
222
+ const w = await registry.dispatch('write_file', { path: 'hello.txt', content: 'hello world' });
223
+ return w.ok && w.result?.bytesWritten === 11;
224
+ });
225
+ await asyncCheck('read_file', async () => {
226
+ const r = await registry.dispatch('read_file', { path: 'hello.txt', maxBytes: 100 });
227
+ return r.ok && String(r.result?.content ?? '').includes('hello world');
228
+ });
229
+ await asyncCheck('list_dir', async () => {
230
+ const l = await registry.dispatch('list_dir', { path: '.', depth: 1 });
231
+ const entries = l.result?.entries ?? [];
232
+ return l.ok && entries.some((entry) => entry.name === 'hello.txt');
233
+ });
234
+ await asyncCheck('edit_file', async () => {
235
+ const e = await registry.dispatch('edit_file', { path: 'hello.txt', oldText: 'world', newText: 'there' });
236
+ return e.ok && e.result?.replacements === 1;
237
+ });
238
+ await asyncCheck('write_file rejects outside root', async () => {
239
+ const out = await registry.dispatch('write_file', { path: '../escape.txt', content: 'nope' });
240
+ return !out.ok;
241
+ });
242
+ await asyncCheck('generate', async () => {
243
+ const g = await registry.dispatch('generate', { template: 'node', name: 'myproj' });
244
+ const files = g.result?.files ?? [];
245
+ return g.ok && files.some((f) => f.path.includes('myproj/package.json'));
246
+ });
247
+ await asyncCheck('run_command echo', async () => {
248
+ const c = await registry.dispatch('run_command', { cmd: 'echo hello from selftest' });
249
+ const stdout = String(c.result?.stdout ?? '');
250
+ return c.ok && stdout.includes('hello from selftest');
251
+ });
252
+ // --- guarded gate (preExecute) ---------------------------------------
253
+ await asyncCheck('read-only preset blocks write_file', async () => {
254
+ const ro = (0, tools_1.createToolRegistry)({
255
+ root: dir,
256
+ mode: 'smart',
257
+ permissionPreset: 'read-only',
258
+ webEnabled: false,
259
+ timeoutMs: 10000,
260
+ maxBytes: 8000,
261
+ logger,
262
+ });
263
+ const w = await ro.dispatch('write_file', { path: 'blocked.txt', content: 'nope' });
264
+ return !w.ok && String(w.error).includes('read-only');
265
+ });
266
+ await asyncCheck('read-only preset allows read_file', async () => {
267
+ const ro = (0, tools_1.createToolRegistry)({
268
+ root: dir,
269
+ mode: 'smart',
270
+ permissionPreset: 'read-only',
271
+ webEnabled: false,
272
+ timeoutMs: 10000,
273
+ maxBytes: 8000,
274
+ logger,
275
+ });
276
+ const r = await ro.dispatch('read_file', { path: 'hello.txt', maxBytes: 100 });
277
+ return r.ok;
278
+ });
279
+ await asyncCheck('danger command needs approval in workspace-write', async () => {
280
+ const r = await registry.dispatch('run_command', { cmd: 'sudo rm -rf /tmp/x' });
281
+ return !r.ok && r.needsApproval === true;
282
+ });
283
+ // --- skills (no-op when none configured) ------------------------------
284
+ await asyncCheck('skill tool no-op when none configured', async () => {
285
+ const s = await registry.dispatch('skill', {});
286
+ return s.ok && s.result?.loaded === false;
287
+ });
288
+ await asyncCheck('skill tool loads a configured skill', async () => {
289
+ const skillDir = path.join(dir, '.dsh', 'skills');
290
+ fs.mkdirSync(skillDir, { recursive: true });
291
+ fs.writeFileSync(path.join(skillDir, 'demo.md'), '# Demo skill\n\nDo the thing.\n', 'utf8');
292
+ const s = await registry.dispatch('skill', { name: 'demo' });
293
+ const res = s.result;
294
+ return s.ok && res.loaded === true && String(res.content ?? '').includes('Do the thing');
295
+ });
296
+ // --- token meter ------------------------------------------------------
297
+ sync('countTextTokens estimates a positive count', () => {
298
+ const n = (0, tokens_1.countTextTokens)('hello world, this is a token estimate check');
299
+ return Number.isInteger(n) && n > 0;
300
+ });
301
+ }
302
+ finally {
303
+ try {
304
+ fs.rmSync(dir, { recursive: true, force: true });
305
+ fs.rmSync(outside, { recursive: true, force: true });
306
+ }
307
+ catch {
308
+ /* best-effort cleanup */
309
+ }
310
+ }
311
+ return results;
312
+ }
313
+ if (require.main === module) {
314
+ main().catch((err) => {
315
+ // eslint-disable-next-line no-console
316
+ console.error(`Fatal error: ${err instanceof Error ? err.message : String(err)}`);
317
+ process.exit(1);
318
+ });
319
+ }
320
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { Logger, type LogLevel } from './logger';
2
+ export type PermissionMode = 'supervise' | 'smart' | 'auto';
3
+ /** Sandbox-mode × approval preset governing the tool gate. */
4
+ export type PermissionPreset = 'workspace-write' | 'read-only' | 'danger-full-access';
5
+ export interface AgentConfig {
6
+ /** Platform WebSocket URL for the agent channel. */
7
+ server: string;
8
+ /** Device/agent auth token presented in the hello frame. */
9
+ token: string;
10
+ /** Stable device identifier sent in the hello frame. */
11
+ deviceId: string;
12
+ /** Authorisation root; every file operation must stay inside it. */
13
+ root: string;
14
+ /** Permission policy for shell commands. */
15
+ mode: PermissionMode;
16
+ /** Sandbox-mode × approval preset used by the guarded tool gate. */
17
+ permissionPreset: PermissionPreset;
18
+ /** Whether the local web_search tool is enabled. */
19
+ web: boolean;
20
+ /** Command timeout in milliseconds. */
21
+ timeoutMs: number;
22
+ /** Per-stream output cap in bytes before it is truncated/spilled. */
23
+ maxBytes: number;
24
+ /** Log verbosity. */
25
+ logLevel: LogLevel;
26
+ /** Passed in the hello frame to let the platform route the agent. */
27
+ platform: string;
28
+ }
29
+ export interface ConfigOverrides {
30
+ server?: string;
31
+ token?: string;
32
+ deviceId?: string;
33
+ root?: string;
34
+ mode?: string;
35
+ preset?: string;
36
+ web?: boolean;
37
+ timeoutMs?: number;
38
+ maxBytes?: number;
39
+ logLevel?: string;
40
+ }
41
+ export declare class ConfigError extends Error {
42
+ constructor(message: string);
43
+ }
44
+ /**
45
+ * Resolve an {@link AgentConfig} from defaults, environment variables and CLI
46
+ * overrides (in that order of precedence). Environment variables are read from
47
+ * WS_URL / YSAGC_TOKEN / DEVICE_ID / WORKSPACE_ROOT / PERMISSION_MODE /
48
+ * YSAGC_PERMISSION_PRESET / YSAGC_WEB / YSAGC_TIMEOUT / YSAGC_MAX_BYTES /
49
+ * YSAGC_LOG_LEVEL.
50
+ */
51
+ export declare function loadConfig(overrides?: ConfigOverrides): AgentConfig;
52
+ /** Validate the subset of config required to start the agent. Throws a
53
+ * {@link ConfigError} with a friendly message for missing values. */
54
+ export declare function validateConfig(config: AgentConfig): void;
55
+ /** Build a logger from a config. */
56
+ export declare function loggerFromConfig(config: AgentConfig): Logger;
57
+ export declare function describeConfig(config: AgentConfig): Record<string, unknown>;
58
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,8DAA8D;AAC9D,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAStF,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,EAAE,cAAc,CAAC;IACrB,oEAAoE;IACpE,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,oDAAoD;IACpD,GAAG,EAAE,OAAO,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAwDD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,GAAE,eAAoB,GAAG,WAAW,CA4BvE;AAiBD;qEACqE;AACrE,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAYxD;AAED,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc3E"}
package/dist/config.js ADDED
@@ -0,0 +1,152 @@
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.ConfigError = void 0;
7
+ exports.loadConfig = loadConfig;
8
+ exports.validateConfig = validateConfig;
9
+ exports.loggerFromConfig = loggerFromConfig;
10
+ exports.describeConfig = describeConfig;
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const node_os_1 = __importDefault(require("node:os"));
13
+ const logger_1 = require("./logger");
14
+ const VALID_MODES = new Set(['supervise', 'smart', 'auto']);
15
+ const VALID_PRESETS = new Set([
16
+ 'workspace-write',
17
+ 'read-only',
18
+ 'danger-full-access',
19
+ ]);
20
+ class ConfigError extends Error {
21
+ constructor(message) {
22
+ super(message);
23
+ this.name = 'ConfigError';
24
+ }
25
+ }
26
+ exports.ConfigError = ConfigError;
27
+ const DEFAULT_TIMEOUT_MS = 120000;
28
+ const DEFAULT_MAX_BYTES = 64000;
29
+ function readEnv(name) {
30
+ const v = process.env[name];
31
+ return v && v.trim() !== '' ? v.trim() : undefined;
32
+ }
33
+ function parseMode(value, fallback) {
34
+ if (!value)
35
+ return fallback;
36
+ const v = value.toLowerCase();
37
+ if (VALID_MODES.has(v))
38
+ return v;
39
+ throw new ConfigError(`Invalid permission mode "${value}". Expected one of: supervise, smart, auto.`);
40
+ }
41
+ function parsePreset(value, fallback) {
42
+ if (!value)
43
+ return fallback;
44
+ const v = value.toLowerCase();
45
+ if (VALID_PRESETS.has(v))
46
+ return v;
47
+ throw new ConfigError(`Invalid permission preset "${value}". Expected one of: workspace-write, read-only, danger-full-access.`);
48
+ }
49
+ function parsePosInt(value, fallback, name) {
50
+ if (!value)
51
+ return fallback;
52
+ const n = Number(value);
53
+ if (!Number.isFinite(n) || n <= 0) {
54
+ throw new ConfigError(`Invalid ${name}: "${value}" must be a positive integer.`);
55
+ }
56
+ return Math.floor(n);
57
+ }
58
+ function parseLogLevel(value) {
59
+ if (!value)
60
+ return 'info';
61
+ const v = value.toLowerCase();
62
+ if (v === 'silent' || v === 'error' || v === 'warn' || v === 'info' || v === 'debug') {
63
+ return v;
64
+ }
65
+ throw new ConfigError(`Invalid log level "${value}". Expected: silent, error, warn, info, debug.`);
66
+ }
67
+ function resolveRoot(raw) {
68
+ if (!raw)
69
+ return process.cwd();
70
+ // Expand a leading ~ to the home directory at configuration time only; the
71
+ // path-utils canonicaliser intentionally does not expand `~`.
72
+ const t = raw.trim();
73
+ if (t === '~')
74
+ return node_os_1.default.homedir();
75
+ if (t.startsWith('~/') || t.startsWith('~\\'))
76
+ return node_path_1.default.join(node_os_1.default.homedir(), t.slice(2));
77
+ return node_path_1.default.resolve(t);
78
+ }
79
+ /**
80
+ * Resolve an {@link AgentConfig} from defaults, environment variables and CLI
81
+ * overrides (in that order of precedence). Environment variables are read from
82
+ * WS_URL / YSAGC_TOKEN / DEVICE_ID / WORKSPACE_ROOT / PERMISSION_MODE /
83
+ * YSAGC_PERMISSION_PRESET / YSAGC_WEB / YSAGC_TIMEOUT / YSAGC_MAX_BYTES /
84
+ * YSAGC_LOG_LEVEL.
85
+ */
86
+ function loadConfig(overrides = {}) {
87
+ const mode = parseMode(overrides.mode ?? readEnv('PERMISSION_MODE'), 'smart');
88
+ const preset = parsePreset(overrides.preset ?? readEnv('YSAGC_PERMISSION_PRESET'), 'workspace-write');
89
+ return {
90
+ server: overrides.server ?? readEnv('WS_URL') ?? '',
91
+ token: overrides.token ?? readEnv('YSAGC_TOKEN') ?? '',
92
+ deviceId: overrides.deviceId ??
93
+ readEnv('DEVICE_ID') ??
94
+ defaultDeviceId(),
95
+ root: resolveRoot(overrides.root ?? readEnv('WORKSPACE_ROOT')),
96
+ mode,
97
+ permissionPreset: preset,
98
+ web: overrides.web ?? truthy(readEnv('YSAGC_WEB')),
99
+ timeoutMs: parsePosInt(overrides.timeoutMs != null ? String(overrides.timeoutMs) : readEnv('YSAGC_TIMEOUT'), DEFAULT_TIMEOUT_MS, 'timeout'),
100
+ maxBytes: parsePosInt(overrides.maxBytes != null ? String(overrides.maxBytes) : readEnv('YSAGC_MAX_BYTES'), DEFAULT_MAX_BYTES, 'max-bytes'),
101
+ logLevel: parseLogLevel(overrides.logLevel ?? readEnv('YSAGC_LOG_LEVEL')),
102
+ platform: 'node',
103
+ };
104
+ }
105
+ function truthy(value) {
106
+ if (!value)
107
+ return false;
108
+ return /^(1|true|yes|on)$/i.test(value);
109
+ }
110
+ /** A stable-ish default device id derived from the hostname. */
111
+ function defaultDeviceId() {
112
+ try {
113
+ const host = node_os_1.default.hostname();
114
+ return `agent-${host || 'unknown'}-${process.pid}`;
115
+ }
116
+ catch {
117
+ return `agent-${process.pid}`;
118
+ }
119
+ }
120
+ /** Validate the subset of config required to start the agent. Throws a
121
+ * {@link ConfigError} with a friendly message for missing values. */
122
+ function validateConfig(config) {
123
+ if (!config.server || config.server.trim() === '') {
124
+ throw new ConfigError('Missing platform WebSocket URL. Pass --server <url> or set WS_URL.');
125
+ }
126
+ if (!config.token || config.token.trim() === '') {
127
+ throw new ConfigError('Missing auth token. Pass --token <token> or set YSAGC_TOKEN.');
128
+ }
129
+ if (!config.deviceId || config.deviceId.trim() === '') {
130
+ throw new ConfigError('Missing device id. Pass --device-id <id> or set DEVICE_ID.');
131
+ }
132
+ }
133
+ /** Build a logger from a config. */
134
+ function loggerFromConfig(config) {
135
+ return new logger_1.Logger({ level: config.logLevel, name: 'ysagc-agent' });
136
+ }
137
+ function describeConfig(config) {
138
+ return {
139
+ server: config.server,
140
+ deviceId: config.deviceId,
141
+ root: config.root,
142
+ mode: config.mode,
143
+ permissionPreset: config.permissionPreset,
144
+ web: config.web,
145
+ timeoutMs: config.timeoutMs,
146
+ maxBytes: config.maxBytes,
147
+ logLevel: config.logLevel,
148
+ platform: config.platform,
149
+ // token deliberately omitted — never log it.
150
+ };
151
+ }
152
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface CommandResult {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ durationMs: number;
6
+ /** True when the process was killed because the timeout elapsed. */
7
+ timedOut: boolean;
8
+ /** True when a stream was truncated to the max-bytes cap. */
9
+ truncated: boolean;
10
+ /** Path to a temp file holding the full stdout when truncated. */
11
+ stdoutFile?: string;
12
+ /** Path to a temp file holding the full stderr when truncated. */
13
+ stderrFile?: string;
14
+ }
15
+ export interface RunCommandOptions {
16
+ command: string;
17
+ cwd?: string;
18
+ timeoutMs?: number;
19
+ maxBytes?: number;
20
+ /** Extra environment variables (merged over the default, sanitised env). */
21
+ env?: NodeJS.ProcessEnv;
22
+ /** Abort signal; aborting kills the process tree. */
23
+ signal?: AbortSignal;
24
+ /** Force shell mode (default: auto-detect per platform / metacharacters). */
25
+ shell?: boolean;
26
+ }
27
+ /**
28
+ * Split a simple command string into argv (respects single/double quotes and
29
+ * backslash escape). Do not use for commands with shell metacharacters.
30
+ */
31
+ export declare function tokenize(input: string): string[];
32
+ /** Decide whether a command must run through a shell. On Windows the shell is
33
+ * always used because many common commands are cmd builtins. */
34
+ export declare function shouldUseShell(command: string, override?: boolean): boolean;
35
+ /** Build a sanitised env so agent/platform credentials never reach child
36
+ * processes. Only a curated set of safe, non-secret variables are kept; any
37
+ * key that looks like a credential, or any YSAGC_* / WS_URL value, is dropped.
38
+ * Caller-supplied extra vars are kept only when they are not credentials. */
39
+ export declare function sanitizeEnv(base: NodeJS.ProcessEnv, extra?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
40
+ /**
41
+ * Run a command, capturing stdout/stderr (spilled to a temp file when it
42
+ * exceeds `maxBytes`), enforcing a timeout, and killing the process tree on
43
+ * timeout or abort. Non-zero exit codes are returned, not thrown. Output is
44
+ * captured through file-descriptor redirection rather than a pipe so it is
45
+ * robust on constrained platforms and for very large outputs.
46
+ */
47
+ export declare function runCommand(opts: RunCommandOptions): Promise<CommandResult>;
48
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoCD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsChD;AAED;gEACgE;AAChE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3E;AA0DD;;;6EAG6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAejG;AA2DD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkM1E"}