blokctl 0.6.11 → 0.6.13
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/commands/create/project.js +54 -13
- package/package.json +2 -2
|
@@ -17,7 +17,7 @@ const exec = util.promisify(child_process.exec);
|
|
|
17
17
|
const HOME_DIR = `${os.homedir()}/.blok`;
|
|
18
18
|
const GITHUB_REPO_LOCAL = `${HOME_DIR}/blok`;
|
|
19
19
|
const GITHUB_REPO_REMOTE = "https://github.com/well-prado/blok.git";
|
|
20
|
-
const GITHUB_REPO_RELEASE_TAG = "v0.6.
|
|
20
|
+
const GITHUB_REPO_RELEASE_TAG = "v0.6.13";
|
|
21
21
|
fsExtra.ensureDirSync(HOME_DIR);
|
|
22
22
|
const options = {
|
|
23
23
|
baseDir: HOME_DIR,
|
|
@@ -117,6 +117,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
117
117
|
value: "websocket",
|
|
118
118
|
hint: "Bi-directional real-time (mounts on HTTP port)",
|
|
119
119
|
},
|
|
120
|
+
{ label: "MCP", value: "mcp", hint: "Model Context Protocol server (mounts on HTTP port)" },
|
|
120
121
|
{ label: "Queue", value: "queue", hint: "Kafka/RabbitMQ/SQS/Redis (port 4005)" },
|
|
121
122
|
{ label: "Pub/Sub", value: "pubsub", hint: "GCP/AWS/Azure messaging (port 4006)" },
|
|
122
123
|
],
|
|
@@ -264,7 +265,7 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
264
265
|
const triggerConfigs = selectedTriggers.map((kind) => createTriggerConfig(kind));
|
|
265
266
|
const mountedOnHttp = new Set();
|
|
266
267
|
if (selectedTriggers.includes("http")) {
|
|
267
|
-
for (const kind of ["sse", "websocket", "webhook"]) {
|
|
268
|
+
for (const kind of ["sse", "websocket", "webhook", "mcp"]) {
|
|
268
269
|
if (selectedTriggers.includes(kind))
|
|
269
270
|
mountedOnHttp.add(kind);
|
|
270
271
|
}
|
|
@@ -480,12 +481,13 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
480
481
|
"@blokjs/trigger-cron": "triggers/cron",
|
|
481
482
|
"@blokjs/trigger-grpc": "triggers/grpc",
|
|
482
483
|
"@blokjs/trigger-pubsub": "triggers/pubsub",
|
|
484
|
+
"@blokjs/trigger-mcp": "triggers/mcp",
|
|
483
485
|
"@blokjs/trigger-sse": "triggers/sse",
|
|
484
486
|
"@blokjs/trigger-webhook": "triggers/webhook",
|
|
485
487
|
"@blokjs/trigger-websocket": "triggers/websocket",
|
|
486
488
|
"@blokjs/trigger-worker": "triggers/worker",
|
|
487
489
|
};
|
|
488
|
-
const BLOKJS_DEP_RANGE = "^0.6.
|
|
490
|
+
const BLOKJS_DEP_RANGE = "^0.6.13";
|
|
489
491
|
for (const depGroup of ["dependencies", "devDependencies", "peerDependencies"]) {
|
|
490
492
|
const deps = packageJsonContent[depGroup];
|
|
491
493
|
if (!deps)
|
|
@@ -606,6 +608,16 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
606
608
|
...wsDeps,
|
|
607
609
|
};
|
|
608
610
|
}
|
|
611
|
+
if (selectedTriggers.includes("mcp")) {
|
|
612
|
+
const mcpDeps = {
|
|
613
|
+
"@blokjs/trigger-mcp": localRepoPath ? `file:${path.resolve(repoSource, "triggers/mcp")}` : BLOKJS_DEP_RANGE,
|
|
614
|
+
hono: "^4.11.7",
|
|
615
|
+
};
|
|
616
|
+
packageJsonContent.dependencies = {
|
|
617
|
+
...packageJsonContent.dependencies,
|
|
618
|
+
...mcpDeps,
|
|
619
|
+
};
|
|
620
|
+
}
|
|
609
621
|
if (Object.keys(triggerPackageDeps).length > 0) {
|
|
610
622
|
packageJsonContent.dependencies = {
|
|
611
623
|
...packageJsonContent.dependencies,
|
|
@@ -716,7 +728,13 @@ export async function createProject(opts, version, currentPath = false, localRep
|
|
|
716
728
|
const httpPort = triggerConfigs.find((tc) => tc.kind === "http")?.port;
|
|
717
729
|
for (const tc of triggerConfigs) {
|
|
718
730
|
if (mountedOnHttp.has(tc.kind) && httpPort !== undefined) {
|
|
719
|
-
const samplePath = tc.kind === "sse"
|
|
731
|
+
const samplePath = tc.kind === "sse"
|
|
732
|
+
? "/sse/demo"
|
|
733
|
+
: tc.kind === "mcp"
|
|
734
|
+
? "/mcp/sse"
|
|
735
|
+
: tc.kind === "webhook"
|
|
736
|
+
? "/webhooks"
|
|
737
|
+
: "/ws/echo";
|
|
720
738
|
console.log(` ${tc.label}: http://localhost:${httpPort}${samplePath} (mounted on HTTP)`);
|
|
721
739
|
}
|
|
722
740
|
else {
|
|
@@ -829,13 +847,15 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
|
|
|
829
847
|
const sseAlsoSelected = selectedTriggers.includes("sse");
|
|
830
848
|
const wsAlsoSelected = selectedTriggers.includes("websocket");
|
|
831
849
|
const webhookAlsoSelected = selectedTriggers.includes("webhook");
|
|
832
|
-
const
|
|
850
|
+
const mcpAlsoSelected = selectedTriggers.includes("mcp");
|
|
851
|
+
const needsShared = sseAlsoSelected || wsAlsoSelected || webhookAlsoSelected || mcpAlsoSelected;
|
|
833
852
|
const sharedHelperImports = needsShared
|
|
834
853
|
? `\nimport { NodeMap, WorkflowRegistry } from "@blokjs/runner";\nimport sharedNodes from "../../Nodes";\nimport sharedWorkflows from "../../Workflows";`
|
|
835
854
|
: "";
|
|
836
855
|
const sseImports = sseAlsoSelected ? `\nimport SSETrigger from "@blokjs/trigger-sse";` : "";
|
|
837
856
|
const wsImports = wsAlsoSelected ? `\nimport WebSocketTrigger from "@blokjs/trigger-websocket";` : "";
|
|
838
857
|
const webhookImports = webhookAlsoSelected ? `\nimport WebhookTrigger from "@blokjs/trigger-webhook";` : "";
|
|
858
|
+
const mcpImports = mcpAlsoSelected ? `\nimport McpTrigger from "@blokjs/trigger-mcp";` : "";
|
|
839
859
|
const sharedBootstrapPrelude = needsShared
|
|
840
860
|
? `\n\n // Build a NodeMap from the shared Nodes record; both SSE and
|
|
841
861
|
// WebSocket triggers consume this via setNodeMap so they can
|
|
@@ -858,15 +878,21 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
|
|
|
858
878
|
for (const [name, wf] of Object.entries(sharedWorkflows)) {
|
|
859
879
|
const w = wf as {
|
|
860
880
|
name?: string;
|
|
861
|
-
trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown };
|
|
862
|
-
_config?: { name?: string; trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown } };
|
|
881
|
+
trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown; mcp?: unknown };
|
|
882
|
+
_config?: { name?: string; trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown; mcp?: unknown } };
|
|
863
883
|
};
|
|
864
884
|
const triggerCfg = w._config?.trigger ?? w.trigger;
|
|
865
885
|
if (!triggerCfg) continue;
|
|
866
|
-
if (!triggerCfg.sse && !triggerCfg.websocket && !triggerCfg.webhook) continue;
|
|
886
|
+
if (!triggerCfg.sse && !triggerCfg.websocket && !triggerCfg.webhook && !triggerCfg.mcp) continue;
|
|
867
887
|
const resolvedName = w._config?.name ?? w.name ?? name;
|
|
868
888
|
if (registry.get(resolvedName)) continue;
|
|
869
|
-
const kind = triggerCfg.sse
|
|
889
|
+
const kind = triggerCfg.sse
|
|
890
|
+
? "sse"
|
|
891
|
+
: triggerCfg.websocket
|
|
892
|
+
? "websocket"
|
|
893
|
+
: triggerCfg.webhook
|
|
894
|
+
? "webhook"
|
|
895
|
+
: "mcp";
|
|
870
896
|
registry.register({
|
|
871
897
|
name: resolvedName,
|
|
872
898
|
source: \`\${kind}:\${name}\`,
|
|
@@ -919,10 +945,25 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
|
|
|
919
945
|
});
|
|
920
946
|
await webhookTrigger.listen();`
|
|
921
947
|
: "";
|
|
922
|
-
const
|
|
948
|
+
const mcpBootstrap = mcpAlsoSelected
|
|
949
|
+
? `\n // Mount the MCP server on the HTTP process's shared Hono app.
|
|
950
|
+
// McpTrigger.constructor(app, httpTrigger?) mirrors SSE / WS / Webhook —
|
|
951
|
+
// it registers its SSE (/<path>/sse + /<path>/messages) and
|
|
952
|
+
// Streamable-HTTP (/<path>) routes inside addPreCatchAllHook so they
|
|
953
|
+
// win Hono's first-match dispatch over the legacy workflow catch-all.
|
|
954
|
+
// Workflows with \`trigger.mcp\` (registered above) become MCP tools /
|
|
955
|
+
// resources; tools/call runs them through the runner.
|
|
956
|
+
const mcpTrigger = new McpTrigger(this.httpTrigger.getApp(), this.httpTrigger);
|
|
957
|
+
mcpTrigger.setNodeMap({
|
|
958
|
+
nodes: subTriggerNodeMap,
|
|
959
|
+
workflows: sharedWorkflows as unknown as Parameters<typeof mcpTrigger.setNodeMap>[0]["workflows"],
|
|
960
|
+
});
|
|
961
|
+
await mcpTrigger.listen();`
|
|
962
|
+
: "";
|
|
963
|
+
const fullBootstrap = `${sharedBootstrapPrelude}${sseBootstrap}${wsBootstrap}${webhookBootstrap}${mcpBootstrap}`;
|
|
923
964
|
return `import { DefaultLogger } from "@blokjs/runner";
|
|
924
965
|
import { type Span, metrics, trace } from "@opentelemetry/api";
|
|
925
|
-
import HttpTrigger from "./runner/HttpTrigger";${sharedHelperImports}${sseImports}${wsImports}${webhookImports}
|
|
966
|
+
import HttpTrigger from "./runner/HttpTrigger";${sharedHelperImports}${sseImports}${wsImports}${webhookImports}${mcpImports}
|
|
926
967
|
|
|
927
968
|
export default class App {
|
|
928
969
|
private httpTrigger: HttpTrigger = <HttpTrigger>{};
|
|
@@ -1511,7 +1552,7 @@ function getProviderDependencies(triggers, pubsubProvider, queueProvider) {
|
|
|
1511
1552
|
if (triggers.includes("pubsub") && pubsubProviderDeps[pubsubProvider]) {
|
|
1512
1553
|
Object.assign(deps, pubsubProviderDeps[pubsubProvider]);
|
|
1513
1554
|
}
|
|
1514
|
-
if (triggers.includes("queue") && queueProviderDeps[queueProvider]) {
|
|
1555
|
+
if ((triggers.includes("queue") || triggers.includes("worker")) && queueProviderDeps[queueProvider]) {
|
|
1515
1556
|
Object.assign(deps, queueProviderDeps[queueProvider]);
|
|
1516
1557
|
}
|
|
1517
1558
|
return deps;
|
|
@@ -1558,7 +1599,7 @@ NATS_STREAM_NAME=blok-queue`,
|
|
|
1558
1599
|
if (triggers.includes("pubsub") && pubsubEnvVars[pubsubProvider]) {
|
|
1559
1600
|
lines.push(pubsubEnvVars[pubsubProvider]);
|
|
1560
1601
|
}
|
|
1561
|
-
if (triggers.includes("queue") && queueEnvVars[queueProvider]) {
|
|
1602
|
+
if ((triggers.includes("queue") || triggers.includes("worker")) && queueEnvVars[queueProvider]) {
|
|
1562
1603
|
lines.push(queueEnvVars[queueProvider]);
|
|
1563
1604
|
}
|
|
1564
1605
|
return lines.join("\n");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blokctl",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.13",
|
|
4
4
|
"author": "Deskree Technologies Inc.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "cli for blok",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"keywords": ["blokctl", "cli", "blok", "blok"],
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@ai-sdk/openai": "^1.3.22",
|
|
33
|
-
"@blokjs/runner": "^0.6.
|
|
33
|
+
"@blokjs/runner": "^0.6.13",
|
|
34
34
|
"@clack/prompts": "^1.0.0",
|
|
35
35
|
"ai": "^4.3.16",
|
|
36
36
|
"better-sqlite3": "^12.6.2",
|