@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/cli.js +210 -52
- package/dist/cli.js.map +4 -4
- package/dist/index.js +184 -42
- package/dist/index.js.map +4 -4
- package/dist/runner-cli.js +21 -8
- package/dist/runner-cli.js.map +3 -3
- package/package.json +1 -1
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
|
|
510
|
-
if (
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
5875
|
+
var TOOL_NAME21 = "vo_spawn_successor";
|
|
5742
5876
|
var MAX_HANDOFF_BYTES = 64e3;
|
|
5743
|
-
var
|
|
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
|
|
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(
|
|
5963
|
+
if (retired !== null) throw invalidParams(TOOL_NAME21, retired);
|
|
5830
5964
|
if (!isToolInput20(rawInput)) {
|
|
5831
|
-
throw invalidParams(
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
5984
|
-
var
|
|
6117
|
+
var TOOL_NAME22 = "vo_concierge_dispatch";
|
|
6118
|
+
var CALLABLE_NAME11 = "voConciergeDispatch";
|
|
5985
6119
|
var ADMIN_PATH10 = "/api/v1/admin/concierge/dispatch";
|
|
5986
|
-
var
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
6030
|
-
callableName:
|
|
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
|
|
6551
|
-
var
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
|
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")
|
|
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 (
|
|
7187
|
+
if (description24.length === 0) {
|
|
7054
7188
|
throw new InvalidSkillFrontmatterError(sourcePath, 'missing required field "description"');
|
|
7055
7189
|
}
|
|
7056
|
-
return { name, description:
|
|
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:
|
|
7078
|
-
skills.push({ name, description:
|
|
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:
|
|
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:
|
|
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:
|
|
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]: {
|