@sema-agent/core 3.0.0 → 5.0.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 (153) hide show
  1. package/CHANGELOG.md +2382 -0
  2. package/dist/agents/cascade.d.ts +3 -1
  3. package/dist/agents/cascade.js +31 -32
  4. package/dist/agents/cumulative-stats.d.ts +29 -0
  5. package/dist/agents/cumulative-stats.js +29 -0
  6. package/dist/agents/observer.d.ts +4 -0
  7. package/dist/agents/observer.js +11 -10
  8. package/dist/agents/repair-loop.d.ts +2 -0
  9. package/dist/agents/repair-loop.js +48 -24
  10. package/dist/agents/retain-ledger.d.ts +2 -0
  11. package/dist/agents/retain-ledger.js +6 -5
  12. package/dist/agents/roster-store.d.ts +1 -0
  13. package/dist/agents/roster-store.js +3 -5
  14. package/dist/agents/send-message-tool.d.ts +1 -0
  15. package/dist/agents/send-message-tool.js +2 -0
  16. package/dist/agents/subagent.d.ts +3 -1
  17. package/dist/agents/subagent.js +79 -94
  18. package/dist/agents/teacher.d.ts +1 -9
  19. package/dist/agents/teacher.js +21 -24
  20. package/dist/agents/tool-filter.js +6 -7
  21. package/dist/agents/verify.d.ts +1 -0
  22. package/dist/agents/verify.js +15 -14
  23. package/dist/brain/anthropic.js +24 -21
  24. package/dist/brain/openai.js +24 -21
  25. package/dist/brain/stream-engine.js +5 -2
  26. package/dist/brain/stream-shared.d.ts +1 -0
  27. package/dist/brain/stream-shared.js +14 -0
  28. package/dist/brain/terminal-cause.d.ts +4 -0
  29. package/dist/brain/terminal-cause.js +12 -0
  30. package/dist/brain/tool-call-id.d.ts +1 -0
  31. package/dist/brain/tool-call-id.js +3 -0
  32. package/dist/brain/tool-call-repair.js +2 -1
  33. package/dist/core/arg-summary.d.ts +21 -1
  34. package/dist/core/arg-summary.js +61 -14
  35. package/dist/core/auto-compaction.d.ts +1 -0
  36. package/dist/core/auto-compaction.js +16 -25
  37. package/dist/core/background-agent-store.d.ts +22 -22
  38. package/dist/core/background-agent-store.js +19 -23
  39. package/dist/core/checkpoint-store.d.ts +6 -13
  40. package/dist/core/checkpoint-store.js +11 -5
  41. package/dist/core/file-snapshot-store.d.ts +8 -0
  42. package/dist/core/file-snapshot-store.js +4 -3
  43. package/dist/core/fs-write-gate-policy.js +2 -3
  44. package/dist/core/hooks.d.ts +4 -1
  45. package/dist/core/hooks.js +8 -18
  46. package/dist/core/lsp.js +4 -3
  47. package/dist/core/mailbox-store.d.ts +7 -10
  48. package/dist/core/mcp.d.ts +7 -10
  49. package/dist/core/mcp.js +7 -9
  50. package/dist/core/memory-engine/engine.d.ts +0 -1
  51. package/dist/core/memory-engine/engine.js +24 -34
  52. package/dist/core/memory-engine/file-backend.d.ts +1 -2
  53. package/dist/core/memory-engine/file-backend.js +25 -36
  54. package/dist/core/memory-engine/layout.d.ts +8 -0
  55. package/dist/core/memory-engine/layout.js +60 -4
  56. package/dist/core/memory-engine/scope-contract.js +9 -3
  57. package/dist/core/memory-engine/types.d.ts +1 -1
  58. package/dist/core/permission-rules.js +2 -3
  59. package/dist/core/runner/active-skill-scope.d.ts +0 -1
  60. package/dist/core/runner/active-skill-scope.js +2 -17
  61. package/dist/core/runner/assemble-result.d.ts +2 -7
  62. package/dist/core/runner/assemble-result.js +3 -4
  63. package/dist/core/runner/compaction-call-options.d.ts +7 -0
  64. package/dist/core/runner/compaction-call-options.js +30 -0
  65. package/dist/core/runner/prepare-task.d.ts +6 -23
  66. package/dist/core/runner/prepare-task.js +36 -61
  67. package/dist/core/runner/runtask.d.ts +1 -0
  68. package/dist/core/runner/runtask.js +84 -172
  69. package/dist/core/runner/session-rule-policy.js +7 -5
  70. package/dist/core/runner/teardown-bounded.d.ts +7 -0
  71. package/dist/core/runner/teardown-bounded.js +36 -0
  72. package/dist/core/runner/tool-disclosure.d.ts +2 -5
  73. package/dist/core/runner/turn-attachments.d.ts +5 -15
  74. package/dist/core/runner/turn-attachments.js +1 -1
  75. package/dist/core/safe-notify.d.ts +17 -0
  76. package/dist/core/safe-notify.js +59 -0
  77. package/dist/core/sensitive-path-policy.js +4 -4
  78. package/dist/core/session-reconcile.js +1 -2
  79. package/dist/core/skill-tool-specifier.js +2 -3
  80. package/dist/core/skills-directory.js +2 -3
  81. package/dist/core/store-contracts/checkpoint-store-contract.js +1 -1
  82. package/dist/core/stub-env.d.ts +2 -6
  83. package/dist/core/surrogate-safe-slice.d.ts +4 -0
  84. package/dist/core/surrogate-safe-slice.js +18 -0
  85. package/dist/core/task-registry-monitor.js +8 -13
  86. package/dist/core/task-registry-shared.d.ts +23 -1
  87. package/dist/core/task-registry-shared.js +16 -0
  88. package/dist/core/task-registry.d.ts +6 -1
  89. package/dist/core/task-registry.js +52 -87
  90. package/dist/core/task-tool-shape.d.ts +0 -2
  91. package/dist/core/task-tool-shape.js +2 -5
  92. package/dist/core/tool-errors.js +5 -4
  93. package/dist/core/tool-name-aliases.d.ts +1 -2
  94. package/dist/core/tool-name-aliases.js +42 -59
  95. package/dist/core/tool-policy.js +21 -17
  96. package/dist/core/tool-result-store.d.ts +1 -0
  97. package/dist/core/tool-result-store.js +17 -1
  98. package/dist/core/trace.d.ts +9 -9
  99. package/dist/core/types.d.ts +15 -12
  100. package/dist/core/untrusted-egress.d.ts +4 -2
  101. package/dist/core/untrusted-egress.js +28 -14
  102. package/dist/core/workflow-journal-store.d.ts +9 -20
  103. package/dist/core/workflow-run-store.d.ts +11 -10
  104. package/dist/core/workflow-run-store.js +22 -16
  105. package/dist/engine/compaction/utils.js +4 -2
  106. package/dist/engine/execution-env/node-execution-env.d.ts +2 -24
  107. package/dist/engine/execution-env/node-execution-env.js +1 -1
  108. package/dist/engine/harness/agent-harness.d.ts +1 -0
  109. package/dist/engine/harness/agent-harness.js +13 -33
  110. package/dist/engine/harness/types.d.ts +29 -67
  111. package/dist/engine/llm/types.d.ts +1 -1
  112. package/dist/engine/loop/agent-loop.js +12 -14
  113. package/dist/engine/loop/types.d.ts +11 -9
  114. package/dist/engine/session/memory-repo.d.ts +2 -6
  115. package/dist/engine/session/session.d.ts +5 -30
  116. package/dist/index.d.ts +6 -3
  117. package/dist/index.js +4 -3
  118. package/dist/internal/harness-types.d.ts +3 -1
  119. package/dist/orchestration/run-spec.js +6 -4
  120. package/dist/orchestration/run-workflow-tool.js +3 -36
  121. package/dist/orchestration/workflow-governance.js +2 -1
  122. package/dist/orchestration/workflow.d.ts +4 -11
  123. package/dist/orchestration/workflow.js +164 -204
  124. package/dist/prompt-assembly/packs/sema-default.js +1 -3
  125. package/dist/prompt-assembly/tool-catalog.d.ts +10 -9
  126. package/dist/prompt-assembly/turn-snapshot.d.ts +2 -5
  127. package/dist/prompts/default.js +1 -3
  128. package/dist/prompts/simple-sections.d.ts +0 -1
  129. package/dist/prompts/simple-sections.js +0 -1
  130. package/dist/stores/file/background-agent-store.d.ts +3 -12
  131. package/dist/stores/file/background-agent-store.js +3 -41
  132. package/dist/stores/file/checkpoint-store.js +6 -6
  133. package/dist/stores/file/mailbox-store.d.ts +2 -6
  134. package/dist/stores/file/session-policy-store.js +15 -1
  135. package/dist/stores/file/session-store.d.ts +2 -6
  136. package/dist/stores/file/workflow-journal-store.d.ts +3 -11
  137. package/dist/stores/file/workflow-run-store.d.ts +3 -7
  138. package/dist/stores/file/workflow-run-store.js +4 -17
  139. package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -0
  140. package/dist/tools/fs/bash-readonly-classifier.js +60 -25
  141. package/dist/tools/fs/fs-bash.js +330 -104
  142. package/dist/tools/fs/fs-pdf.d.ts +2 -12
  143. package/dist/tools/fs/fs-shared.js +2 -2
  144. package/dist/tools/fs/fs-write.js +0 -1
  145. package/dist/tools/fs/notebook.d.ts +2 -5
  146. package/dist/tools/fs/safety.d.ts +3 -0
  147. package/dist/tools/fs/safety.js +43 -14
  148. package/dist/tools/fs/search.js +5 -5
  149. package/dist/tools/monitor.d.ts +1 -0
  150. package/dist/tools/monitor.js +7 -5
  151. package/dist/tools/worktree.d.ts +2 -7
  152. package/dist/tools/worktree.js +3 -1
  153. package/package.json +6 -2
