@kizenapps/cli 0.1.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.
@@ -0,0 +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/commands/dev.ts","../src/ui/DevUI.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';\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 outputDir = `${process.cwd()}/.kizenapp`;\n const pluginDir = process.cwd();\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';\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 { exit } = 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 exit();\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n setErrorMessage(message);\n setStep('error');\n exit(err instanceof Error ? err : new Error(message));\n });\n }, [outputDir, pluginDir, exit]);\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={1}>\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n <Text dimColor>{'─'.repeat(22)}</Text>\n </Box>\n\n <Box flexDirection=\"column\" gap={1}>\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}>\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\ntype SerializableDeployablePlugin = Omit<DeployablePlugin, 'thumbnail' | 'kznFile'> & {\n thumbnail: string | null;\n kznFile: string | null;\n};\n\nconst serializePlugin = (plugin: DeployablePlugin): 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});\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(serializePlugin);\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 { createElement } from 'react';\nimport { render } from 'ink';\nimport type { Command } from 'commander';\nimport { DevUI } from '../ui/DevUI.js';\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', '3000')\n .action(async (options: { port: string }) => {\n const port = parseInt(options.port, 10);\n const pluginDir = process.cwd();\n const outputDir = `${pluginDir}/.kizenapp`;\n const { waitUntilExit } = render(createElement(DevUI, { port, pluginDir, outputDir }), { exitOnCtrlC: false });\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 * as ChromeLauncher from 'chrome-launcher';\nimport { createReadStream, mkdirSync, 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 { WebSocket, WebSocketServer } from 'ws';\nimport { runBuild } from '../lib/runBuild.js';\n\ntype ServerStatus = 'starting' | 'running' | 'error';\ntype BuildStatus = 'pending' | 'building' | 'done' | 'error';\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}\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 setupCspBypass(debugPort: number): void {\n void (async () => {\n let wsUrl: string;\n try {\n const res = await fetch(`http://localhost:${String(debugPort)}/json/version`);\n const data = (await res.json()) as { webSocketDebuggerUrl: string };\n wsUrl = data.webSocketDebuggerUrl;\n } catch {\n return;\n }\n\n const ws = new WebSocket(wsUrl);\n let msgId = 0;\n const pending = new Map<number, (result: unknown) => void>();\n\n const send = (method: string, params?: object, sessionId?: string): void => {\n ws.send(\n JSON.stringify({\n id: ++msgId,\n method,\n ...(params !== undefined && { params }),\n ...(sessionId !== undefined && { sessionId }),\n }),\n );\n };\n\n const sendAndAwait = (\n method: string,\n params?: object,\n sessionId?: string,\n ): Promise<unknown> => {\n const id = ++msgId;\n return new Promise((resolve) => {\n pending.set(id, resolve);\n ws.send(\n JSON.stringify({\n id,\n method,\n ...(params !== undefined && { params }),\n ...(sessionId !== undefined && { sessionId }),\n }),\n );\n });\n };\n\n const CSP_HEADERS = new Set([\n 'content-security-policy',\n 'content-security-policy-report-only',\n 'x-frame-options',\n ]);\n\n const KIZEN_DOMAINS = ['kizen.dev', 'kizen.com'];\n let primarySession: string | undefined;\n\n ws.on('open', () => {\n send('Target.setAutoAttach', {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n });\n });\n\n ws.on('message', (data) => {\n const msg = JSON.parse((data as Buffer).toString()) as {\n id?: number;\n result?: unknown;\n method?: string;\n sessionId?: string;\n params?: {\n sessionId?: string;\n requestId?: string;\n responseStatusCode?: number;\n responseHeaders?: { name: string; value: string }[];\n };\n };\n\n if (msg.id !== undefined && pending.has(msg.id)) {\n pending.get(msg.id)?.(msg.result);\n pending.delete(msg.id);\n return;\n }\n\n if (msg.method === 'Target.attachedToTarget' && msg.params?.sessionId) {\n send(\n 'Fetch.enable',\n { patterns: [{ requestStage: 'Response', resourceType: 'Document' }] },\n msg.params.sessionId,\n );\n send('Network.enable', {}, msg.params.sessionId);\n primarySession ??= msg.params.sessionId;\n }\n\n if (msg.method === 'Fetch.requestPaused' && msg.params?.requestId) {\n const { requestId, responseHeaders, responseStatusCode = 200 } = msg.params;\n const sessionId = msg.sessionId;\n\n const hasCsp = responseHeaders?.some((h) => CSP_HEADERS.has(h.name.toLowerCase()));\n\n if (!hasCsp) {\n // Nothing to strip — pass through without touching headers.\n send('Fetch.continueResponse', { requestId }, sessionId);\n return;\n }\n\n // Has CSP headers: fetch the body and re-serve with stripped headers.\n // Fetch.continueResponse with modified headers hangs on streaming responses;\n // Fetch.fulfillRequest with the full body is reliable.\n void (async () => {\n try {\n const { body, base64Encoded } = (await sendAndAwait(\n 'Fetch.getResponseBody',\n { requestId },\n sessionId,\n )) as {\n body: string;\n base64Encoded: boolean;\n };\n const filteredHeaders = (responseHeaders ?? []).filter(\n (h) => !CSP_HEADERS.has(h.name.toLowerCase()),\n );\n const bodyBase64 = base64Encoded ? body : Buffer.from(body).toString('base64');\n send(\n 'Fetch.fulfillRequest',\n {\n requestId,\n responseCode: responseStatusCode,\n responseHeaders: filteredHeaders,\n body: bodyBase64,\n },\n sessionId,\n );\n } catch {\n send('Fetch.continueResponse', { requestId }, sessionId);\n }\n })();\n }\n });\n\n ws.on('error', () => {\n /* ignore CDP connection errors */\n });\n\n // Periodically re-set Kizen cookies with SameSite=None so they are sent\n // when a Kizen page is embedded inside localhost (cross-site iframe).\n // Browsers default to SameSite=Lax which blocks cookies in that context.\n setInterval(() => {\n const session = primarySession;\n if (!session) {\n return;\n }\n\n void (async () => {\n try {\n const { cookies } = (await sendAndAwait('Network.getAllCookies', undefined, session)) as {\n cookies: {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite?: string;\n priority?: string;\n sameParty?: boolean;\n sourceScheme?: string;\n sourcePort?: number;\n }[];\n };\n\n const toFix = cookies.filter(\n (c) =>\n KIZEN_DOMAINS.some((d) => c.domain === d || c.domain.endsWith('.' + d)) &&\n c.sameSite !== 'None',\n );\n\n if (toFix.length === 0) {\n return;\n }\n\n await sendAndAwait(\n 'Network.setCookies',\n {\n cookies: toFix.map(({ expires, ...rest }) => ({\n ...rest,\n sameSite: 'None',\n secure: true,\n ...(expires !== -1 && { expires }),\n })),\n },\n session,\n );\n } catch {\n /* ignore CDP errors */\n }\n })();\n }, 2000);\n })();\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: (message: string) => void,\n): (req: IncomingMessage, res: ServerResponse) => void {\n return (req, res) => {\n void (async () => {\n const url = req.url ?? '/';\n\n createServerLog(`Received request: ${url}`);\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.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\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n\n const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { host, 'x-proxy-target': _drop, ...forwardHeaders } = req.headers;\n\n const resolvedBody = body && body.length > 0 ? body : undefined;\n const upstream = await fetch(upstreamUrl, {\n ...(req.method !== undefined && { method: req.method }),\n headers: forwardHeaders as Record<string, string>,\n ...(resolvedBody !== undefined && { body: resolvedBody }),\n });\n\n createProxyLog(`${req.method ?? 'GET'} ${upstreamPath} → ${String(upstream.status)}`);\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)) ? filePath : 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 })();\n };\n}\n\nexport const DevUI: FC<DevUIProps> = ({ port, pluginDir, outputDir }) => {\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 chromiumLaunchedRef = 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((input, key) => {\n if (input === 'q' || (key.ctrl && input === 'c')) {\n process.exit(0);\n }\n });\n\n useEffect(() => {\n if (status !== 'running' || chromiumLaunchedRef.current) {\n return;\n }\n chromiumLaunchedRef.current = true;\n\n const chromeDataDir = join(outputDir, '.chrome');\n mkdirSync(chromeDataDir, { recursive: true });\n\n void ChromeLauncher.launch({\n startingUrl: '',\n chromeFlags: [`--app=http://localhost:${String(port)}`],\n userDataDir: chromeDataDir,\n logLevel: 'silent',\n })\n .then((chrome) => {\n chrome.process.unref();\n setupCspBypass(chrome.port);\n process.on('exit', () => {\n chrome.process.kill();\n });\n })\n .catch(() => {\n // Chrome not found or failed to launch\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 createProxyLog = useCallback(\n (message: string): void => {\n setProxyLogHistory((h) =>\n [...h, `${new Date().toLocaleTimeString()}: ${message}`].slice(-LOG_LIMIT),\n );\n broadcast({ type: 'proxy-log', message });\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(viewerPath, createServerLog, createProxyLog);\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 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={1}>\n {/* Header */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box gap={1}>\n <Text bold color=\"cyan\">\n Kizen App Builder\n </Text>\n </Box>\n </Box>\n\n {/* Build log */}\n <Box flexDirection=\"column\">\n <Box gap={1} marginBottom={0}>\n {buildStatus === 'pending' && <Text dimColor>Build waiting...</Text>}\n {buildStatus === 'building' && (\n <>\n <Spinner />\n <Text>Building Plugin Package...</Text>\n </>\n )}\n {buildStatus === 'done' && (\n <Text color=\"green\">\n ✓ Built Plugin Package\n {lastBuilt !== null ? ` at ${lastBuilt.toLocaleTimeString()}` : ''}\n <Text dimColor>{elapsedLabel}</Text>\n </Text>\n )}\n {buildStatus === 'error' && (\n <Text color=\"red\">✗ Build error: {buildError ?? 'unknown error'}</Text>\n )}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"round\"\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 {/* Web server log */}\n <Box marginTop={1} flexDirection=\"column\">\n <Box gap={2}>\n {status === 'starting' && <Text dimColor>Starting server...</Text>}\n {status === 'running' && (\n <>\n <Text color=\"green\">✓ Dev Server running</Text>\n <Text color=\"cyan\" bold>\n http://localhost:{port}\n </Text>\n <Text dimColor>\n ● {wsClientCount} viewer{wsClientCount !== 1 ? 's' : ''}\n </Text>\n </>\n )}\n {status === 'error' && <Text color=\"red\">✗ {errorMessage ?? 'Server error'}</Text>}\n </Box>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"round\"\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 log */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Proxy</Text>\n <Box\n flexDirection=\"column\"\n height={LOG_DISPLAY}\n borderStyle=\"round\"\n borderColor=\"gray\"\n overflow=\"hidden\"\n >\n {proxyLogHistory.length === 0 ? (\n <Text dimColor> No proxy 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}>\n <Text dimColor>q to quit</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":["join","join","program","createElement","render","useEffect","useState","Box","Text","readFile","join","Fragment","jsx","jsxs","SPINNER_FRAMES","Spinner","useState","useEffect","Text","join","readFile","Box","program","render","createElement"]}
@@ -0,0 +1,24 @@
1
+ var V=Object.defineProperty;var Z=(u,d,m)=>d in u?V(u,d,{enumerable:!0,configurable:!0,writable:!0,value:m}):u[d]=m;var i=(u,d,m)=>Z(u,typeof d!="symbol"?d+"":d,m);(function(){"use strict";var u={QUERY_REQUEST:"query:request",UI_OUTPUT:"outputui",IFRAME_OUTPUT:"iframeoutput",POSTFORMDATA_REQUEST:"postformdata:request",SETSTATE:"setstate",DONE:"done",RUN:"run",OPEN_WINDOW:"openwindow",COMMUNICATE:"communicate",SHOW_TOAST:"showtoast",CLEAR_TOASTS:"cleartoasts",REFRESH_TIMELINE:"refreshtimeline",UPDATE_SESSION_DATA:"updatesessiondata",PROMPT_REQUEST:"prompt:request",DYNAMIC_PROMPT_REQUEST:"dynamicprompt:request",RELEASE_BLOCKING_SCRIPT:"releaseblockingscript",AUTHORIZE:"authorize",COPY_TO_CLIPBOARD:"copytoclipboard"},d={QUERY_RESPONSE:"query:response",POSTFORMDATA_RESPONSE:"postformdata:response",ERROR:"error",UPLOADFILE_RESPONSE:"uploadfile:response",INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:"installthirdpartyscript:response",PROMPT_RESPONSE:"prompt:response",REFRESH_ENTITY_RESPONSE:"refreshentity:response",CREATE_RECORD_RESPONSE:"createrecord:response",CREATE_RELATED_RECORD_RESPONSE:"createrelatedrecord:response"},m={RUN_FRAME_SCRIPT:"runframescript",SEND_MESSAGE_TO_FRAME:"sendmessagetoframe",CALL_THIRD_PARTY_SCRIPT:"callthirdpartyscript"},C=/https:\/\/.*widget\.freshworks\.com\/.*\.js/,v=/https:\/\/widget\.intercom\.io\/widget\/[a-z0-9]+/,w={FRESHWORKS:"freshworks",INTERCOM:"intercom"},I=e=>{if(C.test(e))return w.FRESHWORKS;if(v.test(e))return w.INTERCOM},A=class{constructor(e,t){i(this,"instance");i(this,"scriptUrl");i(this,"integration");this.instance=e,this.scriptUrl=t;const r=I(t);if(r)this.integration=r;else throw new Error(`Error: Disallowed script url: ${t}`)}get type(){return this.integration}call(...e){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:m.CALL_THIRD_PARTY_SCRIPT,eventName:`thirdParty:${m.CALL_THIRD_PARTY_SCRIPT}`,recipient:{script:this.scriptUrl,type:this.type},params:e}))}},M=()=>{let e=new Date().getTime();return typeof performance<"u"&&typeof performance.now=="function"&&(e+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const r=(e+Math.random()*16)%16|0;return e=Math.floor(e/16),(t==="x"?r:r&3|8).toString(16)})},P=Object.getPrototypeOf(async function(){}).constructor,D=e=>{const t=`
2
+ const __cleanup = this.__cleanup.bind(this);
3
+ const __error = this.onError.bind(this);
4
+ let __kizen_internal_result;
5
+ {
6
+ this.__setup();
7
+ }
8
+ try {
9
+ __kizen_internal_result = await (async () => { ${e} })();
10
+ } catch (ex) {
11
+ __error(ex);
12
+ } finally {
13
+ __cleanup(__kizen_internal_result);
14
+ }
15
+ `;try{return{fn:new P(t),functionBody:t}}catch{const r=`
16
+ this.__setup();
17
+ this.onError({ message: "The script has a syntax error and could not be parsed" });
18
+ this.__cleanup();
19
+ `;return{fn:new P(r),functionBody:r}}},x=class{constructor({isDebug:e=!1}){i(this,"promises");i(this,"isDebug");this.promises=new Map,this.isDebug=e}delete(e){this.isDebug&&console.log(`Deleting promise ${e}`),this.promises.delete(e)}get(e){return this.isDebug&&console.log(`Getting promise ${e}`),this.promises.get(e)}set(e,t,r){this.promises.set(e,{resolve:t,reject:r})}id(){return M()}register(e,t){const r=this.id();return this.set(r,e,t),r}resolve(e,t){var r;(r=this.get(e))==null||r.resolve(t),this.delete(e)}reject(e,t){var r;(r=this.get(e))==null||r.reject(t),this.delete(e)}},U=e=>({key:`action__${e.api_name}`,type:"custom_object",label:e.name,allow_multiple:!0}),b=(e,t)=>{var o;const r=(e.fields??[]).filter(n=>n.type!=="container"&&n.type!=="description").map(n=>({...n,when:t?`(${t}) && (${n.when??"true"})`:n.when})),a=(e.fields??[]).filter(n=>n.type==="container").flatMap(n=>b(n,n.when)),c=((o=e.actions)==null?void 0:o.filter(n=>n.hint_object_name))??[];return[...r,...a,...c.map(n=>({...U(n),match_hint:n.hint_object_name??""}))]},H=(e,t)=>{const s=b(e).reduce((o,n)=>({...o,[n.key]:n}),{}),a=Object.keys(t),c={};return a.forEach(o=>{var h,p;const n=t[o],g=s[o];if(g!=null&&g.type){switch(g.type){case"boolean":const E=n;if(!E)return;c[o]=E.value;return;case"custom_object":{const l=n;if(!l)return;c[o]={objectId:(h=l.value)==null?void 0:h.id,objectName:(p=l.value)==null?void 0:p.objectName};return}case"field":{const l=n;if(!(l!=null&&l.value))return;Array.isArray(l.value)?c[o]=l.value.map(f=>{var S,T;return{fieldId:f.value,fieldName:f.label,objectId:(S=l.associatedObject)==null?void 0:S.id,objectName:(T=l.associatedObject)==null?void 0:T.name}}):typeof l.value=="object"&&typeof l.associatedObject=="object"&&(c[o]={fieldId:l.value.value,fieldName:l.value.label,objectId:l.associatedObject.id,objectName:l.associatedObject.name});return}case"number":{const l=n;if(!l)return;try{const f=Number(l.value);if(!f&&f!==0)return;c[o]=f}catch{c[o]=NaN}return}case"select":{const l=n;if(!l)return;c[o]=l.value;return}case"text":{const l=n,f=l==null?void 0:l.value;if(f){c[o]=f;return}const S=g.default;S&&(c[o]=S);return}case"description":case"container":return}return n==null?void 0:n.value}}),c},j=(e,t)=>r=>async(s,a,c)=>new Promise((o,n)=>{const g=t.register(o,n);e.postMessage(JSON.stringify({action:u.QUERY_REQUEST,id:g,method:r,url:s,payload:a,options:c}))}),F=(e,t)=>(r,s,a=!0)=>new Promise((c,o)=>{const n=t.register(c,o);e.postMessage(JSON.stringify({action:u.POSTFORMDATA_REQUEST,url:r,id:n,payload:s,createNewTab:a}))}),$=(e,t)=>r=>new Promise((s,a)=>{const c=t.register(s,a);e.postMessage(JSON.stringify({action:u.PROMPT_REQUEST,id:c,config:r}))}),J=(e,t)=>r=>new Promise((s,a)=>{const c=t.register(s,a);e.postMessage(JSON.stringify({action:u.DYNAMIC_PROMPT_REQUEST,id:c,config:r}))}),L=(e,t,r)=>{switch(e){case d.QUERY_RESPONSE:{const{id:s,data:a,error:c}=JSON.parse(t.data);c?r.reject(s,c):r.resolve(s,a);break}case d.POSTFORMDATA_RESPONSE:{const{id:s,success:a}=JSON.parse(t.data);a?r.resolve(s):r.reject(s);break}case d.UPLOADFILE_RESPONSE:{const{id:s,data:a,error:c}=JSON.parse(t.data);a?r.resolve(s,a):r.reject(s,c);break}case d.INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,a):r.reject(s);break}case d.PROMPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case d.CREATE_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case d.CREATE_RELATED_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case d.REFRESH_ENTITY_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,!0):r.reject(s);break}}},k=`integration:${m.RUN_FRAME_SCRIPT}`,B=class{constructor(e){i(this,"instance");this.instance=e}runFrameScript(e,t,r){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:m.RUN_FRAME_SCRIPT,eventName:k,recipient:{frame:e,script:t},args:r}))}sendMessageToOwnFrame(e,t){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:m.SEND_MESSAGE_TO_FRAME,args:{payload:e,path:t}}))}},y=async e=>{let t=null;try{t=await e.json()}catch{}return{status:e.status,statusText:e.statusText,body:t}},O=(e,t,r={},s="")=>{const c=`(${e.toString()})({ state: {{${t}}}, args: ${JSON.stringify(r)}, utils: __kizen_utils })`;return`(function() { ${s}
20
+ return ${c}; })()`},W=class{constructor({user:e,teamMember:t,business:r,clientObject:s,appPath:a,isDebug:c,kizenRequest:o,postFormData:n,scriptBody:g,instance:h,args:p,uploadFile:E,sessionData:l,pluginComponentId:f,installThirdPartyScript:S,prompt:T,refreshEntity:Y,openCreateRecord:z,openCreateRelatedRecord:q,pluginApiName:Q,dynamicPrompt:G,location:K}){i(this,"user");i(this,"teamMember");i(this,"business");i(this,"clientObject");i(this,"appPath");i(this,"dataCache",new Map);i(this,"queryOptions",{});i(this,"api");i(this,"postFormData");i(this,"executionTimer",0);i(this,"setupExecutions",0);i(this,"cleanupExecutions",0);i(this,"isDebug",!1);i(this,"scriptBody");i(this,"internalState",{indicator:"none"});i(this,"console",console);i(this,"instance");i(this,"breakOnException",!1);i(this,"args");i(this,"communicate");i(this,"shouldPreserve",!1);i(this,"uploadFileHandler");i(this,"internalSessionData");i(this,"pluginComponentId");i(this,"installThirdPartyScriptHandler");i(this,"promptHandler");i(this,"dynamicPromptHandler");i(this,"refreshEntityHandler");i(this,"openCreateRecordHandler");i(this,"openCreateRelatedRecordHandler");i(this,"runnerType");i(this,"pluginApiName");i(this,"tempPromptState",{});i(this,"partialLocation");this.user=e,this.teamMember=t,this.business=r,this.clientObject=s,this.partialLocation=K,this.appPath=a,this.isDebug=c??!1,this.api={get:o("get"),post:o("post"),put:o("put"),delete:o("delete"),patch:o("patch")},this.postFormData=n,this.scriptBody=g,this.instance=h,this.communicate=new B(h),this.uploadFileHandler=E,this.internalSessionData=l??{},this.pluginComponentId=f,this.installThirdPartyScriptHandler=S,this.promptHandler=T,this.refreshEntityHandler=Y,this.openCreateRecordHandler=z,this.openCreateRelatedRecordHandler=q,this.runnerType="base",this.pluginApiName=Q,this.dynamicPromptHandler=G;try{this.args=JSON.parse(p??"{}")}catch{this.args={}}}onError(e){if(this.breakOnException)debugger;this.instance.postMessage(JSON.stringify({action:d.ERROR,error:e==null?void 0:e.message}))}set debug(e){this.isDebug=e,this.breakOnException=e}set preserve(e){this.shouldPreserve=e}get preserve(){return this.shouldPreserve}parseDate(e){return e.split("-")}parsePhone(e){return e.replace(/\+/g,"")}openWindow(e,t="_blank"){this.instance.postMessage(JSON.stringify({action:u.OPEN_WINDOW,url:e,target:t,features:"noopener noreferrer"}))}authorize(e,t={}){if(!e)throw new Error("Service name is required to authorize");this.instance.postMessage(JSON.stringify({action:u.AUTHORIZE,serviceName:e,config:{successRedirectPath:t.successRedirectPath??`/marketplace/${this.pluginApiName}/auth`,errorRedirectPath:t.errorRedirectPath??`/marketplace/${this.pluginApiName}/auth`}}))}getServiceUrl(e,t){if(!e)throw new Error("Service name is required to get a service url");const r=`/external-integrations/proxy/${this.pluginApiName}/${e}`;return t.startsWith("/")?`${r}${t}`:`${r}/${t}`}get currentBusiness(){return this.business}get applicationPath(){return this.appPath}get currentUser(){var e,t,r,s,a,c,o,n;return{profile:{id:((e=this.teamMember)==null?void 0:e.id)??"",full_name:((t=this.teamMember)==null?void 0:t.full_name)??"",first_name:((r=this.teamMember)==null?void 0:r.first_name)??"",last_name:((s=this.teamMember)==null?void 0:s.last_name)??"",email:((a=this.teamMember)==null?void 0:a.email)??"",phone:((c=this.teamMember)==null?void 0:c.phone)??"",created:((o=this.teamMember)==null?void 0:o.created)??"",crm_client_id:((n=this.user)==null?void 0:n.crm_client_id)??""}}}get sessionData(){return this.internalSessionData}get config(){return!this.args.__kizen_clean_config?{}:new Proxy(this.args.__kizen_clean_config??{},{get:(r,s)=>{if(Reflect.has(r,s))return Reflect.get(r,s)}})}get location(){return new Proxy(this.partialLocation,{get:(e,t)=>{if(t==="toJSON")return()=>this.partialLocation;if(Reflect.has(e,t))return Reflect.get(e,t);throw new Error(`Property ${String(t)} is not available on location object for plugin apps`)}})}get userConfig(){var r;const e=(r=this.args.__kizen_user_config)==null?void 0:r.__kizen_clean_config;return e?new Proxy(e,{get:(s,a)=>{if(Reflect.has(s,a))return Reflect.get(s,a)}}):{}}setSessionData(e){if(typeof e!="object")throw new Error(`Invalid session update with type ${typeof e}`);if(Array.isArray(e))throw new Error("Invalid session update with type array");this.internalSessionData={...this.internalSessionData,...e},this.instance.postMessage(JSON.stringify({action:u.UPDATE_SESSION_DATA,update:e}))}async get(e,t){try{if(this.isRelativeUrl(e)){const r=this.dataCache.get(e);if(r&&!(t!=null&&t.ignoreCache))return t!=null&&t.returnErrors?[r.data,null]:r.data;const{data:s}=await this.api.get(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return this.dataCache.set(e,{ts:Date.now(),data:s}),t!=null&&t.returnErrors?[s,null]:s}else{const r=await fetch(e,{method:"GET",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await y(r);const s=await r.json();return t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async getWithErrors(e,t){return this.get(e,{...t,returnErrors:!0})}async getUserConfig(){var t;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");return((t=(await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0})).config)==null?void 0:t[this.pluginComponentId])??{}}async setUserConfig(e){var s;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");const t=await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0});return await this.post(`/employee/mine/configs/plugins/${this.args.pluginId}`,{config:{...t==null?void 0:t.config,[this.pluginComponentId]:{...(s=t==null?void 0:t.config)==null?void 0:s[this.pluginComponentId],...e}}})}async patch(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.patch(e,t,{...this.queryOptions,headers:r==null?void 0:r.headers});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"PATCH",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await y(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async patchWithErrors(e,t,r){return this.patch(e,t,{...r,returnErrors:!0})}async post(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.post(e,t,{...this.queryOptions,headers:this.buildHeaders(r==null?void 0:r.headers)});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"POST",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await y(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async postWithErrors(e,t,r){return this.post(e,t,{...r,returnErrors:!0})}async delete(e,t){try{if(this.isRelativeUrl(e)){const{data:r}=await this.api.delete(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return t!=null&&t.returnErrors?[r,null]:r}else{const r=await fetch(e,{method:"DELETE",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await y(r);let s=null;return r.status!==204&&(s=await r.json()),t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async deleteWithErrors(e,t){return this.delete(e,{...t,returnErrors:!0})}async openCreateRecordModal(e){return this.openCreateRecordHandler(e)}async openCreateRelatedRecordModal(e,t){return this.openCreateRelatedRecordHandler(e,t)}showToast(e,t){this.instance.postMessage(JSON.stringify({action:u.SHOW_TOAST,message:e,toastOptions:t}))}clearToasts(){this.instance.postMessage(JSON.stringify({action:u.CLEAR_TOASTS}))}outputUI(e){this.instance.postMessage(JSON.stringify({action:u.UI_OUTPUT,markup:e}))}prompt(e){return this.promptHandler(e)}async dynamicPrompt(e){var g;const t="__kizen_state";let r=`const __kizen_utils = {};
21
+ `;if(e.registerUtils){const h=Object.keys(e.registerUtils);r+=h.map(p=>{var l;const E=(l=e.registerUtils)==null?void 0:l[p];if(typeof E!="function")throw new Error(`Registered util ${p} is not a function, got ${typeof E}`);return`__kizen_utils["${p}"] = (${E.toString()});`}).join(`
22
+ `)}const s=(g=e.content)==null?void 0:g.map(h=>{let p="";"optionMapper"in h&&(p=O(h.optionMapper,t,h.args,r));let E="";"getFetchUrl"in h&&(E=O(h.getFetchUrl,t,h.args,r));let l="";"getHeaders"in h&&(l=O(h.getHeaders,t,h.args,r));let f="";return"getBody"in h&&(f=O(h.getBody,t,h.args,r)),{...h,optionMapper:p,getFetchUrl:E,getHeaders:l,getBody:f}}),a={...e,content:s},c={fields:a.content},o=await this.dynamicPromptHandler(a),n=H(c,o.values);return{...o,values:n}}outputIframe(e,t,r){this.instance.postMessage(JSON.stringify({action:u.IFRAME_OUTPUT,url:e,allow:t,sandbox:r,preserve:this.preserve}))}getBase64EncodedBlob(e){return new Promise((t,r)=>{const s=new FileReader;s.readAsDataURL(e),s.onload=()=>{t(s.result)},s.onerror=a=>{r(a)}})}async uploadFile(e,t,r=!1){const s=await this.getBase64EncodedBlob(e);return await this.uploadFileHandler({file:s,fileName:t??"file_"+String(Date.now()),isPublic:r})}afterSetup(){}__setup(){if(this.setupExecutions!==0)throw new Error("Setup must be called exactly once, and should never be called by a script directly.");if(this.cleanupExecutions!==0)throw new Error("Setup was called after cleanup");this.isDebug&&this.console.log(`Running script:
23
+
24
+ ${this.scriptBody}`),this.setupExecutions++,this.executionTimer=performance.now(),this.afterSetup()}__cleanup(e){if(this.cleanupExecutions!==0)throw new Error("Cleanup must be called exactly once, and should never be called by a script directly.");if(this.setupExecutions!==1)throw new Error("Cleanup was called before setup");this.cleanupExecutions++,this.setIndicator("none");const t=performance.now();this.isDebug&&this.console.log(`Script execution took ${String(t-this.executionTimer)}ms`),this.done(this.preserve,e)}setIndicator(e="none"){this.internalState.indicator=e,this.setState({indicator:e})}wait(e){return new Promise(t=>setTimeout(t,e))}done(e,t){this.instance.postMessage(JSON.stringify({action:u.DONE,result:t,preserve:e}))}setState(e){this.instance.postMessage(JSON.stringify({action:u.SETSTATE,state:e}))}isRelativeUrl(e){return e.startsWith("/")}buildHeaders(e={}){return{...e,"X-Request-Type":"kizen-ui-scripting-api"}}refreshTimelineForId(e){e&&this.instance.postMessage(JSON.stringify({action:u.REFRESH_TIMELINE,entityId:e}))}refreshEntityForId(e){if(e)return this.refreshEntityHandler(e)}async installThirdPartyScript(e){try{const t=await this.installThirdPartyScriptHandler(e,this.args);return new A(this.instance,t.url)}catch{this.onError(new Error(`Third party script ${e} could not be installed.`))}}releaseBlockingScript(){this.instance.postMessage(JSON.stringify({action:u.RELEASE_BLOCKING_SCRIPT}))}copyToClipboard(e){this.instance.postMessage(JSON.stringify({action:u.COPY_TO_CLIPBOARD,text:e}))}createDateObject(e){if(typeof e!="string")throw new Error(`Invalid date string ${String(e)}`);if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error(`Date string ${e} is not in the format YYYY-MM-DD`);const t=e.split("-").map(s=>parseInt(s,10));if(t.length<3)throw new Error(`Date string ${e} could not be parsed into valid date parts`);return new Date(t[0],t[1]-1,t[2])}formatDateForResponse(e){return e.getTime()}},_=new x({isDebug:!1}),N=null,R=e=>()=>new Promise((t,r)=>{r(new Error(`${e} is not supported in calendar source scripts`))});self.onmessage=async e=>{const t=JSON.parse(e.data),{action:r,script:s,setup:a,args:c,sessionData:o={},pluginComponentId:n,pluginApiName:g,location:h}=t;if(r===u.RUN&&a&&s){const{fn:p,functionBody:E}=D(s);N=new W({user:a.user,teamMember:a.teamMember,business:a.business,clientObject:a.clientObject,isDebug:a.isDebug,appPath:a.appPath,scriptBody:s,functionBody:E,instance:self,kizenRequest:j(self,_),postFormData:F(self,_),uploadFile:R("uploadFile"),installThirdPartyScript:R("installThirdPartyScript"),args:c??"",sessionData:o,pluginComponentId:n,prompt:$(self,_),dynamicPrompt:J(self,_),refreshEntity:R("refreshEntity"),openCreateRecord:R("openCreateRecord"),openCreateRelatedRecord:R("openCreateRelatedRecord"),pluginApiName:g,location:h}),await p.bind(N)()}else L(r,e,_)}})();
@@ -0,0 +1,5 @@
1
+ (function(){"use strict";var a=(e,t)=>e.replace(/{{(.*?)}}/g,(s,r)=>o(r,t)),l=(e,t,n)=>{const s=`return ${a(e,t)};`;return n&&console.log(`Initial expression:
2
+ ${e}
3
+
4
+ Interpreted as:
5
+ ${s}`),new Function(s)()},o=(e,t)=>{const n=t[e];return n&&typeof n.value<"u"?JSON.stringify(n.value):"null"};self.onmessage=e=>{const t=JSON.parse(e.data),{expression:n,args:s,isDebug:r=!1}=t,u=l(n,s,r);self.postMessage(JSON.stringify({result:u}))}})();
@@ -0,0 +1,23 @@
1
+ var te=Object.defineProperty;var re=(l,h,S)=>h in l?te(l,h,{enumerable:!0,configurable:!0,writable:!0,value:S}):l[h]=S;var c=(l,h,S)=>re(l,typeof h!="symbol"?h+"":h,S);(function(){"use strict";var l={QUERY_REQUEST:"query:request",UI_OUTPUT:"outputui",IFRAME_OUTPUT:"iframeoutput",POSTFORMDATA_REQUEST:"postformdata:request",SETSTATE:"setstate",DONE:"done",RUN:"run",OPEN_WINDOW:"openwindow",COMMUNICATE:"communicate",HIDE:"hide",SHOW:"show",EXPAND:"expand",COLLAPSE:"collapse",HIDE_HEADER:"hideheader",SHOW_HEADER:"showheader",OPEN_CREATE_RECORD_MODAL_REQUEST:"opencreaterecordmodal:request",OPEN_CREATE_RELATED_RECORD_MODAL_REQUEST:"opencreaterelatedrecordmodal:request",SHOW_TOAST:"showtoast",CLEAR_TOASTS:"cleartoasts",REFRESH_TIMELINE:"refreshtimeline",REFRESH_ENTITY:"refreshentity",UPLOADFILE_REQUEST:"uploadfile:request",UPDATE_SESSION_DATA:"updatesessiondata",INSTALL_THIRD_PARTY_SCRIPT_REQUEST:"installthirdpartyscript:request",PROMPT_REQUEST:"prompt:request",DYNAMIC_PROMPT_REQUEST:"dynamicprompt:request",RELEASE_BLOCKING_SCRIPT:"releaseblockingscript",AUTHORIZE:"authorize",COPY_TO_CLIPBOARD:"copytoclipboard"},h={QUERY_RESPONSE:"query:response",POSTFORMDATA_RESPONSE:"postformdata:response",ERROR:"error",UPLOADFILE_RESPONSE:"uploadfile:response",INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:"installthirdpartyscript:response",PROMPT_RESPONSE:"prompt:response",REFRESH_ENTITY_RESPONSE:"refreshentity:response",CREATE_RECORD_RESPONSE:"createrecord:response",CREATE_RELATED_RECORD_RESPONSE:"createrelatedrecord:response"},S={RUN_FRAME_SCRIPT:"runframescript",SEND_MESSAGE_TO_FRAME:"sendmessagetoframe",CALL_THIRD_PARTY_SCRIPT:"callthirdpartyscript"},P=/https:\/\/.*widget\.freshworks\.com\/.*\.js/,b=/https:\/\/widget\.intercom\.io\/widget\/[a-z0-9]+/,T={FRESHWORKS:"freshworks",INTERCOM:"intercom"},A=e=>{if(P.test(e))return T.FRESHWORKS;if(b.test(e))return T.INTERCOM},C=class{constructor(e,t){c(this,"instance");c(this,"scriptUrl");c(this,"integration");this.instance=e,this.scriptUrl=t;const r=A(t);if(r)this.integration=r;else throw new Error(`Error: Disallowed script url: ${t}`)}get type(){return this.integration}call(...e){this.instance.postMessage(JSON.stringify({action:l.COMMUNICATE,type:S.CALL_THIRD_PARTY_SCRIPT,eventName:`thirdParty:${S.CALL_THIRD_PARTY_SCRIPT}`,recipient:{script:this.scriptUrl,type:this.type},params:e}))}},I=e=>({key:`action__${e.api_name}`,type:"custom_object",label:e.name,allow_multiple:!0}),N=(e,t)=>{var o;const r=(e.fields??[]).filter(i=>i.type!=="container"&&i.type!=="description").map(i=>({...i,when:t?`(${t}) && (${i.when??"true"})`:i.when})),a=(e.fields??[]).filter(i=>i.type==="container").flatMap(i=>N(i,i.when)),n=((o=e.actions)==null?void 0:o.filter(i=>i.hint_object_name))??[];return[...r,...a,...n.map(i=>({...I(i),match_hint:i.hint_object_name??""}))]},D=(e,t)=>{const s=N(e).reduce((o,i)=>({...o,[i.key]:i}),{}),a=Object.keys(t),n={};return a.forEach(o=>{var d,f;const i=t[o],E=s[o];if(E!=null&&E.type){switch(E.type){case"boolean":const p=i;if(!p)return;n[o]=p.value;return;case"custom_object":{const u=i;if(!u)return;n[o]={objectId:(d=u.value)==null?void 0:d.id,objectName:(f=u.value)==null?void 0:f.objectName};return}case"field":{const u=i;if(!(u!=null&&u.value))return;Array.isArray(u.value)?n[o]=u.value.map(g=>{var m,y;return{fieldId:g.value,fieldName:g.label,objectId:(m=u.associatedObject)==null?void 0:m.id,objectName:(y=u.associatedObject)==null?void 0:y.name}}):typeof u.value=="object"&&typeof u.associatedObject=="object"&&(n[o]={fieldId:u.value.value,fieldName:u.value.label,objectId:u.associatedObject.id,objectName:u.associatedObject.name});return}case"number":{const u=i;if(!u)return;try{const g=Number(u.value);if(!g&&g!==0)return;n[o]=g}catch{n[o]=NaN}return}case"select":{const u=i;if(!u)return;n[o]=u.value;return}case"text":{const u=i,g=u==null?void 0:u.value;if(g){n[o]=g;return}const m=E.default;m&&(n[o]=m);return}case"description":case"container":return}return i==null?void 0:i.value}}),n},M=(e,t)=>r=>async(s,a,n)=>new Promise((o,i)=>{const E=t.register(o,i);e.postMessage(JSON.stringify({action:l.QUERY_REQUEST,id:E,method:r,url:s,payload:a,options:n}))}),v=(e,t)=>(r,s,a=!0)=>new Promise((n,o)=>{const i=t.register(n,o);e.postMessage(JSON.stringify({action:l.POSTFORMDATA_REQUEST,url:r,id:i,payload:s,createNewTab:a}))}),H=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:l.PROMPT_REQUEST,id:n,config:r}))}),x=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:l.DYNAMIC_PROMPT_REQUEST,id:n,config:r}))}),U=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:l.UPLOADFILE_REQUEST,id:n,payload:r}))}),F=(e,t)=>(r,s)=>new Promise((a,n)=>{const o=t.register(a,n);e.postMessage(JSON.stringify({action:l.INSTALL_THIRD_PARTY_SCRIPT_REQUEST,url:r,id:o,args:s}))}),L=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:l.REFRESH_ENTITY,id:n,entityId:r}))}),j=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:l.OPEN_CREATE_RECORD_MODAL_REQUEST,id:n,entityId:r}))}),J=(e,t)=>(r,s)=>new Promise((a,n)=>{const o=t.register(a,n);e.postMessage(JSON.stringify({action:l.OPEN_CREATE_RELATED_RECORD_MODAL_REQUEST,id:o,objectId:r,relatedEntityId:s}))}),$=(e,t,r)=>{switch(e){case h.QUERY_RESPONSE:{const{id:s,data:a,error:n}=JSON.parse(t.data);n?r.reject(s,n):r.resolve(s,a);break}case h.POSTFORMDATA_RESPONSE:{const{id:s,success:a}=JSON.parse(t.data);a?r.resolve(s):r.reject(s);break}case h.UPLOADFILE_RESPONSE:{const{id:s,data:a,error:n}=JSON.parse(t.data);a?r.resolve(s,a):r.reject(s,n);break}case h.INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,a):r.reject(s);break}case h.PROMPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.CREATE_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.CREATE_RELATED_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.REFRESH_ENTITY_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,!0):r.reject(s);break}}},k=`integration:${S.RUN_FRAME_SCRIPT}`,B=class{constructor(e){c(this,"instance");this.instance=e}runFrameScript(e,t,r){this.instance.postMessage(JSON.stringify({action:l.COMMUNICATE,type:S.RUN_FRAME_SCRIPT,eventName:k,recipient:{frame:e,script:t},args:r}))}sendMessageToOwnFrame(e,t){this.instance.postMessage(JSON.stringify({action:l.COMMUNICATE,type:S.SEND_MESSAGE_TO_FRAME,args:{payload:e,path:t}}))}},_=async e=>{let t=null;try{t=await e.json()}catch{}return{status:e.status,statusText:e.statusText,body:t}},O=(e,t,r={},s="")=>{const n=`(${e.toString()})({ state: {{${t}}}, args: ${JSON.stringify(r)}, utils: __kizen_utils })`;return`(function() { ${s}
2
+ return ${n}; })()`},W=class{constructor({user:e,teamMember:t,business:r,clientObject:s,appPath:a,isDebug:n,kizenRequest:o,postFormData:i,scriptBody:E,instance:d,args:f,uploadFile:p,sessionData:u,pluginComponentId:g,installThirdPartyScript:m,prompt:y,refreshEntity:G,openCreateRecord:K,openCreateRelatedRecord:V,pluginApiName:X,dynamicPrompt:Z,location:ee}){c(this,"user");c(this,"teamMember");c(this,"business");c(this,"clientObject");c(this,"appPath");c(this,"dataCache",new Map);c(this,"queryOptions",{});c(this,"api");c(this,"postFormData");c(this,"executionTimer",0);c(this,"setupExecutions",0);c(this,"cleanupExecutions",0);c(this,"isDebug",!1);c(this,"scriptBody");c(this,"internalState",{indicator:"none"});c(this,"console",console);c(this,"instance");c(this,"breakOnException",!1);c(this,"args");c(this,"communicate");c(this,"shouldPreserve",!1);c(this,"uploadFileHandler");c(this,"internalSessionData");c(this,"pluginComponentId");c(this,"installThirdPartyScriptHandler");c(this,"promptHandler");c(this,"dynamicPromptHandler");c(this,"refreshEntityHandler");c(this,"openCreateRecordHandler");c(this,"openCreateRelatedRecordHandler");c(this,"runnerType");c(this,"pluginApiName");c(this,"tempPromptState",{});c(this,"partialLocation");this.user=e,this.teamMember=t,this.business=r,this.clientObject=s,this.partialLocation=ee,this.appPath=a,this.isDebug=n??!1,this.api={get:o("get"),post:o("post"),put:o("put"),delete:o("delete"),patch:o("patch")},this.postFormData=i,this.scriptBody=E,this.instance=d,this.communicate=new B(d),this.uploadFileHandler=p,this.internalSessionData=u??{},this.pluginComponentId=g,this.installThirdPartyScriptHandler=m,this.promptHandler=y,this.refreshEntityHandler=G,this.openCreateRecordHandler=K,this.openCreateRelatedRecordHandler=V,this.runnerType="base",this.pluginApiName=X,this.dynamicPromptHandler=Z;try{this.args=JSON.parse(f??"{}")}catch{this.args={}}}onError(e){if(this.breakOnException)debugger;this.instance.postMessage(JSON.stringify({action:h.ERROR,error:e==null?void 0:e.message}))}set debug(e){this.isDebug=e,this.breakOnException=e}set preserve(e){this.shouldPreserve=e}get preserve(){return this.shouldPreserve}parseDate(e){return e.split("-")}parsePhone(e){return e.replace(/\+/g,"")}openWindow(e,t="_blank"){this.instance.postMessage(JSON.stringify({action:l.OPEN_WINDOW,url:e,target:t,features:"noopener noreferrer"}))}authorize(e,t={}){if(!e)throw new Error("Service name is required to authorize");this.instance.postMessage(JSON.stringify({action:l.AUTHORIZE,serviceName:e,config:{successRedirectPath:t.successRedirectPath??`/marketplace/${this.pluginApiName}/auth`,errorRedirectPath:t.errorRedirectPath??`/marketplace/${this.pluginApiName}/auth`}}))}getServiceUrl(e,t){if(!e)throw new Error("Service name is required to get a service url");const r=`/external-integrations/proxy/${this.pluginApiName}/${e}`;return t.startsWith("/")?`${r}${t}`:`${r}/${t}`}get currentBusiness(){return this.business}get applicationPath(){return this.appPath}get currentUser(){var e,t,r,s,a,n,o,i;return{profile:{id:((e=this.teamMember)==null?void 0:e.id)??"",full_name:((t=this.teamMember)==null?void 0:t.full_name)??"",first_name:((r=this.teamMember)==null?void 0:r.first_name)??"",last_name:((s=this.teamMember)==null?void 0:s.last_name)??"",email:((a=this.teamMember)==null?void 0:a.email)??"",phone:((n=this.teamMember)==null?void 0:n.phone)??"",created:((o=this.teamMember)==null?void 0:o.created)??"",crm_client_id:((i=this.user)==null?void 0:i.crm_client_id)??""}}}get sessionData(){return this.internalSessionData}get config(){return!this.args.__kizen_clean_config?{}:new Proxy(this.args.__kizen_clean_config??{},{get:(r,s)=>{if(Reflect.has(r,s))return Reflect.get(r,s)}})}get location(){return new Proxy(this.partialLocation,{get:(e,t)=>{if(t==="toJSON")return()=>this.partialLocation;if(Reflect.has(e,t))return Reflect.get(e,t);throw new Error(`Property ${String(t)} is not available on location object for plugin apps`)}})}get userConfig(){var r;const e=(r=this.args.__kizen_user_config)==null?void 0:r.__kizen_clean_config;return e?new Proxy(e,{get:(s,a)=>{if(Reflect.has(s,a))return Reflect.get(s,a)}}):{}}setSessionData(e){if(typeof e!="object")throw new Error(`Invalid session update with type ${typeof e}`);if(Array.isArray(e))throw new Error("Invalid session update with type array");this.internalSessionData={...this.internalSessionData,...e},this.instance.postMessage(JSON.stringify({action:l.UPDATE_SESSION_DATA,update:e}))}async get(e,t){try{if(this.isRelativeUrl(e)){const r=this.dataCache.get(e);if(r&&!(t!=null&&t.ignoreCache))return t!=null&&t.returnErrors?[r.data,null]:r.data;const{data:s}=await this.api.get(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return this.dataCache.set(e,{ts:Date.now(),data:s}),t!=null&&t.returnErrors?[s,null]:s}else{const r=await fetch(e,{method:"GET",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await _(r);const s=await r.json();return t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async getWithErrors(e,t){return this.get(e,{...t,returnErrors:!0})}async getUserConfig(){var t;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");return((t=(await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0})).config)==null?void 0:t[this.pluginComponentId])??{}}async setUserConfig(e){var s;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");const t=await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0});return await this.post(`/employee/mine/configs/plugins/${this.args.pluginId}`,{config:{...t==null?void 0:t.config,[this.pluginComponentId]:{...(s=t==null?void 0:t.config)==null?void 0:s[this.pluginComponentId],...e}}})}async patch(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.patch(e,t,{...this.queryOptions,headers:r==null?void 0:r.headers});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"PATCH",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await _(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async patchWithErrors(e,t,r){return this.patch(e,t,{...r,returnErrors:!0})}async post(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.post(e,t,{...this.queryOptions,headers:this.buildHeaders(r==null?void 0:r.headers)});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"POST",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await _(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async postWithErrors(e,t,r){return this.post(e,t,{...r,returnErrors:!0})}async delete(e,t){try{if(this.isRelativeUrl(e)){const{data:r}=await this.api.delete(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return t!=null&&t.returnErrors?[r,null]:r}else{const r=await fetch(e,{method:"DELETE",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await _(r);let s=null;return r.status!==204&&(s=await r.json()),t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async deleteWithErrors(e,t){return this.delete(e,{...t,returnErrors:!0})}async openCreateRecordModal(e){return this.openCreateRecordHandler(e)}async openCreateRelatedRecordModal(e,t){return this.openCreateRelatedRecordHandler(e,t)}showToast(e,t){this.instance.postMessage(JSON.stringify({action:l.SHOW_TOAST,message:e,toastOptions:t}))}clearToasts(){this.instance.postMessage(JSON.stringify({action:l.CLEAR_TOASTS}))}outputUI(e){this.instance.postMessage(JSON.stringify({action:l.UI_OUTPUT,markup:e}))}prompt(e){return this.promptHandler(e)}async dynamicPrompt(e){var E;const t="__kizen_state";let r=`const __kizen_utils = {};
3
+ `;if(e.registerUtils){const d=Object.keys(e.registerUtils);r+=d.map(f=>{var u;const p=(u=e.registerUtils)==null?void 0:u[f];if(typeof p!="function")throw new Error(`Registered util ${f} is not a function, got ${typeof p}`);return`__kizen_utils["${f}"] = (${p.toString()});`}).join(`
4
+ `)}const s=(E=e.content)==null?void 0:E.map(d=>{let f="";"optionMapper"in d&&(f=O(d.optionMapper,t,d.args,r));let p="";"getFetchUrl"in d&&(p=O(d.getFetchUrl,t,d.args,r));let u="";"getHeaders"in d&&(u=O(d.getHeaders,t,d.args,r));let g="";return"getBody"in d&&(g=O(d.getBody,t,d.args,r)),{...d,optionMapper:f,getFetchUrl:p,getHeaders:u,getBody:g}}),a={...e,content:s},n={fields:a.content},o=await this.dynamicPromptHandler(a),i=D(n,o.values);return{...o,values:i}}outputIframe(e,t,r){this.instance.postMessage(JSON.stringify({action:l.IFRAME_OUTPUT,url:e,allow:t,sandbox:r,preserve:this.preserve}))}getBase64EncodedBlob(e){return new Promise((t,r)=>{const s=new FileReader;s.readAsDataURL(e),s.onload=()=>{t(s.result)},s.onerror=a=>{r(a)}})}async uploadFile(e,t,r=!1){const s=await this.getBase64EncodedBlob(e);return await this.uploadFileHandler({file:s,fileName:t??"file_"+String(Date.now()),isPublic:r})}afterSetup(){}__setup(){if(this.setupExecutions!==0)throw new Error("Setup must be called exactly once, and should never be called by a script directly.");if(this.cleanupExecutions!==0)throw new Error("Setup was called after cleanup");this.isDebug&&this.console.log(`Running script:
5
+
6
+ ${this.scriptBody}`),this.setupExecutions++,this.executionTimer=performance.now(),this.afterSetup()}__cleanup(e){if(this.cleanupExecutions!==0)throw new Error("Cleanup must be called exactly once, and should never be called by a script directly.");if(this.setupExecutions!==1)throw new Error("Cleanup was called before setup");this.cleanupExecutions++,this.setIndicator("none");const t=performance.now();this.isDebug&&this.console.log(`Script execution took ${String(t-this.executionTimer)}ms`),this.done(this.preserve,e)}setIndicator(e="none"){this.internalState.indicator=e,this.setState({indicator:e})}wait(e){return new Promise(t=>setTimeout(t,e))}done(e,t){this.instance.postMessage(JSON.stringify({action:l.DONE,result:t,preserve:e}))}setState(e){this.instance.postMessage(JSON.stringify({action:l.SETSTATE,state:e}))}isRelativeUrl(e){return e.startsWith("/")}buildHeaders(e={}){return{...e,"X-Request-Type":"kizen-ui-scripting-api"}}refreshTimelineForId(e){e&&this.instance.postMessage(JSON.stringify({action:l.REFRESH_TIMELINE,entityId:e}))}refreshEntityForId(e){if(e)return this.refreshEntityHandler(e)}async installThirdPartyScript(e){try{const t=await this.installThirdPartyScriptHandler(e,this.args);return new C(this.instance,t.url)}catch{this.onError(new Error(`Third party script ${e} could not be installed.`))}}releaseBlockingScript(){this.instance.postMessage(JSON.stringify({action:l.RELEASE_BLOCKING_SCRIPT}))}copyToClipboard(e){this.instance.postMessage(JSON.stringify({action:l.COPY_TO_CLIPBOARD,text:e}))}createDateObject(e){if(typeof e!="string")throw new Error(`Invalid date string ${String(e)}`);if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error(`Date string ${e} is not in the format YYYY-MM-DD`);const t=e.split("-").map(s=>parseInt(s,10));if(t.length<3)throw new Error(`Date string ${e} could not be parsed into valid date parts`);return new Date(t[0],t[1]-1,t[2])}formatDateForResponse(e){return e.getTime()}},Y=class extends W{constructor(e){super(e),this.runnerType="floatingFrame"}hide(e={}){this.instance.postMessage(JSON.stringify({action:l.HIDE,config:e}))}hideHeader(){this.instance.postMessage(JSON.stringify({action:l.HIDE_HEADER}))}showHeader(){this.instance.postMessage(JSON.stringify({action:l.SHOW_HEADER}))}show(e={}){this.instance.postMessage(JSON.stringify({action:l.SHOW,config:e}))}expand(){this.instance.postMessage(JSON.stringify({action:l.EXPAND}))}collapse(){this.instance.postMessage(JSON.stringify({action:l.COLLAPSE}))}afterSetup(){this.show()}},Q=()=>{let e=new Date().getTime();return typeof performance<"u"&&typeof performance.now=="function"&&(e+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const r=(e+Math.random()*16)%16|0;return e=Math.floor(e/16),(t==="x"?r:r&3|8).toString(16)})},w=Object.getPrototypeOf(async function(){}).constructor,q=e=>{const t=`
7
+ const __cleanup = this.__cleanup.bind(this);
8
+ const __error = this.onError.bind(this);
9
+ {
10
+ this.__setup();
11
+ }
12
+ try {
13
+ ${e}
14
+ } catch (ex) {
15
+ __error(ex);
16
+ } finally {
17
+ __cleanup();
18
+ }
19
+ `;try{return{fn:new w(t),functionBody:t}}catch{const r=`
20
+ this.__setup();
21
+ this.onError({ message: "The script has a syntax error and could not be parsed" });
22
+ this.__cleanup();
23
+ `;return{fn:new w(r),functionBody:r}}},z=class{constructor({isDebug:e=!1}){c(this,"promises");c(this,"isDebug");this.promises=new Map,this.isDebug=e}delete(e){this.isDebug&&console.log(`Deleting promise ${e}`),this.promises.delete(e)}get(e){return this.isDebug&&console.log(`Getting promise ${e}`),this.promises.get(e)}set(e,t,r){this.promises.set(e,{resolve:t,reject:r})}id(){return Q()}register(e,t){const r=this.id();return this.set(r,e,t),r}resolve(e,t){var r;(r=this.get(e))==null||r.resolve(t),this.delete(e)}reject(e,t){var r;(r=this.get(e))==null||r.reject(t),this.delete(e)}},R=new z({isDebug:!1});self.onmessage=async e=>{const t=JSON.parse(e.data),{action:r,script:s,setup:a,args:n,sessionData:o={},pluginComponentId:i,pluginApiName:E,location:d}=t;if(r===l.RUN&&a&&s){const{fn:f,functionBody:p}=q(s),u=new Y({user:a.user,teamMember:a.teamMember,business:a.business,clientObject:a.clientObject,appPath:a.appPath,isDebug:a.isDebug,scriptBody:s,functionBody:p,instance:self,kizenRequest:M(self,R),postFormData:v(self,R),uploadFile:U(self,R),installThirdPartyScript:F(self,R),args:n??"",sessionData:o,pluginComponentId:i,prompt:H(self,R),dynamicPrompt:x(self,R),refreshEntity:L(self,R),openCreateRecord:j(self,R),openCreateRelatedRecord:J(self,R),pluginApiName:E,location:d});await f.bind(u)()}else $(r,e,R)}})();
@@ -0,0 +1,23 @@
1
+ var te=Object.defineProperty;var re=(u,h,R)=>h in u?te(u,h,{enumerable:!0,configurable:!0,writable:!0,value:R}):u[h]=R;var c=(u,h,R)=>re(u,typeof h!="symbol"?h+"":h,R);(function(){"use strict";var u={QUERY_REQUEST:"query:request",UI_OUTPUT:"outputui",IFRAME_OUTPUT:"iframeoutput",POSTFORMDATA_REQUEST:"postformdata:request",SETSTATE:"setstate",DONE:"done",RUN:"run",OPEN_WINDOW:"openwindow",COMMUNICATE:"communicate",OPEN_CREATE_RECORD_MODAL_REQUEST:"opencreaterecordmodal:request",OPEN_CREATE_RELATED_RECORD_MODAL_REQUEST:"opencreaterelatedrecordmodal:request",SHOW_TOAST:"showtoast",CLEAR_TOASTS:"cleartoasts",REFRESH_TIMELINE:"refreshtimeline",REFRESH_ENTITY:"refreshentity",UPLOADFILE_REQUEST:"uploadfile:request",UPDATE_SESSION_DATA:"updatesessiondata",INSTALL_THIRD_PARTY_SCRIPT_REQUEST:"installthirdpartyscript:request",PROMPT_REQUEST:"prompt:request",DYNAMIC_PROMPT_REQUEST:"dynamicprompt:request",RELEASE_BLOCKING_SCRIPT:"releaseblockingscript",AUTHORIZE:"authorize",COPY_TO_CLIPBOARD:"copytoclipboard"},h={QUERY_RESPONSE:"query:response",POSTFORMDATA_RESPONSE:"postformdata:response",ERROR:"error",UPLOADFILE_RESPONSE:"uploadfile:response",INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:"installthirdpartyscript:response",PROMPT_RESPONSE:"prompt:response",REFRESH_ENTITY_RESPONSE:"refreshentity:response",CREATE_RECORD_RESPONSE:"createrecord:response",CREATE_RELATED_RECORD_RESPONSE:"createrelatedrecord:response"},R={RUN_FRAME_SCRIPT:"runframescript",SEND_MESSAGE_TO_FRAME:"sendmessagetoframe",CALL_THIRD_PARTY_SCRIPT:"callthirdpartyscript"},b=/https:\/\/.*widget\.freshworks\.com\/.*\.js/,C=/https:\/\/widget\.intercom\.io\/widget\/[a-z0-9]+/,y={FRESHWORKS:"freshworks",INTERCOM:"intercom"},A=e=>{if(b.test(e))return y.FRESHWORKS;if(C.test(e))return y.INTERCOM},I=class{constructor(e,t){c(this,"instance");c(this,"scriptUrl");c(this,"integration");this.instance=e,this.scriptUrl=t;const r=A(t);if(r)this.integration=r;else throw new Error(`Error: Disallowed script url: ${t}`)}get type(){return this.integration}call(...e){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:R.CALL_THIRD_PARTY_SCRIPT,eventName:`thirdParty:${R.CALL_THIRD_PARTY_SCRIPT}`,recipient:{script:this.scriptUrl,type:this.type},params:e}))}},v=()=>{let e=new Date().getTime();return typeof performance<"u"&&typeof performance.now=="function"&&(e+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const r=(e+Math.random()*16)%16|0;return e=Math.floor(e/16),(t==="x"?r:r&3|8).toString(16)})},P=Object.getPrototypeOf(async function(){}).constructor,M=e=>{const t=`
2
+ const __cleanup = this.__cleanup.bind(this);
3
+ const __error = this.onError.bind(this);
4
+ {
5
+ this.__setup();
6
+ }
7
+ try {
8
+ ${e}
9
+ } catch (ex) {
10
+ __error(ex);
11
+ } finally {
12
+ __cleanup();
13
+ }
14
+ `;try{return{fn:new P(t),functionBody:t}}catch{const r=`
15
+ this.__setup();
16
+ this.onError({ message: "The script has a syntax error and could not be parsed" });
17
+ this.__cleanup();
18
+ `;return{fn:new P(r),functionBody:r}}},D=class{constructor({isDebug:e=!1}){c(this,"promises");c(this,"isDebug");this.promises=new Map,this.isDebug=e}delete(e){this.isDebug&&console.log(`Deleting promise ${e}`),this.promises.delete(e)}get(e){return this.isDebug&&console.log(`Getting promise ${e}`),this.promises.get(e)}set(e,t,r){this.promises.set(e,{resolve:t,reject:r})}id(){return v()}register(e,t){const r=this.id();return this.set(r,e,t),r}resolve(e,t){var r;(r=this.get(e))==null||r.resolve(t),this.delete(e)}reject(e,t){var r;(r=this.get(e))==null||r.reject(t),this.delete(e)}},U=e=>({key:`action__${e.api_name}`,type:"custom_object",label:e.name,allow_multiple:!0}),w=(e,t)=>{var o;const r=(e.fields??[]).filter(i=>i.type!=="container"&&i.type!=="description").map(i=>({...i,when:t?`(${t}) && (${i.when??"true"})`:i.when})),a=(e.fields??[]).filter(i=>i.type==="container").flatMap(i=>w(i,i.when)),n=((o=e.actions)==null?void 0:o.filter(i=>i.hint_object_name))??[];return[...r,...a,...n.map(i=>({...U(i),match_hint:i.hint_object_name??""}))]},x=(e,t)=>{const s=w(e).reduce((o,i)=>({...o,[i.key]:i}),{}),a=Object.keys(t),n={};return a.forEach(o=>{var d,f;const i=t[o],E=s[o];if(E!=null&&E.type){switch(E.type){case"boolean":const p=i;if(!p)return;n[o]=p.value;return;case"custom_object":{const l=i;if(!l)return;n[o]={objectId:(d=l.value)==null?void 0:d.id,objectName:(f=l.value)==null?void 0:f.objectName};return}case"field":{const l=i;if(!(l!=null&&l.value))return;Array.isArray(l.value)?n[o]=l.value.map(g=>{var m,T;return{fieldId:g.value,fieldName:g.label,objectId:(m=l.associatedObject)==null?void 0:m.id,objectName:(T=l.associatedObject)==null?void 0:T.name}}):typeof l.value=="object"&&typeof l.associatedObject=="object"&&(n[o]={fieldId:l.value.value,fieldName:l.value.label,objectId:l.associatedObject.id,objectName:l.associatedObject.name});return}case"number":{const l=i;if(!l)return;try{const g=Number(l.value);if(!g&&g!==0)return;n[o]=g}catch{n[o]=NaN}return}case"select":{const l=i;if(!l)return;n[o]=l.value;return}case"text":{const l=i,g=l==null?void 0:l.value;if(g){n[o]=g;return}const m=E.default;m&&(n[o]=m);return}case"description":case"container":return}return i==null?void 0:i.value}}),n},H=(e,t)=>r=>async(s,a,n)=>new Promise((o,i)=>{const E=t.register(o,i);e.postMessage(JSON.stringify({action:u.QUERY_REQUEST,id:E,method:r,url:s,payload:a,options:n}))}),F=(e,t)=>(r,s,a=!0)=>new Promise((n,o)=>{const i=t.register(n,o);e.postMessage(JSON.stringify({action:u.POSTFORMDATA_REQUEST,url:r,id:i,payload:s,createNewTab:a}))}),j=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:u.PROMPT_REQUEST,id:n,config:r}))}),L=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:u.DYNAMIC_PROMPT_REQUEST,id:n,config:r}))}),J=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:u.UPLOADFILE_REQUEST,id:n,payload:r}))}),$=(e,t)=>(r,s)=>new Promise((a,n)=>{const o=t.register(a,n);e.postMessage(JSON.stringify({action:u.INSTALL_THIRD_PARTY_SCRIPT_REQUEST,url:r,id:o,args:s}))}),k=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:u.REFRESH_ENTITY,id:n,entityId:r}))}),B=(e,t)=>r=>new Promise((s,a)=>{const n=t.register(s,a);e.postMessage(JSON.stringify({action:u.OPEN_CREATE_RECORD_MODAL_REQUEST,id:n,entityId:r}))}),Y=(e,t)=>(r,s)=>new Promise((a,n)=>{const o=t.register(a,n);e.postMessage(JSON.stringify({action:u.OPEN_CREATE_RELATED_RECORD_MODAL_REQUEST,id:o,objectId:r,relatedEntityId:s}))}),Q=(e,t,r)=>{switch(e){case h.QUERY_RESPONSE:{const{id:s,data:a,error:n}=JSON.parse(t.data);n?r.reject(s,n):r.resolve(s,a);break}case h.POSTFORMDATA_RESPONSE:{const{id:s,success:a}=JSON.parse(t.data);a?r.resolve(s):r.reject(s);break}case h.UPLOADFILE_RESPONSE:{const{id:s,data:a,error:n}=JSON.parse(t.data);a?r.resolve(s,a):r.reject(s,n);break}case h.INSTALL_THIRD_PARTY_SCRIPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,a):r.reject(s);break}case h.PROMPT_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.CREATE_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.CREATE_RELATED_RECORD_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);r.resolve(s,a);break}case h.REFRESH_ENTITY_RESPONSE:{const{id:s,data:a}=JSON.parse(t.data);a.success?r.resolve(s,!0):r.reject(s);break}}},W=`integration:${R.RUN_FRAME_SCRIPT}`,q=class{constructor(e){c(this,"instance");this.instance=e}runFrameScript(e,t,r){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:R.RUN_FRAME_SCRIPT,eventName:W,recipient:{frame:e,script:t},args:r}))}sendMessageToOwnFrame(e,t){this.instance.postMessage(JSON.stringify({action:u.COMMUNICATE,type:R.SEND_MESSAGE_TO_FRAME,args:{payload:e,path:t}}))}},_=async e=>{let t=null;try{t=await e.json()}catch{}return{status:e.status,statusText:e.statusText,body:t}},O=(e,t,r={},s="")=>{const n=`(${e.toString()})({ state: {{${t}}}, args: ${JSON.stringify(r)}, utils: __kizen_utils })`;return`(function() { ${s}
19
+ return ${n}; })()`},z=class{constructor({user:e,teamMember:t,business:r,clientObject:s,appPath:a,isDebug:n,kizenRequest:o,postFormData:i,scriptBody:E,instance:d,args:f,uploadFile:p,sessionData:l,pluginComponentId:g,installThirdPartyScript:m,prompt:T,refreshEntity:G,openCreateRecord:K,openCreateRelatedRecord:V,pluginApiName:Z,dynamicPrompt:X,location:ee}){c(this,"user");c(this,"teamMember");c(this,"business");c(this,"clientObject");c(this,"appPath");c(this,"dataCache",new Map);c(this,"queryOptions",{});c(this,"api");c(this,"postFormData");c(this,"executionTimer",0);c(this,"setupExecutions",0);c(this,"cleanupExecutions",0);c(this,"isDebug",!1);c(this,"scriptBody");c(this,"internalState",{indicator:"none"});c(this,"console",console);c(this,"instance");c(this,"breakOnException",!1);c(this,"args");c(this,"communicate");c(this,"shouldPreserve",!1);c(this,"uploadFileHandler");c(this,"internalSessionData");c(this,"pluginComponentId");c(this,"installThirdPartyScriptHandler");c(this,"promptHandler");c(this,"dynamicPromptHandler");c(this,"refreshEntityHandler");c(this,"openCreateRecordHandler");c(this,"openCreateRelatedRecordHandler");c(this,"runnerType");c(this,"pluginApiName");c(this,"tempPromptState",{});c(this,"partialLocation");this.user=e,this.teamMember=t,this.business=r,this.clientObject=s,this.partialLocation=ee,this.appPath=a,this.isDebug=n??!1,this.api={get:o("get"),post:o("post"),put:o("put"),delete:o("delete"),patch:o("patch")},this.postFormData=i,this.scriptBody=E,this.instance=d,this.communicate=new q(d),this.uploadFileHandler=p,this.internalSessionData=l??{},this.pluginComponentId=g,this.installThirdPartyScriptHandler=m,this.promptHandler=T,this.refreshEntityHandler=G,this.openCreateRecordHandler=K,this.openCreateRelatedRecordHandler=V,this.runnerType="base",this.pluginApiName=Z,this.dynamicPromptHandler=X;try{this.args=JSON.parse(f??"{}")}catch{this.args={}}}onError(e){if(this.breakOnException)debugger;this.instance.postMessage(JSON.stringify({action:h.ERROR,error:e==null?void 0:e.message}))}set debug(e){this.isDebug=e,this.breakOnException=e}set preserve(e){this.shouldPreserve=e}get preserve(){return this.shouldPreserve}parseDate(e){return e.split("-")}parsePhone(e){return e.replace(/\+/g,"")}openWindow(e,t="_blank"){this.instance.postMessage(JSON.stringify({action:u.OPEN_WINDOW,url:e,target:t,features:"noopener noreferrer"}))}authorize(e,t={}){if(!e)throw new Error("Service name is required to authorize");this.instance.postMessage(JSON.stringify({action:u.AUTHORIZE,serviceName:e,config:{successRedirectPath:t.successRedirectPath??`/marketplace/${this.pluginApiName}/auth`,errorRedirectPath:t.errorRedirectPath??`/marketplace/${this.pluginApiName}/auth`}}))}getServiceUrl(e,t){if(!e)throw new Error("Service name is required to get a service url");const r=`/external-integrations/proxy/${this.pluginApiName}/${e}`;return t.startsWith("/")?`${r}${t}`:`${r}/${t}`}get currentBusiness(){return this.business}get applicationPath(){return this.appPath}get currentUser(){var e,t,r,s,a,n,o,i;return{profile:{id:((e=this.teamMember)==null?void 0:e.id)??"",full_name:((t=this.teamMember)==null?void 0:t.full_name)??"",first_name:((r=this.teamMember)==null?void 0:r.first_name)??"",last_name:((s=this.teamMember)==null?void 0:s.last_name)??"",email:((a=this.teamMember)==null?void 0:a.email)??"",phone:((n=this.teamMember)==null?void 0:n.phone)??"",created:((o=this.teamMember)==null?void 0:o.created)??"",crm_client_id:((i=this.user)==null?void 0:i.crm_client_id)??""}}}get sessionData(){return this.internalSessionData}get config(){return!this.args.__kizen_clean_config?{}:new Proxy(this.args.__kizen_clean_config??{},{get:(r,s)=>{if(Reflect.has(r,s))return Reflect.get(r,s)}})}get location(){return new Proxy(this.partialLocation,{get:(e,t)=>{if(t==="toJSON")return()=>this.partialLocation;if(Reflect.has(e,t))return Reflect.get(e,t);throw new Error(`Property ${String(t)} is not available on location object for plugin apps`)}})}get userConfig(){var r;const e=(r=this.args.__kizen_user_config)==null?void 0:r.__kizen_clean_config;return e?new Proxy(e,{get:(s,a)=>{if(Reflect.has(s,a))return Reflect.get(s,a)}}):{}}setSessionData(e){if(typeof e!="object")throw new Error(`Invalid session update with type ${typeof e}`);if(Array.isArray(e))throw new Error("Invalid session update with type array");this.internalSessionData={...this.internalSessionData,...e},this.instance.postMessage(JSON.stringify({action:u.UPDATE_SESSION_DATA,update:e}))}async get(e,t){try{if(this.isRelativeUrl(e)){const r=this.dataCache.get(e);if(r&&!(t!=null&&t.ignoreCache))return t!=null&&t.returnErrors?[r.data,null]:r.data;const{data:s}=await this.api.get(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return this.dataCache.set(e,{ts:Date.now(),data:s}),t!=null&&t.returnErrors?[s,null]:s}else{const r=await fetch(e,{method:"GET",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await _(r);const s=await r.json();return t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async getWithErrors(e,t){return this.get(e,{...t,returnErrors:!0})}async getUserConfig(){var t;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");return((t=(await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0})).config)==null?void 0:t[this.pluginComponentId])??{}}async setUserConfig(e){var s;if(!this.args.pluginId||!this.pluginComponentId)throw new Error("User config is not available for scripts not associated to a plugin or plugin component");const t=await this.get(`/employee/mine/configs/plugins/${this.args.pluginId}`,{ignoreCache:!0});return await this.post(`/employee/mine/configs/plugins/${this.args.pluginId}`,{config:{...t==null?void 0:t.config,[this.pluginComponentId]:{...(s=t==null?void 0:t.config)==null?void 0:s[this.pluginComponentId],...e}}})}async patch(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.patch(e,t,{...this.queryOptions,headers:r==null?void 0:r.headers});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"PATCH",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await _(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async patchWithErrors(e,t,r){return this.patch(e,t,{...r,returnErrors:!0})}async post(e,t,r){try{if(this.isRelativeUrl(e)){const{data:s}=await this.api.post(e,t,{...this.queryOptions,headers:this.buildHeaders(r==null?void 0:r.headers)});return r!=null&&r.returnErrors?[s,null]:s}else{const s=await fetch(e,{method:"POST",body:t?JSON.stringify(t):null,headers:new Headers(r==null?void 0:r.headers),credentials:(r==null?void 0:r.credentials)??"same-origin"});if(!s.ok)throw await _(s);const a=await s.json();return r!=null&&r.returnErrors?[a,null]:a}}catch(s){if(r!=null&&r.returnErrors)return[null,s];this.onError(s)}}async postWithErrors(e,t,r){return this.post(e,t,{...r,returnErrors:!0})}async delete(e,t){try{if(this.isRelativeUrl(e)){const{data:r}=await this.api.delete(e,{...this.queryOptions,headers:this.buildHeaders(t==null?void 0:t.headers)});return t!=null&&t.returnErrors?[r,null]:r}else{const r=await fetch(e,{method:"DELETE",headers:new Headers(t==null?void 0:t.headers),credentials:(t==null?void 0:t.credentials)??"same-origin"});if(!r.ok)throw await _(r);let s=null;return r.status!==204&&(s=await r.json()),t!=null&&t.returnErrors?[s,null]:s}}catch(r){if(t!=null&&t.returnErrors)return[null,r];this.onError(r)}}async deleteWithErrors(e,t){return this.delete(e,{...t,returnErrors:!0})}async openCreateRecordModal(e){return this.openCreateRecordHandler(e)}async openCreateRelatedRecordModal(e,t){return this.openCreateRelatedRecordHandler(e,t)}showToast(e,t){this.instance.postMessage(JSON.stringify({action:u.SHOW_TOAST,message:e,toastOptions:t}))}clearToasts(){this.instance.postMessage(JSON.stringify({action:u.CLEAR_TOASTS}))}outputUI(e){this.instance.postMessage(JSON.stringify({action:u.UI_OUTPUT,markup:e}))}prompt(e){return this.promptHandler(e)}async dynamicPrompt(e){var E;const t="__kizen_state";let r=`const __kizen_utils = {};
20
+ `;if(e.registerUtils){const d=Object.keys(e.registerUtils);r+=d.map(f=>{var l;const p=(l=e.registerUtils)==null?void 0:l[f];if(typeof p!="function")throw new Error(`Registered util ${f} is not a function, got ${typeof p}`);return`__kizen_utils["${f}"] = (${p.toString()});`}).join(`
21
+ `)}const s=(E=e.content)==null?void 0:E.map(d=>{let f="";"optionMapper"in d&&(f=O(d.optionMapper,t,d.args,r));let p="";"getFetchUrl"in d&&(p=O(d.getFetchUrl,t,d.args,r));let l="";"getHeaders"in d&&(l=O(d.getHeaders,t,d.args,r));let g="";return"getBody"in d&&(g=O(d.getBody,t,d.args,r)),{...d,optionMapper:f,getFetchUrl:p,getHeaders:l,getBody:g}}),a={...e,content:s},n={fields:a.content},o=await this.dynamicPromptHandler(a),i=x(n,o.values);return{...o,values:i}}outputIframe(e,t,r){this.instance.postMessage(JSON.stringify({action:u.IFRAME_OUTPUT,url:e,allow:t,sandbox:r,preserve:this.preserve}))}getBase64EncodedBlob(e){return new Promise((t,r)=>{const s=new FileReader;s.readAsDataURL(e),s.onload=()=>{t(s.result)},s.onerror=a=>{r(a)}})}async uploadFile(e,t,r=!1){const s=await this.getBase64EncodedBlob(e);return await this.uploadFileHandler({file:s,fileName:t??"file_"+String(Date.now()),isPublic:r})}afterSetup(){}__setup(){if(this.setupExecutions!==0)throw new Error("Setup must be called exactly once, and should never be called by a script directly.");if(this.cleanupExecutions!==0)throw new Error("Setup was called after cleanup");this.isDebug&&this.console.log(`Running script:
22
+
23
+ ${this.scriptBody}`),this.setupExecutions++,this.executionTimer=performance.now(),this.afterSetup()}__cleanup(e){if(this.cleanupExecutions!==0)throw new Error("Cleanup must be called exactly once, and should never be called by a script directly.");if(this.setupExecutions!==1)throw new Error("Cleanup was called before setup");this.cleanupExecutions++,this.setIndicator("none");const t=performance.now();this.isDebug&&this.console.log(`Script execution took ${String(t-this.executionTimer)}ms`),this.done(this.preserve,e)}setIndicator(e="none"){this.internalState.indicator=e,this.setState({indicator:e})}wait(e){return new Promise(t=>setTimeout(t,e))}done(e,t){this.instance.postMessage(JSON.stringify({action:u.DONE,result:t,preserve:e}))}setState(e){this.instance.postMessage(JSON.stringify({action:u.SETSTATE,state:e}))}isRelativeUrl(e){return e.startsWith("/")}buildHeaders(e={}){return{...e,"X-Request-Type":"kizen-ui-scripting-api"}}refreshTimelineForId(e){e&&this.instance.postMessage(JSON.stringify({action:u.REFRESH_TIMELINE,entityId:e}))}refreshEntityForId(e){if(e)return this.refreshEntityHandler(e)}async installThirdPartyScript(e){try{const t=await this.installThirdPartyScriptHandler(e,this.args);return new I(this.instance,t.url)}catch{this.onError(new Error(`Third party script ${e} could not be installed.`))}}releaseBlockingScript(){this.instance.postMessage(JSON.stringify({action:u.RELEASE_BLOCKING_SCRIPT}))}copyToClipboard(e){this.instance.postMessage(JSON.stringify({action:u.COPY_TO_CLIPBOARD,text:e}))}createDateObject(e){if(typeof e!="string")throw new Error(`Invalid date string ${String(e)}`);if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error(`Date string ${e} is not in the format YYYY-MM-DD`);const t=e.split("-").map(s=>parseInt(s,10));if(t.length<3)throw new Error(`Date string ${e} could not be parsed into valid date parts`);return new Date(t[0],t[1]-1,t[2])}formatDateForResponse(e){return e.getTime()}},S=new D({isDebug:!1}),N=null;self.onmessage=async e=>{const t=JSON.parse(e.data),{action:r,script:s,setup:a,args:n,sessionData:o={},pluginComponentId:i,pluginApiName:E,location:d}=t;if(r===u.RUN&&a&&s){const{fn:f,functionBody:p}=M(s);N=new z({user:a.user,teamMember:a.teamMember,business:a.business,clientObject:a.clientObject,isDebug:a.isDebug,appPath:a.appPath,scriptBody:s,functionBody:p,instance:self,kizenRequest:H(self,S),postFormData:F(self,S),uploadFile:J(self,S),installThirdPartyScript:$(self,S),args:n??"",sessionData:o,pluginComponentId:i,prompt:j(self,S),dynamicPrompt:L(self,S),refreshEntity:k(self,S),openCreateRecord:B(self,S),openCreateRelatedRecord:Y(self,S),pluginApiName:E,location:d}),await f.bind(N)()}else Q(r,e,S)}})();
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, Menlo, Consolas, "Liberation Mono", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-700:oklch(55.5% .163 48.998);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-700:oklch(52.7% .154 150.069);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-\[99999\]{z-index:99999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.block{display:block}.flex{display:flex}.hidden{display:none}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-28{width:calc(var(--spacing) * 28)}.w-\[26rem\]{width:26rem}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-black\/8{border-color:#00000014}@supports (color:color-mix(in lab,red,red)){.border-black\/8{border-color:color-mix(in oklab,var(--color-black) 8%,transparent)}}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.border-black\/20{border-color:#0003}@supports (color:color-mix(in lab,red,red)){.border-black\/20{border-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-green-100{background-color:var(--color-green-100)}.bg-green-400\/60{background-color:#05df7299}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/60{background-color:color-mix(in oklab,var(--color-green-400) 60%,transparent)}}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-400\/60{background-color:#ff656899}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/60{background-color:color-mix(in oklab,var(--color-red-400) 60%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.bg-white\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.bg-white\/85{background-color:color-mix(in oklab,var(--color-white) 85%,transparent)}}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-400\/60{background-color:#fac80099}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/60{background-color:color-mix(in oklab,var(--color-yellow-400) 60%,transparent)}}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-12{padding-block:calc(var(--spacing) * 12)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-pre{white-space:pre}.text-amber-700{color:var(--color-amber-700)}.text-green-700{color:var(--color-green-700)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-red-500{color:var(--color-red-500)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-700{color:var(--color-yellow-700)}.uppercase{text-transform:uppercase}.accent-neutral-800{accent-color:var(--color-neutral-800)}.opacity-30{opacity:.3}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab,var(--color-black) 5%,transparent)}}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:text-neutral-200:hover{color:var(--color-neutral-200)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}}.focus\:border-neutral-400:focus{border-color:var(--color-neutral-400)}.focus\:border-neutral-500:focus{border-color:var(--color-neutral-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-neutral-400:focus{--tw-ring-color:var(--color-neutral-400)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:opacity-50:disabled{opacity:.5}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}