@kalphq/cli 0.0.0-dev-20260513012830 → 0.0.0-dev-20260513145227

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.
Files changed (62) hide show
  1. package/dist/{add-CTF5QIGY.js → add-KTFK7GHV.js} +7 -5
  2. package/dist/{add-CTF5QIGY.js.map → add-KTFK7GHV.js.map} +1 -1
  3. package/dist/{agents-RICTNA5H.js → agents-QLWNNAXD.js} +9 -5
  4. package/dist/agents-QLWNNAXD.js.map +1 -0
  5. package/dist/chunk-5ATINSVP.js +210904 -0
  6. package/dist/chunk-5ATINSVP.js.map +1 -0
  7. package/dist/{chunk-TPG7QMXB.js → chunk-5J2WLD3O.js} +7 -5
  8. package/dist/{chunk-TPG7QMXB.js.map → chunk-5J2WLD3O.js.map} +1 -1
  9. package/dist/chunk-EXXTCGKR.js +77 -0
  10. package/dist/chunk-EXXTCGKR.js.map +1 -0
  11. package/dist/{chunk-FP3ZLBYT.js → chunk-IZXCZ3IA.js} +2 -2
  12. package/dist/{chunk-DHCCSWJN.js → chunk-XVD3FFOJ.js} +37 -104
  13. package/dist/chunk-XVD3FFOJ.js.map +1 -0
  14. package/dist/{chunk-EHNC6ITP.js → chunk-YE2SFYAJ.js} +10 -1
  15. package/dist/chunk-YE2SFYAJ.js.map +1 -0
  16. package/dist/chunk-ZWE3DS7E.js +39 -0
  17. package/dist/chunk-ZWE3DS7E.js.map +1 -0
  18. package/dist/{create-XC55BUCS.js → create-265DBQ72.js} +7 -1
  19. package/dist/create-265DBQ72.js.map +1 -0
  20. package/dist/{delete-BQFFYYWZ.js → delete-5RN5RRDK.js} +7 -5
  21. package/dist/{delete-BQFFYYWZ.js.map → delete-5RN5RRDK.js.map} +1 -1
  22. package/dist/{delete-K5Z552BS.js → delete-AF2GT6S4.js} +12 -16
  23. package/dist/delete-AF2GT6S4.js.map +1 -0
  24. package/dist/{deploy-2JMOUTWG.js → deploy-RWZFKSHR.js} +9 -3
  25. package/dist/deploy-RWZFKSHR.js.map +1 -0
  26. package/dist/{dev-X43HHIYV.js → dev-XI5WA3NA.js} +8 -2
  27. package/dist/dev-XI5WA3NA.js.map +1 -0
  28. package/dist/index.js +10 -9
  29. package/dist/index.js.map +1 -1
  30. package/dist/list-NM727WK3.js +161 -0
  31. package/dist/list-NM727WK3.js.map +1 -0
  32. package/dist/{list-JXR4IULK.js → list-SU5CSX3P.js} +30 -9
  33. package/dist/list-SU5CSX3P.js.map +1 -0
  34. package/dist/{login-MGPA2VYV.js → login-G3RY64KU.js} +2 -1
  35. package/dist/{login-MGPA2VYV.js.map → login-G3RY64KU.js.map} +1 -1
  36. package/dist/{logout-U5V5K775.js → logout-VVQ6OD4D.js} +2 -1
  37. package/dist/{logout-U5V5K775.js.map → logout-VVQ6OD4D.js.map} +1 -1
  38. package/dist/pull-2ODHRCHG.js +84 -0
  39. package/dist/pull-2ODHRCHG.js.map +1 -0
  40. package/dist/{push-WHPQXAY7.js → push-7DIL7IRB.js} +9 -3
  41. package/dist/push-7DIL7IRB.js.map +1 -0
  42. package/dist/{secrets-Z53FLH56.js → secrets-RNM6LSXT.js} +10 -5
  43. package/dist/secrets-RNM6LSXT.js.map +1 -0
  44. package/dist/{sync-RPXLLOTK.js → sync-6EXHV3IT.js} +20 -7
  45. package/dist/sync-6EXHV3IT.js.map +1 -0
  46. package/package.json +4 -4
  47. package/dist/agents-RICTNA5H.js.map +0 -1
  48. package/dist/chunk-DHCCSWJN.js.map +0 -1
  49. package/dist/chunk-EHNC6ITP.js.map +0 -1
  50. package/dist/chunk-MMS3GWBG.js +0 -50
  51. package/dist/chunk-MMS3GWBG.js.map +0 -1
  52. package/dist/create-XC55BUCS.js.map +0 -1
  53. package/dist/delete-K5Z552BS.js.map +0 -1
  54. package/dist/deploy-2JMOUTWG.js.map +0 -1
  55. package/dist/dev-X43HHIYV.js.map +0 -1
  56. package/dist/list-4HHUQLZ2.js +0 -142
  57. package/dist/list-4HHUQLZ2.js.map +0 -1
  58. package/dist/list-JXR4IULK.js.map +0 -1
  59. package/dist/push-WHPQXAY7.js.map +0 -1
  60. package/dist/secrets-Z53FLH56.js.map +0 -1
  61. package/dist/sync-RPXLLOTK.js.map +0 -1
  62. /package/dist/{chunk-FP3ZLBYT.js.map → chunk-IZXCZ3IA.js.map} +0 -0
@@ -1,17 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ filterInternalSecrets,
3
4
  readLocalSecretsFromConfig
4
- } from "./chunk-EHNC6ITP.js";
5
+ } from "./chunk-YE2SFYAJ.js";
5
6
  import {
6
7
  resolveSecretsRuntimeConfigPath
7
- } from "./chunk-FP3ZLBYT.js";
8
+ } from "./chunk-IZXCZ3IA.js";
8
9
  import "./chunk-INB3LG6O.js";
9
10
  import {
10
11
  requireAuth,
11
12
  resolveProvider
12
13
  } from "./chunk-S3KAVLVM.js";
13
14
  import "./chunk-FO24J6XL.js";
14
- import "./chunk-DHCCSWJN.js";
15
+ import "./chunk-XVD3FFOJ.js";
16
+ import "./chunk-EXXTCGKR.js";
17
+ import "./chunk-ZWE3DS7E.js";
15
18
 
16
19
  // src/commands/secrets/list.ts
17
20
  import { defineCommand } from "citty";
