@sema-agent/core 1.299.1 → 1.301.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 (102) hide show
  1. package/dist/agents/subagent.d.ts.map +1 -1
  2. package/dist/agents/subagent.js +124 -50
  3. package/dist/agents/subagent.js.map +1 -1
  4. package/dist/core/auto-mode-prompt.d.ts.map +1 -1
  5. package/dist/core/auto-mode-prompt.js +25 -2
  6. package/dist/core/auto-mode-prompt.js.map +1 -1
  7. package/dist/core/checkpoint-store.d.ts +5 -0
  8. package/dist/core/checkpoint-store.d.ts.map +1 -1
  9. package/dist/core/checkpoint-store.js.map +1 -1
  10. package/dist/core/memory-engine/engine.d.ts +2 -2
  11. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  12. package/dist/core/memory-engine/engine.js +3 -3
  13. package/dist/core/memory-engine/engine.js.map +1 -1
  14. package/dist/core/memory-engine/file-backend.d.ts.map +1 -1
  15. package/dist/core/memory-engine/file-backend.js +17 -0
  16. package/dist/core/memory-engine/file-backend.js.map +1 -1
  17. package/dist/core/memory-engine/frontmatter.d.ts.map +1 -1
  18. package/dist/core/memory-engine/frontmatter.js +62 -1
  19. package/dist/core/memory-engine/frontmatter.js.map +1 -1
  20. package/dist/core/memory-engine/memory-backend-contract.d.ts.map +1 -1
  21. package/dist/core/memory-engine/memory-backend-contract.js +45 -0
  22. package/dist/core/memory-engine/memory-backend-contract.js.map +1 -1
  23. package/dist/core/memory-engine/sync-client.d.ts.map +1 -1
  24. package/dist/core/memory-engine/sync-client.js +23 -0
  25. package/dist/core/memory-engine/sync-client.js.map +1 -1
  26. package/dist/core/memory-engine/types.d.ts +7 -0
  27. package/dist/core/memory-engine/types.d.ts.map +1 -1
  28. package/dist/core/runner/prepare-task.d.ts +12 -1
  29. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  30. package/dist/core/runner/prepare-task.js +120 -10
  31. package/dist/core/runner/prepare-task.js.map +1 -1
  32. package/dist/core/runner/prompt-suggestions.d.ts.map +1 -1
  33. package/dist/core/runner/prompt-suggestions.js +14 -2
  34. package/dist/core/runner/prompt-suggestions.js.map +1 -1
  35. package/dist/core/runner/runtask.d.ts.map +1 -1
  36. package/dist/core/runner/runtask.js +177 -59
  37. package/dist/core/runner/runtask.js.map +1 -1
  38. package/dist/core/runner/synthetic-tools.d.ts +11 -1
  39. package/dist/core/runner/synthetic-tools.d.ts.map +1 -1
  40. package/dist/core/runner/synthetic-tools.js +47 -28
  41. package/dist/core/runner/synthetic-tools.js.map +1 -1
  42. package/dist/core/runner/turn-attachments.d.ts +14 -3
  43. package/dist/core/runner/turn-attachments.d.ts.map +1 -1
  44. package/dist/core/runner/turn-attachments.js +59 -7
  45. package/dist/core/runner/turn-attachments.js.map +1 -1
  46. package/dist/core/scheduler.d.ts +5 -0
  47. package/dist/core/scheduler.d.ts.map +1 -1
  48. package/dist/core/scheduler.js.map +1 -1
  49. package/dist/core/task-registry.d.ts +31 -2
  50. package/dist/core/task-registry.d.ts.map +1 -1
  51. package/dist/core/task-registry.js +35 -6
  52. package/dist/core/task-registry.js.map +1 -1
  53. package/dist/core/tool-policy.d.ts +11 -2
  54. package/dist/core/tool-policy.d.ts.map +1 -1
  55. package/dist/core/tool-policy.js +14 -0
  56. package/dist/core/tool-policy.js.map +1 -1
  57. package/dist/core/trace.d.ts.map +1 -1
  58. package/dist/core/trace.js.map +1 -1
  59. package/dist/core/types.d.ts +8 -2
  60. package/dist/core/types.d.ts.map +1 -1
  61. package/dist/core/untrusted-text.d.ts +23 -0
  62. package/dist/core/untrusted-text.d.ts.map +1 -1
  63. package/dist/core/untrusted-text.js +69 -0
  64. package/dist/core/untrusted-text.js.map +1 -1
  65. package/dist/engine/compaction/utils.d.ts.map +1 -1
  66. package/dist/engine/compaction/utils.js +20 -1
  67. package/dist/engine/compaction/utils.js.map +1 -1
  68. package/dist/engine/harness/agent-harness.d.ts +11 -4
  69. package/dist/engine/harness/agent-harness.d.ts.map +1 -1
  70. package/dist/engine/harness/agent-harness.js +23 -6
  71. package/dist/engine/harness/agent-harness.js.map +1 -1
  72. package/dist/engine/harness/messages.d.ts.map +1 -1
  73. package/dist/engine/harness/messages.js +1 -0
  74. package/dist/engine/harness/messages.js.map +1 -1
  75. package/dist/engine/harness/types.d.ts.map +1 -1
  76. package/dist/engine/harness/types.js.map +1 -1
  77. package/dist/engine/llm/types.d.ts +7 -0
  78. package/dist/engine/llm/types.d.ts.map +1 -1
  79. package/dist/engine/loop/agent-loop.js +7 -0
  80. package/dist/engine/loop/agent-loop.js.map +1 -1
  81. package/dist/engine/loop/types.d.ts +1 -0
  82. package/dist/engine/loop/types.d.ts.map +1 -1
  83. package/dist/engine/session/import-validate.d.ts.map +1 -1
  84. package/dist/engine/session/import-validate.js +31 -0
  85. package/dist/engine/session/import-validate.js.map +1 -1
  86. package/dist/index.d.ts +1 -1
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/prompts/default.d.ts.map +1 -1
  91. package/dist/prompts/default.js.map +1 -1
  92. package/dist/tools/fs/index.d.ts +0 -1
  93. package/dist/tools/fs/index.d.ts.map +1 -1
  94. package/dist/tools/fs/index.js +2 -3
  95. package/dist/tools/fs/index.js.map +1 -1
  96. package/dist/tools/scheduler-tools.d.ts.map +1 -1
  97. package/dist/tools/scheduler-tools.js +71 -16
  98. package/dist/tools/scheduler-tools.js.map +1 -1
  99. package/dist/tools/worktree.d.ts.map +1 -1
  100. package/dist/tools/worktree.js +6 -5
  101. package/dist/tools/worktree.js.map +1 -1
  102. package/package.json +1 -1
