youmd 0.8.15 → 0.8.16

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.
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-machine remote command executor (CROSS-MACHINE-AGENTS.md §5 + §7).
4
+ *
5
+ * This is the HARD security boundary for Phase 1. A remote agent can only ever
6
+ * trigger the fixed, typed action table below — never arbitrary shell, never an
7
+ * interpolated command string, never a path outside a known You.md project root.
8
+ *
9
+ * Security guarantees implemented here:
10
+ * 1. WHITELIST ONLY — `action` must be a key of ACTION_SPECS. Anything else is
11
+ * rejected before any process is spawned.
12
+ * 2. NO SHELL, NO EVAL — every action runs `git`/process via execFile with an
13
+ * explicit argv ARRAY and `shell: false`. Arguments are never concatenated
14
+ * into a command string, so shell metacharacters in args are inert.
15
+ * 3. PATH CONTAINMENT — the project directory is resolved ONLY against the
16
+ * caller's known You.md workspace/project roots (lib/project.ts). Any
17
+ * resolved path that escapes those roots (`..`, symlinks, absolute paths)
18
+ * is rejected.
19
+ * 4. BOUNDED TIMEOUT — every spawn has a per-action timeout; runaway commands
20
+ * are killed.
21
+ * 5. OUTPUT REDACTION + TRUNCATION — stdout/stderr are scrubbed of
22
+ * secret-looking tokens and truncated before they leave the machine.
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || (function () {
41
+ var ownKeys = function(o) {
42
+ ownKeys = Object.getOwnPropertyNames || function (o) {
43
+ var ar = [];
44
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
45
+ return ar;
46
+ };
47
+ return ownKeys(o);
48
+ };
49
+ return function (mod) {
50
+ if (mod && mod.__esModule) return mod;
51
+ var result = {};
52
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
53
+ __setModuleDefault(result, mod);
54
+ return result;
55
+ };
56
+ })();
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ exports.ACTION_SPECS = exports.ALLOWED_REMOTE_ACTIONS = void 0;
59
+ exports.isAllowedRemoteAction = isAllowedRemoteAction;
60
+ exports.redactSecrets = redactSecrets;
61
+ exports.truncateOutput = truncateOutput;
62
+ exports.resolveProjectDir = resolveProjectDir;
63
+ exports.executeRemoteAction = executeRemoteAction;
64
+ const fs = __importStar(require("fs"));
65
+ const os = __importStar(require("os"));
66
+ const path = __importStar(require("path"));
67
+ const child_process_1 = require("child_process");
68
+ const project_1 = require("./project");
69
+ /** The exact set of actions a remote machine may trigger. The keys ARE the
70
+ * security boundary — extending it requires a code change + review. */
71
+ exports.ALLOWED_REMOTE_ACTIONS = [
72
+ "git.status",
73
+ "git.last_activity",
74
+ "git.commit_push",
75
+ "git.pull",
76
+ "agent.status",
77
+ ];
78
+ exports.ACTION_SPECS = {
79
+ "git.status": {
80
+ needsProject: true,
81
+ mutating: "no",
82
+ timeoutMs: 20000,
83
+ description: "git status --porcelain + branch/ahead/behind/last-commit",
84
+ },
85
+ "git.last_activity": {
86
+ needsProject: true,
87
+ mutating: "no",
88
+ timeoutMs: 20000,
89
+ description: "last commit metadata for the project",
90
+ },
91
+ "git.commit_push": {
92
+ needsProject: true,
93
+ mutating: "reversible",
94
+ timeoutMs: 120000,
95
+ description: "git add -A && commit -m <msg> && push on the current branch",
96
+ },
97
+ "git.pull": {
98
+ needsProject: true,
99
+ mutating: "reversible",
100
+ timeoutMs: 120000,
101
+ description: "git pull --ff-only",
102
+ },
103
+ "agent.status": {
104
+ needsProject: false,
105
+ mutating: "no",
106
+ timeoutMs: 15000,
107
+ description: "report host/runtime + last agent-bus heartbeat hint",
108
+ },
109
+ };
110
+ function isAllowedRemoteAction(action) {
111
+ return (typeof action === "string" &&
112
+ exports.ALLOWED_REMOTE_ACTIONS.includes(action));
113
+ }
114
+ // ─── Redaction + truncation ────────────────────────────────────────────────────
115
+ const MAX_OUTPUT_CHARS = 4000;
116
+ /** Patterns that look like credentials; redact their values, not the whole line. */
117
+ const SECRET_PATTERNS = [
118
+ // You.md / common API keys
119
+ /\bym_[A-Za-z0-9]{20,}\b/g,
120
+ /\bsk-[A-Za-z0-9]{16,}\b/g,
121
+ /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g,
122
+ /\bAKIA[0-9A-Z]{16}\b/g,
123
+ // KEY=VALUE / TOKEN: value style assignments
124
+ /\b([A-Z0-9_]*(?:SECRET|TOKEN|PASSWORD|PASSWD|APIKEY|API_KEY|PRIVATE_KEY)[A-Z0-9_]*)\s*[:=]\s*\S+/gi,
125
+ // bearer tokens
126
+ /\bBearer\s+[A-Za-z0-9._-]{12,}\b/gi,
127
+ // URLs with embedded credentials (https://user:pass@host)
128
+ /(https?:\/\/)[^/\s:@]+:[^/\s@]+@/gi,
129
+ ];
130
+ function redactSecrets(text) {
131
+ let out = text;
132
+ for (const pattern of SECRET_PATTERNS) {
133
+ out = out.replace(pattern, (match, ...groups) => {
134
+ // Assignment-style: keep the key name, redact the value.
135
+ if (typeof groups[0] === "string" && /[:=]/.test(match)) {
136
+ return `${groups[0]}=***redacted***`;
137
+ }
138
+ // URL credential style: keep scheme, drop user:pass.
139
+ if (typeof groups[0] === "string" && /^https?:\/\/$/.test(groups[0])) {
140
+ return `${groups[0]}***redacted***@`;
141
+ }
142
+ return "***redacted***";
143
+ });
144
+ }
145
+ return out;
146
+ }
147
+ function truncateOutput(text, max = MAX_OUTPUT_CHARS) {
148
+ if (text.length <= max)
149
+ return text;
150
+ return text.slice(0, max) + `\n…[truncated ${text.length - max} chars]`;
151
+ }
152
+ function cleanOutput(stdout, stderr) {
153
+ const combined = [stdout.trim(), stderr.trim()].filter(Boolean).join("\n");
154
+ return truncateOutput(redactSecrets(combined));
155
+ }
156
+ // ─── Path resolution (containment) ─────────────────────────────────────────────
157
+ /**
158
+ * Resolve `project` to an absolute directory that is GUARANTEED to live inside
159
+ * one of the caller's known You.md workspace/project roots. Returns null on any
160
+ * rejection (escape attempt, missing project, no roots). Never throws.
161
+ *
162
+ * Rules:
163
+ * - `project` must be a simple name token — no path separators, no `..`,
164
+ * no leading `~` or `/`. (We resolve names to dirs ourselves.)
165
+ * - The candidate must be a directory whose REAL path (symlinks resolved) is
166
+ * inside a known root's REAL path.
167
+ * - The candidate must look like a real project (git repo or project marker).
168
+ */
169
+ function resolveProjectDir(project, opts = {}) {
170
+ if (typeof project !== "string" || project.trim().length === 0) {
171
+ return { ok: false, reason: "project name is required for this action" };
172
+ }
173
+ const name = project.trim();
174
+ // Reject anything that is not a plain directory-name token. This is the first
175
+ // line of defense against path traversal — we never accept caller-supplied
176
+ // path fragments, only a name we map to a directory ourselves.
177
+ if (/[\\/]/.test(name) || name.includes("..") || name.startsWith("~") || name.startsWith(".")) {
178
+ return { ok: false, reason: `invalid project name: ${name}` };
179
+ }
180
+ const startDir = opts.startDir;
181
+ const roots = new Set();
182
+ // Managed .you/projects root (walk-up) + workspace roots.
183
+ const managedRoot = (0, project_1.findProjectsRoot)(startDir);
184
+ if (managedRoot)
185
+ roots.add(managedRoot);
186
+ for (const wsRoot of (0, project_1.getWorkspaceRootCandidates)(startDir)) {
187
+ roots.add(wsRoot);
188
+ }
189
+ if (roots.size === 0) {
190
+ return { ok: false, reason: "no known You.md project roots on this machine" };
191
+ }
192
+ // Resolve each root to its real path once.
193
+ const realRoots = [];
194
+ for (const root of roots) {
195
+ try {
196
+ realRoots.push(fs.realpathSync.native(root));
197
+ }
198
+ catch {
199
+ // unreadable root — skip
200
+ }
201
+ }
202
+ if (realRoots.length === 0) {
203
+ return { ok: false, reason: "no readable You.md project roots on this machine" };
204
+ }
205
+ // Candidate directories: <root>/<name> for each root, plus the managed
206
+ // store's slugged dir.
207
+ const candidates = [];
208
+ for (const root of roots) {
209
+ candidates.push(path.join(root, name));
210
+ }
211
+ if (managedRoot)
212
+ candidates.push((0, project_1.getProjectDir)(managedRoot, name));
213
+ for (const candidate of candidates) {
214
+ let real;
215
+ try {
216
+ const stat = fs.statSync(candidate);
217
+ if (!stat.isDirectory())
218
+ continue;
219
+ real = fs.realpathSync.native(candidate);
220
+ }
221
+ catch {
222
+ continue;
223
+ }
224
+ // Containment check against REAL root paths — the resolved directory must
225
+ // be inside (or equal to) a known root.
226
+ const contained = realRoots.some((root) => real === root || real.startsWith(root + path.sep));
227
+ if (!contained)
228
+ continue;
229
+ // Must look like an actual project (not just any subdir).
230
+ const isGit = fs.existsSync(path.join(real, ".git"));
231
+ const hasMarker = (0, project_1.getProjectMarkerSignals)(real).length > 0;
232
+ if (!isGit && !hasMarker)
233
+ continue;
234
+ return { ok: true, dir: real };
235
+ }
236
+ return {
237
+ ok: false,
238
+ reason: `project "${name}" not found inside any known You.md project root`,
239
+ };
240
+ }
241
+ /**
242
+ * Run a binary with an explicit argv ARRAY and shell:false. There is no command
243
+ * string anywhere in this path, so caller args cannot be interpreted by a shell.
244
+ */
245
+ function runProcess(file, args, cwd, timeoutMs) {
246
+ return new Promise((resolve) => {
247
+ (0, child_process_1.execFile)(file, args, {
248
+ cwd,
249
+ timeout: timeoutMs,
250
+ shell: false, // explicit: never go through a shell
251
+ maxBuffer: 1024 * 1024 * 4,
252
+ windowsHide: true,
253
+ env: process.env,
254
+ }, (err, stdout, stderr) => {
255
+ const e = err;
256
+ const timedOut = Boolean(e && e.killed && e.signal === "SIGTERM");
257
+ let exitCode = 0;
258
+ if (e) {
259
+ exitCode = typeof e.code === "number" ? e.code : null;
260
+ }
261
+ resolve({
262
+ exitCode,
263
+ stdout: String(stdout ?? ""),
264
+ stderr: String(stderr ?? ""),
265
+ timedOut,
266
+ });
267
+ });
268
+ });
269
+ }
270
+ async function git(args, cwd, timeoutMs) {
271
+ return runProcess("git", args, cwd, timeoutMs);
272
+ }
273
+ // ─── git state probe ───────────────────────────────────────────────────────────
274
+ async function readGitState(cwd, timeoutMs) {
275
+ const state = {
276
+ branch: null,
277
+ dirty: false,
278
+ ahead: 0,
279
+ behind: 0,
280
+ lastCommit: null,
281
+ };
282
+ const branch = await git(["rev-parse", "--abbrev-ref", "HEAD"], cwd, timeoutMs);
283
+ if (branch.exitCode === 0)
284
+ state.branch = branch.stdout.trim() || null;
285
+ const status = await git(["status", "--porcelain"], cwd, timeoutMs);
286
+ if (status.exitCode === 0)
287
+ state.dirty = status.stdout.trim().length > 0;
288
+ const counts = await git(["rev-list", "--left-right", "--count", "@{upstream}...HEAD"], cwd, timeoutMs);
289
+ if (counts.exitCode === 0) {
290
+ const m = counts.stdout.trim().split(/\s+/);
291
+ if (m.length === 2) {
292
+ state.behind = Number(m[0]) || 0;
293
+ state.ahead = Number(m[1]) || 0;
294
+ }
295
+ }
296
+ const last = await git(["log", "-1", "--pretty=%h %s"], cwd, timeoutMs);
297
+ if (last.exitCode === 0)
298
+ state.lastCommit = last.stdout.trim() || null;
299
+ return state;
300
+ }
301
+ function reject(action, reason) {
302
+ return {
303
+ ok: false,
304
+ action,
305
+ exitCode: null,
306
+ output: "",
307
+ error: reason,
308
+ status: "rejected",
309
+ secretValuesExposed: false,
310
+ };
311
+ }
312
+ /**
313
+ * Validate + execute a single remote action. Always resolves (never throws) and
314
+ * always returns a structured result, so the daemon can post a clean
315
+ * remote-command-result for both success and every rejection path.
316
+ */
317
+ async function executeRemoteAction(opts) {
318
+ const actionStr = typeof opts.action === "string" ? opts.action : String(opts.action);
319
+ // 1. Whitelist gate — the hard boundary.
320
+ if (!isAllowedRemoteAction(opts.action)) {
321
+ return reject(actionStr, `action not in whitelist: ${actionStr}`);
322
+ }
323
+ const action = opts.action;
324
+ const spec = exports.ACTION_SPECS[action];
325
+ const args = opts.args && typeof opts.args === "object" ? opts.args : {};
326
+ // 2. Resolve + contain the project dir when required.
327
+ let cwd;
328
+ if (spec.needsProject) {
329
+ const resolved = resolveProjectDir(args.project, { startDir: opts.startDir });
330
+ if (!resolved.ok) {
331
+ return reject(action, resolved.reason);
332
+ }
333
+ cwd = resolved.dir;
334
+ }
335
+ try {
336
+ switch (action) {
337
+ case "git.status":
338
+ case "git.last_activity": {
339
+ const gitState = await readGitState(cwd, spec.timeoutMs);
340
+ const summary = action === "git.last_activity"
341
+ ? `last commit: ${gitState.lastCommit ?? "(none)"}`
342
+ : `branch ${gitState.branch ?? "?"} — ${gitState.dirty ? "dirty" : "clean"}, ahead ${gitState.ahead}, behind ${gitState.behind}`;
343
+ return {
344
+ ok: true,
345
+ action,
346
+ exitCode: 0,
347
+ output: cleanOutput(summary, ""),
348
+ gitState,
349
+ status: "ok",
350
+ secretValuesExposed: false,
351
+ };
352
+ }
353
+ case "git.pull": {
354
+ const pull = await git(["pull", "--ff-only"], cwd, spec.timeoutMs);
355
+ const gitState = await readGitState(cwd, spec.timeoutMs);
356
+ const ok = pull.exitCode === 0;
357
+ return {
358
+ ok,
359
+ action,
360
+ exitCode: pull.exitCode,
361
+ output: cleanOutput(pull.stdout, pull.stderr),
362
+ gitState,
363
+ status: ok ? "ok" : "error",
364
+ ...(ok ? {} : { error: pull.timedOut ? "git pull timed out" : "git pull failed" }),
365
+ secretValuesExposed: false,
366
+ };
367
+ }
368
+ case "git.commit_push": {
369
+ const message = typeof args.message === "string" && args.message.trim().length > 0
370
+ ? args.message.trim()
371
+ : "wip: remote agent commit";
372
+ const outputs = [];
373
+ const add = await git(["add", "-A"], cwd, spec.timeoutMs);
374
+ outputs.push(add.stderr);
375
+ if (add.exitCode !== 0) {
376
+ return {
377
+ ok: false,
378
+ action,
379
+ exitCode: add.exitCode,
380
+ output: cleanOutput("", outputs.join("\n")),
381
+ error: "git add failed",
382
+ status: "error",
383
+ secretValuesExposed: false,
384
+ };
385
+ }
386
+ // commit (-m message passed as a discrete argv element, never a shell arg)
387
+ const commit = await git(["commit", "-m", message], cwd, spec.timeoutMs);
388
+ outputs.push(commit.stdout, commit.stderr);
389
+ // exit 1 with "nothing to commit" is not a failure — still try to push
390
+ // (the branch may be ahead from a previous commit).
391
+ const nothingToCommit = commit.exitCode !== 0 && /nothing to commit/i.test(commit.stdout + commit.stderr);
392
+ const push = await git(["push"], cwd, spec.timeoutMs);
393
+ outputs.push(push.stdout, push.stderr);
394
+ const gitState = await readGitState(cwd, spec.timeoutMs);
395
+ const ok = push.exitCode === 0;
396
+ return {
397
+ ok,
398
+ action,
399
+ exitCode: push.exitCode,
400
+ output: cleanOutput(outputs.join("\n"), nothingToCommit ? "(working tree clean — pushed existing commits)" : ""),
401
+ gitState,
402
+ status: ok ? "ok" : "error",
403
+ ...(ok ? {} : { error: push.timedOut ? "git push timed out" : "git push failed" }),
404
+ secretValuesExposed: false,
405
+ };
406
+ }
407
+ case "agent.status": {
408
+ const summary = [
409
+ `host: ${os.hostname()}`,
410
+ `runtime: node ${process.version}`,
411
+ `pid: ${process.pid}`,
412
+ ].join("\n");
413
+ return {
414
+ ok: true,
415
+ action,
416
+ exitCode: 0,
417
+ output: cleanOutput(summary, ""),
418
+ status: "ok",
419
+ secretValuesExposed: false,
420
+ };
421
+ }
422
+ }
423
+ }
424
+ catch (err) {
425
+ return {
426
+ ok: false,
427
+ action,
428
+ exitCode: null,
429
+ output: cleanOutput("", err instanceof Error ? err.message : String(err)),
430
+ error: "executor exception",
431
+ status: "error",
432
+ secretValuesExposed: false,
433
+ };
434
+ }
435
+ // Unreachable (switch is exhaustive over the whitelist) — defensive reject.
436
+ return reject(action, `unhandled action: ${action}`);
437
+ }
438
+ //# sourceMappingURL=remote-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-executor.js","sourceRoot":"","sources":["../../src/lib/remote-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Monotonic, sortable request-id generator for cross-machine commands
3
+ * (CROSS-MACHINE-AGENTS.md §3/§6). ULID-shaped: `rc_<48-bit-time><random>`.
4
+ *
5
+ * Properties:
6
+ * - lexicographically sortable by creation time (time prefix is fixed-width)
7
+ * - collision-resistant within a process (per-ms monotonic counter) and
8
+ * across processes (CSPRNG suffix)
9
+ * - no Math.random / Date.now correctness footguns: the counter guarantees
10
+ * uniqueness even if two ids are minted in the same millisecond, and the
11
+ * random suffix uses crypto.randomBytes.
12
+ */
13
+ /** Generate a sortable, collision-resistant request id, prefixed `rc_`. */
14
+ export declare function generateRequestId(): string;
15
+ //# sourceMappingURL=request-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.d.ts","sourceRoot":"","sources":["../../src/lib/request-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4BH,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAc1C"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Monotonic, sortable request-id generator for cross-machine commands
4
+ * (CROSS-MACHINE-AGENTS.md §3/§6). ULID-shaped: `rc_<48-bit-time><random>`.
5
+ *
6
+ * Properties:
7
+ * - lexicographically sortable by creation time (time prefix is fixed-width)
8
+ * - collision-resistant within a process (per-ms monotonic counter) and
9
+ * across processes (CSPRNG suffix)
10
+ * - no Math.random / Date.now correctness footguns: the counter guarantees
11
+ * uniqueness even if two ids are minted in the same millisecond, and the
12
+ * random suffix uses crypto.randomBytes.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.generateRequestId = generateRequestId;
16
+ const crypto_1 = require("crypto");
17
+ const CROCKFORD = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
18
+ function encodeBase32(value, length) {
19
+ let out = "";
20
+ let n = value;
21
+ for (let i = 0; i < length; i++) {
22
+ out = CROCKFORD[n % 32] + out;
23
+ n = Math.floor(n / 32);
24
+ }
25
+ return out;
26
+ }
27
+ function randomBase32(length) {
28
+ const bytes = (0, crypto_1.randomBytes)(length);
29
+ let out = "";
30
+ for (let i = 0; i < length; i++) {
31
+ out += CROCKFORD[bytes[i] % 32];
32
+ }
33
+ return out;
34
+ }
35
+ let lastTime = 0;
36
+ let counter = 0;
37
+ /** Generate a sortable, collision-resistant request id, prefixed `rc_`. */
38
+ function generateRequestId() {
39
+ let now = Date.now();
40
+ if (now === lastTime) {
41
+ counter += 1;
42
+ }
43
+ else {
44
+ lastTime = now;
45
+ counter = 0;
46
+ }
47
+ // 10-char base32 time component (48-bit ms timestamp, ULID-style).
48
+ const time = encodeBase32(now, 10);
49
+ // 3-char monotonic counter + 8-char CSPRNG suffix.
50
+ const seq = encodeBase32(counter % (32 * 32 * 32), 3);
51
+ const rand = randomBase32(8);
52
+ return `rc_${time}${seq}${rand}`;
53
+ }
54
+ //# sourceMappingURL=request-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.js","sourceRoot":"","sources":["../../src/lib/request-id.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA6BH,8CAcC;AAzCD,mCAAqC;AAErC,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAErD,SAAS,YAAY,CAAC,KAAa,EAAE,MAAc;IACjD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;QAC9B,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,KAAK,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,2EAA2E;AAC3E,SAAgB,iBAAiB;IAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,GAAG,CAAC;QACf,OAAO,GAAG,CAAC,CAAC;IACd,CAAC;IACD,mEAAmE;IACnE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,mDAAmD;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/mcp/registry.ts"],"names":[],"mappings":"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"}