mandala-computer-mcp 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 (130) hide show
  1. package/README.md +462 -37
  2. package/dist/api.d.ts +12 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +262 -42
  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 +53 -10
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +122 -35
  21. package/dist/errors.js.map +1 -1
  22. package/dist/events.d.ts +11 -2
  23. package/dist/events.d.ts.map +1 -1
  24. package/dist/events.js +213 -95
  25. package/dist/events.js.map +1 -1
  26. package/dist/executions.d.ts +43 -0
  27. package/dist/executions.d.ts.map +1 -0
  28. package/dist/executions.js +162 -0
  29. package/dist/executions.js.map +1 -0
  30. package/dist/format.d.ts +11 -11
  31. package/dist/format.d.ts.map +1 -1
  32. package/dist/format.js +159 -16
  33. package/dist/format.js.map +1 -1
  34. package/dist/http.d.ts.map +1 -1
  35. package/dist/http.js +4 -0
  36. package/dist/http.js.map +1 -1
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/limits.d.ts +17 -0
  42. package/dist/limits.d.ts.map +1 -0
  43. package/dist/limits.js +17 -0
  44. package/dist/limits.js.map +1 -0
  45. package/dist/paths.d.ts +42 -2
  46. package/dist/paths.d.ts.map +1 -1
  47. package/dist/paths.js +54 -3
  48. package/dist/paths.js.map +1 -1
  49. package/dist/poll.d.ts +5 -1
  50. package/dist/poll.d.ts.map +1 -1
  51. package/dist/poll.js +120 -16
  52. package/dist/poll.js.map +1 -1
  53. package/dist/results.d.ts +97 -0
  54. package/dist/results.d.ts.map +1 -0
  55. package/dist/results.js +263 -0
  56. package/dist/results.js.map +1 -0
  57. package/dist/server.d.ts +3 -2
  58. package/dist/server.d.ts.map +1 -1
  59. package/dist/server.js +61 -9
  60. package/dist/server.js.map +1 -1
  61. package/dist/stdio.d.ts +5 -1
  62. package/dist/stdio.d.ts.map +1 -1
  63. package/dist/stdio.js +10 -4
  64. package/dist/stdio.js.map +1 -1
  65. package/dist/tool-filters.d.ts +38 -0
  66. package/dist/tool-filters.d.ts.map +1 -0
  67. package/dist/tool-filters.js +129 -0
  68. package/dist/tool-filters.js.map +1 -0
  69. package/dist/tools/account.d.ts +3 -0
  70. package/dist/tools/account.d.ts.map +1 -0
  71. package/dist/tools/account.js +122 -0
  72. package/dist/tools/account.js.map +1 -0
  73. package/dist/tools/activities.d.ts +3 -0
  74. package/dist/tools/activities.d.ts.map +1 -0
  75. package/dist/tools/activities.js +140 -0
  76. package/dist/tools/activities.js.map +1 -0
  77. package/dist/tools/agent.d.ts.map +1 -1
  78. package/dist/tools/agent.js +72 -5
  79. package/dist/tools/agent.js.map +1 -1
  80. package/dist/tools/artifacts.d.ts +3 -0
  81. package/dist/tools/artifacts.d.ts.map +1 -0
  82. package/dist/tools/artifacts.js +97 -0
  83. package/dist/tools/artifacts.js.map +1 -0
  84. package/dist/tools/chat.d.ts +6 -0
  85. package/dist/tools/chat.d.ts.map +1 -0
  86. package/dist/tools/chat.js +192 -0
  87. package/dist/tools/chat.js.map +1 -0
  88. package/dist/tools/computers.d.ts.map +1 -1
  89. package/dist/tools/computers.js +300 -247
  90. package/dist/tools/computers.js.map +1 -1
  91. package/dist/tools/directory.d.ts +13 -0
  92. package/dist/tools/directory.d.ts.map +1 -0
  93. package/dist/tools/directory.js +88 -0
  94. package/dist/tools/directory.js.map +1 -0
  95. package/dist/tools/events.d.ts.map +1 -1
  96. package/dist/tools/events.js +66 -22
  97. package/dist/tools/events.js.map +1 -1
  98. package/dist/tools/executions.d.ts +3 -0
  99. package/dist/tools/executions.d.ts.map +1 -0
  100. package/dist/tools/executions.js +87 -0
  101. package/dist/tools/executions.js.map +1 -0
  102. package/dist/tools/guest.d.ts.map +1 -1
  103. package/dist/tools/guest.js +57 -17
  104. package/dist/tools/guest.js.map +1 -1
  105. package/dist/tools/input.d.ts.map +1 -1
  106. package/dist/tools/input.js +63 -5
  107. package/dist/tools/input.js.map +1 -1
  108. package/dist/tools/results.d.ts +30 -0
  109. package/dist/tools/results.d.ts.map +1 -0
  110. package/dist/tools/results.js +106 -0
  111. package/dist/tools/results.js.map +1 -0
  112. package/dist/tools/secrets.d.ts +58 -0
  113. package/dist/tools/secrets.d.ts.map +1 -0
  114. package/dist/tools/secrets.js +204 -0
  115. package/dist/tools/secrets.js.map +1 -0
  116. package/dist/tools/signals.d.ts +3 -0
  117. package/dist/tools/signals.d.ts.map +1 -0
  118. package/dist/tools/signals.js +116 -0
  119. package/dist/tools/signals.js.map +1 -0
  120. package/dist/tools/snapshots.d.ts.map +1 -1
  121. package/dist/tools/snapshots.js +213 -167
  122. package/dist/tools/snapshots.js.map +1 -1
  123. package/dist/tools/ssh.d.ts +3 -0
  124. package/dist/tools/ssh.d.ts.map +1 -0
  125. package/dist/tools/ssh.js +186 -0
  126. package/dist/tools/ssh.js.map +1 -0
  127. package/dist/tools/templates.d.ts.map +1 -1
  128. package/dist/tools/templates.js +9 -13
  129. package/dist/tools/templates.js.map +1 -1
  130. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ import { z } from 'zod';