@@ -17,7 +17,7 @@ import { classifyScopePlanes, derivePersonalControlDir, derivePersonalMemoryDir,
17
17
  import { FileMemoryEngineBackend } from "../memory-engine/file-backend.js";
18
18
  import { Session, isSessionConflict, hasSessionFork } from "../session.js";
19
19
  import { createAgentTranscriptTool, createSendMessageTool, createSubagentWorktreeHelper, forkGovernanceDenial, AGENT_TRANSCRIPT_TOOL_NAME, SEND_MESSAGE_TOOL_NAME, SubagentRetainLedger } from "../../agents/subagent.js";
20
- import { combinePolicies, createTranscriptIntegrityPolicy, createUnverifiableDeletePolicy, resolveAsk } from "../tool-policy.js";
20
+ import { combinePolicies, createTranscriptIntegrityPolicy, createUnverifiableDeletePolicy, resolveAsk, toolPolicyNameSets } from "../tool-policy.js";
21
21
  import { ActiveSkillScope, createActiveSkillScopePolicy } from "./active-skill-scope.js";
22
22
  import { computeCallCap, createCallCapRef, softExecDeadlineMs, toolCutDeadlineMs, WALLTIME_STALL_CONNECT_MS, WALLTIME_STALL_FIRST_TOKEN_MS, WALLTIME_STALL_IDLE_MS } from "./call-cap.js";
23
23
  import { createCutKillRegistry } from "./cut-kill.js";
@@ -32,7 +32,7 @@ import { defineTool } from "../tools.js";
32
32
  import { canonicalToolName } from "../tool-name-aliases.js";
33
33
  import { pathToUri } from "../lsp-protocol.js";
34
34
  import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, firstPartyOffloadPolicy, InMemoryToolResultStore, RunnerSharedToolResultStore, ScopedToolResultStore, isVolatileOffloadStore, OFFLOAD_TOOL_NAME, makeReadToolResultTool, withToolResultOffload, } from "../tool-result-store.js";
35
- import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, buildSkillsBlock, makeOutputTool, makeReportBlockedTool, makeReportFindingsTool, makeSkillTool, normalizeSkills } from "./synthetic-tools.js";
35
+ import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, makeOutputTool, makeReportBlockedTool, makeReportFindingsTool, makeSkillTool, normalizeSkills } from "./synthetic-tools.js";
36
36
  import { compileOutputSchema } from "./strict-output-schema.js";
