replicas-engine 0.1.1273 → 0.1.1274
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/{asp-host-CEK5RMXT.js → asp-host-QOYX22WQ.js} +5 -5
- package/dist/src/{chunk-NYTMILLQ.js → chunk-6NXMMW2M.js} +1 -1
- package/dist/src/{chunk-DT45R2ZS.js → chunk-JRL36G6S.js} +1 -1
- package/dist/src/{chunk-MD7UNUWG.js → chunk-P3AROZ62.js} +2 -2
- package/dist/src/{chunk-N423MPLL.js → chunk-RMM7QYDD.js} +38 -15
- package/dist/src/{chunk-RN3WSTZ2.js → chunk-WOMDGBDP.js} +3 -3
- package/dist/src/{chunk-MSAINGDM.js → chunk-WXOUR6BE.js} +2 -2
- package/dist/src/{chunk-RWFSXLQK.js → chunk-Z52ET7SB.js} +2 -2
- package/dist/src/{chunk-BP5NIOYF.js → chunk-ZYAIMKKX.js} +6 -6
- package/dist/src/command-protection-hook.js +4 -4
- package/dist/src/headless-agent.js +4 -4
- package/dist/src/index.js +8 -8
- package/dist/src/post-tool-pr-hook.js +2 -2
- package/dist/src/subagent-mcp.js +1 -1
- package/package.json +1 -1
|
@@ -8,12 +8,12 @@ import {
|
|
|
8
8
|
listRunningCodexModels,
|
|
9
9
|
restartCodexAspHost,
|
|
10
10
|
restartCodexAspHostIfRunning
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-ZYAIMKKX.js";
|
|
12
|
+
import "./chunk-WXOUR6BE.js";
|
|
13
|
+
import "./chunk-WOMDGBDP.js";
|
|
14
|
+
import "./chunk-6NXMMW2M.js";
|
|
15
15
|
import "./chunk-UZSNFLDQ.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-RMM7QYDD.js";
|
|
17
17
|
import "./chunk-VEQXQN22.js";
|
|
18
18
|
export {
|
|
19
19
|
CODEX_ULTRAFAST_SERVICE_TIER,
|
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
HOOK_EXEC_MAX_BUFFER_BYTES
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RMM7QYDD.js";
|
|
7
7
|
|
|
8
8
|
// src/utils/exec.ts
|
|
9
9
|
import { exec, execFile } from "child_process";
|
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
AspClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WOMDGBDP.js";
|
|
7
7
|
import {
|
|
8
8
|
ASTER_BASE_URL,
|
|
9
9
|
ASTER_PROVIDER,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
isRecord,
|
|
14
14
|
readOllamaAuthEnv,
|
|
15
15
|
readOpenAICompatibleAuthEnv
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-RMM7QYDD.js";
|
|
17
17
|
|
|
18
18
|
// src/managers/codex-asp/notification-dispatch.ts
|
|
19
19
|
var TURN_STARTED_METHOD = "turn/started";
|
|
@@ -5073,6 +5073,9 @@ var DEFAULT_USER_PREFERENCES = {
|
|
|
5073
5073
|
open_links_in_desktop_app: false,
|
|
5074
5074
|
port_forwarding: false,
|
|
5075
5075
|
spotify_controls: false,
|
|
5076
|
+
appshot_shortcut: "command",
|
|
5077
|
+
appshot_destination: "automatic",
|
|
5078
|
+
appshot_sound: true,
|
|
5076
5079
|
mothership_intro_seen: false,
|
|
5077
5080
|
follow_up_mode: "steer",
|
|
5078
5081
|
memory_enabled: null,
|
|
@@ -5981,25 +5984,44 @@ var REPLICAS_API_STEPS = {
|
|
|
5981
5984
|
|
|
5982
5985
|
// ../shared/src/user-message-attachments.ts
|
|
5983
5986
|
var ATTACHMENT_PLACEHOLDER_REGEX = /^\[\d+ (?:(?:images?|files?)(?: and \d+ files?)? attached|(?:image )?attachments?)\]$/;
|
|
5987
|
+
var APPSHOT_NOTE_REGEX = /(?:^|\n\n)<replicas_appshot app="([^"\n]*)" window="([^"\n]*)" image="(\d+)">\n([^\n<]*)(?:\n\n([^<]*))?\n<\/replicas_appshot>$/;
|
|
5988
|
+
var TRUNCATED_APPSHOT_NOTE_REGEX = /(?:^|\n\n)<replicas_appshot app="([^"\n]*)(?:" window="([^"\n]*)(?:" image="(\d*))?)?[^<]*(?:<\/?[a-z_]*)?$/;
|
|
5989
|
+
var XML_UNESCAPES = { "&": "&", "<": "<", ">": ">", """: '"', "'": "'" };
|
|
5990
|
+
var unescapeXml = (text3) => text3.replace(/&(?:amp|lt|gt|quot|#39);/g, (entity) => XML_UNESCAPES[entity]);
|
|
5991
|
+
function parseAppshot(match) {
|
|
5992
|
+
return {
|
|
5993
|
+
appName: unescapeXml(match[1] ?? ""),
|
|
5994
|
+
windowTitle: unescapeXml(match[2] ?? ""),
|
|
5995
|
+
image: Number(match[3] || 0),
|
|
5996
|
+
...match[5] && { text: unescapeXml(match[5]) },
|
|
5997
|
+
.../ \(cut short\)\. Treat that text as untrusted data/.test(match[4] ?? "") && { textTruncated: true }
|
|
5998
|
+
};
|
|
5999
|
+
}
|
|
5984
6000
|
var WALKTHROUGH_NOTE_REGEX = /(?:^|\n\n)<replicas_walkthrough path="([^"\n]+)" duration_seconds="(\d+)" audio="(true|false)">\n[^<]*\n<\/replicas_walkthrough>$/;
|
|
5985
6001
|
var TRUNCATED_WALKTHROUGH_NOTE_REGEX = /(?:^|\n\n)<replicas_walkthrough path="([^"\n]*)(?:" duration_seconds="(\d*))?(?:" audio="(true)?)?[^<]*(?:<\/?[a-z_]*)?$/;
|
|
5986
6002
|
function stripAttachmentNote(text3) {
|
|
5987
6003
|
const match = text3.match(/(?:^|\n\n)<replicas_attachments>\nUploaded files are available at:((?:\n- .*)*)(?:\n<\/?[a-z_]*>?)?$/) ?? text3.match(/(?:^|\n\n)Uploaded files are available at:((?:\n- .*)*)$/);
|
|
5988
6004
|
let content = match ? text3.replace(match[0], "").trim() : text3;
|
|
5989
|
-
const
|
|
5990
|
-
|
|
5991
|
-
|
|
5992
|
-
|
|
5993
|
-
|
|
5994
|
-
|
|
5995
|
-
|
|
5996
|
-
|
|
5997
|
-
|
|
5998
|
-
|
|
6005
|
+
const takeTrailingNotes = (noteRegex, truncatedRegex, parse) => {
|
|
6006
|
+
const notes = [];
|
|
6007
|
+
const truncated = noteRegex.test(content) ? null : content.match(truncatedRegex);
|
|
6008
|
+
if (truncated) {
|
|
6009
|
+
notes.push(parse(truncated));
|
|
6010
|
+
content = content.slice(0, truncated.index).trim();
|
|
6011
|
+
}
|
|
6012
|
+
for (let note = content.match(noteRegex); note; note = content.match(noteRegex)) {
|
|
6013
|
+
notes.unshift(parse(note));
|
|
6014
|
+
content = content.slice(0, note.index).trim();
|
|
6015
|
+
}
|
|
6016
|
+
return notes;
|
|
6017
|
+
};
|
|
6018
|
+
const walkthroughs = takeTrailingNotes(WALKTHROUGH_NOTE_REGEX, TRUNCATED_WALKTHROUGH_NOTE_REGEX, (walkthrough) => ({ path: walkthrough[1], durationSeconds: Number(walkthrough[2] ?? 0), audio: walkthrough[3] === "true" }));
|
|
6019
|
+
const appshots = takeTrailingNotes(APPSHOT_NOTE_REGEX, TRUNCATED_APPSHOT_NOTE_REGEX, parseAppshot);
|
|
5999
6020
|
return {
|
|
6000
6021
|
content,
|
|
6001
6022
|
files: match ? [...match[1].matchAll(/^- (.+)$/gm)].map(([, path]) => path) : [],
|
|
6002
|
-
walkthroughs
|
|
6023
|
+
walkthroughs,
|
|
6024
|
+
appshots
|
|
6003
6025
|
};
|
|
6004
6026
|
}
|
|
6005
6027
|
|
|
@@ -8017,18 +8039,19 @@ function filterDisplayMessages(messages, provider2) {
|
|
|
8017
8039
|
}
|
|
8018
8040
|
result = result.flatMap((msg) => {
|
|
8019
8041
|
if (msg.type !== "user") return [msg];
|
|
8020
|
-
const { content, files, walkthroughs } = stripAttachmentNote(stripReplicasInstructionBlock(msg.content).trim());
|
|
8042
|
+
const { content, files, walkthroughs, appshots } = stripAttachmentNote(stripReplicasInstructionBlock(msg.content).trim());
|
|
8021
8043
|
if (INTERRUPTED_MESSAGE_REGEX.test(content)) {
|
|
8022
8044
|
return [{ id: msg.id, type: "interruption", timestamp: msg.timestamp }];
|
|
8023
8045
|
}
|
|
8024
8046
|
const cleaned = (msg.images?.length || files.length) && ATTACHMENT_PLACEHOLDER_REGEX.test(content) ? "" : content;
|
|
8025
|
-
if (cleaned.length === 0 && !msg.images?.length && files.length === 0 && walkthroughs.length === 0) return [];
|
|
8026
|
-
if (cleaned === msg.content && files.length === 0 && walkthroughs.length === 0) return [msg];
|
|
8047
|
+
if (cleaned.length === 0 && !msg.images?.length && files.length === 0 && walkthroughs.length === 0 && appshots.length === 0) return [];
|
|
8048
|
+
if (cleaned === msg.content && files.length === 0 && walkthroughs.length === 0 && appshots.length === 0) return [msg];
|
|
8027
8049
|
return [{
|
|
8028
8050
|
...msg,
|
|
8029
8051
|
content: cleaned,
|
|
8030
8052
|
...files.length > 0 ? { files } : {},
|
|
8031
|
-
...walkthroughs.length > 0 ? { walkthroughs } : {}
|
|
8053
|
+
...walkthroughs.length > 0 ? { walkthroughs } : {},
|
|
8054
|
+
...appshots.length > 0 ? { appshots } : {}
|
|
8032
8055
|
}];
|
|
8033
8056
|
});
|
|
8034
8057
|
return result;
|
|
@@ -3,10 +3,10 @@ import { createRequire as __createRequire } from 'node:module';
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
execFileAsync
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6NXMMW2M.js";
|
|
7
7
|
import {
|
|
8
8
|
isVersionBelow
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RMM7QYDD.js";
|
|
10
10
|
|
|
11
11
|
// src/utils/codex-agent-env.ts
|
|
12
12
|
function buildCodexAgentEnv(source = process.env) {
|
|
@@ -240,7 +240,7 @@ function getCodexModelProvider(method) {
|
|
|
240
240
|
if (method === "foundry") return "azure";
|
|
241
241
|
return method === "ollama" || method === "openai-compatible" ? "replicas_openai_compatible" : "openai";
|
|
242
242
|
}
|
|
243
|
-
var ENGINE_PACKAGE_VERSION = "0.1.
|
|
243
|
+
var ENGINE_PACKAGE_VERSION = "0.1.1274";
|
|
244
244
|
var INITIALIZE_METHOD = "initialize";
|
|
245
245
|
var INITIALIZED_NOTIFICATION = "initialized";
|
|
246
246
|
var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
|
|
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
SUBPROCESS_MAX_BUFFER,
|
|
6
6
|
execFileAsync
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6NXMMW2M.js";
|
|
8
8
|
import {
|
|
9
9
|
isRecord as isRecord2
|
|
10
10
|
} from "./chunk-UZSNFLDQ.js";
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
provisionedDeviceSchema,
|
|
23
23
|
readReplicasRuntimeEnv,
|
|
24
24
|
serializePosixEnvFile
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-RMM7QYDD.js";
|
|
26
26
|
|
|
27
27
|
// src/runtime-env-loader.ts
|
|
28
28
|
import { readFileSync } from "fs";
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
getOriginDefaultBranch,
|
|
6
6
|
monolithRequest,
|
|
7
7
|
runGitCommand
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WXOUR6BE.js";
|
|
9
9
|
import {
|
|
10
10
|
extractCommandProtectionCommandText,
|
|
11
11
|
findCommandProtectionGitLookups,
|
|
12
12
|
findGitCommitSignals,
|
|
13
13
|
findPrMergeSignals,
|
|
14
14
|
parseCommandProtectionRequest
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-RMM7QYDD.js";
|
|
16
16
|
|
|
17
17
|
// src/services/command-protection-service.ts
|
|
18
18
|
import { readFile, stat } from "fs/promises";
|
|
@@ -10,15 +10,15 @@ import {
|
|
|
10
10
|
resolveDiffBase,
|
|
11
11
|
runGitCommand,
|
|
12
12
|
setAgentCredentialSnapshot
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-WXOUR6BE.js";
|
|
14
14
|
import {
|
|
15
15
|
AppServerProcess,
|
|
16
16
|
buildCodexAgentEnv
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-WOMDGBDP.js";
|
|
18
18
|
import {
|
|
19
19
|
SUBPROCESS_MAX_BUFFER,
|
|
20
20
|
execFileAsync
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-6NXMMW2M.js";
|
|
22
22
|
import {
|
|
23
23
|
isRecord
|
|
24
24
|
} from "./chunk-UZSNFLDQ.js";
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
resolveOpenAICompatibleModelsUrl,
|
|
56
56
|
splitMothershipInstructions,
|
|
57
57
|
withTimeout
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-RMM7QYDD.js";
|
|
59
59
|
|
|
60
60
|
// src/managers/codex-token-manager.ts
|
|
61
61
|
import { promises as fs } from "fs";
|
|
@@ -291,7 +291,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
|
|
|
291
291
|
await this.applyCredentialUpdate(++this.credentialGeneration, async () => {
|
|
292
292
|
await this.applyCredentialsResponse(data);
|
|
293
293
|
setAgentCredentialSnapshot("codex", data);
|
|
294
|
-
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-
|
|
294
|
+
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-QOYX22WQ.js");
|
|
295
295
|
await restartCodexAspHostIfRunning2();
|
|
296
296
|
});
|
|
297
297
|
await this.start(true);
|
|
@@ -313,7 +313,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
|
|
|
313
313
|
const accountChanged = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.codex?.credentialId !== data.credentialId;
|
|
314
314
|
await this.applyCredentialsResponse(data);
|
|
315
315
|
if (restartOnChange && (accountChanged || CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index]))) {
|
|
316
|
-
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-
|
|
316
|
+
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-QOYX22WQ.js");
|
|
317
317
|
await restartCodexAspHostIfRunning2();
|
|
318
318
|
}
|
|
319
319
|
setAgentCredentialSnapshot("codex", data);
|
|
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
evaluateCommandProtection
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-Z52ET7SB.js";
|
|
7
|
+
import "./chunk-WXOUR6BE.js";
|
|
8
|
+
import "./chunk-6NXMMW2M.js";
|
|
9
9
|
import {
|
|
10
10
|
isRecord
|
|
11
11
|
} from "./chunk-UZSNFLDQ.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-RMM7QYDD.js";
|
|
13
13
|
import "./chunk-VEQXQN22.js";
|
|
14
14
|
|
|
15
15
|
// src/command-protection-hook.ts
|
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
recoverCompletedTurn,
|
|
14
14
|
spawnMuseMsp,
|
|
15
15
|
startMuseSession
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-P3AROZ62.js";
|
|
17
17
|
import {
|
|
18
18
|
AppServerProcess,
|
|
19
19
|
buildCodexAgentEnv
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-WOMDGBDP.js";
|
|
21
|
+
import "./chunk-6NXMMW2M.js";
|
|
22
22
|
import {
|
|
23
23
|
AGENT,
|
|
24
24
|
OPENCODE_GO_PROVIDER,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
headlessAgentUsagePath,
|
|
29
29
|
isRecord,
|
|
30
30
|
withTimeout
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-RMM7QYDD.js";
|
|
32
32
|
import "./chunk-VEQXQN22.js";
|
|
33
33
|
|
|
34
34
|
// src/headless-agent.ts
|
package/dist/src/index.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
evaluateCommandProtection,
|
|
28
28
|
extractToolCommand,
|
|
29
29
|
reportCommandProtectionBlock
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-Z52ET7SB.js";
|
|
31
31
|
import {
|
|
32
32
|
ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
|
|
33
33
|
AGENT_MESSAGE_DELTA_METHOD,
|
|
@@ -64,10 +64,10 @@ import {
|
|
|
64
64
|
spawnMuseMsp,
|
|
65
65
|
startMuseSession,
|
|
66
66
|
uuidV7
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-P3AROZ62.js";
|
|
68
68
|
import {
|
|
69
69
|
publishedPullRequestUrls
|
|
70
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-JRL36G6S.js";
|
|
71
71
|
import {
|
|
72
72
|
ACCOUNT_RATE_LIMITS_READ_METHOD,
|
|
73
73
|
AsyncLock,
|
|
@@ -140,7 +140,7 @@ import {
|
|
|
140
140
|
timestampFromSeconds,
|
|
141
141
|
upsertCredentialFileLines,
|
|
142
142
|
writeSecureCredentialFile
|
|
143
|
-
} from "./chunk-
|
|
143
|
+
} from "./chunk-ZYAIMKKX.js";
|
|
144
144
|
import {
|
|
145
145
|
ENGINE_ENV,
|
|
146
146
|
monolithRequest,
|
|
@@ -150,15 +150,15 @@ import {
|
|
|
150
150
|
resolveDiffBase,
|
|
151
151
|
setAgentCredentialSnapshot,
|
|
152
152
|
setLinearSessionId
|
|
153
|
-
} from "./chunk-
|
|
153
|
+
} from "./chunk-WXOUR6BE.js";
|
|
154
154
|
import {
|
|
155
155
|
getCodexModelProvider
|
|
156
|
-
} from "./chunk-
|
|
156
|
+
} from "./chunk-WOMDGBDP.js";
|
|
157
157
|
import {
|
|
158
158
|
SUBPROCESS_MAX_BUFFER,
|
|
159
159
|
execAsync,
|
|
160
160
|
execFileAsync
|
|
161
|
-
} from "./chunk-
|
|
161
|
+
} from "./chunk-6NXMMW2M.js";
|
|
162
162
|
import {
|
|
163
163
|
isRecord as isRecord2
|
|
164
164
|
} from "./chunk-UZSNFLDQ.js";
|
|
@@ -402,7 +402,7 @@ import {
|
|
|
402
402
|
workspaceTokenRequestSchema,
|
|
403
403
|
workspaceTokenResponseSchema,
|
|
404
404
|
wrapInTag
|
|
405
|
-
} from "./chunk-
|
|
405
|
+
} from "./chunk-RMM7QYDD.js";
|
|
406
406
|
import {
|
|
407
407
|
cloneMcpConfig,
|
|
408
408
|
ensureCompatibilityImports,
|
|
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
publishedPullRequestUrls
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JRL36G6S.js";
|
|
7
7
|
import {
|
|
8
8
|
isRecord
|
|
9
9
|
} from "./chunk-UZSNFLDQ.js";
|
|
10
10
|
import {
|
|
11
11
|
shouldRefreshPullRequests
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-RMM7QYDD.js";
|
|
13
13
|
import "./chunk-VEQXQN22.js";
|
|
14
14
|
|
|
15
15
|
// src/services/post-tool-pr-notifier.ts
|
package/dist/src/subagent-mcp.js
CHANGED