everything-dev 1.4.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cli/init.cjs +78 -8
  2. package/dist/cli/init.cjs.map +1 -1
  3. package/dist/cli/init.d.cts +6 -0
  4. package/dist/cli/init.d.cts.map +1 -1
  5. package/dist/cli/init.d.mts +6 -0
  6. package/dist/cli/init.d.mts.map +1 -1
  7. package/dist/cli/init.mjs +78 -8
  8. package/dist/cli/init.mjs.map +1 -1
  9. package/dist/cli/prompts.cjs +64 -6
  10. package/dist/cli/prompts.cjs.map +1 -1
  11. package/dist/cli/prompts.mjs +64 -6
  12. package/dist/cli/prompts.mjs.map +1 -1
  13. package/dist/cli/sync.cjs +85 -18
  14. package/dist/cli/sync.cjs.map +1 -1
  15. package/dist/cli/sync.mjs +85 -18
  16. package/dist/cli/sync.mjs.map +1 -1
  17. package/dist/cli.cjs +41 -4
  18. package/dist/cli.cjs.map +1 -1
  19. package/dist/cli.mjs +41 -4
  20. package/dist/cli.mjs.map +1 -1
  21. package/dist/contract.cjs +3 -0
  22. package/dist/contract.cjs.map +1 -1
  23. package/dist/contract.d.cts +14 -6
  24. package/dist/contract.d.cts.map +1 -1
  25. package/dist/contract.d.mts +14 -6
  26. package/dist/contract.d.mts.map +1 -1
  27. package/dist/contract.mjs +3 -0
  28. package/dist/contract.mjs.map +1 -1
  29. package/dist/plugin.cjs +48 -17
  30. package/dist/plugin.cjs.map +1 -1
  31. package/dist/plugin.d.cts +9 -4
  32. package/dist/plugin.d.mts +9 -4
  33. package/dist/plugin.mjs +48 -17
  34. package/dist/plugin.mjs.map +1 -1
  35. package/dist/types.cjs +2 -1
  36. package/dist/types.cjs.map +1 -1
  37. package/dist/types.d.cts +4 -2
  38. package/dist/types.d.cts.map +1 -1
  39. package/dist/types.d.mts +4 -2
  40. package/dist/types.d.mts.map +1 -1
  41. package/dist/types.mjs +2 -1
  42. package/dist/types.mjs.map +1 -1
  43. package/package.json +2 -2
  44. package/src/cli/init.ts +122 -7
  45. package/src/cli/prompts.ts +84 -10
  46. package/src/cli/sync.ts +142 -17
  47. package/src/cli.ts +55 -4
  48. package/src/contract.ts +3 -0
  49. package/src/plugin.ts +51 -18
  50. package/src/types.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","names":["resolveLocalDevelopmentPath","loadConfig","syncApiContractBridge","run","fetchBosConfigFromFastKv","syncAndGenerateSharedUi","z","bosContract","Effect","getProjectRoot","detectLocalPackages","getHostDevelopmentPort","prepareDevelopmentRuntimeConfig","buildRuntimeConfig","parsePort","buildRuntimePluginsForConfig","resolveDevelopmentHostUrl","getNetworkIdForAccount","buildRegistryConfigUrlForNetwork","ensureNearCli","executeTransaction","getRegistryNamespaceForNetwork","getRegistryNamespaceForAccount","addFunctionCallAccessKey","promptInitOptions","fetchParentConfig","resolveSourceDir","readTemplatekeep","copyFilteredFiles","personalizeConfig","writeInitSnapshot","runBunInstall","findConfigPath","syncTemplate","upgradeTemplate","getStatus"],"sources":["../src/plugin.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { Effect } from \"effect\";\nimport { syncApiContractBridge } from \"./api-contract\";\nimport { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from \"./app\";\nimport {\n copyFilteredFiles,\n fetchParentConfig,\n personalizeConfig,\n readTemplatekeep,\n resolveSourceDir,\n runBunInstall,\n writeInitSnapshot,\n} from \"./cli/init\";\nimport { promptInitOptions } from \"./cli/prompts\";\nimport { getStatus } from \"./cli/status\";\nimport { syncTemplate } from \"./cli/sync\";\nimport { upgradeTemplate } from \"./cli/upgrade\";\nimport {\n buildRuntimePluginsForConfig,\n findConfigPath,\n getHostDevelopmentPort,\n getProjectRoot,\n loadConfig,\n parsePort,\n resolveDevelopmentHostUrl,\n resolveLocalDevelopmentPath,\n} from \"./config\";\nimport {\n type BosConfigResult,\n type BuildOptions,\n bosContract,\n type DevOptions,\n type InitOptions,\n type KeyPublishOptions,\n type PluginAddOptions,\n type PluginListResult,\n type PluginPublishOptions,\n type PluginRemoveOptions,\n type PublishOptions,\n type StartOptions,\n type SyncOptions,\n type UpgradeOptions,\n} from \"./contract\";\nimport { type AppConfig, type AppOrchestrator, startApp } from \"./dev-session\";\nimport {\n buildRegistryConfigUrlForNetwork,\n fetchBosConfigFromFastKv,\n getRegistryNamespaceForAccount,\n getRegistryNamespaceForNetwork,\n} from \"./fastkv\";\nimport { addFunctionCallAccessKey, ensureNearCli, executeTransaction } from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport { createPlugin, z } from \"./sdk\";\nimport { syncAndGenerateSharedUi } from \"./shared\";\nimport type { BosConfig, RuntimeConfig, SourceMode } from \"./types\";\nimport { run } from \"./utils/run\";\n\nconst DEFAULT_DEV_CONFIG: AppConfig = {\n host: \"local\",\n ui: \"local\",\n api: \"local\",\n ssr: false,\n};\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\nconst PUBLISH_FUNCTION_NAMES = [\"__fastdata_kv\"];\n\ntype BosDeps = {\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n configDir: string;\n};\n\ntype PluginAttachmentConfig = NonNullable<BosConfig[\"plugins\"]>[string];\n\nfunction parseSourceMode(value: string | undefined, defaultValue: SourceMode): SourceMode {\n if (value === \"local\" || value === \"remote\") return value;\n return defaultValue;\n}\n\nfunction buildAppConfig(options: {\n host?: string;\n ui?: string;\n api?: string;\n proxy?: boolean;\n ssr?: boolean;\n}): AppConfig {\n return {\n host: parseSourceMode(options.host, DEFAULT_DEV_CONFIG.host),\n ui: parseSourceMode(options.ui, DEFAULT_DEV_CONFIG.ui),\n api: parseSourceMode(options.api, DEFAULT_DEV_CONFIG.api),\n proxy: options.proxy,\n ssr: options.ssr ?? DEFAULT_DEV_CONFIG.ssr,\n };\n}\n\nfunction buildDescription(config: AppConfig): string {\n if (config.host === \"local\" && config.ui === \"local\" && config.api === \"local\" && !config.proxy) {\n return \"Full Local Development\";\n }\n\n const parts: string[] = [];\n parts.push(config.host === \"remote\" ? \"Remote Host\" : \"Local Host\");\n if (config.ui === \"remote\") parts.push(\"Remote UI\");\n if (config.proxy) parts.push(\"Proxy API → Production\");\n else if (config.api === \"remote\") parts.push(\"Remote API\");\n return parts.join(\" + \");\n}\n\nfunction buildConfigResult(bosConfig: BosConfig | null): BosConfigResult {\n const packages = bosConfig ? Object.keys(bosConfig.app) : [];\n const remotes = packages.filter((name) => name !== \"host\");\n\n return {\n config: bosConfig,\n packages,\n remotes,\n };\n}\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(bosConfig?.plugins?.[key]?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nfunction determineProcesses(\n config: AppConfig,\n localPackages: string[],\n runtimeConfig?: RuntimeConfig | null,\n): string[] {\n const processes: string[] = [];\n if (config.ssr && config.ui === \"local\") processes.push(\"ui-ssr\");\n if (config.ui === \"local\") processes.push(\"ui\");\n if (config.api === \"local\" && !config.proxy) processes.push(\"api\");\n for (const pkg of localPackages) {\n if (pkg.startsWith(\"plugin:\")) {\n const pluginId = pkg.slice(\"plugin:\".length);\n if (runtimeConfig?.plugins?.[pluginId]?.source === \"local\") {\n processes.push(pkg);\n }\n }\n }\n processes.push(\"host\");\n return processes;\n}\n\nfunction isValidProxyUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction resolveProxyUrl(bosConfig: BosConfig | null): string | null {\n if (!bosConfig) return null;\n const apiConfig = bosConfig.app.api;\n if (!apiConfig) return null;\n if (apiConfig.proxy && isValidProxyUrl(apiConfig.proxy)) return apiConfig.proxy;\n if (apiConfig.production && isValidProxyUrl(apiConfig.production)) return apiConfig.production;\n return null;\n}\n\nfunction sanitizePluginKey(value: string): string {\n return value\n .replace(/[^A-Za-z0-9/_-]/g, \"-\")\n .replace(/\\/+/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, \"-\"))\n .join(\"/\")\n .replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction defaultPluginKey(source: string): string {\n const normalized = source.replace(/^local:/, \"\").replace(/\\/$/, \"\");\n if (source.startsWith(\"local:\")) {\n return sanitizePluginKey(basename(normalized)) || \"plugin\";\n }\n\n try {\n const url = new URL(source);\n return sanitizePluginKey(basename(url.pathname) || url.hostname) || \"plugin\";\n } catch {\n return sanitizePluginKey(source) || \"plugin\";\n }\n}\n\nfunction pluginLocalPath(configDir: string, attachment: PluginAttachmentConfig): string | null {\n const source = attachment.development ?? attachment.production;\n if (!source?.startsWith(\"local:\")) {\n return null;\n }\n\n return join(configDir, source.slice(\"local:\".length));\n}\n\nasync function saveBosConfig(configDir: string, config: BosConfig): Promise<void> {\n const filePath = join(configDir, \"bos.config.json\");\n const next = `${JSON.stringify(config, null, 2)}\\n`;\n try {\n if (readFileSync(filePath, \"utf8\") === next) return;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, next);\n}\n\nfunction listPluginAttachments(config: BosConfig | null) {\n return (Object.entries(config?.plugins ?? {}) as Array<[string, PluginAttachmentConfig]>)\n .map(([key, attachment]) => ({\n key,\n development: attachment.development,\n production: attachment.production,\n localPath: attachment.development?.startsWith(\"local:\")\n ? attachment.development.slice(\"local:\".length)\n : undefined,\n source: attachment.development?.startsWith(\"local:\")\n ? (\"local\" as const)\n : (\"remote\" as const),\n }))\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nasync function refreshApiContractBridge(configDir: string): Promise<void> {\n const refreshed = await loadConfig({ cwd: configDir, env: \"development\" });\n if (!refreshed) return;\n\n await syncApiContractBridge({\n configDir,\n runtimeConfig: refreshed.runtime,\n apiBaseUrl: refreshed.runtime.api.url,\n });\n}\n\nfunction extractPublishedUrl(output: string): string | null {\n const match = output.match(/https?:\\/\\/[^\\s\"'<>]+/g);\n if (!match || match.length === 0) return null;\n return match[match.length - 1] ?? null;\n}\n\nasync function buildEnvVars(\n config: AppConfig,\n bosConfig?: BosConfig | null,\n): Promise<Record<string, string>> {\n const env: Record<string, string> = {\n HOST_SOURCE: config.host,\n UI_SOURCE: config.ui,\n API_SOURCE: config.api,\n };\n\n if (config.host === \"remote\") {\n const remoteUrl = bosConfig?.app.host.production;\n if (remoteUrl) env.HOST_REMOTE_URL = remoteUrl;\n }\n\n if (config.ui === \"remote\") {\n const remoteUrl = bosConfig?.app.ui.production;\n if (remoteUrl) env.UI_REMOTE_URL = remoteUrl;\n }\n\n if (config.api === \"remote\") {\n const remoteUrl = bosConfig?.app.api.production;\n if (remoteUrl) env.API_REMOTE_URL = remoteUrl;\n }\n\n if (config.proxy && bosConfig) {\n const proxyUrl = resolveProxyUrl(bosConfig);\n if (proxyUrl) env.API_PROXY = proxyUrl;\n }\n\n return env;\n}\n\nasync function buildEveryPluginQuietly(cwd: string) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await Bun.file(`${packageDir}/package.json`).exists();\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await Bun.file(distPath).exists();\n\n if (distExists) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n console.log(\"[build:ssr] build succeeded\");\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nasync function buildEverythingDevQuietly(cwd: string) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await Bun.file(`${packageDir}/package.json`).exists();\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await Bun.file(distPath).exists();\n\n if (distExists) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n console.log(\"[everything-dev] build succeeded\");\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n\nasync function fetchPublishedConfig(\n accountId: string,\n gatewayId: string,\n): Promise<BosConfig | null> {\n try {\n return await fetchBosConfigFromFastKv<BosConfig>(`bos://${accountId}/${gatewayId}`);\n } catch {\n return null;\n }\n}\n\nfunction selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\nasync function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n}): Promise<{ built: string[]; skipped: string[] }> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await Bun.file(`${resolved.path}/package.json`).exists();\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncAndGenerateSharedUi({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n if (existing.some((entry) => entry.key === \"api\")) {\n await buildEveryPluginQuietly(opts.configDir);\n }\n\n await buildEverythingDevQuietly(opts.configDir);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n const built: string[] = [];\n\n for (const resolved of orderedExisting) {\n const pkgJson = JSON.parse(await Bun.file(`${resolved.path}/package.json`).text()) as {\n scripts?: Record<string, string>;\n };\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[resolved.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n\n return { built, skipped };\n}\n\nexport default createPlugin({\n variables: z.object({\n configPath: z.string().optional(),\n }),\n secrets: z.object({}),\n contract: bosContract,\n initialize: (config: any) =>\n Effect.promise(async () => {\n const configResult = await loadConfig({ path: config.variables.configPath });\n return {\n bosConfig: configResult?.config ?? null,\n runtimeConfig: configResult?.runtime ?? null,\n configDir: getProjectRoot(),\n } satisfies BosDeps;\n }),\n shutdown: () => Effect.void,\n createRouter: (deps: BosDeps, builder: any) => ({\n config: builder.config.handler(async () => buildConfigResult(deps.bosConfig)),\n\n pluginAdd: builder.pluginAdd.handler(async ({ input }: { input: PluginAddOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const key = sanitizePluginKey(input.as ?? defaultPluginKey(input.source));\n const existing = deps.bosConfig.plugins?.[key];\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n\n nextPlugins[key] = input.source.startsWith(\"local:\")\n ? {\n ...(existing ?? {}),\n development: input.source,\n production: input.production ?? existing?.production,\n }\n : {\n ...(existing ?? {}),\n production: input.production ?? input.source,\n };\n\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: nextPlugins,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n\n return {\n status: \"added\" as const,\n key,\n development: deps.bosConfig.plugins?.[key]?.development,\n production: deps.bosConfig.plugins?.[key]?.production,\n };\n }),\n\n pluginRemove: builder.pluginRemove.handler(\n async ({ input }: { input: PluginRemoveOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n if (!deps.bosConfig.plugins?.[input.key]) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n delete nextPlugins[input.key];\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : undefined,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n\n return {\n status: \"removed\" as const,\n key: input.key,\n };\n },\n ),\n\n pluginList: builder.pluginList.handler(async () => {\n const plugins: PluginListResult[\"plugins\"] = listPluginAttachments(deps.bosConfig);\n return {\n status: \"listed\" as const,\n plugins,\n };\n }),\n\n pluginPublish: builder.pluginPublish.handler(\n async ({ input }: { input: PluginPublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n const attachment = deps.bosConfig.plugins?.[input.key];\n if (!attachment) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const localPath = pluginLocalPath(deps.configDir, attachment);\n if (!localPath) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' does not have a local development path`,\n };\n }\n\n const pkgPath = join(localPath, \"package.json\");\n if (!(await Bun.file(pkgPath).exists())) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Missing package.json at ${localPath}`,\n };\n }\n\n const pkgJson = (await Bun.file(pkgPath).json()) as { scripts?: Record<string, string> };\n const script = pkgJson.scripts?.deploy ? \"deploy\" : \"build\";\n\n const { stdout, stderr, exitCode } = (await run(\"bun\", [\"run\", script], {\n cwd: localPath,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (exitCode !== 0) {\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Publish failed with exit code ${exitCode}`,\n };\n }\n\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n\n const publishedUrl = extractPublishedUrl(`${stdout}\\n${stderr}`);\n if (publishedUrl) {\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: {\n ...(deps.bosConfig.plugins ?? {}),\n [input.key]: {\n ...(deps.bosConfig.plugins?.[input.key] ?? {}),\n production: publishedUrl,\n },\n },\n };\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n }\n\n return {\n status: \"published\" as const,\n key: input.key,\n path: localPath,\n script,\n production: publishedUrl ?? attachment.production,\n };\n },\n ),\n\n dev: builder.dev.handler(async ({ input }: { input: DevOptions }) => {\n const localPackages = detectLocalPackages(\n deps.bosConfig ?? undefined,\n deps.runtimeConfig ?? undefined,\n );\n\n const appConfig = buildAppConfig({\n host: localPackages.includes(\"host\") ? (input.host as string) : \"remote\",\n ui: localPackages.includes(\"ui\") ? (input.ui as string) : \"remote\",\n api: localPackages.includes(\"api\") ? (input.api as string) : \"remote\",\n proxy: input.proxy,\n ssr: input.ssr,\n });\n\n const sharedSync = await syncAndGenerateSharedUi({\n configDir: deps.configDir,\n hostMode: appConfig.host,\n bosConfig: deps.bosConfig ?? undefined,\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: deps.configDir });\n }\n if (\n (appConfig.api === \"local\" && !appConfig.proxy) ||\n localPackages.some((pkg) => pkg.startsWith(\"plugin:\"))\n ) {\n await buildEveryPluginQuietly(deps.configDir);\n }\n\n await buildEverythingDevQuietly(deps.configDir);\n\n const refreshed = await loadConfig({ cwd: deps.configDir });\n deps.bosConfig = refreshed?.config ?? deps.bosConfig;\n deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;\n\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n description: \"No bos.config.json found\",\n processes: [],\n };\n }\n\n if (appConfig.proxy && !resolveProxyUrl(deps.bosConfig)) {\n return {\n status: \"error\" as const,\n description: \"No valid proxy URL configured in bos.config.json\",\n processes: [],\n };\n }\n\n const refreshedLocalPackages = detectLocalPackages(\n deps.bosConfig ?? undefined,\n deps.runtimeConfig ?? undefined,\n );\n const processes = determineProcesses(appConfig, refreshedLocalPackages, deps.runtimeConfig);\n const env = await buildEnvVars(appConfig, deps.bosConfig);\n const hostPort = input.port ?? getHostDevelopmentPort(deps.bosConfig.app.host.development);\n const developmentRuntime = buildRuntimeConfig(deps.bosConfig, {\n uiSource: appConfig.ui,\n apiSource: appConfig.api,\n hostUrl: `http://localhost:${hostPort}`,\n proxy: env.API_PROXY,\n env: \"development\",\n plugins: deps.runtimeConfig?.plugins,\n });\n const runtimeConfig = await prepareDevelopmentRuntimeConfig(developmentRuntime, {\n hostPort,\n ssr: appConfig.ssr,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig: runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const orchestrator: AppOrchestrator = {\n packages: processes,\n env,\n description: buildDescription(appConfig),\n appConfig,\n bosConfig: deps.bosConfig,\n runtimeConfig,\n port: parsePort(runtimeConfig.hostUrl),\n interactive: input.interactive,\n };\n\n startApp(orchestrator);\n\n return {\n status: \"started\" as const,\n description: orchestrator.description,\n processes,\n };\n }),\n\n start: builder.start.handler(async ({ input }: { input: StartOptions }) => {\n let remoteConfig: BosConfig | null = null;\n\n if (input.account && input.domain) {\n remoteConfig = await fetchPublishedConfig(input.account, input.domain);\n if (!remoteConfig) {\n return {\n status: \"error\" as const,\n url: \"\",\n };\n }\n }\n\n const config = remoteConfig || deps.bosConfig;\n if (!config) {\n return {\n status: \"error\" as const,\n url: \"\",\n };\n }\n\n const port = input.port ?? getHostDevelopmentPort(config.app.host.development);\n const appConfig: AppConfig = { host: \"remote\", ui: \"remote\", api: \"remote\" };\n const env = await buildEnvVars(appConfig, config);\n const isStaging = input.env === \"staging\";\n const runtimePlugins = remoteConfig\n ? await buildRuntimePluginsForConfig(config, deps.configDir, \"production\")\n : deps.runtimeConfig?.plugins;\n const runtimeConfig = buildRuntimeConfig(config, {\n uiSource: \"remote\",\n apiSource: \"remote\",\n hostUrl: `http://localhost:${port}`,\n env: \"production\",\n plugins: runtimePlugins,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig: runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const stagingEnvVars: Record<string, string> = isStaging\n ? { GATEWAY_DOMAIN: config.staging?.domain ?? config.domain ?? \"\" }\n : {};\n\n const orchestrator: AppOrchestrator = {\n packages: [\"host\"],\n env: {\n NODE_ENV: \"production\",\n ...env,\n ...stagingEnvVars,\n },\n description: `${isStaging ? \"Staging\" : \"Production\"} Mode (${config.account})`,\n appConfig,\n bosConfig: config,\n runtimeConfig,\n port,\n interactive: input.interactive,\n noLogs: true,\n };\n\n startApp(orchestrator);\n return {\n status: \"running\" as const,\n url: `http://localhost:${port}`,\n };\n }),\n\n build: builder.build.handler(async ({ input }: { input: BuildOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n if (targets.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n const runtimeConfig = buildRuntimeConfig(deps.bosConfig, {\n uiSource: deps.bosConfig.app.ui?.development ? \"local\" : \"remote\",\n apiSource: deps.bosConfig.app.api?.development ? \"local\" : \"remote\",\n hostUrl: resolveDevelopmentHostUrl(deps.bosConfig.app.host.development),\n env: \"development\",\n plugins: deps.runtimeConfig?.plugins,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const { built, skipped } = await buildWorkspaceTargets({\n configDir: deps.configDir,\n bosConfig: deps.bosConfig,\n runtimeConfig: runtimeConfig,\n targets,\n deploy: input.deploy,\n });\n\n if (built.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped,\n };\n }\n\n return {\n status: \"success\" as const,\n built,\n skipped,\n deployed: input.deploy,\n };\n }),\n\n publish: builder.publish.handler(async ({ input }: { input: PublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const account = deps.bosConfig.account;\n const gateway = deps.bosConfig.domain;\n if (!gateway) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n error: \"bos.config.json must define domain to publish\",\n };\n }\n\n const network = input.network ?? getNetworkIdForAccount(account);\n const bosUrl = `bos://${account}/${gateway}`;\n const registryUrl = buildRegistryConfigUrlForNetwork(network, account, gateway);\n const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n\n let publishConfig = deps.bosConfig;\n let built: string[] | undefined;\n let skipped: string[] | undefined;\n\n if (input.dryRun) {\n return {\n status: \"dry-run\" as const,\n registryUrl,\n built,\n skipped,\n };\n }\n\n if (input.deploy) {\n const result = await buildWorkspaceTargets({\n configDir: deps.configDir,\n bosConfig: deps.bosConfig,\n runtimeConfig: deps.runtimeConfig,\n targets,\n deploy: true,\n });\n built = result.built;\n skipped = result.skipped;\n\n const refreshed = await loadConfig({ cwd: deps.configDir });\n if (refreshed?.config) {\n deps.bosConfig = refreshed.config;\n deps.runtimeConfig = refreshed.runtime;\n publishConfig = refreshed.config;\n }\n }\n\n const payload = JSON.stringify({\n [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishConfig),\n });\n const argsBase64 = Buffer.from(payload).toString(\"base64\");\n const privateKey =\n input.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;\n\n try {\n await Effect.runPromise(ensureNearCli);\n let txHash: string | undefined;\n\n try {\n const tx = await Effect.runPromise(\n executeTransaction({\n account,\n contract: getRegistryNamespaceForNetwork(network),\n method: \"__fastdata_kv\",\n argsBase64,\n network,\n privateKey,\n gas: \"300Tgas\",\n deposit: \"0NEAR\",\n }),\n );\n txHash = tx.txHash;\n } catch (error) {\n txHash = extractTransactionHash(error);\n\n if (!txHash) {\n throw error;\n }\n\n try {\n const verifiedConfig = await fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n if (JSON.stringify(verifiedConfig) !== JSON.stringify(publishConfig)) {\n throw error;\n }\n } catch {\n // Config may not exist yet on first publish or propagation delay;\n // a valid txHash is sufficient proof the transaction was submitted.\n }\n }\n\n return {\n status: \"published\" as const,\n registryUrl,\n txHash,\n built,\n skipped,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n registryUrl,\n error: error instanceof Error ? error.message : \"Unknown error\",\n built,\n skipped,\n };\n }\n }),\n\n keyPublish: builder.keyPublish.handler(async ({ input }: { input: KeyPublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n account: \"\",\n network: \"mainnet\" as const,\n contract: \"\",\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: \"No bos.config.json found\",\n };\n }\n\n const account = deps.bosConfig.account;\n const network = getNetworkIdForAccount(account);\n const contract = getRegistryNamespaceForAccount(account);\n try {\n await Effect.runPromise(ensureNearCli);\n const keyPair = await addFunctionCallAccessKey({\n account,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n network,\n });\n\n return {\n status: \"published\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n init: builder.init.handler(async ({ input }: { input: InitOptions }) => {\n try {\n let extendsAccount = input.extendsAccount;\n let extendsGateway = input.extendsGateway;\n let directory = input.directory;\n let account = input.account;\n let domain = input.domain;\n let withHost = input.withHost;\n\n if (!domain) {\n if (input.noInteractive) {\n return {\n status: \"error\" as const,\n directory: \"\",\n extendsAccount: extendsAccount ?? \"\",\n extendsGateway: extendsGateway ?? \"\",\n account: input.account,\n domain: input.domain,\n extends:\n extendsAccount && extendsGateway ? `bos://${extendsAccount}/${extendsGateway}` : \"\",\n filesCopied: 0,\n error:\n \"domain is required (use --no-interactive to skip prompts and provide it as a flag)\",\n };\n }\n\n const prompted = await promptInitOptions({\n extendsAccount,\n extendsGateway,\n directory,\n account,\n domain,\n withHost,\n });\n extendsAccount = prompted.extendsAccount;\n extendsGateway = prompted.extendsGateway;\n directory = prompted.directory;\n account = prompted.account;\n domain = prompted.domain;\n withHost = prompted.withHost;\n }\n\n extendsAccount = extendsAccount || \"dev.everything.near\";\n extendsGateway = extendsGateway || \"everything.dev\";\n directory = directory || (domain ? domain.split(\".\")[0] : extendsGateway);\n\n try {\n await fetchParentConfig(extendsAccount, extendsGateway);\n } catch {\n return {\n status: \"error\" as const,\n directory,\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n filesCopied: 0,\n error: `No config found at bos://${extendsAccount}/${extendsGateway} — are you sure this is the right parent?`,\n };\n }\n\n const { sourceDir, cleanup } = await resolveSourceDir({\n extendsAccount,\n extendsGateway,\n source: input.source,\n });\n\n try {\n const patterns = await readTemplatekeep(sourceDir);\n if (patterns.length === 0) {\n return {\n status: \"error\" as const,\n directory,\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n filesCopied: 0,\n error: \"No .templatekeep found in template source\",\n };\n }\n\n const filesCopied = await copyFilteredFiles(sourceDir, directory, patterns, {\n withHost,\n });\n\n await personalizeConfig(directory, {\n extendsAccount,\n extendsGateway,\n account: account || extendsAccount,\n domain: domain || extendsGateway,\n workspaceOpts: { sourceDir },\n });\n\n await writeInitSnapshot(directory, extendsAccount, extendsGateway, sourceDir, patterns, {\n withHost,\n });\n\n if (!input.noInstall) {\n await runBunInstall(directory);\n }\n\n return {\n status: \"initialized\" as const,\n directory: resolve(directory),\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n filesCopied,\n };\n } finally {\n await cleanup();\n }\n } catch (error) {\n return {\n status: \"error\" as const,\n directory: input.directory ?? \"\",\n extendsAccount: input.extendsAccount ?? \"\",\n extendsGateway: input.extendsGateway ?? \"\",\n account: input.account,\n domain: input.domain,\n extends:\n input.extendsAccount && input.extendsGateway\n ? `bos://${input.extendsAccount}/${input.extendsGateway}`\n : \"\",\n filesCopied: 0,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n sync: builder.sync.handler(async ({ input }: { input: SyncOptions }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await syncTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }: { input: UpgradeOptions }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n status: builder.status.handler(async () => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await getStatus(projectDir);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n }),\n});\n\nfunction extractTransactionHash(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n const match =\n message.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i) ||\n message.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/);\n\n return match?.[1];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs","names":["resolveLocalDevelopmentPath","loadConfig","syncApiContractBridge","run","fetchBosConfigFromFastKv","syncAndGenerateSharedUi","z","bosContract","Effect","getProjectRoot","detectLocalPackages","getHostDevelopmentPort","prepareDevelopmentRuntimeConfig","buildRuntimeConfig","parsePort","buildRuntimePluginsForConfig","resolveDevelopmentHostUrl","getNetworkIdForAccount","buildRegistryConfigUrlForNetwork","ensureNearCli","executeTransaction","getRegistryNamespaceForNetwork","getRegistryNamespaceForAccount","addFunctionCallAccessKey","promptInitOptions","fetchParentConfig","resolveSourceDir","readTemplatekeep","copyFilteredFiles","personalizeConfig","writeInitSnapshot","runBunInstall","findConfigPath","syncTemplate","upgradeTemplate","getStatus"],"sources":["../src/plugin.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { Effect } from \"effect\";\nimport { syncApiContractBridge } from \"./api-contract\";\nimport { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from \"./app\";\nimport {\n copyFilteredFiles,\n fetchParentConfig,\n personalizeConfig,\n readTemplatekeep,\n resolveSourceDir,\n runBunInstall,\n writeInitSnapshot,\n} from \"./cli/init\";\nimport { promptInitOptions } from \"./cli/prompts\";\nimport { getStatus } from \"./cli/status\";\nimport { syncTemplate } from \"./cli/sync\";\nimport { upgradeTemplate } from \"./cli/upgrade\";\nimport {\n buildRuntimePluginsForConfig,\n findConfigPath,\n getHostDevelopmentPort,\n getProjectRoot,\n loadConfig,\n parsePort,\n resolveDevelopmentHostUrl,\n resolveLocalDevelopmentPath,\n} from \"./config\";\nimport {\n type BosConfigResult,\n type BuildOptions,\n bosContract,\n type DevOptions,\n type InitOptions,\n type KeyPublishOptions,\n type PluginAddOptions,\n type PluginListResult,\n type PluginPublishOptions,\n type PluginRemoveOptions,\n type PublishOptions,\n type StartOptions,\n type SyncOptions,\n type UpgradeOptions,\n} from \"./contract\";\nimport { type AppConfig, type AppOrchestrator, startApp } from \"./dev-session\";\nimport {\n buildRegistryConfigUrlForNetwork,\n fetchBosConfigFromFastKv,\n getRegistryNamespaceForAccount,\n getRegistryNamespaceForNetwork,\n} from \"./fastkv\";\nimport { addFunctionCallAccessKey, ensureNearCli, executeTransaction } from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport { createPlugin, z } from \"./sdk\";\nimport { syncAndGenerateSharedUi } from \"./shared\";\nimport type { BosConfig, RuntimeConfig, SourceMode } from \"./types\";\nimport { run } from \"./utils/run\";\n\nconst DEFAULT_DEV_CONFIG: AppConfig = {\n host: \"local\",\n ui: \"local\",\n api: \"local\",\n ssr: false,\n};\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\nconst PUBLISH_FUNCTION_NAMES = [\"__fastdata_kv\"];\n\ntype BosDeps = {\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n configDir: string;\n};\n\ntype PluginAttachmentConfig = NonNullable<BosConfig[\"plugins\"]>[string];\n\nfunction parseSourceMode(value: string | undefined, defaultValue: SourceMode): SourceMode {\n if (value === \"local\" || value === \"remote\") return value;\n return defaultValue;\n}\n\nfunction buildAppConfig(options: {\n host?: string;\n ui?: string;\n api?: string;\n proxy?: boolean;\n ssr?: boolean;\n}): AppConfig {\n return {\n host: parseSourceMode(options.host, DEFAULT_DEV_CONFIG.host),\n ui: parseSourceMode(options.ui, DEFAULT_DEV_CONFIG.ui),\n api: parseSourceMode(options.api, DEFAULT_DEV_CONFIG.api),\n proxy: options.proxy,\n ssr: options.ssr ?? DEFAULT_DEV_CONFIG.ssr,\n };\n}\n\nfunction buildDescription(config: AppConfig): string {\n if (config.host === \"local\" && config.ui === \"local\" && config.api === \"local\" && !config.proxy) {\n return \"Full Local Development\";\n }\n\n const parts: string[] = [];\n parts.push(config.host === \"remote\" ? \"Remote Host\" : \"Local Host\");\n if (config.ui === \"remote\") parts.push(\"Remote UI\");\n if (config.proxy) parts.push(\"Proxy API → Production\");\n else if (config.api === \"remote\") parts.push(\"Remote API\");\n return parts.join(\" + \");\n}\n\nfunction buildConfigResult(bosConfig: BosConfig | null): BosConfigResult {\n const packages = bosConfig ? Object.keys(bosConfig.app) : [];\n const remotes = packages.filter((name) => name !== \"host\");\n\n return {\n config: bosConfig,\n packages,\n remotes,\n };\n}\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(bosConfig?.plugins?.[key]?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nfunction determineProcesses(\n config: AppConfig,\n localPackages: string[],\n runtimeConfig?: RuntimeConfig | null,\n): string[] {\n const processes: string[] = [];\n if (config.ssr && config.ui === \"local\") processes.push(\"ui-ssr\");\n if (config.ui === \"local\") processes.push(\"ui\");\n if (config.api === \"local\" && !config.proxy) processes.push(\"api\");\n for (const pkg of localPackages) {\n if (pkg.startsWith(\"plugin:\")) {\n const pluginId = pkg.slice(\"plugin:\".length);\n if (runtimeConfig?.plugins?.[pluginId]?.source === \"local\") {\n processes.push(pkg);\n }\n }\n }\n processes.push(\"host\");\n return processes;\n}\n\nfunction isValidProxyUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction resolveProxyUrl(bosConfig: BosConfig | null): string | null {\n if (!bosConfig) return null;\n const apiConfig = bosConfig.app.api;\n if (!apiConfig) return null;\n if (apiConfig.proxy && isValidProxyUrl(apiConfig.proxy)) return apiConfig.proxy;\n if (apiConfig.production && isValidProxyUrl(apiConfig.production)) return apiConfig.production;\n return null;\n}\n\nfunction sanitizePluginKey(value: string): string {\n return value\n .replace(/[^A-Za-z0-9/_-]/g, \"-\")\n .replace(/\\/+/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, \"-\"))\n .join(\"/\")\n .replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction defaultPluginKey(source: string): string {\n const normalized = source.replace(/^local:/, \"\").replace(/\\/$/, \"\");\n if (source.startsWith(\"local:\")) {\n return sanitizePluginKey(basename(normalized)) || \"plugin\";\n }\n\n try {\n const url = new URL(source);\n return sanitizePluginKey(basename(url.pathname) || url.hostname) || \"plugin\";\n } catch {\n return sanitizePluginKey(source) || \"plugin\";\n }\n}\n\nfunction pluginLocalPath(configDir: string, attachment: PluginAttachmentConfig): string | null {\n const source = attachment.development ?? attachment.production;\n if (!source?.startsWith(\"local:\")) {\n return null;\n }\n\n return join(configDir, source.slice(\"local:\".length));\n}\n\nasync function saveBosConfig(configDir: string, config: BosConfig): Promise<void> {\n const filePath = join(configDir, \"bos.config.json\");\n const next = `${JSON.stringify(config, null, 2)}\\n`;\n try {\n if (readFileSync(filePath, \"utf8\") === next) return;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, next);\n}\n\nfunction listPluginAttachments(config: BosConfig | null) {\n return (Object.entries(config?.plugins ?? {}) as Array<[string, PluginAttachmentConfig]>)\n .map(([key, attachment]) => ({\n key,\n development: attachment.development,\n production: attachment.production,\n localPath: attachment.development?.startsWith(\"local:\")\n ? attachment.development.slice(\"local:\".length)\n : undefined,\n source: attachment.development?.startsWith(\"local:\")\n ? (\"local\" as const)\n : (\"remote\" as const),\n }))\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nasync function refreshApiContractBridge(configDir: string): Promise<void> {\n const refreshed = await loadConfig({ cwd: configDir, env: \"development\" });\n if (!refreshed) return;\n\n await syncApiContractBridge({\n configDir,\n runtimeConfig: refreshed.runtime,\n apiBaseUrl: refreshed.runtime.api.url,\n });\n}\n\nfunction extractPublishedUrl(output: string): string | null {\n const match = output.match(/https?:\\/\\/[^\\s\"'<>]+/g);\n if (!match || match.length === 0) return null;\n return match[match.length - 1] ?? null;\n}\n\nasync function buildEnvVars(\n config: AppConfig,\n bosConfig?: BosConfig | null,\n): Promise<Record<string, string>> {\n const env: Record<string, string> = {\n HOST_SOURCE: config.host,\n UI_SOURCE: config.ui,\n API_SOURCE: config.api,\n };\n\n if (config.host === \"remote\") {\n const remoteUrl = bosConfig?.app.host.production;\n if (remoteUrl) env.HOST_REMOTE_URL = remoteUrl;\n }\n\n if (config.ui === \"remote\") {\n const remoteUrl = bosConfig?.app.ui.production;\n if (remoteUrl) env.UI_REMOTE_URL = remoteUrl;\n }\n\n if (config.api === \"remote\") {\n const remoteUrl = bosConfig?.app.api.production;\n if (remoteUrl) env.API_REMOTE_URL = remoteUrl;\n }\n\n if (config.proxy && bosConfig) {\n const proxyUrl = resolveProxyUrl(bosConfig);\n if (proxyUrl) env.API_PROXY = proxyUrl;\n }\n\n return env;\n}\n\nasync function buildEveryPluginQuietly(cwd: string) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await Bun.file(`${packageDir}/package.json`).exists();\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await Bun.file(distPath).exists();\n\n if (distExists) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n console.log(\"[build:ssr] build succeeded\");\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nasync function buildEverythingDevQuietly(cwd: string) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await Bun.file(`${packageDir}/package.json`).exists();\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await Bun.file(distPath).exists();\n\n if (distExists) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n console.log(\"[everything-dev] build succeeded\");\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n\nasync function fetchPublishedConfig(\n accountId: string,\n gatewayId: string,\n): Promise<BosConfig | null> {\n try {\n return await fetchBosConfigFromFastKv<BosConfig>(`bos://${accountId}/${gatewayId}`);\n } catch {\n return null;\n }\n}\n\nfunction selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\nasync function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n}): Promise<{ built: string[]; skipped: string[] }> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await Bun.file(`${resolved.path}/package.json`).exists();\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncAndGenerateSharedUi({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n if (existing.some((entry) => entry.key === \"api\")) {\n await buildEveryPluginQuietly(opts.configDir);\n }\n\n await buildEverythingDevQuietly(opts.configDir);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n const built: string[] = [];\n\n for (const resolved of orderedExisting) {\n const pkgJson = JSON.parse(await Bun.file(`${resolved.path}/package.json`).text()) as {\n scripts?: Record<string, string>;\n };\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[resolved.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n\n return { built, skipped };\n}\n\nexport default createPlugin({\n variables: z.object({\n configPath: z.string().optional(),\n }),\n secrets: z.object({}),\n contract: bosContract,\n initialize: (config: any) =>\n Effect.promise(async () => {\n const configResult = await loadConfig({ path: config.variables.configPath });\n return {\n bosConfig: configResult?.config ?? null,\n runtimeConfig: configResult?.runtime ?? null,\n configDir: getProjectRoot(),\n } satisfies BosDeps;\n }),\n shutdown: () => Effect.void,\n createRouter: (deps: BosDeps, builder: any) => ({\n config: builder.config.handler(async () => buildConfigResult(deps.bosConfig)),\n\n pluginAdd: builder.pluginAdd.handler(async ({ input }: { input: PluginAddOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const key = sanitizePluginKey(input.as ?? defaultPluginKey(input.source));\n const existing = deps.bosConfig.plugins?.[key];\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n\n nextPlugins[key] = input.source.startsWith(\"local:\")\n ? {\n ...(existing ?? {}),\n development: input.source,\n production: input.production ?? existing?.production,\n }\n : {\n ...(existing ?? {}),\n production: input.production ?? input.source,\n };\n\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: nextPlugins,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n\n return {\n status: \"added\" as const,\n key,\n development: deps.bosConfig.plugins?.[key]?.development,\n production: deps.bosConfig.plugins?.[key]?.production,\n };\n }),\n\n pluginRemove: builder.pluginRemove.handler(\n async ({ input }: { input: PluginRemoveOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n if (!deps.bosConfig.plugins?.[input.key]) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n delete nextPlugins[input.key];\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : undefined,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n\n return {\n status: \"removed\" as const,\n key: input.key,\n };\n },\n ),\n\n pluginList: builder.pluginList.handler(async () => {\n const plugins: PluginListResult[\"plugins\"] = listPluginAttachments(deps.bosConfig);\n return {\n status: \"listed\" as const,\n plugins,\n };\n }),\n\n pluginPublish: builder.pluginPublish.handler(\n async ({ input }: { input: PluginPublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n const attachment = deps.bosConfig.plugins?.[input.key];\n if (!attachment) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const localPath = pluginLocalPath(deps.configDir, attachment);\n if (!localPath) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' does not have a local development path`,\n };\n }\n\n const pkgPath = join(localPath, \"package.json\");\n if (!(await Bun.file(pkgPath).exists())) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Missing package.json at ${localPath}`,\n };\n }\n\n const pkgJson = (await Bun.file(pkgPath).json()) as { scripts?: Record<string, string> };\n const script = pkgJson.scripts?.deploy ? \"deploy\" : \"build\";\n\n const { stdout, stderr, exitCode } = (await run(\"bun\", [\"run\", script], {\n cwd: localPath,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (exitCode !== 0) {\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Publish failed with exit code ${exitCode}`,\n };\n }\n\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n\n const publishedUrl = extractPublishedUrl(`${stdout}\\n${stderr}`);\n if (publishedUrl) {\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: {\n ...(deps.bosConfig.plugins ?? {}),\n [input.key]: {\n ...(deps.bosConfig.plugins?.[input.key] ?? {}),\n production: publishedUrl,\n },\n },\n };\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await refreshApiContractBridge(deps.configDir);\n }\n\n return {\n status: \"published\" as const,\n key: input.key,\n path: localPath,\n script,\n production: publishedUrl ?? attachment.production,\n };\n },\n ),\n\n dev: builder.dev.handler(async ({ input }: { input: DevOptions }) => {\n const localPackages = detectLocalPackages(\n deps.bosConfig ?? undefined,\n deps.runtimeConfig ?? undefined,\n );\n\n const appConfig = buildAppConfig({\n host: localPackages.includes(\"host\") ? (input.host as string) : \"remote\",\n ui: localPackages.includes(\"ui\") ? (input.ui as string) : \"remote\",\n api: localPackages.includes(\"api\") ? (input.api as string) : \"remote\",\n proxy: input.proxy,\n ssr: input.ssr,\n });\n\n const sharedSync = await syncAndGenerateSharedUi({\n configDir: deps.configDir,\n hostMode: appConfig.host,\n bosConfig: deps.bosConfig ?? undefined,\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: deps.configDir });\n }\n if (\n (appConfig.api === \"local\" && !appConfig.proxy) ||\n localPackages.some((pkg) => pkg.startsWith(\"plugin:\"))\n ) {\n await buildEveryPluginQuietly(deps.configDir);\n }\n\n await buildEverythingDevQuietly(deps.configDir);\n\n const refreshed = await loadConfig({ cwd: deps.configDir });\n deps.bosConfig = refreshed?.config ?? deps.bosConfig;\n deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;\n\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n description: \"No bos.config.json found\",\n processes: [],\n };\n }\n\n if (appConfig.proxy && !resolveProxyUrl(deps.bosConfig)) {\n return {\n status: \"error\" as const,\n description: \"No valid proxy URL configured in bos.config.json\",\n processes: [],\n };\n }\n\n const refreshedLocalPackages = detectLocalPackages(\n deps.bosConfig ?? undefined,\n deps.runtimeConfig ?? undefined,\n );\n const processes = determineProcesses(appConfig, refreshedLocalPackages, deps.runtimeConfig);\n const env = await buildEnvVars(appConfig, deps.bosConfig);\n const hostPort = input.port ?? getHostDevelopmentPort(deps.bosConfig.app.host.development);\n const developmentRuntime = buildRuntimeConfig(deps.bosConfig, {\n uiSource: appConfig.ui,\n apiSource: appConfig.api,\n hostUrl: `http://localhost:${hostPort}`,\n proxy: env.API_PROXY,\n env: \"development\",\n plugins: deps.runtimeConfig?.plugins,\n });\n const runtimeConfig = await prepareDevelopmentRuntimeConfig(developmentRuntime, {\n hostPort,\n ssr: appConfig.ssr,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig: runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const orchestrator: AppOrchestrator = {\n packages: processes,\n env,\n description: buildDescription(appConfig),\n appConfig,\n bosConfig: deps.bosConfig,\n runtimeConfig,\n port: parsePort(runtimeConfig.hostUrl),\n interactive: input.interactive,\n };\n\n startApp(orchestrator);\n\n return {\n status: \"started\" as const,\n description: orchestrator.description,\n processes,\n };\n }),\n\n start: builder.start.handler(async ({ input }: { input: StartOptions }) => {\n let remoteConfig: BosConfig | null = null;\n\n if (input.account && input.domain) {\n remoteConfig = await fetchPublishedConfig(input.account, input.domain);\n if (!remoteConfig) {\n return {\n status: \"error\" as const,\n url: \"\",\n };\n }\n }\n\n const config = remoteConfig || deps.bosConfig;\n if (!config) {\n return {\n status: \"error\" as const,\n url: \"\",\n };\n }\n\n const port = input.port ?? getHostDevelopmentPort(config.app.host.development);\n const appConfig: AppConfig = { host: \"remote\", ui: \"remote\", api: \"remote\" };\n const env = await buildEnvVars(appConfig, config);\n const isStaging = input.env === \"staging\";\n const runtimePlugins = remoteConfig\n ? await buildRuntimePluginsForConfig(config, deps.configDir, \"production\")\n : deps.runtimeConfig?.plugins;\n const runtimeConfig = buildRuntimeConfig(config, {\n uiSource: \"remote\",\n apiSource: \"remote\",\n hostUrl: `http://localhost:${port}`,\n env: \"production\",\n plugins: runtimePlugins,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig: runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const stagingEnvVars: Record<string, string> = isStaging\n ? { GATEWAY_DOMAIN: config.staging?.domain ?? config.domain ?? \"\" }\n : {};\n\n const orchestrator: AppOrchestrator = {\n packages: [\"host\"],\n env: {\n NODE_ENV: \"production\",\n ...env,\n ...stagingEnvVars,\n },\n description: `${isStaging ? \"Staging\" : \"Production\"} Mode (${config.account})`,\n appConfig,\n bosConfig: config,\n runtimeConfig,\n port,\n interactive: input.interactive,\n noLogs: true,\n };\n\n startApp(orchestrator);\n return {\n status: \"running\" as const,\n url: `http://localhost:${port}`,\n };\n }),\n\n build: builder.build.handler(async ({ input }: { input: BuildOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n if (targets.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n const runtimeConfig = buildRuntimeConfig(deps.bosConfig, {\n uiSource: deps.bosConfig.app.ui?.development ? \"local\" : \"remote\",\n apiSource: deps.bosConfig.app.api?.development ? \"local\" : \"remote\",\n hostUrl: resolveDevelopmentHostUrl(deps.bosConfig.app.host.development),\n env: \"development\",\n plugins: deps.runtimeConfig?.plugins,\n });\n\n await syncApiContractBridge({\n configDir: deps.configDir,\n runtimeConfig,\n apiBaseUrl: runtimeConfig.api.url,\n });\n\n const { built, skipped } = await buildWorkspaceTargets({\n configDir: deps.configDir,\n bosConfig: deps.bosConfig,\n runtimeConfig: runtimeConfig,\n targets,\n deploy: input.deploy,\n });\n\n if (built.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped,\n };\n }\n\n return {\n status: \"success\" as const,\n built,\n skipped,\n deployed: input.deploy,\n };\n }),\n\n publish: builder.publish.handler(async ({ input }: { input: PublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const account = deps.bosConfig.account;\n const gateway = deps.bosConfig.domain;\n if (!gateway) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n error: \"bos.config.json must define domain to publish\",\n };\n }\n\n const network = input.network ?? getNetworkIdForAccount(account);\n const bosUrl = `bos://${account}/${gateway}`;\n const registryUrl = buildRegistryConfigUrlForNetwork(network, account, gateway);\n const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n\n let publishConfig = deps.bosConfig;\n let built: string[] | undefined;\n let skipped: string[] | undefined;\n\n if (input.dryRun) {\n return {\n status: \"dry-run\" as const,\n registryUrl,\n built,\n skipped,\n };\n }\n\n if (input.deploy) {\n const result = await buildWorkspaceTargets({\n configDir: deps.configDir,\n bosConfig: deps.bosConfig,\n runtimeConfig: deps.runtimeConfig,\n targets,\n deploy: true,\n });\n built = result.built;\n skipped = result.skipped;\n\n const refreshed = await loadConfig({ cwd: deps.configDir });\n if (refreshed?.config) {\n deps.bosConfig = refreshed.config;\n deps.runtimeConfig = refreshed.runtime;\n publishConfig = refreshed.config;\n }\n }\n\n const payload = JSON.stringify({\n [`apps/${account}/${gateway}/bos.config.json`]: JSON.stringify(publishConfig),\n });\n const argsBase64 = Buffer.from(payload).toString(\"base64\");\n const privateKey =\n input.privateKey || process.env.NEAR_PRIVATE_KEY || process.env.BOS_NEAR_PRIVATE_KEY;\n\n try {\n await Effect.runPromise(ensureNearCli);\n let txHash: string | undefined;\n\n try {\n const tx = await Effect.runPromise(\n executeTransaction({\n account,\n contract: getRegistryNamespaceForNetwork(network),\n method: \"__fastdata_kv\",\n argsBase64,\n network,\n privateKey,\n gas: \"300Tgas\",\n deposit: \"0NEAR\",\n }),\n );\n txHash = tx.txHash;\n } catch (error) {\n txHash = extractTransactionHash(error);\n\n if (!txHash) {\n throw error;\n }\n\n try {\n const verifiedConfig = await fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n if (JSON.stringify(verifiedConfig) !== JSON.stringify(publishConfig)) {\n throw error;\n }\n } catch {\n // Config may not exist yet on first publish or propagation delay;\n // a valid txHash is sufficient proof the transaction was submitted.\n }\n }\n\n return {\n status: \"published\" as const,\n registryUrl,\n txHash,\n built,\n skipped,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n registryUrl,\n error: error instanceof Error ? error.message : \"Unknown error\",\n built,\n skipped,\n };\n }\n }),\n\n keyPublish: builder.keyPublish.handler(async ({ input }: { input: KeyPublishOptions }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n account: \"\",\n network: \"mainnet\" as const,\n contract: \"\",\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: \"No bos.config.json found\",\n };\n }\n\n const account = deps.bosConfig.account;\n const network = getNetworkIdForAccount(account);\n const contract = getRegistryNamespaceForAccount(account);\n try {\n await Effect.runPromise(ensureNearCli);\n const keyPair = await addFunctionCallAccessKey({\n account,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n network,\n });\n\n return {\n status: \"published\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n init: builder.init.handler(async ({ input }: { input: InitOptions }) => {\n try {\n let extendsAccount = input.extendsAccount;\n let extendsGateway = input.extendsGateway;\n let directory = input.directory;\n let account = input.account;\n let domain = input.domain;\n let withHost = input.withHost;\n let plugins = input.plugins;\n\n if (input.extends) {\n const match = input.extends.match(/^(?:bos:\\/\\/)?([^/]+)\\/(.+)$/);\n if (match) {\n if (!extendsAccount) extendsAccount = match[1];\n if (!extendsGateway) extendsGateway = match[2];\n }\n }\n\n if (!input.noInteractive && (!domain || !plugins)) {\n const prompted = await promptInitOptions({\n extendsAccount,\n extendsGateway,\n extends: input.extends,\n directory,\n account,\n domain,\n plugins,\n withHost,\n });\n extendsAccount = prompted.extendsAccount;\n extendsGateway = prompted.extendsGateway;\n directory = prompted.directory;\n account = prompted.account;\n domain = prompted.domain;\n withHost = prompted.withHost;\n plugins = prompted.plugins;\n }\n\n if (!domain) {\n return {\n status: \"error\" as const,\n directory: \"\",\n extendsAccount: extendsAccount ?? \"\",\n extendsGateway: extendsGateway ?? \"\",\n account: input.account,\n domain: input.domain,\n extends:\n extendsAccount && extendsGateway ? `bos://${extendsAccount}/${extendsGateway}` : \"\",\n plugins: plugins ?? [],\n filesCopied: 0,\n error:\n \"domain is required (use --no-interactive to skip prompts and provide it as a flag)\",\n };\n }\n\n extendsAccount = extendsAccount || \"dev.everything.near\";\n extendsGateway = extendsGateway || \"everything.dev\";\n directory = directory || domain || extendsGateway;\n plugins = plugins?.length ? plugins : [\"_template\"];\n\n try {\n await fetchParentConfig(extendsAccount, extendsGateway);\n } catch {\n return {\n status: \"error\" as const,\n directory,\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n plugins: plugins ?? [],\n filesCopied: 0,\n error: `No config found at bos://${extendsAccount}/${extendsGateway} — are you sure this is the right parent?`,\n };\n }\n\n const { sourceDir, parentConfig, cleanup } = await resolveSourceDir({\n extendsAccount,\n extendsGateway,\n source: input.source,\n });\n\n try {\n const patterns = await readTemplatekeep(sourceDir);\n if (patterns.length === 0) {\n return {\n status: \"error\" as const,\n directory,\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n plugins: plugins ?? [],\n filesCopied: 0,\n error: \"No .templatekeep found in template source\",\n };\n }\n\n const pluginRoutes: Record<string, string[]> = {};\n if (parentConfig.plugins) {\n for (const [key, ref] of Object.entries(parentConfig.plugins)) {\n if (ref.routes && ref.routes.length > 0) {\n pluginRoutes[key] = ref.routes;\n }\n }\n }\n\n const filesCopied = await copyFilteredFiles(sourceDir, directory, patterns, {\n withHost,\n plugins,\n pluginRoutes,\n });\n\n await personalizeConfig(directory, {\n extendsAccount,\n extendsGateway,\n account: account || extendsAccount,\n domain: domain || extendsGateway,\n plugins,\n pluginRoutes,\n workspaceOpts: { sourceDir },\n });\n\n await writeInitSnapshot(directory, extendsAccount, extendsGateway, sourceDir, patterns, {\n withHost,\n plugins,\n pluginRoutes,\n });\n\n if (!input.noInstall) {\n await runBunInstall(directory);\n }\n\n return {\n status: \"initialized\" as const,\n directory,\n extendsAccount,\n extendsGateway,\n account,\n domain,\n extends: `bos://${extendsAccount}/${extendsGateway}`,\n plugins,\n filesCopied,\n };\n } finally {\n await cleanup();\n }\n } catch (error) {\n return {\n status: \"error\" as const,\n directory: input.directory ?? \"\",\n extendsAccount: input.extendsAccount ?? \"\",\n extendsGateway: input.extendsGateway ?? \"\",\n account: input.account,\n domain: input.domain,\n extends:\n input.extendsAccount && input.extendsGateway\n ? `bos://${input.extendsAccount}/${input.extendsGateway}`\n : \"\",\n plugins: input.plugins ?? [],\n filesCopied: 0,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n sync: builder.sync.handler(async ({ input }: { input: SyncOptions }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await syncTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }: { input: UpgradeOptions }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n status: builder.status.handler(async () => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await getStatus(projectDir);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n }),\n});\n\nfunction extractTransactionHash(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n const match =\n message.match(/Transaction ID:\\s*([A-Za-z0-9]+)/i) ||\n message.match(/([A-HJ-NP-Za-km-z1-9]{43,44})/);\n\n return match?.[1];\n}\n"],"mappings":"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"}