37
37
  import { TOOL_SEARCH_NAME, buildDeferredRegistry, classifyDeferred, extractDiscoveredToolNames, makePlaceholderTool, makeToolSearchTool, } from "./tool-disclosure.js";
38
38
  import { composeMemoryBlock, normalizeMemorySpec } from "../memory.js";
@@ -66,6 +66,8 @@ const ULTRA_REASONING_TIERS = new Set(["xhigh", "max"]);
66
66
  const DEFAULT_RESOURCE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
67
67
  const DEFAULT_UNATTENDED_APPROVAL_TTL_MS = 30 * 24 * 60 * 60 * 1000;
68
68
  const ungatedWarnedShapes = new WeakMap();
69
+ const advisedPolicyNames = new WeakMap();
70
+ const ADVISED_KEYS_CAP = 64;
69
71
  export const DEFAULT_IRREVERSIBLE_SCOPE = "irreversible";
70
72
  function batchContextAt(messages, currentId) {
71
73
  let batch = [];
@@ -380,6 +382,12 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
380
382
  }
381
383
  let ownedEnv;
382
384
  let mcp;
385
+ if (internals?.requestedCwd !== undefined && deps.executionEnvFactory === undefined) {
386
+ await forgetOnThrow();
387
+ const e = new Error(`Agent cwd "${internals.requestedCwd}" cannot take effect: this deployment has no executionEnvFactory (a static execution environment cannot be re-rooted per agent). Drop the cwd parameter or deploy a factory.`);
388
+ e.code = "config.cwd_unsupported";
389
+ throw e;
390
+ }
383
391
  try {
384
392
  ownedEnv = deps.executionEnvFactory
385
393
  ? await deps.executionEnvFactory({
@@ -395,8 +403,39 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
395
403
  throw factoryErr;
396
404
  }
397
405
  const executionEnv = ownedEnv ?? deps.executionEnv ?? new StubExecutionEnv();
406
+ if (internals?.requestedCwd !== undefined) {
407
+ const canon = async (p) => {
408
+ const r = await executionEnv.canonicalPath(p);
409
+ return r.ok ? r.value : p;
410
+ };
411
+ const want = await canon(internals.requestedCwd);
412
+ const rejectCwd = async (message, code) => {
413
+ await forgetOnThrow();
414
+ try {
415
+ if (ownedEnv && hasDestroy(ownedEnv))
416
+ await ownedEnv.destroy();
417
+ }
418
+ catch {
419
+ }
420
+ const e = new Error(message);
421
+ e.code = code;
422
+ throw e;
423
+ };
424
+ if (deps.rootPath !== undefined) {
425
+ const root = await canon(deps.rootPath);
426
+ const sep = root.includes("\\") && !root.includes("/") ? "\\" : "/";
427
+ const rootPrefix = root.endsWith(sep) ? root : root + sep;
428
+ if (want !== root && !want.startsWith(rootPrefix)) {
429
+ await rejectCwd(`Agent cwd "${internals.requestedCwd}" is outside this deployment's declared root "${deps.rootPath}" — the cwd must be located within the deployment root.`, "config.cwd_outside_root");
430
+ }
431
+ }
432
+ const got = await canon(executionEnv.cwd);
433
+ if (want !== got) {
434
+ await rejectCwd(`Agent cwd "${internals.requestedCwd}" was not honored by the execution environment (it rooted at "${executionEnv.cwd}") — failing loud instead of running the agent in the wrong tree.`, "config.cwd_not_honored");
435
+ }
436
+ }
398
437
  const handsEnabled = ownedEnv !== undefined || deps.executionEnv !== undefined;
399
- const taskRootPath = internals?.isolation === "worktree" || !deps.rootPath ? executionEnv.cwd : deps.rootPath;
438
+ const taskRootPath = internals?.isolation === "worktree" || internals?.requestedCwd !== undefined || !deps.rootPath ? executionEnv.cwd : deps.rootPath;
400
439
  const abortController = new AbortController();
401
440
  if (spec.signal?.aborted)
402
441
  abortController.abort();
@@ -1267,7 +1306,19 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1267
1306
  }
1268
1307
  tools.push(makeSkillTool(skillSpecs, skillScope));
1269
1308
  }