@@ -22,8 +22,11 @@ export interface FsViolation {
22
22
  roots?: readonly string[];
23
23
  message: string;
24
24
  }
25
+ export declare function isAbsolutePathForm(p: string): boolean;
26
+ export declare function isWinFormPath(p: string): boolean;
25
27
  export declare function isBlockedDevicePath(key: string): boolean;
26
28
  export declare function normalizeAbsPathLexically(p: string): string;
29
+ export declare function foldRedundantPathSegments(p: string): string;
27
30
  export declare function hasBinaryExtension(path: string): boolean;
28
31
  export declare function imageMimeForRead(path: string): string | undefined;
29
32
  export declare function imageMagicMatches(bytes: Uint8Array, mimeType: string): boolean;
@@ -18,20 +18,20 @@ export function sha256(content) {
18
18
  return createHash("sha256").update(content, "utf8").digest("hex");
19
19
  }
20
20
  const SEP = "/";
21
- function isAbsolutePathForm(p) {
22
- return p.startsWith("/") || /^[A-Za-z]:[\\/]/.test(p);
21
+ export function isAbsolutePathForm(p) {
22
+ return p.startsWith("/") || /^[A-Za-z]:[\\/]/.test(p) || p.startsWith("\\\\");
23
23
  }
24
24
  function normalizeForCompare(p) {
25
- let n = p.replace(/\\/g, "/");
25
+ let n = isWinFormPath(p) ? p.replace(/\\/g, "/") : p;
26
26
  if (/^[A-Za-z]:(\/|$)/.test(n))
27
27
  n = n[0].toLowerCase() + n.slice(1);
28
28
  return n;
29
29
  }
30
30
  function nativeSepOf(p) {
31
- return p.includes("\\") ? "\\" : "/";
31
+ return isWinFormPath(p) && p.includes("\\") ? "\\" : "/";
32
32
  }
33
33
  function lastSepIndex(p) {
34
- return Math.max(p.lastIndexOf("/"), p.lastIndexOf("\\"));
34
+ return isWinFormPath(p) ? Math.max(p.lastIndexOf("/"), p.lastIndexOf("\\")) : p.lastIndexOf("/");
35
35
  }
36
36
  const BLOCKED_DEVICE_PATHS = new Set([
37
37
  "/dev/zero", "/dev/random", "/dev/urandom", "/dev/full",
@@ -46,7 +46,7 @@ function isProcSensitiveFile(key) {
46
46
  return key.startsWith("/proc/") && PROC_SENSITIVE_SUFFIXES.some((suf) => key.endsWith(suf));
47
47
  }
48
48
  const WIN_RESERVED_RE = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.[^\\/]*)?$/i;
49
- function isWinFormPath(p) {
49
+ export function isWinFormPath(p) {
50
50
  return /^[A-Za-z]:[\\/]/.test(p) || p.startsWith("\\\\") || (!p.startsWith("/") && p.includes("\\"));
51
51
  }
52
52
  function isWinReservedDeviceKey(key) {
@@ -60,19 +60,48 @@ export function isBlockedDevicePath(key) {
60
60
  return BLOCKED_DEVICE_PATHS.has(key) || isProcStdioFd(key) || isProcSensitiveFile(key) || isWinReservedDeviceKey(key);
61
61
  }
62
62
  export function normalizeAbsPathLexically(p) {
63
- if (!p.startsWith("/"))
64
- return p;
65
- const out = [];
66
- for (const seg of p.split("/")) {
63
+ return foldSegmentsLexically(p, true);
64
+ }
65
+ export function foldRedundantPathSegments(p) {
66
+ return foldSegmentsLexically(p, false);
67
+ }
68
+ function foldSegmentsLexically(p, foldParents) {
69
+ const isUnc = p.startsWith("\\\\");
70
+ const drive = /^[A-Za-z]:/.exec(p)?.[0] ?? "";
71
+ const winForm = isUnc || drive !== "" || (!p.startsWith("/") && p.includes("\\"));
72
+ const sep = winForm && p.includes("\\") ? "\\" : "/";
73
+ const splitter = winForm ? /[\\/]+/ : /\/+/;
74
+ let prefix = drive;
75
+ let rest = p.slice(drive.length + (isUnc ? 2 : 0));
76
+ let abs = rest.startsWith("/") || (winForm && rest.startsWith("\\"));
77
+ if (isUnc) {
78
+ const segs = rest.split(splitter).filter((seg) => seg !== "");
79
+ const host = segs.shift() ?? "";
80
+ const share = segs.shift();
81
+ prefix = sep + sep + host + (share === undefined ? "" : sep + share);
82
+ rest = segs.join(sep);
83
+ abs = true;
84
+ }
85
+ const outSegs = [];
86
+ for (const seg of rest.split(splitter)) {
67
87
  if (seg === "" || seg === ".")
68
88
  continue;
69
89
  if (seg === "..") {
70
- out.pop();
90
+ if (!foldParents) {
91
+ outSegs.push(seg);
92
+ continue;
93
+ }
94
+ if (outSegs.length > 0 && outSegs[outSegs.length - 1] !== "..")
95
+ outSegs.pop();
96
+ else if (!abs)
97
+ outSegs.push("..");
71
98
  continue;
72
99
  }
73
- out.push(seg);
100
+ outSegs.push(seg);
74
101
  }
75
- return `/${out.join("/")}`;
102
+ if (outSegs.length === 0)
103
+ return abs ? prefix + sep : prefix === "" ? "." : prefix;
104
+ return prefix + (abs ? sep : "") + outSegs.join(sep);
76
105
  }
77
106
  const BINARY_EXTENSIONS = new Set([
78
107
  ".exe", ".dll", ".so", ".dylib", ".o", ".a", ".obj", ".lib", ".bin", ".class", ".pyc", ".pyo", ".wasm",
@@ -229,7 +258,7 @@ function parentDir(abs) {
229
258
  }
230
259
  async function canonicalizeNewPath(env, abs, signal) {
231
260
  const sep = nativeSepOf(abs);
232
- const parts = abs.split(/[\\/]/);
261
+ const parts = isWinFormPath(abs) ? abs.split(/[\\/]/) : abs.split("/");
233
262
  const tail = [];
234
263
  while (parts.length > 1) {
235
264
  const candidate = parts.join(sep) || sep;
@@ -1,5 +1,5 @@
1
1
  import { delimitUntrusted } from "../../core/untrusted-text.js";
2
- import { hasBinaryExtension } from "./safety.js";
2
+ import { hasBinaryExtension, isAbsolutePathForm } from "./safety.js";
3
3
  const WALK_MAX_FILES = 5000;
4
4
  const WALK_MAX_DEPTH = 32;
5
5
  const GREP_DEFAULT_CAP = 250;
@@ -51,7 +51,7 @@ export function splitGlobParam(glob) {
51
51
  return out;
52
52
  }
53
53
  export function splitAbsoluteGlobPattern(pattern) {
54
- if (!(pattern.startsWith("/") || /^[A-Za-z]:[\\/]/.test(pattern)))
54
+ if (!isAbsolutePathForm(pattern))
55
55
  return undefined;
56
56
  const m = /[*?[{]/.exec(pattern);
57
57
  if (!m) {
@@ -758,7 +758,7 @@ export async function jsGrep(env, root, p, signal, guards) {
758
758
  }
759
759
  const ignore = await buildIgnore(env, root, signal);
760
760
  const rootPrefix = root.replace(/[\\/]+$/, "") + (root.includes("\\") ? "\\" : "/");
761
- const start = p.path ? (p.path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(p.path) ? p.path : `${rootPrefix}${p.path}`) : root;
761
+ const start = p.path ? (isAbsolutePathForm(p.path) ? p.path : `${rootPrefix}${p.path}`) : root;
762
762
  let walked;
763
763
  if (p.path) {
764
764
  const info = await env.fileInfo(start, signal);
@@ -992,7 +992,7 @@ async function sortRgFilesByMtime(env, root, stdout, signal) {
992
992
  const rootPrefix = root.replace(/[\\/]+$/, "") + (root.includes("\\") ? "\\" : "/");
993
993
  const toAbs = (p) => {
994
994
  const stripped = p.startsWith("./") ? p.slice(2) : p;
995
- return stripped.startsWith("/") || /^[A-Za-z]:[\\/]/.test(stripped) ? stripped : `${rootPrefix}${stripped}`;
995
+ return isAbsolutePathForm(stripped) ? stripped : `${rootPrefix}${stripped}`;
996
996
  };
997
997
  const infos = await Promise.all(paths.map((p) => env.fileInfo(toAbs(p), signal)));
998
998
  const withMtime = paths.map((p, i) => {
@@ -1104,7 +1104,7 @@ export async function runGlobDetailed(env, root, pattern, opts = {}, signal) {
1104
1104
  const t0 = Date.now();
1105
1105
  const baseIgnore = await buildIgnore(env, root, signal);
1106
1106
  const rootPrefix = root.replace(/[\\/]+$/, "") + (root.includes("\\") ? "\\" : "/");
1107
- const start = opts.path ? (opts.path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(opts.path) ? opts.path : `${rootPrefix}${opts.path}`) : root;
1107
+ const start = opts.path ? (isAbsolutePathForm(opts.path) ? opts.path : `${rootPrefix}${opts.path}`) : root;
1108
1108
  if (opts.path !== undefined) {
1109
1109
  const probe = await env.fileInfo(start, signal);
1110
1110
  if (!probe.ok && probe.error.code === "not_found") {
@@ -17,5 +17,6 @@ export interface MonitorToolOptions {
17
17
  batchWindowMs?: number;
18
18
  maxBatchesPerMinute?: number;
19
19
  toolResultStore?: ToolResultStore;
20
+ retainBackgroundProcesses?: boolean;
20
21
  }
21
22
  export declare function createMonitorTool(env: ExecutionEnv, opts: MonitorToolOptions): AgentTool;
@@ -124,14 +124,16 @@ export function createMonitorTool(env, opts) {
124
124
  ? `the execution environment kills background processes after ${bgTimeout}s`
125
125
  : `the execution environment's background time budget still applies`;
126
126
  const retainedByEnv = env.backgroundCapabilities.retainBackgroundProcesses === true;
127
+ const retainedBySpec = opts.retainBackgroundProcesses === true;
128
+ const retained = retainedByEnv || retainedBySpec;
127
129
  const persistentAnchor = sessionScoped
128
- ? retainedByEnv
129
- ? ". This environment declares retained background processes, so at the run teardown the watch is marked retained and " +
130
+ ? retained
131
+ ? ". This run retains background processes (environment capability or task spec), so at the run teardown the watch is marked retained and " +
130
132
  "survives the session's release: only your TaskStop, the command's own exit, or that budget end it."
131
133
  : "; it runs until then, until you stop it, or until the session ends."
132
- : retainedByEnv
134
+ : retained
133
135
  ? ". This mount carries no session identity, so the watch is NOT session-resident despite persistent: true; and because this " +
134
- "environment declares retained background processes it survives the session's release rather than being settled with the run — " +
136
+ "run retains background processes (environment capability or task spec) it survives the session's release rather than being settled with the run — " +
135
137
  "nothing but your TaskStop, the command's own exit, or that budget will end it, and no later turn can reach it " +
136
138
  "(stop it explicitly with TaskStop before you finish)."
137
139
  : ". This mount carries no session identity, so the watch is NOT session-resident despite persistent: true — " +
@@ -158,7 +160,7 @@ export function createMonitorTool(env, opts) {
158
160
  ...(envWallWins && envWallMs !== undefined ? { effectiveTimeoutMs: envWallMs } : {}),
159
161
  ...(isPersistent
160
162
  ?
161
- { timeoutIgnored: timeout_ms !== undefined, sessionScoped, ...(retainedByEnv ? { retainedByEnv: true } : {}) }
163
+ { timeoutIgnored: timeout_ms !== undefined, sessionScoped, ...(retainedByEnv ? { retainedByEnv: true } : {}), ...(retainedBySpec ? { retainedBySpec: true } : {}) }
162
164
  : { timeoutMs, ...(timeout_ms !== undefined ? { requestedTimeoutMs: timeout_ms } : {}), wasClamped }),
163
165
  },
164
166
  };
@@ -1,11 +1,6 @@
1
- import type { AgentTool, ExecutionEnv } from "../internal/harness-types.js";
1
+ import type { ActiveWorktreeSession, AgentTool, ExecutionEnv } from "../internal/harness-types.js";
2
2
  import type { CwdRef } from "./fs/index.js";
3
- export interface ActiveWorktreeSession {
4
- worktreeDir: string;
5
- originalCwd: string;
6
- baseSha: string;
7
- entered?: boolean;
8
- }
3
+ export type { ActiveWorktreeSession };
9
4
  export interface WorktreeSessionRef {
10
5
  current?: ActiveWorktreeSession;
11
6
  exiting?: boolean;
@@ -174,7 +174,9 @@ export function createWorktreeTools(env, opts) {
174
174
  if (target === registered[0]) {
175
175
  return errorResult(`Error (EnterWorktree): ${target} is the main working tree, not a linked worktree — nothing to enter.`);
176
176
  }
177
- if (target !== repoRoot && !target.startsWith(repoRoot.endsWith("/") ? repoRoot : `${repoRoot}/`)) {
177
+ const rootCanon = await env.canonicalPath(repoRoot);
178
+ const fence = rootCanon.ok ? rootCanon.value : repoRoot;
179
+ if (target !== fence && !target.startsWith(fence.endsWith("/") ? fence : `${fence}/`)) {
178
180
  return errorResult(`Error (EnterWorktree): the worktree ${target} lives outside the task root ${repoRoot}; ` +
179
181
  "file containment stays anchored at the task root, so it cannot be entered from this session.");
180
182
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/core",
3
- "version": "3.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Stateless, task-oriented AI agent core",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -41,6 +41,7 @@
41
41
  "dist",
42
42
  "README.md",
43
43
  "NOTICE.md",
44
+ "CHANGELOG.md",
44
45
  "LICENSE"
45
46
  ],
46
47
  "engines": {
@@ -60,7 +61,10 @@
60
61
  "gate:blackbox": "node scripts/run-blackbox-gate.mjs",
61
62
  "gate:ledger": "node scripts/verify-hardening-ledger.mjs",
62
63
  "gate:compensation": "node scripts/verify-compensation-registry.mjs",
63
- "gate:message-branching": "node scripts/verify-no-message-branching.mjs"
64
+ "gate:message-branching": "node scripts/verify-no-message-branching.mjs",
65
+ "gate:failloud": "node scripts/verify-failloud.mjs",
66
+ "gate:domain-lexicon": "node scripts/verify-domain-lexicon.mjs",
67
+ "gate:single-mint": "node scripts/verify-single-mint.mjs"
64
68
  },
65
69
  "dependencies": {
66
70
  "@modelcontextprotocol/sdk": "1.29.0",