package/dist/plugin.d.cts CHANGED
@@ -23,8 +23,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
23
23
  interactive: z.ZodOptional<z.ZodBoolean>;
24
24
  }, z.core.$strip>, z.ZodObject<{
25
25
  status: z.ZodEnum<{
26
- error: "error";
27
26
  started: "started";
27
+ error: "error";
28
28
  }>;
29
29
  description: z.ZodString;
30
30
  processes: z.ZodArray<z.ZodString>;
@@ -84,6 +84,7 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
84
84
  proxy: z.ZodOptional<z.ZodString>;
85
85
  variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
86
86
  secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
+ routes: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
88
  }, z.core.$strip>>>;
88
89
  app: z.ZodObject<{
89
90
  host: z.ZodObject<{
@@ -173,8 +174,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
173
174
  dryRun: z.ZodDefault<z.ZodBoolean>;
174
175
  packages: z.ZodDefault<z.ZodString>;
175
176
  network: z.ZodOptional<z.ZodEnum<{
176
- mainnet: "mainnet";
177
177
  testnet: "testnet";
178
+ mainnet: "mainnet";
178
179
  }>>;
179
180
  privateKey: z.ZodOptional<z.ZodString>;
180
181
  }, z.core.$strip>, z.ZodObject<{
@@ -198,8 +199,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
198
199
  }>;
199
200
  account: z.ZodString;
200
201
  network: z.ZodEnum<{
201
- mainnet: "mainnet";
202
202
  testnet: "testnet";
203
+ mainnet: "mainnet";
203
204
  }>;
204
205
  contract: z.ZodString;
205
206
  allowance: z.ZodString;
@@ -209,12 +210,14 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
209
210
  error: z.ZodOptional<z.ZodString>;
210
211
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
211
212
  init: _$_orpc_contract0.ContractProcedure<z.ZodObject<{
213
+ extends: z.ZodOptional<z.ZodString>;
212
214
  extendsAccount: z.ZodOptional<z.ZodString>;
213
215
  extendsGateway: z.ZodOptional<z.ZodString>;
214
216
  directory: z.ZodOptional<z.ZodString>;
215
217
  account: z.ZodOptional<z.ZodString>;
216
218
  domain: z.ZodOptional<z.ZodString>;
217
219
  source: z.ZodOptional<z.ZodString>;
220
+ plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
218
221
  withHost: z.ZodDefault<z.ZodBoolean>;
219
222
  noInteractive: z.ZodDefault<z.ZodBoolean>;
220
223
  noInstall: z.ZodDefault<z.ZodBoolean>;
@@ -229,6 +232,7 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
229
232
  account: z.ZodOptional<z.ZodString>;
230
233
  domain: z.ZodOptional<z.ZodString>;
231
234
  extends: z.ZodString;
235
+ plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
232
236
  filesCopied: z.ZodNumber;
233
237
  error: z.ZodOptional<z.ZodString>;
234
238
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
@@ -352,12 +356,13 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
352
356
  proxy?: string | undefined;
353
357
  variables?: Record<string, string> | undefined;
354
358
  secrets?: string[] | undefined;
359
+ routes?: string[] | undefined;
355
360
  }> | undefined;
356
361
  } | null;
