@kalphq/cli 0.0.0-dev-20260512064905 → 0.0.0-dev-20260512200204
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-5AEWO2OC.js → chunk-MA4DL2YO.js} +6 -2
- package/dist/chunk-MA4DL2YO.js.map +1 -0
- package/dist/{chunk-5QU2DXPC.js → chunk-PTC5NIXY.js} +16 -4
- package/dist/chunk-PTC5NIXY.js.map +1 -0
- package/dist/{chunk-MMR5WRLY.js → chunk-ZMNBWAXJ.js} +87 -5
- package/dist/chunk-ZMNBWAXJ.js.map +1 -0
- package/dist/{deploy-MJLWDGOT.js → deploy-N2QEGCHR.js} +28 -4
- package/dist/deploy-N2QEGCHR.js.map +1 -0
- package/dist/{dev-AHTXYEF2.js → dev-HSFFD4Q5.js} +14 -3
- package/dist/dev-HSFFD4Q5.js.map +1 -0
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/{login-72Q2FQZR.js → login-CJJF46JM.js} +2 -2
- package/dist/{push-RNJ7PQUW.js → push-QTXCB5ZG.js} +20 -14
- package/dist/push-QTXCB5ZG.js.map +1 -0
- package/dist/runtime-template/studio/assets/{index-rgoZQzco.js → index-CgH5LdAp.js} +5 -5
- package/dist/runtime-template/studio/assets/index-DhTweWW0.css +2 -0
- package/dist/runtime-template/studio/index.html +2 -2
- package/dist/runtime-template/worker-entry.js +118 -1
- package/package.json +4 -4
- package/dist/chunk-5AEWO2OC.js.map +0 -1
- package/dist/chunk-5QU2DXPC.js.map +0 -1
- package/dist/chunk-MMR5WRLY.js.map +0 -1
- package/dist/deploy-MJLWDGOT.js.map +0 -1
- package/dist/dev-AHTXYEF2.js.map +0 -1
- package/dist/push-RNJ7PQUW.js.map +0 -1
- package/dist/runtime-template/studio/assets/index-BHzMtWls.css +0 -2
- /package/dist/{login-72Q2FQZR.js.map → login-CJJF46JM.js.map} +0 -0
|
@@ -79,6 +79,7 @@ function normalizeProjectState(raw) {
|
|
|
79
79
|
const workerUrl = typeof value.workerUrl === "string" && value.workerUrl.length > 0 ? value.workerUrl : null;
|
|
80
80
|
const deployedAt = typeof value.deployedAt === "string" && value.deployedAt.length > 0 ? value.deployedAt : null;
|
|
81
81
|
const accountId = typeof value.accountId === "string" && value.accountId.length > 0 ? value.accountId : null;
|
|
82
|
+
const studioCredentialsFingerprint = typeof value.studioCredentialsFingerprint === "string" && value.studioCredentialsFingerprint.length > 0 ? value.studioCredentialsFingerprint : null;
|
|
82
83
|
const agents = {};
|
|
83
84
|
const rawAgents = value.agents && typeof value.agents === "object" ? value.agents : {};
|
|
84
85
|
for (const [name, entry] of Object.entries(rawAgents)) {
|
|
@@ -98,7 +99,7 @@ function normalizeProjectState(raw) {
|
|
|
98
99
|
workerUrl: typeof item.workerUrl === "string" ? item.workerUrl : null
|
|
99
100
|
};
|
|
100
101
|
}
|
|
101
|
-
return { workerUrl, deployedAt, accountId, agents };
|
|
102
|
+
return { workerUrl, deployedAt, accountId, studioCredentialsFingerprint, agents };
|
|
102
103
|
}
|
|
103
104
|
async function readProjectState(cwd) {
|
|
104
105
|
try {
|
|
@@ -196,6 +197,9 @@ function createRuntimeConfig(workerName) {
|
|
|
196
197
|
},
|
|
197
198
|
observability: { enabled: true },
|
|
198
199
|
upload_source_maps: true,
|
|
200
|
+
vars: {
|
|
201
|
+
KALP_ENV: "remote"
|
|
202
|
+
},
|
|
199
203
|
secrets: {
|
|
200
204
|
required: [
|
|
201
205
|
"KALP_SECRET_KEY",
|
|
@@ -412,4 +416,4 @@ export {
|
|
|
412
416
|
readLocalAgentNames,
|
|
413
417
|
materializeRuntime
|
|
414
418
|
};
|
|
415
|
-
//# sourceMappingURL=chunk-
|
|
419
|
+
//# sourceMappingURL=chunk-MA4DL2YO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/secret.ts","../src/utils/project-state.ts","../src/utils/runtime.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst SECRET_KEY = \"KALP_SECRET_KEY\";\nconst STUDIO_PASSWORD = \"KALP_STUDIO_PASSWORD\";\nconst STUDIO_ADMIN_USER = \"KALP_STUDIO_ADMIN_USER\";\n\nfunction parseEnv(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split(/\\r?\\n/g)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex <= 0) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n const value = trimmed.slice(eqIndex + 1).trim();\n result[key] = value;\n }\n return result;\n}\n\nfunction toEnvContent(values: Record<string, string>): string {\n const lines = [\n \"# Kalp Studio Authentication Secrets\",\n `${SECRET_KEY}=${values[SECRET_KEY]}`,\n `${STUDIO_PASSWORD}=${values[STUDIO_PASSWORD]}`,\n `${STUDIO_ADMIN_USER}=${values[STUDIO_ADMIN_USER]}`,\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nasync function readEnvFile(cwd: string): Promise<string> {\n const envPath = join(cwd, \".env\");\n try {\n return await readFile(envPath, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\nfunction generateStudioPassword(): string {\n return randomBytes(24).toString(\"base64url\");\n}\n\nexport interface StudioSecrets {\n key: string;\n studioPassword: string;\n studioAdminUser: string;\n isNew: boolean;\n}\n\nexport async function ensureStudioSecrets(cwd: string): Promise<StudioSecrets> {\n const envPath = join(cwd, \".env\");\n const content = await readEnvFile(cwd);\n const parsed = parseEnv(content);\n\n const key = parsed[SECRET_KEY] || randomBytes(32).toString(\"hex\");\n const studioPassword = parsed[STUDIO_PASSWORD] || generateStudioPassword();\n const studioAdminUser = parsed[STUDIO_ADMIN_USER] || \"admin\";\n\n const isNew =\n !parsed[SECRET_KEY] || !parsed[STUDIO_PASSWORD] || !parsed[STUDIO_ADMIN_USER];\n\n if (isNew || !content.trim()) {\n await writeFile(\n envPath,\n toEnvContent({\n ...parsed,\n [SECRET_KEY]: key,\n [STUDIO_PASSWORD]: studioPassword,\n [STUDIO_ADMIN_USER]: studioAdminUser,\n }),\n \"utf-8\",\n );\n }\n\n return { key, studioPassword, studioAdminUser, isNew };\n}\n\nexport async function ensureSecretKey(\n cwd: string,\n): Promise<{ key: string; isNew: boolean }> {\n const secrets = await ensureStudioSecrets(cwd);\n return { key: secrets.key, isNew: secrets.isNew };\n}\n\nexport async function readSecretKey(cwd: string): Promise<string | null> {\n try {\n const envContent = await readEnvFile(cwd);\n const parsed = parseEnv(envContent);\n return parsed[SECRET_KEY] ?? null;\n } catch {\n return null;\n }\n}\n\nexport async function readStudioSecrets(cwd: string): Promise<{\n key: string;\n studioPassword: string;\n studioAdminUser: string;\n} | null> {\n try {\n const envContent = await readEnvFile(cwd);\n const parsed = parseEnv(envContent);\n const key = parsed[SECRET_KEY];\n const studioPassword = parsed[STUDIO_PASSWORD];\n const studioAdminUser = parsed[STUDIO_ADMIN_USER] || \"admin\";\n if (!key || !studioPassword) return null;\n return { key, studioPassword, studioAdminUser };\n } catch {\n return null;\n }\n}\n","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 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\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 { workerUrl, deployedAt, accountId, studioCredentialsFingerprint, agents };\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 { readProjectState } from \"@/utils/project-state\";\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: \"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(workerName: string): 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: \"remote\",\n },\n secrets: {\n required: [\n \"KALP_SECRET_KEY\",\n \"KALP_STUDIO_PASSWORD\",\n \"KALP_STUDIO_ADMIN_USER\",\n ],\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 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 const agentsSnapshot = await createAgentsSnapshot(cwd, mode);\n await writeFile(\n join(runtimeDir, \"agents.snapshot.json\"),\n `${JSON.stringify(agentsSnapshot, null, 2)}\\n`,\n \"utf-8\",\n );\n\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const wranglerConfig = createRuntimeConfig(workerName);\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"],"mappings":"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","names":["readFile","writeFile","join","mkdir","readFile","writeFile","join","join","readFile","writeFile","mkdir"]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZMNBWAXJ.js";
|
|
5
5
|
import {
|
|
6
6
|
ensureStudioSecrets,
|
|
7
7
|
materializeRuntime,
|
|
8
8
|
readProjectState,
|
|
9
9
|
writeProjectState
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-MA4DL2YO.js";
|
|
11
11
|
import {
|
|
12
12
|
requireAuth
|
|
13
13
|
} from "./chunk-5RODADXW.js";
|
|
14
14
|
|
|
15
15
|
// src/utils/deploy.ts
|
|
16
16
|
import { readFile as readFile2, writeFile } from "fs/promises";
|
|
17
|
+
import { createHash } from "crypto";
|
|
17
18
|
|
|
18
19
|
// src/utils/ai.ts
|
|
19
20
|
import { access, readFile } from "fs/promises";
|
|
@@ -156,17 +157,28 @@ async function runInitialDeploy(cwd) {
|
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
159
|
const workerUrl = deploy.workerUrl;
|
|
160
|
+
const customDomains = deploy.customDomains ?? [];
|
|
159
161
|
const existingState = await readProjectState(cwd);
|
|
162
|
+
const credentialsFingerprint = createHash("sha256").update(`${secrets.studioAdminUser}:${secrets.studioPassword}`).digest("hex");
|
|
163
|
+
const credentialsChanged = existingState?.studioCredentialsFingerprint !== credentialsFingerprint;
|
|
160
164
|
await writeProjectState(cwd, {
|
|
161
165
|
workerUrl,
|
|
162
166
|
deployedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
163
167
|
accountId: auth.accountId,
|
|
168
|
+
studioCredentialsFingerprint: credentialsFingerprint,
|
|
164
169
|
agents: existingState?.agents ?? {}
|
|
165
170
|
});
|
|
166
|
-
return {
|
|
171
|
+
return {
|
|
172
|
+
workerUrl,
|
|
173
|
+
customDomains,
|
|
174
|
+
accountId: auth.accountId,
|
|
175
|
+
studioAdminUser: secrets.studioAdminUser,
|
|
176
|
+
studioPassword: secrets.studioPassword,
|
|
177
|
+
credentialsChanged
|
|
178
|
+
};
|
|
167
179
|
}
|
|
168
180
|
|
|
169
181
|
export {
|
|
170
182
|
runInitialDeploy
|
|
171
183
|
};
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-PTC5NIXY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/deploy.ts","../src/utils/ai.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { execa } from \"execa\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { ensureStudioSecrets } from \"@/utils/secret\";\nimport { readProjectState, writeProjectState } from \"@/utils/project-state\";\nimport { materializeRuntime } from \"@/utils/runtime\";\nimport {\n getRequiredSecretForProvider,\n readDotEnv,\n resolveProviderFromConfig,\n} from \"@/utils/ai\";\nimport { resolveProvider } from \"@/utils/providers\";\n\nfunction findWorkersUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\ninterface RuntimeWranglerConfig {\n name?: string;\n kv_namespaces?: Array<{ binding: string; id?: string }>;\n}\n\ninterface KvNamespaceInfo {\n id: string;\n title: string;\n}\n\nasync function readWranglerConfig(\n configPath: string,\n): Promise<RuntimeWranglerConfig> {\n const text = await readFile(configPath, \"utf-8\");\n return JSON.parse(text) as RuntimeWranglerConfig;\n}\n\nasync function writeWranglerConfig(\n configPath: string,\n config: RuntimeWranglerConfig,\n): Promise<void> {\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction deriveKvNamespaceTitle(workerName: string, binding: string): string {\n return `${workerName}-${binding.toLowerCase().replace(/_/g, \"-\")}`;\n}\n\nfunction parseKvListOutput(stdout: string): KvNamespaceInfo[] {\n const trimmed = stdout.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return parsed\n .map((item) => ({\n id: String((item as { id?: string }).id ?? \"\"),\n title: String((item as { title?: string }).title ?? \"\"),\n }))\n .filter((item) => !!item.id && !!item.title);\n }\n } catch {\n // fallback to text parsing below\n }\n\n const matches = trimmed.match(/[a-f0-9]{32}\\s+[^\\r\\n]+/gi) ?? [];\n return matches\n .map((line) => {\n const [id, ...rest] = line.trim().split(/\\s+/g);\n return { id: id ?? \"\", title: rest.join(\" \") };\n })\n .filter((item) => !!item.id && !!item.title);\n}\n\nasync function listKvNamespaces(\n cwd: string,\n configPath: string,\n): Promise<KvNamespaceInfo[]> {\n const provider = resolveProvider();\n const namespaces = await provider.listNamespaces({ cwd, configPath });\n return namespaces.map((item) => ({\n id: item.id,\n title: item.title,\n }));\n}\n\nasync function ensureKvNamespaceBindingId(\n cwd: string,\n configPath: string,\n): Promise<string | null> {\n const config = await readWranglerConfig(configPath);\n const binding = config.kv_namespaces?.find(\n (item) => item.binding === \"KALP_MANIFESTS\",\n );\n\n if (!binding || !config.name) return null;\n if (binding.id) return binding.id;\n\n const expectedTitle = deriveKvNamespaceTitle(config.name, binding.binding);\n const namespaces = await listKvNamespaces(cwd, configPath);\n const existing = namespaces.find((item) => item.title === expectedTitle);\n if (!existing) return null;\n\n binding.id = existing.id;\n await writeWranglerConfig(configPath, config);\n return existing.id;\n}\n\nfunction isNamespaceAlreadyExistsError(output: string): boolean {\n return output.includes(\"[code: 10014]\") && output.includes(\"already exists\");\n}\n\nasync function resolveWorkerUrl(\n configPath: string,\n deployOutput: string,\n): Promise<string> {\n const fromOutput = findWorkersUrl(deployOutput);\n if (fromOutput) return fromOutput;\n\n const configText = await readFile(configPath, \"utf-8\").catch(\n () => null as string | null,\n );\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n\n if (workerName) {\n return `https://${workerName}.workers.dev`;\n }\n\n throw new Error(\"Could not resolve worker URL from wrangler deploy output.\");\n}\n\nexport async function runInitialDeploy(cwd: string): Promise<{\n workerUrl: string;\n customDomains: string[];\n accountId: string;\n studioAdminUser: string;\n studioPassword: string;\n credentialsChanged: boolean;\n}> {\n const auth = await requireAuth();\n const aiProvider = await resolveProviderFromConfig(cwd);\n const requiredProviderSecret = getRequiredSecretForProvider(aiProvider);\n const envMap = await readDotEnv(cwd);\n const providerSecretValue = envMap[requiredProviderSecret]?.trim();\n if (!providerSecretValue) {\n throw new Error(\n `Missing required secret ${requiredProviderSecret} for provider \"${aiProvider}\". Add it to .env before deploy.`,\n );\n }\n\n const secrets = await ensureStudioSecrets(cwd);\n const runtimeProvider = resolveProvider();\n const runtime = await materializeRuntime(cwd);\n let secretSyncFailed = false;\n const secretEntries = [\n [\"KALP_SECRET_KEY\", secrets.key],\n [\"KALP_STUDIO_PASSWORD\", secrets.studioPassword],\n [\"KALP_STUDIO_ADMIN_USER\", secrets.studioAdminUser],\n [requiredProviderSecret, providerSecretValue],\n ] as const;\n\n for (const [name, value] of secretEntries) {\n try {\n await runtimeProvider.putSecret({\n cwd,\n configPath: runtime.wranglerConfigPath,\n name,\n value,\n });\n } catch {\n secretSyncFailed = true;\n break;\n }\n }\n\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath).catch(\n () => null,\n );\n\n const deployArgs = secretSyncFailed\n ? [\n \"wrangler\",\n \"deploy\",\n \"--config\",\n runtime.wranglerConfigPath,\n \"--secrets-file\",\n \".env\",\n ]\n : [\"wrangler\", \"deploy\", \"--config\", runtime.wranglerConfigPath];\n\n let deploy = await runtimeProvider\n .deployRuntime({\n cwd,\n configPath: runtime.wranglerConfigPath,\n useSecretsFile: secretSyncFailed,\n })\n .catch((error) => error);\n if (deploy instanceof Error) {\n const combined = deploy.message;\n if (isNamespaceAlreadyExistsError(combined)) {\n await ensureKvNamespaceBindingId(cwd, runtime.wranglerConfigPath);\n deploy = await runtimeProvider.deployRuntime({\n cwd,\n configPath: runtime.wranglerConfigPath,\n useSecretsFile: secretSyncFailed,\n });\n } else {\n throw deploy;\n }\n }\n\n const workerUrl = deploy.workerUrl;\n const customDomains = deploy.customDomains ?? [];\n\n const existingState = await readProjectState(cwd);\n\n const credentialsFingerprint = createHash(\"sha256\")\n .update(`${secrets.studioAdminUser}:${secrets.studioPassword}`)\n .digest(\"hex\");\n const credentialsChanged =\n existingState?.studioCredentialsFingerprint !== credentialsFingerprint;\n\n await writeProjectState(cwd, {\n workerUrl,\n deployedAt: new Date().toISOString(),\n accountId: auth.accountId,\n studioCredentialsFingerprint: credentialsFingerprint,\n agents: existingState?.agents ?? {},\n });\n\n return {\n workerUrl,\n customDomains,\n accountId: auth.accountId,\n studioAdminUser: secrets.studioAdminUser,\n studioPassword: secrets.studioPassword,\n credentialsChanged,\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"],"mappings":"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","names":["readFile","readFile"]}
|
|
@@ -25,6 +25,83 @@ function findWorkerUrl(output) {
|
|
|
25
25
|
const match = output.match(/https:\/\/[^\s]+\.workers\.dev/);
|
|
26
26
|
return match?.[0] ?? null;
|
|
27
27
|
}
|
|
28
|
+
function normalizeDomainCandidate(value) {
|
|
29
|
+
const trimmed = value.trim();
|
|
30
|
+
if (!trimmed || trimmed.includes("@")) return null;
|
|
31
|
+
const fromUrl = trimmed.match(/^https?:\/\/([^/\s]+)/i)?.[1];
|
|
32
|
+
const candidate = (fromUrl ?? trimmed).replace(/^https?:\/\//i, "").split("/")[0] ?? "";
|
|
33
|
+
const host = candidate.replace(/^\*\./, "").toLowerCase();
|
|
34
|
+
if (!host) return null;
|
|
35
|
+
if (host.includes("*")) return null;
|
|
36
|
+
if (host.endsWith(".workers.dev")) return null;
|
|
37
|
+
if (host.endsWith(".pages.dev")) return null;
|
|
38
|
+
if (!/^[a-z0-9.-]+\.[a-z]{2,}$/i.test(host)) return null;
|
|
39
|
+
return host;
|
|
40
|
+
}
|
|
41
|
+
function extractCustomDomainsFromRoutesConfig(configText) {
|
|
42
|
+
const routesMatch = configText.match(/"routes"\s*:\s*(\[[\s\S]*?\])/);
|
|
43
|
+
if (!routesMatch) return [];
|
|
44
|
+
const serializedRoutes = routesMatch[1];
|
|
45
|
+
if (!serializedRoutes) return [];
|
|
46
|
+
try {
|
|
47
|
+
const routes = JSON.parse(serializedRoutes);
|
|
48
|
+
if (!Array.isArray(routes)) return [];
|
|
49
|
+
const domains = routes.filter((route) => route?.custom_domain === true).map((route) => normalizeDomainCandidate(String(route.pattern ?? ""))).filter((domain) => !!domain);
|
|
50
|
+
return [...new Set(domains)];
|
|
51
|
+
} catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function collectDomainsFromStatusNode(node, keyHint, out) {
|
|
56
|
+
if (typeof node === "string") {
|
|
57
|
+
if (keyHint && /(domain|route|pattern)/i.test(keyHint)) {
|
|
58
|
+
const normalized = normalizeDomainCandidate(node);
|
|
59
|
+
if (normalized) out.add(normalized);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (Array.isArray(node)) {
|
|
64
|
+
for (const item of node) {
|
|
65
|
+
collectDomainsFromStatusNode(item, keyHint, out);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!node || typeof node !== "object") return;
|
|
70
|
+
for (const [key, value] of Object.entries(node)) {
|
|
71
|
+
collectDomainsFromStatusNode(value, key, out);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function parseCustomDomainsFromStatusOutput(statusJson) {
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(statusJson);
|
|
77
|
+
const domains = /* @__PURE__ */ new Set();
|
|
78
|
+
collectDomainsFromStatusNode(parsed, null, domains);
|
|
79
|
+
return [...domains].sort((a, b) => a.localeCompare(b));
|
|
80
|
+
} catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function resolveCustomDomains(params) {
|
|
85
|
+
const { cwd, configPath, workerName } = params;
|
|
86
|
+
const status = await execa(
|
|
87
|
+
"npx",
|
|
88
|
+
[
|
|
89
|
+
"wrangler",
|
|
90
|
+
"deployments",
|
|
91
|
+
"status",
|
|
92
|
+
"--name",
|
|
93
|
+
workerName,
|
|
94
|
+
"--json",
|
|
95
|
+
"--config",
|
|
96
|
+
configPath
|
|
97
|
+
],
|
|
98
|
+
{ cwd }
|
|
99
|
+
).catch(() => null);
|
|
100
|
+
const fromStatus = status ? parseCustomDomainsFromStatusOutput(status.stdout) : [];
|
|
101
|
+
if (fromStatus.length > 0) return fromStatus;
|
|
102
|
+
const configText = await readFile(configPath, "utf-8").catch(() => "");
|
|
103
|
+
return extractCustomDomainsFromRoutesConfig(configText);
|
|
104
|
+
}
|
|
28
105
|
var cloudflareProvider = {
|
|
29
106
|
name: "cloudflare",
|
|
30
107
|
async login() {
|
|
@@ -51,15 +128,20 @@ var cloudflareProvider = {
|
|
|
51
128
|
const deploy = await execa("npx", args, { cwd });
|
|
52
129
|
const rawOutput = [deploy.stdout, deploy.stderr].filter(Boolean).join("\n");
|
|
53
130
|
const workerUrl = findWorkerUrl(rawOutput);
|
|
131
|
+
const configText = await readFile(configPath, "utf-8").catch(() => null);
|
|
132
|
+
const workerName = configText?.match(/"name"\s*:\s*"([^"]+)"/)?.[1];
|
|
133
|
+
const customDomains = workerName ? await resolveCustomDomains({ cwd, configPath, workerName }).catch(() => []) : [];
|
|
54
134
|
if (!workerUrl) {
|
|
55
|
-
const configText = await readFile(configPath, "utf-8").catch(() => null);
|
|
56
|
-
const workerName = configText?.match(/"name"\s*:\s*"([^"]+)"/)?.[1];
|
|
57
135
|
if (!workerName) {
|
|
58
136
|
throw new Error("Could not resolve runtime URL from deployment output.");
|
|
59
137
|
}
|
|
60
|
-
return {
|
|
138
|
+
return {
|
|
139
|
+
workerUrl: `https://${workerName}.workers.dev`,
|
|
140
|
+
customDomains,
|
|
141
|
+
rawOutput
|
|
142
|
+
};
|
|
61
143
|
}
|
|
62
|
-
return { workerUrl, rawOutput };
|
|
144
|
+
return { workerUrl, customDomains, rawOutput };
|
|
63
145
|
},
|
|
64
146
|
async putManifest({ cwd, configPath, key, jsonPath }) {
|
|
65
147
|
await execa(
|
|
@@ -144,4 +226,4 @@ function resolveProvider() {
|
|
|
144
226
|
export {
|
|
145
227
|
resolveProvider
|
|
146
228
|
};
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
229
|
+
//# sourceMappingURL=chunk-ZMNBWAXJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/providers/cloudflare.ts","../src/utils/providers/index.ts"],"sourcesContent":["import { execa } from \"execa\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { RuntimeProvider } from \"@/utils/providers/types\";\nimport { getCloudflareIdentity } from \"@/utils/auth\";\n\nfunction parseNamespaceList(stdout: string): Array<{ id: string; title: string }> {\n try {\n const parsed = JSON.parse(stdout);\n if (Array.isArray(parsed)) {\n return parsed\n .map((item) => ({\n id: String((item as { id?: string }).id ?? \"\"),\n title: String((item as { title?: string }).title ?? \"\"),\n }))\n .filter((item) => !!item.id && !!item.title);\n }\n } catch {}\n return [];\n}\n\nfunction findWorkerUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev/);\n return match?.[0] ?? null;\n}\n\nfunction normalizeDomainCandidate(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed || trimmed.includes(\"@\")) return null;\n\n const fromUrl = trimmed.match(/^https?:\\/\\/([^/\\s]+)/i)?.[1];\n const candidate = (fromUrl ?? trimmed).replace(/^https?:\\/\\//i, \"\").split(\"/\")[0] ?? \"\";\n const host = candidate.replace(/^\\*\\./, \"\").toLowerCase();\n\n if (!host) return null;\n if (host.includes(\"*\")) return null;\n if (host.endsWith(\".workers.dev\")) return null;\n if (host.endsWith(\".pages.dev\")) return null;\n if (!/^[a-z0-9.-]+\\.[a-z]{2,}$/i.test(host)) return null;\n return host;\n}\n\nfunction extractCustomDomainsFromRoutesConfig(configText: string): string[] {\n const routesMatch = configText.match(/\"routes\"\\s*:\\s*(\\[[\\s\\S]*?\\])/);\n if (!routesMatch) return [];\n const serializedRoutes = routesMatch[1];\n if (!serializedRoutes) return [];\n\n try {\n const routes = JSON.parse(serializedRoutes) as Array<{\n pattern?: string;\n custom_domain?: boolean;\n }>;\n if (!Array.isArray(routes)) return [];\n const domains = routes\n .filter((route) => route?.custom_domain === true)\n .map((route) => normalizeDomainCandidate(String(route.pattern ?? \"\")))\n .filter((domain): domain is string => !!domain);\n return [...new Set(domains)];\n } catch {\n return [];\n }\n}\n\nfunction collectDomainsFromStatusNode(\n node: unknown,\n keyHint: string | null,\n out: Set<string>,\n): void {\n if (typeof node === \"string\") {\n if (keyHint && /(domain|route|pattern)/i.test(keyHint)) {\n const normalized = normalizeDomainCandidate(node);\n if (normalized) out.add(normalized);\n }\n return;\n }\n\n if (Array.isArray(node)) {\n for (const item of node) {\n collectDomainsFromStatusNode(item, keyHint, out);\n }\n return;\n }\n\n if (!node || typeof node !== \"object\") return;\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n collectDomainsFromStatusNode(value, key, out);\n }\n}\n\nfunction parseCustomDomainsFromStatusOutput(statusJson: string): string[] {\n try {\n const parsed = JSON.parse(statusJson) as unknown;\n const domains = new Set<string>();\n collectDomainsFromStatusNode(parsed, null, domains);\n return [...domains].sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nasync function resolveCustomDomains(params: {\n cwd: string;\n configPath: string;\n workerName: string;\n}): Promise<string[]> {\n const { cwd, configPath, workerName } = params;\n\n const status = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"deployments\",\n \"status\",\n \"--name\",\n workerName,\n \"--json\",\n \"--config\",\n configPath,\n ],\n { cwd },\n ).catch(() => null);\n\n const fromStatus = status ? parseCustomDomainsFromStatusOutput(status.stdout) : [];\n if (fromStatus.length > 0) return fromStatus;\n\n const configText = await readFile(configPath, \"utf-8\").catch(() => \"\");\n return extractCustomDomainsFromRoutesConfig(configText);\n}\n\nexport const cloudflareProvider: RuntimeProvider = {\n name: \"cloudflare\",\n async login() {\n await execa(\"npx\", [\"wrangler\", \"login\"], { stdio: \"inherit\" });\n },\n async whoami() {\n const identity = await getCloudflareIdentity();\n const account = identity?.accounts?.[0];\n const accountId = account?.id ?? account?.account_tag;\n const email = identity?.email;\n if (!accountId || !email) return null;\n return { provider: \"cloudflare\", accountId, email };\n },\n async putSecret({ cwd, configPath, name, value }) {\n await execa(\n \"npx\",\n [\"wrangler\", \"secret\", \"put\", name, \"--config\", configPath],\n { cwd, input: `${value}\\n` },\n );\n },\n async deployRuntime({ cwd, configPath, useSecretsFile }) {\n const args = useSecretsFile\n ? [\"wrangler\", \"deploy\", \"--config\", configPath, \"--secrets-file\", \".env\"]\n : [\"wrangler\", \"deploy\", \"--config\", configPath];\n const deploy = await execa(\"npx\", args, { cwd });\n const rawOutput = [deploy.stdout, deploy.stderr].filter(Boolean).join(\"\\n\");\n const workerUrl = findWorkerUrl(rawOutput);\n const configText = await readFile(configPath, \"utf-8\").catch(() => null);\n const workerName = configText?.match(/\"name\"\\s*:\\s*\"([^\"]+)\"/)?.[1];\n const customDomains = workerName\n ? await resolveCustomDomains({ cwd, configPath, workerName }).catch(() => [])\n : [];\n\n if (!workerUrl) {\n if (!workerName) {\n throw new Error(\"Could not resolve runtime URL from deployment output.\");\n }\n return {\n workerUrl: `https://${workerName}.workers.dev`,\n customDomains,\n rawOutput,\n };\n }\n return { workerUrl, customDomains, rawOutput };\n },\n async putManifest({ cwd, configPath, key, jsonPath }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n \"--path\",\n jsonPath,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n );\n },\n async putValue({ cwd, configPath, key, value }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"put\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n value,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n );\n },\n async getValue({ cwd, configPath, key }) {\n const result = await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"get\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\n \"--remote\",\n \"--config\",\n configPath,\n ],\n { cwd },\n ).catch(() => null);\n const output = result?.stdout?.trim();\n return output ? output : null;\n },\n async listNamespaces({ cwd, configPath }) {\n const json = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath, \"--json\"],\n { cwd },\n ).catch(() => null);\n if (json) return parseNamespaceList(json.stdout);\n const plain = await execa(\n \"npx\",\n [\"wrangler\", \"kv\", \"namespace\", \"list\", \"--config\", configPath],\n { cwd },\n );\n return parseNamespaceList(plain.stdout);\n },\n};\n\nexport async function withTempJsonFile<T>(\n prefix: string,\n payload: unknown,\n fn: (path: string) => Promise<T>,\n): Promise<T> {\n const dir = await mkdtemp(join(tmpdir(), prefix));\n const filePath = join(dir, \"payload.json\");\n await writeFile(filePath, JSON.stringify(payload), \"utf-8\");\n try {\n return await fn(filePath);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","import { cloudflareProvider } from \"@/utils/providers/cloudflare\";\nimport type { RuntimeProvider } from \"@/utils/providers/types\";\n\nexport function resolveProvider(): RuntimeProvider {\n return cloudflareProvider;\n}\n\nexport type { RuntimeProvider, ProviderIdentity, DeployResult } from \"@/utils/providers/types\";\n"],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,SAAS,UAAU,IAAI,iBAAiB;AACjD,SAAS,YAAY;AACrB,SAAS,cAAc;AAIvB,SAAS,mBAAmB,QAAsD;AAChF,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OACJ,IAAI,CAAC,UAAU;AAAA,QACd,IAAI,OAAQ,KAAyB,MAAM,EAAE;AAAA,QAC7C,OAAO,OAAQ,KAA4B,SAAS,EAAE;AAAA,MACxD,EAAE,EACD,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,KAAK;AAAA,IAC/C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO,CAAC;AACV;AAEA,SAAS,cAAc,QAA+B;AACpD,QAAM,QAAQ,OAAO,MAAM,gCAAgC;AAC3D,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,SAAS,yBAAyB,OAA8B;AAC9D,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,QAAQ,SAAS,GAAG,EAAG,QAAO;AAE9C,QAAM,UAAU,QAAQ,MAAM,wBAAwB,IAAI,CAAC;AAC3D,QAAM,aAAa,WAAW,SAAS,QAAQ,iBAAiB,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AACrF,QAAM,OAAO,UAAU,QAAQ,SAAS,EAAE,EAAE,YAAY;AAExD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,MAAI,KAAK,SAAS,cAAc,EAAG,QAAO;AAC1C,MAAI,KAAK,SAAS,YAAY,EAAG,QAAO;AACxC,MAAI,CAAC,4BAA4B,KAAK,IAAI,EAAG,QAAO;AACpD,SAAO;AACT;AAEA,SAAS,qCAAqC,YAA8B;AAC1E,QAAM,cAAc,WAAW,MAAM,+BAA+B;AACpE,MAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,QAAM,mBAAmB,YAAY,CAAC;AACtC,MAAI,CAAC,iBAAkB,QAAO,CAAC;AAE/B,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,gBAAgB;AAI1C,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,UAAM,UAAU,OACb,OAAO,CAAC,UAAU,OAAO,kBAAkB,IAAI,EAC/C,IAAI,CAAC,UAAU,yBAAyB,OAAO,MAAM,WAAW,EAAE,CAAC,CAAC,EACpE,OAAO,CAAC,WAA6B,CAAC,CAAC,MAAM;AAChD,WAAO,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAAA,EAC7B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,6BACP,MACA,SACA,KACM;AACN,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,WAAW,0BAA0B,KAAK,OAAO,GAAG;AACtD,YAAM,aAAa,yBAAyB,IAAI;AAChD,UAAI,WAAY,KAAI,IAAI,UAAU;AAAA,IACpC;AACA;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAW,QAAQ,MAAM;AACvB,mCAA6B,MAAM,SAAS,GAAG;AAAA,IACjD;AACA;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA+B,GAAG;AAC1E,iCAA6B,OAAO,KAAK,GAAG;AAAA,EAC9C;AACF;AAEA,SAAS,mCAAmC,YAA8B;AACxE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,iCAA6B,QAAQ,MAAM,OAAO;AAClD,WAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,qBAAqB,QAId;AACpB,QAAM,EAAE,KAAK,YAAY,WAAW,IAAI;AAExC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,EAAE,IAAI;AAAA,EACR,EAAE,MAAM,MAAM,IAAI;AAElB,QAAM,aAAa,SAAS,mCAAmC,OAAO,MAAM,IAAI,CAAC;AACjF,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,QAAM,aAAa,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM,EAAE;AACrE,SAAO,qCAAqC,UAAU;AACxD;AAEO,IAAM,qBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,MAAM,QAAQ;AACZ,UAAM,MAAM,OAAO,CAAC,YAAY,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AAAA,EAChE;AAAA,EACA,MAAM,SAAS;AACb,UAAM,WAAW,MAAM,sBAAsB;AAC7C,UAAM,UAAU,UAAU,WAAW,CAAC;AACtC,UAAM,YAAY,SAAS,MAAM,SAAS;AAC1C,UAAM,QAAQ,UAAU;AACxB,QAAI,CAAC,aAAa,CAAC,MAAO,QAAO;AACjC,WAAO,EAAE,UAAU,cAAc,WAAW,MAAM;AAAA,EACpD;AAAA,EACA,MAAM,UAAU,EAAE,KAAK,YAAY,MAAM,MAAM,GAAG;AAChD,UAAM;AAAA,MACJ;AAAA,MACA,CAAC,YAAY,UAAU,OAAO,MAAM,YAAY,UAAU;AAAA,MAC1D,EAAE,KAAK,OAAO,GAAG,KAAK;AAAA,EAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,MAAM,cAAc,EAAE,KAAK,YAAY,eAAe,GAAG;AACvD,UAAM,OAAO,iBACT,CAAC,YAAY,UAAU,YAAY,YAAY,kBAAkB,MAAM,IACvE,CAAC,YAAY,UAAU,YAAY,UAAU;AACjD,UAAM,SAAS,MAAM,MAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AAC/C,UAAM,YAAY,CAAC,OAAO,QAAQ,OAAO,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC1E,UAAM,YAAY,cAAc,SAAS;AACzC,UAAM,aAAa,MAAM,SAAS,YAAY,OAAO,EAAE,MAAM,MAAM,IAAI;AACvE,UAAM,aAAa,YAAY,MAAM,wBAAwB,IAAI,CAAC;AAClE,UAAM,gBAAgB,aAClB,MAAM,qBAAqB,EAAE,KAAK,YAAY,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC,IAC1E,CAAC;AAEL,QAAI,CAAC,WAAW;AACd,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,uDAAuD;AAAA,MACzE;AACA,aAAO;AAAA,QACL,WAAW,WAAW,UAAU;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,WAAW,eAAe,UAAU;AAAA,EAC/C;AAAA,EACA,MAAM,YAAY,EAAE,KAAK,YAAY,KAAK,SAAS,GAAG;AACpD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,SAAS,EAAE,KAAK,YAAY,KAAK,MAAM,GAAG;AAC9C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,SAAS,EAAE,KAAK,YAAY,IAAI,GAAG;AACvC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,EAAE,IAAI;AAAA,IACR,EAAE,MAAM,MAAM,IAAI;AAClB,UAAM,SAAS,QAAQ,QAAQ,KAAK;AACpC,WAAO,SAAS,SAAS;AAAA,EAC3B;AAAA,EACA,MAAM,eAAe,EAAE,KAAK,WAAW,GAAG;AACxC,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA,CAAC,YAAY,MAAM,aAAa,QAAQ,YAAY,YAAY,QAAQ;AAAA,MACxE,EAAE,IAAI;AAAA,IACR,EAAE,MAAM,MAAM,IAAI;AAClB,QAAI,KAAM,QAAO,mBAAmB,KAAK,MAAM;AAC/C,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,CAAC,YAAY,MAAM,aAAa,QAAQ,YAAY,UAAU;AAAA,MAC9D,EAAE,IAAI;AAAA,IACR;AACA,WAAO,mBAAmB,MAAM,MAAM;AAAA,EACxC;AACF;;;ACtPO,SAAS,kBAAmC;AACjD,SAAO;AACT;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runInitialDeploy
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PTC5NIXY.js";
|
|
5
|
+
import "./chunk-ZMNBWAXJ.js";
|
|
6
|
+
import "./chunk-MA4DL2YO.js";
|
|
7
7
|
import {
|
|
8
8
|
requireAuth
|
|
9
9
|
} from "./chunk-5RODADXW.js";
|
|
@@ -37,6 +37,30 @@ var deploy_default = defineCommand({
|
|
|
37
37
|
const result = await runInitialDeploy(cwd);
|
|
38
38
|
s.stop("Deployment completed");
|
|
39
39
|
p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);
|
|
40
|
+
if (result.customDomains.length > 0) {
|
|
41
|
+
p.note(
|
|
42
|
+
result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join("\n"),
|
|
43
|
+
"Custom domains detected"
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const preferredStudioBase = result.customDomains.length > 0 ? `https://${result.customDomains[0]}` : result.workerUrl;
|
|
47
|
+
if (result.credentialsChanged) {
|
|
48
|
+
p.note(
|
|
49
|
+
[
|
|
50
|
+
`${pc.bold("Studio credentials")}`,
|
|
51
|
+
`${pc.dim("Username:")} ${pc.cyan(result.studioAdminUser)}`,
|
|
52
|
+
`${pc.dim("Password:")} ${pc.cyan(result.studioPassword)}`,
|
|
53
|
+
`${pc.dim("Studio:")} ${pc.cyan(`${preferredStudioBase.replace(/\/$/, "")}/studio/login`)}`
|
|
54
|
+
].join("\n"),
|
|
55
|
+
"Admin access"
|
|
56
|
+
);
|
|
57
|
+
} else {
|
|
58
|
+
p.log.info(
|
|
59
|
+
pc.dim(
|
|
60
|
+
"Studio credentials unchanged. Check your local .env if you need to recover them."
|
|
61
|
+
)
|
|
62
|
+
);
|
|
63
|
+
}
|
|
40
64
|
p.outro(pc.green("Your runtime is ready"));
|
|
41
65
|
} catch (error) {
|
|
42
66
|
s.stop("Deployment failed");
|
|
@@ -50,4 +74,4 @@ var deploy_default = defineCommand({
|
|
|
50
74
|
export {
|
|
51
75
|
deploy_default as default
|
|
52
76
|
};
|
|
53
|
-
//# sourceMappingURL=deploy-
|
|
77
|
+
//# sourceMappingURL=deploy-N2QEGCHR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/deploy.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { requireAuth } from \"@/utils/auth\";\nimport { runInitialDeploy } from \"@/utils/deploy\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"deploy\", description: \"Deploy your agents runtime\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp deploy\")}`);\n\n await requireAuth().catch(() => {\n p.log.error(\"Not authenticated. Run `kalp login` first.\");\n process.exit(1);\n });\n\n const proceed = await p.confirm({\n message: \"Deploy your 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(\"Deploying your agents runtime\");\n\n try {\n const result = await runInitialDeploy(cwd);\n s.stop(\"Deployment completed\");\n p.log.success(`Runtime URL: ${pc.cyan(result.workerUrl)}`);\n if (result.customDomains.length > 0) {\n p.note(\n result.customDomains.map((domain) => pc.cyan(`https://${domain}`)).join(\"\\n\"),\n \"Custom domains detected\",\n );\n }\n\n const preferredStudioBase =\n result.customDomains.length > 0\n ? `https://${result.customDomains[0]}`\n : result.workerUrl;\n\n if (result.credentialsChanged) {\n p.note(\n [\n `${pc.bold(\"Studio credentials\")}`,\n `${pc.dim(\"Username:\")} ${pc.cyan(result.studioAdminUser)}`,\n `${pc.dim(\"Password:\")} ${pc.cyan(result.studioPassword)}`,\n `${pc.dim(\"Studio:\")} ${pc.cyan(`${preferredStudioBase.replace(/\\/$/, \"\")}/studio/login`)}`,\n ].join(\"\\n\"),\n \"Admin access\",\n );\n } else {\n p.log.info(\n pc.dim(\n \"Studio credentials unchanged. Check your local .env if you need to recover them.\",\n ),\n );\n }\n p.outro(pc.green(\"Your runtime is ready\"));\n } catch (error) {\n s.stop(\"Deployment failed\");\n p.log.error(\n error instanceof Error ? error.message : \"Unknown deployment error\",\n );\n process.exit(1);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AAIf,IAAM,OAAO;AAEb,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,EAClE,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,aAAa,CAAC,EAAE;AAE3C,UAAM,YAAY,EAAE,MAAM,MAAM;AAC9B,MAAE,MAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,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,+BAA+B;AAEvC,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,GAAG;AACzC,QAAE,KAAK,sBAAsB;AAC7B,MAAE,MAAI,QAAQ,gBAAgB,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE;AACzD,UAAI,OAAO,cAAc,SAAS,GAAG;AACnC,QAAE;AAAA,UACA,OAAO,cAAc,IAAI,CAAC,WAAW,GAAG,KAAK,WAAW,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,sBACJ,OAAO,cAAc,SAAS,IAC1B,WAAW,OAAO,cAAc,CAAC,CAAC,KAClC,OAAO;AAEb,UAAI,OAAO,oBAAoB;AAC7B,QAAE;AAAA,UACA;AAAA,YACE,GAAG,GAAG,KAAK,oBAAoB,CAAC;AAAA,YAChC,GAAG,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,eAAe,CAAC;AAAA,YACzD,GAAG,GAAG,IAAI,WAAW,CAAC,IAAI,GAAG,KAAK,OAAO,cAAc,CAAC;AAAA,YACxD,GAAG,GAAG,IAAI,SAAS,CAAC,IAAI,GAAG,KAAK,GAAG,oBAAoB,QAAQ,OAAO,EAAE,CAAC,eAAe,CAAC;AAAA,UAC3F,EAAE,KAAK,IAAI;AAAA,UACX;AAAA,QACF;AAAA,MACF,OAAO;AACL,QAAE,MAAI;AAAA,UACJ,GAAG;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAE,QAAM,GAAG,MAAM,uBAAuB,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,QAAE,KAAK,mBAAmB;AAC1B,MAAE,MAAI;AAAA,QACJ,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
ensureSecretKey,
|
|
4
4
|
materializeRuntime
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MA4DL2YO.js";
|
|
6
6
|
|
|
7
7
|
// src/commands/dev.ts
|
|
8
|
-
import { copyFile } from "fs/promises";
|
|
8
|
+
import { copyFile, readFile, writeFile } from "fs/promises";
|
|
9
9
|
import { join } from "path";
|
|
10
10
|
import { setTimeout as delay } from "timers/promises";
|
|
11
11
|
import { defineCommand } from "citty";
|
|
@@ -21,6 +21,17 @@ var dev_default = defineCommand({
|
|
|
21
21
|
p.intro(`${LOGO} ${pc.bold("kalp dev")}`);
|
|
22
22
|
await ensureSecretKey(cwd);
|
|
23
23
|
await copyFile(join(cwd, ".env"), join(cwd, ".dev.vars"));
|
|
24
|
+
const devVarsPath = join(cwd, ".dev.vars");
|
|
25
|
+
const devVarsContent = await readFile(devVarsPath, "utf-8");
|
|
26
|
+
const nextDevVars = devVarsContent.replace(/^KALP_ENV=.*$/m, "").replace(/^KALP_RUNTIME_MODE=.*$/m, "").trimEnd();
|
|
27
|
+
await writeFile(
|
|
28
|
+
devVarsPath,
|
|
29
|
+
`${nextDevVars}
|
|
30
|
+
KALP_ENV=local
|
|
31
|
+
KALP_RUNTIME_MODE=local
|
|
32
|
+
`,
|
|
33
|
+
"utf-8"
|
|
34
|
+
);
|
|
24
35
|
const runtime = await materializeRuntime(cwd, { mode: "local" });
|
|
25
36
|
p.note("Starting local runtime (wrangler dev :8787)");
|
|
26
37
|
const backend = execa(
|
|
@@ -56,4 +67,4 @@ var dev_default = defineCommand({
|
|
|
56
67
|
export {
|
|
57
68
|
dev_default as default
|
|
58
69
|
};
|
|
59
|
-
//# sourceMappingURL=dev-
|
|
70
|
+
//# sourceMappingURL=dev-HSFFD4Q5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/dev.ts"],"sourcesContent":["import { copyFile, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { execa } from \"execa\";\nimport open from \"open\";\nimport { ensureSecretKey } from \"@/utils/secret\";\nimport { materializeRuntime } from \"@/utils/runtime\";\n\nconst LOGO = \"🦋\";\n\nexport default defineCommand({\n meta: { name: \"dev\", description: \"Run Worker + Studio local environment\" },\n async run() {\n const cwd = process.cwd();\n\n p.intro(`${LOGO} ${pc.bold(\"kalp dev\")}`);\n\n await ensureSecretKey(cwd);\n await copyFile(join(cwd, \".env\"), join(cwd, \".dev.vars\"));\n const devVarsPath = join(cwd, \".dev.vars\");\n const devVarsContent = await readFile(devVarsPath, \"utf-8\");\n const nextDevVars = devVarsContent\n .replace(/^KALP_ENV=.*$/m, \"\")\n .replace(/^KALP_RUNTIME_MODE=.*$/m, \"\")\n .trimEnd();\n await writeFile(\n devVarsPath,\n `${nextDevVars}\\nKALP_ENV=local\\nKALP_RUNTIME_MODE=local\\n`,\n \"utf-8\",\n );\n const runtime = await materializeRuntime(cwd, { mode: \"local\" });\n\n p.note(\"Starting local runtime (wrangler dev :8787)\");\n\n const backend = execa(\n \"npx\",\n [\n \"wrangler\",\n \"dev\",\n \"--port\",\n \"8787\",\n \"--config\",\n runtime.wranglerConfigPath,\n ],\n { cwd, stdio: \"inherit\" },\n );\n\n const shutdown = () => {\n backend.kill(\"SIGINT\");\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await delay(2500);\n const studioUrl = \"http://localhost:8787/studio/login\";\n await open(studioUrl);\n p.log.success(`Studio opened at ${pc.cyan(studioUrl)}`);\n\n try {\n await backend;\n } finally {\n shutdown();\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n }\n },\n});\n"],"mappings":";;;;;;;AAAA,SAAS,UAAU,UAAU,iBAAiB;AAC9C,SAAS,YAAY;AACrB,SAAS,cAAc,aAAa;AACpC,SAAS,qBAAqB;AAC9B,YAAY,OAAO;AACnB,OAAO,QAAQ;AACf,SAAS,aAAa;AACtB,OAAO,UAAU;AAIjB,IAAM,OAAO;AAEb,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,wCAAwC;AAAA,EAC1E,MAAM,MAAM;AACV,UAAM,MAAM,QAAQ,IAAI;AAExB,IAAE,QAAM,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,CAAC,EAAE;AAExC,UAAM,gBAAgB,GAAG;AACzB,UAAM,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,WAAW,CAAC;AACxD,UAAM,cAAc,KAAK,KAAK,WAAW;AACzC,UAAM,iBAAiB,MAAM,SAAS,aAAa,OAAO;AAC1D,UAAM,cAAc,eACjB,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,2BAA2B,EAAE,EACrC,QAAQ;AACX,UAAM;AAAA,MACJ;AAAA,MACA,GAAG,WAAW;AAAA;AAAA;AAAA;AAAA,MACd;AAAA,IACF;AACA,UAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/D,IAAE,OAAK,6CAA6C;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA,EAAE,KAAK,OAAO,UAAU;AAAA,IAC1B;AAEA,UAAM,WAAW,MAAM;AACrB,cAAQ,KAAK,QAAQ;AAAA,IACvB;AAEA,YAAQ,GAAG,UAAU,QAAQ;AAC7B,YAAQ,GAAG,WAAW,QAAQ;AAE9B,UAAM,MAAM,IAAI;AAChB,UAAM,YAAY;AAClB,UAAM,KAAK,SAAS;AACpB,IAAE,MAAI,QAAQ,oBAAoB,GAAG,KAAK,SAAS,CAAC,EAAE;AAEtD,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,eAAS;AACT,cAAQ,IAAI,UAAU,QAAQ;AAC9B,cAAQ,IAAI,WAAW,QAAQ;AAAA,IACjC;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import pc from "picocolors";
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@kalphq/cli",
|
|
11
|
-
version: "0.0.0-dev-
|
|
11
|
+
version: "0.0.0-dev-20260512200204",
|
|
12
12
|
description: "Zero-config CLI for deploying Kalp agents",
|
|
13
13
|
type: "module",
|
|
14
14
|
license: "MIT",
|
|
@@ -93,13 +93,13 @@ var main = defineCommand({
|
|
|
93
93
|
},
|
|
94
94
|
subCommands: {
|
|
95
95
|
create: () => import("./create-XC55BUCS.js").then((r) => r.default),
|
|
96
|
-
deploy: () => import("./deploy-
|
|
97
|
-
push: () => import("./push-
|
|
96
|
+
deploy: () => import("./deploy-N2QEGCHR.js").then((r) => r.default),
|
|
97
|
+
push: () => import("./push-QTXCB5ZG.js").then((r) => r.default),
|
|
98
98
|
link: () => import("./link-WZQSR2TM.js").then((r) => r.default),
|
|
99
99
|
secrets: () => import("./secrets-P7ADVLOS.js").then((r) => r.default),
|
|
100
|
-
login: () => import("./login-
|
|
100
|
+
login: () => import("./login-CJJF46JM.js").then((r) => r.default),
|
|
101
101
|
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
102
|
-
dev: () => import("./dev-
|
|
102
|
+
dev: () => import("./dev-HSFFD4Q5.js").then((r) => r.default)
|
|
103
103
|
},
|
|
104
104
|
run({ args }) {
|
|
105
105
|
const firstArg = process.argv[2];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Publish agent runtime version\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Sign in to remote runtime\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { defineCommand, runMain } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport pkg from \"../package.json\";\n\nconst LOGO = \"🦋\";\n\nconst COMMANDS = [\n [\"create\", \"Add a new agent\"],\n [\"deploy\", \"Deploy your agents runtime\"],\n [\"push\", \"Publish agent runtime version\"],\n [\"link\", \"Link project to Kalp cloud\"],\n [\"secrets\", \"Manage secrets\"],\n [\"login\", \"Sign in to remote runtime\"],\n [\"logout\", \"Sign out from Kalp\"],\n [\"dev\", \"Run Worker + Studio locally\"],\n] as const;\n\nfunction printHelp(): void {\n p.log.info(`${pc.bold(\"Usage\")}: kalp <command> [options]`);\n console.log(\"\");\n p.log.info(pc.bold(\"Commands\"));\n\n for (const [name, desc] of COMMANDS) {\n console.log(` ${pc.cyan(name.padEnd(10))}${desc}`);\n }\n\n console.log(\"\");\n p.log.info(`Run ${pc.cyan(\"kalp <command> --help\")} for more info.`);\n}\n\nconst main = defineCommand({\n meta: {\n name: \"kalp\",\n version: pkg.version,\n description: \"🦋 Zero-config agent infrastructure\",\n },\n args: {\n help: {\n type: \"boolean\",\n alias: \"h\",\n description: \"Show help\",\n default: false,\n },\n },\n subCommands: {\n create: () => import(\"./commands/create\").then((r) => r.default),\n deploy: () => import(\"./commands/deploy\").then((r) => r.default),\n push: () => import(\"./commands/push\").then((r) => r.default),\n link: () => import(\"./commands/link\").then((r) => r.default),\n secrets: () => import(\"./commands/secrets\").then((r) => r.default),\n login: () => import(\"./commands/login\").then((r) => r.default),\n logout: () => import(\"./commands/logout\").then((r) => r.default),\n dev: () => import(\"./commands/dev\").then((r) => r.default),\n },\n run({ args }) {\n const firstArg = process.argv[2];\n\n if (args.help) {\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n return;\n }\n\n if (firstArg) {\n return;\n }\n\n p.intro(`${LOGO} ${pc.bold(\"kalp\")}`);\n printHelp();\n p.outro(\"Happy coding 🦋\");\n },\n});\n\nrunMain(main);\n","{\n \"name\": \"@kalphq/cli\",\n \"version\": \"0.0.0-dev-20260512200204\",\n \"description\": \"Zero-config CLI for deploying Kalp agents\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"author\": \"Kalp HQ\",\n \"bin\": {\n \"kalp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && pnpm run build:studio && pnpm run build:runtime-template\",\n \"build:studio\": \"pnpm --filter=@kalphq/studio build\",\n \"build:runtime-template\": \"node ./scripts/prepare-runtime-template.mjs\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"pnpm build\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"24.4.0\",\n \"@clack/prompts\": \"0.9.1\",\n \"@kalphq/compiler\": \"workspace:*\",\n \"@kalphq/project\": \"workspace:*\",\n \"@kalphq/sdk\": \"workspace:*\",\n \"citty\": \"0.1.6\",\n \"esbuild\": \"0.25.0\",\n \"execa\": \"^9.6.1\",\n \"jiti\": \"^2.6.1\",\n \"jose\": \"^5.10.0\",\n \"json-stable-stringify\": \"1.3.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"1.1.1\",\n \"zod\": \"3.25.76\"\n },\n \"devDependencies\": {\n \"@types/json-stable-stringify\": \"1.2.0\",\n \"@types/node\": \"^22.15.3\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.0.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZMNBWAXJ.js";
|
|
5
5
|
import {
|
|
6
6
|
saveAuthConfig
|
|
7
7
|
} from "./chunk-5RODADXW.js";
|
|
@@ -58,4 +58,4 @@ var login_default = defineCommand({
|
|
|
58
58
|
export {
|
|
59
59
|
login_default as default
|
|
60
60
|
};
|
|
61
|
-
//# sourceMappingURL=login-
|
|
61
|
+
//# sourceMappingURL=login-CJJF46JM.js.map
|
|
@@ -4,16 +4,16 @@ import {
|
|
|
4
4
|
} from "./chunk-INB3LG6O.js";
|
|
5
5
|
import {
|
|
6
6
|
runInitialDeploy
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-PTC5NIXY.js";
|
|
8
8
|
import {
|
|
9
9
|
resolveProvider
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ZMNBWAXJ.js";
|
|
11
11
|
import {
|
|
12
12
|
materializeRuntime,
|
|
13
13
|
readLocalAgentNames,
|
|
14
14
|
readProjectState,
|
|
15
15
|
writeProjectState
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-MA4DL2YO.js";
|
|
17
17
|
import {
|
|
18
18
|
requireAuth
|
|
19
19
|
} from "./chunk-5RODADXW.js";
|
|
@@ -147,6 +147,7 @@ function createInitialState() {
|
|
|
147
147
|
workerUrl: null,
|
|
148
148
|
deployedAt: null,
|
|
149
149
|
accountId: null,
|
|
150
|
+
studioCredentialsFingerprint: null,
|
|
150
151
|
agents: {}
|
|
151
152
|
};
|
|
152
153
|
}
|
|
@@ -174,7 +175,7 @@ async function readRemoteAgentsIndex(cwd, wranglerConfigPath) {
|
|
|
174
175
|
cwd,
|
|
175
176
|
configPath: wranglerConfigPath,
|
|
176
177
|
key: "agents:index"
|
|
177
|
-
});
|
|
178
|
+
}).catch(() => null);
|
|
178
179
|
if (!output) return [];
|
|
179
180
|
try {
|
|
180
181
|
const parsed = JSON.parse(output);
|
|
@@ -199,6 +200,15 @@ async function writeRemoteAgentsIndex(cwd, wranglerConfigPath, entries) {
|
|
|
199
200
|
await rm2(path, { force: true });
|
|
200
201
|
}
|
|
201
202
|
}
|
|
203
|
+
async function mergeRemoteAgentIndexEntry(params) {
|
|
204
|
+
const { cwd, wranglerConfigPath, entry } = params;
|
|
205
|
+
const currentIndex = await readRemoteAgentsIndex(cwd, wranglerConfigPath);
|
|
206
|
+
const merged = [
|
|
207
|
+
...currentIndex.filter((existing) => existing.name !== entry.name),
|
|
208
|
+
entry
|
|
209
|
+
].sort((a, b) => a.name.localeCompare(b.name));
|
|
210
|
+
await writeRemoteAgentsIndex(cwd, wranglerConfigPath, merged);
|
|
211
|
+
}
|
|
202
212
|
async function pushRemoteManifest(params) {
|
|
203
213
|
const { cwd, wranglerConfigPath, agentName, hash, ir } = params;
|
|
204
214
|
const manifestKey = `${agentName}:${hash}`;
|
|
@@ -325,10 +335,6 @@ var push_default = defineCommand({
|
|
|
325
335
|
} else {
|
|
326
336
|
agentState.lastRemoteHash = hash;
|
|
327
337
|
agentState.lastLocalHash = hash;
|
|
328
|
-
const currentIndex = await readRemoteAgentsIndex(
|
|
329
|
-
cwd,
|
|
330
|
-
runtime.wranglerConfigPath
|
|
331
|
-
);
|
|
332
338
|
const nextEntry = {
|
|
333
339
|
name: agentName,
|
|
334
340
|
hash,
|
|
@@ -339,11 +345,11 @@ var push_default = defineCommand({
|
|
|
339
345
|
label: manifest.ir.metadata?.label,
|
|
340
346
|
tags: manifest.ir.metadata?.tags
|
|
341
347
|
};
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
348
|
+
await mergeRemoteAgentIndexEntry({
|
|
349
|
+
cwd,
|
|
350
|
+
wranglerConfigPath: runtime.wranglerConfigPath,
|
|
351
|
+
entry: nextEntry
|
|
352
|
+
});
|
|
347
353
|
}
|
|
348
354
|
const bundles = manifest.ir.bundles || {};
|
|
349
355
|
await exportCompiledIrForDebug({
|
|
@@ -393,4 +399,4 @@ var push_default = defineCommand({
|
|
|
393
399
|
export {
|
|
394
400
|
push_default as default
|
|
395
401
|
};
|
|
396
|
-
//# sourceMappingURL=push-
|
|
402
|
+
//# sourceMappingURL=push-QTXCB5ZG.js.map
|