@kalphq/cli 0.0.0-dev-20260513152102 → 0.0.0-dev-20260517015600
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/{add-YZSIMRPC.js → add-5WUS5HGV.js} +16 -8
- package/dist/add-5WUS5HGV.js.map +1 -0
- package/dist/{agents-WYK6WNQP.js → agents-L22L47II.js} +3 -3
- package/dist/ai-7EBQF25Y.js +12 -0
- package/dist/ai-7EBQF25Y.js.map +1 -0
- package/dist/{chunk-IZXCZ3IA.js → chunk-4CPUJ537.js} +2 -2
- package/dist/chunk-5YUU3KLB.js +40 -0
- package/dist/chunk-5YUU3KLB.js.map +1 -0
- package/dist/chunk-7KVCCBPJ.js +139 -0
- package/dist/chunk-7KVCCBPJ.js.map +1 -0
- package/dist/{chunk-S3KAVLVM.js → chunk-D53K6UE6.js} +2 -2
- package/dist/chunk-D53K6UE6.js.map +1 -0
- package/dist/{chunk-4CEJYSJY.js → chunk-DLUULDXW.js} +12 -45
- package/dist/chunk-DLUULDXW.js.map +1 -0
- package/dist/chunk-DXNHT4HF.js +99 -0
- package/dist/chunk-DXNHT4HF.js.map +1 -0
- package/dist/{chunk-XVD3FFOJ.js → chunk-JXR6TPR5.js} +51 -72
- package/dist/chunk-JXR6TPR5.js.map +1 -0
- package/dist/chunk-LEKRFM4Q.js +49 -0
- package/dist/chunk-LEKRFM4Q.js.map +1 -0
- package/dist/chunk-QT2JFINP.js +99 -0
- package/dist/chunk-QT2JFINP.js.map +1 -0
- package/dist/{chunk-5SZMD7E6.js → chunk-TNNBTSDC.js} +2 -2
- package/dist/{chunk-5SZMD7E6.js.map → chunk-TNNBTSDC.js.map} +1 -1
- package/dist/{generate-JW2DMJ3W.js → chunk-ZX7TIQM7.js} +127 -120
- package/dist/chunk-ZX7TIQM7.js.map +1 -0
- package/dist/{create-UCJ77P62.js → create-ILPQCRA2.js} +2 -2
- package/dist/{delete-QPYVL4OU.js → delete-AJFAAGYJ.js} +9 -8
- package/dist/{delete-QPYVL4OU.js.map → delete-AJFAAGYJ.js.map} +1 -1
- package/dist/{delete-FIXMFFNZ.js → delete-IFVGULOA.js} +21 -13
- package/dist/delete-IFVGULOA.js.map +1 -0
- package/dist/{deploy-DRZZ3YRB.js → deploy-EWYNN3VU.js} +9 -6
- package/dist/{deploy-DRZZ3YRB.js.map → deploy-EWYNN3VU.js.map} +1 -1
- package/dist/{dev-5YY6W4WM.js → dev-3IEEUVYM.js} +66 -11
- package/dist/dev-3IEEUVYM.js.map +1 -0
- package/dist/generate-2MO7PZBT.js +69 -0
- package/dist/generate-2MO7PZBT.js.map +1 -0
- package/dist/generate-ODZUKTF2.js +146 -0
- package/dist/generate-ODZUKTF2.js.map +1 -0
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/{list-FKH4DWCF.js → list-BNQ34QG3.js} +6 -5
- package/dist/{list-FKH4DWCF.js.map → list-BNQ34QG3.js.map} +1 -1
- package/dist/{list-GZBBOFX5.js → list-WHYV5JZ4.js} +5 -4
- package/dist/{list-GZBBOFX5.js.map → list-WHYV5JZ4.js.map} +1 -1
- package/dist/{login-MGPA2VYV.js → login-BDLHS4HC.js} +13 -8
- package/dist/login-BDLHS4HC.js.map +1 -0
- package/dist/{mcp-DRMQYA7E.js → mcp-77OLNT5R.js} +2 -2
- package/dist/{pull-V7QJBVNZ.js → pull-CFDZS6VB.js} +8 -7
- package/dist/{pull-V7QJBVNZ.js.map → pull-CFDZS6VB.js.map} +1 -1
- package/dist/{push-P6CKRYT7.js → push-OL7562HM.js} +159 -47
- package/dist/push-OL7562HM.js.map +1 -0
- package/dist/runtime-template/studio/index.html +3 -0
- package/dist/{secrets-M43LLCTB.js → secrets-BPESLXMK.js} +6 -6
- package/dist/{sync-LTBH6DI5.js → sync-JJDODKMO.js} +8 -7
- package/dist/{sync-LTBH6DI5.js.map → sync-JJDODKMO.js.map} +1 -1
- package/package.json +5 -4
- package/dist/add-YZSIMRPC.js.map +0 -1
- package/dist/chunk-4CEJYSJY.js.map +0 -1
- package/dist/chunk-LPEV4QH2.js +0 -208
- package/dist/chunk-LPEV4QH2.js.map +0 -1
- package/dist/chunk-S3KAVLVM.js.map +0 -1
- package/dist/chunk-VCFH3R34.js +0 -103
- package/dist/chunk-VCFH3R34.js.map +0 -1
- package/dist/chunk-XVD3FFOJ.js.map +0 -1
- package/dist/delete-FIXMFFNZ.js.map +0 -1
- package/dist/dev-5YY6W4WM.js.map +0 -1
- package/dist/generate-JW2DMJ3W.js.map +0 -1
- package/dist/login-MGPA2VYV.js.map +0 -1
- package/dist/push-P6CKRYT7.js.map +0 -1
- /package/dist/{agents-WYK6WNQP.js.map → agents-L22L47II.js.map} +0 -0
- /package/dist/{chunk-IZXCZ3IA.js.map → chunk-4CPUJ537.js.map} +0 -0
- /package/dist/{create-UCJ77P62.js.map → create-ILPQCRA2.js.map} +0 -0
- /package/dist/{mcp-DRMQYA7E.js.map → mcp-77OLNT5R.js.map} +0 -0
- /package/dist/{secrets-M43LLCTB.js.map → secrets-BPESLXMK.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/deploy.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { promptDeployTarget, showKalpCloudWaitlist } from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"deploy\", description: \"Deploy your agents runtime\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp deploy\")}`);\n await generateTypes(cwd);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const target = await promptDeployTarget(\"Choose where to deploy your runtime\");\n if (!target) {\n p.outro(\"Cancelled\");\n return;\n }\n if (target === \"kalp-cloud\") {\n showKalpCloudWaitlist();\n p.outro(pc.green(\"Got it — you'll hear from us soon.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Deploying your agents runtime\");\n\n try {\n const result = await runInitialDeploy(cwd);\n s.stop(\"Deployment completed\");\n p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);\n if (result.customDomains.length > 0) {\n p.note(\n result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join(\"\\n\"),\n \"Custom domains detected\",\n );\n }\n\n const preferredStudioBase =\n result.customDomains.length > 0\n ? `https://${result.customDomains[0]}`\n : result.workerUrl;\n\n if (result.credentialsChanged || result.serviceKeyChanged) {\n p.log.info(pc.bold(\"Admin access\"));\n console.log(\n ` ${pc.dim(\"Username:\")} ${pc.cyan(result.studioAdminUser)}`,\n );\n console.log(\n ` ${pc.dim(\"Password:\")} ${pc.cyan(result.studioPassword)}`,\n );\n console.log(\n ` ${pc.dim(\"Service key:\")} ${pc.cyan(`Bearer ${result.serviceKey}`)}`,\n );\n console.log(\n ` ${pc.dim(\"Studio URL:\")} ${pc.cyan(`${preferredStudioBase.replace(/\\/$/, \"\")}/studio/login`)}`,\n );\n } else {\n p.log.info(\n pc.dim(\n \"Credentials unchanged. Check your local .env if you need to recover them.\",\n ),\n );\n }\n p.outro(pc.green(\"Your runtime is ready\"));\n } catch (error) {\n s.stop(\"Deployment failed\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown deployment error\",\n );\n process.exit(1);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/deploy.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport { promptDeployTarget, showKalpCloudWaitlist } from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"deploy\", description: \"Deploy your agents runtime\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp deploy\")}`);\n await generateTypes(cwd);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const target = await promptDeployTarget(\"Choose where to deploy your runtime\");\n if (!target) {\n p.outro(\"Cancelled\");\n return;\n }\n if (target === \"kalp-cloud\") {\n showKalpCloudWaitlist();\n p.outro(pc.green(\"Got it — you'll hear from us soon.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Deploying your agents runtime\");\n\n try {\n const result = await runInitialDeploy(cwd);\n s.stop(\"Deployment completed\");\n p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);\n if (result.customDomains.length > 0) {\n p.note(\n result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join(\"\\n\"),\n \"Custom domains detected\",\n );\n }\n\n const preferredStudioBase =\n result.customDomains.length > 0\n ? `https://${result.customDomains[0]}`\n : result.workerUrl;\n\n if (result.credentialsChanged || result.serviceKeyChanged) {\n p.log.info(pc.bold(\"Admin access\"));\n console.log(\n ` ${pc.dim(\"Username:\")} ${pc.cyan(result.studioAdminUser)}`,\n );\n console.log(\n ` ${pc.dim(\"Password:\")} ${pc.cyan(result.studioPassword)}`,\n );\n console.log(\n ` ${pc.dim(\"Service key:\")} ${pc.cyan(`Bearer ${result.serviceKey}`)}`,\n );\n console.log(\n ` ${pc.dim(\"Studio URL:\")} ${pc.cyan(`${preferredStudioBase.replace(/\\/$/, \"\")}/studio/login`)}`,\n );\n } else {\n p.log.info(\n pc.dim(\n \"Credentials unchanged. Check your local .env if you need to recover them.\",\n ),\n );\n }\n p.outro(pc.green(\"Your runtime is ready\"));\n } catch (error) {\n s.stop(\"Deployment failed\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown deployment error\",\n );\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAMf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,EAClE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAC3C,UAAM,cAAc,GAAG;AAEvB,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB,qCAAqC;AAC7E,QAAI,CAAC,QAAQ;AACX,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AACA,QAAI,WAAW,cAAc;AAC3B,4BAAsB;AACtB,MAAE,QAAM,GAAG,MAAM,yCAAoC,CAAC;AACtD;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,+BAA+B;AAEvC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,GAAG;AACzC,QAAE,KAAK,sBAAsB;AAC7B,MAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AACzD,UAAI,OAAO,cAAc,SAAS,GAAG;AACnC,QAAE;AAAA,UACA,OAAO,cAAc,IAAI,CAAC,WAAW,GAAG,KAAK,WAAW,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,sBACJ,OAAO,cAAc,SAAS,IAC1B,WAAW,OAAO,cAAc,CAAC,CAAC,KAClC,OAAO;AAEb,UAAI,OAAO,sBAAsB,OAAO,mBAAmB;AACzD,QAAE,MAAI,KAAK,GAAG,KAAK,cAAc,CAAC;AAClC,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,eAAe,CAAC;AAAA,QAC7D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,cAAc,CAAC;AAAA,QAC5D;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,cAAc,CAAC,IAAI,GAAG,KAAK,UAAU,OAAO,UAAU,EAAE,CAAC;AAAA,QACvE;AACA,gBAAQ;AAAA,UACN,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,GAAG,KAAK,GAAG,oBAAoB,QAAQ,OAAO,EAAE,CAAC,eAAe,CAAC;AAAA,QACjG;AAAA,MACF,OAAO;AACL,QAAE,MAAI;AAAA,UACJ,GAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAE,QAAM,GAAG,MAAM,uBAAuB,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,QAAE,KAAK,mBAAmB;AAC1B,MAAE,MAAI;AAAA,QACJ,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -3,19 +3,20 @@ import {
|
|
|
3
3
|
computePushHash,
|
|
4
4
|
readAgentManifest,
|
|
5
5
|
validateCompiledIR
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7KVCCBPJ.js";
|
|
7
7
|
import {
|
|
8
8
|
ensureSecretKey
|
|
9
9
|
} from "./chunk-NV2IZ4XM.js";
|
|
10
10
|
import {
|
|
11
11
|
generateTypes
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-DXNHT4HF.js";
|
|
13
13
|
import {
|
|
14
14
|
materializeRuntime,
|
|
15
15
|
readLocalAgentNames,
|
|
16
16
|
writeRuntimeAgentsSnapshot
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-JXR6TPR5.js";
|
|
18
18
|
import "./chunk-EXXTCGKR.js";
|
|
19
|
+
import "./chunk-LEKRFM4Q.js";
|
|
19
20
|
|
|
20
21
|
// src/commands/dev.ts
|
|
21
22
|
import { watch } from "fs";
|
|
@@ -81,24 +82,57 @@ async function syncLocalRuntimeState(params) {
|
|
|
81
82
|
for (const agentName of agentNames) {
|
|
82
83
|
try {
|
|
83
84
|
const manifest = await readAgentManifest({ cwd, agentName });
|
|
84
|
-
const hash = computePushHash(manifest
|
|
85
|
-
const validation = validateCompiledIR({ agentName,
|
|
85
|
+
const hash = computePushHash(manifest);
|
|
86
|
+
const validation = validateCompiledIR({ agentName, manifest, hash });
|
|
86
87
|
if (!validation.ok) {
|
|
87
88
|
const details = (validation.errors ?? []).join(" | ");
|
|
88
89
|
throw new Error(
|
|
89
90
|
`validation failed (${validation.phase})${details ? `: ${details}` : ""}`
|
|
90
91
|
);
|
|
91
92
|
}
|
|
92
|
-
const
|
|
93
|
+
const artifactManifestKey = `${agentName}:${hash}:artifact-manifest`;
|
|
94
|
+
const semanticIrKey = `${agentName}:${hash}:semantic-ir`;
|
|
95
|
+
const schemasKey = `${agentName}:${hash}:schemas`;
|
|
96
|
+
const bundleManifestKey = `${agentName}:${hash}:bundle-manifest`;
|
|
93
97
|
const latestKey = `${agentName}:latest`;
|
|
94
|
-
const
|
|
95
|
-
|
|
98
|
+
const files = await writeLocalArtifactFiles({
|
|
99
|
+
manifestDir,
|
|
100
|
+
agentName,
|
|
101
|
+
hash,
|
|
102
|
+
manifest
|
|
103
|
+
});
|
|
104
|
+
await putLocalManifest({
|
|
105
|
+
cwd,
|
|
106
|
+
configPath,
|
|
107
|
+
key: artifactManifestKey,
|
|
108
|
+
manifestPath: files.artifactManifestPath
|
|
109
|
+
});
|
|
96
110
|
await putLocalManifest({
|
|
97
111
|
cwd,
|
|
98
112
|
configPath,
|
|
99
|
-
key:
|
|
100
|
-
manifestPath
|
|
113
|
+
key: semanticIrKey,
|
|
114
|
+
manifestPath: files.semanticIrPath
|
|
101
115
|
});
|
|
116
|
+
await putLocalManifest({
|
|
117
|
+
cwd,
|
|
118
|
+
configPath,
|
|
119
|
+
key: schemasKey,
|
|
120
|
+
manifestPath: files.schemasPath
|
|
121
|
+
});
|
|
122
|
+
await putLocalManifest({
|
|
123
|
+
cwd,
|
|
124
|
+
configPath,
|
|
125
|
+
key: bundleManifestKey,
|
|
126
|
+
manifestPath: files.bundleManifestPath
|
|
127
|
+
});
|
|
128
|
+
for (const [bundleHash, bundle] of Object.entries(manifest.bundles)) {
|
|
129
|
+
await putLocalValue({
|
|
130
|
+
cwd,
|
|
131
|
+
configPath,
|
|
132
|
+
key: `${agentName}:${hash}:bundle:${bundleHash}`,
|
|
133
|
+
value: bundle.code
|
|
134
|
+
});
|
|
135
|
+
}
|
|
102
136
|
await putLocalValue({
|
|
103
137
|
cwd,
|
|
104
138
|
configPath,
|
|
@@ -113,6 +147,27 @@ async function syncLocalRuntimeState(params) {
|
|
|
113
147
|
}
|
|
114
148
|
return { synced, failed };
|
|
115
149
|
}
|
|
150
|
+
async function writeLocalArtifactFiles(params) {
|
|
151
|
+
const outDir = join(params.manifestDir, `${params.agentName}-${params.hash}`);
|
|
152
|
+
await mkdir(outDir, { recursive: true });
|
|
153
|
+
const artifactManifestPath = join(outDir, "artifact-manifest.json");
|
|
154
|
+
const semanticIrPath = join(outDir, "semantic-ir.json");
|
|
155
|
+
const schemasPath = join(outDir, "schemas.json");
|
|
156
|
+
const bundleManifestPath = join(outDir, "bundle-manifest.json");
|
|
157
|
+
await writeFile(
|
|
158
|
+
artifactManifestPath,
|
|
159
|
+
JSON.stringify(params.manifest.artifactManifest),
|
|
160
|
+
"utf-8"
|
|
161
|
+
);
|
|
162
|
+
await writeFile(semanticIrPath, JSON.stringify(params.manifest.semanticIr), "utf-8");
|
|
163
|
+
await writeFile(schemasPath, JSON.stringify(params.manifest.schemas), "utf-8");
|
|
164
|
+
await writeFile(
|
|
165
|
+
bundleManifestPath,
|
|
166
|
+
JSON.stringify(params.manifest.bundleManifest),
|
|
167
|
+
"utf-8"
|
|
168
|
+
);
|
|
169
|
+
return { artifactManifestPath, semanticIrPath, schemasPath, bundleManifestPath };
|
|
170
|
+
}
|
|
116
171
|
var dev_default = defineCommand({
|
|
117
172
|
meta: { name: "dev", description: "Run Worker + Studio local environment" },
|
|
118
173
|
async run() {
|
|
@@ -240,4 +295,4 @@ KALP_RUNTIME_MODE=local
|
|
|
240
295
|
export {
|
|
241
296
|
dev_default as default
|
|
242
297
|
};
|
|
243
|
-
//# sourceMappingURL=dev-
|
|
298
|
+
//# sourceMappingURL=dev-3IEEUVYM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { watch, type FSWatcher } from \"node:fs\";\nimport { copyFile, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport type { AgentManifestV3 } from \"@/utils/manifest\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport {\n materializeRuntime,\n readLocalAgentNames,\n writeRuntimeAgentsSnapshot,\n} from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\nconst LOCAL_MANIFESTS_DIR = \".kalp/runtime/local-manifests\";\nconst HOT_RELOAD_DEBOUNCE_MS = 450;\n\nasync function putLocalManifest(params: {\n cwd: string;\n configPath: string;\n key: string;\n manifestPath: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n \"--path\",\n params.manifestPath,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function putLocalValue(params: {\n cwd: string;\n configPath: string;\n key: string;\n value: string;\n}): Promise<void> {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n params.key,\n params.value,\n \"--binding\",\n \"KALP_MANIFESTS\",\n \"--local\",\n \"--config\",\n params.configPath,\n ],\n { cwd: params.cwd },\n );\n}\n\nasync function syncLocalRuntimeState(params: {\n cwd: string;\n runtimeDir: string;\n configPath: string;\n}): Promise<{ synced: number; failed: string[] }> {\n const { cwd, runtimeDir, configPath } = params;\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode: \"local\" });\n\n const manifestDir = join(cwd, LOCAL_MANIFESTS_DIR);\n await rm(manifestDir, { recursive: true, force: true });\n await mkdir(manifestDir, { recursive: true });\n\n const agentNames = await readLocalAgentNames(cwd);\n const failed: string[] = [];\n let synced = 0;\n\n for (const agentName of agentNames) {\n try {\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest);\n const validation = validateCompiledIR({ agentName, manifest, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const artifactManifestKey = `${agentName}:${hash}:artifact-manifest`;\n const semanticIrKey = `${agentName}:${hash}:semantic-ir`;\n const schemasKey = `${agentName}:${hash}:schemas`;\n const bundleManifestKey = `${agentName}:${hash}:bundle-manifest`;\n const latestKey = `${agentName}:latest`;\n const files = await writeLocalArtifactFiles({\n manifestDir,\n agentName,\n hash,\n manifest,\n });\n\n await putLocalManifest({\n cwd,\n configPath,\n key: artifactManifestKey,\n manifestPath: files.artifactManifestPath,\n });\n await putLocalManifest({\n cwd,\n configPath,\n key: semanticIrKey,\n manifestPath: files.semanticIrPath,\n });\n await putLocalManifest({\n cwd,\n configPath,\n key: schemasKey,\n manifestPath: files.schemasPath,\n });\n await putLocalManifest({\n cwd,\n configPath,\n key: bundleManifestKey,\n manifestPath: files.bundleManifestPath,\n });\n\n for (const [bundleHash, bundle] of Object.entries(manifest.bundles)) {\n await putLocalValue({\n cwd,\n configPath,\n key: `${agentName}:${hash}:bundle:${bundleHash}`,\n value: bundle.code,\n });\n }\n await putLocalValue({\n cwd,\n configPath,\n key: latestKey,\n value: hash,\n });\n synced += 1;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n failed.push(`${agentName}: ${reason}`);\n }\n }\n\n return { synced, failed };\n}\n\nasync function writeLocalArtifactFiles(params: {\n manifestDir: string;\n agentName: string;\n hash: string;\n manifest: AgentManifestV3;\n}): Promise<{\n artifactManifestPath: string;\n semanticIrPath: string;\n schemasPath: string;\n bundleManifestPath: string;\n}> {\n const outDir = join(params.manifestDir, `${params.agentName}-${params.hash}`);\n await mkdir(outDir, { recursive: true });\n\n const artifactManifestPath = join(outDir, \"artifact-manifest.json\");\n const semanticIrPath = join(outDir, \"semantic-ir.json\");\n const schemasPath = join(outDir, \"schemas.json\");\n const bundleManifestPath = join(outDir, \"bundle-manifest.json\");\n\n await writeFile(\n artifactManifestPath,\n JSON.stringify(params.manifest.artifactManifest),\n \"utf-8\",\n );\n await writeFile(semanticIrPath, JSON.stringify(params.manifest.semanticIr), \"utf-8\");\n await writeFile(schemasPath, JSON.stringify(params.manifest.schemas), \"utf-8\");\n await writeFile(\n bundleManifestPath,\n JSON.stringify(params.manifest.bundleManifest),\n \"utf-8\",\n );\n\n return { artifactManifestPath, semanticIrPath, schemasPath, bundleManifestPath };\n}\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n await generateTypes(cwd);\n await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n const initialSync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (initialSync.failed.length > 0) {\n for (const failure of initialSync.failed) {\n p.log.warn(`Local sync skipped ${failure}`);\n }\n }\n p.log.info(\n `${pc.dim(\"Local agent runtime synced:\")} ${pc.cyan(String(initialSync.synced))}`,\n );\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--local\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n let hotReloadTimer: NodeJS.Timeout | null = null;\n let hotReloadRunning = false;\n let hotReloadPending = false;\n\n const runHotReloadSync = async () => {\n if (hotReloadRunning) {\n hotReloadPending = true;\n return;\n }\n\n hotReloadRunning = true;\n try {\n const sync = await syncLocalRuntimeState({\n cwd,\n runtimeDir: runtime.runtimeDir,\n configPath: runtime.wranglerConfigPath,\n });\n if (sync.failed.length > 0) {\n p.log.warn(\n `Local hot reload synced ${sync.synced} agents with ${sync.failed.length} warnings.`,\n );\n for (const failure of sync.failed) {\n p.log.warn(`Hot reload skipped ${failure}`);\n }\n } else {\n p.log.info(pc.dim(`Local hot reload synced ${sync.synced} agents.`));\n }\n } finally {\n hotReloadRunning = false;\n if (hotReloadPending) {\n hotReloadPending = false;\n void runHotReloadSync();\n }\n }\n };\n\n const scheduleHotReloadSync = () => {\n if (hotReloadTimer) clearTimeout(hotReloadTimer);\n hotReloadTimer = setTimeout(() => {\n void runHotReloadSync();\n }, HOT_RELOAD_DEBOUNCE_MS);\n };\n\n const watchers: FSWatcher[] = [];\n const watchTargets = [join(cwd, \"agents\"), join(cwd, \".kalp\", \"state.json\")];\n for (const target of watchTargets) {\n try {\n const watcher = watch(\n target,\n target.endsWith(\".json\") ? undefined : { recursive: true },\n () => scheduleHotReloadSync(),\n );\n watchers.push(watcher);\n } catch {\n // Ignore missing targets (e.g. no agents yet)\n }\n }\n\n const shutdown = () => {\n if (hotReloadTimer) {\n clearTimeout(hotReloadTimer);\n hotReloadTimer = null;\n }\n for (const watcher of watchers) {\n watcher.close();\n }\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = \"http://localhost:8787/studio/login\";\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
generateMcpTypes
|
|
4
|
+
} from "./chunk-ZX7TIQM7.js";
|
|
5
|
+
import "./chunk-QT2JFINP.js";
|
|
6
|
+
import {
|
|
7
|
+
generateTypes
|
|
8
|
+
} from "./chunk-DXNHT4HF.js";
|
|
9
|
+
import "./chunk-EXXTCGKR.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/mcp/generate.ts
|
|
12
|
+
import { defineCommand } from "citty";
|
|
13
|
+
import * as p from "@clack/prompts";
|
|
14
|
+
import pc from "picocolors";
|
|
15
|
+
import { cwd } from "process";
|
|
16
|
+
var LOGO = "\u{1F98B}";
|
|
17
|
+
var generate_default = defineCommand({
|
|
18
|
+
meta: {
|
|
19
|
+
name: "generate",
|
|
20
|
+
description: "Generate MCP tool types into .kalp/mcp.types.d.ts"
|
|
21
|
+
},
|
|
22
|
+
args: {
|
|
23
|
+
strict: {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
description: "Fail when at least one MCP server cannot be introspected",
|
|
26
|
+
default: false
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
async run({ args }) {
|
|
30
|
+
p.intro(`${LOGO} ${pc.bold("kalp mcp generate")}`);
|
|
31
|
+
const spinner2 = p.spinner();
|
|
32
|
+
spinner2.start("Discovering MCP servers and generating types");
|
|
33
|
+
try {
|
|
34
|
+
const projectCwd = cwd();
|
|
35
|
+
await generateTypes(projectCwd);
|
|
36
|
+
const result = await generateMcpTypes(projectCwd, {
|
|
37
|
+
strict: args.strict
|
|
38
|
+
});
|
|
39
|
+
spinner2.stop("MCP type generation completed");
|
|
40
|
+
if (result.servers.length === 0) {
|
|
41
|
+
p.log.warn(
|
|
42
|
+
"No MCP servers found in kalp.config.ts. Generated an empty McpRegistry."
|
|
43
|
+
);
|
|
44
|
+
} else {
|
|
45
|
+
for (const server of result.servers) {
|
|
46
|
+
p.log.info(
|
|
47
|
+
`${pc.bold(server.serverName)} (${server.transport}) -> ${server.tools.length} tools`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (result.warnings.length > 0) {
|
|
52
|
+
p.log.warn(pc.bold("Warnings:"));
|
|
53
|
+
for (const warning of result.warnings) {
|
|
54
|
+
p.log.warn(`- ${warning}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
p.outro(`Types written to ${pc.cyan(result.outputPath)}`);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
spinner2.stop("MCP type generation failed");
|
|
60
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
+
p.cancel(message);
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
export {
|
|
67
|
+
generate_default as default
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=generate-2MO7PZBT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/mcp/generate.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { cwd } from \"node:process\";\nimport { generateMcpTypes } from \"@/utils/mcp-codegen\";\nimport { generateTypes } from \"@/utils/codegen\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"generate\",\n description: \"Generate MCP tool types into .kalp/mcp.types.d.ts\",\n },\n args: {\n strict: {\n type: \"boolean\",\n description: \"Fail when at least one MCP server cannot be introspected\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(`${LOGO} ${pc.bold(\"kalp mcp generate\")}`);\n const spinner = p.spinner();\n spinner.start(\"Discovering MCP servers and generating types\");\n\n try {\n const projectCwd = cwd();\n await generateTypes(projectCwd);\n const result = await generateMcpTypes(projectCwd, {\n strict: args.strict,\n });\n\n spinner.stop(\"MCP type generation completed\");\n\n if (result.servers.length === 0) {\n p.log.warn(\n \"No MCP servers found in kalp.config.ts. Generated an empty McpRegistry.\",\n );\n } else {\n for (const server of result.servers) {\n p.log.info(\n `${pc.bold(server.serverName)} (${server.transport}) -> ${server.tools.length} tools`,\n );\n }\n }\n\n if (result.warnings.length > 0) {\n p.log.warn(pc.bold(\"Warnings:\"));\n for (const warning of result.warnings) {\n p.log.warn(`- ${warning}`);\n }\n }\n\n p.outro(`Types written to ${pc.cyan(result.outputPath)}`);\n } catch (error) {\n spinner.stop(\"MCP type generation failed\");\n const message = error instanceof Error ? error.message : String(error);\n p.cancel(message);\n process.exitCode = 1;\n }\n },\n});\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,WAAW;AAIpB,IAAM,OAAO;AAEb,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,mBAAmB,CAAC,EAAE;AACjD,UAAMA,WAAY,UAAQ;AAC1B,IAAAA,SAAQ,MAAM,8CAA8C;AAE5D,QAAI;AACF,YAAM,aAAa,IAAI;AACvB,YAAM,cAAc,UAAU;AAC9B,YAAM,SAAS,MAAM,iBAAiB,YAAY;AAAA,QAChD,QAAQ,KAAK;AAAA,MACf,CAAC;AAED,MAAAA,SAAQ,KAAK,+BAA+B;AAE5C,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,QAAE,MAAI;AAAA,UACJ;AAAA,QACF;AAAA,MACF,OAAO;AACL,mBAAW,UAAU,OAAO,SAAS;AACnC,UAAE,MAAI;AAAA,YACJ,GAAG,GAAG,KAAK,OAAO,UAAU,CAAC,KAAK,OAAO,SAAS,QAAQ,OAAO,MAAM,MAAM;AAAA,UAC/E;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,QAAE,MAAI,KAAK,GAAG,KAAK,WAAW,CAAC;AAC/B,mBAAW,WAAW,OAAO,UAAU;AACrC,UAAE,MAAI,KAAK,KAAK,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF;AAEA,MAAE,QAAM,oBAAoB,GAAG,KAAK,OAAO,UAAU,CAAC,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,4BAA4B;AACzC,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAE,SAAO,OAAO;AAChB,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":["spinner"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
McpTypesGenerator
|
|
4
|
+
} from "./chunk-ZX7TIQM7.js";
|
|
5
|
+
import "./chunk-QT2JFINP.js";
|
|
6
|
+
import {
|
|
7
|
+
ProjectTypesGenerator
|
|
8
|
+
} from "./chunk-DXNHT4HF.js";
|
|
9
|
+
import "./chunk-EXXTCGKR.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/generate.ts
|
|
12
|
+
import { defineCommand } from "citty";
|
|
13
|
+
import * as p from "@clack/prompts";
|
|
14
|
+
import pc from "picocolors";
|
|
15
|
+
import { cwd } from "process";
|
|
16
|
+
|
|
17
|
+
// src/utils/sync.ts
|
|
18
|
+
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
19
|
+
import { join } from "path";
|
|
20
|
+
var MANIFEST_VERSION = 1;
|
|
21
|
+
var ProjectSynchronizer = class {
|
|
22
|
+
generators = /* @__PURE__ */ new Map();
|
|
23
|
+
register(generator) {
|
|
24
|
+
this.generators.set(generator.id, generator);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
async run(cwd2, options = {}) {
|
|
28
|
+
const generatedDir = join(cwd2, ".kalp", "generated");
|
|
29
|
+
await mkdir(generatedDir, { recursive: true });
|
|
30
|
+
const manifestPath = join(generatedDir, "manifest.json");
|
|
31
|
+
const manifest = await this.readManifest(manifestPath);
|
|
32
|
+
const ids = options.ids || Array.from(this.generators.keys());
|
|
33
|
+
const results = {};
|
|
34
|
+
for (const id of ids) {
|
|
35
|
+
const generator = this.generators.get(id);
|
|
36
|
+
if (!generator) {
|
|
37
|
+
console.warn(`[Sync] Generator "${id}" not found.`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const result = await generator.generate(cwd2);
|
|
42
|
+
results[id] = result;
|
|
43
|
+
if (result.updated) {
|
|
44
|
+
manifest.generators[id] = {
|
|
45
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
throw new Error(`Generator "${generator.name}" failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
manifest.generatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
53
|
+
await writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
async readManifest(path) {
|
|
57
|
+
try {
|
|
58
|
+
const content = await readFile(path, "utf-8");
|
|
59
|
+
return JSON.parse(content);
|
|
60
|
+
} catch {
|
|
61
|
+
return {
|
|
62
|
+
version: MANIFEST_VERSION,
|
|
63
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
64
|
+
generators: {}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var synchronizer = new ProjectSynchronizer();
|
|
70
|
+
|
|
71
|
+
// src/commands/generate.ts
|
|
72
|
+
import { readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
|
|
73
|
+
import { join as join2 } from "path";
|
|
74
|
+
var LOGO = "\u{1F98B}";
|
|
75
|
+
var generate_default = defineCommand({
|
|
76
|
+
meta: {
|
|
77
|
+
name: "generate",
|
|
78
|
+
description: "Synchronize project types, MCP tools, and manifests"
|
|
79
|
+
},
|
|
80
|
+
args: {
|
|
81
|
+
force: {
|
|
82
|
+
type: "boolean",
|
|
83
|
+
description: "Force regeneration of all artifacts",
|
|
84
|
+
default: false
|
|
85
|
+
},
|
|
86
|
+
mcpOnly: {
|
|
87
|
+
type: "boolean",
|
|
88
|
+
description: "Only regenerate MCP types",
|
|
89
|
+
default: false
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
async run({ args }) {
|
|
93
|
+
p.intro(`${LOGO} ${pc.bold("kalp generate")}`);
|
|
94
|
+
const projectCwd = cwd();
|
|
95
|
+
synchronizer.register(new ProjectTypesGenerator()).register(new McpTypesGenerator());
|
|
96
|
+
const spinner2 = p.spinner();
|
|
97
|
+
spinner2.start("Synchronizing project artifacts");
|
|
98
|
+
try {
|
|
99
|
+
const ids = args.mcpOnly ? ["mcp"] : void 0;
|
|
100
|
+
const results = await synchronizer.run(projectCwd, { ids, force: args.force });
|
|
101
|
+
spinner2.stop("Synchronization completed");
|
|
102
|
+
for (const [id, result] of Object.entries(results)) {
|
|
103
|
+
const icon = result.updated ? pc.green("\u2713") : pc.dim("-");
|
|
104
|
+
const status = result.updated ? "updated" : "up to date";
|
|
105
|
+
p.log.info(`${icon} ${pc.bold(id)}: ${status}`);
|
|
106
|
+
if (result.warnings?.length) {
|
|
107
|
+
for (const warning of result.warnings) {
|
|
108
|
+
p.log.warn(` ${pc.yellow("\u25B2")} ${pc.dim(warning)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
await ensureTsconfigIncludes(projectCwd);
|
|
113
|
+
p.outro(pc.green("Project is in sync!"));
|
|
114
|
+
} catch (error) {
|
|
115
|
+
spinner2.stop("Synchronization failed");
|
|
116
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
117
|
+
p.cancel(message);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
async function ensureTsconfigIncludes(cwd2) {
|
|
123
|
+
const tsconfigPath = join2(cwd2, "tsconfig.json");
|
|
124
|
+
try {
|
|
125
|
+
const content = await readFile2(tsconfigPath, "utf-8");
|
|
126
|
+
const json = JSON.parse(content);
|
|
127
|
+
if (!json.include) json.include = [];
|
|
128
|
+
const required = [".kalp/generated/*.d.ts"];
|
|
129
|
+
let changed = false;
|
|
130
|
+
for (const path of required) {
|
|
131
|
+
if (!json.include.includes(path)) {
|
|
132
|
+
json.include.push(path);
|
|
133
|
+
changed = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (changed) {
|
|
137
|
+
await writeFile2(tsconfigPath, JSON.stringify(json, null, 2), "utf-8");
|
|
138
|
+
p.log.info(`${pc.blue("\u2139")} Updated tsconfig.json to include .kalp/generated/*.d.ts`);
|
|
139
|
+
}
|
|
140
|
+
} catch {
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
generate_default as default
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=generate-ODZUKTF2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/generate.ts","../src/utils/sync.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { cwd } from \"node:process\";\nimport { synchronizer } from \"@/utils/sync\";\nimport { ProjectTypesGenerator } from \"@/utils/codegen\";\nimport { McpTypesGenerator } from \"@/utils/mcp-codegen\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"generate\",\n description: \"Synchronize project types, MCP tools, and manifests\",\n },\n args: {\n force: {\n type: \"boolean\",\n description: \"Force regeneration of all artifacts\",\n default: false,\n },\n mcpOnly: {\n type: \"boolean\",\n description: \"Only regenerate MCP types\",\n default: false,\n },\n },\n async run({ args }) {\n p.intro(`${LOGO} ${pc.bold(\"kalp generate\")}`);\n const projectCwd = cwd();\n\n // 1. Register generators (Decoupled bootstrap)\n synchronizer\n .register(new ProjectTypesGenerator())\n .register(new McpTypesGenerator());\n\n const spinner = p.spinner();\n spinner.start(\"Synchronizing project artifacts\");\n\n try {\n const ids = args.mcpOnly ? [\"mcp\"] : undefined;\n const results = await synchronizer.run(projectCwd, { ids, force: args.force });\n\n spinner.stop(\"Synchronization completed\");\n\n // 2. Report results\n for (const [id, result] of Object.entries(results)) {\n const icon = result.updated ? pc.green(\"✓\") : pc.dim(\"-\");\n const status = result.updated ? \"updated\" : \"up to date\";\n p.log.info(`${icon} ${pc.bold(id)}: ${status}`);\n \n if (result.warnings?.length) {\n for (const warning of result.warnings) {\n p.log.warn(` ${pc.yellow(\"▲\")} ${pc.dim(warning)}`);\n }\n }\n }\n\n // 3. Ensure tsconfig is updated\n await ensureTsconfigIncludes(projectCwd);\n\n p.outro(pc.green(\"Project is in sync!\"));\n } catch (error) {\n spinner.stop(\"Synchronization failed\");\n const message = error instanceof Error ? error.message : String(error);\n p.cancel(message);\n process.exit(1);\n }\n },\n});\n\nasync function ensureTsconfigIncludes(cwd: string) {\n const tsconfigPath = join(cwd, \"tsconfig.json\");\n try {\n const content = await readFile(tsconfigPath, \"utf-8\");\n const json = JSON.parse(content);\n if (!json.include) json.include = [];\n \n const required = [\".kalp/generated/*.d.ts\"];\n let changed = false;\n \n for (const path of required) {\n if (!json.include.includes(path)) {\n json.include.push(path);\n changed = true;\n }\n }\n \n if (changed) {\n await writeFile(tsconfigPath, JSON.stringify(json, null, 2), \"utf-8\");\n p.log.info(`${pc.blue(\"ℹ\")} Updated tsconfig.json to include .kalp/generated/*.d.ts`);\n }\n } catch {\n // Ignore if no tsconfig\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport * as p from \"@clack/prompts\";\n\nexport interface GeneratorResult {\n updated: boolean;\n message?: string;\n warnings?: string[];\n}\n\nexport interface ProjectGenerator {\n id: string;\n name: string;\n generate: (cwd: string) => Promise<GeneratorResult>;\n}\n\nexport interface SyncManifest {\n version: number;\n generatedAt: string;\n generators: Record<string, {\n hash?: string;\n updatedAt: string;\n }>;\n}\n\nconst MANIFEST_VERSION = 1;\n\nexport class ProjectSynchronizer {\n private generators = new Map<string, ProjectGenerator>();\n\n register(generator: ProjectGenerator) {\n this.generators.set(generator.id, generator);\n return this;\n }\n\n async run(cwd: string, options: { ids?: string[]; force?: boolean } = {}) {\n const generatedDir = join(cwd, \".kalp\", \"generated\");\n await mkdir(generatedDir, { recursive: true });\n\n const manifestPath = join(generatedDir, \"manifest.json\");\n const manifest = await this.readManifest(manifestPath);\n\n const ids = options.ids || Array.from(this.generators.keys());\n const results: Record<string, GeneratorResult> = {};\n\n for (const id of ids) {\n const generator = this.generators.get(id);\n if (!generator) {\n console.warn(`[Sync] Generator \"${id}\" not found.`);\n continue;\n }\n\n try {\n const result = await generator.generate(cwd);\n results[id] = result;\n\n if (result.updated) {\n manifest.generators[id] = {\n updatedAt: new Date().toISOString(),\n };\n }\n } catch (error) {\n throw new Error(`Generator \"${generator.name}\" failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n manifest.generatedAt = new Date().toISOString();\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n\n return results;\n }\n\n private async readManifest(path: string): Promise<SyncManifest> {\n try {\n const content = await readFile(path, \"utf-8\");\n return JSON.parse(content) as SyncManifest;\n } catch {\n return {\n version: MANIFEST_VERSION,\n generatedAt: new Date().toISOString(),\n generators: {},\n };\n }\n }\n}\n\n/**\n * Global synchronizer instance.\n */\nexport const synchronizer = new ProjectSynchronizer();\n"],"mappings":"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","names":["cwd","readFile","writeFile","join","spinner","cwd"]}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import pc from "picocolors";
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@kalphq/cli",
|
|
11
|
-
version: "0.0.0-dev-
|
|
11
|
+
version: "0.0.0-dev-20260517015600",
|
|
12
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
13
13
|
type: "module",
|
|
14
14
|
license: "MIT",
|
|
@@ -41,6 +41,7 @@ var package_default = {
|
|
|
41
41
|
esbuild: "0.25.0",
|
|
42
42
|
execa: "^9.6.1",
|
|
43
43
|
jiti: "^2.6.1",
|
|
44
|
+
hono: "^4.12.18",
|
|
44
45
|
jose: "^5.10.0",
|
|
45
46
|
"json-schema-to-typescript": "^15.0.4",
|
|
46
47
|
"json-stable-stringify": "1.3.0",
|
|
@@ -64,7 +65,8 @@ var COMMANDS = [
|
|
|
64
65
|
["push", "Upload updated agents"],
|
|
65
66
|
["agents", "List and manage agents"],
|
|
66
67
|
["secrets", "Manage secrets"],
|
|
67
|
-
["
|
|
68
|
+
["generate", "Sync project state (types, MCP, etc.)"],
|
|
69
|
+
["mcp", "Manage MCP tool types"],
|
|
68
70
|
["login", "Sign in to remote runtime"],
|
|
69
71
|
["logout", "Sign out from Kalp"],
|
|
70
72
|
["dev", "Run Worker + Studio locally"]
|
|
@@ -94,17 +96,18 @@ var main = defineCommand({
|
|
|
94
96
|
}
|
|
95
97
|
},
|
|
96
98
|
subCommands: {
|
|
97
|
-
create: () => import("./create-
|
|
98
|
-
deploy: () => import("./deploy-
|
|
99
|
-
push: () => import("./push-
|
|
100
|
-
agents: () => import("./agents-
|
|
101
|
-
secrets: () => import("./secrets-
|
|
102
|
-
mcp: () => import("./mcp-
|
|
103
|
-
|
|
99
|
+
create: () => import("./create-ILPQCRA2.js").then((r) => r.default),
|
|
100
|
+
deploy: () => import("./deploy-EWYNN3VU.js").then((r) => r.default),
|
|
101
|
+
push: () => import("./push-OL7562HM.js").then((r) => r.default),
|
|
102
|
+
agents: () => import("./agents-L22L47II.js").then((r) => r.default),
|
|
103
|
+
secrets: () => import("./secrets-BPESLXMK.js").then((r) => r.default),
|
|
104
|
+
mcp: () => import("./mcp-77OLNT5R.js").then((r) => r.default),
|
|
105
|
+
generate: () => import("./generate-ODZUKTF2.js").then((r) => r.default),
|
|
106
|
+
login: () => import("./login-BDLHS4HC.js").then((r) => r.default),
|
|
104
107
|
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
105
|
-
dev: () => import("./dev-
|
|
108
|
+
dev: () => import("./dev-3IEEUVYM.js").then((r) => r.default)
|
|
106
109
|
},
|
|
107
|
-
run({ args }) {
|
|
110
|
+
async run({ args }) {
|
|
108
111
|
const firstArg = process.argv[2];
|
|
109
112
|
if (args.help) {
|
|
110
113
|
p.intro(`${LOGO} ${pc.bold("kalp")}`);
|
|
@@ -120,5 +123,22 @@ var main = defineCommand({
|
|
|
120
123
|
p.outro("Happy coding \u{1F98B}");
|
|
121
124
|
}
|
|
122
125
|
});
|
|
123
|
-
|
|
126
|
+
async function bootstrap() {
|
|
127
|
+
try {
|
|
128
|
+
const { readDotEnv } = await import("./ai-7EBQF25Y.js");
|
|
129
|
+
const cwd = process.cwd();
|
|
130
|
+
const env = await readDotEnv(cwd);
|
|
131
|
+
if (Object.keys(env).length > 0) {
|
|
132
|
+
for (const [key, value] of Object.entries(env)) {
|
|
133
|
+
if (!(key in process.env)) {
|
|
134
|
+
process.env[key] = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} catch {
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
bootstrap().then(() => {
|
|
142
|
+
runMain(main);
|
|
143
|
+
});
|
|
124
144
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\n [\"secrets\", \"Manage secrets\"],\n [\"mcp\", \"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Upload updated agents\"],\n [\"agents\", \"List and manage agents\"],\n [\"secrets\", \"Manage secrets\"],\n [\"generate\", \"Sync project state (types, MCP, etc.)\"],\n [\"mcp\", \"Manage MCP tool types\"],\n [\"login\", \"Sign in to remote runtime\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n agents: () => import(\"./commands/agents\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n mcp: () => import(\"./commands/mcp\").then((r) => r.default),\n generate: () => import(\"./commands/generate\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n async run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\n// Load .env if it exists in the current directory\nasync function bootstrap() {\n try {\n const { readDotEnv } = await import(\"./utils/ai\");\n const cwd = process.cwd();\n const env = await readDotEnv(cwd);\n if (Object.keys(env).length > 0) {\n for (const [key, value] of Object.entries(env)) {\n if (!(key in process.env)) {\n process.env[key] = value;\n }\n }\n }\n } catch {\n // Ignore errors during bootstrap\n }\n}\n\n// Ensure bootstrap runs before runMain\nbootstrap().then(() => {\n runMain(main);\n});\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260517015600\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jiti\": \"^2.6.1\",\n \"hono\": \"^4.12.18\",\n \"jose\": \"^5.10.0\",\n \"json-schema-to-typescript\": \"^15.0.4\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
readRemoteAgentsIndex
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TNNBTSDC.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveSecretsRuntimeConfigPath
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-4CPUJ537.js";
|
|
8
8
|
import "./chunk-INB3LG6O.js";
|
|
9
|
-
import "./chunk-XVD3FFOJ.js";
|
|
10
9
|
import {
|
|
11
10
|
requireAuth
|
|
12
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-D53K6UE6.js";
|
|
13
12
|
import "./chunk-FO24J6XL.js";
|
|
13
|
+
import "./chunk-JXR6TPR5.js";
|
|
14
14
|
import "./chunk-EXXTCGKR.js";
|
|
15
|
+
import "./chunk-LEKRFM4Q.js";
|
|
15
16
|
|
|
16
17
|
// src/commands/agents/list.ts
|
|
17
18
|
import { access, mkdir, readFile, writeFile } from "fs/promises";
|
|
@@ -157,4 +158,4 @@ var list_default = defineCommand({
|
|
|
157
158
|
export {
|
|
158
159
|
list_default as default
|
|
159
160
|
};
|
|
160
|
-
//# sourceMappingURL=list-
|
|
161
|
+
//# sourceMappingURL=list-BNQ34QG3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/agents/list.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n type RemoteAgentIndexEntry,\n readRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\nconst CACHE_TTL_MS = 20_000;\n\ninterface RemoteAgentListCache {\n cachedAt: string;\n entries: RemoteAgentIndexEntry[];\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width\n ? value\n : `${value}${\" \".repeat(width - value.length)}`;\n}\n\nfunction renderTable(rows: RemoteAgentIndexEntry[]): void {\n const headers = {\n name: \"Agent\",\n version: \"Version\",\n updated: \"Updated\",\n status: \"Status\",\n };\n\n const widths = {\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),\n version: Math.max(\n headers.version.length,\n ...rows.map((r) => (r.version ?? \"—\").length),\n 7,\n ),\n updated: Math.max(\n headers.updated.length,\n ...rows.map((r) => (r.updatedAt || \"—\").length),\n 7,\n ),\n status: headers.status.length,\n };\n\n const divider = ` ${\"-\".repeat(widths.name)} ${\"-\".repeat(widths.version)} ${\"-\".repeat(widths.updated)} ${\"-\".repeat(widths.status)}`;\n console.log(\n ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))} ${pc.bold(pad(headers.status, widths.status))}`,\n );\n console.log(pc.dim(divider));\n\n for (const row of rows) {\n const version = row.version ?? \"—\";\n const updated = row.updatedAt || \"—\";\n const statusText = \"online\";\n const status = `${pc.green(statusText)}${\" \".repeat(Math.max(0, widths.status - statusText.length))}`;\n console.log(\n ` ${pad(row.name, widths.name)} ${pad(version, widths.version)} ${pad(updated, widths.updated)} ${status}`,\n );\n }\n}\n\nfunction getCachePath(cwd: string): string {\n return join(cwd, \".kalp\", \"cache\", \"agents-list-remote.json\");\n}\n\nasync function readCache(cwd: string): Promise<RemoteAgentListCache | null> {\n const cachePath = getCachePath(cwd);\n try {\n await access(cachePath);\n } catch {\n return null;\n }\n\n const raw = await readFile(cachePath, \"utf-8\").catch(() => null);\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as RemoteAgentListCache;\n if (!parsed || !Array.isArray(parsed.entries) || !parsed.cachedAt) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n cwd: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const cachePath = getCachePath(cwd);\n await mkdir(dirname(cachePath), { recursive: true });\n const payload: RemoteAgentListCache = {\n cachedAt: new Date().toISOString(),\n entries,\n };\n await writeFile(cachePath, JSON.stringify(payload, null, 2), \"utf-8\");\n}\n\nfunction isFresh(cache: RemoteAgentListCache): boolean {\n const cachedAt = Date.parse(cache.cachedAt);\n if (!Number.isFinite(cachedAt)) return false;\n return Date.now() - cachedAt <= CACHE_TTL_MS;\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List remote agents\",\n },\n args: {\n refresh: {\n type: \"boolean\",\n description: \"Force refresh remote data (skip cache)\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n default: false,\n description: \"Show help\",\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents list [--refresh]`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents list\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const cache = args.refresh ? null : await readCache(cwd);\n let entries: RemoteAgentIndexEntry[];\n\n if (cache && isFresh(cache)) {\n entries = cache.entries;\n spinner.stop(\n `Loaded ${entries.length} agents ${pc.dim(\"(cached, remote)\")}`,\n );\n } else {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n entries = await readRemoteAgentsIndex(cwd, configPath);\n await writeCache(cwd, entries).catch(() => null);\n spinner.stop(`Loaded ${entries.length} agents from remote runtime`);\n }\n\n const rows = [...entries].sort((a, b) => a.name.localeCompare(b.name));\n if (rows.length === 0) {\n p.log.info(pc.dim(\"No remote agents found.\"));\n return;\n }\n\n renderTable(rows);\n } catch (error) {\n spinner.stop(\"Failed to load remote agents\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/agents/list.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n type RemoteAgentIndexEntry,\n readRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\nconst CACHE_TTL_MS = 20_000;\n\ninterface RemoteAgentListCache {\n cachedAt: string;\n entries: RemoteAgentIndexEntry[];\n}\n\nfunction pad(value: string, width: number): string {\n return value.length >= width\n ? value\n : `${value}${\" \".repeat(width - value.length)}`;\n}\n\nfunction renderTable(rows: RemoteAgentIndexEntry[]): void {\n const headers = {\n name: \"Agent\",\n version: \"Version\",\n updated: \"Updated\",\n status: \"Status\",\n };\n\n const widths = {\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length), 5),\n version: Math.max(\n headers.version.length,\n ...rows.map((r) => (r.version ?? \"—\").length),\n 7,\n ),\n updated: Math.max(\n headers.updated.length,\n ...rows.map((r) => (r.updatedAt || \"—\").length),\n 7,\n ),\n status: headers.status.length,\n };\n\n const divider = ` ${\"-\".repeat(widths.name)} ${\"-\".repeat(widths.version)} ${\"-\".repeat(widths.updated)} ${\"-\".repeat(widths.status)}`;\n console.log(\n ` ${pc.bold(pad(headers.name, widths.name))} ${pc.bold(pad(headers.version, widths.version))} ${pc.bold(pad(headers.updated, widths.updated))} ${pc.bold(pad(headers.status, widths.status))}`,\n );\n console.log(pc.dim(divider));\n\n for (const row of rows) {\n const version = row.version ?? \"—\";\n const updated = row.updatedAt || \"—\";\n const statusText = \"online\";\n const status = `${pc.green(statusText)}${\" \".repeat(Math.max(0, widths.status - statusText.length))}`;\n console.log(\n ` ${pad(row.name, widths.name)} ${pad(version, widths.version)} ${pad(updated, widths.updated)} ${status}`,\n );\n }\n}\n\nfunction getCachePath(cwd: string): string {\n return join(cwd, \".kalp\", \"cache\", \"agents-list-remote.json\");\n}\n\nasync function readCache(cwd: string): Promise<RemoteAgentListCache | null> {\n const cachePath = getCachePath(cwd);\n try {\n await access(cachePath);\n } catch {\n return null;\n }\n\n const raw = await readFile(cachePath, \"utf-8\").catch(() => null);\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as RemoteAgentListCache;\n if (!parsed || !Array.isArray(parsed.entries) || !parsed.cachedAt) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(\n cwd: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const cachePath = getCachePath(cwd);\n await mkdir(dirname(cachePath), { recursive: true });\n const payload: RemoteAgentListCache = {\n cachedAt: new Date().toISOString(),\n entries,\n };\n await writeFile(cachePath, JSON.stringify(payload, null, 2), \"utf-8\");\n}\n\nfunction isFresh(cache: RemoteAgentListCache): boolean {\n const cachedAt = Date.parse(cache.cachedAt);\n if (!Number.isFinite(cachedAt)) return false;\n return Date.now() - cachedAt <= CACHE_TTL_MS;\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List remote agents\",\n },\n args: {\n refresh: {\n type: \"boolean\",\n description: \"Force refresh remote data (skip cache)\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n default: false,\n description: \"Show help\",\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents list [--refresh]`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents list\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const spinner = p.spinner();\n spinner.start(\"Loading remote agents\");\n\n try {\n const cache = args.refresh ? null : await readCache(cwd);\n let entries: RemoteAgentIndexEntry[];\n\n if (cache && isFresh(cache)) {\n entries = cache.entries;\n spinner.stop(\n `Loaded ${entries.length} agents ${pc.dim(\"(cached, remote)\")}`,\n );\n } else {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n entries = await readRemoteAgentsIndex(cwd, configPath);\n await writeCache(cwd, entries).catch(() => null);\n spinner.stop(`Loaded ${entries.length} agents from remote runtime`);\n }\n\n const rows = [...entries].sort((a, b) => a.name.localeCompare(b.name));\n if (rows.length === 0) {\n p.log.info(pc.dim(\"No remote agents found.\"));\n return;\n }\n\n renderTable(rows);\n } catch (error) {\n spinner.stop(\"Failed to load remote agents\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["spinner"]}
|