2
+ import { artifactContent, artifactMetadata, artifactOptions } from '../artifacts.js';
3
+ import { refused, said } from '../format.js';
4
+ import * as P from '../paths.js';
5
+ import { PRESENTATION_DEFAULT, PRESENTATION_MAX, requireValue, retainedCall, scopeId, } from '../results.js';
6
+ import { captureAnnotations, computerSchema, deleteAnnotations, readAnnotations, } from './results.js';
7
+ const identity = {
8
+ computer_id: computerSchema,
9
+ artifact_id: z
10
+ .string()
11
+ .length(36)
12
+ .regex(/^art_[a-f0-9]{32}$/),
13
+ };
14
+ export const registerArtifacts = (server, session) => {
15
+ server.registerTool('publish_artifact', {
16
+ title: 'Publish a nominated immutable file version',
17
+ description: 'Explicitly capture a caller-nominated absolute Linux, Windows drive or UNC file path with expected_size and lowercase expected_sha256 already supplied. One guest file read, no preflight stat/list/hash/exec. Optional execution_id is verified caller-selected association, not proof of authorship. Default 8 MiB/max 64 MiB capture cap; default 86400s/max 604800s retention. New version per call; a lost response leaves publication unconfirmed.',
18
+ inputSchema: {
19
+ computer_id: computerSchema,
20
+ path: z.string().min(1),
21
+ expected_size: z
22
+ .number()
23
+ .int()
24
+ .min(0)
25
+ .max(64 * 1024 * 1024),
26
+ expected_sha256: z
27
+ .string()
28
+ .length(64)
29
+ .regex(/^[a-f0-9]{64}$/),
30
+ execution_id: z
31
+ .string()
32
+ .length(37)
33
+ .regex(/^exec_[a-f0-9]{32}$/)
34
+ .optional(),
35
+ max_bytes: z
36
+ .number()
37
+ .int()
38
+ .min(1)
39
+ .max(64 * 1024 * 1024)
40
+ .optional(),
41
+ retention_seconds: z.number().int().min(1).max(604800).optional(),
42
+ },
43
+ annotations: captureAnnotations,
44
+ }, ({ computer_id, ...args }, extra) => retainedCall(extra.signal, true, async (signal) => {
45
+ const id = session.resolve(computer_id);
46
+ requireValue(scopeId(id));
47
+ const body = artifactOptions(Object.fromEntries(Object.entries(args).filter(([, v]) => v !== undefined)));
48
+ const data = await session.api
49
+ .with(signal)
50
+ .boundedJson('POST', P.artifacts(id), 4096, 201, { body });
51
+ return said('Immutable nominated file version; association records caller selection.', artifactMetadata(data, id, undefined, body));
52
+ }));
53
+ server.registerTool('get_artifact', {
54
+ title: 'Read immutable artifact metadata',
55
+ description: 'Passive finite metadata for one retained artifact. No guest file or execution lookup, resume, capture or fallback.',
56
+ inputSchema: identity,
57
+ annotations: readAnnotations,
58
+ }, ({ computer_id, artifact_id }, extra) => retainedCall(extra.signal, false, async (signal) => {
59
+ const id = session.resolve(computer_id);
60
+ requireValue(scopeId(id));
61
+ return said('Immutable artifact metadata.', artifactMetadata(await session.api
62
+ .with(signal)
63
+ .boundedJson('GET', P.artifact(id, artifact_id), 4096, 200), id, artifact_id));
64
+ }));
65
+ server.registerTool('read_artifact', {
66
+ title: 'Read a complete verified small artifact',
67
+ description: 'Read metadata, then only if the complete artifact fits max_bytes (default 4096/max 16384), read the whole immutable object and verify size/SHA-256. Over cap returns metadata only, with zero content GETs. One 90s operation budget; no Range, prefix, assembly, file destination, guest fallback or image/HTML rendering. Lossless UTF-8/BOM or exact base64.',
68
+ inputSchema: {
69
+ ...identity,
70
+ max_bytes: z.number().int().min(1).max(PRESENTATION_MAX).default(PRESENTATION_DEFAULT),
71
+ },
72
+ annotations: readAnnotations,
73
+ }, ({ computer_id, artifact_id, max_bytes }, extra) => retainedCall(extra.signal, false, async (signal) => {
74
+ const id = session.resolve(computer_id);
75
+ requireValue(scopeId(id));
76
+ const api = session.api.with(signal);
77
+ const metadata = artifactMetadata(await api.boundedJson('GET', P.artifact(id, artifact_id), 4096, 200), id, artifact_id);
78
+ if (metadata.size > max_bytes)
79
+ return refused('Artifact exceeds the complete-content presentation cap. No content was downloaded or hash verified; use an SDK whole download with an adequate cap.', metadata);
80
+ if (signal.aborted)
81
+ throw signal.reason;
82
+ const response = await api.boundedBytes('GET', P.artifactDownload(id, artifact_id), metadata.size, 200);
83
+ return said('Complete retained artifact verified against its immutable size and SHA-256.', artifactContent(response, metadata));
84
+ }));
85
+ server.registerTool('delete_artifact', {
86
+ title: 'Delete an immutable artifact version',
87
+ description: 'Delete exactly this retained artifact, without metadata preflight or guest file deletion. Same deletion effect on repeat; repeated 404 remains unavailable. No retry.',
88
+ inputSchema: identity,
89
+ annotations: deleteAnnotations,
90
+ }, ({ computer_id, artifact_id }, extra) => retainedCall(extra.signal, true, async (signal) => {
91
+ const id = session.resolve(computer_id);
92
+ requireValue(scopeId(id));
93
+ await session.api.with(signal).boundedBytes('DELETE', P.artifact(id, artifact_id), 0, 204);
94
+ return said('Retained artifact deleted.', { artifact_id, deleted: true });
95
+ }));
96
+ };
97
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/tools/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { Registrar } from './types.js';
3
+ /** Do not let a provider echo session secrets into output, even in a known text field. */
4
+ export declare function safeResult(result: CallToolResult, modelKey: string): CallToolResult;
5
+ export declare const registerChat: Registrar;
6
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AASzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkH5C,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAenF;AAED,eAAO,MAAM,YAAY,EAAE,SAiF1B,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { z } from 'zod';
2
+ import { MODEL_KEY_HEADER } from '../api.js';
3
+ import { APIError, platformSaid } from '../errors.js';
4
+ import { apiErrorMessage, errorMetadata, failed, refused, said } from '../format.js';
5
+ import * as P from '../paths.js';
6
+ import { heartbeat } from '../poll.js';
7
+ import { count, label } from './directory.js';
8
+ import { computerSchema } from './results.js';
9
+ const content = z.union([
10
+ z.string(),
11
+ z.array(z.object({ type: z.literal('text'), text: z.string() }).strict()),
12
+ ]);
13
+ const message = z.object({ role: z.enum(['system', 'user', 'assistant']), content }).strict();
14
+ const usage = z.object({ prompt_tokens: count, completion_tokens: count, total_tokens: count });
15
+ const choice = z.object({
16
+ index: count,
17
+ message: z.object({ role: z.literal('assistant'), content: z.string() }),
18
+ finish_reason: label,
19
+ });
20
+ const agent = z.object({ computer_id: label, steps: count, stop: label });
21
+ const completion = z.object({
22
+ id: label,
23
+ object: z.literal('chat.completion'),
24
+ created: count,
25
+ model: label,
26
+ choices: z.array(choice).length(1),
27
+ usage,
28
+ agent,
29
+ });
30
+ const isRecord = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
31
+ /** Retain valid fields even when other terminal metadata is missing or malformed. */
32
+ function partial(value) {
33
+ if (!isRecord(value))
34
+ return {};
35
+ const result = {};
36
+ for (const [key, schema] of Object.entries(completion.shape)) {
37
+ const parsed = schema.safeParse(value[key]);
38
+ if (parsed.success)
39
+ result[key] = parsed.data;
40
+ }
41
+ for (const [name, schema] of Object.entries({ agent, usage })) {
42
+ const source = value[name];
43
+ if (!isRecord(source))
44
+ continue;
45
+ const fields = {};
46
+ for (const [key, field] of Object.entries(schema.shape)) {
47
+ const parsed = field.safeParse(source[key]);
48
+ if (parsed.success)
49
+ fields[key] = parsed.data;
50
+ }
51
+ if (Object.keys(fields).length)
52
+ result[name] = fields;
53
+ }
54
+ // A valid assistant answer is still useful when finish_reason is absent.
55
+ if (Array.isArray(value.choices)) {
56
+ result.choices = value.choices
57
+ .slice(0, 8)
58
+ .filter(isRecord)
59
+ .map((item) => {
60
+ const fields = {};
61
+ for (const [key, schema] of Object.entries(choice.shape)) {
62
+ const parsed = schema.safeParse(item[key]);
63
+ if (parsed.success)
64
+ fields[key] = parsed.data;
65
+ }
66
+ return fields;
67
+ });
68
+ }
69
+ return result;
70
+ }
71
+ const steps = z.array(z.object({
72
+ n: count,
73
+ tool: z.string().optional(),
74
+ action: z.string().optional(),
75
+ detail: z.string().optional(),
76
+ error: z.string().optional(),
77
+ }));
78
+ const failedAgent = z.object({
79
+ computer_id: label,
80
+ usage: z.object({
81
+ input_tokens: count,
82
+ output_tokens: count,
83
+ cache_read_tokens: count,
84
+ cache_write_tokens: count,
85
+ }),
86
+ steps,
87
+ });
88
+ function chatFailure(error) {
89
+ if (!(error instanceof APIError))
90
+ return failed(error);
91
+ const nested = isRecord(error.body) && isRecord(error.body.error) ? error.body.error : undefined;
92
+ const source = nested ?? (isRecord(error.body) ? error.body : {});
93
+ const projected = {};
94
+ for (const [key, schema] of Object.entries({ usage, steps })) {
95
+ const parsed = schema.safeParse(source[key]);
96
+ if (parsed.success)
97
+ projected[key] = parsed.data;
98
+ }
99
+ projected.reason = error.reason;
100
+ const native = failedAgent.safeParse(nested?.agent);
101
+ const boundedNative = native.success && JSON.stringify(native.data).length <= 4000;
102
+ const incompleteNative = nested?.agent !== undefined && !boundedNative;
103
+ const detail = isRecord(error.body)
104
+ ? (platformSaid(error.body) ?? 'Chat request failed without a usable error message')
105
+ : apiErrorMessage(error);
106
+ const result = failed(new APIError(detail, error.status, { ...projected, error: detail }, error.retryAfterMs, error), nested === undefined);
107
+ const diagnostics = errorMetadata(error);
108
+ result.content.push(...said(`${incompleteNative ? 'Native agent failure metadata was malformed or oversized and omitted. ' : ''}${diagnostics.omitted ? 'Oversized diagnostic metadata was omitted. ' : ''}Chat refusal metadata; recorded work may already be billed. Inspect what took effect before another run.`, {
109
+ ...diagnostics.fields,
110
+ ...(boundedNative ? { agent: native.data } : {}),
111
+ ...(incompleteNative ? { incomplete: true } : {}),
112
+ }).content);
113
+ return result;
114
+ }
115
+ /** Do not let a provider echo session secrets into output, even in a known text field. */
116
+ export function safeResult(result, modelKey) {
117
+ return {
118
+ ...result,
119
+ content: result.content.map((item) => item.type === 'text'
120
+ ? {
121
+ ...item,
122
+ text: item.text
123
+ .split(modelKey)
124
+ .join('[redacted]')
125
+ .replace(/\b(?:com_|sk-)[A-Za-z0-9_-]+/g, '[redacted]'),
126
+ }
127
+ : item),
128
+ };
129
+ }
130
+ export const registerChat = (server, session) => {
131
+ if (!session.modelKey)
132
+ return;
133
+ const modelKey = session.modelKey;
134
+ server.registerTool('run_agent_chat', {
135
+ title: 'Drive the computer with BYOK textual chat',
136
+ description: "Run the same Anthropic computer agent using OpenAI-shaped textual messages and JSON-only results (stream:false). The last user message is the task; system messages provide standing instructions. Previous user/assistant conversation is not replayed. This is BYOK computer control, not hosted inference or a chat UI. The computer must already be running. Bills the caller's Anthropic key. A supplied model must be an Anthropic model name. Progress counts waiting heartbeats, not completed actions. For long runs the client needs progressToken plus resetTimeoutOnProgress; otherwise choose a smaller max_steps, which is not a time or spend cap. Never automatically replay a failed run.",
137
+ inputSchema: {
138
+ computer_id: computerSchema,
139
+ messages: z
140
+ .array(message)
141
+ .min(1)
142
+ .refine((messages) => {
143
+ const last = messages.filter((m) => m.role === 'user').at(-1);
144
+ return (last !== undefined &&
145
+ (typeof last.content === 'string'
146
+ ? last.content
147
+ : last.content.map((p) => p.text).join('')).trim().length > 0);
148
+ }, 'The last user message must contain text.'),
149
+ model: z
150
+ .string()
151
+ .refine((v) => v.trim().length > 0, 'model must not be blank')
152
+ .optional(),
153
+ max_steps: z.number().int().min(1).max(100).default(20),
154
+ },
155
+ annotations: { openWorldHint: true },
156
+ }, async ({ computer_id, messages, model, max_steps }, extra) => {
157
+ let beat;
158
+ try {
159
+ const id = session.resolve(computer_id);
160
+ extra.signal.throwIfAborted();
161
+ const body = P.chatBody({ computer_id: id, messages, model, max_steps });
162
+ beat = heartbeat(extra, server.server);
163
+ await beat('Waiting for the chat agent result; progress counts heartbeats, not completed actions.');
164
+ const value = await session.api.json('POST', P.CHAT_COMPLETIONS, {
165
+ body,
166
+ headers: { [MODEL_KEY_HEADER]: modelKey },
167
+ signal: extra.signal,
168
+ });
169
+ extra.signal.throwIfAborted();
170
+ const parsed = completion.safeParse(value);
171
+ if (!parsed.success)
172
+ return safeResult(refused('Malformed or missing chat terminal metadata; task completion is unconfirmed. Valid partial result:', partial(value)), modelKey);
173
+ const data = parsed.data;
174
+ const finished = data.agent.stop === 'end_turn' &&
175
+ data.choices[0].finish_reason === 'stop' &&
176
+ data.choices[0].index === 0 &&
177
+ data.agent.computer_id === id &&
178
+ data.agent.steps <= max_steps &&
179
+ data.usage.total_tokens === data.usage.prompt_tokens + data.usage.completion_tokens;
180
+ return safeResult(finished
181
+ ? said('The chat agent finished.', data)
182
+ : refused('The chat agent did not establish successful task completion. Inspect stop, finish reason and partial work before deciding what remains; do not replay automatically.', data), modelKey);
183
+ }
184
+ catch (error) {
185
+ return safeResult(chatFailure(error), modelKey);
186
+ }
187
+ finally {
188
+ await beat?.stop();
189
+ }
190
+ });
191
+ };
192
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"computers.d.ts","sourceRoot":"","sources":["../../src/tools/computers.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiQ5C,eAAO,MAAM,iBAAiB,EAAE,SAo2C/B,CAAC"}
1
+ {"version":3,"file":"computers.d.ts","sourceRoot":"","sources":["../../src/tools/computers.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiS5C,eAAO,MAAM,iBAAiB,EAAE,SAq4C/B,CAAC"}