@algosuite/vo-mcp 0.2.0-beta.59 → 0.2.0-beta.60

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/index.js CHANGED
@@ -506,8 +506,8 @@ import { existsSync as existsSync8, readdirSync as readdirSync5, readFileSync as
506
506
  function extractMemoryTitle(fileName, content) {
507
507
  const frontmatter = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
508
508
  if (frontmatter) {
509
- const description23 = frontmatter[1].match(/^description:\s*(.+)$/m);
510
- if (description23 && description23[1].trim()) return description23[1].trim().slice(0, 200);
509
+ const description24 = frontmatter[1].match(/^description:\s*(.+)$/m);
510
+ if (description24 && description24[1].trim()) return description24[1].trim().slice(0, 200);
511
511
  }
512
512
  const heading = content.match(/^#\s+(.+)$/m);
513
513
  if (heading && heading[1].trim()) return heading[1].trim().slice(0, 200);
@@ -4142,14 +4142,16 @@ Produce the JSON dispatch plan now.`;
4142
4142
  init_auth_token_source();
4143
4143
  init_credential_store();
4144
4144
  var AdminCallableError = class extends Error {
4145
- constructor(status, path4, message) {
4145
+ constructor(status, path4, message, body) {
4146
4146
  super(message);
4147
4147
  this.status = status;
4148
4148
  this.path = path4;
4149
+ this.body = body;
4149
4150
  this.name = "AdminCallableError";
4150
4151
  }
4151
4152
  status;
4152
4153
  path;
4154
+ body;
4153
4155
  };
4154
4156
 
4155
4157
  // src/tools/cloud-call.ts
@@ -4184,11 +4186,12 @@ async function buildCloudOrStubResponse(args) {
4184
4186
  args.deps.events.append(event);
4185
4187
  return jsonContent(envelope);
4186
4188
  }
4189
+ const invokeOptions = args.rawEnvelope || args.invokeOptions ? { ...args.rawEnvelope ? { rawEnvelope: true } : {}, ...args.invokeOptions } : void 0;
4187
4190
  try {
4188
4191
  const result = await args.deps.adminCallables.invoke(
4189
4192
  args.adminPath,
4190
4193
  args.cloudBody ?? args.normalizedInput,
4191
- args.rawEnvelope ? { rawEnvelope: true } : void 0
4194
+ invokeOptions
4192
4195
  );
4193
4196
  const payload = {
4194
4197
  verdict: "pass",
@@ -4208,11 +4211,13 @@ async function buildCloudOrStubResponse(args) {
4208
4211
  } catch (err) {
4209
4212
  const status = err instanceof AdminCallableError ? err.status : void 0;
4210
4213
  const message = err instanceof Error ? err.message : String(err);
4214
+ const errorBody = err instanceof AdminCallableError && err.body !== void 0 ? err.body : void 0;
4211
4215
  const payload = {
4212
4216
  verdict: "fail",
4213
4217
  reason: status !== void 0 ? `vo-control-plane returned HTTP ${status}: ${message.slice(0, 300)}` : `cloud invocation failed: ${message.slice(0, 300)}`,
4214
4218
  callable: args.callableName,
4215
- normalized_input: args.normalizedInput
4219
+ normalized_input: args.normalizedInput,
4220
+ ...errorBody ? { response_data: errorBody } : {}
4216
4221
  };
4217
4222
  const envelope = {
4218
4223
  tool: args.toolName,
@@ -4887,6 +4892,135 @@ async function handleReviewMerge(deps, rawInput, signal) {
4887
4892
  });
4888
4893
  }
4889
4894
 
4895
+ // src/tools/runner/prepared-job-mode.ts
4896
+ var TOOL_NAME19 = "vo_prepared_job_mode";
4897
+ var CALLABLE_NAME10 = "GET|POST /api/v1/runner/prepared-job-mode";
4898
+ var PLANE_PATH = "/api/v1/runner/prepared-job-mode";
4899
+ var PREPARED_JOB_MODE_GATE_TYPE = "admin-action";
4900
+ var PREPARED_JOB_MODE_STUB_REASON = "cloud mode is not configured on this session, so vo-control-plane was not reached. Sign in with `vo-mcp login` to route this tool to the plane. This route is NOT under /api/v1/admin/*, so a tenant-scoped operator credential is the CORRECT principal for it \u2014 the target operator is derived from that principal, never from this input.";
4901
+ var PREPARED_JOB_MODES = ["off", "shadow", "prepared"];
4902
+ var MIN_REASON_CHARS = 10;
4903
+ var MAX_REASON_CHARS = 500;
4904
+ var MAX_RUNNER_ID_CHARS = 100;
4905
+ var inputSchema19 = {
4906
+ type: "object",
4907
+ properties: {
4908
+ action: {
4909
+ type: "string",
4910
+ enum: ["get", "set"],
4911
+ description: "Required. 'get' reads the delivered mode (read-only; stays live under VO_ADMIN_CALLABLES_READONLY). 'set' writes it (a write; gated to the stub in read-only mode)."
4912
+ },
4913
+ runner_id: {
4914
+ type: "string",
4915
+ minLength: 1,
4916
+ maxLength: MAX_RUNNER_ID_CHARS,
4917
+ description: "Required. Runner to read/configure, e.g. 'vo-code-runner-JacksPC'. Must belong to the authenticated operator \u2014 the plane scopes by principal, so another operator's runner simply reads as unset."
4918
+ },
4919
+ prepared_job_mode: {
4920
+ type: "string",
4921
+ enum: [...PREPARED_JOB_MODES],
4922
+ description: "Required for action='set'. 'off' = the runner's machine-local env rules; 'shadow' = compare the plane's prepared job without consuming it. 'prepared' is recognized but REFUSED by the plane with 409 prepared_mode_not_flippable (ADR-004 11.1c owns the flip)."
4923
+ },
4924
+ expected_revision: {
4925
+ type: "integer",
4926
+ minimum: 0,
4927
+ description: "Required for action='set'. Optimistic-concurrency revision read from a prior 'get' (use 0 when no config exists). A stale value returns 409 stale_prepared_job_revision carrying the authoritative current_revision."
4928
+ },
4929
+ reason: {
4930
+ type: "string",
4931
+ minLength: MIN_REASON_CHARS,
4932
+ maxLength: MAX_REASON_CHARS,
4933
+ description: `Required for action='set'. Audit reason stored on the config-change record; at least ${MIN_REASON_CHARS} characters after trimming.`
4934
+ }
4935
+ },
4936
+ required: ["action", "runner_id"],
4937
+ additionalProperties: false
4938
+ };
4939
+ var description19 = "Gets or sets a paired runner's plane-delivered prepared-job mode (ADR-004 \xA7 11.1) via vo-control-plane GET/POST /api/v1/runner/prepared-job-mode. action='get' returns the stored config ({prepared_job_mode, revision, reason, updated_at, updated_by}, or null when unset); action='set' writes it with optimistic concurrency and returns the new config plus an audit_id. THE TARGET OPERATOR IS DERIVED FROM THE AUTHENTICATED PRINCIPAL, never from this input \u2014 an admin token therefore writes under operator 'admin' and does NOT reach a scoped operator's runner, so use the operator credential from `vo-mcp login`. 'prepared' is refused by the plane with 409 prepared_mode_not_flippable; 'get' is read-only while 'set' is a write and is gated to a stub under VO_ADMIN_CALLABLES_READONLY. Falls back to a clearly-marked `unimplemented` envelope when cloud mode is not configured.";
4940
+ var SHAPE_HINT = `invalid input. Shape: { action: 'get' | 'set', runner_id: non-empty string \u2264${MAX_RUNNER_ID_CHARS} chars }. For action='set' also required: prepared_job_mode ('${PREPARED_JOB_MODES.join("' | '")}'), expected_revision (integer \u2265 0), reason (string \u2265${MIN_REASON_CHARS} chars after trim). Those three fields are NOT accepted with action='get'.`;
4941
+ function parseInput(v) {
4942
+ if (typeof v !== "object" || v === null || Array.isArray(v)) return null;
4943
+ const o = v;
4944
+ const action = o["action"];
4945
+ if (action !== "get" && action !== "set") return null;
4946
+ const rawRunnerId = o["runner_id"];
4947
+ if (typeof rawRunnerId !== "string") return null;
4948
+ const runner_id = rawRunnerId.trim();
4949
+ if (runner_id.length === 0 || runner_id.length > MAX_RUNNER_ID_CHARS) return null;
4950
+ const setOnly = ["prepared_job_mode", "expected_revision", "reason"];
4951
+ if (action === "get") {
4952
+ if (setOnly.some((key) => o[key] !== void 0)) return null;
4953
+ return { action, runner_id };
4954
+ }
4955
+ const mode = o["prepared_job_mode"];
4956
+ if (typeof mode !== "string") return null;
4957
+ if (!PREPARED_JOB_MODES.includes(mode)) return null;
4958
+ const revision = o["expected_revision"];
4959
+ if (typeof revision !== "number") return null;
4960
+ if (!Number.isInteger(revision) || revision < 0) return null;
4961
+ const rawReason = o["reason"];
4962
+ if (typeof rawReason !== "string") return null;
4963
+ const reason = rawReason.trim();
4964
+ if (reason.length < MIN_REASON_CHARS || reason.length > MAX_REASON_CHARS) return null;
4965
+ return {
4966
+ action,
4967
+ runner_id,
4968
+ prepared_job_mode: mode,
4969
+ expected_revision: revision,
4970
+ reason
4971
+ };
4972
+ }
4973
+ async function handlePreparedJobMode(deps, rawInput, _signal) {
4974
+ const input = parseInput(rawInput);
4975
+ if (!input) {
4976
+ throw invalidParams(TOOL_NAME19, SHAPE_HINT);
4977
+ }
4978
+ if (input.action === "get") {
4979
+ return buildCloudOrStubResponse({
4980
+ toolName: TOOL_NAME19,
4981
+ callableName: CALLABLE_NAME10,
4982
+ adminPath: PLANE_PATH,
4983
+ normalizedInput: { action: "get", runner_id: input.runner_id },
4984
+ // A GET carries no body; the runner id rides the query string.
4985
+ cloudBody: {},
4986
+ invokeOptions: { method: "GET", query: { runner_id: input.runner_id } },
4987
+ // The plane answers `{ok, config}` — not the `{ok, callable, result}`
4988
+ // admin-proxy envelope — so take the whole object with `ok` stripped.
4989
+ rawEnvelope: true,
4990
+ gateType: PREPARED_JOB_MODE_GATE_TYPE,
4991
+ stubReason: PREPARED_JOB_MODE_STUB_REASON,
4992
+ readOnly: true,
4993
+ deps
4994
+ });
4995
+ }
4996
+ return buildCloudOrStubResponse({
4997
+ toolName: TOOL_NAME19,
4998
+ callableName: CALLABLE_NAME10,
4999
+ adminPath: PLANE_PATH,
5000
+ normalizedInput: {
5001
+ action: "set",
5002
+ runner_id: input.runner_id,
5003
+ prepared_job_mode: input.prepared_job_mode,
5004
+ expected_revision: input.expected_revision,
5005
+ reason: input.reason
5006
+ },
5007
+ // Exactly the four fields of `updateRunnerPreparedJobConfigInputSchema`
5008
+ // (.strict()) — no `operator_id`, which the route would ignore anyway.
5009
+ cloudBody: {
5010
+ runner_id: input.runner_id,
5011
+ prepared_job_mode: input.prepared_job_mode,
5012
+ expected_revision: input.expected_revision,
5013
+ reason: input.reason
5014
+ },
5015
+ rawEnvelope: true,
5016
+ gateType: PREPARED_JOB_MODE_GATE_TYPE,
5017
+ stubReason: PREPARED_JOB_MODE_STUB_REASON,
5018
+ // A write: stays gated behind VO_ADMIN_CALLABLES_READONLY.
5019
+ readOnly: false,
5020
+ deps
5021
+ });
5022
+ }
5023
+
4890
5024
  // src/tools/session/directive.ts
4891
5025
  var SESSION_DIRECTIVE_THRESHOLDS = {
4892
5026
  prepare_handoff_pct: 70,
@@ -4920,12 +5054,12 @@ function suggestedHandoffPath(session_id, isoTimestamp) {
4920
5054
  // src/tools/session/report-session-state.ts
4921
5055
  init_auth_token_source();
4922
5056
  init_credential_store();
4923
- var TOOL_NAME19 = "vo_report_session_state";
5057
+ var TOOL_NAME20 = "vo_report_session_state";
4924
5058
  var VALID_AGENT_TYPES = ["claude-code", "codex", "cursor", "continue"];
4925
5059
  var MAX_GOAL_CHARS = 500;
4926
5060
  var MAX_RECENT_FILES = 20;
4927
5061
  var MAX_RECENT_TOOLS = 50;
4928
- var inputSchema19 = {
5062
+ var inputSchema20 = {
4929
5063
  type: "object",
4930
5064
  properties: {
4931
5065
  operator_id: {
@@ -4970,7 +5104,7 @@ var inputSchema19 = {
4970
5104
  required: ["operator_id", "session_id", "agent_type", "context_used_pct"],
4971
5105
  additionalProperties: false
4972
5106
  };
4973
- var description19 = "Reports per-session context-window utilization to AlgoHQ and returns a directive: 'continue' (under 70%), 'prepare_handoff' (70-84%), or 'execute_handoff_now' (\u226585%). Implements V1 launch gate #9 (fleet context lifecycle management) per the official AlgoHQ roadmap. Cloud-control-plane mode when VO_CONTROL_PLANE_URL plus a user/scoped HQ credential (or legacy admin token) is available; auto-allocates the session on first report so interactive agents (Claude Code, Cursor, Codex, Continue) appear on the live fleet whiteboard. Stub-local fallback when cloud config is absent or fails. The response shape stays stable across modes (`backend_mode` field in the payload tells the caller which mode produced the verdict).";
5107
+ var description20 = "Reports per-session context-window utilization to AlgoHQ and returns a directive: 'continue' (under 70%), 'prepare_handoff' (70-84%), or 'execute_handoff_now' (\u226585%). Implements V1 launch gate #9 (fleet context lifecycle management) per the official AlgoHQ roadmap. Cloud-control-plane mode when VO_CONTROL_PLANE_URL plus a user/scoped HQ credential (or legacy admin token) is available; auto-allocates the session on first report so interactive agents (Claude Code, Cursor, Codex, Continue) appear on the live fleet whiteboard. Stub-local fallback when cloud config is absent or fails. The response shape stays stable across modes (`backend_mode` field in the payload tells the caller which mode produced the verdict).";
4974
5108
  function isStringArray2(v, maxItems) {
4975
5109
  if (!Array.isArray(v)) return false;
4976
5110
  if (v.length > maxItems) return false;
@@ -5108,7 +5242,7 @@ async function tryCloudReportState(cloud, input, fetchFn = fetch) {
5108
5242
  async function handleReportSessionState(deps, rawInput, _signal) {
5109
5243
  if (!isToolInput19(rawInput)) {
5110
5244
  throw invalidParams(
5111
- TOOL_NAME19,
5245
+ TOOL_NAME20,
5112
5246
  `invalid input. Required fields: operator_id (non-empty string), session_id (non-empty string), agent_type (one of: ${VALID_AGENT_TYPES.join(" | ")}), context_used_pct (number 0-100). Optional: current_goal (string \u2264${MAX_GOAL_CHARS} chars), recent_files_touched (string[] \u2264${MAX_RECENT_FILES}), recent_tool_uses (string[] \u2264${MAX_RECENT_TOOLS}).`
5113
5247
  );
5114
5248
  }
@@ -5738,9 +5872,9 @@ function checkSuccessorLiveness(child, logPath, config, deps = {}) {
5738
5872
  }
5739
5873
 
5740
5874
  // src/tools/session/spawn-successor.ts
5741
- var TOOL_NAME20 = "vo_spawn_successor";
5875
+ var TOOL_NAME21 = "vo_spawn_successor";
5742
5876
  var MAX_HANDOFF_BYTES = 64e3;
5743
- var inputSchema20 = {
5877
+ var inputSchema21 = {
5744
5878
  type: "object",
5745
5879
  properties: {
5746
5880
  handoff_path: {
@@ -5768,7 +5902,7 @@ var inputSchema20 = {
5768
5902
  additionalProperties: false
5769
5903
  };
5770
5904
  var RETIRED_COUNTER_INPUT = "spawns_so_far";
5771
- var description20 = "Mode B auto-handoff (roadmap \xA73.4): spawn a DETACHED headless `claude -p` successor with a handoff doc pre-injected into its prompt. Defaults to the newest handoff in ~/.vo/handoffs/. Verifies the child is actually alive (survives an early-exit window; an optional log-output window is off by default) before reporting success. Returns {spawned, pid, log_path, handoff_path}. The successor works under the same gates as any session (ADR-001: verify-before-act, human merge approval) \u2014 this tool never fires autonomously.";
5905
+ var description21 = "Mode B auto-handoff (roadmap \xA73.4): spawn a DETACHED headless `claude -p` successor with a handoff doc pre-injected into its prompt. Defaults to the newest handoff in ~/.vo/handoffs/. Verifies the child is actually alive (survives an early-exit window; an optional log-output window is off by default) before reporting success. Returns {spawned, pid, log_path, handoff_path}. The successor works under the same gates as any session (ADR-001: verify-before-act, human merge approval) \u2014 this tool never fires autonomously.";
5772
5906
  function isToolInput20(v) {
5773
5907
  if (typeof v !== "object" || v === null) return false;
5774
5908
  const o = v;
@@ -5826,14 +5960,14 @@ function buildSuccessorPrompt(handoffMarkdown, goal) {
5826
5960
  }
5827
5961
  async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn, overrides = {}) {
5828
5962
  const retired = retiredCounterRefusal(rawInput);
5829
- if (retired !== null) throw invalidParams(TOOL_NAME20, retired);
5963
+ if (retired !== null) throw invalidParams(TOOL_NAME21, retired);
5830
5964
  if (!isToolInput20(rawInput)) {
5831
- throw invalidParams(TOOL_NAME20, "invalid input. Optional: { handoff_path, goal, cwd, max_turns, agent }.");
5965
+ throw invalidParams(TOOL_NAME21, "invalid input. Optional: { handoff_path, goal, cwd, max_turns, agent }.");
5832
5966
  }
5833
5967
  const handoffPath = rawInput.handoff_path?.trim() || newestHandoff();
5834
5968
  if (!handoffPath || !existsSync5(handoffPath)) {
5835
5969
  return jsonContent({
5836
- tool: TOOL_NAME20,
5970
+ tool: TOOL_NAME21,
5837
5971
  schema_version: 1,
5838
5972
  payload: {
5839
5973
  spawned: false,
@@ -5846,7 +5980,7 @@ async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn,
5846
5980
  const plan = resolveSpawnPlan(process.env, rawInput, (/* @__PURE__ */ new Date()).toISOString());
5847
5981
  if (!plan.ok) {
5848
5982
  return jsonContent({
5849
- tool: TOOL_NAME20,
5983
+ tool: TOOL_NAME21,
5850
5984
  schema_version: 1,
5851
5985
  payload: {
5852
5986
  spawned: false,
@@ -5862,7 +5996,7 @@ async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn,
5862
5996
  const resolution = resolveNativeWindowsExecutable(plan.bin, process.env, overrides.resolveWindowsExecutable);
5863
5997
  if (!resolution.ok) {
5864
5998
  return jsonContent({
5865
- tool: TOOL_NAME20,
5999
+ tool: TOOL_NAME21,
5866
6000
  schema_version: 1,
5867
6001
  payload: {
5868
6002
  spawned: false,
@@ -5911,7 +6045,7 @@ async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn,
5911
6045
  await new Promise((r) => setTimeout(r, 150));
5912
6046
  if (spawnError) {
5913
6047
  return jsonContent({
5914
- tool: TOOL_NAME20,
6048
+ tool: TOOL_NAME21,
5915
6049
  schema_version: 1,
5916
6050
  payload: {
5917
6051
  spawned: false,
@@ -5926,7 +6060,7 @@ async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn,
5926
6060
  const liveness = await checkLiveness(child, logPath);
5927
6061
  if (!liveness.ok) {
5928
6062
  return jsonContent({
5929
- tool: TOOL_NAME20,
6063
+ tool: TOOL_NAME21,
5930
6064
  schema_version: 1,
5931
6065
  payload: {
5932
6066
  spawned: false,
@@ -5940,7 +6074,7 @@ async function handleSpawnSuccessor(_deps, rawInput, _signal, spawnImpl = spawn,
5940
6074
  });
5941
6075
  }
5942
6076
  return jsonContent({
5943
- tool: TOOL_NAME20,
6077
+ tool: TOOL_NAME21,
5944
6078
  schema_version: 1,
5945
6079
  payload: {
5946
6080
  spawned: true,
@@ -5980,10 +6114,10 @@ function isKnownConciergePack(value) {
5980
6114
  }
5981
6115
 
5982
6116
  // src/tools/concierge/dispatch.ts
5983
- var TOOL_NAME21 = "vo_concierge_dispatch";
5984
- var CALLABLE_NAME10 = "voConciergeDispatch";
6117
+ var TOOL_NAME22 = "vo_concierge_dispatch";
6118
+ var CALLABLE_NAME11 = "voConciergeDispatch";
5985
6119
  var ADMIN_PATH10 = "/api/v1/admin/concierge/dispatch";
5986
- var inputSchema21 = {
6120
+ var inputSchema22 = {
5987
6121
  type: "object",
5988
6122
  properties: {
5989
6123
  pack: {
@@ -5998,7 +6132,7 @@ var inputSchema21 = {
5998
6132
  },
5999
6133
  additionalProperties: false
6000
6134
  };
6001
- var description21 = "Dispatches a provider-scoped knowledge pack (gcp | firebase | aws | cloudflare | vercel | netlify | tax | hybrid). Cross-vendor MCP equivalent of the /vo-concierge Claude-Code slash command. Route explicitly via `pack`, or via tenant.cloud_provider by passing `tenant_id`. Returns the pack's README (`readme_markdown`) + file index. In cloud mode, dispatches via vo-control-plane and returns `verdict: 'pass'` with the pack/directory data; without cloud config, returns `verdict: 'unimplemented'`.";
6135
+ var description22 = "Dispatches a provider-scoped knowledge pack (gcp | firebase | aws | cloudflare | vercel | netlify | tax | hybrid). Cross-vendor MCP equivalent of the /vo-concierge Claude-Code slash command. Route explicitly via `pack`, or via tenant.cloud_provider by passing `tenant_id`. Returns the pack's README (`readme_markdown`) + file index. In cloud mode, dispatches via vo-control-plane and returns `verdict: 'pass'` with the pack/directory data; without cloud config, returns `verdict: 'unimplemented'`.";
6002
6136
  function isToolInput21(v) {
6003
6137
  if (typeof v !== "object" || v === null) return false;
6004
6138
  const obj = v;
@@ -6009,13 +6143,13 @@ function isToolInput21(v) {
6009
6143
  async function handleConciergeDispatch(deps, rawInput, _signal) {
6010
6144
  if (!isToolInput21(rawInput)) {
6011
6145
  throw invalidParams(
6012
- TOOL_NAME21,
6146
+ TOOL_NAME22,
6013
6147
  "invalid input. Expected { pack?: string, tenant_id?: string }."
6014
6148
  );
6015
6149
  }
6016
6150
  if (rawInput.pack !== void 0 && rawInput.pack !== "" && !isKnownConciergePack(rawInput.pack)) {
6017
6151
  throw invalidParams(
6018
- TOOL_NAME21,
6152
+ TOOL_NAME22,
6019
6153
  `unknown pack: ${JSON.stringify(rawInput.pack)}. Known packs: ${KNOWN_CONCIERGE_PACKS.join(", ")}.`
6020
6154
  );
6021
6155
  }
@@ -6026,8 +6160,8 @@ async function handleConciergeDispatch(deps, rawInput, _signal) {
6026
6160
  if (rawInput.pack) cloudBody.pack = rawInput.pack;
6027
6161
  if (rawInput.tenant_id) cloudBody.tenantId = rawInput.tenant_id;
6028
6162
  return buildCloudOrStubResponse({
6029
- toolName: TOOL_NAME21,
6030
- callableName: CALLABLE_NAME10,
6163
+ toolName: TOOL_NAME22,
6164
+ callableName: CALLABLE_NAME11,
6031
6165
  adminPath: ADMIN_PATH10,
6032
6166
  normalizedInput,
6033
6167
  cloudBody,
@@ -6547,8 +6681,8 @@ function evaluateMemorySyncKillSwitch(deps = {}) {
6547
6681
  }
6548
6682
 
6549
6683
  // src/tools/memory/sync-config.ts
6550
- var TOOL_NAME22 = "vo_sync_config";
6551
- var inputSchema22 = {
6684
+ var TOOL_NAME23 = "vo_sync_config";
6685
+ var inputSchema23 = {
6552
6686
  type: "object",
6553
6687
  properties: {
6554
6688
  action: {
@@ -6564,7 +6698,7 @@ var inputSchema22 = {
6564
6698
  required: ["action"],
6565
6699
  additionalProperties: false
6566
6700
  };
6567
- var description22 = "Syncs memory entries between local ~/.claude/projects/<slug>/memory/ and cloud control-plane /api/v1/agent-config/memory/me. Requires operator auth (vo-mcp login). Actions: pull (cloud\u2192local), push (local\u2192cloud). Idempotent; push creates/updates as needed. Serialized across concurrent sessions by an exclusive lock in the memory dir.";
6701
+ var description23 = "Syncs memory entries between local ~/.claude/projects/<slug>/memory/ and cloud control-plane /api/v1/agent-config/memory/me. Requires operator auth (vo-mcp login). Actions: pull (cloud\u2192local), push (local\u2192cloud). Idempotent; push creates/updates as needed. Serialized across concurrent sessions by an exclusive lock in the memory dir.";
6568
6702
  function isToolInput22(v) {
6569
6703
  if (typeof v !== "object" || v === null) return false;
6570
6704
  const o = v;
@@ -6681,13 +6815,13 @@ async function runMemorySync(action, cwd, sessionId, fetchFn = globalThis.fetch,
6681
6815
  async function handleSyncConfig(deps, rawInput, _signal, fetchFn = globalThis.fetch) {
6682
6816
  if (!isToolInput22(rawInput)) {
6683
6817
  throw invalidParams(
6684
- TOOL_NAME22,
6818
+ TOOL_NAME23,
6685
6819
  'invalid input. Required: { action: "pull" | "push" }. Optional: { cwd: "<path>" }.'
6686
6820
  );
6687
6821
  }
6688
6822
  const cwd = rawInput.cwd?.trim() || process.cwd();
6689
6823
  const result = await runMemorySync(rawInput.action, cwd, deps.session.sessionId, fetchFn);
6690
- return jsonContent({ tool: TOOL_NAME22, schema_version: 1, payload: result });
6824
+ return jsonContent({ tool: TOOL_NAME23, schema_version: 1, payload: result });
6691
6825
  }
6692
6826
 
6693
6827
  // src/tools/memory/private-knowledge.ts
@@ -7036,7 +7170,7 @@ ${FRONTMATTER_DELIMITER}
7036
7170
  ${FRONTMATTER_DELIMITER}
7037
7171
  `.length);
7038
7172
  let name = "";
7039
- let description23 = "";
7173
+ let description24 = "";
7040
7174
  for (const line of frontmatterText.split("\n")) {
7041
7175
  const trimmed = line.trim();
7042
7176
  if (trimmed.length === 0) continue;
@@ -7045,15 +7179,15 @@ ${FRONTMATTER_DELIMITER}
7045
7179
  const key = trimmed.slice(0, colonIdx).trim();
7046
7180
  const value = trimmed.slice(colonIdx + 1).trim();
7047
7181
  if (key === "name") name = value;
7048
- else if (key === "description") description23 = value;
7182
+ else if (key === "description") description24 = value;
7049
7183
  }
7050
7184
  if (name.length === 0) {
7051
7185
  throw new InvalidSkillFrontmatterError(sourcePath, 'missing required field "name"');
7052
7186
  }
7053
- if (description23.length === 0) {
7187
+ if (description24.length === 0) {
7054
7188
  throw new InvalidSkillFrontmatterError(sourcePath, 'missing required field "description"');
7055
7189
  }
7056
- return { name, description: description23, body };
7190
+ return { name, description: description24, body };
7057
7191
  }
7058
7192
  function loadSkillsFromDir(skillsDir) {
7059
7193
  const entries = readdirSync6(skillsDir);
@@ -7074,8 +7208,8 @@ function loadSkillsFromDir(skillsDir) {
7074
7208
  } catch {
7075
7209
  continue;
7076
7210
  }
7077
- const { name, description: description23, body } = parseFrontmatter(raw, skillFile);
7078
- skills.push({ name, description: description23, body, sourcePath: skillFile });
7211
+ const { name, description: description24, body } = parseFrontmatter(raw, skillFile);
7212
+ skills.push({ name, description: description24, body, sourcePath: skillFile });
7079
7213
  }
7080
7214
  return [...skills].sort((a, b) => a.name.localeCompare(b.name));
7081
7215
  }
@@ -7342,7 +7476,7 @@ function buildToolRegistry() {
7342
7476
  description: description19,
7343
7477
  inputSchema: inputSchema19
7344
7478
  },
7345
- handler: handleReportSessionState
7479
+ handler: handlePreparedJobMode
7346
7480
  },
