mandala-computer-mcp 0.4.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 (109) hide show
  1. package/README.md +450 -29
  2. package/dist/api.d.ts +12 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +160 -15
  5. package/dist/api.js.map +1 -1
  6. package/dist/artifacts.d.ts +63 -0
  7. package/dist/artifacts.d.ts.map +1 -0
  8. package/dist/artifacts.js +81 -0
  9. package/dist/artifacts.js.map +1 -0
  10. package/dist/cli.d.ts +4 -0
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +35 -21
  13. package/dist/cli.js.map +1 -1
  14. package/dist/credentials.d.ts +33 -0
  15. package/dist/credentials.d.ts.map +1 -0
  16. package/dist/credentials.js +395 -0
  17. package/dist/credentials.js.map +1 -0
  18. package/dist/errors.d.ts +29 -9
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +71 -34
  21. package/dist/errors.js.map +1 -1
  22. package/dist/executions.d.ts +43 -0
  23. package/dist/executions.d.ts.map +1 -0
  24. package/dist/executions.js +162 -0
  25. package/dist/executions.js.map +1 -0
  26. package/dist/format.d.ts +11 -11
  27. package/dist/format.d.ts.map +1 -1
  28. package/dist/format.js +81 -15
  29. package/dist/format.js.map +1 -1
  30. package/dist/http.d.ts.map +1 -1
  31. package/dist/http.js +4 -0
  32. package/dist/http.js.map +1 -1
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/paths.d.ts +40 -0
  38. package/dist/paths.d.ts.map +1 -1
  39. package/dist/paths.js +50 -0
  40. package/dist/paths.js.map +1 -1
  41. package/dist/results.d.ts +97 -0
  42. package/dist/results.d.ts.map +1 -0
  43. package/dist/results.js +263 -0
  44. package/dist/results.js.map +1 -0
  45. package/dist/server.d.ts +3 -2
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +60 -9
  48. package/dist/server.js.map +1 -1
  49. package/dist/stdio.d.ts +5 -1
  50. package/dist/stdio.d.ts.map +1 -1
  51. package/dist/stdio.js +10 -4
  52. package/dist/stdio.js.map +1 -1
  53. package/dist/tool-filters.d.ts +38 -0
  54. package/dist/tool-filters.d.ts.map +1 -0
  55. package/dist/tool-filters.js +129 -0
  56. package/dist/tool-filters.js.map +1 -0
  57. package/dist/tools/account.d.ts +3 -0
  58. package/dist/tools/account.d.ts.map +1 -0
  59. package/dist/tools/account.js +122 -0
  60. package/dist/tools/account.js.map +1 -0
  61. package/dist/tools/activities.d.ts +3 -0
  62. package/dist/tools/activities.d.ts.map +1 -0
  63. package/dist/tools/activities.js +140 -0
  64. package/dist/tools/activities.js.map +1 -0
  65. package/dist/tools/agent.d.ts.map +1 -1
  66. package/dist/tools/agent.js +21 -9
  67. package/dist/tools/agent.js.map +1 -1
  68. package/dist/tools/artifacts.d.ts +3 -0
  69. package/dist/tools/artifacts.d.ts.map +1 -0
  70. package/dist/tools/artifacts.js +97 -0
  71. package/dist/tools/artifacts.js.map +1 -0
  72. package/dist/tools/chat.d.ts +6 -0
  73. package/dist/tools/chat.d.ts.map +1 -0
  74. package/dist/tools/chat.js +192 -0
  75. package/dist/tools/chat.js.map +1 -0
  76. package/dist/tools/computers.d.ts.map +1 -1
  77. package/dist/tools/computers.js +18 -7
  78. package/dist/tools/computers.js.map +1 -1
  79. package/dist/tools/directory.d.ts +13 -0
  80. package/dist/tools/directory.d.ts.map +1 -0
  81. package/dist/tools/directory.js +88 -0
  82. package/dist/tools/directory.js.map +1 -0
  83. package/dist/tools/executions.d.ts +3 -0
  84. package/dist/tools/executions.d.ts.map +1 -0
  85. package/dist/tools/executions.js +87 -0
  86. package/dist/tools/executions.js.map +1 -0
  87. package/dist/tools/guest.d.ts.map +1 -1
  88. package/dist/tools/guest.js +50 -15
  89. package/dist/tools/guest.js.map +1 -1
  90. package/dist/tools/results.d.ts +30 -0
  91. package/dist/tools/results.d.ts.map +1 -0
  92. package/dist/tools/results.js +106 -0
  93. package/dist/tools/results.js.map +1 -0
  94. package/dist/tools/secrets.d.ts +58 -0
  95. package/dist/tools/secrets.d.ts.map +1 -0
  96. package/dist/tools/secrets.js +204 -0
  97. package/dist/tools/secrets.js.map +1 -0
  98. package/dist/tools/signals.d.ts +3 -0
  99. package/dist/tools/signals.d.ts.map +1 -0
  100. package/dist/tools/signals.js +116 -0
  101. package/dist/tools/signals.js.map +1 -0
  102. package/dist/tools/snapshots.d.ts.map +1 -1
  103. package/dist/tools/snapshots.js +44 -8
  104. package/dist/tools/snapshots.js.map +1 -1
  105. package/dist/tools/ssh.d.ts +3 -0
  106. package/dist/tools/ssh.d.ts.map +1 -0
  107. package/dist/tools/ssh.js +186 -0
  108. package/dist/tools/ssh.js.map +1 -0
  109. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -2,17 +2,22 @@
