everything-dev 0.3.2 → 1.3.2
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/README.md +64 -0
- package/cli.js +10 -0
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/api-contract.cjs +172 -0
- package/dist/api-contract.cjs.map +1 -0
- package/dist/api-contract.mjs +171 -0
- package/dist/api-contract.mjs.map +1 -0
- package/dist/api.cjs +124 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.cts +36 -0
- package/dist/api.d.cts.map +1 -0
- package/dist/api.d.mts +36 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +119 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app.cjs +156 -0
- package/dist/app.cjs.map +1 -0
- package/dist/app.mjs +153 -0
- package/dist/app.mjs.map +1 -0
- package/dist/cli/catalog.cjs +30 -0
- package/dist/cli/catalog.cjs.map +1 -0
- package/dist/cli/catalog.mjs +29 -0
- package/dist/cli/catalog.mjs.map +1 -0
- package/dist/cli/help.cjs +16 -0
- package/dist/cli/help.cjs.map +1 -0
- package/dist/cli/help.mjs +16 -0
- package/dist/cli/help.mjs.map +1 -0
- package/dist/cli/init.cjs +317 -0
- package/dist/cli/init.cjs.map +1 -0
- package/dist/cli/init.d.cts +36 -0
- package/dist/cli/init.d.cts.map +1 -0
- package/dist/cli/init.d.mts +36 -0
- package/dist/cli/init.d.mts.map +1 -0
- package/dist/cli/init.mjs +309 -0
- package/dist/cli/init.mjs.map +1 -0
- package/dist/cli/parse.cjs +96 -0
- package/dist/cli/parse.cjs.map +1 -0
- package/dist/cli/parse.mjs +95 -0
- package/dist/cli/parse.mjs.map +1 -0
- package/dist/cli/prompts.cjs +42 -0
- package/dist/cli/prompts.cjs.map +1 -0
- package/dist/cli/prompts.mjs +41 -0
- package/dist/cli/prompts.mjs.map +1 -0
- package/dist/cli.cjs +167 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +166 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/components/dev-view.cjs +307 -0
- package/dist/components/dev-view.cjs.map +1 -0
- package/dist/components/dev-view.mjs +306 -0
- package/dist/components/dev-view.mjs.map +1 -0
- package/dist/components/streaming-view.cjs +146 -0
- package/dist/components/streaming-view.cjs.map +1 -0
- package/dist/components/streaming-view.mjs +144 -0
- package/dist/components/streaming-view.mjs.map +1 -0
- package/dist/config.cjs +280 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +35 -0
- package/dist/config.d.cts.map +1 -0
- package/dist/config.d.mts +35 -0
- package/dist/config.d.mts.map +1 -0
- package/dist/config.mjs +266 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contract.cjs +209 -0
- package/dist/contract.cjs.map +1 -0
- package/dist/contract.d.cts +490 -0
- package/dist/contract.d.cts.map +1 -0
- package/dist/contract.d.mts +490 -0
- package/dist/contract.d.mts.map +1 -0
- package/dist/contract.meta.cjs +104 -0
- package/dist/contract.meta.cjs.map +1 -0
- package/dist/contract.meta.d.cts +141 -0
- package/dist/contract.meta.d.cts.map +1 -0
- package/dist/contract.meta.d.mts +141 -0
- package/dist/contract.meta.d.mts.map +1 -0
- package/dist/contract.meta.mjs +102 -0
- package/dist/contract.meta.mjs.map +1 -0
- package/dist/contract.mjs +186 -0
- package/dist/contract.mjs.map +1 -0
- package/dist/dev-logs.cjs +53 -0
- package/dist/dev-logs.cjs.map +1 -0
- package/dist/dev-logs.mjs +51 -0
- package/dist/dev-logs.mjs.map +1 -0
- package/dist/dev-session.cjs +195 -0
- package/dist/dev-session.cjs.map +1 -0
- package/dist/dev-session.mjs +194 -0
- package/dist/dev-session.mjs.map +1 -0
- package/dist/fastkv.cjs +89 -0
- package/dist/fastkv.cjs.map +1 -0
- package/dist/fastkv.d.cts +11 -0
- package/dist/fastkv.d.cts.map +1 -0
- package/dist/fastkv.d.mts +11 -0
- package/dist/fastkv.d.mts.map +1 -0
- package/dist/fastkv.mjs +82 -0
- package/dist/fastkv.mjs.map +1 -0
- package/dist/federation.server.cjs +27 -0
- package/dist/federation.server.cjs.map +1 -0
- package/dist/federation.server.mjs +27 -0
- package/dist/federation.server.mjs.map +1 -0
- package/dist/host.cjs +367 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.cts +22 -0
- package/dist/host.d.cts.map +1 -0
- package/dist/host.d.mts +22 -0
- package/dist/host.d.mts.map +1 -0
- package/dist/host.mjs +364 -0
- package/dist/host.mjs.map +1 -0
- package/dist/index.cjs +122 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.mjs +9 -0
- package/dist/integrity.cjs +39 -0
- package/dist/integrity.cjs.map +1 -0
- package/dist/integrity.d.cts +7 -0
- package/dist/integrity.d.cts.map +1 -0
- package/dist/integrity.d.mts +7 -0
- package/dist/integrity.d.mts.map +1 -0
- package/dist/integrity.mjs +35 -0
- package/dist/integrity.mjs.map +1 -0
- package/dist/mf.cjs +77 -0
- package/dist/mf.cjs.map +1 -0
- package/dist/mf.d.cts +19 -0
- package/dist/mf.d.cts.map +1 -0
- package/dist/mf.d.mts +19 -0
- package/dist/mf.d.mts.map +1 -0
- package/dist/mf.mjs +71 -0
- package/dist/mf.mjs.map +1 -0
- package/dist/near-cli.cjs +196 -0
- package/dist/near-cli.cjs.map +1 -0
- package/dist/near-cli.mjs +193 -0
- package/dist/near-cli.mjs.map +1 -0
- package/dist/network.cjs +9 -0
- package/dist/network.cjs.map +1 -0
- package/dist/network.mjs +8 -0
- package/dist/network.mjs.map +1 -0
- package/dist/orchestrator.cjs +441 -0
- package/dist/orchestrator.cjs.map +1 -0
- package/dist/orchestrator.d.cts +40 -0
- package/dist/orchestrator.d.cts.map +1 -0
- package/dist/orchestrator.d.mts +40 -0
- package/dist/orchestrator.d.mts.map +1 -0
- package/dist/orchestrator.mjs +436 -0
- package/dist/orchestrator.mjs.map +1 -0
- package/dist/plugin.cjs +825 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +347 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +348 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +822 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/process-registry.cjs +120 -0
- package/dist/process-registry.cjs.map +1 -0
- package/dist/process-registry.d.cts +25 -0
- package/dist/process-registry.d.cts.map +1 -0
- package/dist/process-registry.d.mts +25 -0
- package/dist/process-registry.d.mts.map +1 -0
- package/dist/process-registry.mjs +119 -0
- package/dist/process-registry.mjs.map +1 -0
- package/dist/sdk.cjs +61 -0
- package/dist/sdk.d.cts +5 -0
- package/dist/sdk.d.mts +5 -0
- package/dist/sdk.mjs +6 -0
- package/dist/shared.cjs +143 -0
- package/dist/shared.cjs.map +1 -0
- package/dist/shared.d.cts +33 -0
- package/dist/shared.d.cts.map +1 -0
- package/dist/shared.d.mts +33 -0
- package/dist/shared.d.mts.map +1 -0
- package/dist/shared.mjs +140 -0
- package/dist/shared.mjs.map +1 -0
- package/dist/types.cjs +160 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +269 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +269 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +144 -0
- package/dist/types.mjs.map +1 -0
- package/dist/ui/head.cjs +67 -0
- package/dist/ui/head.cjs.map +1 -0
- package/dist/ui/head.d.cts +19 -0
- package/dist/ui/head.d.cts.map +1 -0
- package/dist/ui/head.d.mts +19 -0
- package/dist/ui/head.d.mts.map +1 -0
- package/dist/ui/head.mjs +61 -0
- package/dist/ui/head.mjs.map +1 -0
- package/dist/ui/index.cjs +32 -0
- package/dist/ui/index.d.cts +7 -0
- package/dist/ui/index.d.mts +7 -0
- package/dist/ui/index.mjs +6 -0
- package/dist/ui/metadata.cjs +106 -0
- package/dist/ui/metadata.cjs.map +1 -0
- package/dist/ui/metadata.d.cts +35 -0
- package/dist/ui/metadata.d.cts.map +1 -0
- package/dist/ui/metadata.d.mts +35 -0
- package/dist/ui/metadata.d.mts.map +1 -0
- package/dist/ui/metadata.mjs +100 -0
- package/dist/ui/metadata.mjs.map +1 -0
- package/dist/ui/router.cjs +56 -0
- package/dist/ui/router.cjs.map +1 -0
- package/dist/ui/router.d.cts +11 -0
- package/dist/ui/router.d.cts.map +1 -0
- package/dist/ui/router.d.mts +11 -0
- package/dist/ui/router.d.mts.map +1 -0
- package/dist/ui/router.mjs +51 -0
- package/dist/ui/router.mjs.map +1 -0
- package/dist/ui/runtime.cjs +65 -0
- package/dist/ui/runtime.cjs.map +1 -0
- package/dist/ui/runtime.d.cts +29 -0
- package/dist/ui/runtime.d.cts.map +1 -0
- package/dist/ui/runtime.d.mts +29 -0
- package/dist/ui/runtime.d.mts.map +1 -0
- package/dist/ui/runtime.mjs +53 -0
- package/dist/ui/runtime.mjs.map +1 -0
- package/dist/ui/types.cjs +0 -0
- package/dist/ui/types.d.cts +52 -0
- package/dist/ui/types.d.cts.map +1 -0
- package/dist/ui/types.d.mts +52 -0
- package/dist/ui/types.d.mts.map +1 -0
- package/dist/ui/types.mjs +1 -0
- package/dist/utils/banner.cjs +24 -0
- package/dist/utils/banner.cjs.map +1 -0
- package/dist/utils/banner.mjs +23 -0
- package/dist/utils/banner.mjs.map +1 -0
- package/dist/utils/linkify.cjs +15 -0
- package/dist/utils/linkify.cjs.map +1 -0
- package/dist/utils/linkify.mjs +14 -0
- package/dist/utils/linkify.mjs.map +1 -0
- package/dist/utils/run.cjs +40 -0
- package/dist/utils/run.cjs.map +1 -0
- package/dist/utils/run.mjs +39 -0
- package/dist/utils/run.mjs.map +1 -0
- package/dist/utils/theme.cjs +44 -0
- package/dist/utils/theme.cjs.map +1 -0
- package/dist/utils/theme.mjs +37 -0
- package/dist/utils/theme.mjs.map +1 -0
- package/package.json +269 -80
- package/src/api-contract.ts +309 -0
- package/src/api.ts +181 -0
- package/src/app.ts +346 -0
- package/src/cli/catalog.ts +49 -0
- package/src/cli/help.ts +13 -0
- package/src/cli/init.ts +415 -0
- package/src/cli/parse.ts +130 -0
- package/src/cli/prompts.ts +64 -0
- package/src/cli.ts +203 -1507
- package/src/components/dev-view.tsx +104 -41
- package/src/components/streaming-view.ts +89 -22
- package/src/config.ts +462 -532
- package/src/contract.meta.ts +96 -0
- package/src/contract.ts +164 -561
- package/src/dev-logs.ts +85 -0
- package/src/dev-session.ts +318 -0
- package/src/fastkv.ts +153 -0
- package/src/federation.server.ts +43 -0
- package/src/host.ts +526 -0
- package/src/index.ts +6 -3
- package/src/integrity.ts +54 -0
- package/src/mf.ts +105 -0
- package/src/near-cli.ts +284 -0
- package/src/network.ts +3 -0
- package/src/orchestrator.ts +648 -0
- package/src/plugin.ts +1116 -2303
- package/src/process-registry.ts +154 -0
- package/src/scripts/sync-api-contract.ts +24 -0
- package/src/sdk.ts +14 -0
- package/src/shared.ts +206 -0
- package/src/types.ts +152 -206
- package/src/ui/head.ts +34 -27
- package/src/ui/index.ts +3 -3
- package/src/ui/metadata.ts +95 -0
- package/src/ui/router.ts +22 -6
- package/src/ui/runtime.ts +55 -6
- package/src/ui/types.ts +24 -11
- package/src/utils/banner.ts +10 -6
- package/src/utils/run.ts +26 -27
- package/src/utils/theme.ts +3 -66
- package/src/components/monitor-view.tsx +0 -475
- package/src/components/status-view.tsx +0 -173
- package/src/lib/env.ts +0 -109
- package/src/lib/near-cli.ts +0 -289
- package/src/lib/nova.ts +0 -266
- package/src/lib/orchestrator.ts +0 -276
- package/src/lib/process-registry.ts +0 -166
- package/src/lib/process.ts +0 -549
- package/src/lib/resource-monitor/assertions.ts +0 -234
- package/src/lib/resource-monitor/command.ts +0 -283
- package/src/lib/resource-monitor/diff.ts +0 -157
- package/src/lib/resource-monitor/errors.ts +0 -127
- package/src/lib/resource-monitor/index.ts +0 -305
- package/src/lib/resource-monitor/platform/darwin.ts +0 -306
- package/src/lib/resource-monitor/platform/index.ts +0 -35
- package/src/lib/resource-monitor/platform/linux.ts +0 -332
- package/src/lib/resource-monitor/platform/windows.ts +0 -298
- package/src/lib/resource-monitor/snapshot.ts +0 -217
- package/src/lib/resource-monitor/types.ts +0 -74
- package/src/lib/session-recorder/errors.ts +0 -102
- package/src/lib/session-recorder/flows/login.ts +0 -210
- package/src/lib/session-recorder/index.ts +0 -361
- package/src/lib/session-recorder/playwright.ts +0 -257
- package/src/lib/session-recorder/report.ts +0 -353
- package/src/lib/session-recorder/server.ts +0 -267
- package/src/lib/session-recorder/types.ts +0 -115
- package/src/lib/sync.ts +0 -1
- package/src/ui/files.ts +0 -134
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { Effect } from \"effect\";\nimport { syncApiContractBridge } from \"./api-contract\";\nimport { buildRuntimeConfig, detectLocalPackages, prepareDevelopmentRuntimeConfig } from \"./app\";\nimport {\n copyFilteredFiles,\n personalizeConfig,\n readTemplatekeep,\n resolveSourceDir,\n runBunInstall,\n} from \"./cli/init\";\nimport { promptInitOptions } from \"./cli/prompts\";\nimport {\n buildRuntimePluginsForConfig,\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} 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 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 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 const verifiedConfig = await fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n if (JSON.stringify(verifiedConfig) !== JSON.stringify(publishConfig)) {\n throw error;\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 account = input.account;\n let gateway = input.gateway;\n let destination = input.destination;\n let name = input.name;\n let domain = input.domain;\n let withHost = input.withHost;\n\n if (!account || !gateway) {\n if (input.noInteractive) {\n return {\n status: \"error\" as const,\n destination: \"\",\n parentAccount: account ?? \"\",\n parentGateway: gateway ?? \"\",\n name: input.name,\n domain: input.domain,\n extends: account && gateway ? `bos://${account}/${gateway}` : \"\",\n filesCopied: 0,\n error:\n \"account and gateway are required (use --no-interactive to skip prompts and provide them as positional args)\",\n };\n }\n\n const prompted = await promptInitOptions({\n account,\n gateway,\n destination,\n name,\n domain,\n withHost,\n });\n account = prompted.account;\n gateway = prompted.gateway;\n destination = prompted.destination;\n name = prompted.name;\n domain = prompted.domain;\n withHost = prompted.withHost;\n }\n\n destination = destination || gateway;\n\n const { sourceDir, cleanup } = await resolveSourceDir({\n account,\n gateway,\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 destination,\n parentAccount: account,\n parentGateway: gateway,\n name,\n domain,\n extends: `bos://${account}/${gateway}`,\n filesCopied: 0,\n error: \"No .templatekeep found in template source\",\n };\n }\n\n const filesCopied = await copyFilteredFiles(sourceDir, destination, patterns, {\n withHost,\n });\n\n await personalizeConfig(destination, {\n parentAccount: account,\n parentGateway: gateway,\n name: name || account,\n domain: domain || gateway,\n });\n\n if (!input.noInstall) {\n await runBunInstall(destination);\n }\n\n return {\n status: \"initialized\" as const,\n destination: resolve(destination),\n parentAccount: account,\n parentGateway: gateway,\n name,\n domain,\n extends: `bos://${account}/${gateway}`,\n filesCopied,\n };\n } finally {\n await cleanup();\n }\n } catch (error) {\n return {\n status: \"error\" as const,\n destination: input.destination ?? input.gateway ?? \"\",\n parentAccount: input.account ?? \"\",\n parentGateway: input.gateway ?? \"\",\n name: input.name,\n domain: input.domain,\n extends: input.account && input.gateway ? `bos://${input.account}/${input.gateway}` : \"\",\n filesCopied: 0,\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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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_dev_logs = require('./dev-logs.cjs');
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
let node_path = require("node:path");
|
|
5
|
+
let effect = require("effect");
|
|
6
|
+
let node_fs_promises = require("node:fs/promises");
|
|
7
|
+
|
|
8
|
+
//#region src/process-registry.ts
|
|
9
|
+
function getPidFilePath(configDir) {
|
|
10
|
+
return (0, node_path.join)(require_dev_logs.getBosDir(configDir), "pids.json");
|
|
11
|
+
}
|
|
12
|
+
const isProcessAlive = (pid) => {
|
|
13
|
+
try {
|
|
14
|
+
process.kill(pid, 0);
|
|
15
|
+
return true;
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const killProcess = (pid, signal) => {
|
|
21
|
+
try {
|
|
22
|
+
try {
|
|
23
|
+
process.kill(-pid, signal);
|
|
24
|
+
} catch {}
|
|
25
|
+
process.kill(pid, signal);
|
|
26
|
+
return true;
|
|
27
|
+
} catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const makeProcessRegistry = (configDir) => effect.Effect.gen(function* () {
|
|
32
|
+
const tracked = yield* effect.Ref.make(/* @__PURE__ */ new Map());
|
|
33
|
+
const pidFile = getPidFilePath(configDir);
|
|
34
|
+
const getAll = () => effect.Ref.get(tracked).pipe(effect.Effect.map((m) => Array.from(m.values())));
|
|
35
|
+
const persist = () => effect.Effect.gen(function* () {
|
|
36
|
+
const procs = yield* getAll();
|
|
37
|
+
const dir = (0, node_path.dirname)(pidFile);
|
|
38
|
+
yield* effect.Effect.tryPromise({
|
|
39
|
+
try: async () => {
|
|
40
|
+
if (!(0, node_fs.existsSync)(dir)) await (0, node_fs_promises.mkdir)(dir, { recursive: true });
|
|
41
|
+
await (0, node_fs_promises.writeFile)(pidFile, JSON.stringify(procs, null, 2));
|
|
42
|
+
},
|
|
43
|
+
catch: () => /* @__PURE__ */ new Error("Failed to persist PIDs")
|
|
44
|
+
}).pipe(effect.Effect.catchAll(() => effect.Effect.void));
|
|
45
|
+
});
|
|
46
|
+
const track = (proc) => effect.Effect.gen(function* () {
|
|
47
|
+
yield* effect.Ref.update(tracked, (m) => new Map(m).set(proc.pid, proc));
|
|
48
|
+
yield* persist();
|
|
49
|
+
});
|
|
50
|
+
const untrack = (pid) => effect.Effect.gen(function* () {
|
|
51
|
+
yield* effect.Ref.update(tracked, (m) => {
|
|
52
|
+
const copy = new Map(m);
|
|
53
|
+
copy.delete(pid);
|
|
54
|
+
return copy;
|
|
55
|
+
});
|
|
56
|
+
yield* persist();
|
|
57
|
+
});
|
|
58
|
+
const restore = () => effect.Effect.gen(function* () {
|
|
59
|
+
if (!(0, node_fs.existsSync)(pidFile)) return;
|
|
60
|
+
const content = yield* effect.Effect.tryPromise({
|
|
61
|
+
try: () => (0, node_fs_promises.readFile)(pidFile, "utf8"),
|
|
62
|
+
catch: () => /* @__PURE__ */ new Error("Failed to read PID file")
|
|
63
|
+
}).pipe(effect.Effect.catchAll(() => effect.Effect.succeed("")));
|
|
64
|
+
if (!content) return;
|
|
65
|
+
let procs;
|
|
66
|
+
try {
|
|
67
|
+
procs = JSON.parse(content);
|
|
68
|
+
} catch {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const alive = procs.filter((p) => isProcessAlive(p.pid));
|
|
72
|
+
yield* effect.Ref.set(tracked, new Map(alive.map((p) => [p.pid, p])));
|
|
73
|
+
});
|
|
74
|
+
yield* restore();
|
|
75
|
+
const killAll = (force = false) => effect.Effect.gen(function* () {
|
|
76
|
+
const procs = yield* getAll();
|
|
77
|
+
const killed = [];
|
|
78
|
+
const failed = [];
|
|
79
|
+
for (const proc of procs) {
|
|
80
|
+
if (!isProcessAlive(proc.pid)) {
|
|
81
|
+
yield* untrack(proc.pid);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const signal = force ? "SIGKILL" : "SIGTERM";
|
|
85
|
+
if (killProcess(proc.pid, signal)) {
|
|
86
|
+
killed.push(proc.pid);
|
|
87
|
+
yield* untrack(proc.pid);
|
|
88
|
+
} else failed.push(proc.pid);
|
|
89
|
+
}
|
|
90
|
+
if (!force && failed.length > 0) {
|
|
91
|
+
yield* effect.Effect.sleep("500 millis");
|
|
92
|
+
for (const pid of [...failed]) if (killProcess(pid, "SIGKILL")) {
|
|
93
|
+
const idx = failed.indexOf(pid);
|
|
94
|
+
if (idx !== -1) {
|
|
95
|
+
failed.splice(idx, 1);
|
|
96
|
+
killed.push(pid);
|
|
97
|
+
}
|
|
98
|
+
yield* untrack(pid);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
yield* persist();
|
|
102
|
+
return {
|
|
103
|
+
killed,
|
|
104
|
+
failed
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
tracked,
|
|
109
|
+
track,
|
|
110
|
+
untrack,
|
|
111
|
+
getAll,
|
|
112
|
+
killAll,
|
|
113
|
+
persist,
|
|
114
|
+
restore
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
exports.makeProcessRegistry = makeProcessRegistry;
|
|
120
|
+
//# sourceMappingURL=process-registry.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.cjs","names":["getBosDir","Effect","Ref"],"sources":["../src/process-registry.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { Effect, Ref } from \"effect\";\nimport { getBosDir } from \"./dev-logs\";\n\nexport interface TrackedProcess {\n pid: number;\n name: string;\n port: number;\n startedAt: number;\n command: string;\n}\n\nexport interface ProcessRegistry {\n readonly tracked: Ref.Ref<Map<number, TrackedProcess>>;\n track: (proc: TrackedProcess) => Effect.Effect<void>;\n untrack: (pid: number) => Effect.Effect<void>;\n getAll: () => Effect.Effect<TrackedProcess[]>;\n killAll: (force?: boolean) => Effect.Effect<{ killed: number[]; failed: number[] }>;\n persist: () => Effect.Effect<void>;\n restore: () => Effect.Effect<void>;\n}\n\nexport function getPidFilePath(configDir: string): string {\n return join(getBosDir(configDir), \"pids.json\");\n}\n\nconst isProcessAlive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\nconst killProcess = (pid: number, signal: NodeJS.Signals): boolean => {\n try {\n // Try process group first (covers spawned child trees)\n try {\n process.kill(-pid, signal);\n } catch {}\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const makeProcessRegistry = (configDir: string) =>\n Effect.gen(function* () {\n const tracked = yield* Ref.make(new Map<number, TrackedProcess>());\n const pidFile = getPidFilePath(configDir);\n\n const getAll: ProcessRegistry[\"getAll\"] = () =>\n Ref.get(tracked).pipe(Effect.map((m) => Array.from(m.values())));\n\n const persist: ProcessRegistry[\"persist\"] = () =>\n Effect.gen(function* () {\n const procs = yield* getAll();\n const dir = dirname(pidFile);\n yield* Effect.tryPromise({\n try: async () => {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(pidFile, JSON.stringify(procs, null, 2));\n },\n catch: () => new Error(\"Failed to persist PIDs\"),\n }).pipe(Effect.catchAll(() => Effect.void));\n });\n\n const track: ProcessRegistry[\"track\"] = (proc) =>\n Effect.gen(function* () {\n yield* Ref.update(tracked, (m) => new Map(m).set(proc.pid, proc));\n yield* persist();\n });\n\n const untrack: ProcessRegistry[\"untrack\"] = (pid) =>\n Effect.gen(function* () {\n yield* Ref.update(tracked, (m) => {\n const copy = new Map(m);\n copy.delete(pid);\n return copy;\n });\n yield* persist();\n });\n\n const restore: ProcessRegistry[\"restore\"] = () =>\n Effect.gen(function* () {\n if (!existsSync(pidFile)) return;\n\n const content = yield* Effect.tryPromise({\n try: () => readFile(pidFile, \"utf8\"),\n catch: () => new Error(\"Failed to read PID file\"),\n }).pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (!content) return;\n\n let procs: TrackedProcess[];\n try {\n procs = JSON.parse(content) as TrackedProcess[];\n } catch {\n return;\n }\n\n const alive = procs.filter((p) => isProcessAlive(p.pid));\n yield* Ref.set(tracked, new Map(alive.map((p) => [p.pid, p])));\n });\n\n yield* restore();\n\n const killAll: ProcessRegistry[\"killAll\"] = (force = false) =>\n Effect.gen(function* () {\n const procs = yield* getAll();\n const killed: number[] = [];\n const failed: number[] = [];\n\n for (const proc of procs) {\n if (!isProcessAlive(proc.pid)) {\n yield* untrack(proc.pid);\n continue;\n }\n\n const signal = force ? \"SIGKILL\" : \"SIGTERM\";\n if (killProcess(proc.pid, signal)) {\n killed.push(proc.pid);\n yield* untrack(proc.pid);\n } else {\n failed.push(proc.pid);\n }\n }\n\n if (!force && failed.length > 0) {\n yield* Effect.sleep(\"500 millis\");\n for (const pid of [...failed]) {\n if (killProcess(pid, \"SIGKILL\")) {\n const idx = failed.indexOf(pid);\n if (idx !== -1) {\n failed.splice(idx, 1);\n killed.push(pid);\n }\n yield* untrack(pid);\n }\n }\n }\n\n yield* persist();\n return { killed, failed };\n });\n\n return { tracked, track, untrack, getAll, killAll, persist, restore };\n });\n"],"mappings":";;;;;;;;AAwBA,SAAgB,eAAe,WAA2B;AACxD,4BAAYA,2BAAU,UAAU,EAAE,YAAY;;AAGhD,MAAM,kBAAkB,QAAyB;AAC/C,KAAI;AACF,UAAQ,KAAK,KAAK,EAAE;AACpB,SAAO;SACD;AACN,SAAO;;;AAIX,MAAM,eAAe,KAAa,WAAoC;AACpE,KAAI;AAEF,MAAI;AACF,WAAQ,KAAK,CAAC,KAAK,OAAO;UACpB;AACR,UAAQ,KAAK,KAAK,OAAO;AACzB,SAAO;SACD;AACN,SAAO;;;AAIX,MAAa,uBAAuB,cAClCC,cAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAOC,WAAI,qBAAK,IAAI,KAA6B,CAAC;CAClE,MAAM,UAAU,eAAe,UAAU;CAEzC,MAAM,eACJA,WAAI,IAAI,QAAQ,CAAC,KAAKD,cAAO,KAAK,MAAM,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;CAElE,MAAM,gBACJA,cAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAO,QAAQ;EAC7B,MAAM,6BAAc,QAAQ;AAC5B,SAAOA,cAAO,WAAW;GACvB,KAAK,YAAY;AACf,QAAI,yBAAY,IAAI,CAClB,mCAAY,KAAK,EAAE,WAAW,MAAM,CAAC;AAEvC,0CAAgB,SAAS,KAAK,UAAU,OAAO,MAAM,EAAE,CAAC;;GAE1D,6BAAa,IAAI,MAAM,yBAAyB;GACjD,CAAC,CAAC,KAAKA,cAAO,eAAeA,cAAO,KAAK,CAAC;GAC3C;CAEJ,MAAM,SAAmC,SACvCA,cAAO,IAAI,aAAa;AACtB,SAAOC,WAAI,OAAO,UAAU,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC;AACjE,SAAO,SAAS;GAChB;CAEJ,MAAM,WAAuC,QAC3CD,cAAO,IAAI,aAAa;AACtB,SAAOC,WAAI,OAAO,UAAU,MAAM;GAChC,MAAM,OAAO,IAAI,IAAI,EAAE;AACvB,QAAK,OAAO,IAAI;AAChB,UAAO;IACP;AACF,SAAO,SAAS;GAChB;CAEJ,MAAM,gBACJD,cAAO,IAAI,aAAa;AACtB,MAAI,yBAAY,QAAQ,CAAE;EAE1B,MAAM,UAAU,OAAOA,cAAO,WAAW;GACvC,0CAAoB,SAAS,OAAO;GACpC,6BAAa,IAAI,MAAM,0BAA0B;GAClD,CAAC,CAAC,KAAKA,cAAO,eAAeA,cAAO,QAAQ,GAAG,CAAC,CAAC;AAElD,MAAI,CAAC,QAAS;EAEd,IAAI;AACJ,MAAI;AACF,WAAQ,KAAK,MAAM,QAAQ;UACrB;AACN;;EAGF,MAAM,QAAQ,MAAM,QAAQ,MAAM,eAAe,EAAE,IAAI,CAAC;AACxD,SAAOC,WAAI,IAAI,SAAS,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;GAC9D;AAEJ,QAAO,SAAS;CAEhB,MAAM,WAAuC,QAAQ,UACnDD,cAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAO,QAAQ;EAC7B,MAAM,SAAmB,EAAE;EAC3B,MAAM,SAAmB,EAAE;AAE3B,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,CAAC,eAAe,KAAK,IAAI,EAAE;AAC7B,WAAO,QAAQ,KAAK,IAAI;AACxB;;GAGF,MAAM,SAAS,QAAQ,YAAY;AACnC,OAAI,YAAY,KAAK,KAAK,OAAO,EAAE;AACjC,WAAO,KAAK,KAAK,IAAI;AACrB,WAAO,QAAQ,KAAK,IAAI;SAExB,QAAO,KAAK,KAAK,IAAI;;AAIzB,MAAI,CAAC,SAAS,OAAO,SAAS,GAAG;AAC/B,UAAOA,cAAO,MAAM,aAAa;AACjC,QAAK,MAAM,OAAO,CAAC,GAAG,OAAO,CAC3B,KAAI,YAAY,KAAK,UAAU,EAAE;IAC/B,MAAM,MAAM,OAAO,QAAQ,IAAI;AAC/B,QAAI,QAAQ,IAAI;AACd,YAAO,OAAO,KAAK,EAAE;AACrB,YAAO,KAAK,IAAI;;AAElB,WAAO,QAAQ,IAAI;;;AAKzB,SAAO,SAAS;AAChB,SAAO;GAAE;GAAQ;GAAQ;GACzB;AAEJ,QAAO;EAAE;EAAS;EAAO;EAAS;EAAQ;EAAS;EAAS;EAAS;EACrE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Effect, Ref } from "effect";
|
|
2
|
+
|
|
3
|
+
//#region src/process-registry.d.ts
|
|
4
|
+
interface TrackedProcess {
|
|
5
|
+
pid: number;
|
|
6
|
+
name: string;
|
|
7
|
+
port: number;
|
|
8
|
+
startedAt: number;
|
|
9
|
+
command: string;
|
|
10
|
+
}
|
|
11
|
+
interface ProcessRegistry {
|
|
12
|
+
readonly tracked: Ref.Ref<Map<number, TrackedProcess>>;
|
|
13
|
+
track: (proc: TrackedProcess) => Effect.Effect<void>;
|
|
14
|
+
untrack: (pid: number) => Effect.Effect<void>;
|
|
15
|
+
getAll: () => Effect.Effect<TrackedProcess[]>;
|
|
16
|
+
killAll: (force?: boolean) => Effect.Effect<{
|
|
17
|
+
killed: number[];
|
|
18
|
+
failed: number[];
|
|
19
|
+
}>;
|
|
20
|
+
persist: () => Effect.Effect<void>;
|
|
21
|
+
restore: () => Effect.Effect<void>;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { ProcessRegistry };
|
|
25
|
+
//# sourceMappingURL=process-registry.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.d.cts","names":[],"sources":["../src/process-registry.ts"],"mappings":";;;UAMiB,cAAA;EACf,GAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA;EACA,OAAA;AAAA;AAAA,UAGe,eAAA;EAAA,SACN,OAAA,EAAS,GAAA,CAAI,GAAA,CAAI,GAAA,SAAY,cAAA;EACtC,KAAA,GAAQ,IAAA,EAAM,cAAA,KAAmB,MAAA,CAAO,MAAA;EACxC,OAAA,GAAU,GAAA,aAAgB,MAAA,CAAO,MAAA;EACjC,MAAA,QAAc,MAAA,CAAO,MAAA,CAAO,cAAA;EAC5B,OAAA,GAAU,KAAA,eAAoB,MAAA,CAAO,MAAA;IAAS,MAAA;IAAkB,MAAA;EAAA;EAChE,OAAA,QAAe,MAAA,CAAO,MAAA;EACtB,OAAA,QAAe,MAAA,CAAO,MAAA;AAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Effect, Ref } from "effect";
|
|
2
|
+
|
|
3
|
+
//#region src/process-registry.d.ts
|
|
4
|
+
interface TrackedProcess {
|
|
5
|
+
pid: number;
|
|
6
|
+
name: string;
|
|
7
|
+
port: number;
|
|
8
|
+
startedAt: number;
|
|
9
|
+
command: string;
|
|
10
|
+
}
|
|
11
|
+
interface ProcessRegistry {
|
|
12
|
+
readonly tracked: Ref.Ref<Map<number, TrackedProcess>>;
|
|
13
|
+
track: (proc: TrackedProcess) => Effect.Effect<void>;
|
|
14
|
+
untrack: (pid: number) => Effect.Effect<void>;
|
|
15
|
+
getAll: () => Effect.Effect<TrackedProcess[]>;
|
|
16
|
+
killAll: (force?: boolean) => Effect.Effect<{
|
|
17
|
+
killed: number[];
|
|
18
|
+
failed: number[];
|
|
19
|
+
}>;
|
|
20
|
+
persist: () => Effect.Effect<void>;
|
|
21
|
+
restore: () => Effect.Effect<void>;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { ProcessRegistry };
|
|
25
|
+
//# sourceMappingURL=process-registry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.d.mts","names":[],"sources":["../src/process-registry.ts"],"mappings":";;;UAMiB,cAAA;EACf,GAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA;EACA,OAAA;AAAA;AAAA,UAGe,eAAA;EAAA,SACN,OAAA,EAAS,GAAA,CAAI,GAAA,CAAI,GAAA,SAAY,cAAA;EACtC,KAAA,GAAQ,IAAA,EAAM,cAAA,KAAmB,MAAA,CAAO,MAAA;EACxC,OAAA,GAAU,GAAA,aAAgB,MAAA,CAAO,MAAA;EACjC,MAAA,QAAc,MAAA,CAAO,MAAA,CAAO,cAAA;EAC5B,OAAA,GAAU,KAAA,eAAoB,MAAA,CAAO,MAAA;IAAS,MAAA;IAAkB,MAAA;EAAA;EAChE,OAAA,QAAe,MAAA,CAAO,MAAA;EACtB,OAAA,QAAe,MAAA,CAAO,MAAA;AAAA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { getBosDir } from "./dev-logs.mjs";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { Effect, Ref } from "effect";
|
|
5
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
6
|
+
|
|
7
|
+
//#region src/process-registry.ts
|
|
8
|
+
function getPidFilePath(configDir) {
|
|
9
|
+
return join(getBosDir(configDir), "pids.json");
|
|
10
|
+
}
|
|
11
|
+
const isProcessAlive = (pid) => {
|
|
12
|
+
try {
|
|
13
|
+
process.kill(pid, 0);
|
|
14
|
+
return true;
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const killProcess = (pid, signal) => {
|
|
20
|
+
try {
|
|
21
|
+
try {
|
|
22
|
+
process.kill(-pid, signal);
|
|
23
|
+
} catch {}
|
|
24
|
+
process.kill(pid, signal);
|
|
25
|
+
return true;
|
|
26
|
+
} catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const makeProcessRegistry = (configDir) => Effect.gen(function* () {
|
|
31
|
+
const tracked = yield* Ref.make(/* @__PURE__ */ new Map());
|
|
32
|
+
const pidFile = getPidFilePath(configDir);
|
|
33
|
+
const getAll = () => Ref.get(tracked).pipe(Effect.map((m) => Array.from(m.values())));
|
|
34
|
+
const persist = () => Effect.gen(function* () {
|
|
35
|
+
const procs = yield* getAll();
|
|
36
|
+
const dir = dirname(pidFile);
|
|
37
|
+
yield* Effect.tryPromise({
|
|
38
|
+
try: async () => {
|
|
39
|
+
if (!existsSync(dir)) await mkdir(dir, { recursive: true });
|
|
40
|
+
await writeFile(pidFile, JSON.stringify(procs, null, 2));
|
|
41
|
+
},
|
|
42
|
+
catch: () => /* @__PURE__ */ new Error("Failed to persist PIDs")
|
|
43
|
+
}).pipe(Effect.catchAll(() => Effect.void));
|
|
44
|
+
});
|
|
45
|
+
const track = (proc) => Effect.gen(function* () {
|
|
46
|
+
yield* Ref.update(tracked, (m) => new Map(m).set(proc.pid, proc));
|
|
47
|
+
yield* persist();
|
|
48
|
+
});
|
|
49
|
+
const untrack = (pid) => Effect.gen(function* () {
|
|
50
|
+
yield* Ref.update(tracked, (m) => {
|
|
51
|
+
const copy = new Map(m);
|
|
52
|
+
copy.delete(pid);
|
|
53
|
+
return copy;
|
|
54
|
+
});
|
|
55
|
+
yield* persist();
|
|
56
|
+
});
|
|
57
|
+
const restore = () => Effect.gen(function* () {
|
|
58
|
+
if (!existsSync(pidFile)) return;
|
|
59
|
+
const content = yield* Effect.tryPromise({
|
|
60
|
+
try: () => readFile(pidFile, "utf8"),
|
|
61
|
+
catch: () => /* @__PURE__ */ new Error("Failed to read PID file")
|
|
62
|
+
}).pipe(Effect.catchAll(() => Effect.succeed("")));
|
|
63
|
+
if (!content) return;
|
|
64
|
+
let procs;
|
|
65
|
+
try {
|
|
66
|
+
procs = JSON.parse(content);
|
|
67
|
+
} catch {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const alive = procs.filter((p) => isProcessAlive(p.pid));
|
|
71
|
+
yield* Ref.set(tracked, new Map(alive.map((p) => [p.pid, p])));
|
|
72
|
+
});
|
|
73
|
+
yield* restore();
|
|
74
|
+
const killAll = (force = false) => Effect.gen(function* () {
|
|
75
|
+
const procs = yield* getAll();
|
|
76
|
+
const killed = [];
|
|
77
|
+
const failed = [];
|
|
78
|
+
for (const proc of procs) {
|
|
79
|
+
if (!isProcessAlive(proc.pid)) {
|
|
80
|
+
yield* untrack(proc.pid);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const signal = force ? "SIGKILL" : "SIGTERM";
|
|
84
|
+
if (killProcess(proc.pid, signal)) {
|
|
85
|
+
killed.push(proc.pid);
|
|
86
|
+
yield* untrack(proc.pid);
|
|
87
|
+
} else failed.push(proc.pid);
|
|
88
|
+
}
|
|
89
|
+
if (!force && failed.length > 0) {
|
|
90
|
+
yield* Effect.sleep("500 millis");
|
|
91
|
+
for (const pid of [...failed]) if (killProcess(pid, "SIGKILL")) {
|
|
92
|
+
const idx = failed.indexOf(pid);
|
|
93
|
+
if (idx !== -1) {
|
|
94
|
+
failed.splice(idx, 1);
|
|
95
|
+
killed.push(pid);
|
|
96
|
+
}
|
|
97
|
+
yield* untrack(pid);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
yield* persist();
|
|
101
|
+
return {
|
|
102
|
+
killed,
|
|
103
|
+
failed
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
tracked,
|
|
108
|
+
track,
|
|
109
|
+
untrack,
|
|
110
|
+
getAll,
|
|
111
|
+
killAll,
|
|
112
|
+
persist,
|
|
113
|
+
restore
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
//#endregion
|
|
118
|
+
export { makeProcessRegistry };
|
|
119
|
+
//# sourceMappingURL=process-registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.mjs","names":[],"sources":["../src/process-registry.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { Effect, Ref } from \"effect\";\nimport { getBosDir } from \"./dev-logs\";\n\nexport interface TrackedProcess {\n pid: number;\n name: string;\n port: number;\n startedAt: number;\n command: string;\n}\n\nexport interface ProcessRegistry {\n readonly tracked: Ref.Ref<Map<number, TrackedProcess>>;\n track: (proc: TrackedProcess) => Effect.Effect<void>;\n untrack: (pid: number) => Effect.Effect<void>;\n getAll: () => Effect.Effect<TrackedProcess[]>;\n killAll: (force?: boolean) => Effect.Effect<{ killed: number[]; failed: number[] }>;\n persist: () => Effect.Effect<void>;\n restore: () => Effect.Effect<void>;\n}\n\nexport function getPidFilePath(configDir: string): string {\n return join(getBosDir(configDir), \"pids.json\");\n}\n\nconst isProcessAlive = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\nconst killProcess = (pid: number, signal: NodeJS.Signals): boolean => {\n try {\n // Try process group first (covers spawned child trees)\n try {\n process.kill(-pid, signal);\n } catch {}\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const makeProcessRegistry = (configDir: string) =>\n Effect.gen(function* () {\n const tracked = yield* Ref.make(new Map<number, TrackedProcess>());\n const pidFile = getPidFilePath(configDir);\n\n const getAll: ProcessRegistry[\"getAll\"] = () =>\n Ref.get(tracked).pipe(Effect.map((m) => Array.from(m.values())));\n\n const persist: ProcessRegistry[\"persist\"] = () =>\n Effect.gen(function* () {\n const procs = yield* getAll();\n const dir = dirname(pidFile);\n yield* Effect.tryPromise({\n try: async () => {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(pidFile, JSON.stringify(procs, null, 2));\n },\n catch: () => new Error(\"Failed to persist PIDs\"),\n }).pipe(Effect.catchAll(() => Effect.void));\n });\n\n const track: ProcessRegistry[\"track\"] = (proc) =>\n Effect.gen(function* () {\n yield* Ref.update(tracked, (m) => new Map(m).set(proc.pid, proc));\n yield* persist();\n });\n\n const untrack: ProcessRegistry[\"untrack\"] = (pid) =>\n Effect.gen(function* () {\n yield* Ref.update(tracked, (m) => {\n const copy = new Map(m);\n copy.delete(pid);\n return copy;\n });\n yield* persist();\n });\n\n const restore: ProcessRegistry[\"restore\"] = () =>\n Effect.gen(function* () {\n if (!existsSync(pidFile)) return;\n\n const content = yield* Effect.tryPromise({\n try: () => readFile(pidFile, \"utf8\"),\n catch: () => new Error(\"Failed to read PID file\"),\n }).pipe(Effect.catchAll(() => Effect.succeed(\"\")));\n\n if (!content) return;\n\n let procs: TrackedProcess[];\n try {\n procs = JSON.parse(content) as TrackedProcess[];\n } catch {\n return;\n }\n\n const alive = procs.filter((p) => isProcessAlive(p.pid));\n yield* Ref.set(tracked, new Map(alive.map((p) => [p.pid, p])));\n });\n\n yield* restore();\n\n const killAll: ProcessRegistry[\"killAll\"] = (force = false) =>\n Effect.gen(function* () {\n const procs = yield* getAll();\n const killed: number[] = [];\n const failed: number[] = [];\n\n for (const proc of procs) {\n if (!isProcessAlive(proc.pid)) {\n yield* untrack(proc.pid);\n continue;\n }\n\n const signal = force ? \"SIGKILL\" : \"SIGTERM\";\n if (killProcess(proc.pid, signal)) {\n killed.push(proc.pid);\n yield* untrack(proc.pid);\n } else {\n failed.push(proc.pid);\n }\n }\n\n if (!force && failed.length > 0) {\n yield* Effect.sleep(\"500 millis\");\n for (const pid of [...failed]) {\n if (killProcess(pid, \"SIGKILL\")) {\n const idx = failed.indexOf(pid);\n if (idx !== -1) {\n failed.splice(idx, 1);\n killed.push(pid);\n }\n yield* untrack(pid);\n }\n }\n }\n\n yield* persist();\n return { killed, failed };\n });\n\n return { tracked, track, untrack, getAll, killAll, persist, restore };\n });\n"],"mappings":"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"}
|
package/dist/sdk.cjs
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
let every_plugin = require("every-plugin");
|
|
4
|
+
let every_plugin_effect = require("every-plugin/effect");
|
|
5
|
+
let every_plugin_orpc = require("every-plugin/orpc");
|
|
6
|
+
let every_plugin_zod = require("every-plugin/zod");
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, 'Context', {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () {
|
|
11
|
+
return every_plugin_effect.Context;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(exports, 'Effect', {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () {
|
|
17
|
+
return every_plugin_effect.Effect;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, 'Layer', {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () {
|
|
23
|
+
return every_plugin_effect.Layer;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(exports, 'PluginRuntime', {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () {
|
|
29
|
+
return every_plugin.PluginRuntime;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports, 'Scope', {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return every_plugin_effect.Scope;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(exports, 'createPlugin', {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function () {
|
|
41
|
+
return every_plugin.createPlugin;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
Object.defineProperty(exports, 'createPluginRuntime', {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
get: function () {
|
|
47
|
+
return every_plugin.createPluginRuntime;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(exports, 'oc', {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function () {
|
|
53
|
+
return every_plugin_orpc.oc;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
Object.defineProperty(exports, 'z', {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
get: function () {
|
|
59
|
+
return every_plugin_zod.z;
|
|
60
|
+
}
|
|
61
|
+
});
|
package/dist/sdk.d.cts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
2
|
+
import { Context, Effect, Layer, Scope } from "every-plugin/effect";
|
|
3
|
+
import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
|
|
4
|
+
import { z } from "every-plugin/zod";
|
|
5
|
+
export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|
package/dist/sdk.d.mts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
2
|
+
import { Context, Effect, Layer, Scope } from "every-plugin/effect";
|
|
3
|
+
import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
|
|
4
|
+
import { z } from "every-plugin/zod";
|
|
5
|
+
export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|
package/dist/sdk.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
2
|
+
import { Context, Effect, Layer, Scope } from "every-plugin/effect";
|
|
3
|
+
import { oc } from "every-plugin/orpc";
|
|
4
|
+
import { z } from "every-plugin/zod";
|
|
5
|
+
|
|
6
|
+
export { Context, Effect, Layer, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|