1270
- const skillsBlock = buildSkillsBlock(skillSpecs);
1309
+ const skillsListing = skillSpecs.length > 0
1310
+ ? {
1311
+ entries: skillSpecs.map((s) => ({
1312
+ name: s.name,
1313
+ description: s.description,
1314
+ ...(s.files !== undefined ? { files: s.files.map((f) => ({ path: f.path })) } : {}),
1315
+ })),
1316
+ seedAnnounced: resume !== undefined,
1317
+ }
1318
+ :
1319
+ (resume?.seed.announcedListings?.skills?.length ?? 0) > 0
1320
+ ? { entries: [], seedAnnounced: true }
1321
+ : undefined;
1271
1322
  const provider = spec.promptProvider ?? deps.promptProvider ?? defaultPromptProvider;
1272
1323
  const promptPolicyEnabled = Boolean(spec.toolPolicy ?? deps.toolPolicy);
1273
1324
  const promptHooks = spec.hooks ?? deps.hooks;
@@ -1386,9 +1437,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1386
1437
  let promptConstitution = "core";
1387
1438
  let promptBlocks = [];
1388
1439
  const finishStable = (stableCore) => {
1389
- const stable = composeSystemPrompt(composeSystemPrompt(stableCore, skillsBlock), mcpInstructionsBlock);
1390
- if (skillsBlock?.trim())
1391
- promptBlocks.push({ id: "skills.block", text: skillsBlock });
1440
+ const stable = composeSystemPrompt(stableCore, mcpInstructionsBlock);
1392
1441
  if (mcpInstructionsBlock?.trim())
1393
1442
  promptBlocks.push({ id: "mcp.instructions", text: mcpInstructionsBlock });
1394
1443
  renderWithDate = (date) => composeSystemPrompt(composeSystemPrompt(stable, buildEnvironmentContext({ ...envFacts, date }) || undefined), memoryBlock);
@@ -1532,8 +1581,27 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1532
1581
  }
1533
1582
  const agentListingSpec = (spec.tools ?? []).find((t) => t.agentListing !== undefined && t.agentListing.length > 0);
1534
1583
  const agentListing = agentListingSpec
1535
- ? { entries: agentListingSpec.agentListing, toolName: agentListingSpec.name, seedAnnounced: resume !== undefined }
1536
- : undefined;
1584
+ ? {
1585
+ entries: agentListingSpec.agentListing,
1586
+ toolName: agentListingSpec.name,
1587
+ seedAnnounced: resume !== undefined,
1588
+ ...(agentListingSpec.agentModels !== undefined ? { models: agentListingSpec.agentModels } : {}),
1589
+ }
1590
+ :
1591
+ (resume?.seed.announcedListings?.agents?.length ?? 0) > 0
1592
+ ? {
1593
+ entries: [],
1594
+ toolName: (spec.tools ?? []).find((t) => t.agentListing !== undefined)?.name ?? "Agent",
1595
+ seedAnnounced: true,
1596
+ }
1597
+ : undefined;
1598
+ if (spec.attachments?.agentListing === false && agentListing !== undefined && agentListing.entries.length > 0) {
1599
+ deps.onError?.(new Error(`attachments.agentListing is explicitly false but the "${agentListing.toolName}" delegation tool mounts a ${agentListing.entries.length}-type roster — the model will never see the agent-type listing its tool description points to.`), { phase: "config", sessionId });
1600
+ }
1601
+ if (spec.attachments?.skillsListing === false && skillsListing !== undefined && skillsListing.entries.length > 0) {
1602
+ deps.onError?.(new Error(`attachments.skillsListing is explicitly false but ${skillsListing.entries.length} skill(s) are mounted — the model will never see the skills listing the ${SKILL_TOOL_NAME} tool description points to.`), { phase: "config", sessionId });
1603
+ }
1604
+ const announcedListingsRef = {};
1537
1605
  const dateChange = renderWithDate
1538
1606
  ? { legDate: envFacts.date, today: () => formatLocalDate(new Date(), tzValid ? userTz : undefined) }
1539
1607
  : undefined;
@@ -1623,6 +1691,41 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1623
1691
  }
1624
1692
  }
1625
1693
  const policy = spec.toolPolicy ?? deps.toolPolicy;
