@kalphq/cli 0.0.0-dev-20260513145227 → 0.0.0-dev-20260513152102
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-KTFK7GHV.js → add-YZSIMRPC.js} +3 -4
- package/dist/{add-KTFK7GHV.js.map → add-YZSIMRPC.js.map} +1 -1
- package/dist/{agents-QLWNNAXD.js → agents-WYK6WNQP.js} +3 -4
- package/dist/{agents-QLWNNAXD.js.map → agents-WYK6WNQP.js.map} +1 -1
- package/dist/{chunk-5J2WLD3O.js → chunk-4CEJYSJY.js} +5 -5
- package/dist/chunk-LPEV4QH2.js +208 -0
- package/dist/chunk-LPEV4QH2.js.map +1 -0
- package/dist/{create-265DBQ72.js → create-UCJ77P62.js} +2 -3
- package/dist/{create-265DBQ72.js.map → create-UCJ77P62.js.map} +1 -1
- package/dist/{delete-5RN5RRDK.js → delete-FIXMFFNZ.js} +3 -4
- package/dist/{delete-5RN5RRDK.js.map → delete-FIXMFFNZ.js.map} +1 -1
- package/dist/{delete-AF2GT6S4.js → delete-QPYVL4OU.js} +5 -6
- package/dist/{delete-AF2GT6S4.js.map → delete-QPYVL4OU.js.map} +1 -1
- package/dist/{deploy-RWZFKSHR.js → deploy-DRZZ3YRB.js} +4 -5
- package/dist/{deploy-RWZFKSHR.js.map → deploy-DRZZ3YRB.js.map} +1 -1
- package/dist/{dev-XI5WA3NA.js → dev-5YY6W4WM.js} +2 -3
- package/dist/{dev-XI5WA3NA.js.map → dev-5YY6W4WM.js.map} +1 -1
- package/dist/generate-JW2DMJ3W.js +391 -0
- package/dist/generate-JW2DMJ3W.js.map +1 -0
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/{list-NM727WK3.js → list-FKH4DWCF.js} +2 -3
- package/dist/{list-NM727WK3.js.map → list-FKH4DWCF.js.map} +1 -1
- package/dist/{list-SU5CSX3P.js → list-GZBBOFX5.js} +2 -3
- package/dist/{list-SU5CSX3P.js.map → list-GZBBOFX5.js.map} +1 -1
- package/dist/{login-G3RY64KU.js → login-MGPA2VYV.js} +1 -2
- package/dist/{login-G3RY64KU.js.map → login-MGPA2VYV.js.map} +1 -1
- package/dist/{logout-VVQ6OD4D.js → logout-U5V5K775.js} +1 -2
- package/dist/{logout-VVQ6OD4D.js.map → logout-U5V5K775.js.map} +1 -1
- package/dist/mcp-DRMQYA7E.js +39 -0
- package/dist/mcp-DRMQYA7E.js.map +1 -0
- package/dist/{pull-2ODHRCHG.js → pull-V7QJBVNZ.js} +3 -4
- package/dist/{pull-2ODHRCHG.js.map → pull-V7QJBVNZ.js.map} +1 -1
- package/dist/{push-7DIL7IRB.js → push-P6CKRYT7.js} +8 -9
- package/dist/{push-7DIL7IRB.js.map → push-P6CKRYT7.js.map} +1 -1
- package/dist/{secrets-RNM6LSXT.js → secrets-M43LLCTB.js} +6 -7
- package/dist/{secrets-RNM6LSXT.js.map → secrets-M43LLCTB.js.map} +1 -1
- package/dist/{sync-6EXHV3IT.js → sync-LTBH6DI5.js} +3 -4
- package/dist/{sync-6EXHV3IT.js.map → sync-LTBH6DI5.js.map} +1 -1
- package/package.json +5 -4
- package/dist/chunk-5ATINSVP.js +0 -210904
- package/dist/chunk-5ATINSVP.js.map +0 -1
- package/dist/chunk-ZWE3DS7E.js +0 -39
- package/dist/chunk-ZWE3DS7E.js.map +0 -1
- /package/dist/{chunk-5J2WLD3O.js.map → chunk-4CEJYSJY.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
generateTypes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LPEV4QH2.js";
|
|
5
5
|
import {
|
|
6
6
|
mergeSecrets,
|
|
7
7
|
readLocalSecretsFromConfig,
|
|
@@ -11,14 +11,13 @@ import {
|
|
|
11
11
|
resolveSecretsRuntimeConfigPath
|
|
12
12
|
} from "./chunk-IZXCZ3IA.js";
|
|
13
13
|
import "./chunk-INB3LG6O.js";
|
|
14
|
+
import "./chunk-XVD3FFOJ.js";
|
|
14
15
|
import {
|
|
15
16
|
requireAuth,
|
|
16
17
|
resolveProvider
|
|
17
18
|
} from "./chunk-S3KAVLVM.js";
|
|
18
19
|
import "./chunk-FO24J6XL.js";
|
|
19
|
-
import "./chunk-XVD3FFOJ.js";
|
|
20
20
|
import "./chunk-EXXTCGKR.js";
|
|
21
|
-
import "./chunk-ZWE3DS7E.js";
|
|
22
21
|
|
|
23
22
|
// src/commands/secrets/add.ts
|
|
24
23
|
import { defineCommand } from "citty";
|
|
@@ -125,4 +124,4 @@ var add_default = defineCommand({
|
|
|
125
124
|
export {
|
|
126
125
|
add_default as default
|
|
127
126
|
};
|
|
128
|
-
//# sourceMappingURL=add-
|
|
127
|
+
//# sourceMappingURL=add-YZSIMRPC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/secrets/add.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport {\n mergeSecrets,\n readLocalSecretsFromConfig,\n writeLocalSecretsToConfig,\n} from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key (UPPER_SNAKE_CASE)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets add -k <KEY> -v <VALUE>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let key = args.key?.trim();\n let value = args.value;\n\n if (!key) {\n const input = await p.text({\n message: \"Secret key name\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {\n return \"Key must be UPPER_SNAKE_CASE\";\n }\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(input).trim();\n }\n\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {\n p.log.error(\"Invalid key. Use UPPER_SNAKE_CASE.\");\n process.exit(1);\n }\n\n if (!value) {\n const input = await p.password({\n message: `Enter value for ${key}`,\n mask: \"*\",\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n value = String(input);\n }\n\n const trimmedValue = value.trim();\n if (!trimmedValue) {\n p.log.error(\"Secret value cannot be empty.\");\n process.exit(1);\n }\n\n const spinner = p.spinner();\n spinner.start(`Adding ${pc.cyan(key)} to remote runtime`);\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n await provider.putSecret({\n cwd,\n configPath,\n name: key,\n value: trimmedValue,\n });\n\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n const merged = mergeSecrets(localSecrets, [key]);\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} added`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to add secret\");\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/secrets/add.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport {\n mergeSecrets,\n readLocalSecretsFromConfig,\n writeLocalSecretsToConfig,\n} from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a secret to remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key (UPPER_SNAKE_CASE)\",\n },\n value: {\n type: \"string\",\n alias: \"v\",\n description: \"Secret value\",\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets add -k <KEY> -v <VALUE>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets add\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let key = args.key?.trim();\n let value = args.value;\n\n if (!key) {\n const input = await p.text({\n message: \"Secret key name\",\n placeholder: \"STRIPE_SECRET_KEY\",\n validate: (v) => {\n if (!v) return \"Key is required\";\n if (!/^[A-Z_][A-Z0-9_]*$/.test(v)) {\n return \"Key must be UPPER_SNAKE_CASE\";\n }\n },\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(input).trim();\n }\n\n if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {\n p.log.error(\"Invalid key. Use UPPER_SNAKE_CASE.\");\n process.exit(1);\n }\n\n if (!value) {\n const input = await p.password({\n message: `Enter value for ${key}`,\n mask: \"*\",\n });\n if (p.isCancel(input)) {\n p.outro(\"Cancelled\");\n return;\n }\n value = String(input);\n }\n\n const trimmedValue = value.trim();\n if (!trimmedValue) {\n p.log.error(\"Secret value cannot be empty.\");\n process.exit(1);\n }\n\n const spinner = p.spinner();\n spinner.start(`Adding ${pc.cyan(key)} to remote runtime`);\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n await provider.putSecret({\n cwd,\n configPath,\n name: key,\n value: trimmedValue,\n });\n\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n const merged = mergeSecrets(localSecrets, [key]);\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} added`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to add secret\");\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"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./chunk-ZWE3DS7E.js";
|
|
3
2
|
|
|
4
3
|
// src/commands/agents/index.ts
|
|
5
4
|
import { defineCommand } from "citty";
|
|
@@ -20,8 +19,8 @@ var agents_default = defineCommand({
|
|
|
20
19
|
}
|
|
21
20
|
},
|
|
22
21
|
subCommands: {
|
|
23
|
-
list: () => import("./list-
|
|
24
|
-
delete: () => import("./delete-
|
|
22
|
+
list: () => import("./list-FKH4DWCF.js").then((r) => r.default),
|
|
23
|
+
delete: () => import("./delete-QPYVL4OU.js").then((r) => r.default)
|
|
25
24
|
},
|
|
26
25
|
run({ args }) {
|
|
27
26
|
const subcommand = process.argv[3];
|
|
@@ -41,4 +40,4 @@ var agents_default = defineCommand({
|
|
|
41
40
|
export {
|
|
42
41
|
agents_default as default
|
|
43
42
|
};
|
|
44
|
-
//# sourceMappingURL=agents-
|
|
43
|
+
//# sourceMappingURL=agents-WYK6WNQP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/agents/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"agents\",\n description: \"Inspect and manage project agents\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n list: () => import(\"./list\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n },\n run({ args }) {\n const subcommand = process.argv[3];\n if (subcommand && subcommand !== \"--help\" && subcommand !== \"-h\") {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp agents\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List remote agents`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete an agent from remote runtime`);\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp agents <subcommand> --help\")} for more info.`,\n );\n },\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/agents/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"agents\",\n description: \"Inspect and manage project agents\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n list: () => import(\"./list\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n },\n run({ args }) {\n const subcommand = process.argv[3];\n if (subcommand && subcommand !== \"--help\" && subcommand !== \"-h\") {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp agents\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List remote agents`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete an agent from remote runtime`);\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp agents <subcommand> --help\")} for more info.`,\n );\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClD,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACxD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,UAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAI,cAAc,eAAe,YAAY,eAAe,MAAM;AAChE;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAC3C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,wBAAwB;AAC1D,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,uCAAuC;AAC3E,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,iCAAiC,CAAC;AAAA,IACnD;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
import {
|
|
3
3
|
ensureStudioSecrets
|
|
4
4
|
} from "./chunk-NV2IZ4XM.js";
|
|
5
|
-
import {
|
|
6
|
-
requireAuth,
|
|
7
|
-
resolveProvider
|
|
8
|
-
} from "./chunk-S3KAVLVM.js";
|
|
9
5
|
import {
|
|
10
6
|
getRequiredSecretForProvider,
|
|
11
7
|
materializeRuntime,
|
|
@@ -14,6 +10,10 @@ import {
|
|
|
14
10
|
resolveProviderFromConfig,
|
|
15
11
|
writeProjectState
|
|
16
12
|
} from "./chunk-XVD3FFOJ.js";
|
|
13
|
+
import {
|
|
14
|
+
requireAuth,
|
|
15
|
+
resolveProvider
|
|
16
|
+
} from "./chunk-S3KAVLVM.js";
|
|
17
17
|
import {
|
|
18
18
|
loadProjectConfig,
|
|
19
19
|
resolveIdentityAuthRequirements,
|
|
@@ -198,4 +198,4 @@ export {
|
|
|
198
198
|
promptDeployTarget,
|
|
199
199
|
showKalpCloudWaitlist
|
|
200
200
|
};
|
|
201
|
-
//# sourceMappingURL=chunk-
|
|
201
|
+
//# sourceMappingURL=chunk-4CEJYSJY.js.map
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadProjectConfig
|
|
4
|
+
} from "./chunk-EXXTCGKR.js";
|
|
5
|
+
|
|
6
|
+
// src/utils/codegen.ts
|
|
7
|
+
import { access, mkdir, readFile, writeFile } from "fs/promises";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
var GENERATED_HEADER = `// \u{1F98B} Kalp Generated Types
|
|
10
|
+
// This file is auto-generated. Do not edit manually.
|
|
11
|
+
`;
|
|
12
|
+
var GENERATED_MCP_HEADER = `// \u{1F98B} Kalp Generated MCP Types
|
|
13
|
+
// This file is auto-generated by \`kalp mcp generate\`.
|
|
14
|
+
// Do not edit manually.
|
|
15
|
+
`;
|
|
16
|
+
var DEFAULT_PROVIDER = "openai";
|
|
17
|
+
function sanitizeSecrets(input) {
|
|
18
|
+
if (!Array.isArray(input)) return [];
|
|
19
|
+
return input.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
20
|
+
}
|
|
21
|
+
function sanitizeCustomModels(input) {
|
|
22
|
+
if (!Array.isArray(input)) return [];
|
|
23
|
+
return input.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
24
|
+
}
|
|
25
|
+
function sanitizeProvider(input) {
|
|
26
|
+
if (input === "openai" || input === "anthropic" || input === "openrouter" || input === "custom") {
|
|
27
|
+
return input;
|
|
28
|
+
}
|
|
29
|
+
return DEFAULT_PROVIDER;
|
|
30
|
+
}
|
|
31
|
+
function parseSecretsFromConfigText(configContent) {
|
|
32
|
+
const secretsMatch = configContent.match(/secrets:\s*\[([^\]]*)\]/);
|
|
33
|
+
if (!secretsMatch) return [];
|
|
34
|
+
const secretsArray = secretsMatch[1] ?? "";
|
|
35
|
+
const secretMatches = secretsArray.match(/"([^"]+)"/g);
|
|
36
|
+
if (!secretMatches) return [];
|
|
37
|
+
return secretMatches.map((match) => match.replace(/"/g, "").trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
38
|
+
}
|
|
39
|
+
function parseProviderFromConfigText(configContent) {
|
|
40
|
+
const providerMatch = configContent.match(
|
|
41
|
+
/provider:\s*"(openai|anthropic|openrouter|custom)"/
|
|
42
|
+
);
|
|
43
|
+
return sanitizeProvider(providerMatch?.[1]);
|
|
44
|
+
}
|
|
45
|
+
function parseCustomModelsFromConfigText(configContent) {
|
|
46
|
+
const modelsMatch = configContent.match(/customModels:\s*\[([^\]]*)\]/);
|
|
47
|
+
if (!modelsMatch) return [];
|
|
48
|
+
const modelsArray = modelsMatch[1] ?? "";
|
|
49
|
+
const modelMatches = modelsArray.match(/"([^"]+)"/g);
|
|
50
|
+
if (!modelMatches) return [];
|
|
51
|
+
return modelMatches.map((match) => match.replace(/"/g, "").trim()).filter(Boolean).sort((a, b) => a.localeCompare(b));
|
|
52
|
+
}
|
|
53
|
+
async function readConfigForTypes(cwd) {
|
|
54
|
+
try {
|
|
55
|
+
const { raw } = await loadProjectConfig(cwd);
|
|
56
|
+
const aiConfig = raw.ai && typeof raw.ai === "object" ? raw.ai : {};
|
|
57
|
+
return {
|
|
58
|
+
secrets: sanitizeSecrets(raw.secrets),
|
|
59
|
+
provider: sanitizeProvider(aiConfig.provider),
|
|
60
|
+
customModels: sanitizeCustomModels(aiConfig.customModels)
|
|
61
|
+
};
|
|
62
|
+
} catch {
|
|
63
|
+
const configPath = join(cwd, "kalp.config.ts");
|
|
64
|
+
const configContent = await readFile(configPath, "utf-8").catch(() => "");
|
|
65
|
+
return {
|
|
66
|
+
secrets: parseSecretsFromConfigText(configContent),
|
|
67
|
+
provider: parseProviderFromConfigText(configContent),
|
|
68
|
+
customModels: parseCustomModelsFromConfigText(configContent)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function toStringTuple(values) {
|
|
73
|
+
if (values.length === 0) return "readonly []";
|
|
74
|
+
return `readonly [${values.map((value) => JSON.stringify(value)).join(", ")}]`;
|
|
75
|
+
}
|
|
76
|
+
function buildKalpDtsContent() {
|
|
77
|
+
return `import "@kalphq/sdk";
|
|
78
|
+
import "./.kalp/mcp.types";
|
|
79
|
+
import type {
|
|
80
|
+
RegisteredSecretKeys,
|
|
81
|
+
ConfiguredAIProvider,
|
|
82
|
+
ConfiguredAICustomModels,
|
|
83
|
+
} from "./.kalp/types";
|
|
84
|
+
|
|
85
|
+
declare module "@kalphq/sdk" {
|
|
86
|
+
interface SecretsRegistry {
|
|
87
|
+
keys: RegisteredSecretKeys;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
interface KalpAIEnvironment {
|
|
91
|
+
provider: ConfiguredAIProvider;
|
|
92
|
+
customModels: ConfiguredAICustomModels;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function parseTsconfigJson(content: string): { include?: string[] } | null {
|
|
97
|
+
try {
|
|
98
|
+
return JSON.parse(content) as { include?: string[] };
|
|
99
|
+
} catch {
|
|
100
|
+
const withoutComments = content
|
|
101
|
+
.replace(//*[sS]*?*//g, "")
|
|
102
|
+
.replace(/^s*//.*$/gm, "");
|
|
103
|
+
const withoutTrailingCommas = withoutComments
|
|
104
|
+
.replace(/,s*}/g, "}")
|
|
105
|
+
.replace(/,s*]/g, "]");
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
return JSON.parse(withoutTrailingCommas) as { include?: string[] };
|
|
109
|
+
} catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
function buildEmptyMcpTypesContent() {
|
|
117
|
+
return `${GENERATED_MCP_HEADER}import "@kalphq/sdk";
|
|
118
|
+
|
|
119
|
+
declare module "@kalphq/sdk" {
|
|
120
|
+
interface McpRegistry {}
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
async function writeMcpTypes(cwd, content) {
|
|
125
|
+
const kalpDir = join(cwd, ".kalp");
|
|
126
|
+
const mcpTypesPath = join(kalpDir, "mcp.types.d.ts");
|
|
127
|
+
await mkdir(kalpDir, { recursive: true });
|
|
128
|
+
await writeFile(mcpTypesPath, content, "utf-8");
|
|
129
|
+
await updateKalpDts(cwd);
|
|
130
|
+
await updateTsconfig(cwd);
|
|
131
|
+
return mcpTypesPath;
|
|
132
|
+
}
|
|
133
|
+
async function ensureMcpTypesFile(cwd) {
|
|
134
|
+
const kalpDir = join(cwd, ".kalp");
|
|
135
|
+
const mcpTypesPath = join(kalpDir, "mcp.types.d.ts");
|
|
136
|
+
try {
|
|
137
|
+
await access(mcpTypesPath);
|
|
138
|
+
return;
|
|
139
|
+
} catch {
|
|
140
|
+
await writeMcpTypes(cwd, buildEmptyMcpTypesContent());
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function generateTypes(cwd) {
|
|
144
|
+
const kalpDir = join(cwd, ".kalp");
|
|
145
|
+
const typesPath = join(kalpDir, "types.d.ts");
|
|
146
|
+
const config = await readConfigForTypes(cwd);
|
|
147
|
+
await mkdir(kalpDir, { recursive: true });
|
|
148
|
+
const typesContent = `${GENERATED_HEADER}/**
|
|
149
|
+
* Registered secrets from kalp.config.ts
|
|
150
|
+
* @generated
|
|
151
|
+
*/
|
|
152
|
+
export type RegisteredSecretKeys = ${toStringTuple(config.secrets)};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* AI provider resolved from kalp.config.ts
|
|
156
|
+
* @generated
|
|
157
|
+
*/
|
|
158
|
+
export type ConfiguredAIProvider = ${JSON.stringify(config.provider)};
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Custom model suggestions resolved from kalp.config.ts
|
|
162
|
+
* @generated
|
|
163
|
+
*/
|
|
164
|
+
export type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};
|
|
165
|
+
`;
|
|
166
|
+
await writeFile(typesPath, typesContent, "utf-8");
|
|
167
|
+
await ensureMcpTypesFile(cwd);
|
|
168
|
+
await updateKalpDts(cwd);
|
|
169
|
+
await updateTsconfig(cwd);
|
|
170
|
+
}
|
|
171
|
+
async function updateKalpDts(cwd) {
|
|
172
|
+
const kalpDtsPath = join(cwd, "kalp.d.ts");
|
|
173
|
+
const content = buildKalpDtsContent();
|
|
174
|
+
try {
|
|
175
|
+
await access(kalpDtsPath);
|
|
176
|
+
const current = await readFile(kalpDtsPath, "utf-8");
|
|
177
|
+
if (current.trim() === content.trim()) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
} catch {
|
|
181
|
+
}
|
|
182
|
+
await writeFile(kalpDtsPath, content, "utf-8");
|
|
183
|
+
}
|
|
184
|
+
async function updateTsconfig(cwd) {
|
|
185
|
+
const tsconfigPath = join(cwd, "tsconfig.json");
|
|
186
|
+
try {
|
|
187
|
+
const content = await readFile(tsconfigPath, "utf-8");
|
|
188
|
+
const config = parseTsconfigJson(content);
|
|
189
|
+
if (!config) return;
|
|
190
|
+
if (!Array.isArray(config.include)) {
|
|
191
|
+
config.include = [];
|
|
192
|
+
}
|
|
193
|
+
const required = ["kalp.d.ts", ".kalp/types.d.ts", ".kalp/mcp.types.d.ts"];
|
|
194
|
+
for (const includePath of required) {
|
|
195
|
+
if (!config.include.includes(includePath)) {
|
|
196
|
+
config.include.push(includePath);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
await writeFile(tsconfigPath, JSON.stringify(config, null, 2), "utf-8");
|
|
200
|
+
} catch {
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
writeMcpTypes,
|
|
206
|
+
generateTypes
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=chunk-LPEV4QH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/codegen.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { loadProjectConfig } from \"@/utils/project-config\";\n\nconst GENERATED_HEADER = `// 🦋 Kalp Generated Types\n// This file is auto-generated. Do not edit manually.\n`;\n\nconst GENERATED_MCP_HEADER = `// 🦋 Kalp Generated MCP Types\n// This file is auto-generated by \\`kalp mcp generate\\`.\n// Do not edit manually.\n`;\n\ntype AIProvider = \"openai\" | \"anthropic\" | \"openrouter\" | \"custom\";\n\ninterface GeneratedTypeConfig {\n secrets: string[];\n provider: AIProvider;\n customModels: string[];\n}\n\nconst DEFAULT_PROVIDER: AIProvider = \"openai\";\n\nfunction sanitizeSecrets(input: unknown): string[] {\n if (!Array.isArray(input)) return [];\n return input\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction sanitizeCustomModels(input: unknown): string[] {\n if (!Array.isArray(input)) return [];\n return input\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction sanitizeProvider(input: unknown): AIProvider {\n if (\n input === \"openai\" ||\n input === \"anthropic\" ||\n input === \"openrouter\" ||\n input === \"custom\"\n ) {\n return input;\n }\n return DEFAULT_PROVIDER;\n}\n\nfunction parseSecretsFromConfigText(configContent: string): string[] {\n const secretsMatch = configContent.match(/secrets:\\s*\\[([^\\]]*)\\]/);\n if (!secretsMatch) return [];\n const secretsArray = secretsMatch[1] ?? \"\";\n const secretMatches = secretsArray.match(/\"([^\"]+)\"/g);\n if (!secretMatches) return [];\n return secretMatches\n .map((match) => match.replace(/\"/g, \"\").trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction parseProviderFromConfigText(configContent: string): AIProvider {\n const providerMatch = configContent.match(\n /provider:\\s*\"(openai|anthropic|openrouter|custom)\"/,\n );\n return sanitizeProvider(providerMatch?.[1]);\n}\n\nfunction parseCustomModelsFromConfigText(configContent: string): string[] {\n const modelsMatch = configContent.match(/customModels:\\s*\\[([^\\]]*)\\]/);\n if (!modelsMatch) return [];\n const modelsArray = modelsMatch[1] ?? \"\";\n const modelMatches = modelsArray.match(/\"([^\"]+)\"/g);\n if (!modelMatches) return [];\n return modelMatches\n .map((match) => match.replace(/\"/g, \"\").trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n}\n\nasync function readConfigForTypes(cwd: string): Promise<GeneratedTypeConfig> {\n try {\n const { raw } = await loadProjectConfig(cwd);\n const aiConfig =\n raw.ai && typeof raw.ai === \"object\" ? (raw.ai as Record<string, unknown>) : {};\n\n return {\n secrets: sanitizeSecrets(raw.secrets),\n provider: sanitizeProvider(aiConfig.provider),\n customModels: sanitizeCustomModels(aiConfig.customModels),\n };\n } catch {\n const configPath = join(cwd, \"kalp.config.ts\");\n const configContent = await readFile(configPath, \"utf-8\").catch(() => \"\");\n return {\n secrets: parseSecretsFromConfigText(configContent),\n provider: parseProviderFromConfigText(configContent),\n customModels: parseCustomModelsFromConfigText(configContent),\n };\n }\n}\n\nfunction toStringTuple(values: string[]): string {\n if (values.length === 0) return \"readonly []\";\n return `readonly [${values.map((value) => JSON.stringify(value)).join(\", \")}]`;\n}\n\nfunction buildKalpDtsContent(): string {\n return `import \"@kalphq/sdk\";\nimport \"./.kalp/mcp.types\";\nimport type {\n RegisteredSecretKeys,\n ConfiguredAIProvider,\n ConfiguredAICustomModels,\n} from \"./.kalp/types\";\n\ndeclare module \"@kalphq/sdk\" {\n interface SecretsRegistry {\n keys: RegisteredSecretKeys;\n }\n\n interface KalpAIEnvironment {\n provider: ConfiguredAIProvider;\n customModels: ConfiguredAICustomModels;\n }\n}\n\nfunction parseTsconfigJson(content: string): { include?: string[] } | null {\n try {\n return JSON.parse(content) as { include?: string[] };\n } catch {\n const withoutComments = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/^\\s*\\/\\/.*$/gm, \"\");\n const withoutTrailingCommas = withoutComments\n .replace(/,\\s*}/g, \"}\")\n .replace(/,\\s*]/g, \"]\");\n\n try {\n return JSON.parse(withoutTrailingCommas) as { include?: string[] };\n } catch {\n return null;\n }\n }\n}\n`;\n}\n\nfunction buildEmptyMcpTypesContent(): string {\n return `${GENERATED_MCP_HEADER}import \"@kalphq/sdk\";\n\ndeclare module \"@kalphq/sdk\" {\n interface McpRegistry {}\n}\n`;\n}\n\nexport async function writeMcpTypes(cwd: string, content: string): Promise<string> {\n const kalpDir = join(cwd, \".kalp\");\n const mcpTypesPath = join(kalpDir, \"mcp.types.d.ts\");\n await mkdir(kalpDir, { recursive: true });\n await writeFile(mcpTypesPath, content, \"utf-8\");\n await updateKalpDts(cwd);\n await updateTsconfig(cwd);\n return mcpTypesPath;\n}\n\nasync function ensureMcpTypesFile(cwd: string): Promise<void> {\n const kalpDir = join(cwd, \".kalp\");\n const mcpTypesPath = join(kalpDir, \"mcp.types.d.ts\");\n\n try {\n await access(mcpTypesPath);\n return;\n } catch {\n await writeMcpTypes(cwd, buildEmptyMcpTypesContent());\n }\n}\n\n/**\n * Generate .kalp/types.d.ts and ensure local module augmentations are wired.\n */\nexport async function generateTypes(cwd: string): Promise<void> {\n const kalpDir = join(cwd, \".kalp\");\n const typesPath = join(kalpDir, \"types.d.ts\");\n const config = await readConfigForTypes(cwd);\n\n await mkdir(kalpDir, { recursive: true });\n\n const typesContent = `${GENERATED_HEADER}/**\n * Registered secrets from kalp.config.ts\n * @generated\n */\nexport type RegisteredSecretKeys = ${toStringTuple(config.secrets)};\n\n/**\n * AI provider resolved from kalp.config.ts\n * @generated\n */\nexport type ConfiguredAIProvider = ${JSON.stringify(config.provider)};\n\n/**\n * Custom model suggestions resolved from kalp.config.ts\n * @generated\n */\nexport type ConfiguredAICustomModels = ${toStringTuple(config.customModels)};\n`;\n\n await writeFile(typesPath, typesContent, \"utf-8\");\n await ensureMcpTypesFile(cwd);\n await updateKalpDts(cwd);\n await updateTsconfig(cwd);\n}\n\n/**\n * Ensure kalp.d.ts exists and contains SDK module augmentations.\n */\nexport async function updateKalpDts(cwd: string): Promise<void> {\n const kalpDtsPath = join(cwd, \"kalp.d.ts\");\n const content = buildKalpDtsContent();\n\n try {\n await access(kalpDtsPath);\n const current = await readFile(kalpDtsPath, \"utf-8\");\n if (current.trim() === content.trim()) {\n return;\n }\n } catch {\n // file does not exist yet\n }\n\n await writeFile(kalpDtsPath, content, \"utf-8\");\n}\n\n/**\n * Ensure tsconfig includes kalp.d.ts and generated .kalp types.\n */\nexport async function updateTsconfig(cwd: string): Promise<void> {\n const tsconfigPath = join(cwd, \"tsconfig.json\");\n\n try {\n const content = await readFile(tsconfigPath, \"utf-8\");\n const config = parseTsconfigJson(content);\n if (!config) return;\n\n if (!Array.isArray(config.include)) {\n config.include = [];\n }\n\n const required = [\"kalp.d.ts\", \".kalp/types.d.ts\", \".kalp/mcp.types.d.ts\"];\n for (const includePath of required) {\n if (!config.include.includes(includePath)) {\n config.include.push(includePath);\n }\n }\n\n await writeFile(tsconfigPath, JSON.stringify(config, null, 2), \"utf-8\");\n } catch {\n // no-op\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
generateTypes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LPEV4QH2.js";
|
|
5
5
|
import {
|
|
6
6
|
isProjectInitialized
|
|
7
7
|
} from "./chunk-INB3LG6O.js";
|
|
8
8
|
import "./chunk-EXXTCGKR.js";
|
|
9
|
-
import "./chunk-ZWE3DS7E.js";
|
|
10
9
|
|
|
11
10
|
// src/commands/create.ts
|
|
12
11
|
import { defineCommand } from "citty";
|
|
@@ -149,4 +148,4 @@ var create_default = defineCommand({
|
|
|
149
148
|
export {
|
|
150
149
|
create_default as default
|
|
151
150
|
};
|
|
152
|
-
//# sourceMappingURL=create-
|
|
151
|
+
//# sourceMappingURL=create-UCJ77P62.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/create.ts","../src/utils/ui.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { scaffoldAgent } from \"@kalphq/project\";\nimport { isProjectInitialized } from \"@/utils/fs\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { promptAgentDetails } from \"@/utils/ui\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n const needsInit = !(await isProjectInitialized(cwd));\n\n if (needsInit) {\n p.log.error(\"This is not a Kalp project.\");\n console.log(\"\");\n console.log(\" Run:\");\n console.log(` ${pc.cyan(\"npx create-kalp@latest\")}`);\n console.log(\"\");\n process.exit(1);\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails({ includeTemplate: true });\n\n // ── Check if agent already exists ────────────────────────────────────\n const agentDir = join(cwd, \"agents\", agentAnswers.name);\n if (existsSync(agentDir)) {\n p.log.error(`Agent \"${agentAnswers.name}\" already exists.`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Location:\")} ${pc.cyan(agentDir)}`);\n console.log(\"\");\n console.log(\n ` ${pc.dim(\"Choose a different name or remove the existing agent.\")}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n label: agentAnswers.label,\n cwd,\n template: agentAnswers.template,\n });\n await generateTypes(cwd);\n s.stop(\n agentAnswers.template\n ? `Agent created (${agentAnswers.template} template)`\n : \"Agent created\",\n );\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)} ${pc.dim(\"— Agent entrypoint with config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/contract/`)} ${pc.dim(\"— RPC contract definition\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/hooks/`)} ${pc.dim(\"— Lifecycle hooks (onInit, onTick)\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/routes/`)} ${pc.dim(\"— HTTP endpoints\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)} ${pc.dim(\"— Reusable workflow steps\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)} ${pc.dim(\"— Callable agent tools\")}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n","import * as p from \"@clack/prompts\";\nimport { deriveLabelFromName, type TemplateId } from \"@kalphq/project\";\n\n/**\n * Prompt user to select an agent template.\n */\nexport async function promptTemplateSelection(): Promise<TemplateId> {\n const answer = await p.select({\n message: \"Choose an agent template:\",\n options: [\n {\n value: \"researcher\",\n label: \"🔬 Researcher\",\n hint: \"Deterministic scheduling - pause 24h and auto-resume\",\n },\n {\n value: \"support\",\n label: \"🎧 Support Agent\",\n hint: \"Human-in-the-Loop - pause for days until resolved\",\n },\n {\n value: \"blank\",\n label: \"⬜ Blank\",\n hint: \"Minimal structure with modern Kalp v1 syntax\",\n },\n {\n value: \"ops-revenue\",\n label: \"📈 Revenue Ops\",\n hint: \"Pipeline qualification + human handoff + event-driven orchestration\",\n },\n ],\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer as TemplateId;\n}\n\nexport async function promptProjectName(opts?: {\n message?: string;\n placeholder?: string;\n allowCurrentDir?: boolean;\n}): Promise<string> {\n const message = opts?.message ?? \"Project name?\";\n const placeholder = opts?.placeholder ?? \"my-project\";\n const allowCurrentDir = opts?.allowCurrentDir ?? false;\n\n const answer = await p.text({\n message,\n placeholder,\n validate: (v) => {\n const value = v.trim();\n if (!value) return \"Project name is required.\";\n if (allowCurrentDir && value === \".\") return;\n if (!/^[a-z0-9-]+$/.test(value)) {\n return allowCurrentDir\n ? \"Use lowercase letters, numbers, and dashes only (or . for current directory).\"\n : \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer.trim();\n}\n\nexport async function promptAgentDetails(opts?: {\n includeTemplate?: boolean;\n}): Promise<{\n name: string;\n label: string;\n template?: TemplateId;\n}> {\n const answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v)) {\n return \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n }),\n ...(opts?.includeTemplate && {\n template: () => promptTemplateSelection(),\n }),\n label: ({ results }) =>\n p.text({\n message: \"Agent label? (display name)\",\n placeholder: deriveLabelFromName(results.name as string),\n initialValue: deriveLabelFromName(results.name as string),\n validate: (v) => {\n if (!v.trim()) return \"Agent label is required.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n name: answers.name,\n label: String(answers.label),\n template: answers.template as TemplateId | undefined,\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/create.ts","../src/utils/ui.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { scaffoldAgent } from \"@kalphq/project\";\nimport { isProjectInitialized } from \"@/utils/fs\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { promptAgentDetails } from \"@/utils/ui\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"create\", description: \"Add a new agent to the project\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp create\")}`);\n\n // ── Check if project is initialized ─────────────────────────────────\n const needsInit = !(await isProjectInitialized(cwd));\n\n if (needsInit) {\n p.log.error(\"This is not a Kalp project.\");\n console.log(\"\");\n console.log(\" Run:\");\n console.log(` ${pc.cyan(\"npx create-kalp@latest\")}`);\n console.log(\"\");\n process.exit(1);\n }\n\n // ── Agent prompts ────────────────────────────────────────────────────\n const agentAnswers = await promptAgentDetails({ includeTemplate: true });\n\n // ── Check if agent already exists ────────────────────────────────────\n const agentDir = join(cwd, \"agents\", agentAnswers.name);\n if (existsSync(agentDir)) {\n p.log.error(`Agent \"${agentAnswers.name}\" already exists.`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Location:\")} ${pc.cyan(agentDir)}`);\n console.log(\"\");\n console.log(\n ` ${pc.dim(\"Choose a different name or remove the existing agent.\")}`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n\n // ── Scaffold agent ───────────────────────────────────────────────────\n s.start(`Scaffolding agent ${pc.cyan(agentAnswers.name)}`);\n await scaffoldAgent({\n agentName: agentAnswers.name,\n label: agentAnswers.label,\n cwd,\n template: agentAnswers.template,\n });\n await generateTypes(cwd);\n s.stop(\n agentAnswers.template\n ? `Agent created (${agentAnswers.template} template)`\n : \"Agent created\",\n );\n\n p.note(\n [\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/index.ts`)} ${pc.dim(\"— Agent entrypoint with config\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/contract/`)} ${pc.dim(\"— RPC contract definition\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/hooks/`)} ${pc.dim(\"— Lifecycle hooks (onInit, onTick)\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/routes/`)} ${pc.dim(\"— HTTP endpoints\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/steps/`)} ${pc.dim(\"— Reusable workflow steps\")}`,\n `${pc.dim(\"•\")} ${pc.cyan(`agents/${agentAnswers.name}/tools/`)} ${pc.dim(\"— Callable agent tools\")}`,\n ].join(\"\\n\"),\n \"Created\",\n );\n\n p.outro(\n `${LOGO} ${pc.green(`Agent ${pc.bold(agentAnswers.name)} is ready.`)}`,\n );\n },\n});\n","import * as p from \"@clack/prompts\";\nimport { deriveLabelFromName, type TemplateId } from \"@kalphq/project\";\n\n/**\n * Prompt user to select an agent template.\n */\nexport async function promptTemplateSelection(): Promise<TemplateId> {\n const answer = await p.select({\n message: \"Choose an agent template:\",\n options: [\n {\n value: \"researcher\",\n label: \"🔬 Researcher\",\n hint: \"Deterministic scheduling - pause 24h and auto-resume\",\n },\n {\n value: \"support\",\n label: \"🎧 Support Agent\",\n hint: \"Human-in-the-Loop - pause for days until resolved\",\n },\n {\n value: \"blank\",\n label: \"⬜ Blank\",\n hint: \"Minimal structure with modern Kalp v1 syntax\",\n },\n {\n value: \"ops-revenue\",\n label: \"📈 Revenue Ops\",\n hint: \"Pipeline qualification + human handoff + event-driven orchestration\",\n },\n ],\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer as TemplateId;\n}\n\nexport async function promptProjectName(opts?: {\n message?: string;\n placeholder?: string;\n allowCurrentDir?: boolean;\n}): Promise<string> {\n const message = opts?.message ?? \"Project name?\";\n const placeholder = opts?.placeholder ?? \"my-project\";\n const allowCurrentDir = opts?.allowCurrentDir ?? false;\n\n const answer = await p.text({\n message,\n placeholder,\n validate: (v) => {\n const value = v.trim();\n if (!value) return \"Project name is required.\";\n if (allowCurrentDir && value === \".\") return;\n if (!/^[a-z0-9-]+$/.test(value)) {\n return allowCurrentDir\n ? \"Use lowercase letters, numbers, and dashes only (or . for current directory).\"\n : \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n });\n\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n return answer.trim();\n}\n\nexport async function promptAgentDetails(opts?: {\n includeTemplate?: boolean;\n}): Promise<{\n name: string;\n label: string;\n template?: TemplateId;\n}> {\n const answers = await p.group(\n {\n name: () =>\n p.text({\n message: \"Agent name?\",\n placeholder: \"my-agent\",\n validate: (v) => {\n if (!v.trim()) return \"Agent name is required.\";\n if (!/^[a-z0-9-]+$/.test(v)) {\n return \"Use lowercase letters, numbers, and dashes only.\";\n }\n },\n }),\n ...(opts?.includeTemplate && {\n template: () => promptTemplateSelection(),\n }),\n label: ({ results }) =>\n p.text({\n message: \"Agent label? (display name)\",\n placeholder: deriveLabelFromName(results.name as string),\n initialValue: deriveLabelFromName(results.name as string),\n validate: (v) => {\n if (!v.trim()) return \"Agent label is required.\";\n },\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n name: answers.name,\n label: String(answers.label),\n template: answers.template as TemplateId | undefined,\n };\n}\n"],"mappings":"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","names":["p"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
generateTypes
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LPEV4QH2.js";
|
|
5
5
|
import {
|
|
6
6
|
readLocalSecretsFromConfig,
|
|
7
7
|
writeLocalSecretsToConfig
|
|
@@ -10,14 +10,13 @@ import {
|
|
|
10
10
|
resolveSecretsRuntimeConfigPath
|
|
11
11
|
} from "./chunk-IZXCZ3IA.js";
|
|
12
12
|
import "./chunk-INB3LG6O.js";
|
|
13
|
+
import "./chunk-XVD3FFOJ.js";
|
|
13
14
|
import {
|
|
14
15
|
requireAuth,
|
|
15
16
|
resolveProvider
|
|
16
17
|
} from "./chunk-S3KAVLVM.js";
|
|
17
18
|
import "./chunk-FO24J6XL.js";
|
|
18
|
-
import "./chunk-XVD3FFOJ.js";
|
|
19
19
|
import "./chunk-EXXTCGKR.js";
|
|
20
|
-
import "./chunk-ZWE3DS7E.js";
|
|
21
20
|
|
|
22
21
|
// src/commands/secrets/delete.ts
|
|
23
22
|
import { defineCommand } from "citty";
|
|
@@ -128,4 +127,4 @@ var delete_default = defineCommand({
|
|
|
128
127
|
export {
|
|
129
128
|
delete_default as default
|
|
130
129
|
};
|
|
131
|
-
//# sourceMappingURL=delete-
|
|
130
|
+
//# sourceMappingURL=delete-FIXMFFNZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig, writeLocalSecretsToConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key to delete\",\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <KEY>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let configPath: string;\n try {\n configPath = await resolveSecretsRuntimeConfigPath(cwd);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const provider = resolveProvider();\n let remoteSecrets;\n try {\n remoteSecrets = await provider.listSecrets({ cwd, configPath });\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!remoteSecrets || remoteSecrets.length === 0) {\n p.log.info(pc.dim(\"No remote secrets to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let key = args.key?.trim();\n if (!key) {\n const selected = await p.select({\n message: \"Select a secret to delete\",\n options: remoteSecrets\n .map((secret) => secret.name)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(selected);\n }\n\n const existsRemote = remoteSecrets.some((secret) => secret.name === key);\n if (!existsRemote) {\n p.log.error(`Secret ${pc.cyan(key)} not found in remote runtime.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Delete ${pc.cyan(key)} from remote runtime and local config?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const spinner = p.spinner();\n spinner.start(`Deleting ${pc.cyan(key)}`);\n\n try {\n await provider.deleteSecret({ cwd, configPath, name: key });\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n await writeLocalSecretsToConfig(\n cwd,\n localSecrets.filter((secret) => secret !== key),\n );\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} deleted`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete secret\");\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/secrets/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { readLocalSecretsFromConfig, writeLocalSecretsToConfig } from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a secret from remote runtime and local config\",\n },\n args: {\n key: {\n type: \"string\",\n alias: \"k\",\n description: \"Secret key to delete\",\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp secrets delete -k <KEY>`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets delete\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n let configPath: string;\n try {\n configPath = await resolveSecretsRuntimeConfigPath(cwd);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const provider = resolveProvider();\n let remoteSecrets;\n try {\n remoteSecrets = await provider.listSecrets({ cwd, configPath });\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n if (!remoteSecrets || remoteSecrets.length === 0) {\n p.log.info(pc.dim(\"No remote secrets to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n let key = args.key?.trim();\n if (!key) {\n const selected = await p.select({\n message: \"Select a secret to delete\",\n options: remoteSecrets\n .map((secret) => secret.name)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ value: name, label: name })),\n });\n if (p.isCancel(selected)) {\n p.outro(\"Cancelled\");\n return;\n }\n key = String(selected);\n }\n\n const existsRemote = remoteSecrets.some((secret) => secret.name === key);\n if (!existsRemote) {\n p.log.error(`Secret ${pc.cyan(key)} not found in remote runtime.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Delete ${pc.cyan(key)} from remote runtime and local config?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.outro(\"Cancelled\");\n return;\n }\n }\n\n const spinner = p.spinner();\n spinner.start(`Deleting ${pc.cyan(key)}`);\n\n try {\n await provider.deleteSecret({ cwd, configPath, name: key });\n const localSecrets = await readLocalSecretsFromConfig(cwd);\n await writeLocalSecretsToConfig(\n cwd,\n localSecrets.filter((secret) => secret !== key),\n );\n await generateTypes(cwd);\n\n spinner.stop(`Secret ${pc.cyan(key)} deleted`);\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to delete secret\");\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"]}
|
|
@@ -8,17 +8,16 @@ import {
|
|
|
8
8
|
resolveSecretsRuntimeConfigPath
|
|
9
9
|
} from "./chunk-IZXCZ3IA.js";
|
|
10
10
|
import "./chunk-INB3LG6O.js";
|
|
11
|
+
import {
|
|
12
|
+
readProjectState,
|
|
13
|
+
writeProjectState
|
|
14
|
+
} from "./chunk-XVD3FFOJ.js";
|
|
11
15
|
import {
|
|
12
16
|
requireAuth,
|
|
13
17
|
resolveProvider
|
|
14
18
|
} from "./chunk-S3KAVLVM.js";
|
|
15
19
|
import "./chunk-FO24J6XL.js";
|
|
16
|
-
import {
|
|
17
|
-
readProjectState,
|
|
18
|
-
writeProjectState
|
|
19
|
-
} from "./chunk-XVD3FFOJ.js";
|
|
20
20
|
import "./chunk-EXXTCGKR.js";
|
|
21
|
-
import "./chunk-ZWE3DS7E.js";
|
|
22
21
|
|
|
23
22
|
// src/commands/agents/delete.ts
|
|
24
23
|
import { defineCommand } from "citty";
|
|
@@ -143,4 +142,4 @@ var delete_default = defineCommand({
|
|
|
143
142
|
export {
|
|
144
143
|
delete_default as default
|
|
145
144
|
};
|
|
146
|
-
//# sourceMappingURL=delete-
|
|
145
|
+
//# sourceMappingURL=delete-QPYVL4OU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/agents/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\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 configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\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/delete.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport {\n readRemoteAgentPointers,\n readRemoteAgentsIndex,\n writeRemoteAgentsIndex,\n} from \"@/utils/agents-remote\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an agent from remote runtime\",\n },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to delete from remote runtime\",\n required: true,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Skip confirmation\",\n default: false,\n },\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.help) {\n p.log.info(`${pc.bold(\"Usage\")}: kalp agents delete -a <agent>`);\n return;\n }\n\n const cwd = process.cwd();\n p.intro(`${LOGO} ${pc.bold(\"kalp agents delete\")}`);\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 configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [indexEntries, pointers] = await Promise.all([\n readRemoteAgentsIndex(cwd, configPath),\n readRemoteAgentPointers(cwd, configPath),\n ]);\n\n const indexByName = new Map(\n indexEntries.map((entry) => [entry.name, entry]),\n );\n const pointerByName = new Map(\n pointers.map((entry) => [entry.name, entry.hash]),\n );\n const remoteNames = [...new Set([...indexByName.keys(), ...pointerByName.keys()])].sort(\n (a, b) => a.localeCompare(b),\n );\n\n spinner.stop(`Found ${remoteNames.length} remote agents`);\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote agents available to delete.\"));\n p.outro(\"Done\");\n return;\n }\n\n const agentName = args.agent?.trim();\n if (!agentName) {\n p.log.error(\n `Agent name is required. Use ${pc.cyan(\"kalp agents delete -a <agent>\")}.`,\n );\n process.exit(1);\n }\n\n if (!remoteNames.includes(agentName)) {\n p.log.error(`Agent ${pc.cyan(agentName)} is not deployed remotely.`);\n process.exit(1);\n }\n\n if (!args.yes) {\n const confirm = await p.confirm({\n message: `Delete ${pc.cyan(agentName)} from remote runtime?`,\n initialValue: false,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\");\n return;\n }\n }\n\n const hashes = new Set<string>();\n const pointerHash = pointerByName.get(agentName);\n if (pointerHash) hashes.add(pointerHash);\n const indexedHash = indexByName.get(agentName)?.hash;\n if (indexedHash) hashes.add(indexedHash);\n\n spinner.start(`Deleting ${pc.cyan(agentName)} from remote runtime`);\n const latestKey = `${agentName}:latest`;\n await provider\n .deleteValue({ cwd, configPath, key: latestKey })\n .catch(() => null);\n for (const hash of hashes) {\n await provider\n .deleteValue({ cwd, configPath, key: `${agentName}:${hash}` })\n .catch(() => null);\n }\n\n const filteredIndex = indexEntries.filter(\n (entry) => entry.name !== agentName,\n );\n await writeRemoteAgentsIndex(cwd, configPath, filteredIndex);\n\n const state = await readProjectState(cwd);\n if (state?.agents?.[agentName]) {\n state.agents[agentName].lastRemoteHash = null;\n state.agents[agentName].workerUrl = null;\n await writeProjectState(cwd, state);\n }\n\n spinner.stop(`Deleted remote agent ${pc.cyan(agentName)}`);\n p.log.info(\n pc.dim(\n `Local files were not changed. Delete ./agents/${agentName} manually if you no longer need it.`,\n ),\n );\n } catch (error) {\n spinner.stop(\"Failed to delete remote agent\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAWf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI,KAAK,MAAM;AACb,MAAE,MAAI,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,iCAAiC;AAC/D;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ,IAAI;AACxB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,oBAAoB,CAAC,EAAE;AAElD,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,UAAMA,WAAY,UAAQ;AAC1B,IAAAA,SAAQ,MAAM,uBAAuB;AAErC,QAAI;AACF,YAAM,aAAa,MAAM,gCAAgC,GAAG;AAC5D,YAAM,WAAW,gBAAgB;AACjC,YAAM,CAAC,cAAc,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,sBAAsB,KAAK,UAAU;AAAA,QACrC,wBAAwB,KAAK,UAAU;AAAA,MACzC,CAAC;AAED,YAAM,cAAc,IAAI;AAAA,QACtB,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC;AAAA,MACjD;AACA,YAAM,gBAAgB,IAAI;AAAA,QACxB,SAAS,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,MAClD;AACA,YAAM,cAAc,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,YAAY,KAAK,GAAG,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,EAAE;AAAA,QACjF,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC;AAAA,MAC7B;AAEA,MAAAA,SAAQ,KAAK,SAAS,YAAY,MAAM,gBAAgB;AACxD,UAAI,YAAY,WAAW,GAAG;AAC5B,QAAE,MAAI,KAAK,GAAG,IAAI,uCAAuC,CAAC;AAC1D,QAAE,QAAM,MAAM;AACd;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,OAAO,KAAK;AACnC,UAAI,CAAC,WAAW;AACd,QAAE,MAAI;AAAA,UACJ,+BAA+B,GAAG,KAAK,+BAA+B,CAAC;AAAA,QACzE;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,CAAC,YAAY,SAAS,SAAS,GAAG;AACpC,QAAE,MAAI,MAAM,SAAS,GAAG,KAAK,SAAS,CAAC,4BAA4B;AACnE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,CAAC,KAAK,KAAK;AACb,cAAMC,WAAU,MAAQ,UAAQ;AAAA,UAC9B,SAAS,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,UACrC,cAAc;AAAA,QAChB,CAAC;AACD,YAAM,WAASA,QAAO,KAAK,CAACA,UAAS;AACnC,UAAE,MAAI,KAAK,YAAY;AACvB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,oBAAI,IAAY;AAC/B,YAAM,cAAc,cAAc,IAAI,SAAS;AAC/C,UAAI,YAAa,QAAO,IAAI,WAAW;AACvC,YAAM,cAAc,YAAY,IAAI,SAAS,GAAG;AAChD,UAAI,YAAa,QAAO,IAAI,WAAW;AAEvC,MAAAD,SAAQ,MAAM,YAAY,GAAG,KAAK,SAAS,CAAC,sBAAsB;AAClE,YAAM,YAAY,GAAG,SAAS;AAC9B,YAAM,SACH,YAAY,EAAE,KAAK,YAAY,KAAK,UAAU,CAAC,EAC/C,MAAM,MAAM,IAAI;AACnB,iBAAW,QAAQ,QAAQ;AACzB,cAAM,SACH,YAAY,EAAE,KAAK,YAAY,KAAK,GAAG,SAAS,IAAI,IAAI,GAAG,CAAC,EAC5D,MAAM,MAAM,IAAI;AAAA,MACrB;AAEA,YAAM,gBAAgB,aAAa;AAAA,QACjC,CAAC,UAAU,MAAM,SAAS;AAAA,MAC5B;AACA,YAAM,uBAAuB,KAAK,YAAY,aAAa;AAE3D,YAAM,QAAQ,MAAM,iBAAiB,GAAG;AACxC,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,cAAM,OAAO,SAAS,EAAE,iBAAiB;AACzC,cAAM,OAAO,SAAS,EAAE,YAAY;AACpC,cAAM,kBAAkB,KAAK,KAAK;AAAA,MACpC;AAEA,MAAAA,SAAQ,KAAK,wBAAwB,GAAG,KAAK,SAAS,CAAC,EAAE;AACzD,MAAE,MAAI;AAAA,QACJ,GAAG;AAAA,UACD,iDAAiD,SAAS;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,+BAA+B;AAC5C,MAAE,MAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["spinner","confirm"]}
|
|
@@ -3,18 +3,17 @@ import {
|
|
|
3
3
|
promptDeployTarget,
|
|
4
4
|
runInitialDeploy,
|
|
5
5
|
showKalpCloudWaitlist
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-4CEJYSJY.js";
|
|
7
7
|
import "./chunk-NV2IZ4XM.js";
|
|
8
8
|
import {
|
|
9
9
|
generateTypes
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LPEV4QH2.js";
|
|
11
|
+
import "./chunk-XVD3FFOJ.js";
|
|
11
12
|
import {
|
|
12
13
|
requireAuth
|
|
13
14
|
} from "./chunk-S3KAVLVM.js";
|
|
14
15
|
import "./chunk-FO24J6XL.js";
|
|
15
|
-
import "./chunk-XVD3FFOJ.js";
|
|
16
16
|
import "./chunk-EXXTCGKR.js";
|
|
17
|
-
import "./chunk-ZWE3DS7E.js";
|
|
18
17
|
|
|
19
18
|
// src/commands/deploy.ts
|
|
20
19
|
import { defineCommand } from "citty";
|
|
@@ -88,4 +87,4 @@ var deploy_default = defineCommand({
|
|
|
88
87
|
export {
|
|
89
88
|
deploy_default as default
|
|
90
89
|
};
|
|
91
|
-
//# sourceMappingURL=deploy-
|
|
90
|
+
//# sourceMappingURL=deploy-DRZZ3YRB.js.map
|
|
@@ -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":[]}
|