2
2
  import { realpathSync } from 'node:fs';
3
3
  import { pathToFileURL } from 'node:url';
4
4
  import { DEFAULT_BASE_URL } from './api.js';
5
+ import { CredentialsError } from './credentials.js';
5
6
  import { runHttp } from './http.js';
6
7
  import { SERVER_VERSION } from './server.js';
7
8
  import { runStdio } from './stdio.js';
9
+ import { parseToolTags, VALID_TAGS } from './tool-filters.js';
8
10
  const USAGE = `mandala-computer-mcp — drive a Mandala Computer desktop over MCP
9
11
 
10
12
  mandala-computer-mcp stdio (what an MCP client spawns)
11
13
  mandala-computer-mcp --http [--port 3000] hosted, callers bring their own key
12
14
 
13
15
  Environment
14
- MANDALA_API_KEY com_… from Settings → API keys. Required on stdio; over
15
- HTTP each caller sends their own as a bearer token.
16
+ MANDALA_API_KEY API key; otherwise stdio loads ~/.mandala/credentials.json
17
+ saved by mandala login (TypeScript CLI). Over HTTP each
18
+ caller sends their own bearer token.
19
+ MANDALA_PROFILE saved profile for local stdio; --profile overrides it.
20
+ Ignored by HTTP. Explicit/environment keys take priority.
16
21
  MANDALA_BASE_URL default ${DEFAULT_BASE_URL}
17
22
  MANDALA_COMPUTER_ID bind a computer at startup, so use_computer is not needed.
18
23
  stdio only — over HTTP it is ignored rather than bound
@@ -22,8 +27,14 @@ Environment
22
27
  this is ignored rather than spent on their runs
23
28
  MANDALA_NO_LIFECYCLE 1, true, yes or on to withhold create_computer,
24
29
  clone_computer, clone_snapshot, delete_computer and
25
- delete_snapshot. Any other value is refused rather than
26
- read as off, since a typo here would leave them enabled
30
+ delete_snapshot. 0, false, no, off or empty means off.
31
+ Unknown values are refused at startup.
32
+ MANDALA_READ_ONLY same boolean vocabulary; keep only tools annotated with
33
+ readOnlyHint: true. Empty or unset means off.
34
+ MANDALA_TAGS comma-separated lowercase tags; empty means all tools.
35
+ Valid tags: ${VALID_TAGS.join(', ')}.
36
+ Tags combine by union, then intersect with read-only,
37
+ lifecycle and per-session model-key restrictions.
27
38
  PORT, HOST for --http (default 3000, 127.0.0.1)
28
39
  MANDALA_ALLOWED_HOSTS, MANDALA_ALLOWED_ORIGINS
29
40
  comma-separated; which Host and Origin values to answer
@@ -60,6 +71,7 @@ const KNOWN = new Set([
60
71
  'base-url',
61
72
  'computer',
62
73
  'key',
74
+ 'profile',
63
75
  'allowed-hosts',
64
76
  'allowed-origins',
65
77
  ]);
@@ -225,6 +237,10 @@ export function lifecycleEnabled(flags, configured = env('MANDALA_NO_LIFECYCLE')
225
237
  const disabled = Object.hasOwn(flags, 'no-lifecycle') ? Boolean(flags['no-lifecycle']) : fromEnv;
226
238
  return !disabled;
227
239
  }
240
+ /** Parse once, before either transport starts; a typo must never open a listener. */
241
+ export function filtersFromEnv(readOnly = env('MANDALA_READ_ONLY'), tags = env('MANDALA_TAGS')) {
242
+ return { readOnly: envFlag('MANDALA_READ_ONLY', readOnly), tags: parseToolTags(tags) };
243
+ }
228
244
  /**
229
245
  * The port to listen on, or a refusal naming what was wrong with it.
230
246
  *
@@ -313,8 +329,8 @@ const list = (v) => v
313
329
  .map((s) => s.trim())
314
330
  .filter(Boolean)
315
331
  : undefined;
316
- async function main() {
317
- const flags = parse(process.argv.slice(2));
332
+ export async function main(argv = process.argv.slice(2)) {
333
+ const flags = parse(argv);
318
334
  if (wantsHelp(flags)) {
319
335
  console.log(USAGE);
320
336
  return;
@@ -326,11 +342,10 @@ async function main() {
326
342
  console.log(SERVER_VERSION);
327
343
  return;
328
344
  }
329
- // `??` rather than `||` throughout, now that `str` distinguishes "not given"
330
- // from "given as empty". `--base-url=` means the default, not the
331
- // environment; a flag that is present says what it says.
345
+ // Shared tool settings do not resolve local authentication. HTTP establishes
346
+ // its own base below; stdio preserves the explicit base for profile binding.
332
347
  const base = {
333
- baseUrl: (str(flags['base-url'], 'base-url') ?? env('MANDALA_BASE_URL')) || DEFAULT_BASE_URL,
348
+ ...filtersFromEnv(),
334
349
  computerId: str(flags.computer, 'computer') ?? env('MANDALA_COMPUTER_ID'),
335
350
  modelKey: env('MANDALA_MODEL_KEY'),
336
351
  lifecycle: lifecycleEnabled(flags),
@@ -338,6 +353,7 @@ async function main() {
338
353
  if (flags.http) {
339
354
  await runHttp({
340
355
  ...base,
356
+ baseUrl: (str(flags['base-url'], 'base-url') ?? env('MANDALA_BASE_URL')) || DEFAULT_BASE_URL,
341
357
  port: port(flags.port),
342
358
  host: (str(flags.host, 'host') ?? env('HOST')) || '127.0.0.1',
343
359
  allowedHosts: list(str(flags['allowed-hosts'], 'allowed-hosts') ?? env('MANDALA_ALLOWED_HOSTS')),
@@ -346,7 +362,6 @@ async function main() {
346
362
  return;
347
363
  }
348
364
  const fromFlag = str(flags.key, 'key');
349
- const apiKey = fromFlag ?? env('MANDALA_API_KEY') ?? '';
350
365
  // An argument vector is not a private place. `--key com_…` is readable by any
351
366
  // `ps` on the machine, is what a shell writes into its history, and is what a
352
367
  // process-exec audit log records verbatim — none of which is true of the
@@ -358,15 +373,14 @@ async function main() {
358
373
  console.error('WARNING: --key puts your API key in this process’s command line, where `ps`, the shell ' +
359
374
  'history and any exec audit log can read it. Prefer MANDALA_API_KEY.');
360
375
  }
361
- if (!apiKey) {
362
- // stderr and a non-zero exit, not a thrown stack. On stdio the client sees
363
- // a process that died; the person reading the log needs the one sentence
364
- // that tells them what to set.
365
- console.error('No API key. Set MANDALA_API_KEY (Settings → API keys at https://app.mandala.computer), ' +
366
- 'or run with --http and let each caller send their own.');
367
- process.exit(2);
368
- }
369
- await runStdio({ ...base, apiKey });
376
+ await runStdio({
377
+ ...base,
378
+ apiKey: fromFlag,
379
+ // Keep explicit presence, including an empty flag, for file base binding.
380
+ baseUrl: str(flags['base-url'], 'base-url'),
381
+ // Preserve malformed unused selectors so a winning key can ignore them.
382
+ profile: flags.profile,
383
+ });
370
384
  }
371
385
  /**
372
386
  * Is this module the program, rather than something a test imported?
@@ -391,7 +405,7 @@ export function isEntrypoint(moduleUrl, arg) {
391
405
  if (isEntrypoint(import.meta.url, process.argv[1])) {
392
406
  main().catch((err) => {
393
407
  console.error(err instanceof Error ? err.message : String(err));
394
- process.exit(1);
408
+ process.exit(err instanceof CredentialsError ? 2 : 1);
395
409
  });
396
410
  }
397
411
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** Fixed credential whitespace, shared with the other local clients. */
2
+ export declare function trimCredentialWhitespace(value: string): string;
3
+ /** Local diagnostics never include file contents, keys, paths or supplied values. */
4
+ export declare class CredentialsError extends Error {
5
+ readonly code: string;
6
+ constructor(code: string, detail: string);
7
+ }
8
+ /** Strict file-bound URL syntax; explicit-key transport behavior is separate. */
9
+ export declare function canonicalizeBaseUrl(value: unknown): string;
10
+ type Entry = {
11
+ api_key: string;
12
+ base_url: string;
13
+ };
14
+ type Document = {
15
+ default_profile: string;
16
+ profiles: Record<string, Entry>;
17
+ };
18
+ export declare function parseCredentials(bytes: Uint8Array): Document;
19
+ export type LocalCredentialOptions = {
20
+ apiKey?: string;
21
+ profile?: string;
22
+ baseUrl?: string;
23
+ };
24
+ export type ResolvedCredentials = {
25
+ apiKey: string;
26
+ baseUrl: string;
27
+ source: 'explicit' | 'environment' | 'file';
28
+ profile?: string;
29
+ };
30
+ /** Resolve once at local startup, before constructing an explicit ServerConfig. */
31
+ export declare function resolveCredentials(options?: LocalCredentialOptions): ResolvedCredentials;
32
+ export {};
33
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAuCA,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED,qFAAqF;AACrF,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM;CAKjB;AAsBD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAoE1D;AAgCD,KAAK,KAAK,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AACnD,KAAK,QAAQ,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC;AAE7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CA0D5D;AA6HD,MAAM,MAAM,sBAAsB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7F,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,sBAA2B,GAAG,mBAAmB,CAsC5F"}
@@ -0,0 +1,395 @@
1
+ import fs from 'node:fs';
2
+ import { isIP } from 'node:net';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { DEFAULT_BASE_URL } from './api.js';
6
+ const MAX_BYTES = 65_536;
7
+ const RESERVED = new Set([
8
+ '__proto__',
9
+ 'prototype',
10
+ 'constructor',
11
+ '__defineGetter__',
12
+ '__defineSetter__',
13
+ 'hasOwnProperty',
14
+ '__lookupGetter__',
15
+ '__lookupSetter__',
16
+ 'isPrototypeOf',
17
+ 'propertyIsEnumerable',
18
+ 'toLocaleString',
19
+ 'toString',
20
+ 'valueOf',
21
+ ]);
22
+ function credentialWhitespace(code) {
23
+ return ((code >= 9 && code <= 13) ||
24
+ code === 32 ||
25
+ code === 133 ||
26
+ code === 160 ||
27
+ code === 5760 ||
28
+ (code >= 8192 && code <= 8202) ||
29
+ code === 8232 ||
30
+ code === 8233 ||
31
+ code === 8239 ||
32
+ code === 8287 ||
33
+ code === 12288 ||
34
+ code === 65279);
35
+ }
36
+ /** Fixed credential whitespace, shared with the other local clients. */
37
+ export function trimCredentialWhitespace(value) {
38
+ let start = 0;
39
+ let end = value.length;
40
+ while (start < end && credentialWhitespace(value.charCodeAt(start)))
41
+ start++;
42
+ while (end > start && credentialWhitespace(value.charCodeAt(end - 1)))
43
+ end--;
44
+ return value.slice(start, end);
45
+ }
46
+ /** Local diagnostics never include file contents, keys, paths or supplied values. */
47
+ export class CredentialsError extends Error {
48
+ code;
49
+ constructor(code, detail) {
50
+ super(`${detail} Run mandala login with the TypeScript CLI, or set MANDALA_API_KEY.`);
51
+ this.code = code;
52
+ this.name = 'CredentialsError';
53
+ }
54
+ }
55
+ function fail(code, detail = 'Invalid saved credentials.') {
56
+ throw new CredentialsError(code, detail);
57
+ }
58
+ function profileName(value) {
59
+ if (typeof value !== 'string' ||
60
+ value.length < 1 ||
61
+ value.length > 64 ||
62
+ !/[A-Za-z0-9]/.test(value[0]) ||
63
+ /[^A-Za-z0-9._-]/.test(value) ||
64
+ RESERVED.has(value)) {
65
+ fail('invalid_profile', 'Invalid profile name; use 1–64 ASCII letters, digits, dots, underscores or hyphens.');
66
+ }
67
+ }
68
+ /** Strict file-bound URL syntax; explicit-key transport behavior is separate. */
69
+ export function canonicalizeBaseUrl(value) {
70
+ const bad = () => fail('invalid_base_url', 'Invalid saved-credential base URL.');
71
+ if (typeof value !== 'string')
72
+ return bad();
73
+ const raw = trimCredentialWhitespace(value);
74
+ if (!raw || raw.length > 2048 || /[^\x21-\x7e]|[\\%?#]/.test(raw))
75
+ return bad();
76
+ const schemeMatch = /^(https?):\/\//i.exec(raw);
77
+ if (!schemeMatch)
78
+ return bad();
79
+ const scheme = schemeMatch[1].toLowerCase();
80
+ const rest = raw.slice(schemeMatch[0].length);
81
+ const slash = rest.indexOf('/');
82
+ const authority = slash < 0 ? rest : rest.slice(0, slash);
83
+ const pathname = slash < 0 ? '' : rest.slice(slash);
84
+ if (!authority || authority.includes('@'))
85
+ return bad();
86
+ let host;
87
+ let port;
88
+ if (authority.startsWith('[')) {
89
+ const close = authority.indexOf(']');
90
+ if (close < 0)
91
+ return bad();
92
+ const address = authority.slice(1, close);
93
+ if (isIP(address) !== 6)
94
+ return bad();
95
+ const suffix = authority.slice(close + 1);
96
+ if (suffix && !suffix.startsWith(':'))
97
+ return bad();
98
+ port = suffix ? suffix.slice(1) : undefined;
99
+ // Only IPv6 reaches the URL parser, after strict address validation. It
100
+ // serializes the first longest zero run and any dotted IPv4 tail.
101
+ host = new URL(`https://[${address}]`).hostname;
102
+ }
103
+ else {
104
+ const parts = authority.split(':');
105
+ if (parts.length > 2)
106
+ return bad();
107
+ host = parts[0].toLowerCase();
108
+ port = parts[1];
109
+ if (!host || host.length > 253)
110
+ return bad();
111
+ const labels = host.split('.');
112
+ if (labels.some((label) => !label ||
113
+ label.length > 63 ||
114
+ /[^a-z0-9-]/.test(label) ||
115
+ !/[a-z0-9]/.test(label[0]) ||
116
+ !/[a-z0-9]/.test(label[label.length - 1])))
117
+ return bad();
118
+ const last = labels[labels.length - 1];
119
+ if (/^(?:[0-9]+|0x[0-9a-f]*)$/.test(last) && isIP(host) !== 4)
120
+ return bad();
121
+ }
122
+ let portSuffix = '';
123
+ if (port !== undefined) {
124
+ if (!port || /[^0-9]/.test(port))
125
+ return bad();
126
+ const n = Number(port);
127
+ if (!Number.isInteger(n) || n < 1 || n > 65535)
128
+ return bad();
129
+ if (!(scheme === 'https' && n === 443) && !(scheme === 'http' && n === 80))
130
+ portSuffix = `:${n}`;
131
+ }
132
+ if (scheme === 'http' &&
133
+ host !== 'localhost' &&
134
+ host !== '[::1]' &&
135
+ !(isIP(host) === 4 && host.startsWith('127.')))
136
+ return bad();
137
+ if (/[^A-Za-z0-9\-._~!$&'()*+,;=:@/]/.test(pathname) ||
138
+ pathname.split('/').some((part) => part === '.' || part === '..'))
139
+ return bad();
140
+ return `${scheme}://${host}${portSuffix}${pathname.replace(/\/+$/, '')}`;
141
+ }
142
+ function object(value) {
143
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
144
+ fail('invalid_schema');
145
+ }
146
+ function closed(value, keys) {
147
+ object(value);
148
+ if (Object.keys(value).length !== keys.length || keys.some((key) => !Object.hasOwn(value, key)))
149
+ fail('invalid_schema');
150
+ }
151
+ function nonempty(value) {
152
+ if (typeof value !== 'string' || !value.length)
153
+ fail('invalid_schema');
154
+ }
155
+ function stringsWellFormed(value) {
156
+ const pending = [value];
157
+ while (pending.length) {
158
+ const current = pending.pop();
159
+ if (typeof current === 'string') {
160
+ for (let i = 0; i < current.length; i++) {
161
+ const code = current.charCodeAt(i);
162
+ if (code >= 0xd800 && code <= 0xdbff) {
163
+ const next = current.charCodeAt(++i);
164
+ if (!(next >= 0xdc00 && next <= 0xdfff))
165
+ fail('invalid_schema');
166
+ }
167
+ else if (code >= 0xdc00 && code <= 0xdfff)
168
+ fail('invalid_schema');
169
+ }
170
+ }
171
+ else if (current && typeof current === 'object') {
172
+ for (const [key, child] of Object.entries(current))
173
+ pending.push(key, child);
174
+ }
175
+ }
176
+ }
177
+ export function parseCredentials(bytes) {
178
+ if (bytes.byteLength > MAX_BYTES)
179
+ fail('file_too_large', 'Saved credentials exceed 65,536 bytes.');
180
+ let text;
181
+ try {
182
+ text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
183
+ }
184
+ catch {
185
+ return fail('invalid_utf8', 'Saved credentials must be valid UTF-8.');
186
+ }
187
+ let doc;
188
+ try {
189
+ doc = JSON.parse(text);
190
+ }
191
+ catch {
192
+ return fail('invalid_json', 'Saved credentials are not valid JSON.');
193
+ }
194
+ stringsWellFormed(doc);
195
+ object(doc);
196
+ if (typeof doc.version !== 'number' ||
197
+ !Number.isFinite(doc.version) ||
198
+ !Number.isInteger(doc.version))
199
+ fail('invalid_schema');
200
+ if (doc.version !== 1)
201
+ fail('unsupported_version', 'Unsupported saved-credentials version.');
202
+ if (!Object.hasOwn(doc, 'default_profile'))
203
+ fail('missing_default_profile', 'Saved credentials have no default profile.');
204
+ closed(doc, ['version', 'default_profile', 'profiles']);
205
+ if (typeof doc.default_profile !== 'string')
206
+ fail('invalid_schema');
207
+ profileName(doc.default_profile);
208
+ object(doc.profiles);
209
+ const names = Object.keys(doc.profiles);
210
+ if (!names.length)
211
+ fail('invalid_schema');
212
+ if (names.length > 100)
213
+ fail('too_many_profiles', 'Saved credentials contain more than 100 profiles.');
214
+ for (const name of names) {
215
+ profileName(name);
216
+ const entry = doc.profiles[name];
217
+ closed(entry, ['api_key', 'base_url', 'key_id', 'account', 'scope']);
218
+ nonempty(entry.api_key);
219
+ if (!trimCredentialWhitespace(entry.api_key))
220
+ fail('invalid_schema');
221
+ if (canonicalizeBaseUrl(entry.base_url) !== entry.base_url)
222
+ fail('invalid_base_url', 'Stored base URLs must be canonical.');
223
+ nonempty(entry.key_id);
224
+ closed(entry.account, ['id', 'name']);
225
+ nonempty(entry.account.id);
226
+ if (entry.account.name !== null && typeof entry.account.name !== 'string')
227
+ fail('invalid_schema');
228
+ object(entry.scope);
229
+ if (entry.scope.type === 'account')
230
+ closed(entry.scope, ['type']);
231
+ else if (entry.scope.type === 'workspace') {
232
+ closed(entry.scope, ['type', 'workspace_id', 'workspace_name']);
233
+ nonempty(entry.scope.workspace_id);
234
+ nonempty(entry.scope.workspace_name);
235
+ }
236
+ else
237
+ fail('invalid_schema');
238
+ }
239
+ if (!Object.hasOwn(doc.profiles, doc.default_profile))
240
+ fail('missing_default_profile', 'The saved default profile is missing.');
241
+ return doc;
242
+ }
243
+ const sameObject = (a, b) => a.dev === b.dev && a.ino === b.ino;
244
+ const sameDirectory = (initial, current) => sameObject(initial, current) &&
245
+ initial.ctimeNs === current.ctimeNs &&
246
+ initial.mtimeNs === current.mtimeNs;
247
+ /**
248
+ * Opened descriptors are checked against pre/post named directory AND file
249
+ * identities and the initial directory's change timestamps. Renaming a
250
+ * directory away and back preserves dev/ino and can preserve mtime, so ctime
251
+ * is essential. Bigint stats retain the filesystem's timestamp precision.
252
+ * Node has no portable openat: these checks reject observed substitutions
253
+ * rather than claiming an atomic directory-relative open.
254
+ */
255
+ function readStore() {
256
+ if (process.platform === 'win32' ||
257
+ typeof process.getuid !== 'function' ||
258
+ !fs.constants.O_NOFOLLOW ||
259
+ !fs.constants.O_DIRECTORY) {
260
+ fail('unsupported_file_protection', 'Saved credentials require verified POSIX file protection.');
261
+ }
262
+ const deadline = performance.now() + 5000;
263
+ const checkTime = () => {
264
+ if (performance.now() >= deadline)
265
+ fail('credential_read_timeout', 'Reading saved credentials timed out.');
266
+ };
267
+ const uid = process.getuid();
268
+ const directoryUid = BigInt(uid);
269
+ const checkDir = (st) => {
270
+ if (!st.isDirectory() || st.uid !== directoryUid || (st.mode & 4095n) !== 448n)
271
+ fail('unsafe_directory', 'The credentials directory must be owned by you with mode 0700.');
272
+ };
273
+ const checkFile = (st) => {
274
+ if (!st.isFile() || st.uid !== uid || (st.mode & 0o7777) !== 0o600 || st.nlink !== 1)
275
+ fail('unsafe_file', 'The credentials file must be a private, owned regular file with mode 0600 and one link.');
276
+ if (st.size > MAX_BYTES)
277
+ fail('file_too_large', 'Saved credentials exceed 65,536 bytes.');
278
+ };
279
+ let dirFd;
280
+ let fileFd;
281
+ try {
282
+ const home = os.homedir();
283
+ if (!home || !path.isAbsolute(home))
284
+ fail('missing_credentials', 'Cannot discover your home directory.');
285
+ const directory = path.join(home, '.mandala');
286
+ const filename = path.join(directory, 'credentials.json');
287
+ const namedDir = fs.lstatSync(directory, { bigint: true });
288
+ checkDir(namedDir);
289
+ dirFd = fs.openSync(directory, fs.constants.O_RDONLY |
290
+ fs.constants.O_DIRECTORY |
291
+ fs.constants.O_NOFOLLOW |
292
+ fs.constants.O_NONBLOCK);
293
+ const openedDir = fs.fstatSync(dirFd, { bigint: true });
294
+ checkDir(openedDir);
295
+ if (!sameDirectory(namedDir, openedDir))
296
+ fail('unsafe_directory');
297
+ const namedFile = fs.lstatSync(filename);
298
+ checkFile(namedFile);
299
+ const beforeDir = fs.lstatSync(directory, { bigint: true });
300
+ checkDir(beforeDir);
301
+ if (!sameDirectory(namedDir, beforeDir))
302
+ fail('unsafe_directory');
303
+ checkTime();
304
+ fileFd = fs.openSync(filename, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
305
+ const openedFile = fs.fstatSync(fileFd);
306
+ checkFile(openedFile);
307
+ if (!sameObject(namedFile, openedFile))
308
+ fail('unsafe_file');
309
+ const buffer = Buffer.alloc(MAX_BYTES + 1);
310
+ let size = 0;
311
+ for (;;) {
312
+ checkTime();
313
+ const n = fs.readSync(fileFd, buffer, size, Math.min(8192, buffer.length - size), null);
314
+ size += n;
315
+ if (size > MAX_BYTES)
316
+ fail('file_too_large', 'Saved credentials exceed 65,536 bytes.');
317
+ if (!n)
318
+ break;
319
+ }
320
+ const finalFile = fs.fstatSync(fileFd);
321
+ checkFile(finalFile);
322
+ if (!sameObject(openedFile, finalFile) ||
323
+ size !== finalFile.size ||
324
+ openedFile.size !== finalFile.size ||
325
+ openedFile.mtimeMs !== finalFile.mtimeMs ||
326
+ openedFile.ctimeMs !== finalFile.ctimeMs)
327
+ fail('unsafe_file');
328
+ const finalNamedFile = fs.lstatSync(filename);
329
+ checkFile(finalNamedFile);
330
+ if (!sameObject(openedFile, finalNamedFile))
331
+ fail('unsafe_file');
332
+ const finalDir = fs.fstatSync(dirFd, { bigint: true });
333
+ const finalNamedDir = fs.lstatSync(directory, { bigint: true });
334
+ checkDir(finalDir);
335
+ checkDir(finalNamedDir);
336
+ if (!sameDirectory(namedDir, finalDir) || !sameDirectory(namedDir, finalNamedDir))
337
+ fail('unsafe_directory');
338
+ checkTime();
339
+ return buffer.subarray(0, size);
340
+ }
341
+ catch (error) {
342
+ if (error instanceof CredentialsError)
343
+ throw error;
344
+ const code = error?.code;
345
+ if (code === 'ENOENT')
346
+ fail('missing_credentials', 'No API key or saved credentials found.');
347
+ return fail('unsafe_file', 'Cannot safely read saved credentials; check the directory and file protection.');
348
+ }
349
+ finally {
350
+ if (fileFd !== undefined)
351
+ fs.closeSync(fileFd);
352
+ if (dirFd !== undefined)
353
+ fs.closeSync(dirFd);
354
+ }
355
+ }
356
+ /** Resolve once at local startup, before constructing an explicit ServerConfig. */
357
+ export function resolveCredentials(options = {}) {
358
+ const explicit = options.apiKey;
359
+ const legacyBase = () => (options.baseUrl ?? process.env.MANDALA_BASE_URL?.trim()) || DEFAULT_BASE_URL;
360
+ if (explicit !== undefined) {
361
+ if (typeof explicit !== 'string' || !trimCredentialWhitespace(explicit))
362
+ fail('invalid_explicit_key', 'The supplied API key must be a nonempty string.');
363
+ return {
364
+ apiKey: trimCredentialWhitespace(explicit),
365
+ baseUrl: legacyBase(),
366
+ source: 'explicit',
367
+ };
368
+ }
369
+ const environment = trimCredentialWhitespace(process.env.MANDALA_API_KEY ?? '');
370
+ if (environment)
371
+ return { apiKey: environment, baseUrl: legacyBase(), source: 'environment' };
372
+ // null is supplied in JavaScript, and must not fall through to the environment.
373
+ const profile = options.profile !== undefined
374
+ ? options.profile
375
+ : trimCredentialWhitespace(process.env.MANDALA_PROFILE ?? '') || undefined;
376
+ if (profile !== undefined)
377
+ profileName(profile);
378
+ const doc = parseCredentials(readStore());
379
+ const name = profile ?? doc.default_profile;
380
+ if (!Object.hasOwn(doc.profiles, name))
381
+ fail('missing_selected_profile', 'The selected credential profile is missing.');
382
+ const entry = doc.profiles[name];
383
+ const override = options.baseUrl !== undefined
384
+ ? options.baseUrl
385
+ : trimCredentialWhitespace(process.env.MANDALA_BASE_URL ?? '') || undefined;
386
+ if (override !== undefined && canonicalizeBaseUrl(override) !== entry.base_url)
387
+ fail('base_binding_mismatch', 'The base URL does not match the selected credential profile.');
388
+ return {
389
+ apiKey: trimCredentialWhitespace(entry.api_key),
390
+ baseUrl: entry.base_url,
391
+ source: 'file',
392
+ profile: name,
393
+ };
394
+ }
395
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}