@@ -24,6 +27,11 @@ var list_default = defineCommand({
24
27
  description: "List remote runtime secrets"
25
28
  },
26
29
  args: {
30
+ includeInternal: {
31
+ type: "boolean",
32
+ description: "Include internal Kalp runtime secrets (KALP_*)",
33
+ default: false
34
+ },
27
35
  help: {
28
36
  type: "boolean",
29
37
  alias: "h",
@@ -51,8 +59,17 @@ var list_default = defineCommand({
51
59
  provider.listSecrets({ cwd, configPath }),
52
60
  readLocalSecretsFromConfig(cwd)
53
61
  ]);
54
- const remoteNames = remoteSecrets.map((item) => item.name).sort((a, b) => a.localeCompare(b));
55
- const syncedCount = remoteNames.filter((name) => localSecrets.includes(name)).length;
62
+ const remoteNames = filterInternalSecrets(
63
+ remoteSecrets.map((item) => item.name),
64
+ args.includeInternal
65
+ ).sort((a, b) => a.localeCompare(b));
66
+ const localUserSecrets = filterInternalSecrets(
67
+ localSecrets,
68
+ args.includeInternal
69
+ );
70
+ const syncedCount = remoteNames.filter(
71
+ (name) => localUserSecrets.includes(name)
72
+ ).length;
56
73
  spinner2.stop(`Found ${remoteNames.length} remote secrets`);
57
74
  if (remoteNames.length === 0) {
58
75
  p.log.info(pc.dim("No remote secrets found."));
@@ -62,17 +79,21 @@ var list_default = defineCommand({
62
79
  }
63
80
  p.log.info(pc.bold("Remote runtime secrets"));
64
81
  for (const name of remoteNames) {
65
- const synced = localSecrets.includes(name);
82
+ const synced = localUserSecrets.includes(name);
66
83
  const icon = synced ? pc.green("\u2713") : pc.yellow("\u25CB");
67
84
  console.log(` ${icon} ${pc.cyan(name)}`);
68
85
  }
69
86
  if (syncedCount !== remoteNames.length) {
70
- const missingLocal = remoteNames.filter((name) => !localSecrets.includes(name));
87
+ const missingLocal = remoteNames.filter(
88
+ (name) => !localUserSecrets.includes(name)
89
+ );
71
90
  p.log.warn(
72
91
  `Missing in kalp.config.ts: ${missingLocal.map((name) => pc.cyan(name)).join(", ")}`
73
92
  );
74
93
  }
75
- const localOnly = localSecrets.filter((name) => !remoteNames.includes(name));
94
+ const localOnly = localUserSecrets.filter(
95
+ (name) => !remoteNames.includes(name)
96
+ );
76
97
  if (localOnly.length > 0) {
77
98
  p.log.warn(
78
99
  `Local-only secrets (not remote): ${localOnly.map((name) => pc.cyan(name)).join(", ")}`
@@ -89,4 +110,4 @@ var list_default = defineCommand({
89
110
  export {
90
111
  list_default as default
91
112
  };
92
- //# sourceMappingURL=list-JXR4IULK.js.map
113
+ //# sourceMappingURL=list-SU5CSX3P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport {\n filterInternalSecrets,\n readLocalSecretsFromConfig,\n} from \"@/utils/secrets-config\";\nimport { resolveSecretsRuntimeConfigPath } from \"@/utils/secrets-runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List remote runtime secrets\",\n },\n args: {\n includeInternal: {\n type: \"boolean\",\n description: \"Include internal Kalp runtime secrets (KALP_*)\",\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 list`);\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets 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 secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = filterInternalSecrets(\n remoteSecrets.map((item) => item.name),\n args.includeInternal,\n ).sort((a, b) => a.localeCompare(b));\n const localUserSecrets = filterInternalSecrets(\n localSecrets,\n args.includeInternal,\n );\n const syncedCount = remoteNames.filter((name) =>\n localUserSecrets.includes(name),\n ).length;\n spinner.stop(`Found ${remoteNames.length} remote secrets`);\n\n if (remoteNames.length === 0) {\n p.log.info(pc.dim(\"No remote secrets found.\"));\n p.log.info(pc.dim(`Add one with ${pc.cyan(\"kalp secrets add -k KEY -v VALUE\")}`));\n p.outro(\"Done\");\n return;\n }\n\n p.log.info(pc.bold(\"Remote runtime secrets\"));\n for (const name of remoteNames) {\n const synced = localUserSecrets.includes(name);\n const icon = synced ? pc.green(\"✓\") : pc.yellow(\"○\");\n console.log(` ${icon} ${pc.cyan(name)}`);\n }\n\n if (syncedCount !== remoteNames.length) {\n const missingLocal = remoteNames.filter(\n (name) => !localUserSecrets.includes(name),\n );\n p.log.warn(\n `Missing in kalp.config.ts: ${missingLocal.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n }\n\n const localOnly = localUserSecrets.filter(\n (name) => !remoteNames.includes(name),\n );\n if (localOnly.length > 0) {\n p.log.warn(\n `Local-only secrets (not remote): ${localOnly.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n }\n\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Failed to load secrets\");\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"]}
@@ -4,6 +4,7 @@ import {
4
4
  saveAuthConfig
5
5
  } from "./chunk-S3KAVLVM.js";
6
6
  import "./chunk-FO24J6XL.js";
7
+ import "./chunk-ZWE3DS7E.js";
7
8
 
8
9
  // src/commands/login.ts
9
10
  import { defineCommand } from "citty";
@@ -56,4 +57,4 @@ var login_default = defineCommand({
56
57
  export {
57
58
  login_default as default
58
59
  };
59
- //# sourceMappingURL=login-MGPA2VYV.js.map
60
+ //# sourceMappingURL=login-G3RY64KU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Sign in to remote runtime\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = resolveProvider();\n const proceed = await p.confirm({\n message: \"Sign in to remote runtime now?\",\n initialValue: true,\n });\n if (p.isCancel(proceed) || !proceed) {\n p.outro(\"Cancelled\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening sign-in flow\");\n\n try {\n await provider.login();\n } catch {\n s.stop(pc.red(\"Sign-in failed\"));\n process.exit(1);\n }\n\n s.stop(\"Sign-in complete\");\n s.start(\"Reading runtime identity\");\n const identity = await provider.whoami();\n const accountId = identity?.accountId;\n const email = identity?.email;\n\n if (!accountId || !email) {\n s.stop(pc.red(\"Could not resolve account identity from wrangler whoami\"));\n process.exit(1);\n }\n\n const authConfig: AuthConfig = {\n provider: \"cloudflare\",\n accountId,\n email,\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await saveAuthConfig(authConfig);\n\n s.stop(\"Authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Workspace ID: ${pc.cyan(authConfig.accountId)}`, \"Runtime\");\n p.outro(pc.green(\"Ready to deploy your agents\"));\n },\n});\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,4BAA4B;AAAA,EAChE,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,WAAW,gBAAgB;AACjC,UAAM,UAAU,MAAQ,UAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,OAAO,KAAK,CAAC,SAAS;AACnC,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,sBAAsB;AAE9B,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,IACvB,QAAQ;AACN,QAAE,KAAK,GAAG,IAAI,gBAAgB,CAAC;AAC/B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,kBAAkB;AACzB,MAAE,MAAM,0BAA0B;AAClC,UAAM,WAAW,MAAM,SAAS,OAAO;AACvC,UAAM,YAAY,UAAU;AAC5B,UAAM,QAAQ,UAAU;AAExB,QAAI,CAAC,aAAa,CAAC,OAAO;AACxB,QAAE,KAAK,GAAG,IAAI,yDAAyD,CAAC;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAyB;AAAA,MAC7B,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM,eAAe,UAAU;AAE/B,MAAE,KAAK,sBAAsB;AAC7B,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,WAAW,KAAK,CAAC,EAAE;AACzD,IAAE,OAAK,iBAAiB,GAAG,KAAK,WAAW,SAAS,CAAC,IAAI,SAAS;AAClE,IAAE,QAAM,GAAG,MAAM,6BAA6B,CAAC;AAAA,EACjD;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport {\n saveAuthConfig,\n type AuthConfig,\n} from \"@/utils/auth\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Sign in to remote runtime\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp login\")}`);\n\n const provider = resolveProvider();\n const proceed = await p.confirm({\n message: \"Sign in to remote runtime now?\",\n initialValue: true,\n });\n if (p.isCancel(proceed) || !proceed) {\n p.outro(\"Cancelled\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Opening sign-in flow\");\n\n try {\n await provider.login();\n } catch {\n s.stop(pc.red(\"Sign-in failed\"));\n process.exit(1);\n }\n\n s.stop(\"Sign-in complete\");\n s.start(\"Reading runtime identity\");\n const identity = await provider.whoami();\n const accountId = identity?.accountId;\n const email = identity?.email;\n\n if (!accountId || !email) {\n s.stop(pc.red(\"Could not resolve account identity from wrangler whoami\"));\n process.exit(1);\n }\n\n const authConfig: AuthConfig = {\n provider: \"cloudflare\",\n accountId,\n email,\n expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n };\n\n await saveAuthConfig(authConfig);\n\n s.stop(\"Authentication saved\");\n p.log.success(`Logged in as ${pc.cyan(authConfig.email)}`);\n p.note(`Workspace ID: ${pc.cyan(authConfig.accountId)}`, \"Runtime\");\n p.outro(pc.green(\"Ready to deploy your agents\"));\n },\n});\n"],"mappings":";;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAOf,IAAM,OAAO;AAEb,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,4BAA4B;AAAA,EAChE,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;AAE1C,UAAM,WAAW,gBAAgB;AACjC,UAAM,UAAU,MAAQ,UAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,OAAO,KAAK,CAAC,SAAS;AACnC,MAAE,QAAM,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,sBAAsB;AAE9B,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,IACvB,QAAQ;AACN,QAAE,KAAK,GAAG,IAAI,gBAAgB,CAAC;AAC/B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,MAAE,KAAK,kBAAkB;AACzB,MAAE,MAAM,0BAA0B;AAClC,UAAM,WAAW,MAAM,SAAS,OAAO;AACvC,UAAM,YAAY,UAAU;AAC5B,UAAM,QAAQ,UAAU;AAExB,QAAI,CAAC,aAAa,CAAC,OAAO;AACxB,QAAE,KAAK,GAAG,IAAI,yDAAyD,CAAC;AACxE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAyB;AAAA,MAC7B,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IACzE;AAEA,UAAM,eAAe,UAAU;AAE/B,MAAE,KAAK,sBAAsB;AAC7B,IAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,WAAW,KAAK,CAAC,EAAE;AACzD,IAAE,OAAK,iBAAiB,GAAG,KAAK,WAAW,SAAS,CAAC,IAAI,SAAS;AAClE,IAAE,QAAM,GAAG,MAAM,6BAA6B,CAAC;AAAA,EACjD;AACF,CAAC;","names":[]}
@@ -2,6 +2,7 @@
2
2
  import {
3
3
  getGlobalConfigDir
4
4
  } from "./chunk-FO24J6XL.js";
5
+ import "./chunk-ZWE3DS7E.js";
5
6
 
6
7
  // src/commands/logout.ts
7
8
  import { defineCommand } from "citty";
@@ -29,4 +30,4 @@ var logout_default = defineCommand({
29
30
  export {
30
31
  logout_default as default
31
32
  };
32
- //# sourceMappingURL=logout-U5V5K775.js.map
33
+ //# sourceMappingURL=logout-VVQ6OD4D.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getGlobalConfigDir } from \"@/utils/config\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp logout\")}`);\n\n const s = p.spinner();\n s.start(\"Signing out...\");\n\n try {\n await rm(join(getGlobalConfigDir(), \"auth.json\"), { force: true });\n s.stop(\"Signed out successfully\");\n p.outro(pc.green(\"Logged out from Kalp\"));\n } catch {\n s.stop(\"Nothing to do\");\n p.outro(pc.dim(\"No active session found\"));\n }\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU;AACnB,SAAS,YAAY;AAGrB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,mBAAmB,GAAG,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AACjE,QAAE,KAAK,yBAAyB;AAChC,MAAE,QAAM,GAAG,MAAM,sBAAsB,CAAC;AAAA,IAC1C,QAAQ;AACN,QAAE,KAAK,eAAe;AACtB,MAAE,QAAM,GAAG,IAAI,yBAAyB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/commands/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getGlobalConfigDir } from \"@/utils/config\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Sign out from Kalp\" },\n async run() {\n p.intro(`${LOGO} ${pc.bold(\"kalp logout\")}`);\n\n const s = p.spinner();\n s.start(\"Signing out...\");\n\n try {\n await rm(join(getGlobalConfigDir(), \"auth.json\"), { force: true });\n s.stop(\"Signed out successfully\");\n p.outro(pc.green(\"Logged out from Kalp\"));\n } catch {\n s.stop(\"Nothing to do\");\n p.outro(pc.dim(\"No active session found\"));\n }\n },\n});\n"],"mappings":";;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,UAAU;AACnB,SAAS,YAAY;AAGrB,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAC1D,MAAM,MAAM;AACV,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,IAAM,UAAQ;AACpB,MAAE,MAAM,gBAAgB;AAExB,QAAI;AACF,YAAM,GAAG,KAAK,mBAAmB,GAAG,WAAW,GAAG,EAAE,OAAO,KAAK,CAAC;AACjE,QAAE,KAAK,yBAAyB;AAChC,MAAE,QAAM,GAAG,MAAM,sBAAsB,CAAC;AAAA,IAC1C,QAAQ;AACN,QAAE,KAAK,eAAe;AACtB,MAAE,QAAM,GAAG,IAAI,yBAAyB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ generateTypes
4
+ } from "./chunk-5ATINSVP.js";
5
+ import {
6
+ filterInternalSecrets,
7
+ mergeSecrets,
8
+ readLocalSecretsFromConfig,
9
+ writeLocalSecretsToConfig
10
+ } from "./chunk-YE2SFYAJ.js";
11
+ import {
12
+ resolveSecretsRuntimeConfigPath
13
+ } from "./chunk-IZXCZ3IA.js";
14
+ import "./chunk-INB3LG6O.js";
15
+ import {
16
+ requireAuth,
17
+ resolveProvider
18
+ } from "./chunk-S3KAVLVM.js";
19
+ import "./chunk-FO24J6XL.js";
20
+ import "./chunk-XVD3FFOJ.js";
21
+ import "./chunk-EXXTCGKR.js";
22
+ import "./chunk-ZWE3DS7E.js";
23
+
24
+ // src/commands/secrets/pull.ts
25
+ import { defineCommand } from "citty";
26
+ import * as p from "@clack/prompts";
27
+ import pc from "picocolors";
28
+ var LOGO = "\u{1F98B}";
29
+ var pull_default = defineCommand({
30
+ meta: {
31
+ name: "pull",
32
+ description: "Pull remote secrets into local kalp.config.ts"
33
+ },
34
+ args: {
35
+ includeInternal: {
36
+ type: "boolean",
37
+ description: "Include internal Kalp runtime secrets (KALP_*)",
38
+ default: false
39
+ }
40
+ },
41
+ async run({ args }) {
42
+ const cwd = process.cwd();
43
+ p.intro(`${LOGO} ${pc.bold("kalp secrets pull")}`);
44
+ await requireAuth().catch(() => {
45
+ p.log.error("Not authenticated. Run `kalp login` first.");
46
+ process.exit(1);
47
+ });
48
+ const spinner2 = p.spinner();
49
+ spinner2.start("Reading remote secrets");
50
+ try {
51
+ const configPath = await resolveSecretsRuntimeConfigPath(cwd);
52
+ const provider = resolveProvider();
53
+ const [remoteSecrets, localSecrets] = await Promise.all([
54
+ provider.listSecrets({ cwd, configPath }),
55
+ readLocalSecretsFromConfig(cwd)
56
+ ]);
57
+ const remoteNames = filterInternalSecrets(
58
+ remoteSecrets.map((secret) => secret.name),
59
+ args.includeInternal
60
+ );
61
+ const merged = mergeSecrets(localSecrets, remoteNames);
62
+ const added = merged.filter((name) => !localSecrets.includes(name));
63
+ await writeLocalSecretsToConfig(cwd, merged);
64
+ await generateTypes(cwd);
65
+ spinner2.stop(`Pulled ${remoteNames.length} remote secrets`);
66
+ if (added.length > 0) {
67
+ p.log.success(
68
+ `Added to local config: ${added.map((name) => pc.cyan(name)).join(", ")}`
69
+ );
70
+ } else {
71
+ p.log.info(pc.dim("Local config already up to date."));
72
+ }
73
+ p.outro("Done");
74
+ } catch (error) {
75
+ spinner2.stop("Pull failed");
76
+ p.log.error(error instanceof Error ? error.message : String(error));
77
+ process.exit(1);
78
+ }
79
+ }
80
+ });
81
+ export {
82
+ pull_default as default
83
+ };
84
+ //# sourceMappingURL=pull-2ODHRCHG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/pull.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 filterInternalSecrets,\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: \"pull\",\n description: \"Pull remote secrets into local kalp.config.ts\",\n },\n args: {\n includeInternal: {\n type: \"boolean\",\n description: \"Include internal Kalp runtime secrets (KALP_*)\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets pull\")}`);\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(\"Reading remote secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = filterInternalSecrets(\n remoteSecrets.map((secret) => secret.name),\n args.includeInternal,\n );\n const merged = mergeSecrets(localSecrets, remoteNames);\n const added = merged.filter((name) => !localSecrets.includes(name));\n\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Pulled ${remoteNames.length} remote secrets`);\n if (added.length > 0) {\n p.log.success(\n `Added to local config: ${added.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n } else {\n p.log.info(pc.dim(\"Local config already up to date.\"));\n }\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Pull failed\");\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;AAYf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,mBAAmB,CAAC,EAAE;AAEjD,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,wBAAwB;AAEtC,QAAI;AACF,YAAM,aAAa,MAAM,gCAAgC,GAAG;AAC5D,YAAM,WAAW,gBAAgB;AACjC,YAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACtD,SAAS,YAAY,EAAE,KAAK,WAAW,CAAC;AAAA,QACxC,2BAA2B,GAAG;AAAA,MAChC,CAAC;AAED,YAAM,cAAc;AAAA,QAClB,cAAc,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,QACzC,KAAK;AAAA,MACP;AACA,YAAM,SAAS,aAAa,cAAc,WAAW;AACrD,YAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,SAAS,IAAI,CAAC;AAElE,YAAM,0BAA0B,KAAK,MAAM;AAC3C,YAAM,cAAc,GAAG;AAEvB,MAAAA,SAAQ,KAAK,UAAU,YAAY,MAAM,iBAAiB;AAC1D,UAAI,MAAM,SAAS,GAAG;AACpB,QAAE,MAAI;AAAA,UACJ,0BAA0B,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACzE;AAAA,MACF,OAAO;AACL,QAAE,MAAI,KAAK,GAAG,IAAI,kCAAkC,CAAC;AAAA,MACvD;AACA,MAAE,QAAM,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,aAAa;AAC1B,MAAE,MAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["spinner"]}
@@ -8,8 +8,11 @@ import {
8
8
  promptDeployTarget,
9
9
  runInitialDeploy,
10
10
  showKalpCloudWaitlist
11
- } from "./chunk-TPG7QMXB.js";
11
+ } from "./chunk-5J2WLD3O.js";
12
12
  import "./chunk-NV2IZ4XM.js";
13
+ import {
14
+ generateTypes
15
+ } from "./chunk-5ATINSVP.js";
13
16
  import {
14
17
  ensureConfig
15
18
  } from "./chunk-INB3LG6O.js";
@@ -23,7 +26,9 @@ import {
23
26
  readLocalAgentNames,
24
27
  readProjectState,
25
28
  writeProjectState
26
- } from "./chunk-DHCCSWJN.js";
29
+ } from "./chunk-XVD3FFOJ.js";
30
+ import "./chunk-EXXTCGKR.js";
31
+ import "./chunk-ZWE3DS7E.js";
27
32
 
28
33
  // src/commands/push.ts
29
34
  import { access, mkdir as mkdir2, rm, writeFile as writeFile2 } from "fs/promises";
@@ -221,6 +226,7 @@ var push_default = defineCommand({
221
226
  p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
222
227
  process.exit(1);
223
228
  });
229
+ await generateTypes(cwd);
224
230
  const availableAgents = await readLocalAgentNames(cwd);
225
231
  if (availableAgents.length === 0) {
226
232
  p.log.error("No local agents found in ./agents");
@@ -397,4 +403,4 @@ var push_default = defineCommand({
397
403
  export {
398
404
  push_default as default
399
405
  };
400
- //# sourceMappingURL=push-WHPQXAY7.js.map
406
+ //# sourceMappingURL=push-7DIL7IRB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/push.ts","../src/utils/ir/export.ts"],"sourcesContent":["import { access, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { ensureConfig } from \"@/utils/fs\";\nimport { generateTypes } from \"@/utils/codegen\";\nimport { readAgentManifest, computePushHash } from \"@/utils/manifest\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\nimport {\n type ProjectAgentState,\n type ProjectState,\n readProjectState,\n writeProjectState,\n} from \"@/utils/project-state\";\nimport { validateCompiledIR } from \"@/utils/validate\";\nimport { materializeRuntime, readLocalAgentNames } from \"@/utils/runtime\";\nimport { resolveProvider } from \"@/utils/providers\";\nimport { exportCompiledIrForDebug } from \"@/utils/ir/export\";\nimport {\n promptDeployTarget,\n showKalpCloudWaitlist,\n} from \"@/utils/deploy-target\";\n\nconst LOGO = \"🦋\";\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n return `${(bytes / 1024).toFixed(1)} KB`;\n}\n\nfunction createInitialState(): ProjectState {\n return {\n workerUrl: null,\n deployedAt: null,\n accountId: null,\n studioCredentialsFingerprint: null,\n serviceKeyFingerprint: null,\n agents: {},\n };\n}\n\nfunction ensureAgentState(\n state: ProjectState,\n agentName: string,\n localPath: string,\n): ProjectAgentState {\n const existing = state.agents[agentName];\n if (existing) {\n existing.localPath = localPath;\n return existing;\n }\n\n const created: ProjectAgentState = {\n currentHash: null,\n currentVersion: 0,\n lastLocalHash: null,\n lastRemoteHash: null,\n lastPushedAt: null,\n localPath,\n workerUrl: state.workerUrl\n ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`\n : null,\n };\n state.agents[agentName] = created;\n return created;\n}\n\ntype PushTarget = \"local\" | \"remote\";\n\ninterface PushResult {\n pushed: number;\n skipped: number;\n failed: number;\n}\n\ninterface RemoteAgentIndexEntry {\n name: string;\n hash: string;\n version: string | null;\n versionNumber: number | null;\n updatedAt: string;\n workerUrl: string | null;\n label?: string;\n tags?: string[];\n}\n\ninterface PruneResult {\n removedAgents: string[];\n deletedKeys: number;\n}\n\nasync function readRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n): Promise<RemoteAgentIndexEntry[]> {\n const provider = resolveProvider();\n const output = await provider\n .getValue({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n })\n .catch(() => null);\n if (!output) return [];\n try {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed as RemoteAgentIndexEntry[];\n } catch {\n return [];\n }\n}\n\nasync function writeRemoteAgentsIndex(\n cwd: string,\n wranglerConfigPath: string,\n entries: RemoteAgentIndexEntry[],\n): Promise<void> {\n const path = join(cwd, \".kalp\", \"agents-index.json\");\n await writeFile(path, JSON.stringify(entries, null, 2), \"utf-8\");\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: \"agents:index\",\n jsonPath: path,\n });\n } finally {\n await rm(path, { force: true });\n }\n}\n\nasync function pruneStaleRemoteAgents(params: {\n cwd: string;\n wranglerConfigPath: string;\n remoteEntries: RemoteAgentIndexEntry[];\n localAgentNames: string[];\n}): Promise<PruneResult> {\n const { cwd, wranglerConfigPath, remoteEntries, localAgentNames } = params;\n const localSet = new Set(localAgentNames);\n const staleEntries = remoteEntries.filter(\n (entry) => !localSet.has(entry.name),\n );\n\n if (staleEntries.length === 0) {\n return { removedAgents: [], deletedKeys: 0 };\n }\n\n const preview = staleEntries\n .slice(0, 3)\n .map((entry) => entry.name)\n .join(\", \");\n const suffix =\n staleEntries.length > 3 ? ` and ${staleEntries.length - 3} more` : \"\";\n const confirmation = await p.confirm({\n message: `Found ${staleEntries.length} stale remote agents that no longer exist locally (e.g., ${pc.cyan(preview)}${suffix}). Do you want to prune them from the remote runtime?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmation)) {\n p.outro(\"Cancelled\");\n process.exit(0);\n }\n\n if (!confirmation) {\n return { removedAgents: [], deletedKeys: 0 };\n }\n\n const provider = resolveProvider();\n let deletedKeys = 0;\n\n for (const entry of staleEntries) {\n const latestKey = `${entry.name}:latest`;\n const latestHash = await provider\n .getValue({ cwd, configPath: wranglerConfigPath, key: latestKey })\n .catch(() => null);\n\n const hashes = new Set<string>();\n if (entry.hash) hashes.add(entry.hash);\n if (latestHash) hashes.add(latestHash);\n\n const latestDeleted = await provider\n .deleteValue({\n cwd,\n configPath: wranglerConfigPath,\n key: latestKey,\n })\n .then(() => true)\n .catch(() => false);\n if (latestDeleted) deletedKeys += 1;\n\n for (const hash of hashes) {\n const deleted = await provider\n .deleteValue({\n cwd,\n configPath: wranglerConfigPath,\n key: `${entry.name}:${hash}`,\n })\n .then(() => true)\n .catch(() => false);\n if (deleted) deletedKeys += 1;\n }\n }\n\n const filtered = remoteEntries.filter((entry) => localSet.has(entry.name));\n await writeRemoteAgentsIndex(cwd, wranglerConfigPath, filtered);\n\n return {\n removedAgents: staleEntries\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b)),\n deletedKeys,\n };\n}\n\nasync function mergeRemoteAgentIndexEntry(params: {\n cwd: string;\n wranglerConfigPath: string;\n entry: RemoteAgentIndexEntry;\n}): Promise<void> {\n const { cwd, wranglerConfigPath, entry } = params;\n const currentIndex = await readRemoteAgentsIndex(cwd, wranglerConfigPath);\n const merged = [\n ...currentIndex.filter((existing) => existing.name !== entry.name),\n entry,\n ].sort((a, b) => a.name.localeCompare(b.name));\n\n await writeRemoteAgentsIndex(cwd, wranglerConfigPath, merged);\n}\n\nasync function pushRemoteManifest(params: {\n cwd: string;\n wranglerConfigPath: string;\n agentName: string;\n hash: string;\n ir: unknown;\n}): Promise<void> {\n const { cwd, wranglerConfigPath, agentName, hash, ir } = params;\n const manifestKey = `${agentName}:${hash}`;\n const latestKey = `${agentName}:latest`;\n const manifestPath = join(cwd, \".kalp\", `${agentName}-${hash}.json`);\n await mkdir(join(cwd, \".kalp\"), { recursive: true });\n await writeFile(manifestPath, JSON.stringify(ir), \"utf-8\");\n\n const provider = resolveProvider();\n try {\n await provider.putManifest({\n cwd,\n configPath: wranglerConfigPath,\n key: manifestKey,\n jsonPath: manifestPath,\n });\n await provider.putValue({\n cwd,\n configPath: wranglerConfigPath,\n key: latestKey,\n value: hash,\n });\n } finally {\n await rm(manifestPath, { force: true });\n }\n}\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Upload updated agents\" },\n args: {\n agent: {\n type: \"string\",\n alias: \"a\",\n description: \"Agent name to push\",\n required: false,\n },\n local: {\n type: \"boolean\",\n description: \"Update only local runtime snapshot and state\",\n required: false,\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n const target: PushTarget = args.local ? \"local\" : \"remote\";\n const isBulkPush = !args.agent;\n\n p.intro(`${LOGO} ${pc.bold(\"kalp push\")}`);\n\n await ensureConfig(cwd).catch(() => {\n p.log.error(`${pc.cyan(\"kalp.config.ts\")} not found`);\n process.exit(1);\n });\n await generateTypes(cwd);\n\n const availableAgents = await readLocalAgentNames(cwd);\n if (availableAgents.length === 0) {\n p.log.error(\"No local agents found in ./agents\");\n process.exit(1);\n }\n\n let selectedAgents: string[] = [];\n if (args.agent) {\n if (!availableAgents.includes(args.agent)) {\n p.log.error(`Agent ${pc.cyan(args.agent)} not found`);\n process.exit(1);\n }\n selectedAgents = [args.agent];\n } else {\n selectedAgents = availableAgents;\n }\n\n let state = (await readProjectState(cwd)) ?? createInitialState();\n let runtime = await materializeRuntime(cwd, { mode: target });\n\n if (target === \"remote\") {\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n if (!state.workerUrl) {\n const target = await promptDeployTarget(\n \"No remote runtime detected yet. Where do you want to deploy?\",\n );\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 const s = p.spinner();\n s.start(\"Running initial deploy\");\n const deploy = await runInitialDeploy(cwd);\n s.stop(\"Initial deploy completed\");\n state = (await readProjectState(cwd)) ?? createInitialState();\n state.workerUrl = deploy.workerUrl;\n state.accountId = deploy.accountId;\n state.deployedAt = new Date().toISOString();\n }\n\n runtime = await materializeRuntime(cwd, { mode: \"remote\" });\n\n if (isBulkPush) {\n const currentIndex = await readRemoteAgentsIndex(\n cwd,\n runtime.wranglerConfigPath,\n );\n const prune = await pruneStaleRemoteAgents({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n remoteEntries: currentIndex,\n localAgentNames: availableAgents,\n });\n\n if (prune.removedAgents.length > 0) {\n p.log.info(\n `Pruned stale remote agents: ${pc.cyan(prune.removedAgents.join(\", \"))} ${pc.dim(`(${prune.deletedKeys} keys cleaned)`)}`,\n );\n }\n }\n }\n\n const spinner = p.spinner();\n const result: PushResult = { pushed: 0, skipped: 0, failed: 0 };\n const failures: string[] = [];\n\n for (const agentName of selectedAgents) {\n const agentPath = join(cwd, \"agents\", agentName, \"index.ts\");\n await access(agentPath).catch(() => {\n failures.push(`${agentName}: missing ${agentPath}`);\n });\n\n try {\n spinner.start(`Compiling ${pc.cyan(agentName)}`);\n const manifest = await readAgentManifest({ cwd, agentName });\n const hash = computePushHash(manifest.ir);\n const validation = validateCompiledIR({\n agentName,\n ir: manifest.ir,\n hash,\n });\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 agentState = ensureAgentState(state, agentName, agentPath);\n const previousHash =\n target === \"local\"\n ? agentState.lastLocalHash\n : agentState.lastRemoteHash;\n\n if (previousHash === hash) {\n result.skipped += 1;\n spinner.stop(`Skipped ${pc.cyan(agentName)} (no changes)`);\n continue;\n }\n\n if (target === \"remote\") {\n spinner.message(`Uploading agent ${pc.cyan(agentName)} to remote runtime`);\n await pushRemoteManifest({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n agentName,\n hash,\n ir: manifest.ir,\n });\n }\n\n agentState.currentVersion = Math.max(0, agentState.currentVersion) + 1;\n agentState.currentHash = hash;\n agentState.lastPushedAt = new Date().toISOString();\n agentState.workerUrl =\n state.workerUrl && target === \"remote\"\n ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}`\n : agentState.workerUrl;\n\n if (target === \"local\") {\n agentState.lastLocalHash = hash;\n } else {\n agentState.lastRemoteHash = hash;\n agentState.lastLocalHash = hash;\n\n const nextEntry: RemoteAgentIndexEntry = {\n name: agentName,\n hash,\n version: `v${agentState.currentVersion}`,\n versionNumber: agentState.currentVersion,\n updatedAt: agentState.lastPushedAt,\n workerUrl: agentState.workerUrl,\n label: manifest.ir.metadata?.label,\n tags: manifest.ir.metadata?.tags,\n };\n await mergeRemoteAgentIndexEntry({\n cwd,\n wranglerConfigPath: runtime.wranglerConfigPath,\n entry: nextEntry,\n });\n }\n\n const bundles = manifest.ir.bundles || {};\n await exportCompiledIrForDebug({\n cwd,\n agentName,\n ir: manifest.ir,\n });\n const totalSize = Object.values(bundles).reduce(\n (sum, bundle) => sum + Buffer.byteLength(bundle.code),\n 0,\n );\n const handlerCount = Object.keys(bundles).length;\n spinner.stop(\n `${pc.bold(agentName)} pushed ${pc.dim(`(v${agentState.currentVersion})`)} · ${handlerCount} handlers · ${formatBytes(totalSize)}`,\n );\n result.pushed += 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n failures.push(`${agentName}: ${message}`);\n spinner.stop(`Failed ${pc.cyan(agentName)}`);\n result.failed += 1;\n }\n }\n\n await writeProjectState(cwd, state);\n await materializeRuntime(cwd, { mode: target });\n\n p.note(\n `Successfully pushed ${result.pushed} agents. ${result.skipped} omitted (no changes). ${result.failed} failed.`,\n target === \"local\" ? \"Local push\" : \"Remote push\",\n );\n if (target === \"remote\" && result.pushed > 0) {\n p.log.info(\n pc.dim(\n \"Changes propagating to remote Studio (eventual consistency, up to ~60s).\",\n ),\n );\n }\n\n if (failures.length > 0) {\n for (const failure of failures) {\n p.log.error(failure);\n }\n p.outro(`${LOGO} ${pc.red(\"Push completed with failures\")}`);\n process.exit(1);\n }\n\n p.outro(`${LOGO} ${pc.green(\"Push complete\")}`);\n },\n});\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/**\n * TODO remove after SaaS observability: debug IR export for local inspection.\n */\nexport async function exportCompiledIrForDebug(params: {\n cwd: string;\n agentName: string;\n ir: unknown;\n}): Promise<string> {\n const { cwd, agentName, ir } = params;\n const outDir = join(cwd, \".kalp\", \"exports\", agentName);\n await mkdir(outDir, { recursive: true });\n const outputPath = join(outDir, \"ir.json\");\n await writeFile(outputPath, `${JSON.stringify(ir, null, 2)}\\n`, \"utf-8\");\n return outputPath;\n}\n"],"mappings":"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","names":["mkdir","writeFile","join","join","writeFile","mkdir","target","spinner"]}
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import "./chunk-ZWE3DS7E.js";
2
3
 
3
4
  // src/commands/secrets/index.ts
4
5
  import { defineCommand } from "citty";
@@ -19,10 +20,11 @@ var secrets_default = defineCommand({
19
20
  }
20
21
  },
21
22
  subCommands: {
22
- list: () => import("./list-JXR4IULK.js").then((r) => r.default),
23
- add: () => import("./add-CTF5QIGY.js").then((r) => r.default),
24
- delete: () => import("./delete-BQFFYYWZ.js").then((r) => r.default),
25
- sync: () => import("./sync-RPXLLOTK.js").then((r) => r.default)
23
+ list: () => import("./list-SU5CSX3P.js").then((r) => r.default),
24
+ add: () => import("./add-KTFK7GHV.js").then((r) => r.default),
25
+ delete: () => import("./delete-5RN5RRDK.js").then((r) => r.default),
26
+ sync: () => import("./sync-6EXHV3IT.js").then((r) => r.default),
27
+ pull: () => import("./pull-2ODHRCHG.js").then((r) => r.default)
26
28
  },
27
29
  run({ args }) {
28
30
  if (!args.help) {
@@ -36,6 +38,9 @@ var secrets_default = defineCommand({
36
38
  p.log.message(
37
39
  ` ${pc.cyan("sync")} Merge remote secrets into local config`
38
40
  );
41
+ p.log.message(
42
+ ` ${pc.cyan("pull")} Alias of sync (remote -> local merge)`
43
+ );
39
44
  p.log.message("");
40
45
  p.log.message(
41
46
  `Run ${pc.cyan("kalp secrets <subcommand> --help")} for more info.`
@@ -46,4 +51,4 @@ var secrets_default = defineCommand({
46
51
  export {
47
52
  secrets_default as default
48
53
  };
49
- //# sourceMappingURL=secrets-Z53FLH56.js.map
54
+ //# sourceMappingURL=secrets-RNM6LSXT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/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: \"secrets\",\n description: \"Manage remote runtime secrets\",\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 add: () => import(\"./add\").then((r) => r.default),\n delete: () => import(\"./delete\").then((r) => r.default),\n sync: () => import(\"./sync\").then((r) => r.default),\n pull: () => import(\"./pull\").then((r) => r.default),\n },\n run({ args }) {\n if (!args.help) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} List secrets from remote runtime`);\n p.log.message(` ${pc.cyan(\"add\")} Add a secret to remote runtime`);\n p.log.message(` ${pc.cyan(\"delete\")} Delete a secret from remote runtime`);\n p.log.message(\n ` ${pc.cyan(\"sync\")} Merge remote secrets into local config`,\n );\n p.log.message(\n ` ${pc.cyan(\"pull\")} Alias of sync (remote -> local merge)`,\n );\n p.log.message(\"\");\n p.log.message(\n `Run ${pc.cyan(\"kalp secrets <subcommand> --help\")} for more info.`,\n );\n p.outro(pc.dim(\"Done\"));\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAEf,IAAM,OAAO;AAEb,IAAO,kBAAQ,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,KAAK,MAAM,OAAO,mBAAO,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAChD,QAAQ,MAAM,OAAO,sBAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACtD,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAClD,MAAM,MAAM,OAAO,oBAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACpD;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AAEA,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,cAAc,CAAC,EAAE;AAC5C,IAAE,MAAI,QAAQ,GAAG,KAAK,wBAAwB,CAAC;AAC/C,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,MAAM,CAAC,qCAAqC;AACvE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,KAAK,CAAC,oCAAoC;AACrE,IAAE,MAAI,QAAQ,KAAK,GAAG,KAAK,QAAQ,CAAC,sCAAsC;AAC1E,IAAE,MAAI;AAAA,MACJ,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IACtB;AACA,IAAE,MAAI;AAAA,MACJ,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IACtB;AACA,IAAE,MAAI,QAAQ,EAAE;AAChB,IAAE,MAAI;AAAA,MACJ,OAAO,GAAG,KAAK,kCAAkC,CAAC;AAAA,IACpD;AACA,IAAE,QAAM,GAAG,IAAI,MAAM,CAAC;AAAA,EACxB;AACF,CAAC;","names":[]}
@@ -1,22 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateTypes
4
- } from "./chunk-MMS3GWBG.js";
4
+ } from "./chunk-5ATINSVP.js";
5
5
  import {
6
+ filterInternalSecrets,
6
7
  mergeSecrets,
7
8
  readLocalSecretsFromConfig,
8
9
  writeLocalSecretsToConfig
9
- } from "./chunk-EHNC6ITP.js";
10
+ } from "./chunk-YE2SFYAJ.js";
10
11
  import {
11
12
  resolveSecretsRuntimeConfigPath
12
- } from "./chunk-FP3ZLBYT.js";
13
+ } from "./chunk-IZXCZ3IA.js";
13
14
  import "./chunk-INB3LG6O.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-DHCCSWJN.js";
20
+ import "./chunk-XVD3FFOJ.js";
21
+ import "./chunk-EXXTCGKR.js";
22
+ import "./chunk-ZWE3DS7E.js";
20
23
 
21
24
  // src/commands/secrets/sync.ts
22
25
  import { defineCommand } from "citty";
@@ -28,7 +31,14 @@ var sync_default = defineCommand({
28
31
  name: "sync",
29
32
  description: "Merge remote secrets into local kalp.config.ts"
30
33
  },
31
- async run() {
34
+ args: {
35
+ includeInternal: {
36
+ type: "boolean",
37
+ description: "Include internal Kalp runtime secrets (KALP_*)",
38
+ default: false
39
+ }
40
+ },
41
+ async run({ args }) {
32
42
  const cwd = process.cwd();
33
43
  p.intro(`${LOGO} ${pc.bold("kalp secrets sync")}`);
34
44
  await requireAuth().catch(() => {
@@ -44,7 +54,10 @@ var sync_default = defineCommand({
44
54
  provider.listSecrets({ cwd, configPath }),
45
55
  readLocalSecretsFromConfig(cwd)
46
56
  ]);
47
- const remoteNames = remoteSecrets.map((secret) => secret.name);
57
+ const remoteNames = filterInternalSecrets(
58
+ remoteSecrets.map((secret) => secret.name),
59
+ args.includeInternal
60
+ );
48
61
  const merged = mergeSecrets(localSecrets, remoteNames);
49
62
  const added = merged.filter((name) => !localSecrets.includes(name));
50
63
  await writeLocalSecretsToConfig(cwd, merged);
@@ -68,4 +81,4 @@ var sync_default = defineCommand({
68
81
  export {
69
82
  sync_default as default
70
83
  };
71
- //# sourceMappingURL=sync-RPXLLOTK.js.map
84
+ //# sourceMappingURL=sync-6EXHV3IT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/secrets/sync.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 filterInternalSecrets,\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: \"sync\",\n description: \"Merge remote secrets into local kalp.config.ts\",\n },\n args: {\n includeInternal: {\n type: \"boolean\",\n description: \"Include internal Kalp runtime secrets (KALP_*)\",\n default: false,\n },\n },\n async run({ args }) {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp secrets sync\")}`);\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(\"Reading remote secrets\");\n\n try {\n const configPath = await resolveSecretsRuntimeConfigPath(cwd);\n const provider = resolveProvider();\n const [remoteSecrets, localSecrets] = await Promise.all([\n provider.listSecrets({ cwd, configPath }),\n readLocalSecretsFromConfig(cwd),\n ]);\n\n const remoteNames = filterInternalSecrets(\n remoteSecrets.map((secret) => secret.name),\n args.includeInternal,\n );\n const merged = mergeSecrets(localSecrets, remoteNames);\n const added = merged.filter((name) => !localSecrets.includes(name));\n\n await writeLocalSecretsToConfig(cwd, merged);\n await generateTypes(cwd);\n\n spinner.stop(`Synced ${remoteNames.length} remote secrets`);\n if (added.length > 0) {\n p.log.success(\n `Added to local config: ${added.map((name) => pc.cyan(name)).join(\", \")}`,\n );\n } else {\n p.log.info(pc.dim(\"Local config already up to date.\"));\n }\n p.outro(\"Done\");\n } catch (error) {\n spinner.stop(\"Sync failed\");\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;AAYf,IAAM,OAAO;AAEb,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,mBAAmB,CAAC,EAAE;AAEjD,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,wBAAwB;AAEtC,QAAI;AACF,YAAM,aAAa,MAAM,gCAAgC,GAAG;AAC5D,YAAM,WAAW,gBAAgB;AACjC,YAAM,CAAC,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACtD,SAAS,YAAY,EAAE,KAAK,WAAW,CAAC;AAAA,QACxC,2BAA2B,GAAG;AAAA,MAChC,CAAC;AAED,YAAM,cAAc;AAAA,QAClB,cAAc,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,QACzC,KAAK;AAAA,MACP;AACA,YAAM,SAAS,aAAa,cAAc,WAAW;AACrD,YAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,SAAS,IAAI,CAAC;AAElE,YAAM,0BAA0B,KAAK,MAAM;AAC3C,YAAM,cAAc,GAAG;AAEvB,MAAAA,SAAQ,KAAK,UAAU,YAAY,MAAM,iBAAiB;AAC1D,UAAI,MAAM,SAAS,GAAG;AACpB,QAAE,MAAI;AAAA,UACJ,0BAA0B,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACzE;AAAA,MACF,OAAO;AACL,QAAE,MAAI,KAAK,GAAG,IAAI,kCAAkC,CAAC;AAAA,MACvD;AACA,MAAE,QAAM,MAAM;AAAA,IAChB,SAAS,OAAO;AACd,MAAAA,SAAQ,KAAK,aAAa;AAC1B,MAAE,MAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":["spinner"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalphq/cli",
3
- "version": "0.0.0-dev-20260513012830",
3
+ "version": "0.0.0-dev-20260513145227",
4
4
  "description": "Zero-config CLI for deploying Kalp agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,9 +27,9 @@
27
27
  "open": "^11.0.0",
28
28
  "picocolors": "1.1.1",
29
29
  "zod": "3.25.76",
30
- "@kalphq/sdk": "0.0.0-dev-20260513012830",
31
- "@kalphq/project": "0.0.0-dev-20260513012830",
32
- "@kalphq/compiler": "0.0.0-dev-20260513012830"
30
+ "@kalphq/compiler": "0.0.0-dev-20260513145227",
31
+ "@kalphq/project": "0.0.0-dev-20260513145227",
32
+ "@kalphq/sdk": "0.0.0-dev-20260513145227"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/json-stable-stringify": "1.2.0",
@@ -1 +0,0 @@
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 p.intro(`${LOGO} ${pc.bold(\"kalp agents\")}`);\n p.log.message(pc.bold(\"Available subcommands:\"));\n p.log.message(` ${pc.cyan(\"list\")} Compare local and remote agent status`);\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 p.outro(args.help ? pc.dim(\"Done\") : pc.dim(\"Select a subcommand above.\"));\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,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,2CAA2C;AAC7E,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;AACA,IAAE,QAAM,KAAK,OAAO,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,4BAA4B,CAAC;AAAA,EAC3E;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/project-state.ts","../src/utils/runtime.ts","../src/utils/ai.ts","../src/utils/project-config.ts","../src/utils/runtime-identity.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ProjectAgentState {\n currentHash: string | null;\n currentVersion: number;\n lastLocalHash: string | null;\n lastRemoteHash: string | null;\n lastPushedAt: string | null;\n localPath: string;\n workerUrl: string | null;\n}\n\nexport interface ProjectState {\n workerUrl: string | null;\n deployedAt: string | null;\n accountId: string | null;\n studioCredentialsFingerprint?: string | null;\n serviceKeyFingerprint?: string | null;\n agents: Record<string, ProjectAgentState>;\n}\n\nconst KALP_DIR = \".kalp\";\nconst STATE_FILE = \"state.json\";\n\nfunction normalizeProjectState(raw: unknown): ProjectState | null {\n if (!raw || typeof raw !== \"object\") return null;\n const value = raw as Record<string, unknown>;\n const workerUrl =\n typeof value.workerUrl === \"string\" && value.workerUrl.length > 0\n ? value.workerUrl\n : null;\n const deployedAt =\n typeof value.deployedAt === \"string\" && value.deployedAt.length > 0\n ? value.deployedAt\n : null;\n const accountId =\n typeof value.accountId === \"string\" && value.accountId.length > 0\n ? value.accountId\n : null;\n const studioCredentialsFingerprint =\n typeof value.studioCredentialsFingerprint === \"string\" &&\n value.studioCredentialsFingerprint.length > 0\n ? value.studioCredentialsFingerprint\n : null;\n const serviceKeyFingerprint =\n typeof value.serviceKeyFingerprint === \"string\" &&\n value.serviceKeyFingerprint.length > 0\n ? value.serviceKeyFingerprint\n : null;\n\n const agents: Record<string, ProjectAgentState> = {};\n const rawAgents =\n value.agents && typeof value.agents === \"object\"\n ? (value.agents as Record<string, unknown>)\n : {};\n\n for (const [name, entry] of Object.entries(rawAgents)) {\n if (!entry || typeof entry !== \"object\") continue;\n const item = entry as Record<string, unknown>;\n if (typeof item.localPath !== \"string\" || item.localPath.length === 0) {\n continue;\n }\n\n const currentVersion =\n typeof item.currentVersion === \"number\" && Number.isFinite(item.currentVersion)\n ? Math.max(0, Math.floor(item.currentVersion))\n : 0;\n\n agents[name] = {\n currentHash: typeof item.currentHash === \"string\" ? item.currentHash : null,\n currentVersion,\n lastLocalHash: typeof item.lastLocalHash === \"string\" ? item.lastLocalHash : null,\n lastRemoteHash:\n typeof item.lastRemoteHash === \"string\" ? item.lastRemoteHash : null,\n lastPushedAt: typeof item.lastPushedAt === \"string\" ? item.lastPushedAt : null,\n localPath: item.localPath,\n workerUrl: typeof item.workerUrl === \"string\" ? item.workerUrl : null,\n };\n }\n\n return {\n workerUrl,\n deployedAt,\n accountId,\n studioCredentialsFingerprint,\n serviceKeyFingerprint,\n agents,\n };\n}\n\nexport async function readProjectState(cwd: string): Promise<ProjectState | null> {\n try {\n const statePath = join(cwd, KALP_DIR, STATE_FILE);\n const content = await readFile(statePath, \"utf-8\");\n return normalizeProjectState(JSON.parse(content));\n } catch {\n return null;\n }\n}\n\nexport async function writeProjectState(\n cwd: string,\n state: ProjectState,\n): Promise<void> {\n const dir = join(cwd, KALP_DIR);\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, STATE_FILE), `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n","import { createHash } from \"node:crypto\";\nimport {\n access,\n cp,\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { deriveLabelFromName } from \"@kalphq/project\";\nimport { getRequiredSecretForProvider, resolveProviderFromConfig } from \"@/utils/ai\";\nimport {\n resolveIdentityAuthRequirements,\n} from \"@/utils/project-config\";\nimport { readProjectState } from \"@/utils/project-state\";\nimport { materializeRuntimeIdentity } from \"@/utils/runtime-identity\";\n\nconst RUNTIME_ROOT = \".kalp\";\nconst RUNTIME_DIR = \"runtime\";\nconst STUDIO_DIR = \"studio\";\nconst WRANGLER_CONFIG_FILE = \"wrangler.jsonc\";\nconst WORKER_ENTRY_FILE = \"worker-entry.js\";\nconst COMPATIBILITY_DATE = \"2026-05-10\";\n\nexport interface RuntimePaths {\n runtimeDir: string;\n studioDir: string;\n workerEntrypointPath: string;\n wranglerConfigPath: string;\n workerName: string;\n}\n\ninterface RuntimeAgentRecord {\n name: string;\n label?: string;\n tags?: string[];\n environment: \"local\" | \"remote\" | \"both\";\n status: \"online\" | \"offline\";\n hash: string | null;\n version: string | null;\n versionNumber: number | null;\n lastRemoteHash: string | null;\n lastLocalHash: string | null;\n workerUrl: string | null;\n localPath: string | null;\n updatedAt: string | null;\n}\n\ninterface RuntimeAgentsSnapshot {\n generatedAt: string;\n projectPath: string;\n workerUrl: string | null;\n mode: \"local\" | \"remote\";\n agents: RuntimeAgentRecord[];\n}\n\nexport interface MaterializeRuntimeOptions {\n mode?: \"local\" | \"remote\";\n}\n\ninterface WranglerConfig {\n $schema: string;\n name: string;\n main: string;\n compatibility_date: string;\n compatibility_flags: string[];\n migrations: Array<{ tag: string; new_sqlite_classes: string[] }>;\n durable_objects: {\n bindings: Array<{ name: string; class_name: string }>;\n };\n kv_namespaces: Array<{ binding: string }>;\n assets: {\n directory: string;\n binding: string;\n run_worker_first: boolean;\n };\n observability: { enabled: boolean };\n upload_source_maps: boolean;\n vars: {\n KALP_ENV: \"local\" | \"remote\";\n };\n secrets: { required: string[] };\n}\n\ninterface RuntimeTemplatePaths {\n studioTemplateDir: string;\n workerEntryPath: string;\n}\n\nfunction sanitizeSegment(input: string): string {\n return input\n .toLowerCase()\n .replace(/^@/, \"\")\n .replace(/\\//g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nasync function resolveProjectSlug(cwd: string): Promise<string> {\n const fallback = sanitizeSegment(basename(cwd)) || \"agent\";\n const packageJsonPath = join(cwd, \"package.json\");\n\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(content) as { name?: string };\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const sanitized = sanitizeSegment(name);\n return sanitized || fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildWorkerName(slug: string, cwd: string): string {\n const cwdHash = createHash(\"sha1\").update(cwd).digest(\"hex\").slice(0, 8);\n const withPrefix = `kalp-${slug}-${cwdHash}`;\n const maxLen = 63;\n if (withPrefix.length <= maxLen) {\n return withPrefix;\n }\n\n const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, \"\");\n return clipped || `kalp-${cwdHash}`;\n}\n\nfunction createRuntimeConfig(\n workerName: string,\n mode: \"local\" | \"remote\",\n requiredSecrets: string[],\n): WranglerConfig {\n return {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: workerName,\n main: `./${WORKER_ENTRY_FILE}`,\n compatibility_date: COMPATIBILITY_DATE,\n compatibility_flags: [\"nodejs_compat\"],\n migrations: [\n {\n tag: \"v1\",\n new_sqlite_classes: [\"AgentDurableObject\"],\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: \"KALP_RUNTIME_CLOUDFLARE\",\n class_name: \"AgentDurableObject\",\n },\n ],\n },\n kv_namespaces: [\n {\n binding: \"KALP_MANIFESTS\",\n },\n ],\n assets: {\n directory: `./${STUDIO_DIR}`,\n binding: \"ASSETS\",\n run_worker_first: true,\n },\n observability: { enabled: true },\n upload_source_maps: true,\n vars: {\n KALP_ENV: mode,\n },\n secrets: {\n required: requiredSecrets,\n },\n };\n}\n\nfunction runtimeTemplateCandidates(): Array<{\n studioTemplateDir: string;\n workerEntryPath: string;\n}> {\n const here = dirname(fileURLToPath(import.meta.url));\n const distTemplateRoot = resolve(here, \"runtime-template\");\n const packageRootTemplate = resolve(here, \"..\", \"runtime-template\");\n const sourceTemplateRoot = resolve(here, \"..\", \"..\", \"runtime-template\");\n const monorepoStudioDist = resolve(\n here,\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"apps\",\n \"studio\",\n \"dist\",\n \"client\",\n );\n\n return [\n {\n studioTemplateDir: join(distTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(distTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(packageRootTemplate, STUDIO_DIR),\n workerEntryPath: join(packageRootTemplate, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: join(sourceTemplateRoot, STUDIO_DIR),\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n {\n studioTemplateDir: monorepoStudioDist,\n workerEntryPath: join(sourceTemplateRoot, WORKER_ENTRY_FILE),\n },\n ];\n}\n\nasync function resolveRuntimeTemplate(): Promise<RuntimeTemplatePaths> {\n for (const candidate of runtimeTemplateCandidates()) {\n try {\n await access(candidate.studioTemplateDir);\n await access(candidate.workerEntryPath);\n return candidate;\n } catch {\n // continue\n }\n }\n\n throw new Error(\n \"Kalp runtime template not found in CLI package. Reinstall @kalphq/cli.\",\n );\n}\n\nfunction createStudioShell(entryScript: string, cssFiles: string[]): string {\n const cssLinks = cssFiles\n .map((file) => ` <link rel=\"stylesheet\" href=\"/studio/assets/${file}\" />`)\n .join(\"\\n\");\n\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Kalp Studio</title>\n${cssLinks}\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/studio/assets/${entryScript}\"></script>\n </body>\n</html>\n`;\n}\n\nasync function ensureStudioIndex(studioDir: string): Promise<void> {\n const indexPath = join(studioDir, \"index.html\");\n try {\n await access(indexPath);\n return;\n } catch {\n // index.html is missing on some TanStack Start static builds.\n }\n\n const assetsDir = join(studioDir, \"assets\");\n const assetFiles = await readdir(assetsDir);\n const entryScript =\n assetFiles.find((file) => /^index-.*\\.js$/i.test(file)) ??\n assetFiles.find((file) => file.endsWith(\".js\"));\n\n if (!entryScript) {\n throw new Error(\n \"Studio runtime template is missing an entry JS bundle in studio/assets.\",\n );\n }\n\n const cssFiles = assetFiles.filter((file) => file.endsWith(\".css\")).sort();\n const html = createStudioShell(entryScript, cssFiles);\n await writeFile(indexPath, html, \"utf-8\");\n}\n\nexport async function readLocalAgentNames(cwd: string): Promise<string[]> {\n const agentsDir = join(cwd, \"agents\");\n try {\n const entries = await readdir(agentsDir, { withFileTypes: true });\n const names: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const indexPath = join(agentsDir, entry.name, \"index.ts\");\n const exists = await stat(indexPath)\n .then(() => true)\n .catch(() => false);\n if (exists) names.push(entry.name);\n }\n return names.sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function createAgentsSnapshot(\n cwd: string,\n mode: \"local\" | \"remote\",\n): Promise<RuntimeAgentsSnapshot> {\n const localAgentNames = await readLocalAgentNames(cwd);\n const state = await readProjectState(cwd);\n\n const byName = new Map<string, RuntimeAgentRecord>();\n const stateAgents = state?.agents ?? {};\n\n for (const name of localAgentNames) {\n const localPath = join(cwd, \"agents\", name, \"index.ts\");\n const saved = stateAgents[name];\n const hasRemoteVersion = !!saved?.lastRemoteHash && (saved?.currentVersion ?? 0) > 0;\n\n if (mode === \"remote\" && !hasRemoteVersion) {\n continue;\n }\n\n const resolvedWorkerUrl =\n saved?.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber =\n typeof saved?.currentVersion === \"number\" && saved.currentVersion > 0\n ? saved.currentVersion\n : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment:\n mode === \"remote\"\n ? \"remote\"\n : hasRemoteVersion\n ? \"both\"\n : \"local\",\n status: resolvedWorkerUrl ? \"online\" : \"offline\",\n hash: saved?.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved?.lastRemoteHash ?? null,\n lastLocalHash: saved?.lastLocalHash ?? null,\n workerUrl: resolvedWorkerUrl,\n localPath,\n updatedAt: saved?.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n\n if (mode === \"remote\") {\n for (const [name, saved] of Object.entries(stateAgents)) {\n const hasRemoteVersion =\n !!saved.lastRemoteHash && (saved.currentVersion ?? 0) > 0;\n if (!hasRemoteVersion || byName.has(name)) continue;\n\n const localPath = saved.localPath ?? join(cwd, \"agents\", name, \"index.ts\");\n const workerUrl =\n saved.workerUrl ??\n (state?.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${name}` : null);\n const versionNumber = saved.currentVersion > 0 ? saved.currentVersion : null;\n\n byName.set(name, {\n name,\n label: deriveLabelFromName(name),\n tags: [],\n environment: \"remote\",\n status: workerUrl ? \"online\" : \"offline\",\n hash: saved.currentHash ?? null,\n version: versionNumber ? `v${versionNumber}` : null,\n versionNumber,\n lastRemoteHash: saved.lastRemoteHash ?? null,\n lastLocalHash: saved.lastLocalHash ?? null,\n workerUrl,\n localPath,\n updatedAt: saved.lastPushedAt ?? state?.deployedAt ?? null,\n });\n }\n }\n\n return {\n generatedAt: new Date().toISOString(),\n projectPath: cwd,\n workerUrl: state?.workerUrl ?? null,\n mode,\n agents: Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name)),\n };\n}\n\nexport async function writeRuntimeAgentsSnapshot(params: {\n cwd: string;\n runtimeDir: string;\n mode: \"local\" | \"remote\";\n}): Promise<void> {\n const snapshot = await createAgentsSnapshot(params.cwd, params.mode);\n await writeFile(\n join(params.runtimeDir, \"agents.snapshot.json\"),\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n \"utf-8\",\n );\n}\n\nexport async function materializeRuntime(\n cwd: string,\n options: MaterializeRuntimeOptions = {},\n): Promise<RuntimePaths> {\n const mode = options.mode ?? \"remote\";\n const runtimeDir = join(cwd, RUNTIME_ROOT, RUNTIME_DIR);\n const studioDir = join(runtimeDir, STUDIO_DIR);\n const workerEntrypointPath = join(runtimeDir, WORKER_ENTRY_FILE);\n const wranglerConfigPath = join(runtimeDir, WRANGLER_CONFIG_FILE);\n\n const template = await resolveRuntimeTemplate();\n await rm(runtimeDir, { recursive: true, force: true });\n await mkdir(runtimeDir, { recursive: true });\n\n await cp(template.studioTemplateDir, studioDir, { recursive: true });\n await cp(template.workerEntryPath, workerEntrypointPath);\n await ensureStudioIndex(studioDir);\n await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode });\n const identity = await materializeRuntimeIdentity({ cwd, runtimeDir });\n\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const requiredSecrets = new Set<string>([\n \"KALP_SECRET_KEY\",\n \"KALP_STUDIO_PASSWORD\",\n \"KALP_STUDIO_ADMIN_USER\",\n \"KALP_SERVICE_KEY\",\n ]);\n\n try {\n const provider = await resolveProviderFromConfig(cwd);\n requiredSecrets.add(getRequiredSecretForProvider(provider));\n } catch {\n // Ignore provider resolution errors here; deploy preflight handles strict checks.\n }\n\n const identityRequirements = resolveIdentityAuthRequirements(identity.identityConfig);\n for (const requirement of identityRequirements) {\n requiredSecrets.add(requirement.envKey);\n }\n\n const wranglerConfig = createRuntimeConfig(\n workerName,\n mode,\n [...requiredSecrets].sort((a, b) => a.localeCompare(b)),\n );\n await writeFile(\n wranglerConfigPath,\n `${JSON.stringify(wranglerConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n return {\n runtimeDir,\n studioDir,\n workerEntrypointPath,\n wranglerConfigPath,\n workerName,\n };\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createJiti } from \"jiti\";\n\nexport type AIProvider = \"openai\" | \"anthropic\" | \"openrouter\" | \"custom\";\n\nconst PROVIDER_SECRET_MAP: Record<AIProvider, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n custom: \"CUSTOM_AI_API_KEY\",\n};\n\nfunction parseEnv(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const raw of content.split(/\\r?\\n/g)) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const idx = line.indexOf(\"=\");\n if (idx <= 0) continue;\n env[line.slice(0, idx).trim()] = line.slice(idx + 1);\n }\n return env;\n}\n\nexport async function resolveProviderFromConfig(cwd: string): Promise<AIProvider> {\n const configPath = join(cwd, \"kalp.config.ts\");\n await access(configPath, constants.F_OK);\n const jiti = createJiti(cwd, { interopDefault: true });\n const config = (await jiti.import(configPath)) as\n | { default?: { ai?: { provider?: AIProvider } }; ai?: { provider?: AIProvider } }\n | undefined;\n const provider = config?.default?.ai?.provider ?? config?.ai?.provider ?? \"openai\";\n return provider;\n}\n\nexport async function readDotEnv(cwd: string): Promise<Record<string, string>> {\n const envPath = join(cwd, \".env\");\n const content = await readFile(envPath, \"utf-8\").catch(() => \"\");\n return parseEnv(content);\n}\n\nexport function getRequiredSecretForProvider(provider: AIProvider): string {\n return PROVIDER_SECRET_MAP[provider];\n}\n","import { createJiti } from \"jiti\";\nimport { access } from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { AuthStrategy, IdentityConfig } from \"@kalphq/sdk\";\n\nexport interface LoadedProjectConfig {\n path: string;\n raw: Record<string, unknown>;\n}\n\nexport interface RuntimeIdentityStrategyConfig {\n type: \"jwks\" | \"symmetric\" | \"apiKey\";\n jwksUrl?: string;\n issuer?: string;\n audience?: string;\n secretEnvKey?: string;\n headerName?: string;\n envKey?: string;\n}\n\nexport interface RuntimeIdentityConfig {\n enforceGlobalAuth: boolean;\n identityId: string | null;\n strategy: RuntimeIdentityStrategyConfig | null;\n}\n\nexport interface ProjectConfigAuthRequirement {\n envKey: string;\n reason: string;\n}\n\nfunction normalizeStrategy(\n strategy: AuthStrategy | undefined,\n): RuntimeIdentityStrategyConfig | null {\n if (!strategy) return null;\n if (strategy.type === \"jwks\") {\n return {\n type: \"jwks\",\n jwksUrl: strategy.jwksUrl,\n issuer: strategy.issuer,\n audience: strategy.audience,\n };\n }\n if (strategy.type === \"symmetric\") {\n return {\n type: \"symmetric\",\n secretEnvKey: strategy.secretEnvKey,\n };\n }\n return {\n type: \"apiKey\",\n headerName: strategy.headerName,\n envKey: strategy.envKey,\n };\n}\n\nexport async function loadProjectConfig(cwd: string): Promise<LoadedProjectConfig> {\n const configPath = resolve(join(cwd, \"kalp.config.ts\"));\n await access(configPath, constants.F_OK);\n const jiti = createJiti(cwd, { interopDefault: true });\n const moduleValue = (await jiti.import(configPath)) as\n | { default?: Record<string, unknown> }\n | Record<string, unknown>;\n const raw =\n moduleValue && typeof moduleValue === \"object\" && \"default\" in moduleValue\n ? ((moduleValue.default ?? moduleValue) as Record<string, unknown>)\n : (moduleValue as Record<string, unknown>);\n return { path: configPath, raw };\n}\n\nexport function resolveRuntimeIdentityConfig(\n rawConfig: Record<string, unknown>,\n): RuntimeIdentityConfig {\n const identity =\n rawConfig.identity && typeof rawConfig.identity === \"object\"\n ? (rawConfig.identity as IdentityConfig)\n : undefined;\n const enforceGlobalAuth =\n typeof rawConfig.enforceGlobalAuth === \"boolean\"\n ? rawConfig.enforceGlobalAuth\n : true;\n\n return {\n enforceGlobalAuth,\n identityId:\n identity && typeof identity.id === \"string\" && identity.id.length > 0\n ? identity.id\n : null,\n strategy: normalizeStrategy(identity?.strategy),\n };\n}\n\nexport function resolveIdentityAuthRequirements(\n identity: RuntimeIdentityConfig,\n): ProjectConfigAuthRequirement[] {\n if (!identity.strategy) return [];\n\n if (identity.strategy.type === \"symmetric\") {\n return [\n {\n envKey: identity.strategy.secretEnvKey?.trim() || \"JWT_SIGNING_SECRET\",\n reason: \"symmetric JWT validation\",\n },\n ];\n }\n\n if (identity.strategy.type === \"apiKey\") {\n const envKey = identity.strategy.envKey?.trim();\n if (!envKey) {\n return [\n {\n envKey: \"KALP_API_KEY\",\n reason: \"apiKey strategy (default env key)\",\n },\n ];\n }\n return [{ envKey, reason: \"apiKey strategy\" }];\n }\n\n return [];\n}\n","import { build } from \"esbuild\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n loadProjectConfig,\n resolveRuntimeIdentityConfig,\n type RuntimeIdentityConfig,\n} from \"@/utils/project-config\";\n\nexport interface MaterializeRuntimeIdentityResult {\n identityConfig: RuntimeIdentityConfig;\n identityConfigPath: string;\n identityMapPath: string;\n}\n\nconst DEFAULT_IDENTITY_MAP_SOURCE = `export default function mapIdentity(payload) {\n const sub =\n payload && typeof payload === \"object\" && typeof payload.sub === \"string\"\n ? payload.sub\n : \"anonymous\";\n return { userId: sub, claims: {} };\n}\n`;\n\nfunction readIdentityMapCandidate(rawConfig: Record<string, unknown>): unknown {\n if (!rawConfig.identity || typeof rawConfig.identity !== \"object\") return null;\n return (rawConfig.identity as Record<string, unknown>).mapIdentity;\n}\n\nfunction assertEdgeSafeSource(mapIdentitySource: string): void {\n const blockedPatterns: Array<{ regex: RegExp; label: string }> = [\n { regex: /\\brequire\\s*\\(/, label: \"require(...)\" },\n { regex: /\\bnode:/, label: \"node:* imports\" },\n { regex: /\\bprocess\\./, label: \"process.*\" },\n { regex: /\\bBuffer\\b/, label: \"Buffer\" },\n { regex: /\\bimport\\s*\\(/, label: \"dynamic import(...)\" },\n ];\n\n const hit = blockedPatterns.find((item) => item.regex.test(mapIdentitySource));\n if (!hit) return;\n\n throw new Error(\n `mapIdentity uses \"${hit.label}\", which is not supported in edge runtime.`,\n );\n}\n\nasync function writeDefaultIdentityMap(identityMapPath: string): Promise<void> {\n await writeFile(identityMapPath, DEFAULT_IDENTITY_MAP_SOURCE, \"utf-8\");\n}\n\nasync function bundleIdentityMap(params: {\n cwd: string;\n mapIdentitySource: string;\n identityMapPath: string;\n}): Promise<void> {\n const { cwd, mapIdentitySource, identityMapPath } = params;\n assertEdgeSafeSource(mapIdentitySource);\n\n const entrySource = `\nconst mapIdentity = (${mapIdentitySource});\nif (typeof mapIdentity !== \"function\") {\n throw new Error(\"identity.mapIdentity must be a function.\");\n}\nexport default mapIdentity;\n`;\n\n try {\n await build({\n absWorkingDir: cwd,\n bundle: true,\n format: \"esm\",\n platform: \"browser\",\n target: [\"es2022\"],\n write: true,\n outfile: identityMapPath,\n logLevel: \"silent\",\n stdin: {\n contents: entrySource,\n resolveDir: cwd,\n sourcefile: \"kalp-identity-map-entry.mjs\",\n loader: \"js\",\n },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n [\n \"Could not bundle identity.mapIdentity for runtime.\",\n \"Please verify:\",\n \" • kalp.config.ts exists and exports default defineConfig(...)\",\n \" • mapIdentity is declared inline and does not capture external variables\",\n \" • mapIdentity does not use Node-specific APIs\",\n \" • kalp.config.ts has no broken imports\",\n `Technical details: ${message}`,\n ].join(\"\\n\"),\n );\n }\n}\n\nexport async function materializeRuntimeIdentity(params: {\n cwd: string;\n runtimeDir: string;\n}): Promise<MaterializeRuntimeIdentityResult> {\n const { cwd, runtimeDir } = params;\n const identityConfigPath = join(runtimeDir, \"identity.config.json\");\n const identityMapPath = join(runtimeDir, \"identity.map.mjs\");\n\n let rawConfig: Record<string, unknown> = {};\n try {\n const loaded = await loadProjectConfig(cwd);\n rawConfig = loaded.raw;\n } catch {\n rawConfig = {};\n }\n\n const identityConfig = resolveRuntimeIdentityConfig(rawConfig);\n await writeFile(\n identityConfigPath,\n `${JSON.stringify(identityConfig, null, 2)}\\n`,\n \"utf-8\",\n );\n\n const mapIdentity = readIdentityMapCandidate(rawConfig);\n if (typeof mapIdentity === \"function\") {\n const mapIdentitySource = mapIdentity.toString();\n if (!mapIdentitySource || /\\[native code\\]/.test(mapIdentitySource)) {\n throw new Error(\n \"Could not serialize identity.mapIdentity. Define it inline in kalp.config.ts as a regular function.\",\n );\n }\n await bundleIdentityMap({\n cwd,\n mapIdentitySource,\n identityMapPath,\n });\n } else {\n await writeDefaultIdentityMap(identityMapPath);\n }\n\n return { identityConfig, identityConfigPath, identityMapPath };\n}\n"],"mappings":";;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAqBrB,IAAM,WAAW;AACjB,IAAM,aAAa;AAEnB,SAAS,sBAAsB,KAAmC;AAChE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,QAAQ;AACd,QAAM,YACJ,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,IAC5D,MAAM,YACN;AACN,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,SAAS,IAC9D,MAAM,aACN;AACN,QAAM,YACJ,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,IAC5D,MAAM,YACN;AACN,QAAM,+BACJ,OAAO,MAAM,iCAAiC,YAC9C,MAAM,6BAA6B,SAAS,IACxC,MAAM,+BACN;AACN,QAAM,wBACJ,OAAO,MAAM,0BAA0B,YACvC,MAAM,sBAAsB,SAAS,IACjC,MAAM,wBACN;AAEN,QAAM,SAA4C,CAAC;AACnD,QAAM,YACJ,MAAM,UAAU,OAAO,MAAM,WAAW,WACnC,MAAM,SACP,CAAC;AAEP,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,UAAM,OAAO;AACb,QAAI,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,WAAW,GAAG;AACrE;AAAA,IACF;AAEA,UAAM,iBACJ,OAAO,KAAK,mBAAmB,YAAY,OAAO,SAAS,KAAK,cAAc,IAC1E,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,cAAc,CAAC,IAC3C;AAEN,WAAO,IAAI,IAAI;AAAA,MACb,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,MACvE;AAAA,MACA,eAAe,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;AAAA,MAC7E,gBACE,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB;AAAA,MAClE,cAAc,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AAAA,MAC1E,WAAW,KAAK;AAAA,MAChB,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,iBAAiB,KAA2C;AAChF,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,UAAU,UAAU;AAChD,UAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AACjD,WAAO,sBAAsB,KAAK,MAAM,OAAO,CAAC;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,KACA,OACe;AACf,QAAM,MAAM,KAAK,KAAK,QAAQ;AAC9B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,UAAU,KAAK,KAAK,UAAU,GAAG,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACvF;;;AC5GA,SAAS,kBAAkB;AAC3B;AAAA,EACE,UAAAA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,OACK;AACP,SAAS,UAAU,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AACjD,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;;;ACbpC,SAAS,QAAQ,YAAAC,iBAAgB;AACjC,SAAS,iBAAiB;AAC1B,SAAS,QAAAC,aAAY;AACrB,SAAS,kBAAkB;AAI3B,IAAM,sBAAkD;AAAA,EACtD,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,SAAS,SAAS,SAAyC;AACzD,QAAM,MAA8B,CAAC;AACrC,aAAW,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACzC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AACnC,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,EAAG;AACd,QAAI,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,eAAsB,0BAA0B,KAAkC;AAChF,QAAM,aAAaA,MAAK,KAAK,gBAAgB;AAC7C,QAAM,OAAO,YAAY,UAAU,IAAI;AACvC,QAAM,OAAO,WAAW,KAAK,EAAE,gBAAgB,KAAK,CAAC;AACrD,QAAM,SAAU,MAAM,KAAK,OAAO,UAAU;AAG5C,QAAM,WAAW,QAAQ,SAAS,IAAI,YAAY,QAAQ,IAAI,YAAY;AAC1E,SAAO;AACT;AAEA,eAAsB,WAAW,KAA8C;AAC7E,QAAM,UAAUA,MAAK,KAAK,MAAM;AAChC,QAAM,UAAU,MAAMD,UAAS,SAAS,OAAO,EAAE,MAAM,MAAM,EAAE;AAC/D,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,6BAA6B,UAA8B;AACzE,SAAO,oBAAoB,QAAQ;AACrC;;;AC7CA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,UAAAC,eAAc;AACvB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,OAAM,eAAe;AA6B9B,SAAS,kBACP,UACsC;AACtC,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,SAAS,QAAQ;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,IACrB;AAAA,EACF;AACA,MAAI,SAAS,SAAS,aAAa;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,cAAc,SAAS;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,SAAS;AAAA,IACrB,QAAQ,SAAS;AAAA,EACnB;AACF;AAEA,eAAsB,kBAAkB,KAA2C;AACjF,QAAM,aAAa,QAAQA,MAAK,KAAK,gBAAgB,CAAC;AACtD,QAAMF,QAAO,YAAYC,WAAU,IAAI;AACvC,QAAM,OAAOF,YAAW,KAAK,EAAE,gBAAgB,KAAK,CAAC;AACrD,QAAM,cAAe,MAAM,KAAK,OAAO,UAAU;AAGjD,QAAM,MACJ,eAAe,OAAO,gBAAgB,YAAY,aAAa,cACzD,YAAY,WAAW,cACxB;AACP,SAAO,EAAE,MAAM,YAAY,IAAI;AACjC;AAEO,SAAS,6BACd,WACuB;AACvB,QAAM,WACJ,UAAU,YAAY,OAAO,UAAU,aAAa,WAC/C,UAAU,WACX;AACN,QAAM,oBACJ,OAAO,UAAU,sBAAsB,YACnC,UAAU,oBACV;AAEN,SAAO;AAAA,IACL;AAAA,IACA,YACE,YAAY,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,SAAS,IAChE,SAAS,KACT;AAAA,IACN,UAAU,kBAAkB,UAAU,QAAQ;AAAA,EAChD;AACF;AAEO,SAAS,gCACd,UACgC;AAChC,MAAI,CAAC,SAAS,SAAU,QAAO,CAAC;AAEhC,MAAI,SAAS,SAAS,SAAS,aAAa;AAC1C,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,SAAS,SAAS,cAAc,KAAK,KAAK;AAAA,QAClD,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,SAAS,UAAU;AACvC,UAAM,SAAS,SAAS,SAAS,QAAQ,KAAK;AAC9C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL;AAAA,UACE,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC,EAAE,QAAQ,QAAQ,kBAAkB,CAAC;AAAA,EAC/C;AAEA,SAAO,CAAC;AACV;;;ACzHA,SAAS,aAAa;AACtB,SAAS,aAAAI,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;AAarB,IAAM,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASpC,SAAS,yBAAyB,WAA6C;AAC7E,MAAI,CAAC,UAAU,YAAY,OAAO,UAAU,aAAa,SAAU,QAAO;AAC1E,SAAQ,UAAU,SAAqC;AACzD;AAEA,SAAS,qBAAqB,mBAAiC;AAC7D,QAAM,kBAA2D;AAAA,IAC/D,EAAE,OAAO,kBAAkB,OAAO,eAAe;AAAA,IACjD,EAAE,OAAO,WAAW,OAAO,iBAAiB;AAAA,IAC5C,EAAE,OAAO,eAAe,OAAO,YAAY;AAAA,IAC3C,EAAE,OAAO,cAAc,OAAO,SAAS;AAAA,IACvC,EAAE,OAAO,iBAAiB,OAAO,sBAAsB;AAAA,EACzD;AAEA,QAAM,MAAM,gBAAgB,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,iBAAiB,CAAC;AAC7E,MAAI,CAAC,IAAK;AAEV,QAAM,IAAI;AAAA,IACR,qBAAqB,IAAI,KAAK;AAAA,EAChC;AACF;AAEA,eAAe,wBAAwB,iBAAwC;AAC7E,QAAMC,WAAU,iBAAiB,6BAA6B,OAAO;AACvE;AAEA,eAAe,kBAAkB,QAIf;AAChB,QAAM,EAAE,KAAK,mBAAmB,gBAAgB,IAAI;AACpD,uBAAqB,iBAAiB;AAEtC,QAAM,cAAc;AAAA,uBACC,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtC,MAAI;AACF,UAAM,MAAM;AAAA,MACV,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,CAAC,QAAQ;AAAA,MACjB,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB,OAAO;AAAA,MAC/B,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,eAAsB,2BAA2B,QAGH;AAC5C,QAAM,EAAE,KAAK,WAAW,IAAI;AAC5B,QAAM,qBAAqBC,MAAK,YAAY,sBAAsB;AAClE,QAAM,kBAAkBA,MAAK,YAAY,kBAAkB;AAE3D,MAAI,YAAqC,CAAC;AAC1C,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB,GAAG;AAC1C,gBAAY,OAAO;AAAA,EACrB,QAAQ;AACN,gBAAY,CAAC;AAAA,EACf;AAEA,QAAM,iBAAiB,6BAA6B,SAAS;AAC7D,QAAMD;AAAA,IACJ;AAAA,IACA,GAAG,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AAAA;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,cAAc,yBAAyB,SAAS;AACtD,MAAI,OAAO,gBAAgB,YAAY;AACrC,UAAM,oBAAoB,YAAY,SAAS;AAC/C,QAAI,CAAC,qBAAqB,kBAAkB,KAAK,iBAAiB,GAAG;AACnE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,UAAM,wBAAwB,eAAe;AAAA,EAC/C;AAEA,SAAO,EAAE,gBAAgB,oBAAoB,gBAAgB;AAC/D;;;AHvHA,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,aAAa;AACnB,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAmE3B,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MACJ,YAAY,EACZ,QAAQ,MAAM,EAAE,EAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,OAAO,GAAG,EAClB,QAAQ,YAAY,EAAE;AAC3B;AAEA,eAAe,mBAAmB,KAA8B;AAC9D,QAAM,WAAW,gBAAgB,SAAS,GAAG,CAAC,KAAK;AACnD,QAAM,kBAAkBE,MAAK,KAAK,cAAc;AAEhD,MAAI;AACF,UAAM,UAAU,MAAMC,UAAS,iBAAiB,OAAO;AACvD,UAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,UAAM,YAAY,gBAAgB,IAAI;AACtC,WAAO,aAAa;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,MAAc,KAAqB;AAC1D,QAAM,UAAU,WAAW,MAAM,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACvE,QAAM,aAAa,QAAQ,IAAI,IAAI,OAAO;AAC1C,QAAM,SAAS;AACf,MAAI,WAAW,UAAU,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,WAAW,MAAM,GAAG,MAAM,EAAE,QAAQ,QAAQ,EAAE;AAC9D,SAAO,WAAW,QAAQ,OAAO;AACnC;AAEA,SAAS,oBACP,YACA,MACA,iBACgB;AAChB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM,KAAK,iBAAiB;AAAA,IAC5B,oBAAoB;AAAA,IACpB,qBAAqB,CAAC,eAAe;AAAA,IACrC,YAAY;AAAA,MACV;AAAA,QACE,KAAK;AAAA,QACL,oBAAoB,CAAC,oBAAoB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,WAAW,KAAK,UAAU;AAAA,MAC1B,SAAS;AAAA,MACT,kBAAkB;AAAA,IACpB;AAAA,IACA,eAAe,EAAE,SAAS,KAAK;AAAA,IAC/B,oBAAoB;AAAA,IACpB,MAAM;AAAA,MACJ,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,4BAGN;AACD,QAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AACnD,QAAM,mBAAmBC,SAAQ,MAAM,kBAAkB;AACzD,QAAM,sBAAsBA,SAAQ,MAAM,MAAM,kBAAkB;AAClE,QAAM,qBAAqBA,SAAQ,MAAM,MAAM,MAAM,kBAAkB;AACvE,QAAM,qBAAqBA;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,mBAAmBF,MAAK,kBAAkB,UAAU;AAAA,MACpD,iBAAiBA,MAAK,kBAAkB,iBAAiB;AAAA,IAC3D;AAAA,IACA;AAAA,MACE,mBAAmBA,MAAK,qBAAqB,UAAU;AAAA,MACvD,iBAAiBA,MAAK,qBAAqB,iBAAiB;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,mBAAmBA,MAAK,oBAAoB,UAAU;AAAA,MACtD,iBAAiBA,MAAK,oBAAoB,iBAAiB;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,iBAAiBA,MAAK,oBAAoB,iBAAiB;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,eAAe,yBAAwD;AACrE,aAAW,aAAa,0BAA0B,GAAG;AACnD,QAAI;AACF,YAAMG,QAAO,UAAU,iBAAiB;AACxC,YAAMA,QAAO,UAAU,eAAe;AACtC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,aAAqB,UAA4B;AAC1E,QAAM,WAAW,SACd,IAAI,CAAC,SAAS,mDAAmD,IAAI,MAAM,EAC3E,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,QAAQ;AAAA;AAAA;AAAA;AAAA,gDAIsC,WAAW;AAAA;AAAA;AAAA;AAI3D;AAEA,eAAe,kBAAkB,WAAkC;AACjE,QAAM,YAAYH,MAAK,WAAW,YAAY;AAC9C,MAAI;AACF,UAAMG,QAAO,SAAS;AACtB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,YAAYH,MAAK,WAAW,QAAQ;AAC1C,QAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C,QAAM,cACJ,WAAW,KAAK,CAAC,SAAS,kBAAkB,KAAK,IAAI,CAAC,KACtD,WAAW,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC;AAEhD,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC,EAAE,KAAK;AACzE,QAAM,OAAO,kBAAkB,aAAa,QAAQ;AACpD,QAAMI,WAAU,WAAW,MAAM,OAAO;AAC1C;AAEA,eAAsB,oBAAoB,KAAgC;AACxE,QAAM,YAAYJ,MAAK,KAAK,QAAQ;AACpC,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,UAAM,QAAkB,CAAC;AACzB,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,YAAYA,MAAK,WAAW,MAAM,MAAM,UAAU;AACxD,YAAM,SAAS,MAAM,KAAK,SAAS,EAChC,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACpB,UAAI,OAAQ,OAAM,KAAK,MAAM,IAAI;AAAA,IACnC;AACA,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,qBACb,KACA,MACgC;AAChC,QAAM,kBAAkB,MAAM,oBAAoB,GAAG;AACrD,QAAM,QAAQ,MAAM,iBAAiB,GAAG;AAExC,QAAM,SAAS,oBAAI,IAAgC;AACnD,QAAM,cAAc,OAAO,UAAU,CAAC;AAEtC,aAAW,QAAQ,iBAAiB;AAClC,UAAM,YAAYA,MAAK,KAAK,UAAU,MAAM,UAAU;AACtD,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,mBAAmB,CAAC,CAAC,OAAO,mBAAmB,OAAO,kBAAkB,KAAK;AAEnF,QAAI,SAAS,YAAY,CAAC,kBAAkB;AAC1C;AAAA,IACF;AAEA,UAAM,oBACJ,OAAO,cACN,OAAO,YAAY,GAAG,MAAM,UAAU,QAAQ,OAAO,EAAE,CAAC,MAAM,IAAI,KAAK;AAC1E,UAAM,gBACJ,OAAO,OAAO,mBAAmB,YAAY,MAAM,iBAAiB,IAChE,MAAM,iBACN;AAEN,WAAO,IAAI,MAAM;AAAA,MACf;AAAA,MACA,OAAO,oBAAoB,IAAI;AAAA,MAC/B,MAAM,CAAC;AAAA,MACP,aACE,SAAS,WACL,WACA,mBACE,SACA;AAAA,MACR,QAAQ,oBAAoB,WAAW;AAAA,MACvC,MAAM,OAAO,eAAe;AAAA,MAC5B,SAAS,gBAAgB,IAAI,aAAa,KAAK;AAAA,MAC/C;AAAA,MACA,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,eAAe,OAAO,iBAAiB;AAAA,MACvC,WAAW;AAAA,MACX;AAAA,MACA,WAAW,OAAO,gBAAgB,OAAO,cAAc;AAAA,IACzD,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,UAAU;AACrB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,YAAM,mBACJ,CAAC,CAAC,MAAM,mBAAmB,MAAM,kBAAkB,KAAK;AAC1D,UAAI,CAAC,oBAAoB,OAAO,IAAI,IAAI,EAAG;AAE3C,YAAM,YAAY,MAAM,aAAaA,MAAK,KAAK,UAAU,MAAM,UAAU;AACzE,YAAM,YACJ,MAAM,cACL,OAAO,YAAY,GAAG,MAAM,UAAU,QAAQ,OAAO,EAAE,CAAC,MAAM,IAAI,KAAK;AAC1E,YAAM,gBAAgB,MAAM,iBAAiB,IAAI,MAAM,iBAAiB;AAExE,aAAO,IAAI,MAAM;AAAA,QACf;AAAA,QACA,OAAO,oBAAoB,IAAI;AAAA,QAC/B,MAAM,CAAC;AAAA,QACP,aAAa;AAAA,QACb,QAAQ,YAAY,WAAW;AAAA,QAC/B,MAAM,MAAM,eAAe;AAAA,QAC3B,SAAS,gBAAgB,IAAI,aAAa,KAAK;AAAA,QAC/C;AAAA,QACA,gBAAgB,MAAM,kBAAkB;AAAA,QACxC,eAAe,MAAM,iBAAiB;AAAA,QACtC;AAAA,QACA;AAAA,QACA,WAAW,MAAM,gBAAgB,OAAO,cAAc;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,aAAa;AAAA,IACb,WAAW,OAAO,aAAa;AAAA,IAC/B;AAAA,IACA,QAAQ,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EACjF;AACF;AAEA,eAAsB,2BAA2B,QAI/B;AAChB,QAAM,WAAW,MAAM,qBAAqB,OAAO,KAAK,OAAO,IAAI;AACnE,QAAMI;AAAA,IACJJ,MAAK,OAAO,YAAY,sBAAsB;AAAA,IAC9C,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA,IACpC;AAAA,EACF;AACF;AAEA,eAAsB,mBACpB,KACA,UAAqC,CAAC,GACf;AACvB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,aAAaA,MAAK,KAAK,cAAc,WAAW;AACtD,QAAM,YAAYA,MAAK,YAAY,UAAU;AAC7C,QAAM,uBAAuBA,MAAK,YAAY,iBAAiB;AAC/D,QAAM,qBAAqBA,MAAK,YAAY,oBAAoB;AAEhE,QAAM,WAAW,MAAM,uBAAuB;AAC9C,QAAM,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,QAAMK,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,GAAG,SAAS,mBAAmB,WAAW,EAAE,WAAW,KAAK,CAAC;AACnE,QAAM,GAAG,SAAS,iBAAiB,oBAAoB;AACvD,QAAM,kBAAkB,SAAS;AACjC,QAAM,2BAA2B,EAAE,KAAK,YAAY,KAAK,CAAC;AAC1D,QAAM,WAAW,MAAM,2BAA2B,EAAE,KAAK,WAAW,CAAC;AAErE,QAAM,cAAc,MAAM,mBAAmB,GAAG;AAChD,QAAM,aAAa,gBAAgB,aAAa,GAAG;AACnD,QAAM,kBAAkB,oBAAI,IAAY;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,WAAW,MAAM,0BAA0B,GAAG;AACpD,oBAAgB,IAAI,6BAA6B,QAAQ,CAAC;AAAA,EAC5D,QAAQ;AAAA,EAER;AAEA,QAAM,uBAAuB,gCAAgC,SAAS,cAAc;AACpF,aAAW,eAAe,sBAAsB;AAC9C,oBAAgB,IAAI,YAAY,MAAM;AAAA,EACxC;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,CAAC,GAAG,eAAe,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EACxD;AACA,QAAMD;AAAA,IACJ;AAAA,IACA,GAAG,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AAAA;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["access","mkdir","readFile","writeFile","join","resolve","readFile","join","createJiti","access","constants","join","writeFile","join","writeFile","join","join","readFile","resolve","access","writeFile","mkdir"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/secrets-config.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SECRETS_ARRAY_REGEX = /secrets:\\s*\\[([\\s\\S]*?)\\]/m;\nconst SECRET_LITERAL_REGEX = /[\"'`]([^\"'`]+)[\"'`]/g;\n\nexport async function readLocalSecretsFromConfig(cwd: string): Promise<string[]> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n const match = content.match(SECRETS_ARRAY_REGEX);\n if (!match) return [];\n const body = match[1] ?? \"\";\n const values: string[] = [];\n let item: RegExpExecArray | null;\n while ((item = SECRET_LITERAL_REGEX.exec(body)) !== null) {\n if (item[1]) values.push(item[1]);\n }\n return [...new Set(values)].sort((a, b) => a.localeCompare(b));\n}\n\nexport async function writeLocalSecretsToConfig(\n cwd: string,\n secrets: string[],\n): Promise<void> {\n const configPath = join(cwd, \"kalp.config.ts\");\n const content = await readFile(configPath, \"utf-8\").catch(() => {\n throw new Error(\"kalp.config.ts not found. Run create-kalp first.\");\n });\n\n if (!SECRETS_ARRAY_REGEX.test(content)) {\n throw new Error(\n \"Could not find `secrets: []` in kalp.config.ts. Add a secrets array first.\",\n );\n }\n\n const sorted = [...new Set(secrets)]\n .map((value) => value.trim())\n .filter(Boolean)\n .sort((a, b) => a.localeCompare(b));\n\n const serialized =\n sorted.length > 0 ? sorted.map((secret) => `\"${secret}\"`).join(\", \") : \"\";\n const next = content.replace(SECRETS_ARRAY_REGEX, `secrets: [${serialized}]`);\n await writeFile(configPath, next, \"utf-8\");\n}\n\nexport function mergeSecrets(\n base: string[],\n incoming: string[],\n): string[] {\n return [...new Set([...base, ...incoming].map((value) => value.trim()).filter(Boolean))]\n .sort((a, b) => a.localeCompare(b));\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AAErB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAE7B,eAAsB,2BAA2B,KAAgC;AAC/E,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,QAAM,QAAQ,QAAQ,MAAM,mBAAmB;AAC/C,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,UAAQ,OAAO,qBAAqB,KAAK,IAAI,OAAO,MAAM;AACxD,QAAI,KAAK,CAAC,EAAG,QAAO,KAAK,KAAK,CAAC,CAAC;AAAA,EAClC;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC/D;AAEA,eAAsB,0BACpB,KACA,SACe;AACf,QAAM,aAAa,KAAK,KAAK,gBAAgB;AAC7C,QAAM,UAAU,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE,CAAC;AAED,MAAI,CAAC,oBAAoB,KAAK,OAAO,GAAG;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAChC,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,QAAM,aACJ,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,IAAI;AACzE,QAAM,OAAO,QAAQ,QAAQ,qBAAqB,aAAa,UAAU,GAAG;AAC5E,QAAM,UAAU,YAAY,MAAM,OAAO;AAC3C;AAEO,SAAS,aACd,MACA,UACU;AACV,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EACpF,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;","names":[]}