@kizenapps/cli 0.8.0 → 0.10.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.
- package/dist/index.js +388 -90
- package/dist/index.js.map +1 -1
- package/dist/viewer/assets/AppDetailPage-ObugMPkn.js +1 -0
- package/dist/viewer/assets/BootstrapContext-CEWgv2oI.js +1 -0
- package/dist/viewer/assets/Card-BSwG5koM.js +1 -0
- package/dist/viewer/assets/ConfigurationPage-SnFNzZgJ.js +1 -0
- package/dist/viewer/assets/CredentialsContext-BLZX6RwF.js +1 -0
- package/dist/viewer/assets/DevSidebar-BiROAoKF.js +1 -0
- package/dist/viewer/assets/SandboxPage-BFVVe-i3.js +1 -0
- package/dist/viewer/assets/SidebarContext-Byo6PYOF.js +1 -0
- package/dist/viewer/assets/VersionsPage-DOd2Hv8M.js +1 -0
- package/dist/viewer/assets/configStorage-Bb-A9Nvj.js +14 -0
- package/dist/viewer/assets/{fa-core-BU3ZZt7W.js → fa-core-mHW_3JUd.js} +1 -1
- package/dist/viewer/assets/index-B-4D4w_w.js +5 -0
- package/dist/viewer/assets/index-D6Un_G7k.css +2 -0
- package/dist/viewer/assets/{react-C90crogl.js → react-D_K8ni3_.js} +1 -1
- package/dist/viewer/assets/validIcons-TcFXfn-E.js +1 -0
- package/dist/viewer/index.html +8 -5
- package/package.json +8 -4
- package/dist/chromium-extension/manifest.json +0 -17
- package/dist/chromium-extension/rules.json +0 -17
- package/dist/chunk-4OYGMEFM.js +0 -3675
- package/dist/chunk-4OYGMEFM.js.map +0 -1
- package/dist/chunk-4Z6S6LWP.js +0 -6134
- package/dist/chunk-4Z6S6LWP.js.map +0 -1
- package/dist/chunk-5WPGAZLP.js +0 -6136
- package/dist/chunk-5WPGAZLP.js.map +0 -1
- package/dist/chunk-6XGFZ4W5.js +0 -3673
- package/dist/chunk-6XGFZ4W5.js.map +0 -1
- package/dist/chunk-HJPLDI45.js +0 -6134
- package/dist/chunk-HJPLDI45.js.map +0 -1
- package/dist/chunk-KMKDY2I6.js +0 -46
- package/dist/chunk-KMKDY2I6.js.map +0 -1
- package/dist/chunk-LSHHXCC6.js +0 -3639
- package/dist/chunk-LSHHXCC6.js.map +0 -1
- package/dist/chunk-NNDSADQG.js +0 -3641
- package/dist/chunk-NNDSADQG.js.map +0 -1
- package/dist/chunk-SEGVTWSK.js +0 -44
- package/dist/chunk-SEGVTWSK.js.map +0 -1
- package/dist/chunk-ZWE3DS7E.js +0 -39
- package/dist/chunk-ZWE3DS7E.js.map +0 -1
- package/dist/devtools-HNR7DD7Q.js +0 -68
- package/dist/devtools-HNR7DD7Q.js.map +0 -1
- package/dist/devtools-HW3UQAHH.js +0 -69
- package/dist/devtools-HW3UQAHH.js.map +0 -1
- package/dist/devtools-KXIXZGBY.js +0 -64
- package/dist/devtools-KXIXZGBY.js.map +0 -1
- package/dist/devtools-PDXM3L35.js +0 -67
- package/dist/devtools-PDXM3L35.js.map +0 -1
- package/dist/devtools-SDEASRYI.js +0 -66
- package/dist/devtools-SDEASRYI.js.map +0 -1
- package/dist/devtools-XBEEGBQ4.js +0 -66
- package/dist/devtools-XBEEGBQ4.js.map +0 -1
- package/dist/dist-4P5P64FK.js +0 -8474
- package/dist/dist-4P5P64FK.js.map +0 -1
- package/dist/dist-AVHDSU4X.js +0 -137
- package/dist/dist-AVHDSU4X.js.map +0 -1
- package/dist/dist-C3F6UOWF.js +0 -8472
- package/dist/dist-C3F6UOWF.js.map +0 -1
- package/dist/dist-NUJOSN7W.js +0 -8472
- package/dist/dist-NUJOSN7W.js.map +0 -1
- package/dist/dist-QHDMIBVE.js +0 -135
- package/dist/dist-QHDMIBVE.js.map +0 -1
- package/dist/dist-ZIZQOSY3.js +0 -135
- package/dist/dist-ZIZQOSY3.js.map +0 -1
- package/dist/electron/icon.png +0 -0
- package/dist/electron/main.js +0 -201
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/preload.cjs +0 -9
- package/dist/gzip-size-K37OQCQ2.js +0 -137
- package/dist/gzip-size-K37OQCQ2.js.map +0 -1
- package/dist/gzip-size-QRGIYYEQ.js +0 -137
- package/dist/gzip-size-QRGIYYEQ.js.map +0 -1
- package/dist/gzip-size-SHZBT5GU.js +0 -139
- package/dist/gzip-size-SHZBT5GU.js.map +0 -1
- package/dist/viewer/assets/index-B09qenTV.js +0 -17
- package/dist/viewer/assets/index-CVd4BLit.js +0 -17
- package/dist/viewer/assets/index-C_gRcfsL.js +0 -17
- package/dist/viewer/assets/index-CcvbGL5I.js +0 -17
- package/dist/viewer/assets/index-Ci5up9QD.js +0 -17
- package/dist/viewer/assets/index-DOiSISo1.css +0 -2
- package/dist/viewer/assets/index-DSJAwx9Y.js +0 -17
- package/dist/viewer/assets/index-DUgUEouL.css +0 -2
- package/dist/viewer/assets/index-WnCF0zx3.js +0 -17
- package/dist/viewer/assets/index-_K33TupM.js +0 -17
- package/dist/viewer/assets/index-dPV4go8k.js +0 -17
- package/dist/viewer/assets/index-xFuxlPJA.js +0 -17
- /package/dist/viewer/assets/{fa-pro-icons-D4afj0tU.js → fa-pro-icons-CIQGXozY.js} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/ui/BuildUI.tsx","../src/lib/runBuild.ts","../src/lib/readFiles.ts","../src/ui/Logo.tsx","../src/lib/gitignore.ts","../src/commands/dev.ts","../src/ui/DevUI.tsx","../src/lib/proxyCache.ts","../src/lib/credentials.ts","../src/lib/config.ts","../src/ui/CredentialSetupUI.tsx"],"sourcesContent":["import { program } from 'commander';\nimport { buildCommand } from './commands/build.js';\nimport { devCommand } from './commands/dev.js';\n\nprogram.name('appbuilder').description('Kizen plugin app builder').version('0.1.0');\n\nbuildCommand(program);\ndevCommand(program);\n\nprogram.parse();\n","import { createElement } from 'react';\nimport { render } from 'ink';\nimport type { Command } from 'commander';\nimport { BuildUI } from '../ui/BuildUI.js';\nimport { ensureGitignore } from '../lib/gitignore.js';\n\nexport function buildCommand(program: Command): void {\n program\n .command('build')\n .description('Bundle the plugin app into .kizenapp directory')\n .action(async () => {\n const pluginDir = process.cwd();\n const outputDir = `${pluginDir}/.kizenapp`;\n ensureGitignore(pluginDir);\n const { waitUntilExit } = render(createElement(BuildUI, { outputDir, pluginDir }));\n await waitUntilExit();\n });\n}\n","import type { FC } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport { runBuild } from '../lib/runBuild.js';\nimport type { BuildStepName } from '../lib/runBuild.js';\nimport { Logo } from './Logo.js';\n\ntype BuildStep = BuildStepName | 'done' | 'error';\n\ninterface BuildUIProps {\n outputDir: string;\n pluginDir: string;\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst Spinner: FC = () => {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const id = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n\n return () => {\n clearInterval(id);\n };\n }, []);\n\n return <Text color=\"cyan\">{SPINNER_FRAMES[frame] ?? '⠋'}</Text>;\n};\n\nconst STEPS: BuildStepName[] = [\n 'creating-dir',\n 'reading-files',\n 'minifying',\n 'packaging',\n 'writing-bundle',\n];\n\nconst STEP_LABELS: Record<BuildStepName, string> = {\n 'creating-dir': 'Creating .kizenapp directory',\n 'reading-files': 'Reading plugin files',\n minifying: 'Minifying scripts',\n packaging: 'Packaging plugin',\n 'writing-bundle': 'Writing bundle.json',\n};\n\nexport const BuildUI: FC<BuildUIProps> = ({ outputDir, pluginDir }) => {\n const app = useApp();\n const [step, setStep] = useState<BuildStep>('creating-dir');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n useEffect(() => {\n void runBuild(pluginDir, outputDir, setStep)\n .then(() => {\n setStep('done');\n app.exit();\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n setErrorMessage(message);\n setStep('error');\n app.exit();\n });\n }, [outputDir, pluginDir, app]);\n\n const currentIndex = STEPS.indexOf(step as BuildStepName);\n const isError = step === 'error';\n const isDone = step === 'done';\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2}>\n <Logo />\n\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n {STEPS.map((s, i) => {\n const isActive = step === s;\n const isStepDone = isDone || currentIndex > i;\n const isFailed = isError && i === currentIndex;\n\n return (\n <Box key={s} gap={1}>\n {isFailed ? (\n <Text color=\"red\">✗ {STEP_LABELS[s]}</Text>\n ) : isStepDone ? (\n <Text color=\"green\">✓ {STEP_LABELS[s]}</Text>\n ) : isActive ? (\n <>\n <Spinner />\n <Text>{STEP_LABELS[s]}</Text>\n </>\n ) : (\n <Text dimColor> {STEP_LABELS[s]}</Text>\n )}\n </Box>\n );\n })}\n\n {errorMessage !== null && (\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"red\" paddingX={1}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { minifyFiles, packagePlugin, transformDeployablePlugin } from '@kizenapps/packager';\nimport type { DeployablePlugin } from '@kizenapps/packager';\nimport { readLocalFiles } from './readFiles.js';\n\nexport type BuildStepName =\n | 'creating-dir'\n | 'reading-files'\n | 'minifying'\n | 'packaging'\n | 'writing-bundle';\n\ninterface ReleaseNote {\n version: string;\n notes: string;\n}\n\ntype SerializableDeployablePlugin = Omit<DeployablePlugin, 'thumbnail' | 'kznFile'> & {\n thumbnail: string | null;\n kznFile: string | null;\n allReleaseNotes: ReleaseNote[];\n};\n\nconst serializePlugin = (\n plugin: DeployablePlugin,\n allReleaseNotes: ReleaseNote[],\n): SerializableDeployablePlugin => ({\n ...plugin,\n thumbnail: plugin.thumbnail ? Buffer.from(plugin.thumbnail).toString('base64') : null,\n kznFile: plugin.kznFile ? Buffer.from(plugin.kznFile).toString('base64') : null,\n allReleaseNotes,\n});\n\nexport async function runBuild(\n pluginDir: string,\n outputDir: string,\n onStep?: (step: BuildStepName) => void,\n): Promise<void> {\n await mkdir(outputDir, { recursive: true });\n\n onStep?.('reading-files');\n const files = await readLocalFiles(pluginDir);\n\n onStep?.('minifying');\n const minified = await minifyFiles(files);\n\n onStep?.('packaging');\n const manifestFile = minified.find((f) => f.path === 'kizen.json');\n if (!manifestFile) {\n throw new Error('kizen.json not found in plugin directory.');\n }\n const manifests = JSON.parse(manifestFile.content) as Parameters<typeof packagePlugin>[1];\n const packaged = packagePlugin(minified, manifests);\n const deployable = Object.values(packaged).map(transformDeployablePlugin);\n\n onStep?.('writing-bundle');\n const bundle = deployable.map((plugin) => {\n const notesDir = plugin.release_notes_directory?.replace(/\\/$/, '');\n const allReleaseNotes: ReleaseNote[] = notesDir\n ? files\n .filter((f) => f.path.startsWith(notesDir + '/') && f.path.endsWith('.md') && f.content)\n .map((f) => ({\n version: f.path.slice(f.path.lastIndexOf('/') + 1, -3),\n notes: f.content,\n }))\n .sort((a, b) => b.version.localeCompare(a.version, undefined, { numeric: true }))\n : [];\n return serializePlugin(plugin, allReleaseNotes);\n });\n await writeFile(join(outputDir, 'bundle.json'), JSON.stringify(bundle, null, 2), 'utf-8');\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport type { FileContent } from '@kizenapps/packager';\n\nconst IMAGE_EXTENSIONS = new Set(['.png', '.svg']);\nconst BINARY_EXTENSIONS = new Set(['.kzn']);\n\nconst SKIP_DIRS = new Set(['node_modules', '.git', '.kizenapp', '.github']);\n\nasync function walk(dir: string, rootDir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const paths: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n paths.push(...(await walk(join(dir, entry.name), rootDir)));\n } else if (entry.isFile()) {\n paths.push(join(dir, entry.name));\n }\n }\n\n return paths;\n}\n\nexport async function readLocalFiles(rootDir: string): Promise<FileContent[]> {\n const absolutePaths = await walk(rootDir, rootDir);\n\n return Promise.all(\n absolutePaths.map(async (absPath): Promise<FileContent> => {\n const relPath = relative(rootDir, absPath).split('\\\\').join('/');\n const dotIndex = relPath.lastIndexOf('.');\n const ext = dotIndex >= 0 ? relPath.slice(dotIndex).toLowerCase() : '';\n\n if (IMAGE_EXTENSIONS.has(ext)) {\n const buf = await readFile(absPath);\n return { path: relPath, content: '', base64Image: buf.toString('base64') };\n }\n\n if (BINARY_EXTENSIONS.has(ext)) {\n const buf = await readFile(absPath);\n return { path: relPath, content: '', binaryData: buf };\n }\n\n const content = await readFile(absPath, 'utf-8');\n return { path: relPath, content };\n }),\n );\n}\n","import type { FC } from 'react';\nimport { Box, Text } from 'ink';\n\nconst LOGO_LINES = [\n ' @@@ ',\n ' @@@@@ @@@@@@@ ',\n ' @@@@ @@@@@@@@@@ ',\n ' @@@@ @@@@@ ',\n ' @@@ @@@@ @@@@@ @@@@@@@ ',\n ' @@@@ @@@@ @@@@ @@@@@@@@@@@@@',\n ' @@@@ @@@@ @@@@@',\n ' @@@@ @@@ @@@@ @@@',\n ' @@@@ @@@@@@ ',\n ' @@@@@@ @@@@ ',\n ' @@@ @@@@@ @@@ @@@@ ',\n ' @@@@@ @@@@ @@@@ ',\n ' @@@@@@@@@@@@@ @@@ @@@ @@@ ',\n ' @@@@@@@@ @@@@ @@@ @@@@ ',\n ' @@@@@ @@@@ ',\n ' @@@@@@@@@@@ @@@@ ',\n ' @@@@@@@ @@@@@ ',\n ' @@@@ ',\n];\n\nexport const Logo: FC = () => (\n <Box flexDirection=\"column\">\n {LOGO_LINES.map((line, i) => (\n <Text key={i} color=\"cyan\">\n {line}\n </Text>\n ))}\n </Box>\n);\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function ensureGitignore(projectDir: string): void {\n const gitignorePath = path.join(projectDir, '.gitignore');\n const entry = '.kizenapp/';\n\n let contents = '';\n if (fs.existsSync(gitignorePath)) {\n contents = fs.readFileSync(gitignorePath, 'utf8');\n const lines = contents.split('\\n').map((l) => l.trim());\n if (lines.includes(entry) || lines.includes('.kizenapp')) {\n return;\n }\n }\n\n const addition = contents.endsWith('\\n') ? entry + '\\n' : '\\n' + entry + '\\n';\n fs.writeFileSync(gitignorePath, contents + addition);\n}\n","import { createElement } from 'react';\nimport { render } from 'ink';\nimport type { Command } from 'commander';\nimport { DevUI } from '../ui/DevUI.js';\nimport { CredentialSetupUI } from '../ui/CredentialSetupUI.js';\nimport type { CredentialMode, CredentialSetupResult } from '../ui/CredentialSetupUI.js';\nimport {\n loadCredentialProfile,\n loadCredentialsFromFile,\n loadGlobalCredentials,\n} from '../lib/credentials.js';\nimport type { Credentials } from '../lib/credentials.js';\nimport { loadConfig, saveConfig } from '../lib/config.js';\nimport { ensureGitignore } from '../lib/gitignore.js';\n\nasync function runSetupUI(initialMode?: CredentialMode): Promise<CredentialSetupResult> {\n return new Promise((resolve) => {\n let unmountFn: (() => void) | null = null;\n const handleComplete = (result: CredentialSetupResult): void => {\n unmountFn?.();\n resolve(result);\n };\n const { unmount } = render(\n createElement(CredentialSetupUI, {\n ...(initialMode !== undefined && { initialMode }),\n onComplete: handleComplete,\n }),\n { exitOnCtrlC: false },\n );\n unmountFn = unmount;\n });\n}\n\nexport function devCommand(program: Command): void {\n program\n .command('dev')\n .description('Start the plugin viewer dev server')\n .option('-p, --port <port>', 'port to listen on', '3121')\n .option('-c, --credentials <path>', 'path to a credentials JSON file')\n .action(async (options: { port: string; credentials?: string }) => {\n const port = parseInt(options.port, 10);\n const pluginDir = process.cwd();\n const outputDir = `${pluginDir}/.kizenapp`;\n ensureGitignore(pluginDir);\n\n let credentials: Credentials | null = null;\n let credentialMode: CredentialMode | undefined;\n let activeCredentialProfile: string | undefined;\n\n if (options.credentials) {\n credentials = await loadCredentialsFromFile(options.credentials);\n } else {\n const config = await loadConfig(outputDir);\n\n if (config.credentialMode === 'local') {\n credentialMode = 'local';\n } else if (config.credentialMode === 'global') {\n credentialMode = 'global';\n activeCredentialProfile = config.activeCredentialProfile;\n // Load silently — only show TUI if the file was deleted since last run\n if (activeCredentialProfile) {\n credentials = await loadCredentialProfile(activeCredentialProfile);\n if (!credentials) {\n // Named profile file missing, fall back to default\n credentials = await loadGlobalCredentials();\n activeCredentialProfile = undefined;\n }\n } else {\n credentials = await loadGlobalCredentials();\n }\n if (!credentials) {\n const result = await runSetupUI('global');\n credentials = result.credentials;\n activeCredentialProfile = result.profileName;\n }\n } else {\n // First run — show full mode selection TUI\n const result = await runSetupUI();\n credentials = result.credentials;\n credentialMode = result.mode;\n activeCredentialProfile = result.profileName;\n const profile = result.profileName;\n await saveConfig(outputDir, {\n credentialMode: result.mode,\n ...(profile !== undefined && { activeCredentialProfile: profile }),\n });\n }\n }\n\n const { waitUntilExit } = render(\n createElement(DevUI, {\n port,\n pluginDir,\n outputDir,\n credentials,\n ...(credentialMode !== undefined && { credentialMode }),\n ...(activeCredentialProfile !== undefined && { activeCredentialProfile }),\n }),\n { exitOnCtrlC: false },\n );\n await waitUntilExit();\n });\n}\n","import type { FC } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { spawn } from 'node:child_process';\nimport { createReadStream, watch } from 'node:fs';\nimport type { FSWatcher } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport { createServer } from 'node:http';\nimport type { IncomingMessage, Server, ServerResponse } from 'node:http';\nimport { createRequire } from 'node:module';\nimport { dirname, extname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { type WebSocket, WebSocketServer } from 'ws';\nimport { createProxyCache } from '../lib/proxyCache.js';\nimport { runBuild } from '../lib/runBuild.js';\nimport type { Credentials } from '../lib/credentials.js';\nimport {\n listCredentialProfiles,\n loadCredentialProfile,\n loadGlobalCredentials,\n} from '../lib/credentials.js';\nimport { saveConfig } from '../lib/config.js';\nimport { CredentialSetupUI } from './CredentialSetupUI.js';\nimport type { CredentialMode, CredentialSetupResult } from './CredentialSetupUI.js';\nimport { Logo } from './Logo.js';\n\ntype ServerStatus = 'starting' | 'running' | 'error';\ntype BuildStatus = 'pending' | 'building' | 'done' | 'error';\n\nexport type ProxyLogEntry =\n | { kind: 'request'; method: string; status: number; fromCache: boolean; url: string }\n | { kind: 'info'; message: string };\n\nfunction proxyLogEntryToString(entry: ProxyLogEntry): string {\n if (entry.kind === 'info') {\n return entry.message;\n }\n const cache = entry.fromCache ? ' [cache]' : '';\n return `${entry.method} ${entry.url} → ${String(entry.status)}${cache}`;\n}\n\nconst SKIP_WATCH_PREFIXES = ['.kizenapp', '.git'];\nconst LOG_LIMIT = 50;\nconst LOG_DISPLAY = 8;\n\ninterface DevUIProps {\n port: number;\n pluginDir: string;\n outputDir: string;\n credentials: Credentials | null;\n credentialMode?: CredentialMode;\n activeCredentialProfile?: string;\n}\n\nconst MIME_TYPES: Readonly<Record<string, string>> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.json': 'application/json; charset=utf-8',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.map': 'application/json',\n};\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst Spinner: FC = () => {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const id = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n\n return () => {\n clearInterval(id);\n };\n }, []);\n\n return <Text color=\"cyan\">{SPINNER_FRAMES[frame] ?? '⠋'}</Text>;\n};\n\nfunction getViewerPath(): string {\n const filename = fileURLToPath(import.meta.url);\n return join(dirname(filename), 'viewer');\n}\n\nfunction getElectronMainPath(): string {\n const filename = fileURLToPath(import.meta.url);\n return join(dirname(filename), 'electron', 'main.js');\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction createRequestHandler(\n viewerPath: string,\n createServerLog: (message: string) => void,\n createProxyLog: (entry: ProxyLogEntry) => void,\n credentialsRef: { current: Credentials | null },\n activeProfileRef: { current: string | undefined },\n outputDir: string,\n broadcast: (msg: object) => void,\n): (req: IncomingMessage, res: ServerResponse) => void {\n const proxyCache = createProxyCache();\n\n return (req, res) => {\n void (async () => {\n const url = req.url ?? '/';\n\n try {\n createServerLog(`Received request: ${url}`);\n\n if (url === '/api/credentials') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(credentialsRef.current !== null ? JSON.stringify(credentialsRef.current) : '{}');\n return;\n }\n\n if (url === '/api/credential-profiles' && req.method === 'GET') {\n const profiles = await listCredentialProfiles();\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ profiles, active: activeProfileRef.current }));\n return;\n }\n\n if (url === '/api/credentials/switch' && req.method === 'POST') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = JSON.parse(Buffer.concat(chunks).toString('utf-8') || '{}') as {\n profile?: string;\n };\n const profileName = body.profile;\n const creds =\n profileName === undefined || profileName === ''\n ? await loadGlobalCredentials()\n : await loadCredentialProfile(profileName);\n if (creds !== null) {\n credentialsRef.current = creds;\n activeProfileRef.current = profileName || undefined;\n const active = activeProfileRef.current;\n await saveConfig(outputDir, {\n credentialMode: 'global',\n ...(active !== undefined && { activeCredentialProfile: active }),\n });\n broadcast({ type: 'credentials-updated', credentials: creds });\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ ok: creds !== null }));\n return;\n }\n\n if (url === '/api/bundle') {\n const bundlePath = join(process.cwd(), '.kizenapp', 'bundle.json');\n try {\n const content = await readFile(bundlePath, 'utf-8');\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(content);\n } catch {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{}');\n }\n return;\n }\n\n if (url === '/api/proxy-cache/clear') {\n proxyCache.clear();\n createProxyLog({ kind: 'info', message: 'Proxy cache cleared' });\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{\"ok\":true}');\n return;\n }\n\n if (url.startsWith('/api/proxy')) {\n const proxyTarget = req.headers['x-proxy-target'];\n if (typeof proxyTarget !== 'string') {\n res.writeHead(400);\n res.end('Missing x-proxy-target header');\n return;\n }\n\n const upstreamPath = url.slice('/api/proxy'.length) || '/';\n const upstreamUrl = `${proxyTarget}${upstreamPath}`;\n const method = req.method ?? 'GET';\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { host, 'x-proxy-target': _drop, ...forwardHeaders } = req.headers;\n\n if (method === 'GET') {\n const cacheKey = `GET::${upstreamUrl}`;\n const { response: cached, fromCache } = await proxyCache.get(cacheKey, () =>\n fetch(upstreamUrl, {\n method: 'GET',\n headers: forwardHeaders as Record<string, string>,\n }),\n );\n\n createProxyLog({\n kind: 'request',\n method: 'GET',\n status: cached.status,\n fromCache,\n url: upstreamPath,\n });\n res.writeHead(cached.status, cached.headers);\n res.end(cached.body);\n return;\n }\n\n const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;\n const resolvedBody = body && body.length > 0 ? body : undefined;\n const upstream = await fetch(upstreamUrl, {\n method,\n headers: forwardHeaders as Record<string, string>,\n ...(resolvedBody !== undefined && { body: resolvedBody }),\n });\n\n createProxyLog({\n kind: 'request',\n method,\n status: upstream.status,\n fromCache: false,\n url: upstreamPath,\n });\n\n // Node fetch auto-decompresses the body, so strip encoding/length headers\n // that describe the compressed wire format — they no longer apply.\n const responseHeaders = Object.fromEntries(upstream.headers);\n delete responseHeaders['content-encoding'];\n delete responseHeaders['content-length'];\n\n res.writeHead(upstream.status, responseHeaders);\n res.end(Buffer.from(await upstream.arrayBuffer()));\n return;\n }\n\n const rawPath = url === '/' ? '/index.html' : url;\n const filePath = join(viewerPath, rawPath);\n const resolvedPath = (await fileExists(filePath))\n ? filePath\n : join(viewerPath, 'index.html');\n const ext = extname(resolvedPath);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': mimeType });\n createReadStream(resolvedPath).pipe(res);\n } catch (err) {\n if (url.startsWith('/api/proxy')) {\n createProxyLog({\n kind: 'request',\n method: req.method ?? 'GET',\n status: 502,\n fromCache: false,\n url: url.slice('/api/proxy'.length) || '/',\n });\n } else {\n createProxyLog({\n kind: 'info',\n message: `Error handling ${url}: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n if (!res.headersSent) {\n res.writeHead(502);\n res.end('Bad Gateway');\n }\n }\n })();\n };\n}\n\nexport const DevUI: FC<DevUIProps> = ({\n port,\n pluginDir,\n outputDir,\n credentials: initialCredentials,\n credentialMode: initialCredentialMode,\n activeCredentialProfile: initialActiveProfile,\n}) => {\n const credentialsRef = useRef<Credentials | null>(initialCredentials);\n const activeProfileRef = useRef<string | undefined>(initialActiveProfile);\n const [credMode, setCredMode] = useState<'main' | 'editing'>('main');\n const [credentialMode, setCredentialMode] = useState<CredentialMode | undefined>(\n initialCredentialMode,\n );\n\n const [status, setStatus] = useState<ServerStatus>('starting');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [serverLogHistory, setServerLogHistory] = useState<string[]>([]);\n const [buildLogHistory, setBuildLogHistory] = useState<string[]>([]);\n const [proxyLogHistory, setProxyLogHistory] = useState<string[]>([]);\n const [buildStatus, setBuildStatus] = useState<BuildStatus>('pending');\n const [buildError, setBuildError] = useState<string | null>(null);\n const [lastBuilt, setLastBuilt] = useState<Date | null>(null);\n const [wsClientCount, setWsClientCount] = useState(0);\n\n const buildingRef = useRef(false);\n const electronLaunchedRef = useRef(false);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wsClientsRef = useRef<Set<WebSocket>>(new Set());\n const pendingMessagesRef = useRef<string[]>([]);\n\n useInput(\n (input, key) => {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n process.exit(0);\n }\n if (input === 'c') {\n setCredMode('editing');\n }\n if (input === 'd') {\n broadcast({ type: 'open-devtools' });\n }\n },\n { isActive: credMode === 'main' },\n );\n\n useEffect(() => {\n if (status !== 'running' || electronLaunchedRef.current) {\n return;\n }\n\n electronLaunchedRef.current = true;\n\n const _require = createRequire(import.meta.url);\n const electronBin = _require('electron') as string;\n const electronMain = getElectronMainPath();\n const userDataDir = join(outputDir, '.electron');\n\n const proc = spawn(\n electronBin,\n [electronMain, `--port=${String(port)}`, `--user-data-dir=${userDataDir}`],\n {\n stdio: 'ignore',\n },\n );\n proc.unref();\n process.on('exit', () => {\n proc.kill();\n });\n }, [status, port, outputDir]);\n\n const createServerLog = useCallback((message: string): void => {\n setServerLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${message}`].slice(-LOG_LIMIT),\n );\n }, []);\n\n const broadcast = useCallback((msg: object): void => {\n const json = JSON.stringify(msg);\n if (wsClientsRef.current.size === 0) {\n pendingMessagesRef.current = [...pendingMessagesRef.current, json].slice(-LOG_LIMIT);\n return;\n }\n for (const client of wsClientsRef.current) {\n if (client.readyState === 1) {\n client.send(json);\n }\n }\n }, []);\n\n const handleCredentialsDone = useCallback(\n (result: CredentialSetupResult): void => {\n credentialsRef.current = result.credentials;\n activeProfileRef.current = result.profileName;\n setCredMode('main');\n setCredentialMode(result.mode);\n const profile = result.profileName;\n void saveConfig(outputDir, {\n credentialMode: result.mode,\n ...(profile !== undefined && { activeCredentialProfile: profile }),\n });\n broadcast({ type: 'credentials-updated', credentials: result.credentials });\n },\n [outputDir, broadcast],\n );\n\n const createProxyLog = useCallback(\n (entry: ProxyLogEntry): void => {\n setProxyLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${proxyLogEntryToString(entry)}`].slice(\n -LOG_LIMIT,\n ),\n );\n broadcast({ type: 'proxy-log', entry });\n },\n [broadcast],\n );\n\n const createBuildLog = useCallback(\n (message: string): void => {\n setBuildLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${message}`].slice(-LOG_LIMIT),\n );\n broadcast({ type: 'log', message });\n },\n [broadcast],\n );\n\n const triggerBuild = useCallback(() => {\n if (buildingRef.current) {\n return;\n }\n\n buildingRef.current = true;\n\n setBuildStatus('building');\n setBuildError(null);\n createBuildLog('Build started');\n\n void runBuild(pluginDir, outputDir)\n .then(() => {\n createBuildLog('Build finished');\n setBuildStatus('done');\n setLastBuilt(new Date());\n\n createBuildLog('Notifying viewers to reload');\n for (const client of wsClientsRef.current) {\n if (client.readyState === 1) {\n client.send(JSON.stringify({ type: 'rebuild' }));\n }\n }\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n setBuildError(message);\n setBuildStatus('error');\n })\n .finally(() => {\n buildingRef.current = false;\n });\n }, [pluginDir, outputDir, createBuildLog]);\n\n useEffect(() => {\n triggerBuild();\n\n const watcher: FSWatcher = watch(pluginDir, { recursive: true }, (_, filename) => {\n if (!filename) {\n return;\n }\n\n const normalized = filename.replace(/\\\\/g, '/');\n\n if (SKIP_WATCH_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return;\n }\n\n createBuildLog(`File change detected: ${filename}`);\n\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(triggerBuild, 150);\n });\n\n return () => {\n watcher.close();\n\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, [pluginDir, triggerBuild, createBuildLog]);\n\n useEffect(() => {\n const viewerPath = getViewerPath();\n\n void fileExists(join(viewerPath, 'index.html')).then((viewerBuilt) => {\n if (!viewerBuilt) {\n setErrorMessage(\"Viewer not built. Run 'pnpm build:viewer' first.\");\n setStatus('error');\n return;\n }\n\n const handler = createRequestHandler(\n viewerPath,\n createServerLog,\n createProxyLog,\n credentialsRef,\n activeProfileRef,\n outputDir,\n broadcast,\n );\n const server: Server = createServer(handler);\n const wss = new WebSocketServer({ server });\n\n wss.on('connection', (ws: WebSocket) => {\n for (const json of pendingMessagesRef.current) {\n if (ws.readyState === 1) {\n ws.send(json);\n }\n }\n pendingMessagesRef.current = [];\n\n createServerLog('Viewer connected for live reload');\n wsClientsRef.current.add(ws);\n setWsClientCount(wsClientsRef.current.size);\n\n ws.on('close', () => {\n wsClientsRef.current.delete(ws);\n setWsClientCount(wsClientsRef.current.size);\n });\n });\n\n server.listen(port, () => {\n setStatus('running');\n createServerLog(`Server started on port ${String(port)}`);\n });\n\n server.on('error', (err: Error) => {\n setErrorMessage(err.message);\n setStatus('error');\n });\n\n return () => {\n wss.close();\n server.close();\n };\n });\n }, [port, createServerLog, createProxyLog]);\n\n if (credMode === 'editing') {\n return (\n <CredentialSetupUI\n {...(credentialMode !== undefined && { initialMode: credentialMode })}\n showProfileManager={credentialMode === 'global'}\n onComplete={handleCredentialsDone}\n onCancel={() => {\n setCredMode('main');\n }}\n />\n );\n }\n\n const elapsedSeconds =\n lastBuilt !== null ? Math.round((Date.now() - lastBuilt.getTime()) / 1000) : null;\n const elapsedLabel =\n elapsedSeconds === null\n ? ''\n : elapsedSeconds < 5\n ? ' (just now)'\n : ` (${String(elapsedSeconds)}s ago)`;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2}>\n {/* Logo + header */}\n <Logo />\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n\n {/* Build panel */}\n <Box flexDirection=\"column\">\n <Box gap={2} marginBottom={0}>\n <Text bold dimColor>\n Build\n </Text>\n {buildStatus === 'pending' && <Text dimColor>waiting…</Text>}\n {buildStatus === 'building' && (\n <Box gap={1}>\n <Spinner />\n <Text>Building plugin package…</Text>\n </Box>\n )}\n {buildStatus === 'done' && (\n <Box gap={1}>\n <Text color=\"green\">✓ Built</Text>\n {lastBuilt !== null && (\n <Text dimColor>\n at {lastBuilt.toLocaleTimeString()}\n {elapsedLabel}\n </Text>\n )}\n </Box>\n )}\n {buildStatus === 'error' && <Text color=\"red\">✗ {buildError ?? 'unknown error'}</Text>}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {buildLogHistory.slice(-LOG_DISPLAY).map((log, index) => (\n <Text key={index} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))}\n </Box>\n </Box>\n\n {/* Server panel */}\n <Box marginTop={1} flexDirection=\"column\">\n <Box gap={2}>\n <Text bold dimColor>\n Server\n </Text>\n {status === 'starting' && <Text dimColor>starting…</Text>}\n {status === 'running' && (\n <Box gap={2}>\n <Text color=\"green\">✓ Running</Text>\n <Text dimColor>\n ● {wsClientCount} viewer{wsClientCount !== 1 ? 's' : ''}\n </Text>\n </Box>\n )}\n {status === 'error' && <Text color=\"red\">✗ {errorMessage ?? 'Server error'}</Text>}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {serverLogHistory.slice(-LOG_DISPLAY).map((log, index) => (\n <Text key={index} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))}\n </Box>\n </Box>\n\n {/* Proxy panel */}\n <Box marginTop={1} flexDirection=\"column\">\n <Box gap={2}>\n <Text bold dimColor>\n Proxy\n </Text>\n <Text color=\"green\">✓ Active</Text>\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {proxyLogHistory.length === 0 ? (\n <Text dimColor> No requests yet.</Text>\n ) : (\n proxyLogHistory.slice(-LOG_DISPLAY).map((log, i) => (\n <Text key={i} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box marginTop={1} gap={1}>\n <Text dimColor>[</Text>\n <Text>q</Text>\n <Text dimColor>] quit [</Text>\n <Text>c</Text>\n <Text dimColor>] credentials [</Text>\n <Text>d</Text>\n <Text dimColor>] devtools</Text>\n </Box>\n </Box>\n );\n};\n","export interface CachedResponse {\n status: number;\n headers: Record<string, string>;\n body: Buffer;\n}\n\nexport interface ProxyCache {\n get(\n key: string,\n fetcher: () => Promise<Response>,\n ): Promise<{ response: CachedResponse; fromCache: boolean }>;\n clear(): void;\n}\n\nexport function createProxyCache(): ProxyCache {\n const cache = new Map<string, Promise<CachedResponse>>();\n\n return {\n get(\n key: string,\n fetcher: () => Promise<Response>,\n ): Promise<{ response: CachedResponse; fromCache: boolean }> {\n const existing = cache.get(key);\n if (existing !== undefined) {\n return existing.then((response) => ({ response, fromCache: true }));\n }\n\n const pending = fetcher()\n .then(async (response): Promise<CachedResponse> => {\n const headers = Object.fromEntries(response.headers);\n delete headers['content-encoding'];\n delete headers['content-length'];\n return {\n status: response.status,\n headers,\n body: Buffer.from(await response.arrayBuffer()),\n };\n })\n .catch((error: unknown) => {\n cache.delete(key);\n throw error;\n });\n\n cache.set(key, pending);\n return pending.then((response) => ({ response, fromCache: false }));\n },\n\n clear(): void {\n cache.clear();\n },\n };\n}\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nexport const ENVIRONMENTS = ['go', 'fmo', 'staging', 'integration', 'test1'] as const;\nexport type Environment = (typeof ENVIRONMENTS)[number];\n\nexport interface Credentials {\n apiKey: string;\n userId: string;\n businessId: string;\n environment: Environment;\n}\n\nexport interface CredentialProfile {\n name: string;\n path: string;\n isDefault: boolean;\n}\n\nexport const GLOBAL_CREDENTIALS_DIR = join(homedir(), '.kizenappbuilder');\nexport const GLOBAL_CREDENTIALS_PATH = join(GLOBAL_CREDENTIALS_DIR, 'credentials.json');\nexport const DEFAULT_PROFILE_NAME = 'credentials';\n\nfunction isValidEnvironment(value: unknown): value is Environment {\n return ENVIRONMENTS.includes(value as Environment);\n}\n\nfunction parseCredentials(raw: unknown): Credentials {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Credentials must be a JSON object');\n }\n const obj = raw as Record<string, unknown>;\n const env = obj.environment;\n return {\n apiKey: typeof obj.apiKey === 'string' ? obj.apiKey : '',\n userId: typeof obj.userId === 'string' ? obj.userId : '',\n businessId: typeof obj.businessId === 'string' ? obj.businessId : '',\n environment: isValidEnvironment(env) ? env : 'go',\n };\n}\n\nexport async function loadCredentialsFromFile(filePath: string): Promise<Credentials> {\n const content = await readFile(filePath, 'utf-8');\n return parseCredentials(JSON.parse(content) as unknown);\n}\n\nexport async function loadGlobalCredentials(): Promise<Credentials | null> {\n try {\n return await loadCredentialsFromFile(GLOBAL_CREDENTIALS_PATH);\n } catch {\n return null;\n }\n}\n\nexport async function saveGlobalCredentials(credentials: Credentials): Promise<void> {\n await mkdir(dirname(GLOBAL_CREDENTIALS_PATH), { recursive: true });\n await writeFile(GLOBAL_CREDENTIALS_PATH, JSON.stringify(credentials, null, 2), 'utf-8');\n}\n\nexport function getProfilePath(name: string): string {\n return join(GLOBAL_CREDENTIALS_DIR, `${name}.json`);\n}\n\nexport async function listCredentialProfiles(): Promise<CredentialProfile[]> {\n const profiles: CredentialProfile[] = [\n { name: DEFAULT_PROFILE_NAME, path: GLOBAL_CREDENTIALS_PATH, isDefault: true },\n ];\n try {\n const entries = await readdir(GLOBAL_CREDENTIALS_DIR);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const name = entry.slice(0, -5);\n if (name === DEFAULT_PROFILE_NAME) continue;\n profiles.push({ name, path: join(GLOBAL_CREDENTIALS_DIR, entry), isDefault: false });\n }\n } catch {\n // directory doesn't exist yet — only the default profile\n }\n return profiles;\n}\n\nexport async function saveCredentialProfile(name: string, credentials: Credentials): Promise<void> {\n if (name === DEFAULT_PROFILE_NAME) {\n await saveGlobalCredentials(credentials);\n return;\n }\n await mkdir(GLOBAL_CREDENTIALS_DIR, { recursive: true });\n await writeFile(getProfilePath(name), JSON.stringify(credentials, null, 2), 'utf-8');\n}\n\nexport async function loadCredentialProfile(name: string): Promise<Credentials | null> {\n try {\n return await loadCredentialsFromFile(getProfilePath(name));\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface AppBuilderConfig {\n credentialMode?: 'global' | 'local';\n activeCredentialProfile?: string;\n}\n\nexport async function loadConfig(outputDir: string): Promise<AppBuilderConfig> {\n try {\n const content = await readFile(join(outputDir, 'config.json'), 'utf-8');\n return JSON.parse(content) as AppBuilderConfig;\n } catch {\n return {};\n }\n}\n\nexport async function saveConfig(outputDir: string, config: AppBuilderConfig): Promise<void> {\n await mkdir(outputDir, { recursive: true });\n await writeFile(join(outputDir, 'config.json'), JSON.stringify(config, null, 2), 'utf-8');\n}\n","import type { FC } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport {\n DEFAULT_PROFILE_NAME,\n ENVIRONMENTS,\n GLOBAL_CREDENTIALS_PATH,\n listCredentialProfiles,\n loadCredentialProfile,\n loadGlobalCredentials,\n saveCredentialProfile,\n} from '../lib/credentials.js';\nimport type { CredentialProfile, Credentials } from '../lib/credentials.js';\nimport { Logo } from './Logo.js';\n\ntype Mode = 'global' | 'local';\n\ntype Phase =\n | { type: 'mode-select'; cursor: 0 | 1 }\n | { type: 'profile-loading' }\n | { type: 'profile-select'; profiles: CredentialProfile[]; cursor: number }\n | { type: 'name-entry'; nameBuffer: string; nameError?: string; existingProfiles: CredentialProfile[] }\n | { type: 'loading' }\n | { type: 'creds-entry'; field: number; values: Partial<Credentials>; envCursor: number }\n | { type: 'saving' }\n | { type: 'done' };\n\nconst FIELDS = ['apiKey', 'userId', 'businessId'] as const;\nconst FIELD_LABELS: Record<string, string> = {\n apiKey: 'API Key',\n userId: 'User ID',\n businessId: 'Business ID',\n};\n\nexport type CredentialMode = 'global' | 'local';\n\nexport interface CredentialSetupResult {\n mode: CredentialMode;\n credentials: Credentials | null;\n profileName?: string;\n}\n\ninterface CredentialSetupUIProps {\n initialMode?: CredentialMode;\n showProfileManager?: boolean;\n onComplete: (result: CredentialSetupResult) => void;\n onCancel?: () => void;\n}\n\nconst Hint: FC<{ text: string }> = ({ text }) => <Text dimColor>{text}</Text>;\n\nexport const CredentialSetupUI: FC<CredentialSetupUIProps> = ({\n initialMode,\n showProfileManager,\n onComplete,\n onCancel,\n}) => {\n const [phase, setPhase] = useState<Phase>(\n initialMode === 'global' && !showProfileManager\n ? { type: 'loading' }\n : initialMode === 'global' && showProfileManager\n ? { type: 'profile-loading' }\n : { type: 'mode-select', cursor: 0 },\n );\n const [inputBuffer, setInputBuffer] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [activeProfileName, setActiveProfileName] = useState<string | undefined>(undefined);\n\n const handleModeChosen = useCallback(\n async (mode: Mode) => {\n if (mode === 'local') {\n onComplete({ mode: 'local', credentials: null });\n return;\n }\n setPhase({ type: 'profile-loading' });\n },\n [onComplete],\n );\n\n const handleProfileChosen = useCallback(async (profile: CredentialProfile | null) => {\n if (profile === null) {\n // \"Add new profile\" selected\n setPhase({ type: 'profile-loading' });\n const profiles = await listCredentialProfiles();\n setPhase({ type: 'name-entry', nameBuffer: '', existingProfiles: profiles });\n return;\n }\n setActiveProfileName(profile.isDefault ? undefined : profile.name);\n setPhase({ type: 'loading' });\n const existing = profile.isDefault\n ? await loadGlobalCredentials()\n : await loadCredentialProfile(profile.name);\n const envCursor = existing ? Math.max(0, ENVIRONMENTS.indexOf(existing.environment)) : 0;\n setPhase({ type: 'creds-entry', field: 0, values: existing ?? {}, envCursor });\n }, []);\n\n const handleSave = useCallback(\n async (values: Partial<Credentials>, envCursor: number) => {\n const environment = ENVIRONMENTS[envCursor] ?? 'go';\n const credentials: Credentials = {\n apiKey: values.apiKey ?? '',\n userId: values.userId ?? '',\n businessId: values.businessId ?? '',\n environment,\n };\n setPhase({ type: 'saving' });\n try {\n const profileName = activeProfileName ?? DEFAULT_PROFILE_NAME;\n await saveCredentialProfile(profileName, credentials);\n onComplete({\n mode: 'global',\n credentials,\n ...(activeProfileName !== undefined && { profileName: activeProfileName }),\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setPhase({ type: 'creds-entry', field: 0, values, envCursor });\n }\n },\n [onComplete, activeProfileName],\n );\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n process.exit(0);\n }\n\n if (key.escape) {\n if (phase.type === 'creds-entry' || phase.type === 'name-entry') {\n // Go back to profile select if we came from there\n if (initialMode === 'global' && showProfileManager) {\n setPhase({ type: 'profile-loading' });\n void loadProfileList();\n return;\n }\n }\n onCancel?.();\n return;\n }\n\n if (phase.type === 'mode-select') {\n if (key.upArrow) {\n setPhase({ type: 'mode-select', cursor: 0 });\n } else if (key.downArrow) {\n setPhase({ type: 'mode-select', cursor: 1 });\n } else if (key.return) {\n const mode: Mode = phase.cursor === 0 ? 'global' : 'local';\n void handleModeChosen(mode);\n }\n return;\n }\n\n if (phase.type === 'profile-select') {\n const { profiles, cursor } = phase;\n const addNewIdx = profiles.length;\n const totalItems = profiles.length + 1; // +1 for \"Add new\"\n if (key.upArrow) {\n setPhase({ ...phase, cursor: (cursor - 1 + totalItems) % totalItems });\n } else if (key.downArrow) {\n setPhase({ ...phase, cursor: (cursor + 1) % totalItems });\n } else if (key.return) {\n if (cursor === addNewIdx) {\n setPhase({ type: 'name-entry', nameBuffer: '', existingProfiles: profiles });\n } else {\n void handleProfileChosen(profiles[cursor] ?? profiles[0]!);\n }\n }\n return;\n }\n\n if (phase.type === 'name-entry') {\n const { nameBuffer, nameError: _nameError, existingProfiles } = phase;\n if (key.backspace || key.delete) {\n setPhase({ type: 'name-entry', nameBuffer: nameBuffer.slice(0, -1), existingProfiles });\n } else if (key.return) {\n const trimmed = nameBuffer.trim();\n if (!trimmed) {\n setPhase({ ...phase, nameError: 'Name cannot be empty' });\n return;\n }\n if (trimmed === DEFAULT_PROFILE_NAME) {\n setPhase({ ...phase, nameError: `\"${DEFAULT_PROFILE_NAME}\" is reserved` });\n return;\n }\n if (existingProfiles.some((p) => p.name === trimmed)) {\n setPhase({ ...phase, nameError: `Profile \"${trimmed}\" already exists` });\n return;\n }\n // Valid name — proceed to empty creds-entry\n setActiveProfileName(trimmed);\n setPhase({ type: 'creds-entry', field: 0, values: {}, envCursor: 0 });\n setInputBuffer('');\n } else if (input && !key.ctrl && !key.meta) {\n setPhase({ type: 'name-entry', nameBuffer: nameBuffer + input, existingProfiles });\n }\n return;\n }\n\n if (phase.type === 'creds-entry') {\n const { field, values, envCursor } = phase;\n const isEnvField = field === FIELDS.length;\n\n if (isEnvField) {\n if (key.leftArrow) {\n setPhase({\n ...phase,\n envCursor: (envCursor - 1 + ENVIRONMENTS.length) % ENVIRONMENTS.length,\n });\n } else if (key.rightArrow) {\n setPhase({ ...phase, envCursor: (envCursor + 1) % ENVIRONMENTS.length });\n } else if (key.upArrow) {\n setPhase({ ...phase, field: field - 1 });\n setInputBuffer(values[FIELDS[field - 1] as keyof typeof values] ?? '');\n } else if (key.return) {\n void handleSave(values, envCursor);\n }\n return;\n }\n\n const fieldName = FIELDS[field];\n if (!fieldName) {\n return;\n }\n\n if (key.backspace || key.delete) {\n setInputBuffer((prev) => prev.slice(0, -1));\n } else if (key.upArrow && field > 0) {\n const updatedValues = { ...values, [fieldName]: inputBuffer };\n const prevField = field - 1;\n setPhase({ ...phase, field: prevField, values: updatedValues });\n setInputBuffer(updatedValues[FIELDS[prevField] as keyof typeof updatedValues] ?? '');\n } else if (key.return || key.tab || key.downArrow) {\n const updatedValues = { ...values, [fieldName]: inputBuffer };\n const nextField = field + 1;\n setPhase({ ...phase, field: nextField, values: updatedValues });\n if (nextField < FIELDS.length) {\n setInputBuffer(updatedValues[FIELDS[nextField] as keyof typeof updatedValues] ?? '');\n } else {\n setInputBuffer('');\n }\n } else if (input && !key.ctrl && !key.meta) {\n setInputBuffer((prev) => prev + input);\n }\n }\n });\n\n const loadProfileList = useCallback(async () => {\n const profiles = await listCredentialProfiles();\n setPhase({ type: 'profile-select', profiles, cursor: 0 });\n }, []);\n\n // Load profile list when entering profile-loading phase\n useEffect(() => {\n if (phase.type === 'profile-loading') {\n void loadProfileList();\n }\n }, [phase.type, loadProfileList]);\n\n // Handle initial mode without profile manager (existing behavior)\n useEffect(() => {\n if (initialMode === 'global' && !showProfileManager) {\n void (async () => {\n const existing = await loadGlobalCredentials();\n const envCursor = existing ? Math.max(0, ENVIRONMENTS.indexOf(existing.environment)) : 0;\n setPhase({ type: 'creds-entry', field: 0, values: existing ?? {}, envCursor });\n })();\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Reset input buffer when switching to creds-entry\n useEffect(() => {\n if (phase.type === 'creds-entry' && phase.field === 0) {\n setInputBuffer(phase.values.apiKey ?? '');\n }\n }, [phase.type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (\n phase.type === 'loading' ||\n phase.type === 'saving' ||\n phase.type === 'profile-loading'\n ) {\n const label =\n phase.type === 'saving'\n ? 'Saving credentials…'\n : phase.type === 'profile-loading'\n ? 'Loading profiles…'\n : 'Loading credentials…';\n return (\n <Box paddingY={1} paddingX={2}>\n <Text dimColor>{label}</Text>\n </Box>\n );\n }\n\n if (phase.type === 'done') {\n return null;\n }\n\n if (phase.type === 'mode-select') {\n const options: { label: string; desc: string; mode: Mode }[] = [\n { label: 'Global', desc: `~/.kizenappbuilder/credentials.json`, mode: 'global' },\n { label: 'Local', desc: 'Enter credentials in the browser dev tools', mode: 'local' },\n ];\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>Credential mode</Text>\n {options.map((opt, i) => {\n const selected = phase.cursor === i;\n return (\n <Box key={opt.mode} gap={2}>\n <Text {...(selected && { color: 'cyan' as const })}>{selected ? '❯' : ' '}</Text>\n <Text bold={selected} {...(selected && { color: 'cyan' as const })}>\n {opt.label}\n </Text>\n <Text dimColor>{opt.desc}</Text>\n </Box>\n );\n })}\n </Box>\n <Hint text=\"↑↓ to move · Enter to select · Ctrl+C to quit\" />\n </Box>\n );\n }\n\n if (phase.type === 'profile-select') {\n const { profiles, cursor } = phase;\n const addNewIdx = profiles.length;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>Credential profiles</Text>\n {profiles.map((profile, i) => {\n const selected = cursor === i;\n return (\n <Box key={profile.name} gap={2}>\n <Text {...(selected && { color: 'cyan' as const })}>{selected ? '❯' : ' '}</Text>\n <Text bold={selected} {...(selected && { color: 'cyan' as const })}>\n {profile.isDefault ? 'Default' : profile.name}\n </Text>\n <Text dimColor>{profile.path}</Text>\n </Box>\n );\n })}\n <Box gap={2}>\n <Text {...(cursor === addNewIdx && { color: 'cyan' as const })}>\n {cursor === addNewIdx ? '❯' : ' '}\n </Text>\n <Text bold={cursor === addNewIdx} {...(cursor === addNewIdx && { color: 'cyan' as const })}>\n + Add new profile\n </Text>\n </Box>\n </Box>\n <Hint text=\"↑↓ to move · Enter to select · Esc to cancel\" />\n </Box>\n );\n }\n\n if (phase.type === 'name-entry') {\n const { nameBuffer, nameError } = phase;\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>New credential profile</Text>\n </Box>\n {nameError && <Text color=\"red\">Error: {nameError}</Text>}\n <Box gap={2}>\n <Box width={12}>\n <Text bold color=\"cyan\">\n Profile name\n </Text>\n </Box>\n <Text color=\"cyan\">{'>'}</Text>\n <Text>{nameBuffer}</Text>\n <Text color=\"cyan\">{'█'}</Text>\n </Box>\n <Hint text=\"Type a name · Enter to confirm · Esc to go back\" />\n </Box>\n );\n }\n\n // creds-entry phase\n const { field: activeField, values, envCursor } = phase;\n const isEnvField = activeField === FIELDS.length;\n const profileLabel =\n activeProfileName !== undefined ? activeProfileName : DEFAULT_PROFILE_NAME;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>\n {activeProfileName !== undefined ? `Profile: ${activeProfileName}` : 'Global credentials'}\n </Text>\n <Text dimColor>\n Saved to: {activeProfileName !== undefined\n ? `~/.kizenappbuilder/${activeProfileName}.json`\n : GLOBAL_CREDENTIALS_PATH}\n </Text>\n </Box>\n {error && <Text color=\"red\">Error: {error}</Text>}\n <Box flexDirection=\"column\" gap={0}>\n {FIELDS.map((name, i) => {\n const isActive = activeField === i;\n const displayValue = isActive ? inputBuffer : (values[name] ?? '');\n return (\n <Box key={name} gap={2}>\n <Box width={12}>\n <Text bold={isActive} {...(isActive && { color: 'cyan' as const })}>\n {FIELD_LABELS[name]}\n </Text>\n </Box>\n <Text {...(isActive && { color: 'cyan' as const })}>{'>'}</Text>\n <Text>{displayValue}</Text>\n {isActive && <Text color=\"cyan\">{'█'}</Text>}\n </Box>\n );\n })}\n <Box gap={2}>\n <Box width={12}>\n <Text bold={isEnvField} {...(isEnvField && { color: 'cyan' as const })}>\n Environment\n </Text>\n </Box>\n <Text {...(isEnvField && { color: 'cyan' as const })}>{'>'}</Text>\n <Box gap={1}>\n {ENVIRONMENTS.map((env, i) => {\n const isSelected = i === envCursor;\n if (isEnvField) {\n return (\n <Text key={env} bold={isSelected} {...(isSelected && { color: 'cyan' as const })}>\n {isSelected ? `[${env}]` : env}\n </Text>\n );\n }\n return (\n <Text key={env} dimColor={!isSelected} bold={isSelected}>\n {env}\n </Text>\n );\n })}\n </Box>\n </Box>\n </Box>\n {isEnvField ? (\n <Hint text=\"←→ to select · ↑↓ to move · Enter to save · Esc to cancel\" />\n ) : (\n <Hint text=\"↑↓ to move · Backspace to delete · Esc to cancel\" />\n )}\n <Text dimColor>Profile: {profileLabel}</Text>\n </Box>\n );\n};\n"],"mappings":"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","names":["Box","Text","join","join","jsx","Text","Box","program","createElement","render","useCallback","useEffect","useState","Box","Text","useInput","readFile","dirname","join","mkdir","readFile","readdir","writeFile","join","mkdir","readFile","writeFile","join","useEffect","useState","Box","Text","jsx","jsxs","Text","useState","envCursor","values","isEnvField","useEffect","Box","jsx","jsxs","SPINNER_FRAMES","Spinner","useState","useEffect","Text","join","dirname","readFile","useInput","useCallback","Box","render","createElement","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../src/ui/BuildUI.tsx","../src/lib/runBuild.ts","../src/lib/readFiles.ts","../src/ui/Logo.tsx","../src/lib/gitignore.ts","../src/commands/dev.ts","../src/ui/DevUI.tsx","../src/chrome/launcher.ts","../src/lib/proxyCache.ts","../src/lib/credentials.ts","../src/lib/config.ts","../src/ui/CredentialSetupUI.tsx"],"sourcesContent":["import { program } from 'commander';\nimport { buildCommand } from './commands/build.js';\nimport { devCommand } from './commands/dev.js';\n\nprogram.name('appbuilder').description('Kizen plugin app builder').version('0.1.0');\n\nbuildCommand(program);\ndevCommand(program);\n\nprogram.parse();\n","import { createElement } from 'react';\nimport { render } from 'ink';\nimport type { Command } from 'commander';\nimport { BuildUI } from '../ui/BuildUI.js';\nimport { ensureGitignore } from '../lib/gitignore.js';\n\nexport function buildCommand(program: Command): void {\n program\n .command('build')\n .description('Bundle the plugin app into .kizenapp directory')\n .action(async () => {\n const pluginDir = process.cwd();\n const outputDir = `${pluginDir}/.kizenapp`;\n ensureGitignore(pluginDir);\n const { waitUntilExit } = render(createElement(BuildUI, { outputDir, pluginDir }));\n await waitUntilExit();\n });\n}\n","import type { FC } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Box, Text, useApp } from 'ink';\nimport { runBuild } from '../lib/runBuild.js';\nimport type { BuildStepName } from '../lib/runBuild.js';\nimport { Logo } from './Logo.js';\n\ntype BuildStep = BuildStepName | 'done' | 'error';\n\ninterface BuildUIProps {\n outputDir: string;\n pluginDir: string;\n}\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst Spinner: FC = () => {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const id = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n\n return () => {\n clearInterval(id);\n };\n }, []);\n\n return <Text color=\"cyan\">{SPINNER_FRAMES[frame] ?? '⠋'}</Text>;\n};\n\nconst STEPS: BuildStepName[] = [\n 'creating-dir',\n 'reading-files',\n 'minifying',\n 'packaging',\n 'writing-bundle',\n];\n\nconst STEP_LABELS: Record<BuildStepName, string> = {\n 'creating-dir': 'Creating .kizenapp directory',\n 'reading-files': 'Reading plugin files',\n minifying: 'Minifying scripts',\n packaging: 'Packaging plugin',\n 'writing-bundle': 'Writing bundle.json',\n};\n\nexport const BuildUI: FC<BuildUIProps> = ({ outputDir, pluginDir }) => {\n const app = useApp();\n const [step, setStep] = useState<BuildStep>('creating-dir');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n useEffect(() => {\n void runBuild(pluginDir, outputDir, setStep)\n .then(() => {\n setStep('done');\n app.exit();\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n setErrorMessage(message);\n setStep('error');\n app.exit();\n });\n }, [outputDir, pluginDir, app]);\n\n const currentIndex = STEPS.indexOf(step as BuildStepName);\n const isError = step === 'error';\n const isDone = step === 'done';\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2}>\n <Logo />\n\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={0}>\n {STEPS.map((s, i) => {\n const isActive = step === s;\n const isStepDone = isDone || currentIndex > i;\n const isFailed = isError && i === currentIndex;\n\n return (\n <Box key={s} gap={1}>\n {isFailed ? (\n <Text color=\"red\">✗ {STEP_LABELS[s]}</Text>\n ) : isStepDone ? (\n <Text color=\"green\">✓ {STEP_LABELS[s]}</Text>\n ) : isActive ? (\n <>\n <Spinner />\n <Text>{STEP_LABELS[s]}</Text>\n </>\n ) : (\n <Text dimColor> {STEP_LABELS[s]}</Text>\n )}\n </Box>\n );\n })}\n\n {errorMessage !== null && (\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"red\" paddingX={1}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { minifyFiles, packagePlugin, transformDeployablePlugin } from '@kizenapps/packager';\nimport type { DeployablePlugin } from '@kizenapps/packager';\nimport { readLocalFiles } from './readFiles.js';\n\nexport type BuildStepName =\n | 'creating-dir'\n | 'reading-files'\n | 'minifying'\n | 'packaging'\n | 'writing-bundle';\n\ninterface ReleaseNote {\n version: string;\n notes: string;\n}\n\ntype SerializableDeployablePlugin = Omit<DeployablePlugin, 'thumbnail' | 'kznFile'> & {\n thumbnail: string | null;\n kznFile: string | null;\n allReleaseNotes: ReleaseNote[];\n};\n\nconst serializePlugin = (\n plugin: DeployablePlugin,\n allReleaseNotes: ReleaseNote[],\n): SerializableDeployablePlugin => ({\n ...plugin,\n thumbnail: plugin.thumbnail ? Buffer.from(plugin.thumbnail).toString('base64') : null,\n kznFile: plugin.kznFile ? Buffer.from(plugin.kznFile).toString('base64') : null,\n allReleaseNotes,\n});\n\nexport async function runBuild(\n pluginDir: string,\n outputDir: string,\n onStep?: (step: BuildStepName) => void,\n): Promise<void> {\n await mkdir(outputDir, { recursive: true });\n\n onStep?.('reading-files');\n const files = await readLocalFiles(pluginDir);\n\n onStep?.('minifying');\n const minified = await minifyFiles(files);\n\n onStep?.('packaging');\n const manifestFile = minified.find((f) => f.path === 'kizen.json');\n if (!manifestFile) {\n throw new Error('kizen.json not found in plugin directory.');\n }\n const manifests = JSON.parse(manifestFile.content) as Parameters<typeof packagePlugin>[1];\n const packaged = packagePlugin(minified, manifests);\n const deployable = Object.values(packaged).map(transformDeployablePlugin);\n\n onStep?.('writing-bundle');\n const bundle = deployable.map((plugin) => {\n const notesDir = plugin.release_notes_directory?.replace(/\\/$/, '');\n const allReleaseNotes: ReleaseNote[] = notesDir\n ? files\n .filter((f) => f.path.startsWith(notesDir + '/') && f.path.endsWith('.md') && f.content)\n .map((f) => ({\n version: f.path.slice(f.path.lastIndexOf('/') + 1, -3),\n notes: f.content,\n }))\n .sort((a, b) => b.version.localeCompare(a.version, undefined, { numeric: true }))\n : [];\n return serializePlugin(plugin, allReleaseNotes);\n });\n await writeFile(join(outputDir, 'bundle.json'), JSON.stringify(bundle, null, 2), 'utf-8');\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport type { FileContent } from '@kizenapps/packager';\n\nconst IMAGE_EXTENSIONS = new Set(['.png', '.svg']);\nconst BINARY_EXTENSIONS = new Set(['.kzn']);\n\nconst SKIP_DIRS = new Set(['node_modules', '.git', '.kizenapp', '.github']);\n\nasync function walk(dir: string, rootDir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const paths: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n paths.push(...(await walk(join(dir, entry.name), rootDir)));\n } else if (entry.isFile()) {\n paths.push(join(dir, entry.name));\n }\n }\n\n return paths;\n}\n\nexport async function readLocalFiles(rootDir: string): Promise<FileContent[]> {\n const absolutePaths = await walk(rootDir, rootDir);\n\n return Promise.all(\n absolutePaths.map(async (absPath): Promise<FileContent> => {\n const relPath = relative(rootDir, absPath).split('\\\\').join('/');\n const dotIndex = relPath.lastIndexOf('.');\n const ext = dotIndex >= 0 ? relPath.slice(dotIndex).toLowerCase() : '';\n\n if (IMAGE_EXTENSIONS.has(ext)) {\n const buf = await readFile(absPath);\n return { path: relPath, content: '', base64Image: buf.toString('base64') };\n }\n\n if (BINARY_EXTENSIONS.has(ext)) {\n const buf = await readFile(absPath);\n return { path: relPath, content: '', binaryData: buf };\n }\n\n const content = await readFile(absPath, 'utf-8');\n return { path: relPath, content };\n }),\n );\n}\n","import type { FC } from 'react';\nimport { Box, Text } from 'ink';\n\nconst LOGO_LINES = [\n ' @@@ ',\n ' @@@@@ @@@@@@@ ',\n ' @@@@ @@@@@@@@@@ ',\n ' @@@@ @@@@@ ',\n ' @@@ @@@@ @@@@@ @@@@@@@ ',\n ' @@@@ @@@@ @@@@ @@@@@@@@@@@@@',\n ' @@@@ @@@@ @@@@@',\n ' @@@@ @@@ @@@@ @@@',\n ' @@@@ @@@@@@ ',\n ' @@@@@@ @@@@ ',\n ' @@@ @@@@@ @@@ @@@@ ',\n ' @@@@@ @@@@ @@@@ ',\n ' @@@@@@@@@@@@@ @@@ @@@ @@@ ',\n ' @@@@@@@@ @@@@ @@@ @@@@ ',\n ' @@@@@ @@@@ ',\n ' @@@@@@@@@@@ @@@@ ',\n ' @@@@@@@ @@@@@ ',\n ' @@@@ ',\n];\n\nexport const Logo: FC = () => (\n <Box flexDirection=\"column\">\n {LOGO_LINES.map((line, i) => (\n <Text key={i} color=\"cyan\">\n {line}\n </Text>\n ))}\n </Box>\n);\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function ensureGitignore(projectDir: string): void {\n const gitignorePath = path.join(projectDir, '.gitignore');\n const entry = '.kizenapp/';\n\n let contents = '';\n if (fs.existsSync(gitignorePath)) {\n contents = fs.readFileSync(gitignorePath, 'utf8');\n const lines = contents.split('\\n').map((l) => l.trim());\n if (lines.includes(entry) || lines.includes('.kizenapp')) {\n return;\n }\n }\n\n const addition = contents.endsWith('\\n') ? entry + '\\n' : '\\n' + entry + '\\n';\n fs.writeFileSync(gitignorePath, contents + addition);\n}\n","import { createElement } from 'react';\nimport { render } from 'ink';\nimport type { Command } from 'commander';\nimport { DevUI } from '../ui/DevUI.js';\nimport { CredentialSetupUI } from '../ui/CredentialSetupUI.js';\nimport type { CredentialMode, CredentialSetupResult } from '../ui/CredentialSetupUI.js';\nimport {\n loadCredentialProfile,\n loadCredentialsFromFile,\n loadGlobalCredentials,\n} from '../lib/credentials.js';\nimport type { Credentials } from '../lib/credentials.js';\nimport { loadConfig, saveConfig } from '../lib/config.js';\nimport { ensureGitignore } from '../lib/gitignore.js';\n\nasync function runSetupUI(initialMode?: CredentialMode): Promise<CredentialSetupResult> {\n return new Promise((resolve) => {\n let unmountFn: (() => void) | null = null;\n const handleComplete = (result: CredentialSetupResult): void => {\n unmountFn?.();\n resolve(result);\n };\n const { unmount } = render(\n createElement(CredentialSetupUI, {\n ...(initialMode !== undefined && { initialMode }),\n onComplete: handleComplete,\n }),\n { exitOnCtrlC: false },\n );\n unmountFn = unmount;\n });\n}\n\nexport function devCommand(program: Command): void {\n program\n .command('dev')\n .description('Start the plugin viewer dev server')\n .option('-p, --port <port>', 'port to listen on', '3121')\n .option('-c, --credentials <path>', 'path to a credentials JSON file')\n .action(async (options: { port: string; credentials?: string }) => {\n const port = parseInt(options.port, 10);\n const pluginDir = process.cwd();\n const outputDir = `${pluginDir}/.kizenapp`;\n ensureGitignore(pluginDir);\n\n let credentials: Credentials | null = null;\n let credentialMode: CredentialMode | undefined;\n let activeCredentialProfile: string | undefined;\n\n if (options.credentials) {\n credentials = await loadCredentialsFromFile(options.credentials);\n } else {\n const config = await loadConfig(outputDir);\n\n if (config.credentialMode === 'local') {\n credentialMode = 'local';\n } else if (config.credentialMode === 'global') {\n credentialMode = 'global';\n activeCredentialProfile = config.activeCredentialProfile;\n // Load silently — only show TUI if the file was deleted since last run\n if (activeCredentialProfile) {\n credentials = await loadCredentialProfile(activeCredentialProfile);\n if (!credentials) {\n // Named profile file missing, fall back to default\n credentials = await loadGlobalCredentials();\n activeCredentialProfile = undefined;\n }\n } else {\n credentials = await loadGlobalCredentials();\n }\n if (!credentials) {\n const result = await runSetupUI('global');\n credentials = result.credentials;\n activeCredentialProfile = result.profileName;\n }\n } else {\n // First run — show full mode selection TUI\n const result = await runSetupUI();\n credentials = result.credentials;\n credentialMode = result.mode;\n activeCredentialProfile = result.profileName;\n const profile = result.profileName;\n await saveConfig(outputDir, {\n credentialMode: result.mode,\n ...(profile !== undefined && { activeCredentialProfile: profile }),\n });\n }\n }\n\n const { waitUntilExit } = render(\n createElement(DevUI, {\n port,\n pluginDir,\n outputDir,\n credentials,\n ...(credentialMode !== undefined && { credentialMode }),\n ...(activeCredentialProfile !== undefined && { activeCredentialProfile }),\n }),\n { exitOnCtrlC: false },\n );\n await waitUntilExit();\n });\n}\n","import type { FC } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { createReadStream, watch } from 'node:fs';\nimport type { FSWatcher } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport { createServer } from 'node:http';\nimport type { IncomingMessage, Server, ServerResponse } from 'node:http';\nimport { dirname, extname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { type WebSocket, WebSocketServer } from 'ws';\nimport { launchChromeViewer, type ChromeViewerHandle } from '../chrome/launcher.js';\nimport { createProxyCache } from '../lib/proxyCache.js';\nimport { runBuild } from '../lib/runBuild.js';\nimport type { Credentials } from '../lib/credentials.js';\nimport {\n listCredentialProfiles,\n loadCredentialProfile,\n loadGlobalCredentials,\n} from '../lib/credentials.js';\nimport { saveConfig } from '../lib/config.js';\nimport { CredentialSetupUI } from './CredentialSetupUI.js';\nimport type { CredentialMode, CredentialSetupResult } from './CredentialSetupUI.js';\nimport { Logo } from './Logo.js';\n\ntype ServerStatus = 'starting' | 'running' | 'error';\ntype BuildStatus = 'pending' | 'building' | 'done' | 'error';\n\nexport type ProxyLogEntry =\n | { kind: 'request'; method: string; status: number; fromCache: boolean; url: string }\n | { kind: 'info'; message: string };\n\nfunction proxyLogEntryToString(entry: ProxyLogEntry): string {\n if (entry.kind === 'info') {\n return entry.message;\n }\n const cache = entry.fromCache ? ' [cache]' : '';\n return `${entry.method} ${entry.url} → ${String(entry.status)}${cache}`;\n}\n\nconst SKIP_WATCH_PREFIXES = ['.kizenapp', '.git'];\nconst LOG_LIMIT = 50;\nconst LOG_DISPLAY = 8;\n\ninterface DevUIProps {\n port: number;\n pluginDir: string;\n outputDir: string;\n credentials: Credentials | null;\n credentialMode?: CredentialMode;\n activeCredentialProfile?: string;\n}\n\nconst MIME_TYPES: Readonly<Record<string, string>> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.json': 'application/json; charset=utf-8',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.map': 'application/json',\n};\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nconst Spinner: FC = () => {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const id = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n\n return () => {\n clearInterval(id);\n };\n }, []);\n\n return <Text color=\"cyan\">{SPINNER_FRAMES[frame] ?? '⠋'}</Text>;\n};\n\nfunction getViewerPath(): string {\n const filename = fileURLToPath(import.meta.url);\n return join(dirname(filename), 'viewer');\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction createRequestHandler(\n viewerPath: string,\n createServerLog: (message: string) => void,\n createProxyLog: (entry: ProxyLogEntry) => void,\n credentialsRef: { current: Credentials | null },\n activeProfileRef: { current: string | undefined },\n outputDir: string,\n broadcast: (msg: object) => void,\n onProxyCacheChange: (size: number) => void,\n): (req: IncomingMessage, res: ServerResponse) => void {\n const proxyCache = createProxyCache({ onChange: onProxyCacheChange });\n\n return (req, res) => {\n void (async () => {\n const url = req.url ?? '/';\n\n try {\n createServerLog(`Received request: ${url}`);\n\n if (url === '/api/credentials') {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(credentialsRef.current !== null ? JSON.stringify(credentialsRef.current) : '{}');\n return;\n }\n\n if (url === '/api/credential-profiles' && req.method === 'GET') {\n const profiles = await listCredentialProfiles();\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ profiles, active: activeProfileRef.current }));\n return;\n }\n\n if (url === '/api/credentials/switch' && req.method === 'POST') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = JSON.parse(Buffer.concat(chunks).toString('utf-8') || '{}') as {\n profile?: string;\n };\n const profileName = body.profile;\n const creds =\n profileName === undefined || profileName === ''\n ? await loadGlobalCredentials()\n : await loadCredentialProfile(profileName);\n if (creds !== null) {\n credentialsRef.current = creds;\n activeProfileRef.current = profileName ?? undefined;\n const active = activeProfileRef.current;\n await saveConfig(outputDir, {\n credentialMode: 'global',\n ...(active !== undefined && { activeCredentialProfile: active }),\n });\n broadcast({ type: 'credentials-updated', credentials: creds });\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ ok: creds !== null }));\n return;\n }\n\n if (url === '/api/bundle') {\n const bundlePath = join(process.cwd(), '.kizenapp', 'bundle.json');\n try {\n const content = await readFile(bundlePath, 'utf-8');\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(content);\n } catch {\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{}');\n }\n return;\n }\n\n if (url === '/api/proxy-cache/clear') {\n proxyCache.clear();\n createProxyLog({ kind: 'info', message: 'Proxy cache cleared' });\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end('{\"ok\":true}');\n return;\n }\n\n if (url.startsWith('/api/proxy')) {\n const proxyTarget = req.headers['x-proxy-target'];\n if (typeof proxyTarget !== 'string') {\n res.writeHead(400);\n res.end('Missing x-proxy-target header');\n return;\n }\n\n const upstreamPath = url.slice('/api/proxy'.length) || '/';\n const upstreamUrl = `${proxyTarget}${upstreamPath}`;\n const method = req.method ?? 'GET';\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { host, 'x-proxy-target': _drop, ...forwardHeaders } = req.headers;\n\n if (method === 'GET') {\n const cacheKey = `GET::${upstreamUrl}`;\n const { response: cached, fromCache } = await proxyCache.get(cacheKey, () =>\n fetch(upstreamUrl, {\n method: 'GET',\n headers: forwardHeaders as Record<string, string>,\n }),\n );\n\n createProxyLog({\n kind: 'request',\n method: 'GET',\n status: cached.status,\n fromCache,\n url: upstreamPath,\n });\n res.writeHead(cached.status, cached.headers);\n res.end(cached.body);\n return;\n }\n\n const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;\n const resolvedBody = body && body.length > 0 ? body : undefined;\n const upstream = await fetch(upstreamUrl, {\n method,\n headers: forwardHeaders as Record<string, string>,\n ...(resolvedBody !== undefined && { body: resolvedBody }),\n });\n\n createProxyLog({\n kind: 'request',\n method,\n status: upstream.status,\n fromCache: false,\n url: upstreamPath,\n });\n\n // Node fetch auto-decompresses the body, so strip encoding/length headers\n // that describe the compressed wire format — they no longer apply.\n const responseHeaders = Object.fromEntries(upstream.headers);\n delete responseHeaders['content-encoding'];\n delete responseHeaders['content-length'];\n\n res.writeHead(upstream.status, responseHeaders);\n res.end(Buffer.from(await upstream.arrayBuffer()));\n return;\n }\n\n const rawPath = url === '/' ? '/index.html' : url;\n const filePath = join(viewerPath, rawPath);\n const resolvedPath = (await fileExists(filePath))\n ? filePath\n : join(viewerPath, 'index.html');\n const ext = extname(resolvedPath);\n const mimeType = MIME_TYPES[ext] ?? 'application/octet-stream';\n res.writeHead(200, { 'Content-Type': mimeType });\n createReadStream(resolvedPath).pipe(res);\n } catch (err) {\n if (url.startsWith('/api/proxy')) {\n createProxyLog({\n kind: 'request',\n method: req.method ?? 'GET',\n status: 502,\n fromCache: false,\n url: url.slice('/api/proxy'.length) || '/',\n });\n } else {\n createProxyLog({\n kind: 'info',\n message: `Error handling ${url}: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n if (!res.headersSent) {\n res.writeHead(502);\n res.end('Bad Gateway');\n }\n }\n })();\n };\n}\n\nexport const DevUI: FC<DevUIProps> = ({\n port,\n pluginDir,\n outputDir,\n credentials: initialCredentials,\n credentialMode: initialCredentialMode,\n activeCredentialProfile: initialActiveProfile,\n}) => {\n const credentialsRef = useRef<Credentials | null>(initialCredentials);\n const activeProfileRef = useRef<string | undefined>(initialActiveProfile);\n const [credMode, setCredMode] = useState<'main' | 'editing'>('main');\n const [credentialMode, setCredentialMode] = useState<CredentialMode | undefined>(\n initialCredentialMode,\n );\n\n const [status, setStatus] = useState<ServerStatus>('starting');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [serverLogHistory, setServerLogHistory] = useState<string[]>([]);\n const [buildLogHistory, setBuildLogHistory] = useState<string[]>([]);\n const [proxyLogHistory, setProxyLogHistory] = useState<string[]>([]);\n const [buildStatus, setBuildStatus] = useState<BuildStatus>('pending');\n const [buildError, setBuildError] = useState<string | null>(null);\n const [lastBuilt, setLastBuilt] = useState<Date | null>(null);\n const [wsClientCount, setWsClientCount] = useState(0);\n const [proxyCacheSize, setProxyCacheSize] = useState(0);\n const [proxyCacheHits, setProxyCacheHits] = useState(0);\n const [proxyCacheMisses, setProxyCacheMisses] = useState(0);\n\n const buildingRef = useRef(false);\n const viewerLaunchedRef = useRef(false);\n const chromeHandleRef = useRef<ChromeViewerHandle | null>(null);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wsClientsRef = useRef<Set<WebSocket>>(new Set());\n const pendingMessagesRef = useRef<string[]>([]);\n\n // Defined early so launchChromeViewerCb can reference it\n const broadcast = useCallback((msg: object): void => {\n const json = JSON.stringify(msg);\n if (wsClientsRef.current.size === 0) {\n pendingMessagesRef.current = [...pendingMessagesRef.current, json].slice(-LOG_LIMIT);\n return;\n }\n for (const client of wsClientsRef.current) {\n if (client.readyState === 1) {\n client.send(json);\n }\n }\n }, []);\n\n const createServerLog = useCallback((message: string): void => {\n setServerLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${message}`].slice(-LOG_LIMIT),\n );\n }, []);\n\n const launchChromeViewerCb = useCallback(() => {\n chromeHandleRef.current?.kill();\n chromeHandleRef.current = null;\n\n void launchChromeViewer({\n port,\n userDataDir: join(outputDir, '.chrome'),\n broadcast,\n }).then((handle) => {\n chromeHandleRef.current = handle;\n process.on('exit', () => {\n handle.kill();\n });\n });\n }, [port, outputDir, broadcast]);\n\n useInput(\n (input, key) => {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n process.exit(0);\n }\n if (input === 'c') {\n setCredMode('editing');\n }\n if (input === 'v') {\n launchChromeViewerCb();\n }\n },\n { isActive: credMode === 'main' },\n );\n\n useEffect(() => {\n if (status !== 'running' || viewerLaunchedRef.current) {\n return;\n }\n viewerLaunchedRef.current = true;\n launchChromeViewerCb();\n }, [status, launchChromeViewerCb]);\n\n const handleCredentialsDone = useCallback(\n (result: CredentialSetupResult): void => {\n credentialsRef.current = result.credentials;\n activeProfileRef.current = result.profileName;\n setCredMode('main');\n setCredentialMode(result.mode);\n const profile = result.profileName;\n void saveConfig(outputDir, {\n credentialMode: result.mode,\n ...(profile !== undefined && { activeCredentialProfile: profile }),\n });\n broadcast({ type: 'credentials-updated', credentials: result.credentials });\n },\n [outputDir, broadcast],\n );\n\n const createProxyLog = useCallback(\n (entry: ProxyLogEntry): void => {\n setProxyLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${proxyLogEntryToString(entry)}`].slice(\n -LOG_LIMIT,\n ),\n );\n if (entry.kind === 'request') {\n if (entry.fromCache) {\n setProxyCacheHits((n) => n + 1);\n } else {\n setProxyCacheMisses((n) => n + 1);\n }\n }\n broadcast({ type: 'proxy-log', entry });\n },\n [broadcast],\n );\n\n const createBuildLog = useCallback(\n (message: string): void => {\n setBuildLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${message}`].slice(-LOG_LIMIT),\n );\n broadcast({ type: 'log', message });\n },\n [broadcast],\n );\n\n const triggerBuild = useCallback(() => {\n if (buildingRef.current) {\n return;\n }\n\n buildingRef.current = true;\n\n setBuildStatus('building');\n setBuildError(null);\n createBuildLog('Build started');\n\n void runBuild(pluginDir, outputDir)\n .then(() => {\n createBuildLog('Build finished');\n setBuildStatus('done');\n setLastBuilt(new Date());\n\n createBuildLog('Notifying viewers to reload');\n for (const client of wsClientsRef.current) {\n if (client.readyState === 1) {\n client.send(JSON.stringify({ type: 'rebuild' }));\n }\n }\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n setBuildError(message);\n setBuildStatus('error');\n })\n .finally(() => {\n buildingRef.current = false;\n });\n }, [pluginDir, outputDir, createBuildLog]);\n\n useEffect(() => {\n triggerBuild();\n\n const watcher: FSWatcher = watch(pluginDir, { recursive: true }, (_, filename) => {\n if (!filename) {\n return;\n }\n\n const normalized = filename.replace(/\\\\/g, '/');\n\n if (SKIP_WATCH_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {\n return;\n }\n\n createBuildLog(`File change detected: ${filename}`);\n\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(triggerBuild, 150);\n });\n\n return () => {\n watcher.close();\n\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, [pluginDir, triggerBuild, createBuildLog]);\n\n useEffect(() => {\n const viewerPath = getViewerPath();\n\n void fileExists(join(viewerPath, 'index.html')).then((viewerBuilt) => {\n if (!viewerBuilt) {\n setErrorMessage(\"Viewer not built. Run 'pnpm build:viewer' first.\");\n setStatus('error');\n return;\n }\n\n const handler = createRequestHandler(\n viewerPath,\n createServerLog,\n createProxyLog,\n credentialsRef,\n activeProfileRef,\n outputDir,\n broadcast,\n setProxyCacheSize,\n );\n const server: Server = createServer(handler);\n const wss = new WebSocketServer({ server });\n\n wss.on('connection', (ws: WebSocket) => {\n for (const json of pendingMessagesRef.current) {\n if (ws.readyState === 1) {\n ws.send(json);\n }\n }\n pendingMessagesRef.current = [];\n\n createServerLog('Viewer connected for live reload');\n wsClientsRef.current.add(ws);\n setWsClientCount(wsClientsRef.current.size);\n\n ws.on('close', () => {\n wsClientsRef.current.delete(ws);\n setWsClientCount(wsClientsRef.current.size);\n });\n });\n\n server.listen(port, () => {\n setStatus('running');\n createServerLog(`Server started on port ${String(port)}`);\n });\n\n server.on('error', (err: Error) => {\n setErrorMessage(err.message);\n setStatus('error');\n });\n\n return () => {\n wss.close();\n server.close();\n };\n });\n }, [port, createServerLog, createProxyLog, broadcast, outputDir]);\n\n if (credMode === 'editing') {\n return (\n <CredentialSetupUI\n {...(credentialMode !== undefined && { initialMode: credentialMode })}\n showProfileManager={credentialMode === 'global'}\n onComplete={handleCredentialsDone}\n onCancel={() => {\n setCredMode('main');\n }}\n />\n );\n }\n\n const elapsedSeconds =\n lastBuilt !== null ? Math.round((Date.now() - lastBuilt.getTime()) / 1000) : null;\n const elapsedLabel =\n elapsedSeconds === null\n ? ''\n : elapsedSeconds < 5\n ? ' (just now)'\n : ` (${String(elapsedSeconds)}s ago)`;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2}>\n {/* Logo + header */}\n <Logo />\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n\n {/* Build panel */}\n <Box flexDirection=\"column\">\n <Box gap={2} marginBottom={0}>\n <Text bold dimColor>\n App Build\n </Text>\n {buildStatus === 'pending' && <Text dimColor>waiting…</Text>}\n {buildStatus === 'building' && (\n <Box gap={1}>\n <Spinner />\n <Text>Building plugin package…</Text>\n </Box>\n )}\n {buildStatus === 'done' && (\n <Box gap={1}>\n <Text color=\"green\">✓ Built</Text>\n {lastBuilt !== null && (\n <Text dimColor>\n at {lastBuilt.toLocaleTimeString()}\n {elapsedLabel}\n </Text>\n )}\n </Box>\n )}\n {buildStatus === 'error' && <Text color=\"red\">✗ {buildError ?? 'unknown error'}</Text>}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY + 2}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {buildLogHistory.slice(-LOG_DISPLAY).map((log, index) => (\n <Text key={index} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))}\n </Box>\n </Box>\n\n {/* Server panel */}\n <Box marginTop={1} flexDirection=\"column\">\n <Box gap={2}>\n <Text bold dimColor>\n Web Server\n </Text>\n {status === 'starting' && <Text dimColor>starting…</Text>}\n {status === 'running' && (\n <Box gap={2}>\n <Text color=\"green\">✓ Running</Text>\n <Text dimColor>\n ● {wsClientCount} viewer{wsClientCount !== 1 ? 's' : ''}\n </Text>\n </Box>\n )}\n {status === 'error' && <Text color=\"red\">✗ {errorMessage ?? 'Server error'}</Text>}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY + 2}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {serverLogHistory.slice(-LOG_DISPLAY).map((log, index) => (\n <Text key={index} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))}\n </Box>\n </Box>\n\n {/* Proxy panel */}\n <Box marginTop={1} flexDirection=\"column\">\n <Box gap={2}>\n <Text bold dimColor>\n Network Proxy\n </Text>\n <Text color=\"green\">✓ Active</Text>\n <Text dimColor>\n ● {proxyCacheSize} key{proxyCacheSize !== 1 ? 's' : ''} in the network cache ·{' '}\n {proxyCacheHits} hit · {proxyCacheMisses} miss\n </Text>\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY + 2}\n borderStyle=\"single\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {proxyLogHistory.length === 0 ? (\n <Text dimColor> No requests yet.</Text>\n ) : (\n proxyLogHistory.slice(-LOG_DISPLAY).map((log, i) => (\n <Text key={i} dimColor wrap=\"truncate\">\n {log}\n </Text>\n ))\n )}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box marginTop={1} gap={1}>\n <Text dimColor>[</Text>\n <Text>q</Text>\n <Text dimColor>] quit [</Text>\n <Text>c</Text>\n <Text dimColor>] credentials [</Text>\n <Text>v</Text>\n <Text dimColor>] {wsClientCount === 0 ? 'open viewer' : 'relaunch viewer'}</Text>\n </Box>\n </Box>\n );\n};\n","import { launch } from 'chrome-launcher';\nimport type { LaunchedChrome } from 'chrome-launcher';\nimport { createRequire } from 'node:module';\nimport { mkdirSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// chrome-remote-interface ships CommonJS with no type definitions\n\nconst CDP = createRequire(import.meta.url)('chrome-remote-interface') as (opts: {\n port: number;\n}) => Promise<CDPClient>;\n\n// ── Minimal CDP types ────────────────────────────────────────────────────────\n\ninterface CDPHeader {\n name: string;\n value: string;\n}\n\ninterface CDPRemoteObject {\n type: string;\n subtype?: string;\n value?: unknown;\n description?: string;\n objectId?: string;\n preview?: CDPObjectPreview;\n}\n\ninterface CDPPropertyPreview {\n name: string;\n type: string;\n value?: string;\n subtype?: string;\n valuePreview?: CDPObjectPreview;\n}\n\ninterface CDPObjectPreview {\n type: string;\n subtype?: string;\n overflow: boolean;\n properties: CDPPropertyPreview[];\n}\n\ninterface CDPConsoleEvent {\n type: string;\n args: CDPRemoteObject[];\n}\n\ninterface CDPFetchPausedEvent {\n requestId: string;\n request: { url: string };\n responseHeaders?: CDPHeader[];\n responseStatusCode?: number;\n}\n\ninterface CDPClient {\n Fetch: {\n enable: (opts: { patterns: { urlPattern: string; requestStage: string }[] }) => Promise<void>;\n getResponseBody: (opts: {\n requestId: string;\n }) => Promise<{ body: string; base64Encoded: boolean }>;\n fulfillRequest: (opts: {\n requestId: string;\n responseCode: number;\n responseHeaders: CDPHeader[];\n body?: string;\n base64Encoded?: boolean;\n }) => Promise<void>;\n continueRequest: (opts: { requestId: string }) => Promise<void>;\n };\n Network: {\n getAllCookies: () => Promise<{ cookies: CDPCookie[] }>;\n setCookie: (opts: CDPCookieSet) => Promise<void>;\n };\n Runtime: {\n enable: () => Promise<void>;\n consoleAPICalled: (handler: (params: CDPConsoleEvent) => void) => void;\n callFunctionOn: (opts: {\n objectId: string;\n functionDeclaration: string;\n returnByValue: boolean;\n }) => Promise<{ result: { value?: unknown } }>;\n };\n Target: {\n setAutoAttach: (opts: {\n autoAttach: boolean;\n waitForDebuggerOnStart: boolean;\n flatten: boolean;\n }) => Promise<void>;\n setDiscoverTargets: (opts: { discover: boolean }) => Promise<void>;\n closeTarget: (opts: { targetId: string }) => Promise<void>;\n };\n Browser: {\n setDockTile: (opts: { image?: string; label?: string }) => Promise<void>;\n };\n send: (method: string, params?: object, sessionId?: string) => Promise<unknown>;\n on: (event: string, handler: (params: unknown) => void) => void;\n close: () => Promise<void>;\n}\n\ninterface CDPTargetCreatedEvent {\n targetInfo: {\n targetId: string;\n type: string;\n url: string;\n };\n}\n\ninterface CDPAttachedToTargetEvent {\n sessionId: string;\n targetInfo: { targetId: string; type: string; url: string };\n waitingForDebugger: boolean;\n}\n\ninterface CDPCookie {\n name: string;\n value: string;\n domain?: string;\n path?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: string;\n expirationDate?: number;\n}\n\ninterface CDPCookieSet {\n url: string;\n name: string;\n value: string;\n domain?: string;\n path?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: string;\n expires?: number;\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nconst CSP_HEADERS = new Set([\n 'content-security-policy',\n 'content-security-policy-report-only',\n 'x-frame-options',\n]);\n\nconst KIZEN_DOMAINS = ['kizen.dev', 'kizen.com'];\n\nfunction isKizenUrl(url: string): boolean {\n try {\n const { hostname } = new URL(url);\n return KIZEN_DOMAINS.some((d) => hostname === d || hostname.endsWith('.' + d));\n } catch {\n return false;\n }\n}\n\n// ── Serialisation (ported from Electron main.ts) ─────────────────────────────\n\nfunction parseProp(prop: CDPPropertyPreview): unknown {\n if (prop.type === 'number') {\n return Number(prop.value);\n }\n if (prop.type === 'boolean') {\n return prop.value === 'true';\n }\n if (prop.type === 'undefined') {\n return undefined;\n }\n if (prop.type === 'object' && prop.value === 'null') {\n return null;\n }\n if (prop.type === 'object' && prop.valuePreview) {\n const { valuePreview } = prop;\n if (valuePreview.subtype === 'array') {\n return valuePreview.properties\n .filter((p) => /^\\d+$/.test(p.name))\n .sort((a, b) => parseInt(a.name) - parseInt(b.name))\n .map(parseProp);\n }\n const obj: Record<string, unknown> = {};\n for (const p of valuePreview.properties) {\n obj[p.name] = parseProp(p);\n }\n return obj;\n }\n return prop.value ?? `[${prop.type}]`;\n}\n\nfunction serializeArg(arg: CDPRemoteObject): unknown {\n if (arg.value !== undefined) {\n return arg.value;\n }\n if (arg.preview) {\n const { preview } = arg;\n if (preview.subtype === 'array') {\n return preview.properties\n .filter((p) => /^\\d+$/.test(p.name))\n .sort((a, b) => parseInt(a.name) - parseInt(b.name))\n .map(parseProp);\n }\n const obj: Record<string, unknown> = {};\n for (const prop of preview.properties) {\n obj[prop.name] = parseProp(prop);\n }\n return obj;\n }\n return arg.description ?? `[${arg.type}]`;\n}\n\nasync function serializeArgAsync(client: CDPClient, arg: CDPRemoteObject): Promise<unknown> {\n if (arg.type === 'object' && arg.objectId) {\n try {\n const result = await client.Runtime.callFunctionOn({\n objectId: arg.objectId,\n functionDeclaration:\n 'function() { const seen = new WeakSet(); return JSON.stringify(this, function(k,v) { if (typeof v === \"object\" && v !== null) { if (seen.has(v)) return \"[Circular]\"; seen.add(v); } return v; }); }',\n returnByValue: true,\n });\n const val = result.result.value;\n if (typeof val === 'string') {\n return JSON.parse(val) as unknown;\n }\n } catch {\n // fall through to preview-based serialization\n }\n }\n return serializeArg(arg);\n}\n\n// ── Dock icon ────────────────────────────────────────────────────────────────\n\nasync function installDockIcon(client: CDPClient): Promise<void> {\n try {\n const iconPath = join(dirname(fileURLToPath(import.meta.url)), 'viewer', 'icon.png');\n const icon = await readFile(iconPath);\n await client.Browser.setDockTile({ image: icon.toString('base64') });\n } catch {\n // Non-critical: silently skip if icon is missing or platform doesn't support it\n }\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface ChromeViewerOptions {\n port: number;\n userDataDir: string;\n broadcast: (msg: object) => void;\n}\n\nexport interface ChromeViewerHandle {\n kill: () => void;\n}\n\nexport async function launchChromeViewer(opts: ChromeViewerOptions): Promise<ChromeViewerHandle> {\n // chrome-launcher opens log files inside userDataDir before Chrome starts\n mkdirSync(opts.userDataDir, { recursive: true });\n\n const chrome: LaunchedChrome = await launch({\n startingUrl: `http://localhost:${String(opts.port)}`,\n chromeFlags: [\n `--app=http://localhost:${String(opts.port)}`,\n '--no-first-run',\n '--no-default-browser-check',\n '--disable-extensions',\n ],\n userDataDir: opts.userDataDir,\n handleSIGINT: false,\n logLevel: 'silent',\n });\n\n let client: CDPClient | null = null;\n let cookieTimer: ReturnType<typeof setInterval> | null = null;\n const cdpPort = chrome.port;\n\n // Retry CDP connection — Chrome may not be ready immediately\n for (let attempt = 0; attempt < 10; attempt++) {\n await new Promise<void>((r) => setTimeout(r, 300));\n try {\n client = await CDP({ port: cdpPort });\n break;\n } catch {\n if (attempt === 9) {\n // CDP not available; window still opens, just no interception/capture\n return {\n kill: () => {\n chrome.kill();\n },\n };\n }\n }\n }\n\n if (!client) {\n return {\n kill: () => {\n chrome.kill();\n },\n };\n }\n\n const c = client;\n\n await installDockIcon(c);\n\n // ── 1. Response interception: strip CSP + fix SameSite cookies ──────────────\n await c.Fetch.enable({\n patterns: KIZEN_DOMAINS.flatMap((d) => [\n { urlPattern: `*://${d}/*`, requestStage: 'Response' },\n { urlPattern: `*://*.${d}/*`, requestStage: 'Response' },\n ]),\n });\n\n c.on('Fetch.requestPaused', (rawParams: unknown) => {\n void (async () => {\n const params = rawParams as CDPFetchPausedEvent;\n const { requestId, request, responseHeaders, responseStatusCode } = params;\n const url = request.url;\n\n const filtered: CDPHeader[] = [];\n for (const h of responseHeaders ?? []) {\n if (CSP_HEADERS.has(h.name.toLowerCase())) {\n continue;\n }\n if (h.name.toLowerCase() === 'set-cookie' && isKizenUrl(url)) {\n const patched = h.value\n .split('\\n')\n .map((cookie) => {\n if (!/SameSite=/i.test(cookie)) {\n return cookie + '; SameSite=None; Secure';\n }\n return cookie.replace(/SameSite=\\w+/i, 'SameSite=None');\n })\n .join('\\n');\n filtered.push({ name: h.name, value: patched });\n } else {\n filtered.push(h);\n }\n }\n\n try {\n const { body, base64Encoded } = await c.Fetch.getResponseBody({ requestId });\n await c.Fetch.fulfillRequest({\n requestId,\n responseCode: responseStatusCode ?? 200,\n responseHeaders: filtered,\n body,\n ...(base64Encoded && { base64Encoded: true }),\n });\n } catch {\n try {\n await c.Fetch.continueRequest({ requestId });\n } catch {\n /* ignore */\n }\n }\n })();\n });\n\n // ── 2. Periodic SameSite cookie patching ────────────────────────────────────\n cookieTimer = setInterval(() => {\n void (async () => {\n try {\n const { cookies } = await c.Network.getAllCookies();\n for (const cookie of cookies) {\n if (!isKizenUrl(`https://${cookie.domain ?? ''}`)) {\n continue;\n }\n if (cookie.sameSite === 'None') {\n continue;\n }\n const raw = cookie.domain ?? '';\n const bare = raw.startsWith('.') ? raw.slice(1) : raw;\n await c.Network.setCookie({\n url: `https://${bare}`,\n name: cookie.name,\n value: cookie.value,\n domain: raw,\n path: cookie.path ?? '/',\n secure: true,\n ...(cookie.httpOnly !== undefined && { httpOnly: cookie.httpOnly }),\n ...(cookie.expirationDate !== undefined && {\n expires: cookie.expirationDate,\n }),\n sameSite: 'None',\n });\n }\n } catch {\n /* ignore */\n }\n })();\n }, 2000);\n\n // ── 3. Console capture → broadcast via WebSocket ─────────────────────────────\n await c.send('Runtime.enable', { generatePreview: true });\n\n // Child targets (iframes, popups, nested pages) auto-attach with their own\n // sessionIds. Runtime.enable is per-session, so without this the main page\n // works but sandbox/plugin frames are silent. Register before setAutoAttach\n // so we don't miss the first attach event.\n c.on('Target.attachedToTarget', (rawParams: unknown) => {\n const { sessionId } = rawParams as CDPAttachedToTargetEvent;\n void c.send('Runtime.enable', { generatePreview: true }, sessionId).catch(() => {\n // child target may detach before we enable; ignore\n });\n });\n\n await c.Target.setAutoAttach({\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n });\n\n // ── 4. Suppress dock-click windows ───────────────────────────────────────────\n // When the dock icon is clicked, Chrome opens a new chrome://newtab window.\n // Detect and close any page target that isn't our app URL.\n await c.Target.setDiscoverTargets({ discover: true });\n c.on('Target.targetCreated', (rawParams: unknown) => {\n const { targetInfo } = rawParams as CDPTargetCreatedEvent;\n if (targetInfo.type === 'page' && targetInfo.url === 'chrome://newtab/') {\n void c.Target.closeTarget({ targetId: targetInfo.targetId }).catch(() => {\n /* ignore */\n });\n }\n });\n\n c.on('Runtime.consoleAPICalled', (rawParams: unknown) => {\n void (async () => {\n const { type, args } = rawParams as CDPConsoleEvent;\n if (args[0]?.type === 'string' && String(args[0].value).includes('Chrome Security')) {\n return;\n }\n const level =\n type === 'warning'\n ? 'warn'\n : ['log', 'warn', 'error', 'info'].includes(type)\n ? type\n : 'log';\n const serialized = await Promise.all(args.map((arg) => serializeArgAsync(c, arg)));\n opts.broadcast({ type: 'console-message', level, args: serialized });\n })().catch(() => {\n // drop this log rather than throwing an unhandled rejection\n });\n });\n\n // ── Handles ───────────────────────────────────────────────────────────────────\n\n const kill = (): void => {\n clearInterval(cookieTimer);\n try {\n void c.close();\n } catch {\n /* ignore */\n }\n chrome.kill();\n };\n\n return { kill };\n}\n","export interface CachedResponse {\n status: number;\n headers: Record<string, string>;\n body: Buffer;\n}\n\nexport interface ProxyCache {\n get(\n key: string,\n fetcher: () => Promise<Response>,\n ): Promise<{ response: CachedResponse; fromCache: boolean }>;\n clear(): void;\n}\n\nexport interface ProxyCacheOptions {\n onChange?: (size: number) => void;\n}\n\nexport function createProxyCache(options: ProxyCacheOptions = {}): ProxyCache {\n const cache = new Map<string, Promise<CachedResponse>>();\n const { onChange } = options;\n const emitChange = (): void => {\n onChange?.(cache.size);\n };\n\n return {\n get(\n key: string,\n fetcher: () => Promise<Response>,\n ): Promise<{ response: CachedResponse; fromCache: boolean }> {\n const existing = cache.get(key);\n if (existing !== undefined) {\n return existing.then((response) => ({ response, fromCache: true }));\n }\n\n const pending = fetcher()\n .then(async (response): Promise<CachedResponse> => {\n const headers = Object.fromEntries(response.headers);\n delete headers['content-encoding'];\n delete headers['content-length'];\n return {\n status: response.status,\n headers,\n body: Buffer.from(await response.arrayBuffer()),\n };\n })\n .catch((error: unknown) => {\n cache.delete(key);\n emitChange();\n throw error;\n });\n\n cache.set(key, pending);\n emitChange();\n return pending.then((response) => {\n if (response.status >= 400) {\n cache.delete(key);\n emitChange();\n }\n return { response, fromCache: false };\n });\n },\n\n clear(): void {\n cache.clear();\n emitChange();\n },\n };\n}\n","import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nexport const ENVIRONMENTS = ['go', 'fmo', 'staging', 'integration', 'test1'] as const;\nexport type Environment = (typeof ENVIRONMENTS)[number];\n\nexport interface Credentials {\n apiKey: string;\n userId: string;\n businessId: string;\n environment: Environment;\n}\n\nexport interface CredentialProfile {\n name: string;\n path: string;\n isDefault: boolean;\n}\n\nexport const GLOBAL_CREDENTIALS_DIR = join(homedir(), '.kizenappbuilder');\nexport const GLOBAL_CREDENTIALS_PATH = join(GLOBAL_CREDENTIALS_DIR, 'credentials.json');\nexport const DEFAULT_PROFILE_NAME = 'credentials';\n\nfunction isValidEnvironment(value: unknown): value is Environment {\n return ENVIRONMENTS.includes(value as Environment);\n}\n\nfunction parseCredentials(raw: unknown): Credentials {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Credentials must be a JSON object');\n }\n const obj = raw as Record<string, unknown>;\n const env = obj.environment;\n return {\n apiKey: typeof obj.apiKey === 'string' ? obj.apiKey : '',\n userId: typeof obj.userId === 'string' ? obj.userId : '',\n businessId: typeof obj.businessId === 'string' ? obj.businessId : '',\n environment: isValidEnvironment(env) ? env : 'go',\n };\n}\n\nexport async function loadCredentialsFromFile(filePath: string): Promise<Credentials> {\n const content = await readFile(filePath, 'utf-8');\n return parseCredentials(JSON.parse(content) as unknown);\n}\n\nexport async function loadGlobalCredentials(): Promise<Credentials | null> {\n try {\n return await loadCredentialsFromFile(GLOBAL_CREDENTIALS_PATH);\n } catch {\n return null;\n }\n}\n\nexport async function saveGlobalCredentials(credentials: Credentials): Promise<void> {\n await mkdir(dirname(GLOBAL_CREDENTIALS_PATH), { recursive: true });\n await writeFile(GLOBAL_CREDENTIALS_PATH, JSON.stringify(credentials, null, 2), 'utf-8');\n}\n\nexport function getProfilePath(name: string): string {\n return join(GLOBAL_CREDENTIALS_DIR, `${name}.json`);\n}\n\nexport async function listCredentialProfiles(): Promise<CredentialProfile[]> {\n const profiles: CredentialProfile[] = [\n { name: DEFAULT_PROFILE_NAME, path: GLOBAL_CREDENTIALS_PATH, isDefault: true },\n ];\n try {\n const entries = await readdir(GLOBAL_CREDENTIALS_DIR);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) {\n continue;\n }\n const name = entry.slice(0, -5);\n if (name === DEFAULT_PROFILE_NAME) {\n continue;\n }\n profiles.push({ name, path: join(GLOBAL_CREDENTIALS_DIR, entry), isDefault: false });\n }\n } catch {\n // directory doesn't exist yet — only the default profile\n }\n return profiles;\n}\n\nexport async function saveCredentialProfile(name: string, credentials: Credentials): Promise<void> {\n if (name === DEFAULT_PROFILE_NAME) {\n await saveGlobalCredentials(credentials);\n return;\n }\n await mkdir(GLOBAL_CREDENTIALS_DIR, { recursive: true });\n await writeFile(getProfilePath(name), JSON.stringify(credentials, null, 2), 'utf-8');\n}\n\nexport async function loadCredentialProfile(name: string): Promise<Credentials | null> {\n try {\n return await loadCredentialsFromFile(getProfilePath(name));\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface AppBuilderConfig {\n credentialMode?: 'global' | 'local';\n activeCredentialProfile?: string;\n}\n\nexport async function loadConfig(outputDir: string): Promise<AppBuilderConfig> {\n try {\n const content = await readFile(join(outputDir, 'config.json'), 'utf-8');\n return JSON.parse(content) as AppBuilderConfig;\n } catch {\n return {};\n }\n}\n\nexport async function saveConfig(outputDir: string, config: AppBuilderConfig): Promise<void> {\n await mkdir(outputDir, { recursive: true });\n await writeFile(join(outputDir, 'config.json'), JSON.stringify(config, null, 2), 'utf-8');\n}\n","import type { FC } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport {\n DEFAULT_PROFILE_NAME,\n ENVIRONMENTS,\n GLOBAL_CREDENTIALS_PATH,\n listCredentialProfiles,\n loadCredentialProfile,\n loadGlobalCredentials,\n saveCredentialProfile,\n} from '../lib/credentials.js';\nimport type { CredentialProfile, Credentials } from '../lib/credentials.js';\nimport { Logo } from './Logo.js';\n\ntype Mode = 'global' | 'local';\n\ntype Phase =\n | { type: 'mode-select'; cursor: 0 | 1 }\n | { type: 'profile-loading' }\n | { type: 'profile-select'; profiles: CredentialProfile[]; cursor: number }\n | {\n type: 'name-entry';\n nameBuffer: string;\n nameError?: string;\n existingProfiles: CredentialProfile[];\n }\n | { type: 'loading' }\n | { type: 'creds-entry'; field: number; values: Partial<Credentials>; envCursor: number }\n | { type: 'saving' }\n | { type: 'done' };\n\nconst FIELDS = ['apiKey', 'userId', 'businessId'] as const;\nconst FIELD_LABELS: Record<string, string> = {\n apiKey: 'API Key',\n userId: 'User ID',\n businessId: 'Business ID',\n};\n\nexport type CredentialMode = 'global' | 'local';\n\nexport interface CredentialSetupResult {\n mode: CredentialMode;\n credentials: Credentials | null;\n profileName?: string;\n}\n\ninterface CredentialSetupUIProps {\n initialMode?: CredentialMode;\n showProfileManager?: boolean;\n onComplete: (result: CredentialSetupResult) => void;\n onCancel?: () => void;\n}\n\nconst Hint: FC<{ text: string }> = ({ text }) => <Text dimColor>{text}</Text>;\n\nexport const CredentialSetupUI: FC<CredentialSetupUIProps> = ({\n initialMode,\n showProfileManager,\n onComplete,\n onCancel,\n}) => {\n const [phase, setPhase] = useState<Phase>(\n initialMode === 'global' && !showProfileManager\n ? { type: 'loading' }\n : initialMode === 'global' && showProfileManager\n ? { type: 'profile-loading' }\n : { type: 'mode-select', cursor: 0 },\n );\n const [inputBuffer, setInputBuffer] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [activeProfileName, setActiveProfileName] = useState<string | undefined>(undefined);\n\n const handleModeChosen = useCallback(\n (mode: Mode) => {\n if (mode === 'local') {\n onComplete({ mode: 'local', credentials: null });\n return;\n }\n setPhase({ type: 'profile-loading' });\n },\n [onComplete],\n );\n\n const handleProfileChosen = useCallback(async (profile: CredentialProfile | null) => {\n if (profile === null) {\n // \"Add new profile\" selected\n setPhase({ type: 'profile-loading' });\n const profiles = await listCredentialProfiles();\n setPhase({ type: 'name-entry', nameBuffer: '', existingProfiles: profiles });\n return;\n }\n setActiveProfileName(profile.isDefault ? undefined : profile.name);\n setPhase({ type: 'loading' });\n const existing = profile.isDefault\n ? await loadGlobalCredentials()\n : await loadCredentialProfile(profile.name);\n const envCursor = existing ? Math.max(0, ENVIRONMENTS.indexOf(existing.environment)) : 0;\n setPhase({ type: 'creds-entry', field: 0, values: existing ?? {}, envCursor });\n }, []);\n\n const handleSave = useCallback(\n async (values: Partial<Credentials>, envCursor: number) => {\n const environment = ENVIRONMENTS[envCursor] ?? 'go';\n const credentials: Credentials = {\n apiKey: values.apiKey ?? '',\n userId: values.userId ?? '',\n businessId: values.businessId ?? '',\n environment,\n };\n setPhase({ type: 'saving' });\n try {\n const profileName = activeProfileName ?? DEFAULT_PROFILE_NAME;\n await saveCredentialProfile(profileName, credentials);\n onComplete({\n mode: 'global',\n credentials,\n ...(activeProfileName !== undefined && { profileName: activeProfileName }),\n });\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setPhase({ type: 'creds-entry', field: 0, values, envCursor });\n }\n },\n [onComplete, activeProfileName],\n );\n\n useInput((input, key) => {\n if (key.ctrl && input === 'c') {\n process.exit(0);\n }\n\n if (key.escape) {\n if (phase.type === 'creds-entry' || phase.type === 'name-entry') {\n // Go back to profile select if we came from there\n if (initialMode === 'global' && showProfileManager) {\n setPhase({ type: 'profile-loading' });\n void loadProfileList();\n return;\n }\n }\n onCancel?.();\n return;\n }\n\n if (phase.type === 'mode-select') {\n if (key.upArrow) {\n setPhase({ type: 'mode-select', cursor: 0 });\n } else if (key.downArrow) {\n setPhase({ type: 'mode-select', cursor: 1 });\n } else if (key.return) {\n const mode: Mode = phase.cursor === 0 ? 'global' : 'local';\n handleModeChosen(mode);\n }\n return;\n }\n\n if (phase.type === 'profile-select') {\n const { profiles, cursor } = phase;\n const addNewIdx = profiles.length;\n const totalItems = profiles.length + 1; // +1 for \"Add new\"\n if (key.upArrow) {\n setPhase({ ...phase, cursor: (cursor - 1 + totalItems) % totalItems });\n } else if (key.downArrow) {\n setPhase({ ...phase, cursor: (cursor + 1) % totalItems });\n } else if (key.return) {\n if (cursor === addNewIdx) {\n setPhase({ type: 'name-entry', nameBuffer: '', existingProfiles: profiles });\n } else {\n const selected = profiles[cursor] ?? profiles[0];\n if (selected) {\n void handleProfileChosen(selected);\n }\n }\n }\n return;\n }\n\n if (phase.type === 'name-entry') {\n const { nameBuffer, existingProfiles } = phase;\n if (key.backspace || key.delete) {\n setPhase({ type: 'name-entry', nameBuffer: nameBuffer.slice(0, -1), existingProfiles });\n } else if (key.return) {\n const trimmed = nameBuffer.trim();\n if (!trimmed) {\n setPhase({ ...phase, nameError: 'Name cannot be empty' });\n return;\n }\n if (trimmed === DEFAULT_PROFILE_NAME) {\n setPhase({ ...phase, nameError: `\"${DEFAULT_PROFILE_NAME}\" is reserved` });\n return;\n }\n if (existingProfiles.some((p) => p.name === trimmed)) {\n setPhase({ ...phase, nameError: `Profile \"${trimmed}\" already exists` });\n return;\n }\n // Valid name — proceed to empty creds-entry\n setActiveProfileName(trimmed);\n setPhase({ type: 'creds-entry', field: 0, values: {}, envCursor: 0 });\n setInputBuffer('');\n } else if (input && !key.ctrl && !key.meta) {\n setPhase({ type: 'name-entry', nameBuffer: nameBuffer + input, existingProfiles });\n }\n return;\n }\n\n if (phase.type === 'creds-entry') {\n const { field, values, envCursor } = phase;\n const isEnvField = field === FIELDS.length;\n\n if (isEnvField) {\n if (key.leftArrow) {\n setPhase({\n ...phase,\n envCursor: (envCursor - 1 + ENVIRONMENTS.length) % ENVIRONMENTS.length,\n });\n } else if (key.rightArrow) {\n setPhase({ ...phase, envCursor: (envCursor + 1) % ENVIRONMENTS.length });\n } else if (key.upArrow) {\n setPhase({ ...phase, field: field - 1 });\n setInputBuffer(values[FIELDS[field - 1] as keyof typeof values] ?? '');\n } else if (key.return) {\n void handleSave(values, envCursor);\n }\n return;\n }\n\n const fieldName = FIELDS[field];\n if (!fieldName) {\n return;\n }\n\n if (key.backspace || key.delete) {\n setInputBuffer((prev) => prev.slice(0, -1));\n } else if (key.upArrow && field > 0) {\n const updatedValues = { ...values, [fieldName]: inputBuffer };\n const prevField = field - 1;\n setPhase({ ...phase, field: prevField, values: updatedValues });\n setInputBuffer(updatedValues[FIELDS[prevField] as keyof typeof updatedValues] ?? '');\n } else if (key.return || key.tab || key.downArrow) {\n const updatedValues = { ...values, [fieldName]: inputBuffer };\n const nextField = field + 1;\n setPhase({ ...phase, field: nextField, values: updatedValues });\n if (nextField < FIELDS.length) {\n setInputBuffer(updatedValues[FIELDS[nextField] as keyof typeof updatedValues] ?? '');\n } else {\n setInputBuffer('');\n }\n } else if (input && !key.ctrl && !key.meta) {\n setInputBuffer((prev) => prev + input);\n }\n }\n });\n\n const loadProfileList = useCallback(async () => {\n const profiles = await listCredentialProfiles();\n setPhase({ type: 'profile-select', profiles, cursor: 0 });\n }, []);\n\n // Load profile list when entering profile-loading phase\n useEffect(() => {\n if (phase.type === 'profile-loading') {\n void loadProfileList();\n }\n }, [phase.type, loadProfileList]);\n\n // Handle initial mode without profile manager (existing behavior)\n useEffect(() => {\n if (initialMode === 'global' && !showProfileManager) {\n void (async () => {\n const existing = await loadGlobalCredentials();\n const envCursor = existing ? Math.max(0, ENVIRONMENTS.indexOf(existing.environment)) : 0;\n setPhase({ type: 'creds-entry', field: 0, values: existing ?? {}, envCursor });\n })();\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Reset input buffer when switching to creds-entry\n useEffect(() => {\n if (phase.type === 'creds-entry' && phase.field === 0) {\n setInputBuffer(phase.values.apiKey ?? '');\n }\n }, [phase.type]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (phase.type === 'loading' || phase.type === 'saving' || phase.type === 'profile-loading') {\n const label =\n phase.type === 'saving'\n ? 'Saving credentials…'\n : phase.type === 'profile-loading'\n ? 'Loading profiles…'\n : 'Loading credentials…';\n return (\n <Box paddingY={1} paddingX={2}>\n <Text dimColor>{label}</Text>\n </Box>\n );\n }\n\n if (phase.type === 'done') {\n return null;\n }\n\n if (phase.type === 'mode-select') {\n const options: { label: string; desc: string; mode: Mode }[] = [\n { label: 'Global', desc: `~/.kizenappbuilder/credentials.json`, mode: 'global' },\n { label: 'Local', desc: 'Enter credentials in the browser dev tools', mode: 'local' },\n ];\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>Credential mode</Text>\n {options.map((opt, i) => {\n const selected = phase.cursor === i;\n return (\n <Box key={opt.mode} gap={2}>\n <Text {...(selected && { color: 'cyan' as const })}>{selected ? '❯' : ' '}</Text>\n <Text bold={selected} {...(selected && { color: 'cyan' as const })}>\n {opt.label}\n </Text>\n <Text dimColor>{opt.desc}</Text>\n </Box>\n );\n })}\n </Box>\n <Hint text=\"↑↓ to move · Enter to select · Ctrl+C to quit\" />\n </Box>\n );\n }\n\n if (phase.type === 'profile-select') {\n const { profiles, cursor } = phase;\n const addNewIdx = profiles.length;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>Credential profiles</Text>\n {profiles.map((profile, i) => {\n const selected = cursor === i;\n return (\n <Box key={profile.name} gap={2}>\n <Text {...(selected && { color: 'cyan' as const })}>{selected ? '❯' : ' '}</Text>\n <Text bold={selected} {...(selected && { color: 'cyan' as const })}>\n {profile.isDefault ? 'Default' : profile.name}\n </Text>\n <Text dimColor>{profile.path}</Text>\n </Box>\n );\n })}\n <Box gap={2}>\n <Text {...(cursor === addNewIdx && { color: 'cyan' as const })}>\n {cursor === addNewIdx ? '❯' : ' '}\n </Text>\n <Text\n bold={cursor === addNewIdx}\n {...(cursor === addNewIdx && { color: 'cyan' as const })}\n >\n + Add new profile\n </Text>\n </Box>\n </Box>\n <Hint text=\"↑↓ to move · Enter to select · Esc to cancel\" />\n </Box>\n );\n }\n\n if (phase.type === 'name-entry') {\n const { nameBuffer, nameError } = phase;\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>New credential profile</Text>\n </Box>\n {nameError && <Text color=\"red\">Error: {nameError}</Text>}\n <Box gap={2}>\n <Box width={12}>\n <Text bold color=\"cyan\">\n Profile name\n </Text>\n </Box>\n <Text color=\"cyan\">{'>'}</Text>\n <Text>{nameBuffer}</Text>\n <Text color=\"cyan\">{'█'}</Text>\n </Box>\n <Hint text=\"Type a name · Enter to confirm · Esc to go back\" />\n </Box>\n );\n }\n\n // creds-entry phase\n const { field: activeField, values, envCursor } = phase;\n const isEnvField = activeField === FIELDS.length;\n const profileLabel = activeProfileName ?? DEFAULT_PROFILE_NAME;\n\n return (\n <Box flexDirection=\"column\" paddingY={1} paddingX={2} gap={1}>\n <Logo />\n <Box flexDirection=\"column\" marginTop={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(24)}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text bold>\n {activeProfileName !== undefined ? `Profile: ${activeProfileName}` : 'Global credentials'}\n </Text>\n <Text dimColor>\n Saved to:{' '}\n {activeProfileName !== undefined\n ? `~/.kizenappbuilder/${activeProfileName}.json`\n : GLOBAL_CREDENTIALS_PATH}\n </Text>\n </Box>\n {error && <Text color=\"red\">Error: {error}</Text>}\n <Box flexDirection=\"column\" gap={0}>\n {FIELDS.map((name, i) => {\n const isActive = activeField === i;\n const displayValue = isActive ? inputBuffer : (values[name] ?? '');\n return (\n <Box key={name} gap={2}>\n <Box width={12}>\n <Text bold={isActive} {...(isActive && { color: 'cyan' as const })}>\n {FIELD_LABELS[name]}\n </Text>\n </Box>\n <Text {...(isActive && { color: 'cyan' as const })}>{'>'}</Text>\n <Text>{displayValue}</Text>\n {isActive && <Text color=\"cyan\">{'█'}</Text>}\n </Box>\n );\n })}\n <Box gap={2}>\n <Box width={12}>\n <Text bold={isEnvField} {...(isEnvField && { color: 'cyan' as const })}>\n Environment\n </Text>\n </Box>\n <Text {...(isEnvField && { color: 'cyan' as const })}>{'>'}</Text>\n <Box gap={1}>\n {ENVIRONMENTS.map((env, i) => {\n const isSelected = i === envCursor;\n if (isEnvField) {\n return (\n <Text key={env} bold={isSelected} {...(isSelected && { color: 'cyan' as const })}>\n {isSelected ? `[${env}]` : env}\n </Text>\n );\n }\n return (\n <Text key={env} dimColor={!isSelected} bold={isSelected}>\n {env}\n </Text>\n );\n })}\n </Box>\n </Box>\n </Box>\n {isEnvField ? (\n <Hint text=\"←→ to select · ↑↓ to move · Enter to save · Esc to cancel\" />\n ) : (\n <Hint text=\"↑↓ to move · Backspace to delete · Esc to cancel\" />\n )}\n <Text dimColor>Profile: {profileLabel}</Text>\n </Box>\n );\n};\n"],"mappings":"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","names":["Box","Text","join","join","jsx","Text","Box","program","createElement","render","useCallback","useEffect","useState","Box","Text","useInput","readFile","dirname","join","fileURLToPath","readFile","join","mkdir","readFile","readdir","writeFile","dirname","join","mkdir","readFile","writeFile","join","useEffect","useState","Box","Text","jsx","jsxs","Text","useState","envCursor","values","isEnvField","useEffect","Box","jsx","jsxs","SPINNER_FRAMES","Spinner","useState","useEffect","Text","fileURLToPath","join","dirname","readFile","useCallback","useInput","Box","render","createElement","program"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,D as t,O as n,T as r,c as i,d as a,f as o,l as s,n as c,v as l,x as u}from"./fa-core-mHW_3JUd.js";import{n as d,r as f,t as p,z as m}from"./Card-BSwG5koM.js";import{i as h,n as g,r as _,t as v}from"./validIcons-TcFXfn-E.js";var y=n(),b=()=>{let{apiName:n}=m({strict:!1}),{data:b,isLoading:x,isError:S}=f(d);if(x)return(0,y.jsx)(p,{children:(0,y.jsx)(`p`,{className:`m-0 text-[13px] text-neutral-400`,children:`Fetching bundle.json…`})});if(S)return(0,y.jsx)(p,{children:(0,y.jsx)(`p`,{className:`m-0 text-[13px] text-red-700`,children:`Could not load bundle.json.`})});let C=b?.find(e=>e.api_name===n);if(!C)return(0,y.jsx)(p,{children:(0,y.jsxs)(`p`,{className:`m-0 text-[13px] text-neutral-500`,children:[`No app found with api_name`,` `,(0,y.jsx)(`code`,{className:`rounded bg-neutral-100 px-1 py-0.5`,children:n}),`.`]})});let{floating_frames:w,data_adornments:T,routable_pages:E,toolbar_items:D,js_action_templates:O,route_scripts:k,object_settings_menu_items:A,automation_action_configs:j,calendar_sources:M}=C.artifacts,N=w.length>0||T.length>0||E.length>0||D.length>0||O.length>0||k.length>0||A.length>0||j.length>0||M.length>0,P=C.setup_assistant?.fields??[],F=C.user_setup_assistant?.fields??[];return(0,y.jsxs)(`div`,{className:`space-y-4 text-[13px]`,children:[(0,y.jsx)(p,{children:(0,y.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`h1`,{className:`text-lg font-bold leading-tight text-neutral-900`,children:C.name}),(0,y.jsx)(`p`,{className:`mt-0.5 font-mono text-[11px] text-neutral-400`,children:C.api_name})]}),C.description&&(0,y.jsx)(`p`,{className:`text-[13px] leading-relaxed text-neutral-600`,children:C.description}),(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[C.version&&(0,y.jsxs)(`span`,{className:`rounded bg-neutral-100 px-2 py-0.5 text-[11px] font-semibold tracking-wide text-neutral-600`,children:[`v`,C.version]}),C.engine&&(0,y.jsxs)(`span`,{className:`rounded bg-blue-50 px-2 py-0.5 text-[11px] font-semibold tracking-wide text-blue-600`,children:[`engine: `,C.engine]}),(0,y.jsx)(`span`,{className:`rounded px-2 py-0.5 text-[11px] font-semibold tracking-wide ${C.published?`bg-green-100 text-green-700`:`bg-neutral-100 text-neutral-500`}`,children:C.published?`published`:`unpublished`}),C.release_environments?.map(e=>(0,y.jsx)(`span`,{className:`rounded bg-violet-50 px-2 py-0.5 text-[11px] font-semibold tracking-wide text-violet-600`,children:e},e)),C.block_loading_for_setup&&(0,y.jsx)(`span`,{className:`rounded bg-amber-100 px-2 py-0.5 text-[11px] font-semibold tracking-wide text-amber-700`,children:`blocks app loading`}),C.developer_business_id&&(typeof C.developer_business_id==`string`?(0,y.jsxs)(`span`,{className:`rounded bg-neutral-100 px-2 py-0.5 font-mono text-[11px] tracking-wide text-neutral-500`,children:[`biz: `,C.developer_business_id]}):Object.entries(C.developer_business_id).map(([e,t])=>(0,y.jsxs)(`span`,{className:`rounded bg-neutral-100 px-2 py-0.5 font-mono text-[11px] tracking-wide text-neutral-500`,children:[`biz (`,e,`): `,t]},e)))]})]})}),N?(0,y.jsxs)(`div`,{className:`grid grid-cols-1 gap-4 md:grid-cols-2`,children:[w.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:r,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Floating Frames`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:w.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:w.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]}),e.default_position&&(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-500`,children:e.default_position})]},t))})]}),T.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:u,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Data Adornments`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:T.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:T.map((e,n)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[e.config.color&&(0,y.jsx)(`span`,{className:`h-3 w-4 shrink-0 rounded-sm border border-black/10`,style:{backgroundColor:e.config.color}}),e.config.icon&&(h[e.config.icon]?(0,y.jsx)(t,{icon:h[e.config.icon],className:`shrink-0 text-[12px] text-neutral-500`}):(0,y.jsx)(`span`,{className:`shrink-0 rounded px-1 font-mono text-[10px] ${v.has(e.config.icon)||_.has(e.config.icon)?`bg-neutral-100 text-neutral-400`:`bg-amber-100 text-amber-600`}`,children:e.config.icon})),(0,y.jsx)(`div`,{className:`min-w-0 flex-1 truncate text-neutral-900`,children:e.config.tooltip||e.field_type}),(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[10px] text-neutral-500`,children:e.field_type})]},n))})]}),E.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:a,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Routable Pages`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:E.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:E.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]}),e.iframe_url&&(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-purple-100 px-1.5 py-0.5 text-[10px] font-semibold text-purple-600`,children:`iframe`})]},t))})]}),D.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:e,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Toolbar Items`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:D.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:D.map((e,n)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[e.color&&(0,y.jsx)(`span`,{className:`h-3 w-4 shrink-0 rounded-sm border border-black/10`,style:{backgroundColor:e.color}}),(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.label}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]}),e.icon&&(h[e.icon]?(0,y.jsx)(t,{icon:h[e.icon],className:`shrink-0 text-[12px] text-neutral-400`}):(0,y.jsx)(`span`,{className:`shrink-0 rounded px-1 font-mono text-[10px] ${v.has(e.icon)||_.has(e.icon)?`bg-neutral-100 text-neutral-400`:`bg-amber-100 text-amber-600`}`,children:e.icon}))]},n))})]}),O.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:i,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`JS Action Templates`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:O.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:O.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]}),e.hint_object_name&&(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-500`,children:e.hint_object_name})]},t))})]}),k.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:s,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Route Scripts`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:k.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:k.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name||e.api_name}),e.name&&(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]}),e.routes.length>0&&(0,y.jsxs)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 text-[10px] text-neutral-500`,children:[e.routes.length,` route`,e.routes.length===1?``:`s`]})]},t))})]}),A.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:o,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Object Settings`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:A.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:A.map((e,t)=>(0,y.jsx)(`div`,{className:`flex items-center gap-2 py-1.5`,children:(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.label}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]})},t))})]}),j.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:l,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Automation Actions`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:j.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:j.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.action_step_api_name})]}),e.action_type&&(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-blue-50 px-1.5 py-0.5 text-[10px] font-semibold text-blue-600`,children:e.action_type})]},t))})]}),M.length>0&&(0,y.jsxs)(p,{children:[(0,y.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,y.jsx)(t,{icon:c,className:`text-[12px] text-neutral-400`}),(0,y.jsx)(`span`,{className:`text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Calendar Sources`}),(0,y.jsx)(`span`,{className:`ml-auto rounded bg-neutral-100 px-1.5 py-0.5 text-[11px] font-semibold text-neutral-500`,children:M.length})]}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:M.map((e,t)=>(0,y.jsx)(`div`,{className:`flex items-center gap-2 py-1.5`,children:(0,y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,y.jsx)(`div`,{className:`truncate text-neutral-900`,children:e.name}),(0,y.jsx)(`div`,{className:`truncate font-mono text-[11px] text-neutral-400`,children:e.api_name})]})},t))})]})]}):(0,y.jsx)(p,{children:(0,y.jsx)(`p`,{className:`text-[13px] text-neutral-400`,children:`No plugin assets defined.`})}),(P.length>0||F.length>0)&&(0,y.jsxs)(p,{children:[(0,y.jsx)(`div`,{className:`mb-3 text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Setup Assistant`}),P.length>0&&(0,y.jsxs)(`div`,{className:`mb-3`,children:[(0,y.jsx)(`div`,{className:`mb-1 text-[11px] text-neutral-400`,children:`Admin setup fields`}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:P.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-neutral-900`,children:e.label??e.key}),(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[10px] text-neutral-500`,children:e.type})]},t))})]}),F.length>0&&(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`mb-1 text-[11px] text-neutral-400`,children:`User setup fields`}),(0,y.jsx)(`div`,{className:`divide-y divide-black/5`,children:F.map((e,t)=>(0,y.jsxs)(`div`,{className:`flex items-center gap-2 py-1.5`,children:[(0,y.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-neutral-900`,children:e.label??e.key}),(0,y.jsx)(`span`,{className:`shrink-0 rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[10px] text-neutral-500`,children:e.type})]},t))})]})]}),C.releaseNotes&&(0,y.jsxs)(p,{children:[(0,y.jsx)(`div`,{className:`mb-3 text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:`Release Notes`}),(0,y.jsx)(`pre`,{className:`whitespace-pre-wrap font-mono text-[12px] leading-relaxed text-neutral-700`,children:C.releaseNotes})]}),(0,y.jsx)(p,{children:(0,y.jsxs)(`details`,{children:[(0,y.jsxs)(`summary`,{className:`cursor-pointer select-none text-[11px] font-semibold uppercase tracking-widest text-neutral-400`,children:[`Icon Reference (`,g.length,` icons)`]}),(0,y.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-1`,children:g.map(e=>(0,y.jsxs)(`div`,{className:`flex w-32 items-center gap-1.5 rounded px-1.5 py-1 hover:bg-black/5`,title:e,children:[h[e]?(0,y.jsx)(t,{icon:h[e],className:`w-3.5 shrink-0 text-[13px] text-neutral-500`}):_.has(e)?(0,y.jsx)(`span`,{className:`w-3.5 shrink-0 text-center font-mono text-[9px] text-neutral-400`,children:`K`}):null,(0,y.jsx)(`span`,{className:`truncate font-mono text-[10px] text-neutral-500`,children:e})]},e))})]})})]})};export{b as AppDetailPage};
|