7347
7481
  [TOOL_NAME20]: {
7348
7482
  definition: {
@@ -7350,7 +7484,7 @@ function buildToolRegistry() {
7350
7484
  description: description20,
7351
7485
  inputSchema: inputSchema20
7352
7486
  },
7353
- handler: handleSpawnSuccessor
7487
+ handler: handleReportSessionState
7354
7488
  },
7355
7489
  [TOOL_NAME21]: {
7356
7490
  definition: {
@@ -7358,7 +7492,7 @@ function buildToolRegistry() {
7358
7492
  description: description21,
7359
7493
  inputSchema: inputSchema21
7360
7494
  },
7361
- handler: handleConciergeDispatch
7495
+ handler: handleSpawnSuccessor
7362
7496
  },
7363
7497
  [TOOL_NAME22]: {
7364
7498
  definition: {
@@ -7366,6 +7500,14 @@ function buildToolRegistry() {
7366
7500
  description: description22,
7367
7501
  inputSchema: inputSchema22
7368
7502
  },
7503
+ handler: handleConciergeDispatch
7504
+ },
7505
+ [TOOL_NAME23]: {
7506
+ definition: {
7507
+ name: TOOL_NAME23,
7508
+ description: description23,
7509
+ inputSchema: inputSchema23
7510
+ },
7369
7511
  handler: handleSyncConfig
7370
7512
  },
7371
7513
  [UPSERT_TOOL_NAME]: {