@girardmedia/bootspring 2.7.0 → 3.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.
- package/dist/cli/index.js +766 -26
- package/dist/cli-launcher.js +2 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core.js +9 -5
- package/dist/mcp/index.d.ts +10 -1
- package/dist/mcp-server.js +8 -4
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -31,6 +31,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
31
31
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
32
|
mod
|
|
33
33
|
));
|
|
34
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
34
35
|
|
|
35
36
|
// ../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js
|
|
36
37
|
var init_cjs_shims = __esm({
|
|
@@ -3385,7 +3386,7 @@ var init_release = __esm({
|
|
|
3385
3386
|
"../../packages/shared/src/release.ts"() {
|
|
3386
3387
|
"use strict";
|
|
3387
3388
|
init_cjs_shims();
|
|
3388
|
-
BOOTSPRING_VERSION = "
|
|
3389
|
+
BOOTSPRING_VERSION = "3.0.0";
|
|
3389
3390
|
BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
|
|
3390
3391
|
}
|
|
3391
3392
|
});
|
|
@@ -38412,7 +38413,7 @@ var require_main = __commonJS({
|
|
|
38412
38413
|
}
|
|
38413
38414
|
return to;
|
|
38414
38415
|
};
|
|
38415
|
-
var
|
|
38416
|
+
var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
|
|
38416
38417
|
var node_exports = {};
|
|
38417
38418
|
__export2(node_exports, {
|
|
38418
38419
|
analyzeMetafile: () => analyzeMetafile,
|
|
@@ -38429,7 +38430,7 @@ var require_main = __commonJS({
|
|
|
38429
38430
|
transformSync: () => transformSync,
|
|
38430
38431
|
version: () => version3
|
|
38431
38432
|
});
|
|
38432
|
-
module2.exports =
|
|
38433
|
+
module2.exports = __toCommonJS2(node_exports);
|
|
38433
38434
|
function encodePacket(packet) {
|
|
38434
38435
|
let visit = (value) => {
|
|
38435
38436
|
if (value === null) {
|
|
@@ -39210,7 +39211,7 @@ is not a problem with esbuild. You need to fix your environment instead.
|
|
|
39210
39211
|
function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
|
|
39211
39212
|
const details = createObjectStash();
|
|
39212
39213
|
const isContext = callName === "context";
|
|
39213
|
-
const
|
|
39214
|
+
const handleError2 = (e, pluginName) => {
|
|
39214
39215
|
const flags = [];
|
|
39215
39216
|
try {
|
|
39216
39217
|
pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
|
|
@@ -39226,12 +39227,12 @@ is not a problem with esbuild. You need to fix your environment instead.
|
|
|
39226
39227
|
if (typeof options === "object") {
|
|
39227
39228
|
const value = options.plugins;
|
|
39228
39229
|
if (value !== void 0) {
|
|
39229
|
-
if (!Array.isArray(value)) return
|
|
39230
|
+
if (!Array.isArray(value)) return handleError2(new Error(`"plugins" must be an array`), "");
|
|
39230
39231
|
plugins = value;
|
|
39231
39232
|
}
|
|
39232
39233
|
}
|
|
39233
39234
|
if (plugins && plugins.length > 0) {
|
|
39234
|
-
if (streamIn.isSync) return
|
|
39235
|
+
if (streamIn.isSync) return handleError2(new Error("Cannot use plugins in synchronous API calls"), "");
|
|
39235
39236
|
handlePlugins(
|
|
39236
39237
|
buildKey,
|
|
39237
39238
|
sendRequest,
|
|
@@ -39244,14 +39245,14 @@ is not a problem with esbuild. You need to fix your environment instead.
|
|
|
39244
39245
|
details
|
|
39245
39246
|
).then(
|
|
39246
39247
|
(result) => {
|
|
39247
|
-
if (!result.ok) return
|
|
39248
|
+
if (!result.ok) return handleError2(result.error, result.pluginName);
|
|
39248
39249
|
try {
|
|
39249
39250
|
buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
|
|
39250
39251
|
} catch (e) {
|
|
39251
|
-
|
|
39252
|
+
handleError2(e, "");
|
|
39252
39253
|
}
|
|
39253
39254
|
},
|
|
39254
|
-
(e) =>
|
|
39255
|
+
(e) => handleError2(e, "")
|
|
39255
39256
|
);
|
|
39256
39257
|
return;
|
|
39257
39258
|
}
|
|
@@ -39259,7 +39260,7 @@ is not a problem with esbuild. You need to fix your environment instead.
|
|
|
39259
39260
|
buildOrContextContinue(null, (result, done) => done([], []), () => {
|
|
39260
39261
|
});
|
|
39261
39262
|
} catch (e) {
|
|
39262
|
-
|
|
39263
|
+
handleError2(e, "");
|
|
39263
39264
|
}
|
|
39264
39265
|
function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
|
|
39265
39266
|
const writeDefault = streamIn.hasFS;
|
|
@@ -45895,6 +45896,317 @@ ${"=".repeat(50)}`);
|
|
|
45895
45896
|
}
|
|
45896
45897
|
});
|
|
45897
45898
|
|
|
45899
|
+
// ../../packages/mcp/src/swarm-tools.ts
|
|
45900
|
+
function errorResult(message) {
|
|
45901
|
+
return {
|
|
45902
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
45903
|
+
isError: true
|
|
45904
|
+
};
|
|
45905
|
+
}
|
|
45906
|
+
function registerSwarmTools() {
|
|
45907
|
+
registerTool(swarmDefinition, swarmHandler);
|
|
45908
|
+
registerTool(memoryDefinition, memoryHandler);
|
|
45909
|
+
registerTool(planDefinition, planHandler);
|
|
45910
|
+
}
|
|
45911
|
+
var swarmDefinition, swarmHandler, memoryDefinition, memoryHandler, planDefinition, planHandler, SWARM_TOOLS;
|
|
45912
|
+
var init_swarm_tools = __esm({
|
|
45913
|
+
"../../packages/mcp/src/swarm-tools.ts"() {
|
|
45914
|
+
"use strict";
|
|
45915
|
+
init_cjs_shims();
|
|
45916
|
+
init_registry();
|
|
45917
|
+
swarmDefinition = {
|
|
45918
|
+
name: "bootspring_swarm",
|
|
45919
|
+
description: "Multi-agent swarm orchestration \u2014 start swarms, spawn agents, submit tasks, run consensus votes, and change topologies (hierarchical, mesh, ring, star, adaptive). Agents collaborate through shared state and self-organize based on workload.",
|
|
45920
|
+
inputSchema: {
|
|
45921
|
+
type: "object",
|
|
45922
|
+
properties: {
|
|
45923
|
+
action: {
|
|
45924
|
+
type: "string",
|
|
45925
|
+
enum: ["start", "stop", "status", "spawn", "agents", "submit", "batch", "consensus", "topology"],
|
|
45926
|
+
description: "Swarm action to perform"
|
|
45927
|
+
},
|
|
45928
|
+
topology: {
|
|
45929
|
+
type: "string",
|
|
45930
|
+
enum: ["hierarchical", "mesh", "ring", "star", "adaptive"],
|
|
45931
|
+
description: "Swarm topology (for start/topology actions)"
|
|
45932
|
+
},
|
|
45933
|
+
role: {
|
|
45934
|
+
type: "string",
|
|
45935
|
+
enum: ["queen", "worker", "specialist", "reviewer", "monitor"],
|
|
45936
|
+
description: "Agent role (for spawn action)"
|
|
45937
|
+
},
|
|
45938
|
+
capabilities: {
|
|
45939
|
+
type: "array",
|
|
45940
|
+
items: { type: "string" },
|
|
45941
|
+
description: "Agent capabilities (for spawn action)"
|
|
45942
|
+
},
|
|
45943
|
+
taskType: {
|
|
45944
|
+
type: "string",
|
|
45945
|
+
description: "Task type (for submit action)"
|
|
45946
|
+
},
|
|
45947
|
+
taskDescription: {
|
|
45948
|
+
type: "string",
|
|
45949
|
+
description: "Task description (for submit action)"
|
|
45950
|
+
},
|
|
45951
|
+
priority: {
|
|
45952
|
+
type: "string",
|
|
45953
|
+
enum: ["critical", "high", "normal", "low"],
|
|
45954
|
+
description: "Task priority (for submit action)"
|
|
45955
|
+
},
|
|
45956
|
+
question: {
|
|
45957
|
+
type: "string",
|
|
45958
|
+
description: "Question for consensus vote"
|
|
45959
|
+
},
|
|
45960
|
+
options: {
|
|
45961
|
+
type: "array",
|
|
45962
|
+
items: { type: "string" },
|
|
45963
|
+
description: "Vote options for consensus"
|
|
45964
|
+
}
|
|
45965
|
+
},
|
|
45966
|
+
required: ["action"]
|
|
45967
|
+
}
|
|
45968
|
+
};
|
|
45969
|
+
swarmHandler = async (args) => {
|
|
45970
|
+
const action = String(args.action || "");
|
|
45971
|
+
try {
|
|
45972
|
+
const { api } = (init_src2(), __toCommonJS(src_exports2));
|
|
45973
|
+
let result;
|
|
45974
|
+
switch (action) {
|
|
45975
|
+
case "start":
|
|
45976
|
+
result = await api.request("POST", "/swarm/start", {
|
|
45977
|
+
topology: args.topology || "hierarchical"
|
|
45978
|
+
});
|
|
45979
|
+
break;
|
|
45980
|
+
case "stop":
|
|
45981
|
+
result = await api.request("POST", "/swarm/stop");
|
|
45982
|
+
break;
|
|
45983
|
+
case "status":
|
|
45984
|
+
result = await api.request("GET", "/swarm/status");
|
|
45985
|
+
break;
|
|
45986
|
+
case "spawn":
|
|
45987
|
+
if (!args.role) return errorResult("role is required for spawn");
|
|
45988
|
+
result = await api.request("POST", "/swarm/agents", {
|
|
45989
|
+
role: args.role,
|
|
45990
|
+
capabilities: args.capabilities || ["general"]
|
|
45991
|
+
});
|
|
45992
|
+
break;
|
|
45993
|
+
case "agents":
|
|
45994
|
+
result = await api.request("GET", "/swarm/agents");
|
|
45995
|
+
break;
|
|
45996
|
+
case "submit":
|
|
45997
|
+
if (!args.taskType || !args.taskDescription) {
|
|
45998
|
+
return errorResult("taskType and taskDescription are required for submit");
|
|
45999
|
+
}
|
|
46000
|
+
result = await api.request("POST", "/swarm/tasks", {
|
|
46001
|
+
type: args.taskType,
|
|
46002
|
+
description: args.taskDescription,
|
|
46003
|
+
input: {},
|
|
46004
|
+
priority: args.priority || "normal"
|
|
46005
|
+
});
|
|
46006
|
+
break;
|
|
46007
|
+
case "consensus":
|
|
46008
|
+
if (!args.question || !args.options) {
|
|
46009
|
+
return errorResult("question and options are required for consensus");
|
|
46010
|
+
}
|
|
46011
|
+
result = await api.request("POST", "/swarm/consensus", {
|
|
46012
|
+
question: args.question,
|
|
46013
|
+
options: args.options
|
|
46014
|
+
});
|
|
46015
|
+
break;
|
|
46016
|
+
case "topology":
|
|
46017
|
+
if (args.topology) {
|
|
46018
|
+
result = await api.request("POST", "/swarm/topology", { topology: args.topology });
|
|
46019
|
+
} else {
|
|
46020
|
+
result = await api.request("GET", "/swarm/topology");
|
|
46021
|
+
}
|
|
46022
|
+
break;
|
|
46023
|
+
default:
|
|
46024
|
+
return errorResult(`Unknown action: ${action}`);
|
|
46025
|
+
}
|
|
46026
|
+
return {
|
|
46027
|
+
content: [{
|
|
46028
|
+
type: "text",
|
|
46029
|
+
text: `Swarm ${action} result:
|
|
46030
|
+
${JSON.stringify(result, null, 2)}`
|
|
46031
|
+
}]
|
|
46032
|
+
};
|
|
46033
|
+
} catch (err) {
|
|
46034
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
46035
|
+
}
|
|
46036
|
+
};
|
|
46037
|
+
memoryDefinition = {
|
|
46038
|
+
name: "bootspring_memory",
|
|
46039
|
+
description: "Vector memory for AI agents \u2014 store decisions, patterns, and trajectories. Search by semantic similarity using HNSW index. Agents learn from past successes.",
|
|
46040
|
+
inputSchema: {
|
|
46041
|
+
type: "object",
|
|
46042
|
+
properties: {
|
|
46043
|
+
action: {
|
|
46044
|
+
type: "string",
|
|
46045
|
+
enum: ["search", "store", "trajectory", "stats", "forget"],
|
|
46046
|
+
description: "Memory action to perform"
|
|
46047
|
+
},
|
|
46048
|
+
query: {
|
|
46049
|
+
type: "string",
|
|
46050
|
+
description: "Search query (for search action)"
|
|
46051
|
+
},
|
|
46052
|
+
content: {
|
|
46053
|
+
type: "string",
|
|
46054
|
+
description: "Content to store (for store action)"
|
|
46055
|
+
},
|
|
46056
|
+
type: {
|
|
46057
|
+
type: "string",
|
|
46058
|
+
enum: ["decision", "pattern", "error", "solution", "context", "preference", "trajectory"],
|
|
46059
|
+
description: "Memory entry type"
|
|
46060
|
+
},
|
|
46061
|
+
goal: {
|
|
46062
|
+
type: "string",
|
|
46063
|
+
description: "Goal (for trajectory action)"
|
|
46064
|
+
},
|
|
46065
|
+
steps: {
|
|
46066
|
+
type: "array",
|
|
46067
|
+
items: { type: "string" },
|
|
46068
|
+
description: "Steps taken (for trajectory action)"
|
|
46069
|
+
},
|
|
46070
|
+
outcome: {
|
|
46071
|
+
type: "string",
|
|
46072
|
+
enum: ["success", "partial", "failure"],
|
|
46073
|
+
description: "Trajectory outcome"
|
|
46074
|
+
},
|
|
46075
|
+
id: {
|
|
46076
|
+
type: "string",
|
|
46077
|
+
description: "Entry ID (for forget action)"
|
|
46078
|
+
},
|
|
46079
|
+
limit: {
|
|
46080
|
+
type: "number",
|
|
46081
|
+
description: "Max results for search (default 10)"
|
|
46082
|
+
}
|
|
46083
|
+
},
|
|
46084
|
+
required: ["action"]
|
|
46085
|
+
}
|
|
46086
|
+
};
|
|
46087
|
+
memoryHandler = async (args) => {
|
|
46088
|
+
const action = String(args.action || "");
|
|
46089
|
+
try {
|
|
46090
|
+
const { api } = (init_src2(), __toCommonJS(src_exports2));
|
|
46091
|
+
let result;
|
|
46092
|
+
switch (action) {
|
|
46093
|
+
case "search":
|
|
46094
|
+
if (!args.query) return errorResult("query is required for search");
|
|
46095
|
+
result = await api.request("POST", "/swarm/memory/search", {
|
|
46096
|
+
query: args.query,
|
|
46097
|
+
limit: args.limit || 10,
|
|
46098
|
+
type: args.type
|
|
46099
|
+
});
|
|
46100
|
+
break;
|
|
46101
|
+
case "store":
|
|
46102
|
+
if (!args.content || !args.type) return errorResult("content and type are required for store");
|
|
46103
|
+
result = await api.request("POST", "/swarm/memory", {
|
|
46104
|
+
content: args.content,
|
|
46105
|
+
type: args.type,
|
|
46106
|
+
sessionId: `mcp-${Date.now()}`
|
|
46107
|
+
});
|
|
46108
|
+
break;
|
|
46109
|
+
case "trajectory":
|
|
46110
|
+
if (!args.goal || !args.steps || !args.outcome) {
|
|
46111
|
+
return errorResult("goal, steps, and outcome are required for trajectory");
|
|
46112
|
+
}
|
|
46113
|
+
result = await api.request("POST", "/swarm/memory/trajectory", {
|
|
46114
|
+
goal: args.goal,
|
|
46115
|
+
steps: args.steps,
|
|
46116
|
+
sessionId: `mcp-${Date.now()}`,
|
|
46117
|
+
outcome: args.outcome
|
|
46118
|
+
});
|
|
46119
|
+
break;
|
|
46120
|
+
case "stats":
|
|
46121
|
+
result = await api.request("GET", "/swarm/memory/stats");
|
|
46122
|
+
break;
|
|
46123
|
+
case "forget":
|
|
46124
|
+
if (!args.id) return errorResult("id is required for forget");
|
|
46125
|
+
result = await api.request("DELETE", `/swarm/memory/${args.id}`);
|
|
46126
|
+
break;
|
|
46127
|
+
default:
|
|
46128
|
+
return errorResult(`Unknown action: ${action}`);
|
|
46129
|
+
}
|
|
46130
|
+
return {
|
|
46131
|
+
content: [{
|
|
46132
|
+
type: "text",
|
|
46133
|
+
text: `Memory ${action} result:
|
|
46134
|
+
${JSON.stringify(result, null, 2)}`
|
|
46135
|
+
}]
|
|
46136
|
+
};
|
|
46137
|
+
} catch (err) {
|
|
46138
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
46139
|
+
}
|
|
46140
|
+
};
|
|
46141
|
+
planDefinition = {
|
|
46142
|
+
name: "bootspring_plan",
|
|
46143
|
+
description: "Goal-oriented action planning (GOAP) \u2014 decompose high-level goals into executable task DAGs with A* search. Finds optimal sequences and parallelizable groups.",
|
|
46144
|
+
inputSchema: {
|
|
46145
|
+
type: "object",
|
|
46146
|
+
properties: {
|
|
46147
|
+
action: {
|
|
46148
|
+
type: "string",
|
|
46149
|
+
enum: ["plan", "actions", "register"],
|
|
46150
|
+
description: "Planner action"
|
|
46151
|
+
},
|
|
46152
|
+
goal: {
|
|
46153
|
+
type: "string",
|
|
46154
|
+
description: "Goal to plan for (for plan action)"
|
|
46155
|
+
},
|
|
46156
|
+
parallel: {
|
|
46157
|
+
type: "boolean",
|
|
46158
|
+
description: "Enable parallel task groups"
|
|
46159
|
+
},
|
|
46160
|
+
currentState: {
|
|
46161
|
+
type: "object",
|
|
46162
|
+
description: "Current world state (key-value pairs)"
|
|
46163
|
+
},
|
|
46164
|
+
goalConditions: {
|
|
46165
|
+
type: "array",
|
|
46166
|
+
description: "Goal conditions [{key, operator, value}]"
|
|
46167
|
+
}
|
|
46168
|
+
},
|
|
46169
|
+
required: ["action"]
|
|
46170
|
+
}
|
|
46171
|
+
};
|
|
46172
|
+
planHandler = async (args) => {
|
|
46173
|
+
const action = String(args.action || "");
|
|
46174
|
+
try {
|
|
46175
|
+
const { api } = (init_src2(), __toCommonJS(src_exports2));
|
|
46176
|
+
let result;
|
|
46177
|
+
switch (action) {
|
|
46178
|
+
case "plan":
|
|
46179
|
+
if (!args.goal) return errorResult("goal is required for plan");
|
|
46180
|
+
result = await api.request("POST", "/swarm/plan", {
|
|
46181
|
+
goal: args.goal,
|
|
46182
|
+
currentState: args.currentState || {},
|
|
46183
|
+
goalConditions: args.goalConditions || [{ key: "deployed", operator: "==", value: true }],
|
|
46184
|
+
parallel: args.parallel ?? true
|
|
46185
|
+
});
|
|
46186
|
+
break;
|
|
46187
|
+
case "actions":
|
|
46188
|
+
result = await api.request("GET", "/swarm/plan/actions");
|
|
46189
|
+
break;
|
|
46190
|
+
case "register":
|
|
46191
|
+
return errorResult("Register custom actions via the API: POST /swarm/plan/actions");
|
|
46192
|
+
default:
|
|
46193
|
+
return errorResult(`Unknown action: ${action}`);
|
|
46194
|
+
}
|
|
46195
|
+
return {
|
|
46196
|
+
content: [{
|
|
46197
|
+
type: "text",
|
|
46198
|
+
text: `Plan ${action} result:
|
|
46199
|
+
${JSON.stringify(result, null, 2)}`
|
|
46200
|
+
}]
|
|
46201
|
+
};
|
|
46202
|
+
} catch (err) {
|
|
46203
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
46204
|
+
}
|
|
46205
|
+
};
|
|
46206
|
+
SWARM_TOOLS = [swarmDefinition, memoryDefinition, planDefinition];
|
|
46207
|
+
}
|
|
46208
|
+
});
|
|
46209
|
+
|
|
45898
46210
|
// ../../packages/mcp/src/index.ts
|
|
45899
46211
|
var src_exports3 = {};
|
|
45900
46212
|
__export(src_exports3, {
|
|
@@ -45912,6 +46224,7 @@ __export(src_exports3, {
|
|
|
45912
46224
|
QUALITY_INTELLIGENCE_TOOLS: () => QUALITY_INTELLIGENCE_TOOLS,
|
|
45913
46225
|
RBAC_TOOLS: () => RBAC_TOOLS,
|
|
45914
46226
|
RELEASE_TOOLS: () => RELEASE_TOOLS,
|
|
46227
|
+
SWARM_TOOLS: () => SWARM_TOOLS,
|
|
45915
46228
|
SYNC_TOOLS: () => SYNC_TOOLS,
|
|
45916
46229
|
agentDetails: () => agentDetails,
|
|
45917
46230
|
assistResponse: () => assistResponse,
|
|
@@ -45953,6 +46266,7 @@ __export(src_exports3, {
|
|
|
45953
46266
|
registerRbacTools: () => registerRbacTools,
|
|
45954
46267
|
registerReleaseTools: () => registerReleaseTools,
|
|
45955
46268
|
registerResource: () => registerResource,
|
|
46269
|
+
registerSwarmTools: () => registerSwarmTools,
|
|
45956
46270
|
registerSyncTools: () => registerSyncTools,
|
|
45957
46271
|
registerTool: () => registerTool,
|
|
45958
46272
|
resolveCompatibilityRegistry: () => resolveCompatibilityRegistry,
|
|
@@ -45988,6 +46302,7 @@ var init_src3 = __esm({
|
|
|
45988
46302
|
init_observer_tools();
|
|
45989
46303
|
init_autopilot_tools();
|
|
45990
46304
|
init_brain_tools();
|
|
46305
|
+
init_swarm_tools();
|
|
45991
46306
|
}
|
|
45992
46307
|
});
|
|
45993
46308
|
|
|
@@ -66356,7 +66671,7 @@ function drawProgressBar(progress, width = 20) {
|
|
|
66356
66671
|
}
|
|
66357
66672
|
function getWorkflowStates(projectRoot) {
|
|
66358
66673
|
const workflows = {};
|
|
66359
|
-
const names = ["onboard", "analyze", "audit", "seed", "context", "deploy", "loop"
|
|
66674
|
+
const names = ["onboard", "analyze", "audit", "seed", "context", "deploy", "loop"];
|
|
66360
66675
|
for (const name of names) {
|
|
66361
66676
|
const stateFile = path78.join(projectRoot, ".bootspring", name, "workflow-state.json");
|
|
66362
66677
|
if (fs77.existsSync(stateFile)) {
|
|
@@ -72858,10 +73173,434 @@ function registerHarnessCommand(program3) {
|
|
|
72858
73173
|
});
|
|
72859
73174
|
}
|
|
72860
73175
|
|
|
72861
|
-
// src/commands/
|
|
73176
|
+
// src/commands/swarm.ts
|
|
72862
73177
|
init_cjs_shims();
|
|
72863
73178
|
init_src2();
|
|
72864
73179
|
function requireAuth4() {
|
|
73180
|
+
if (auth_exports.isAuthenticated()) return true;
|
|
73181
|
+
print(`${COLORS.red}Not authenticated.${COLORS.reset} Run ${COLORS.bold}bootspring auth login${COLORS.reset} first.`);
|
|
73182
|
+
process.exitCode = 1;
|
|
73183
|
+
return false;
|
|
73184
|
+
}
|
|
73185
|
+
function handleError(error50) {
|
|
73186
|
+
if (error50 && typeof error50 === "object" && "response" in error50) {
|
|
73187
|
+
const resp = error50.response;
|
|
73188
|
+
if (resp?.status === 403) {
|
|
73189
|
+
print(`
|
|
73190
|
+
${COLORS.yellow}Swarm Intelligence requires Pro tier or higher.${COLORS.reset}`);
|
|
73191
|
+
print(`Upgrade at: ${COLORS.cyan}https://bootspring.com/pricing${COLORS.reset}
|
|
73192
|
+
`);
|
|
73193
|
+
return;
|
|
73194
|
+
}
|
|
73195
|
+
print(`${COLORS.red}Error:${COLORS.reset} ${resp?.data?.error || resp?.data?.message || "Unknown API error"}`);
|
|
73196
|
+
return;
|
|
73197
|
+
}
|
|
73198
|
+
print(`${COLORS.red}Error:${COLORS.reset} ${error50 instanceof Error ? error50.message : String(error50)}`);
|
|
73199
|
+
}
|
|
73200
|
+
var TOPOLOGY_SYMBOLS = {
|
|
73201
|
+
hierarchical: "\u25B3",
|
|
73202
|
+
// △
|
|
73203
|
+
mesh: "\u25C6",
|
|
73204
|
+
// ◆
|
|
73205
|
+
ring: "\u25CB",
|
|
73206
|
+
// ○
|
|
73207
|
+
star: "\u2605",
|
|
73208
|
+
// ★
|
|
73209
|
+
adaptive: "\u21C4"
|
|
73210
|
+
// ⇄
|
|
73211
|
+
};
|
|
73212
|
+
var STATUS_COLORS = {
|
|
73213
|
+
idle: COLORS.green,
|
|
73214
|
+
busy: COLORS.cyan,
|
|
73215
|
+
waiting: COLORS.yellow,
|
|
73216
|
+
failed: COLORS.red,
|
|
73217
|
+
offline: COLORS.dim
|
|
73218
|
+
};
|
|
73219
|
+
function registerSwarmCommand(program3) {
|
|
73220
|
+
const cmd = program3.command("swarm").description("Multi-agent swarm orchestration \u2014 topology, consensus, planning");
|
|
73221
|
+
cmd.command("start").description("Start a new swarm").option("-t, --topology <type>", "Topology: hierarchical, mesh, ring, star, adaptive", "hierarchical").option("--max-agents <n>", "Maximum agents", "50").option("--json", "Output as JSON").action(async (opts) => {
|
|
73222
|
+
if (!requireAuth4()) return;
|
|
73223
|
+
try {
|
|
73224
|
+
const res = await api_client_exports.request("POST", "/swarm/start", {
|
|
73225
|
+
topology: opts.topology,
|
|
73226
|
+
maxAgents: parseInt(opts.maxAgents, 10)
|
|
73227
|
+
});
|
|
73228
|
+
if (opts.json) {
|
|
73229
|
+
print(JSON.stringify(res, null, 2));
|
|
73230
|
+
return;
|
|
73231
|
+
}
|
|
73232
|
+
const topo = opts.topology;
|
|
73233
|
+
const sym = TOPOLOGY_SYMBOLS[topo] || "";
|
|
73234
|
+
print(`
|
|
73235
|
+
${COLORS.bold}${COLORS.cyan}${sym} Swarm Started${COLORS.reset}`);
|
|
73236
|
+
print(` Topology: ${COLORS.green}${topo}${COLORS.reset}`);
|
|
73237
|
+
print(` Max Agents: ${opts.maxAgents}`);
|
|
73238
|
+
print(` Phase: ${res.config?.phase || "running"}
|
|
73239
|
+
`);
|
|
73240
|
+
} catch (error50) {
|
|
73241
|
+
handleError(error50);
|
|
73242
|
+
}
|
|
73243
|
+
});
|
|
73244
|
+
cmd.command("stop").description("Stop the current swarm").option("--json", "Output as JSON").action(async (opts) => {
|
|
73245
|
+
if (!requireAuth4()) return;
|
|
73246
|
+
try {
|
|
73247
|
+
const res = await api_client_exports.request("POST", "/swarm/stop");
|
|
73248
|
+
if (opts.json) {
|
|
73249
|
+
print(JSON.stringify(res, null, 2));
|
|
73250
|
+
return;
|
|
73251
|
+
}
|
|
73252
|
+
print(`
|
|
73253
|
+
${COLORS.bold}Swarm Stopped${COLORS.reset}`);
|
|
73254
|
+
if (res.metrics) {
|
|
73255
|
+
print(` Tasks Completed: ${COLORS.green}${res.metrics.completedTasks}${COLORS.reset}`);
|
|
73256
|
+
print(` Tasks Failed: ${COLORS.red}${res.metrics.failedTasks}${COLORS.reset}`);
|
|
73257
|
+
print(` Total Agents: ${res.metrics.totalAgents}`);
|
|
73258
|
+
}
|
|
73259
|
+
print("");
|
|
73260
|
+
} catch (error50) {
|
|
73261
|
+
handleError(error50);
|
|
73262
|
+
}
|
|
73263
|
+
});
|
|
73264
|
+
cmd.command("status").description("Show swarm metrics and topology").option("--json", "Output as JSON").action(async (opts) => {
|
|
73265
|
+
if (!requireAuth4()) return;
|
|
73266
|
+
try {
|
|
73267
|
+
const res = await api_client_exports.request("GET", "/swarm/status");
|
|
73268
|
+
if (opts.json) {
|
|
73269
|
+
print(JSON.stringify(res, null, 2));
|
|
73270
|
+
return;
|
|
73271
|
+
}
|
|
73272
|
+
const m = res.metrics;
|
|
73273
|
+
const sym = TOPOLOGY_SYMBOLS[m.topology] || "";
|
|
73274
|
+
print(`
|
|
73275
|
+
${COLORS.bold}${COLORS.cyan}${sym} Swarm Status${COLORS.reset}`);
|
|
73276
|
+
print(`${"\u2500".repeat(50)}`);
|
|
73277
|
+
print(` Phase: ${m.phase}`);
|
|
73278
|
+
print(` Topology: ${COLORS.green}${m.topology}${COLORS.reset}`);
|
|
73279
|
+
print(` Uptime: ${Math.round(m.uptime / 1e3)}s`);
|
|
73280
|
+
print("");
|
|
73281
|
+
print(` ${COLORS.bold}Agents${COLORS.reset}`);
|
|
73282
|
+
print(` Total: ${m.totalAgents}`);
|
|
73283
|
+
print(` Active: ${COLORS.cyan}${m.activeAgents}${COLORS.reset}`);
|
|
73284
|
+
print(` Idle: ${COLORS.green}${m.idleAgents}${COLORS.reset}`);
|
|
73285
|
+
print(` Failed: ${COLORS.red}${m.failedAgents}${COLORS.reset}`);
|
|
73286
|
+
print("");
|
|
73287
|
+
print(` ${COLORS.bold}Tasks${COLORS.reset}`);
|
|
73288
|
+
print(` Total: ${m.totalTasks}`);
|
|
73289
|
+
print(` Running: ${COLORS.cyan}${m.runningTasks}${COLORS.reset}`);
|
|
73290
|
+
print(` Pending: ${COLORS.yellow}${m.pendingTasks}${COLORS.reset}`);
|
|
73291
|
+
print(` Completed: ${COLORS.green}${m.completedTasks}${COLORS.reset}`);
|
|
73292
|
+
print(` Failed: ${COLORS.red}${m.failedTasks}${COLORS.reset}`);
|
|
73293
|
+
print("");
|
|
73294
|
+
print(` Throughput: ${m.throughputTasksPerMin} tasks/min`);
|
|
73295
|
+
print(` Avg Time: ${m.avgTaskDurationMs}ms`);
|
|
73296
|
+
if (res.topology) {
|
|
73297
|
+
print(`
|
|
73298
|
+
${COLORS.bold}Topology Graph${COLORS.reset}`);
|
|
73299
|
+
print(` Nodes: ${res.topology.nodes.length} Edges: ${res.topology.edges.length}`);
|
|
73300
|
+
}
|
|
73301
|
+
print("");
|
|
73302
|
+
} catch (error50) {
|
|
73303
|
+
handleError(error50);
|
|
73304
|
+
}
|
|
73305
|
+
});
|
|
73306
|
+
cmd.command("spawn <role>").description("Spawn a new agent (queen, worker, specialist, reviewer, monitor)").option("-c, --capabilities <caps>", "Comma-separated capabilities", "general").option("--json", "Output as JSON").action(async (role, opts) => {
|
|
73307
|
+
if (!requireAuth4()) return;
|
|
73308
|
+
const validRoles = ["queen", "worker", "specialist", "reviewer", "monitor"];
|
|
73309
|
+
if (!validRoles.includes(role)) {
|
|
73310
|
+
print(`${COLORS.red}Invalid role:${COLORS.reset} ${role}. Must be one of: ${validRoles.join(", ")}`);
|
|
73311
|
+
return;
|
|
73312
|
+
}
|
|
73313
|
+
try {
|
|
73314
|
+
const capabilities = opts.capabilities.split(",").map((c) => c.trim());
|
|
73315
|
+
const res = await api_client_exports.request("POST", "/swarm/agents", { role, capabilities });
|
|
73316
|
+
if (opts.json) {
|
|
73317
|
+
print(JSON.stringify(res, null, 2));
|
|
73318
|
+
return;
|
|
73319
|
+
}
|
|
73320
|
+
print(`
|
|
73321
|
+
${COLORS.green}Agent spawned:${COLORS.reset} ${res.id}`);
|
|
73322
|
+
print(` Role: ${res.role}`);
|
|
73323
|
+
print(` Capabilities: ${res.capabilities.join(", ")}`);
|
|
73324
|
+
print(` Status: ${STATUS_COLORS[res.status] || ""}${res.status}${COLORS.reset}
|
|
73325
|
+
`);
|
|
73326
|
+
} catch (error50) {
|
|
73327
|
+
handleError(error50);
|
|
73328
|
+
}
|
|
73329
|
+
});
|
|
73330
|
+
cmd.command("agents").description("List swarm agents").option("--role <role>", "Filter by role").option("--json", "Output as JSON").action(async (opts) => {
|
|
73331
|
+
if (!requireAuth4()) return;
|
|
73332
|
+
try {
|
|
73333
|
+
const query = opts.role ? `?role=${opts.role}` : "";
|
|
73334
|
+
const res = await api_client_exports.request("GET", `/swarm/agents${query}`);
|
|
73335
|
+
if (opts.json) {
|
|
73336
|
+
print(JSON.stringify(res, null, 2));
|
|
73337
|
+
return;
|
|
73338
|
+
}
|
|
73339
|
+
print(`
|
|
73340
|
+
${COLORS.bold}${COLORS.cyan}Swarm Agents${COLORS.reset} (${res.count})
|
|
73341
|
+
`);
|
|
73342
|
+
print(`${"ID".padEnd(24)} ${"Role".padEnd(12)} ${"Status".padEnd(10)} ${"Done".padEnd(6)} ${"Fail".padEnd(6)} Capabilities`);
|
|
73343
|
+
print(`${"\u2500".repeat(24)} ${"\u2500".repeat(12)} ${"\u2500".repeat(10)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(20)}`);
|
|
73344
|
+
for (const a of res.agents) {
|
|
73345
|
+
const color = STATUS_COLORS[a.status] || "";
|
|
73346
|
+
print(
|
|
73347
|
+
`${a.id.padEnd(24)} ${a.role.padEnd(12)} ${color}${a.status.padEnd(10)}${COLORS.reset} ${String(a.completedTasks).padEnd(6)} ${String(a.failedTasks).padEnd(6)} ${a.capabilities.join(", ")}`
|
|
73348
|
+
);
|
|
73349
|
+
}
|
|
73350
|
+
print("");
|
|
73351
|
+
} catch (error50) {
|
|
73352
|
+
handleError(error50);
|
|
73353
|
+
}
|
|
73354
|
+
});
|
|
73355
|
+
cmd.command("submit <type>").description("Submit a task to the swarm").argument("<description>", "Task description").option("-p, --priority <level>", "Priority: critical, high, normal, low", "normal").option("--json", "Output as JSON").action(async (type, description, opts) => {
|
|
73356
|
+
if (!requireAuth4()) return;
|
|
73357
|
+
try {
|
|
73358
|
+
const res = await api_client_exports.request("POST", "/swarm/tasks", {
|
|
73359
|
+
type,
|
|
73360
|
+
description,
|
|
73361
|
+
input: {},
|
|
73362
|
+
priority: opts.priority
|
|
73363
|
+
});
|
|
73364
|
+
if (opts.json) {
|
|
73365
|
+
print(JSON.stringify(res, null, 2));
|
|
73366
|
+
return;
|
|
73367
|
+
}
|
|
73368
|
+
print(`
|
|
73369
|
+
${COLORS.green}Task submitted:${COLORS.reset} ${res.id}`);
|
|
73370
|
+
print(` Type: ${res.type}`);
|
|
73371
|
+
print(` Priority: ${res.priority}`);
|
|
73372
|
+
print(` Status: ${res.status}`);
|
|
73373
|
+
if (res.assignedAgentId) {
|
|
73374
|
+
print(` Assigned: ${res.assignedAgentId}`);
|
|
73375
|
+
}
|
|
73376
|
+
print("");
|
|
73377
|
+
} catch (error50) {
|
|
73378
|
+
handleError(error50);
|
|
73379
|
+
}
|
|
73380
|
+
});
|
|
73381
|
+
cmd.command("plan <goal>").description("Generate a GOAP execution plan from a goal").option("--parallel", "Enable parallel task groups").option("--json", "Output as JSON").action(async (goal, opts) => {
|
|
73382
|
+
if (!requireAuth4()) return;
|
|
73383
|
+
try {
|
|
73384
|
+
const res = await api_client_exports.request("POST", "/swarm/plan", {
|
|
73385
|
+
goal,
|
|
73386
|
+
currentState: {},
|
|
73387
|
+
goalConditions: [{ key: "deployed", operator: "==", value: true }],
|
|
73388
|
+
parallel: !!opts.parallel
|
|
73389
|
+
});
|
|
73390
|
+
if (opts.json) {
|
|
73391
|
+
print(JSON.stringify(res, null, 2));
|
|
73392
|
+
return;
|
|
73393
|
+
}
|
|
73394
|
+
const feasibleStr = res.feasible ? `${COLORS.green}FEASIBLE${COLORS.reset}` : `${COLORS.red}INFEASIBLE${COLORS.reset}`;
|
|
73395
|
+
print(`
|
|
73396
|
+
${COLORS.bold}${COLORS.cyan}Goal Planner${COLORS.reset}
|
|
73397
|
+
`);
|
|
73398
|
+
print(` Goal: ${goal}`);
|
|
73399
|
+
print(` Feasible: ${feasibleStr}`);
|
|
73400
|
+
print(` Explanation: ${res.explanation}`);
|
|
73401
|
+
if (res.feasible && res.steps.length > 0) {
|
|
73402
|
+
print(` Total Cost: ${res.totalCost}`);
|
|
73403
|
+
print(` Est. Time: ${Math.round(res.estimatedDurationMs / 1e3)}s`);
|
|
73404
|
+
print(` Par. Groups: ${res.parallelGroups}`);
|
|
73405
|
+
print(`
|
|
73406
|
+
${COLORS.bold}Execution Steps:${COLORS.reset}
|
|
73407
|
+
`);
|
|
73408
|
+
print(` ${"#".padEnd(4)} ${"Action".padEnd(24)} ${"Agent".padEnd(14)} ${"Group".padEnd(8)} Duration`);
|
|
73409
|
+
print(` ${"\u2500".repeat(4)} ${"\u2500".repeat(24)} ${"\u2500".repeat(14)} ${"\u2500".repeat(8)} ${"\u2500".repeat(10)}`);
|
|
73410
|
+
for (const step of res.steps) {
|
|
73411
|
+
const group = `G${step.parallelGroup}`;
|
|
73412
|
+
const dur = `${Math.round(step.action.estimatedDurationMs / 1e3)}s`;
|
|
73413
|
+
print(
|
|
73414
|
+
` ${String(step.order + 1).padEnd(4)} ${step.action.name.padEnd(24)} ${step.action.agentCapability.padEnd(14)} ${group.padEnd(8)} ${dur}`
|
|
73415
|
+
);
|
|
73416
|
+
}
|
|
73417
|
+
if (res.steps.some((s) => s.dependencies.length > 0)) {
|
|
73418
|
+
print(`
|
|
73419
|
+
${COLORS.bold}Dependencies:${COLORS.reset}`);
|
|
73420
|
+
for (const step of res.steps) {
|
|
73421
|
+
if (step.dependencies.length > 0) {
|
|
73422
|
+
print(` ${step.action.name} ${COLORS.dim}<- ${step.dependencies.join(", ")}${COLORS.reset}`);
|
|
73423
|
+
}
|
|
73424
|
+
}
|
|
73425
|
+
}
|
|
73426
|
+
}
|
|
73427
|
+
print("");
|
|
73428
|
+
} catch (error50) {
|
|
73429
|
+
handleError(error50);
|
|
73430
|
+
}
|
|
73431
|
+
});
|
|
73432
|
+
cmd.command("consensus <question>").description("Run a consensus vote across agents").requiredOption("-o, --options <opts>", "Comma-separated vote options").option("--json", "Output as JSON").action(async (question, opts) => {
|
|
73433
|
+
if (!requireAuth4()) return;
|
|
73434
|
+
try {
|
|
73435
|
+
const options = opts.options.split(",").map((o) => o.trim());
|
|
73436
|
+
const res = await api_client_exports.request("POST", "/swarm/consensus", { question, options });
|
|
73437
|
+
if (opts.json) {
|
|
73438
|
+
print(JSON.stringify(res, null, 2));
|
|
73439
|
+
return;
|
|
73440
|
+
}
|
|
73441
|
+
const quorum = res.quorumReached ? `${COLORS.green}QUORUM REACHED${COLORS.reset}` : `${COLORS.yellow}NO QUORUM${COLORS.reset}`;
|
|
73442
|
+
print(`
|
|
73443
|
+
${COLORS.bold}${COLORS.cyan}Consensus Vote${COLORS.reset}
|
|
73444
|
+
`);
|
|
73445
|
+
print(` Question: ${question}`);
|
|
73446
|
+
print(` Decision: ${COLORS.bold}${res.decision}${COLORS.reset}`);
|
|
73447
|
+
print(` Agreement: ${Math.round(res.agreement * 100)}%`);
|
|
73448
|
+
print(` Status: ${quorum}`);
|
|
73449
|
+
print(` Votes: ${res.votes.length}
|
|
73450
|
+
`);
|
|
73451
|
+
} catch (error50) {
|
|
73452
|
+
handleError(error50);
|
|
73453
|
+
}
|
|
73454
|
+
});
|
|
73455
|
+
cmd.command("memory <action>").description("Vector memory: search, store, stats").argument("[query]", "Search query or content to store").option("--type <type>", "Memory type filter").option("--limit <n>", "Max results", "10").option("--json", "Output as JSON").action(async (action, query, opts) => {
|
|
73456
|
+
if (!requireAuth4()) return;
|
|
73457
|
+
try {
|
|
73458
|
+
if (action === "search" && query) {
|
|
73459
|
+
const res = await api_client_exports.request("POST", "/swarm/memory/search", {
|
|
73460
|
+
query,
|
|
73461
|
+
limit: parseInt(opts.limit, 10),
|
|
73462
|
+
type: opts.type
|
|
73463
|
+
});
|
|
73464
|
+
if (opts.json) {
|
|
73465
|
+
print(JSON.stringify(res, null, 2));
|
|
73466
|
+
return;
|
|
73467
|
+
}
|
|
73468
|
+
print(`
|
|
73469
|
+
${COLORS.bold}${COLORS.cyan}Memory Search${COLORS.reset} (${res.results.length} results, ${res.searchTimeMs}ms, ${res.method})
|
|
73470
|
+
`);
|
|
73471
|
+
for (const r of res.results) {
|
|
73472
|
+
const truncated = r.entry.content.length > 80 ? r.entry.content.slice(0, 80) + "..." : r.entry.content;
|
|
73473
|
+
print(` ${COLORS.green}#${r.rank}${COLORS.reset} [${r.score.toFixed(3)}] ${COLORS.dim}(${r.entry.type})${COLORS.reset} ${truncated}`);
|
|
73474
|
+
}
|
|
73475
|
+
print("");
|
|
73476
|
+
} else if (action === "stats") {
|
|
73477
|
+
const res = await api_client_exports.request("GET", "/swarm/memory/stats");
|
|
73478
|
+
if (opts.json) {
|
|
73479
|
+
print(JSON.stringify(res, null, 2));
|
|
73480
|
+
return;
|
|
73481
|
+
}
|
|
73482
|
+
print(`
|
|
73483
|
+
${COLORS.bold}${COLORS.cyan}Vector Memory Stats${COLORS.reset}
|
|
73484
|
+
`);
|
|
73485
|
+
print(` Entries: ${res.totalEntries}`);
|
|
73486
|
+
print(` Dimensions: ${res.dimensions}`);
|
|
73487
|
+
print(` Layers: ${res.layers}`);
|
|
73488
|
+
print(` Avg Import: ${res.avgImportance}`);
|
|
73489
|
+
print(` Memory: ${Math.round(res.memoryBytes / 1024)}KB`);
|
|
73490
|
+
if (res.byType && Object.keys(res.byType).length > 0) {
|
|
73491
|
+
print(`
|
|
73492
|
+
By Type:`);
|
|
73493
|
+
for (const [type, count] of Object.entries(res.byType)) {
|
|
73494
|
+
print(` ${type.padEnd(16)} ${count}`);
|
|
73495
|
+
}
|
|
73496
|
+
}
|
|
73497
|
+
print("");
|
|
73498
|
+
} else {
|
|
73499
|
+
print(`
|
|
73500
|
+
Usage: bootspring swarm memory <search|stats> [query]`);
|
|
73501
|
+
print(` ${COLORS.dim}bootspring swarm memory search "how to fix tests"${COLORS.reset}`);
|
|
73502
|
+
print(` ${COLORS.dim}bootspring swarm memory stats${COLORS.reset}
|
|
73503
|
+
`);
|
|
73504
|
+
}
|
|
73505
|
+
} catch (error50) {
|
|
73506
|
+
handleError(error50);
|
|
73507
|
+
}
|
|
73508
|
+
});
|
|
73509
|
+
cmd.command("topology").description("Show or change swarm topology").option("-s, --set <type>", "Change topology: hierarchical, mesh, ring, star, adaptive").option("--json", "Output as JSON").action(async (opts) => {
|
|
73510
|
+
if (!requireAuth4()) return;
|
|
73511
|
+
try {
|
|
73512
|
+
if (opts.set) {
|
|
73513
|
+
const res = await api_client_exports.request("POST", "/swarm/topology", { topology: opts.set });
|
|
73514
|
+
if (opts.json) {
|
|
73515
|
+
print(JSON.stringify(res, null, 2));
|
|
73516
|
+
return;
|
|
73517
|
+
}
|
|
73518
|
+
print(`
|
|
73519
|
+
${COLORS.green}Topology changed to:${COLORS.reset} ${opts.set}
|
|
73520
|
+
`);
|
|
73521
|
+
} else {
|
|
73522
|
+
const res = await api_client_exports.request("GET", "/swarm/topology");
|
|
73523
|
+
if (opts.json) {
|
|
73524
|
+
print(JSON.stringify(res, null, 2));
|
|
73525
|
+
return;
|
|
73526
|
+
}
|
|
73527
|
+
print(`
|
|
73528
|
+
${COLORS.bold}${COLORS.cyan}Topology Graph${COLORS.reset}
|
|
73529
|
+
`);
|
|
73530
|
+
print(` Nodes: ${res.nodes.length} Edges: ${res.edges.length}
|
|
73531
|
+
`);
|
|
73532
|
+
for (const node of res.nodes) {
|
|
73533
|
+
const color = STATUS_COLORS[node.status] || "";
|
|
73534
|
+
print(` ${color}\u25CF${COLORS.reset} ${node.id} (${node.role})`);
|
|
73535
|
+
}
|
|
73536
|
+
if (res.edges.length > 0) {
|
|
73537
|
+
print(`
|
|
73538
|
+
Edges:`);
|
|
73539
|
+
for (const edge of res.edges.slice(0, 20)) {
|
|
73540
|
+
const arrow = edge.type === "parent" ? "\u2192" : "\u2194";
|
|
73541
|
+
print(` ${edge.from} ${arrow} ${edge.to} ${COLORS.dim}(${edge.type})${COLORS.reset}`);
|
|
73542
|
+
}
|
|
73543
|
+
if (res.edges.length > 20) {
|
|
73544
|
+
print(` ${COLORS.dim}... and ${res.edges.length - 20} more edges${COLORS.reset}`);
|
|
73545
|
+
}
|
|
73546
|
+
}
|
|
73547
|
+
print("");
|
|
73548
|
+
}
|
|
73549
|
+
} catch (error50) {
|
|
73550
|
+
handleError(error50);
|
|
73551
|
+
}
|
|
73552
|
+
});
|
|
73553
|
+
cmd.command("visualize").description("Visualize swarm topology as ASCII art").option("--json", "Output as JSON").action(async (opts) => {
|
|
73554
|
+
if (!requireAuth4()) return;
|
|
73555
|
+
try {
|
|
73556
|
+
const res = await api_client_exports.request("GET", "/swarm/snapshot");
|
|
73557
|
+
if (opts.json) {
|
|
73558
|
+
print(JSON.stringify(res, null, 2));
|
|
73559
|
+
return;
|
|
73560
|
+
}
|
|
73561
|
+
const m = res.metrics;
|
|
73562
|
+
const sym = TOPOLOGY_SYMBOLS[m.topology] || "";
|
|
73563
|
+
print(`
|
|
73564
|
+
${COLORS.bold}${COLORS.cyan}${sym} Swarm Visualization \u2014 ${m.topology}${COLORS.reset}
|
|
73565
|
+
`);
|
|
73566
|
+
const agents = res.agents || [];
|
|
73567
|
+
const queen = agents.find((a) => a.role === "queen");
|
|
73568
|
+
if (m.topology === "hierarchical" || m.topology === "star") {
|
|
73569
|
+
if (queen) {
|
|
73570
|
+
print(` ${COLORS.yellow}\u265B ${queen.id}${COLORS.reset} (queen)`);
|
|
73571
|
+
const children = agents.filter((a) => a.parentId === queen.id);
|
|
73572
|
+
for (let i = 0; i < children.length; i++) {
|
|
73573
|
+
const isLast = i === children.length - 1;
|
|
73574
|
+
const prefix = isLast ? " \u2514\u2500\u2500 " : " \u251C\u2500\u2500 ";
|
|
73575
|
+
const color = STATUS_COLORS[children[i].status] || "";
|
|
73576
|
+
print(`${prefix}${color}\u25CF ${children[i].id}${COLORS.reset} (${children[i].role})`);
|
|
73577
|
+
}
|
|
73578
|
+
}
|
|
73579
|
+
} else if (m.topology === "ring") {
|
|
73580
|
+
for (let i = 0; i < agents.length; i++) {
|
|
73581
|
+
const color = STATUS_COLORS[agents[i].status] || "";
|
|
73582
|
+
const arrow = i < agents.length - 1 ? " \u2192" : ` \u2192 ${agents[0]?.id || ""}`;
|
|
73583
|
+
print(` ${color}\u25CF ${agents[i].id}${COLORS.reset}${arrow}`);
|
|
73584
|
+
}
|
|
73585
|
+
} else {
|
|
73586
|
+
for (const a of agents) {
|
|
73587
|
+
const color = STATUS_COLORS[a.status] || "";
|
|
73588
|
+
print(` ${color}\u25CF${COLORS.reset} ${a.id} (${a.role}) [${a.capabilities.join(", ")}]`);
|
|
73589
|
+
}
|
|
73590
|
+
}
|
|
73591
|
+
print(`
|
|
73592
|
+
${COLORS.dim}Agents: ${m.totalAgents} | Tasks: ${m.totalTasks} | Completed: ${m.completedTasks} | Phase: ${m.phase}${COLORS.reset}
|
|
73593
|
+
`);
|
|
73594
|
+
} catch (error50) {
|
|
73595
|
+
handleError(error50);
|
|
73596
|
+
}
|
|
73597
|
+
});
|
|
73598
|
+
}
|
|
73599
|
+
|
|
73600
|
+
// src/commands/geo.ts
|
|
73601
|
+
init_cjs_shims();
|
|
73602
|
+
init_src2();
|
|
73603
|
+
function requireAuth5() {
|
|
72865
73604
|
if (auth_exports.isAuthenticated()) {
|
|
72866
73605
|
return true;
|
|
72867
73606
|
}
|
|
@@ -72929,7 +73668,7 @@ function printGeoResult(result) {
|
|
|
72929
73668
|
function registerGeoCommand(program3) {
|
|
72930
73669
|
const geo = program3.command("geo").description("GEO-SEO analysis \u2014 optimize for AI search engines");
|
|
72931
73670
|
geo.command("audit <url>").description("Full GEO + SEO audit with parallel subagents").option("--format <format>", "Output format: markdown | json", "markdown").action(async (url2, opts) => {
|
|
72932
|
-
if (!
|
|
73671
|
+
if (!requireAuth5()) return;
|
|
72933
73672
|
const spinner = createSpinner("Running GEO audit...").start();
|
|
72934
73673
|
try {
|
|
72935
73674
|
const result = await api_client_exports.request("POST", "/geo/audit", { url: url2, options: opts });
|
|
@@ -72941,7 +73680,7 @@ function registerGeoCommand(program3) {
|
|
|
72941
73680
|
}
|
|
72942
73681
|
});
|
|
72943
73682
|
geo.command("quick <url>").description("60-second GEO visibility snapshot").action(async (url2) => {
|
|
72944
|
-
if (!
|
|
73683
|
+
if (!requireAuth5()) return;
|
|
72945
73684
|
const spinner = createSpinner("Quick GEO scan...").start();
|
|
72946
73685
|
try {
|
|
72947
73686
|
const result = await api_client_exports.request("POST", "/geo/quick", { url: url2 });
|
|
@@ -72968,7 +73707,7 @@ function registerGeoCommand(program3) {
|
|
|
72968
73707
|
];
|
|
72969
73708
|
for (const sub of subcommands) {
|
|
72970
73709
|
geo.command(`${sub.name} ${sub.arg}`).description(sub.desc).action(async (urlOrDomain) => {
|
|
72971
|
-
if (!
|
|
73710
|
+
if (!requireAuth5()) return;
|
|
72972
73711
|
const spinner = createSpinner(`Running ${sub.name}...`).start();
|
|
72973
73712
|
try {
|
|
72974
73713
|
const body = sub.arg === "<domain>" ? { domain: urlOrDomain } : { url: urlOrDomain };
|
|
@@ -72982,7 +73721,7 @@ function registerGeoCommand(program3) {
|
|
|
72982
73721
|
});
|
|
72983
73722
|
}
|
|
72984
73723
|
geo.command("prospect <action>").description("CRM: manage prospects (new, list, show, audit, note, status, pipeline)").argument("[args...]", "Action-specific arguments").action(async (action, args) => {
|
|
72985
|
-
if (!
|
|
73724
|
+
if (!requireAuth5()) return;
|
|
72986
73725
|
const spinner = createSpinner(`Prospect ${action}...`).start();
|
|
72987
73726
|
try {
|
|
72988
73727
|
const result = await api_client_exports.request("POST", "/geo/prospect", { action, data: args });
|
|
@@ -72994,7 +73733,7 @@ function registerGeoCommand(program3) {
|
|
|
72994
73733
|
}
|
|
72995
73734
|
});
|
|
72996
73735
|
geo.command("schemas [name]").description("List JSON-LD schema templates or view a specific one").action(async (name) => {
|
|
72997
|
-
if (!
|
|
73736
|
+
if (!requireAuth5()) return;
|
|
72998
73737
|
const spinner = createSpinner(name ? `Fetching ${name} schema...` : "Listing schemas...").start();
|
|
72999
73738
|
try {
|
|
73000
73739
|
if (name) {
|
|
@@ -73030,7 +73769,7 @@ function registerGeoCommand(program3) {
|
|
|
73030
73769
|
// src/commands/marketing.ts
|
|
73031
73770
|
init_cjs_shims();
|
|
73032
73771
|
init_src2();
|
|
73033
|
-
function
|
|
73772
|
+
function requireAuth6() {
|
|
73034
73773
|
if (auth_exports.isAuthenticated()) {
|
|
73035
73774
|
return true;
|
|
73036
73775
|
}
|
|
@@ -73176,7 +73915,7 @@ function registerMarketingCommand(program3) {
|
|
|
73176
73915
|
}
|
|
73177
73916
|
}
|
|
73178
73917
|
sub.action(async (...actionArgs) => {
|
|
73179
|
-
if (!
|
|
73918
|
+
if (!requireAuth6()) return;
|
|
73180
73919
|
const body = {};
|
|
73181
73920
|
for (let i = 0; i < cmd.args.length; i++) {
|
|
73182
73921
|
body[cmd.args[i].name] = actionArgs[i];
|
|
@@ -73219,7 +73958,7 @@ function registerMarketingCommand(program3) {
|
|
|
73219
73958
|
});
|
|
73220
73959
|
}
|
|
73221
73960
|
marketing.command("commands").description("List all available marketing commands").action(async () => {
|
|
73222
|
-
if (!
|
|
73961
|
+
if (!requireAuth6()) return;
|
|
73223
73962
|
const spinner = createSpinner("Fetching marketing commands...").start();
|
|
73224
73963
|
try {
|
|
73225
73964
|
const result = await api_client_exports.request("GET", "/marketing/commands");
|
|
@@ -73265,7 +74004,7 @@ function registerMarketingCommand(program3) {
|
|
|
73265
74004
|
// src/commands/sales.ts
|
|
73266
74005
|
init_cjs_shims();
|
|
73267
74006
|
init_src2();
|
|
73268
|
-
function
|
|
74007
|
+
function requireAuth7() {
|
|
73269
74008
|
if (auth_exports.isAuthenticated()) {
|
|
73270
74009
|
return true;
|
|
73271
74010
|
}
|
|
@@ -73386,7 +74125,7 @@ function registerSalesCommand(program3) {
|
|
|
73386
74125
|
}
|
|
73387
74126
|
}
|
|
73388
74127
|
sub.action(async (...actionArgs) => {
|
|
73389
|
-
if (!
|
|
74128
|
+
if (!requireAuth7()) return;
|
|
73390
74129
|
const body = {};
|
|
73391
74130
|
for (let i = 0; i < cmd.args.length; i++) {
|
|
73392
74131
|
body[cmd.args[i].name] = actionArgs[i];
|
|
@@ -73424,7 +74163,7 @@ function registerSalesCommand(program3) {
|
|
|
73424
74163
|
});
|
|
73425
74164
|
}
|
|
73426
74165
|
sales.command("commands").description("List all available sales commands").action(async () => {
|
|
73427
|
-
if (!
|
|
74166
|
+
if (!requireAuth7()) return;
|
|
73428
74167
|
const spinner = createSpinner("Fetching sales commands...").start();
|
|
73429
74168
|
try {
|
|
73430
74169
|
const result = await api_client_exports.request("GET", "/sales/commands");
|
|
@@ -73469,7 +74208,7 @@ function registerSalesCommand(program3) {
|
|
|
73469
74208
|
// src/commands/jobs.ts
|
|
73470
74209
|
init_cjs_shims();
|
|
73471
74210
|
init_src2();
|
|
73472
|
-
function
|
|
74211
|
+
function requireAuth8() {
|
|
73473
74212
|
if (auth_exports.isAuthenticated()) return true;
|
|
73474
74213
|
print.error('Not logged in. Run "bootspring auth login" first.');
|
|
73475
74214
|
process.exitCode = 1;
|
|
@@ -73478,7 +74217,7 @@ function requireAuth7() {
|
|
|
73478
74217
|
function registerJobsCommand(program3) {
|
|
73479
74218
|
const jobs = program3.command("jobs").description("List and poll async job results");
|
|
73480
74219
|
jobs.command("list").alias("ls").description("List recent jobs").option("--type <type>", "Filter by type (geo, marketing, sales)").option("--limit <n>", "Number of jobs to show", "20").action(async (opts) => {
|
|
73481
|
-
if (!
|
|
74220
|
+
if (!requireAuth8()) return;
|
|
73482
74221
|
try {
|
|
73483
74222
|
const params = new URLSearchParams();
|
|
73484
74223
|
if (opts.type) params.set("type", opts.type);
|
|
@@ -73505,7 +74244,7 @@ ${COLORS.bold}Recent Jobs${COLORS.reset}
|
|
|
73505
74244
|
}
|
|
73506
74245
|
});
|
|
73507
74246
|
jobs.command("status <jobId>").alias("get").description("Get job status and results").action(async (jobId) => {
|
|
73508
|
-
if (!
|
|
74247
|
+
if (!requireAuth8()) return;
|
|
73509
74248
|
try {
|
|
73510
74249
|
const response = await api_client_exports.request("GET", `/jobs/${encodeURIComponent(jobId)}`);
|
|
73511
74250
|
const job = response.job;
|
|
@@ -77931,6 +78670,7 @@ registerSetupCommand(program2);
|
|
|
77931
78670
|
registerPipelineCommand(program2);
|
|
77932
78671
|
registerWorkflowCommand(program2);
|
|
77933
78672
|
registerHarnessCommand(program2);
|
|
78673
|
+
registerSwarmCommand(program2);
|
|
77934
78674
|
registerGeoCommand(program2);
|
|
77935
78675
|
registerMarketingCommand(program2);
|
|
77936
78676
|
registerSalesCommand(program2);
|
package/dist/cli-launcher.js
CHANGED
package/dist/core/index.d.ts
CHANGED
|
@@ -477,7 +477,7 @@ interface InstallContext {
|
|
|
477
477
|
scriptPath: string;
|
|
478
478
|
}
|
|
479
479
|
declare const PACKAGE_NAME = "@girardmedia/bootspring";
|
|
480
|
-
declare const CURRENT_VERSION = "
|
|
480
|
+
declare const CURRENT_VERSION = "3.0.0";
|
|
481
481
|
declare const DEFAULT_INTERVAL_MS: number;
|
|
482
482
|
declare const STATE_PATH: string;
|
|
483
483
|
declare function compareVersions(a: string, b: string): number;
|
package/dist/core.js
CHANGED
|
@@ -379,7 +379,7 @@ var init_release = __esm({
|
|
|
379
379
|
"../../packages/shared/src/release.ts"() {
|
|
380
380
|
"use strict";
|
|
381
381
|
init_cjs_shims();
|
|
382
|
-
BOOTSPRING_VERSION = "
|
|
382
|
+
BOOTSPRING_VERSION = "3.0.0";
|
|
383
383
|
BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
|
|
384
384
|
}
|
|
385
385
|
});
|
|
@@ -21643,7 +21643,7 @@ ${COLORS2.dim}Run "bootspring mcp" for server options${COLORS2.reset}
|
|
|
21643
21643
|
console.log(`${COLORS2.dim}Run "bootspring mcp" for setup instructions.${COLORS2.reset}
|
|
21644
21644
|
`);
|
|
21645
21645
|
}
|
|
21646
|
-
var BOOTSPRING_VERSION2 = "
|
|
21646
|
+
var BOOTSPRING_VERSION2 = "3.0.0";
|
|
21647
21647
|
var BOOTSPRING_PACKAGE_NAME2 = "@girardmedia/bootspring";
|
|
21648
21648
|
var REDACTED2 = "[REDACTED]";
|
|
21649
21649
|
var SENSITIVE_KEY_PATTERN2 = /(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i;
|
|
@@ -21691,7 +21691,7 @@ var require_package = __commonJS({
|
|
|
21691
21691
|
"../../../package.json"(exports2, module2) {
|
|
21692
21692
|
module2.exports = {
|
|
21693
21693
|
name: "bootspring-workspace",
|
|
21694
|
-
version: "
|
|
21694
|
+
version: "3.0.0",
|
|
21695
21695
|
private: true,
|
|
21696
21696
|
description: "Workspace tooling for the Bootspring monorepo",
|
|
21697
21697
|
keywords: [
|
|
@@ -21766,6 +21766,7 @@ var require_package = __commonJS({
|
|
|
21766
21766
|
"planning:sync:check": "node scripts/sync-planning-state.js --check",
|
|
21767
21767
|
"planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
|
|
21768
21768
|
"verify:package": "node scripts/check-package-boundaries.js",
|
|
21769
|
+
"verify:security": "node scripts/security-scan.js",
|
|
21769
21770
|
"db:sync": "node monorepo/packages/shared/db/sync.js",
|
|
21770
21771
|
"db:sync:check": "node monorepo/packages/shared/db/sync.js --check"
|
|
21771
21772
|
},
|
|
@@ -21776,12 +21777,15 @@ var require_package = __commonJS({
|
|
|
21776
21777
|
"@typescript-eslint/eslint-plugin": "^8.57.0",
|
|
21777
21778
|
"@typescript-eslint/parser": "^8.57.0",
|
|
21778
21779
|
"@vitest/coverage-v8": "^4.0.18",
|
|
21780
|
+
ajv: "^8.18.0",
|
|
21779
21781
|
eslint: "^9.39.2",
|
|
21780
21782
|
globals: "^17.3.0",
|
|
21781
21783
|
tsup: "^8.5.1",
|
|
21782
21784
|
tsx: "^4.21.0",
|
|
21783
21785
|
typescript: "^5.9.3",
|
|
21784
|
-
vitest: "^4.0.18"
|
|
21786
|
+
vitest: "^4.0.18",
|
|
21787
|
+
yaml: "^2.8.3",
|
|
21788
|
+
zod: "^4.3.6"
|
|
21785
21789
|
},
|
|
21786
21790
|
engines: {
|
|
21787
21791
|
node: ">=18.0.0"
|
|
@@ -21791,7 +21795,7 @@ var require_package = __commonJS({
|
|
|
21791
21795
|
ajv: "^8.12.0"
|
|
21792
21796
|
},
|
|
21793
21797
|
minimatch: "^10.2.1",
|
|
21794
|
-
hono: "4.12.
|
|
21798
|
+
hono: "4.12.14",
|
|
21795
21799
|
"@hono/node-server": "1.19.10",
|
|
21796
21800
|
"express-rate-limit": "^8.2.2",
|
|
21797
21801
|
"path-to-regexp@<0.1.13": "0.1.13",
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -530,4 +530,13 @@ declare function registerAutopilotTools(): void;
|
|
|
530
530
|
declare const BRAIN_TOOLS: ToolDefinition[];
|
|
531
531
|
declare function registerBrainTools(): void;
|
|
532
532
|
|
|
533
|
-
|
|
533
|
+
/**
|
|
534
|
+
* @bootspring/mcp — Swarm Intelligence MCP Tools
|
|
535
|
+
* 3 tools: bootspring_swarm, bootspring_memory, bootspring_plan
|
|
536
|
+
* @package @bootspring/mcp
|
|
537
|
+
*/
|
|
538
|
+
|
|
539
|
+
declare const SWARM_TOOLS: ToolDefinition[];
|
|
540
|
+
declare function registerSwarmTools(): void;
|
|
541
|
+
|
|
542
|
+
export { ASSISTANT_PARITY_TOOLS, AUDIT_TOOLS, AUTOPILOT_TOOLS, type AgentData, type AssistResponseData, BRAIN_TOOLS, type BuildCapabilitiesOptions, COMPLIANCE_TOOLS, type CapabilitiesDeps, type ContextValidationResult, DOCS_INTELLIGENCE_TOOLS, type FilteredWorkflows, type ListOptions, MARKETPLACE_TOOLS, type MCPServerOptions, type MCPToolResultWithMeta, METRICS_TOOLS, NOTIFICATION_TOOLS, OBSERVER_TOOLS, ONBOARDING_TOOLS, type OrchestratorStatus, type PRDData, type PolicyProfile, type ProgressInfo, type ProjectContextDisplay, QUALITY_INTELLIGENCE_TOOLS, type QualityGateResults, RBAC_TOOLS, RELEASE_TOOLS, type RegistryExports, SWARM_TOOLS, SYNC_TOOLS, type SkillData, type SuccessOptions, type TodoItem, type ValidationResult, type WorkflowAccessContext, agentDetails, assistResponse, buildCapabilities, buildDefaultCapabilities, clearCache, contextSummary, contextValidation, createServer, error, generateProgressBar, getCompatibilityRegistryCandidatePaths, getLegacyRegistryCandidatePaths, getRegistryExports, getResourceHandlers, getResources, getToolHandlers, getTools, invokeTool, isRegistryPopulated, list, loadToolsFromDirectory, loopStatus, main, orchestratorStatus, qualityResults, registerAssistantParityTools, registerAuditTools, registerAutopilotTools, registerBrainTools, registerComplianceTools, registerDocsIntelligenceTools, registerMarketplaceTools, registerMetricsTools, registerNotificationTools, registerObserverTools, registerOnboardingTools, registerQualityIntelligenceTools, registerRbacTools, registerReleaseTools, registerResource, registerSwarmTools, registerSyncTools, registerTool, resolveCompatibilityRegistry, resolveRuntimeRegistry, skillDetails, startStdioServer, success, todoList, trackTelemetry, validateDependencies, warning };
|
package/dist/mcp-server.js
CHANGED
|
@@ -31377,7 +31377,7 @@ var init_release = __esm({
|
|
|
31377
31377
|
"../../packages/shared/src/release.ts"() {
|
|
31378
31378
|
"use strict";
|
|
31379
31379
|
init_cjs_shims();
|
|
31380
|
-
BOOTSPRING_VERSION = "
|
|
31380
|
+
BOOTSPRING_VERSION = "3.0.0";
|
|
31381
31381
|
BOOTSPRING_PACKAGE_NAME = "@girardmedia/bootspring";
|
|
31382
31382
|
}
|
|
31383
31383
|
});
|
|
@@ -52278,7 +52278,7 @@ var require_package = __commonJS({
|
|
|
52278
52278
|
"../../../package.json"(exports2, module2) {
|
|
52279
52279
|
module2.exports = {
|
|
52280
52280
|
name: "bootspring-workspace",
|
|
52281
|
-
version: "
|
|
52281
|
+
version: "3.0.0",
|
|
52282
52282
|
private: true,
|
|
52283
52283
|
description: "Workspace tooling for the Bootspring monorepo",
|
|
52284
52284
|
keywords: [
|
|
@@ -52353,6 +52353,7 @@ var require_package = __commonJS({
|
|
|
52353
52353
|
"planning:sync:check": "node scripts/sync-planning-state.js --check",
|
|
52354
52354
|
"planning:realign": "node scripts/sync-planning-state.js --sync-runtime",
|
|
52355
52355
|
"verify:package": "node scripts/check-package-boundaries.js",
|
|
52356
|
+
"verify:security": "node scripts/security-scan.js",
|
|
52356
52357
|
"db:sync": "node monorepo/packages/shared/db/sync.js",
|
|
52357
52358
|
"db:sync:check": "node monorepo/packages/shared/db/sync.js --check"
|
|
52358
52359
|
},
|
|
@@ -52363,12 +52364,15 @@ var require_package = __commonJS({
|
|
|
52363
52364
|
"@typescript-eslint/eslint-plugin": "^8.57.0",
|
|
52364
52365
|
"@typescript-eslint/parser": "^8.57.0",
|
|
52365
52366
|
"@vitest/coverage-v8": "^4.0.18",
|
|
52367
|
+
ajv: "^8.18.0",
|
|
52366
52368
|
eslint: "^9.39.2",
|
|
52367
52369
|
globals: "^17.3.0",
|
|
52368
52370
|
tsup: "^8.5.1",
|
|
52369
52371
|
tsx: "^4.21.0",
|
|
52370
52372
|
typescript: "^5.9.3",
|
|
52371
|
-
vitest: "^4.0.18"
|
|
52373
|
+
vitest: "^4.0.18",
|
|
52374
|
+
yaml: "^2.8.3",
|
|
52375
|
+
zod: "^4.3.6"
|
|
52372
52376
|
},
|
|
52373
52377
|
engines: {
|
|
52374
52378
|
node: ">=18.0.0"
|
|
@@ -52378,7 +52382,7 @@ var require_package = __commonJS({
|
|
|
52378
52382
|
ajv: "^8.12.0"
|
|
52379
52383
|
},
|
|
52380
52384
|
minimatch: "^10.2.1",
|
|
52381
|
-
hono: "4.12.
|
|
52385
|
+
hono: "4.12.14",
|
|
52382
52386
|
"@hono/node-server": "1.19.10",
|
|
52383
52387
|
"express-rate-limit": "^8.2.2",
|
|
52384
52388
|
"path-to-regexp@<0.1.13": "0.1.13",
|