1694
+ {
1695
+ const nameGroups = toolPolicyNameSets(policy);
1696
+ if (nameGroups.length > 0) {
1697
+ const known = new Set(tools.flatMap((t) => [canonicalToolName(t.name), ...(t.aliases ?? []).map((a) => canonicalToolName(a))]));
1698
+ for (const t of harnessTools)
1699
+ known.add(canonicalToolName(t.name));
1700
+ const unmatched = new Set();
1701
+ for (const g of nameGroups) {
1702
+ for (const [kind, list] of [["deny", g.deny], ["ask", g.ask], ["allow", g.allow]]) {
1703
+ for (const n of list ?? []) {
1704
+ if (!known.has(canonicalToolName(n)))
1705
+ unmatched.add(`"${n}" (${kind})`);
1706
+ }
1707
+ }
1708
+ }
1709
+ const dedupeKey = [...unmatched].sort().join("|");
1710
+ const advised = advisedPolicyNames.get(deps) ?? new Set();
1711
+ if (unmatched.size > 0 && !advised.has(dedupeKey)) {
1712
+ advised.add(dedupeKey);
1713
+ if (advised.size > ADVISED_KEYS_CAP) {
1714
+ const oldest = advised.values().next().value;
1715
+ if (oldest !== undefined)
1716
+ advised.delete(oldest);
1717
+ }
1718
+ advisedPolicyNames.set(deps, advised);
1719
+ try {
1720
+ const e = new Error(`toolPolicy name audit: ${[...unmatched].join(", ")} match(es) no tool mounted this run (primary or alias) — the rule cannot fire here. Often a typo or a self-report/wire name skew (e.g. TodoWrite vs the mounted TaskCreate family; "*" has no wildcard meaning in a name-keyed policy). Advisory only: enforcement is unchanged, and a name can be legitimate for another scenario or a per-spawn tool.`);
1721
+ e.code = "config.toolpolicy.unmatched_names";
1722
+ deps.onError?.(e, { phase: "config", sessionId });
1723
+ }
1724
+ catch {
1725
+ }
1726
+ }
1727
+ }
1728
+ }
1626
1729
  let sessionRulePolicy;
1627
1730
  if (deps.sessionPolicyStore && spec.sessionId) {
1628
1731
  const rules = await deps.sessionPolicyStore.getRules(spec.sessionId, spec.principal);
@@ -1964,6 +2067,13 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1964
2067
  }
1965
2068
  : undefined;
1966
2069
  })(),
2070
+ announcedListings: announcedListingsRef.agents !== undefined || announcedListingsRef.skills !== undefined || announcedListingsRef.models !== undefined
2071
+ ? {
2072
+ ...(announcedListingsRef.agents !== undefined ? { agents: [...announcedListingsRef.agents] } : {}),
2073
+ ...(announcedListingsRef.skills !== undefined ? { skills: [...announcedListingsRef.skills] } : {}),
2074
+ ...(announcedListingsRef.models !== undefined ? { models: [...announcedListingsRef.models] } : {}),
2075
+ }
2076
+ : undefined,
1967
2077
  });
1968
2078
  const commitSuspendSaga = async (token, cp, remoteEnv, remoteHandle) => {
1969
2079
  if (!checkpointStore)
@@ -2509,7 +2619,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
2509
2619
  .list({ owner: hostTaskId, scope: taskScope, sessionId })
2510
2620
  .filter((t) => t.status === "pending" || t.status === "running")
2511
2621
  .map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}), status: t.status }));
2512
- return { harness, session, sessionId, taskRootPath, model, thinking, compModel, mcp, blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, nestedStats, cwdRef: handsCwdRef, denyNarrowingPolicy, releaseSignal, cacheBreakDetector, cacheFingerprint, promptManifest, activeTools, ownedEnv, suspendRef, reviewRef, reviewRequestRef, suspendLoopRef, suspendForResource, ...(callCapRef ? { callCapRef } : {}), ...(cutKills ? { cutKills } : {}), ...(callCapRef ? { callIssuedAtRef } : {}), suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, promptOverheadTokens, readTaskFile, recentlyReadFiles, compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), listBackgroundTasks };
2622
+ return { harness, session, sessionId, taskRootPath, model, thinking, compModel, mcp, blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, nestedStats, cwdRef: handsCwdRef, denyNarrowingPolicy, releaseSignal, cacheBreakDetector, cacheFingerprint, promptManifest, activeTools, ownedEnv, suspendRef, reviewRef, reviewRequestRef, suspendLoopRef, suspendForResource, ...(callCapRef ? { callCapRef } : {}), ...(cutKills ? { cutKills } : {}), ...(callCapRef ? { callIssuedAtRef } : {}), suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, promptOverheadTokens, readTaskFile, recentlyReadFiles, compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), ...(skillsListing ? { skillsListing } : {}), announcedListingsRef, listBackgroundTasks };
2513
2623
  }
2514
2624
  catch (prepareErr) {
2515
2625
  if (mcp) {