357
362
  runtimeConfig: {
358
363
  env: "development" | "production";
359
364
  account: string;
360
- networkId: "mainnet" | "testnet";
365
+ networkId: "testnet" | "mainnet";
361
366
  hostUrl: string;
362
367
  ui: {
363
368
  name: string;
package/dist/plugin.d.mts CHANGED
@@ -23,8 +23,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
23
23
  interactive: z.ZodOptional<z.ZodBoolean>;
24
24
  }, z.core.$strip>, z.ZodObject<{
25
25
  status: z.ZodEnum<{
26
- error: "error";
27
26
  started: "started";
27
+ error: "error";
28
28
  }>;
29
29
  description: z.ZodString;
30
30
  processes: z.ZodArray<z.ZodString>;
@@ -84,6 +84,7 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
84
84
  proxy: z.ZodOptional<z.ZodString>;
85
85
  variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
86
86
  secrets: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
+ routes: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
88
  }, z.core.$strip>>>;
88
89
  app: z.ZodObject<{
89
90
  host: z.ZodObject<{
@@ -173,8 +174,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
173
174
  dryRun: z.ZodDefault<z.ZodBoolean>;
174
175
  packages: z.ZodDefault<z.ZodString>;
175
176
  network: z.ZodOptional<z.ZodEnum<{
176
- mainnet: "mainnet";
177
177
  testnet: "testnet";
178
+ mainnet: "mainnet";
178
179
  }>>;
179
180
  privateKey: z.ZodOptional<z.ZodString>;
180
181
  }, z.core.$strip>, z.ZodObject<{
@@ -198,8 +199,8 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
198
199
  }>;
199
200
  account: z.ZodString;
200
201
  network: z.ZodEnum<{
201
- mainnet: "mainnet";
202
202
  testnet: "testnet";
203
+ mainnet: "mainnet";
203
204
  }>;
204
205
  contract: z.ZodString;
205
206
  allowance: z.ZodString;
@@ -209,12 +210,14 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
209
210
  error: z.ZodOptional<z.ZodString>;
210
211
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
211
212
  init: _$_orpc_contract0.ContractProcedure<z.ZodObject<{
213
+ extends: z.ZodOptional<z.ZodString>;
212
214
  extendsAccount: z.ZodOptional<z.ZodString>;
213
215
  extendsGateway: z.ZodOptional<z.ZodString>;
214
216
  directory: z.ZodOptional<z.ZodString>;
215
217
  account: z.ZodOptional<z.ZodString>;
216
218
  domain: z.ZodOptional<z.ZodString>;
217
219
  source: z.ZodOptional<z.ZodString>;
220
+ plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
218
221
  withHost: z.ZodDefault<z.ZodBoolean>;
219
222
  noInteractive: z.ZodDefault<z.ZodBoolean>;
220
223
  noInstall: z.ZodDefault<z.ZodBoolean>;
@@ -229,6 +232,7 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
229
232
  account: z.ZodOptional<z.ZodString>;
230
233
  domain: z.ZodOptional<z.ZodString>;
231
234
  extends: z.ZodString;
235
+ plugins: z.ZodOptional<z.ZodArray<z.ZodString>>;
232
236
  filesCopied: z.ZodNumber;
233
237
  error: z.ZodOptional<z.ZodString>;
234
238
  }, z.core.$strip>, _$_orpc_contract0.MergedErrorMap<Record<never, never>, Record<never, never>>, Record<never, never>>;
@@ -352,12 +356,13 @@ declare const _default: _$every_plugin0.LoadedPluginWithBinding<{
352
356
  proxy?: string | undefined;
353
357
  variables?: Record<string, string> | undefined;
354
358
  secrets?: string[] | undefined;
359
+ routes?: string[] | undefined;
355
360
  }> | undefined;
356
361
  } | null;
357
362
  runtimeConfig: {
358
363
  env: "development" | "production";
359
364
  account: string;
360
- networkId: "mainnet" | "testnet";
365
+ networkId: "testnet" | "mainnet";
361
366
  hostUrl: string;
362
367
  ui: {
363
368
  name: string;
package/dist/plugin.mjs CHANGED
@@ -738,24 +738,23 @@ var plugin_default = createPlugin({
738
738
  let account = input.account;
739
739
  let domain = input.domain;
740
740
  let withHost = input.withHost;
741
- if (!domain) {
742
- if (input.noInteractive) return {
743
- status: "error",
744
- directory: "",
745
- extendsAccount: extendsAccount ?? "",
746
- extendsGateway: extendsGateway ?? "",
747
- account: input.account,
748
- domain: input.domain,
749
- extends: extendsAccount && extendsGateway ? `bos://${extendsAccount}/${extendsGateway}` : "",
750
- filesCopied: 0,
751
- error: "domain is required (use --no-interactive to skip prompts and provide it as a flag)"
752
- };
741
+ let plugins = input.plugins;
742
+ if (input.extends) {
743
+ const match = input.extends.match(/^(?:bos:\/\/)?([^/]+)\/(.+)$/);
744
+ if (match) {
745
+ if (!extendsAccount) extendsAccount = match[1];
746
+ if (!extendsGateway) extendsGateway = match[2];
747
+ }
748
+ }
749
+ if (!input.noInteractive && (!domain || !plugins)) {
753
750
  const prompted = await promptInitOptions({
754
751
  extendsAccount,
755
752
  extendsGateway,
753
+ extends: input.extends,
756
754
  directory,
757
755
  account,
758
756
  domain,
757
+ plugins,
759
758
  withHost
760
759
  });
761
760
  extendsAccount = prompted.extendsAccount;
@@ -764,10 +763,24 @@ var plugin_default = createPlugin({
764
763
  account = prompted.account;
765
764
  domain = prompted.domain;
766
765
  withHost = prompted.withHost;
766
+ plugins = prompted.plugins;
767
767
  }
768
+ if (!domain) return {
769
+ status: "error",
770
+ directory: "",
771
+ extendsAccount: extendsAccount ?? "",
772
+ extendsGateway: extendsGateway ?? "",
773
+ account: input.account,
774
+ domain: input.domain,
775
+ extends: extendsAccount && extendsGateway ? `bos://${extendsAccount}/${extendsGateway}` : "",
776
+ plugins: plugins ?? [],
777
+ filesCopied: 0,
778
+ error: "domain is required (use --no-interactive to skip prompts and provide it as a flag)"
779
+ };
768
780
  extendsAccount = extendsAccount || "dev.everything.near";
769
781
  extendsGateway = extendsGateway || "everything.dev";
770
- directory = directory || (domain ? domain.split(".")[0] : extendsGateway);
782
+ directory = directory || domain || extendsGateway;
783
+ plugins = plugins?.length ? plugins : ["_template"];
771
784
  try {
772
785
  await fetchParentConfig(extendsAccount, extendsGateway);
773
786
  } catch {
@@ -779,11 +792,12 @@ var plugin_default = createPlugin({
779
792
  account,
780
793
  domain,
781
794
  extends: `bos://${extendsAccount}/${extendsGateway}`,
795
+ plugins: plugins ?? [],
782
796
  filesCopied: 0,
783
797
  error: `No config found at bos://${extendsAccount}/${extendsGateway} — are you sure this is the right parent?`
784
798
  };
785
799
  }
786
- const { sourceDir, cleanup } = await resolveSourceDir({
800
+ const { sourceDir, parentConfig, cleanup } = await resolveSourceDir({
787
801
  extendsAccount,
788
802
  extendsGateway,
789
803
  source: input.source
@@ -798,27 +812,43 @@ var plugin_default = createPlugin({
798
812
  account,
799
813
  domain,
800
814
  extends: `bos://${extendsAccount}/${extendsGateway}`,
815
+ plugins: plugins ?? [],
801
816
  filesCopied: 0,
802
817
  error: "No .templatekeep found in template source"
803
818
  };
804
- const filesCopied = await copyFilteredFiles(sourceDir, directory, patterns, { withHost });
819
+ const pluginRoutes = {};
820
+ if (parentConfig.plugins) {
821
+ for (const [key, ref] of Object.entries(parentConfig.plugins)) if (ref.routes && ref.routes.length > 0) pluginRoutes[key] = ref.routes;
822
+ }
823
+ const filesCopied = await copyFilteredFiles(sourceDir, directory, patterns, {
824
+ withHost,
825
+ plugins,
826
+ pluginRoutes
827
+ });
805
828
  await personalizeConfig(directory, {
806
829
  extendsAccount,
807
830
  extendsGateway,
808
831
  account: account || extendsAccount,
809
832
  domain: domain || extendsGateway,
833
+ plugins,
834
+ pluginRoutes,
810
835
  workspaceOpts: { sourceDir }
811
836
  });
812
- await writeInitSnapshot(directory, extendsAccount, extendsGateway, sourceDir, patterns, { withHost });
837
+ await writeInitSnapshot(directory, extendsAccount, extendsGateway, sourceDir, patterns, {
838
+ withHost,
839
+ plugins,
840
+ pluginRoutes
841
+ });
813
842
  if (!input.noInstall) await runBunInstall(directory);
814
843
  return {
815
844
  status: "initialized",
816
- directory: resolve(directory),
845
+ directory,
817
846
  extendsAccount,
818
847
  extendsGateway,
819
848
  account,
820
849
  domain,
821
850
  extends: `bos://${extendsAccount}/${extendsGateway}`,
851
+ plugins,
822
852
  filesCopied
823
853
  };
824
854
  } finally {
@@ -833,6 +863,7 @@ var plugin_default = createPlugin({
833
863
  account: input.account,
834
864
  domain: input.domain,
835
865
  extends: input.extendsAccount && input.extendsGateway ? `bos://${input.extendsAccount}/${input.extendsGateway}` : "",
866
+ plugins: input.plugins ?? [],
836
867
  filesCopied: 0,
837
868
  error: error instanceof Error ? error.message : "Unknown error"
838
869
  };