@kalphq/cli 0.0.0-dev-20260512201224 → 0.0.0-dev-20260512203604
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-QSSJ4LP2.js → chunk-6WQW3UVW.js} +3 -3
- package/dist/{chunk-ZMNBWAXJ.js → chunk-TNKYKA7N.js} +19 -1
- package/dist/chunk-TNKYKA7N.js.map +1 -0
- package/dist/{chunk-QQELBQEG.js → chunk-WMQSBT64.js} +4 -4
- package/dist/chunk-WMQSBT64.js.map +1 -0
- package/dist/{deploy-IYYTAX3O.js → deploy-ABYREUMX.js} +4 -4
- package/dist/{dev-YFNI27W3.js → dev-Q3UX3HY2.js} +2 -2
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/{login-CJJF46JM.js → login-DGX55YZ6.js} +2 -2
- package/dist/{push-UDZ6KV3S.js → push-EXOBRO5V.js} +69 -4
- package/dist/push-EXOBRO5V.js.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-QQELBQEG.js.map +0 -1
- package/dist/chunk-ZMNBWAXJ.js.map +0 -1
- package/dist/push-UDZ6KV3S.js.map +0 -1
- /package/dist/{chunk-QSSJ4LP2.js.map → chunk-6WQW3UVW.js.map} +0 -0
- /package/dist/{deploy-IYYTAX3O.js.map → deploy-ABYREUMX.js.map} +0 -0
- /package/dist/{dev-YFNI27W3.js.map → dev-Q3UX3HY2.js.map} +0 -0
- /package/dist/{login-CJJF46JM.js.map → login-DGX55YZ6.js.map} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveProvider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TNKYKA7N.js";
|
|
5
5
|
import {
|
|
6
6
|
ensureStudioSecrets,
|
|
7
7
|
materializeRuntime,
|
|
8
8
|
readProjectState,
|
|
9
9
|
writeProjectState
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-WMQSBT64.js";
|
|
11
11
|
import {
|
|
12
12
|
requireAuth
|
|
13
13
|
} from "./chunk-5RODADXW.js";
|
|
@@ -181,4 +181,4 @@ async function runInitialDeploy(cwd) {
|
|
|
181
181
|
export {
|
|
182
182
|
runInitialDeploy
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-6WQW3UVW.js.map
|
|
@@ -182,6 +182,24 @@ var cloudflareProvider = {
|
|
|
182
182
|
{ cwd }
|
|
183
183
|
);
|
|
184
184
|
},
|
|
185
|
+
async deleteValue({ cwd, configPath, key }) {
|
|
186
|
+
await execa(
|
|
187
|
+
"npx",
|
|
188
|
+
[
|
|
189
|
+
"wrangler",
|
|
190
|
+
"kv",
|
|
191
|
+
"key",
|
|
192
|
+
"delete",
|
|
193
|
+
"--binding",
|
|
194
|
+
"KALP_MANIFESTS",
|
|
195
|
+
key,
|
|
196
|
+
"--remote",
|
|
197
|
+
"--config",
|
|
198
|
+
configPath
|
|
199
|
+
],
|
|
200
|
+
{ cwd }
|
|
201
|
+
);
|
|
202
|
+
},
|
|
185
203
|
async getValue({ cwd, configPath, key }) {
|
|
186
204
|
const result = await execa(
|
|
187
205
|
"npx",
|
|
@@ -226,4 +244,4 @@ function resolveProvider() {
|
|
|
226
244
|
export {
|
|
227
245
|
resolveProvider
|
|
228
246
|
};
|
|
229
|
-
//# sourceMappingURL=chunk-
|
|
247
|
+
//# sourceMappingURL=chunk-TNKYKA7N.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 deleteValue({ cwd, configPath, key }) {\n await execa(\n \"npx\",\n [\n \"wrangler\",\n \"kv\",\n \"key\",\n \"delete\",\n \"--binding\",\n \"KALP_MANIFESTS\",\n key,\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":"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","names":[]}
|
|
@@ -164,7 +164,7 @@ function buildWorkerName(slug, cwd) {
|
|
|
164
164
|
const clipped = withPrefix.slice(0, maxLen).replace(/-+$/g, "");
|
|
165
165
|
return clipped || `kalp-${cwdHash}`;
|
|
166
166
|
}
|
|
167
|
-
function createRuntimeConfig(workerName) {
|
|
167
|
+
function createRuntimeConfig(workerName, mode) {
|
|
168
168
|
return {
|
|
169
169
|
$schema: "node_modules/wrangler/config-schema.json",
|
|
170
170
|
name: workerName,
|
|
@@ -198,7 +198,7 @@ function createRuntimeConfig(workerName) {
|
|
|
198
198
|
observability: { enabled: true },
|
|
199
199
|
upload_source_maps: true,
|
|
200
200
|
vars: {
|
|
201
|
-
KALP_ENV:
|
|
201
|
+
KALP_ENV: mode
|
|
202
202
|
},
|
|
203
203
|
secrets: {
|
|
204
204
|
required: [
|
|
@@ -395,7 +395,7 @@ async function materializeRuntime(cwd, options = {}) {
|
|
|
395
395
|
await writeRuntimeAgentsSnapshot({ cwd, runtimeDir, mode });
|
|
396
396
|
const projectSlug = await resolveProjectSlug(cwd);
|
|
397
397
|
const workerName = buildWorkerName(projectSlug, cwd);
|
|
398
|
-
const wranglerConfig = createRuntimeConfig(workerName);
|
|
398
|
+
const wranglerConfig = createRuntimeConfig(workerName, mode);
|
|
399
399
|
await writeFile3(
|
|
400
400
|
wranglerConfigPath,
|
|
401
401
|
`${JSON.stringify(wranglerConfig, null, 2)}
|
|
@@ -420,4 +420,4 @@ export {
|
|
|
420
420
|
writeRuntimeAgentsSnapshot,
|
|
421
421
|
materializeRuntime
|
|
422
422
|
};
|
|
423
|
-
//# sourceMappingURL=chunk-
|
|
423
|
+
//# sourceMappingURL=chunk-WMQSBT64.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: \"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): 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: [\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 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\n const projectSlug = await resolveProjectSlug(cwd);\n const workerName = buildWorkerName(projectSlug, cwd);\n const wranglerConfig = createRuntimeConfig(workerName, mode);\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,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-6WQW3UVW.js";
|
|
5
|
+
import "./chunk-TNKYKA7N.js";
|
|
6
|
+
import "./chunk-WMQSBT64.js";
|
|
7
7
|
import {
|
|
8
8
|
requireAuth
|
|
9
9
|
} from "./chunk-5RODADXW.js";
|
|
@@ -74,4 +74,4 @@ var deploy_default = defineCommand({
|
|
|
74
74
|
export {
|
|
75
75
|
deploy_default as default
|
|
76
76
|
};
|
|
77
|
-
//# sourceMappingURL=deploy-
|
|
77
|
+
//# sourceMappingURL=deploy-ABYREUMX.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
materializeRuntime,
|
|
10
10
|
readLocalAgentNames,
|
|
11
11
|
writeRuntimeAgentsSnapshot
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WMQSBT64.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/dev.ts
|
|
15
15
|
import { watch } from "fs";
|
|
@@ -233,4 +233,4 @@ KALP_RUNTIME_MODE=local
|
|
|
233
233
|
export {
|
|
234
234
|
dev_default as default
|
|
235
235
|
};
|
|
236
|
-
//# sourceMappingURL=dev-
|
|
236
|
+
//# sourceMappingURL=dev-Q3UX3HY2.js.map
|
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-20260512203604",
|
|
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-ABYREUMX.js").then((r) => r.default),
|
|
97
|
+
push: () => import("./push-EXOBRO5V.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-DGX55YZ6.js").then((r) => r.default),
|
|
101
101
|
logout: () => import("./logout-U5V5K775.js").then((r) => r.default),
|
|
102
|
-
dev: () => import("./dev-
|
|
102
|
+
dev: () => import("./dev-Q3UX3HY2.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-20260512203604\",\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-TNKYKA7N.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-DGX55YZ6.js.map
|
|
@@ -9,16 +9,16 @@ import {
|
|
|
9
9
|
} from "./chunk-INB3LG6O.js";
|
|
10
10
|
import {
|
|
11
11
|
runInitialDeploy
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-6WQW3UVW.js";
|
|
13
13
|
import {
|
|
14
14
|
resolveProvider
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-TNKYKA7N.js";
|
|
16
16
|
import {
|
|
17
17
|
materializeRuntime,
|
|
18
18
|
readLocalAgentNames,
|
|
19
19
|
readProjectState,
|
|
20
20
|
writeProjectState
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-WMQSBT64.js";
|
|
22
22
|
import {
|
|
23
23
|
requireAuth
|
|
24
24
|
} from "./chunk-5RODADXW.js";
|
|
@@ -108,6 +108,56 @@ async function writeRemoteAgentsIndex(cwd, wranglerConfigPath, entries) {
|
|
|
108
108
|
await rm(path, { force: true });
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
+
async function pruneStaleRemoteAgents(params) {
|
|
112
|
+
const { cwd, wranglerConfigPath, remoteEntries, localAgentNames } = params;
|
|
113
|
+
const localSet = new Set(localAgentNames);
|
|
114
|
+
const staleEntries = remoteEntries.filter((entry) => !localSet.has(entry.name));
|
|
115
|
+
if (staleEntries.length === 0) {
|
|
116
|
+
return { removedAgents: [], deletedKeys: 0 };
|
|
117
|
+
}
|
|
118
|
+
const preview = staleEntries.slice(0, 3).map((entry) => entry.name).join(", ");
|
|
119
|
+
const suffix = staleEntries.length > 3 ? ` and ${staleEntries.length - 3} more` : "";
|
|
120
|
+
const confirmation = await p.confirm({
|
|
121
|
+
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?`,
|
|
122
|
+
initialValue: true
|
|
123
|
+
});
|
|
124
|
+
if (p.isCancel(confirmation)) {
|
|
125
|
+
p.outro("Cancelled");
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
if (!confirmation) {
|
|
129
|
+
return { removedAgents: [], deletedKeys: 0 };
|
|
130
|
+
}
|
|
131
|
+
const provider = resolveProvider();
|
|
132
|
+
let deletedKeys = 0;
|
|
133
|
+
for (const entry of staleEntries) {
|
|
134
|
+
const latestKey = `${entry.name}:latest`;
|
|
135
|
+
const latestHash = await provider.getValue({ cwd, configPath: wranglerConfigPath, key: latestKey }).catch(() => null);
|
|
136
|
+
const hashes = /* @__PURE__ */ new Set();
|
|
137
|
+
if (entry.hash) hashes.add(entry.hash);
|
|
138
|
+
if (latestHash) hashes.add(latestHash);
|
|
139
|
+
const latestDeleted = await provider.deleteValue({
|
|
140
|
+
cwd,
|
|
141
|
+
configPath: wranglerConfigPath,
|
|
142
|
+
key: latestKey
|
|
143
|
+
}).then(() => true).catch(() => false);
|
|
144
|
+
if (latestDeleted) deletedKeys += 1;
|
|
145
|
+
for (const hash of hashes) {
|
|
146
|
+
const deleted = await provider.deleteValue({
|
|
147
|
+
cwd,
|
|
148
|
+
configPath: wranglerConfigPath,
|
|
149
|
+
key: `${entry.name}:${hash}`
|
|
150
|
+
}).then(() => true).catch(() => false);
|
|
151
|
+
if (deleted) deletedKeys += 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const filtered = remoteEntries.filter((entry) => localSet.has(entry.name));
|
|
155
|
+
await writeRemoteAgentsIndex(cwd, wranglerConfigPath, filtered);
|
|
156
|
+
return {
|
|
157
|
+
removedAgents: staleEntries.map((entry) => entry.name).sort((a, b) => a.localeCompare(b)),
|
|
158
|
+
deletedKeys
|
|
159
|
+
};
|
|
160
|
+
}
|
|
111
161
|
async function mergeRemoteAgentIndexEntry(params) {
|
|
112
162
|
const { cwd, wranglerConfigPath, entry } = params;
|
|
113
163
|
const currentIndex = await readRemoteAgentsIndex(cwd, wranglerConfigPath);
|
|
@@ -161,6 +211,7 @@ var push_default = defineCommand({
|
|
|
161
211
|
async run({ args }) {
|
|
162
212
|
const cwd = process.cwd();
|
|
163
213
|
const target = args.local ? "local" : "remote";
|
|
214
|
+
const isBulkPush = !args.agent;
|
|
164
215
|
p.intro(`${LOGO} ${pc.bold("kalp push")}`);
|
|
165
216
|
await ensureConfig(cwd).catch(() => {
|
|
166
217
|
p.log.error(`${pc.cyan("kalp.config.ts")} not found`);
|
|
@@ -197,6 +248,20 @@ var push_default = defineCommand({
|
|
|
197
248
|
state.deployedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
198
249
|
}
|
|
199
250
|
runtime = await materializeRuntime(cwd, { mode: "remote" });
|
|
251
|
+
if (isBulkPush) {
|
|
252
|
+
const currentIndex = await readRemoteAgentsIndex(cwd, runtime.wranglerConfigPath);
|
|
253
|
+
const prune = await pruneStaleRemoteAgents({
|
|
254
|
+
cwd,
|
|
255
|
+
wranglerConfigPath: runtime.wranglerConfigPath,
|
|
256
|
+
remoteEntries: currentIndex,
|
|
257
|
+
localAgentNames: availableAgents
|
|
258
|
+
});
|
|
259
|
+
if (prune.removedAgents.length > 0) {
|
|
260
|
+
p.log.info(
|
|
261
|
+
`Pruned stale remote agents: ${pc.cyan(prune.removedAgents.join(", "))} ${pc.dim(`(${prune.deletedKeys} keys cleaned)`)}`
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
200
265
|
}
|
|
201
266
|
const spinner2 = p.spinner();
|
|
202
267
|
const result = { pushed: 0, skipped: 0, failed: 0 };
|
|
@@ -307,4 +372,4 @@ var push_default = defineCommand({
|
|
|
307
372
|
export {
|
|
308
373
|
push_default as default
|
|
309
374
|
};
|
|
310
|
-
//# sourceMappingURL=push-
|
|
375
|
+
//# sourceMappingURL=push-EXOBRO5V.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 { 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\";\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 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:\n state.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}` : 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((entry) => !localSet.has(entry.name));\n\n if (staleEntries.length === 0) {\n return { removedAgents: [], deletedKeys: 0 };\n }\n\n const preview = staleEntries.slice(0, 3).map((entry) => entry.name).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.map((entry) => entry.name).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: \"Publish agent runtime version\" },\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\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 p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\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(cwd, runtime.wranglerConfigPath);\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({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const agentState = ensureAgentState(state, agentName, agentPath);\n const previousHash =\n target === \"local\" ? agentState.lastLocalHash : 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(\"Publishing runtime version\");\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","spinner"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalphq/cli",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-20260512203604",
|
|
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/compiler": "0.0.0-dev-
|
|
31
|
-
"@kalphq/project": "0.0.0-dev-
|
|
32
|
-
"@kalphq/sdk": "0.0.0-dev-
|
|
30
|
+
"@kalphq/compiler": "0.0.0-dev-20260512203604",
|
|
31
|
+
"@kalphq/project": "0.0.0-dev-20260512203604",
|
|
32
|
+
"@kalphq/sdk": "0.0.0-dev-20260512203604"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/json-stable-stringify": "1.2.0",
|
|
@@ -1 +0,0 @@
|
|
|
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 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\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 +0,0 @@
|
|
|
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":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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 { 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\";\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 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:\n state.workerUrl ? `${state.workerUrl.replace(/\\/$/, \"\")}/a/${agentName}` : 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\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 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: \"Publish agent runtime version\" },\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\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\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 p.log.warn(\"No .kalp/state.json found. Running initial deploy first...\");\n const deploy = await runInitialDeploy(cwd);\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\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({ agentName, ir: manifest.ir, hash });\n if (!validation.ok) {\n const details = (validation.errors ?? []).join(\" | \");\n throw new Error(\n `validation failed (${validation.phase})${details ? `: ${details}` : \"\"}`,\n );\n }\n\n const agentState = ensureAgentState(state, agentName, agentPath);\n const previousHash =\n target === \"local\" ? agentState.lastLocalHash : 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(\"Publishing runtime version\");\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","spinner"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|