@wix/web50-cli 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/web5.js +1 -2
- package/dist/cjs/auth/deviceFlow.js +90 -17
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/auth/index.js +40 -10
- package/dist/cjs/auth/index.js.map +1 -1
- package/dist/cjs/cli.js +3 -3
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/bundle.js +12 -4
- package/dist/cjs/commands/bundle.js.map +1 -1
- package/dist/cjs/commands/conversation.js.map +1 -1
- package/dist/cjs/commands/conversationWizard.js +3 -1
- package/dist/cjs/commands/conversationWizard.js.map +1 -1
- package/dist/cjs/commands/deploy.js +55 -10
- package/dist/cjs/commands/deploy.js.map +1 -1
- package/dist/cjs/commands/ecom.js +239 -0
- package/dist/cjs/commands/ecom.js.map +1 -0
- package/dist/cjs/commands/embed.js.map +1 -1
- package/dist/cjs/commands/init.js +34 -3
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/commands/instructions.js +147 -51
- package/dist/cjs/commands/instructions.js.map +1 -1
- package/dist/cjs/commands/login.js +8 -4
- package/dist/cjs/commands/login.js.map +1 -1
- package/dist/cjs/commands/serve.js.map +1 -1
- package/dist/cjs/commands/validate.js +368 -16
- package/dist/cjs/commands/validate.js.map +1 -1
- package/dist/cjs/commands/whoami.js.map +1 -1
- package/dist/cjs/templates/aiInstructionsSchema.js +5 -1
- package/dist/cjs/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/cjs/templates/cmsMappingSchema.js +132 -0
- package/dist/cjs/templates/cmsMappingSchema.js.map +1 -0
- package/dist/cjs/utils/project.js +13 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/cjs/utils/wixApi.js +3 -1
- package/dist/cjs/utils/wixApi.js.map +1 -1
- package/dist/esm/auth/deviceFlow.js +89 -17
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/auth/index.js +40 -11
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/cli.js +3 -3
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/bundle.js +12 -4
- package/dist/esm/commands/bundle.js.map +1 -1
- package/dist/esm/commands/conversation.js.map +1 -1
- package/dist/esm/commands/conversationWizard.js +3 -1
- package/dist/esm/commands/conversationWizard.js.map +1 -1
- package/dist/esm/commands/deploy.js +55 -10
- package/dist/esm/commands/deploy.js.map +1 -1
- package/dist/esm/commands/ecom.js +234 -0
- package/dist/esm/commands/ecom.js.map +1 -0
- package/dist/esm/commands/embed.js.map +1 -1
- package/dist/esm/commands/init.js +34 -3
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/instructions.js +152 -53
- package/dist/esm/commands/instructions.js.map +1 -1
- package/dist/esm/commands/login.js +8 -4
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/serve.js.map +1 -1
- package/dist/esm/commands/validate.js +373 -19
- package/dist/esm/commands/validate.js.map +1 -1
- package/dist/esm/commands/whoami.js.map +1 -1
- package/dist/esm/templates/aiInstructionsSchema.js +5 -1
- package/dist/esm/templates/aiInstructionsSchema.js.map +1 -1
- package/dist/esm/templates/cmsMappingSchema.js +128 -0
- package/dist/esm/templates/cmsMappingSchema.js.map +1 -0
- package/dist/esm/utils/project.js +15 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/esm/utils/wixApi.js +4 -2
- package/dist/esm/utils/wixApi.js.map +1 -1
- package/dist/types/auth/deviceFlow.d.ts +1 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/auth/index.d.ts +2 -1
- package/dist/types/auth/index.d.ts.map +1 -1
- package/dist/types/commands/bundle.d.ts.map +1 -1
- package/dist/types/commands/conversation.d.ts.map +1 -1
- package/dist/types/commands/conversationWizard.d.ts.map +1 -1
- package/dist/types/commands/deploy.d.ts.map +1 -1
- package/dist/types/commands/ecom.d.ts +3 -0
- package/dist/types/commands/ecom.d.ts.map +1 -0
- package/dist/types/commands/embed.d.ts.map +1 -1
- package/dist/types/commands/init.d.ts.map +1 -1
- package/dist/types/commands/instructions.d.ts.map +1 -1
- package/dist/types/commands/login.d.ts.map +1 -1
- package/dist/types/commands/serve.d.ts.map +1 -1
- package/dist/types/commands/validate.d.ts +4 -2
- package/dist/types/commands/validate.d.ts.map +1 -1
- package/dist/types/commands/whoami.d.ts.map +1 -1
- package/dist/types/templates/aiInstructionsSchema.d.ts.map +1 -1
- package/dist/types/templates/cmsMappingSchema.d.ts +2 -0
- package/dist/types/templates/cmsMappingSchema.d.ts.map +1 -0
- package/dist/types/utils/project.d.ts +2 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/dist/types/utils/wixApi.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/commands/getClientId.js +0 -60
- package/dist/cjs/commands/getClientId.js.map +0 -1
- package/dist/esm/commands/getClientId.js +0 -56
- package/dist/esm/commands/getClientId.js.map +0 -1
- package/dist/types/commands/getClientId.d.ts +0 -3
- package/dist/types/commands/getClientId.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Command","readline","fs","path","inquirer","chalk","ora","open","wixRequest","verbose","BOX_W","printHeader","breadcrumb","pad","repeat","Math","max","length","console","log","cyan","bold","printFooterHints","hints","line","dim","timeAgo","iso","diff","Date","now","getTime","mins","floor","hours","days","formatTime","toLocaleTimeString","hour","minute","truncate","text","clean","replace","trim","slice","renderMarkdownLine","h3","match","underline","h2","h1","_","t","yellow","renderMarkdown","split","map","join","pressEnterToContinue","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","close","buildRow","createdDate","label","time","ago","divider","white","showRootsScreen","spinner","start","roots","data","method","body","stop","messages","err","fail","error","red","message","type","clear","choices","r","i","name","triggerIdContent","content","value","Separator","rootIndex","prompt","pageSize","selected","messageId","id","userQuery","conversationId","showMessagesScreen","convLabel","msg","push","msgIndex","index","showMessageDetailScreen","isUser","role","icon","tid","triggerId","browserUrl","action","runWizard","verboseFlag","on","exit","screen","running","s","printMessages","format","view","_ref","JSON","stringify","green","getCmd","description","option","opts","answer","listCmd","sp","since","isNaN","filter","limit","parseInt","toLocaleString","exportCmd","requiredOption","outPath","ext","extname","toLowerCase","lines","writeFileSync","openCmd","wizardCmd","logs","includes","conversationsCommand","outputHelp","addCommand"],"sources":["../../../src/commands/conversationWizard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport { wixRequest } from '../utils/wixApi';\n\n// ── API response shapes ────────────────────────────────────────────────────\n\ninterface ConversationRoot {\n id?: string;\n triggerId?: string;\n conversationId?: string;\n content?: string;\n text?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface QueryRootsResponse {\n messages?: ConversationRoot[];\n}\n\ninterface ConversationMessage {\n id?: string;\n triggerId?: string;\n role?: 'user' | 'assistant' | string;\n content?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface GetConversationResponse {\n messages?: ConversationMessage[];\n}\n\n// ── Verbose flag ───────────────────────────────────────────────────────────\n\nlet verbose = false;\n\n// ── Wizard state ───────────────────────────────────────────────────────────\n\ntype WizardScreen =\n | { type: 'roots' }\n | {\n type: 'messages';\n messageId: string;\n userQuery: string;\n conversationId: string;\n }\n | {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n }\n | { type: 'exit' };\n\n// ── UI primitives ──────────────────────────────────────────────────────────\n\nconst BOX_W = 66;\n\n/** Double-border header box — visually distinct section for breadcrumbs */\nfunction printHeader(breadcrumb: string): void {\n const pad = ' '.repeat(Math.max(0, BOX_W - breadcrumb.length - 1));\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold(breadcrumb)}${pad}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n}\n\n/** Thin separator line with inline hint text */\nfunction printFooterHints(hints: string): void {\n const line = '─'.repeat(BOX_W + 2);\n console.log(chalk.dim(line));\n console.log(chalk.dim(` ${hints}`));\n console.log();\n}\n\n// ── Time helpers ───────────────────────────────────────────────────────────\n\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) {\n return 'unknown';\n }\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n const hours = Math.floor(diff / 3_600_000);\n const days = Math.floor(diff / 86_400_000);\n if (mins < 1) {\n return 'just now';\n }\n if (mins < 60) {\n return `${mins}m ago`;\n }\n if (hours < 24) {\n return `${hours}h ago`;\n }\n return `${days}d ago`;\n}\n\nfunction formatTime(iso: string | undefined): string {\n if (!iso) {\n return '??:??';\n }\n try {\n return new Date(iso).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\nfunction truncate(text: string, max = 50): string {\n const clean = text\n .replace(/\\n/g, ' ')\n .replace(/<!--.*?-->/g, '')\n .trim();\n return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;\n}\n\n// ── Markdown renderer ──────────────────────────────────────────────────────\n\nfunction renderMarkdownLine(line: string): string {\n const h3 = line.match(/^### (.+)/);\n if (h3) {\n return chalk.bold.underline(h3[1]);\n }\n const h2 = line.match(/^## (.+)/);\n if (h2) {\n return chalk.bold.underline(h2[1]);\n }\n const h1 = line.match(/^# (.+)/);\n if (h1) {\n return chalk.bold.underline(h1[1]);\n }\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, (_, t: string) => chalk.bold(t))\n .replace(/`([^`]+)`/g, (_, t: string) => chalk.yellow(t));\n}\n\nfunction renderMarkdown(text: string): string {\n return text.split('\\n').map(renderMarkdownLine).join('\\n');\n}\n\nfunction pressEnterToContinue(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(chalk.dim('\\nPress Enter to go back…'), () => {\n rl.close();\n resolve();\n });\n });\n}\n\n// ── Row builder ────────────────────────────────────────────────────────────\n\n/** Builds a single list row: 🕒 HH:MM (Nm ago) │ message text */\nfunction buildRow(createdDate: string | undefined, label: string): string {\n const time = chalk.dim(`🕒 ${formatTime(createdDate)}`);\n const ago = chalk.dim(`(${timeAgo(createdDate)})`);\n const divider = chalk.dim(' │ ');\n const text = chalk.white(truncate(label, 42));\n return ` ${time} ${ago}${divider}${text}`;\n}\n\n// ── Screens ────────────────────────────────────────────────────────────────\n\nasync function showRootsScreen(): Promise<WizardScreen> {\n const spinner = ora('Fetching conversations…').start();\n\n let roots: ConversationRoot[] = [];\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n spinner.stop();\n roots = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to fetch conversations');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (roots.length === 0) {\n console.clear();\n console.log(chalk.yellow('No conversations found.'));\n await pressEnterToContinue();\n return { type: 'exit' };\n }\n\n console.clear();\n printHeader(`📁 Conversations ${chalk.dim(`${roots.length} total`)}`);\n printFooterHints('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');\n\n const choices = [\n ...roots.map((r, i) => ({\n name: buildRow(\n r.createdDate,\n r.triggerIdContent ?? r.text ?? r.content ?? '(no content)',\n ),\n value: i,\n })),\n new inquirer.Separator('─'.repeat(BOX_W)),\n { name: ` ${chalk.red('✕ Exit')}`, value: -1 },\n ];\n\n const { rootIndex } = await inquirer.prompt<{ rootIndex: number }>([\n {\n type: 'list',\n name: 'rootIndex',\n message: chalk.bold('Select a conversation'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (rootIndex === -1) {\n return { type: 'exit' };\n }\n\n const selected = roots[rootIndex];\n return {\n type: 'messages',\n messageId: selected.id ?? '',\n userQuery: selected.triggerIdContent ?? '',\n conversationId: selected.conversationId ?? '',\n };\n}\n\nasync function showMessagesScreen(\n messageId: string,\n userQuery: string,\n conversationId: string,\n): Promise<WizardScreen> {\n if (!messageId) {\n console.error(chalk.red('No message ID — returning to root list.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n const spinner = ora('Loading conversation…').start();\n\n let messages: ConversationMessage[] = [];\n try {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${messageId}`,\n verbose,\n });\n spinner.stop();\n messages = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to load conversation');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (messages.length === 0) {\n console.clear();\n console.log(chalk.yellow('No messages in this conversation.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n console.clear();\n const convLabel = conversationId || messageId.slice(0, 12) + '…';\n printHeader(\n `📁 Conversations ❯ 💬 ${convLabel} ${chalk.dim(\n `${messages.length} messages`,\n )}`,\n );\n printFooterHints('[↑↓] Navigate [Enter] Expand [Ctrl+C] Quit');\n\n const choices: (\n | { name: string; value: number }\n | InstanceType<typeof inquirer.Separator>\n )[] = messages.map((msg, i) => ({\n name: buildRow(\n msg.createdDate,\n msg.triggerIdContent ?? msg.content ?? '(no query)',\n ),\n value: i,\n }));\n\n choices.push(new inquirer.Separator('─'.repeat(BOX_W)));\n choices.push({ name: ` ${chalk.dim('← Back')}`, value: -1 });\n choices.push({ name: ` ${chalk.red('✕ Exit')}`, value: -2 });\n\n const { msgIndex } = await inquirer.prompt<{ msgIndex: number }>([\n {\n type: 'list',\n name: 'msgIndex',\n message: chalk.bold('Select a message to expand'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (msgIndex === -2) {\n return { type: 'exit' };\n }\n if (msgIndex === -1) {\n return { type: 'roots' };\n }\n return {\n type: 'message-detail',\n messages,\n messageId,\n userQuery,\n conversationId,\n index: msgIndex,\n };\n}\n\nasync function showMessageDetailScreen(\n messages: ConversationMessage[],\n index: number,\n conversationId: string,\n): Promise<void> {\n console.clear();\n\n const msg = messages[index];\n if (!msg) {\n console.error(chalk.red('Message not found.'));\n return;\n }\n\n const isUser = msg.role === 'user';\n const icon = isUser ? '👤' : '🤖';\n const label = isUser ? 'User Query' : 'AI Response';\n const convLabel = conversationId || 'message';\n\n printHeader(`📁 Conversations ❯ 💬 ${convLabel} ❯ ${icon} ${label}`);\n\n // Metadata row\n console.log(\n chalk.dim(\n ` 🕒 ${formatTime(msg.createdDate)} (${timeAgo(msg.createdDate)})\\n`,\n ),\n );\n\n // Content\n const content = msg.content ?? '(empty)';\n console.log(isUser ? chalk.cyan(content) : renderMarkdown(content));\n console.log();\n\n // Action section\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold('Actions')}${' '.repeat(\n BOX_W - 9,\n )}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n\n const tid = msg.triggerId ?? '';\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${tid}`;\n\n const { action } = await inquirer.prompt<{ action: string }>([\n {\n type: 'list',\n name: 'action',\n message: chalk.bold('What would you like to do?'),\n choices: [\n { name: ` ${chalk.dim('← Back')}`, value: 'back' },\n { name: ` 🌐 Open in browser`, value: 'browser' },\n ],\n },\n ]);\n\n if (action === 'browser') {\n await open(browserUrl);\n }\n}\n\n// ── Main loop ──────────────────────────────────────────────────────────────\n\nasync function runWizard(verboseFlag: boolean): Promise<void> {\n verbose = verboseFlag;\n process.on('SIGINT', () => {\n console.log(chalk.dim('\\nBye.\\n'));\n process.exit(0);\n });\n\n let screen: WizardScreen = { type: 'roots' };\n let running = true;\n\n while (running) {\n switch (screen.type) {\n case 'roots':\n screen = await showRootsScreen();\n break;\n\n case 'messages':\n screen = await showMessagesScreen(\n screen.messageId,\n screen.userQuery,\n screen.conversationId,\n );\n break;\n\n case 'message-detail': {\n const s: {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n } = screen;\n await showMessageDetailScreen(s.messages, s.index, s.conversationId);\n screen = {\n type: 'messages',\n messageId: s.messageId,\n userQuery: s.userQuery,\n conversationId: s.conversationId,\n };\n break;\n }\n\n case 'exit':\n console.clear();\n console.log(chalk.dim('Bye.\\n'));\n running = false;\n break;\n }\n }\n process.exit(0);\n}\n\n// ── Subcommands ────────────────────────────────────────────────────────────\n\ninterface ConversationDetail {\n id?: string;\n triggerId?: string;\n active?: boolean;\n messages?: ConversationMessage[];\n [key: string]: unknown;\n}\n\n// ── get ────────────────────────────────────────────────────────────────────\n\nfunction printMessages(messages: ConversationMessage[], format: string): void {\n if (messages.length === 0) {\n console.log('(no messages)');\n return;\n }\n if (format === 'json') {\n const view = messages.map(({ role, content, createdDate }) => ({ role, content, createdDate }));\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n for (const msg of messages) {\n const isUser = msg.role === 'user';\n const role = isUser ? chalk.cyan('user: ') : chalk.green('assistant:');\n const time = msg.createdDate ? chalk.dim(` [${formatTime(msg.createdDate)}]`) : '';\n const text = (isUser ? (msg.triggerIdContent ?? msg.content) : msg.content) ?? '(empty)';\n console.log(`${role}${time}`);\n console.log(text);\n console.log();\n }\n}\n\nconst getCmd = new Command('get')\n .description('Get a conversation by message ID (--id) or trigger ID (--tid)')\n .option('--id <id>', 'Message ID — from conversations list')\n .option('--tid <tid>', 'Trigger ID (TID)')\n .option('--format <format>', 'Output format: text (default) or json', 'text')\n .action(async (opts: { id?: string; tid?: string; format?: string }) => {\n try {\n if (opts.id) {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${opts.id}`,\n verbose,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n return;\n }\n\n let tid: string = opts.tid ?? '';\n if (!tid) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n tid = await new Promise<string>((resolve) => {\n rl.question('Enter trigger ID (TID): ', (answer) => { rl.close(); resolve(answer.trim()); });\n });\n }\n if (!tid) {\n console.error('Error: provide --id <message-id> or --tid <trigger-id>');\n process.exit(1);\n }\n\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nconst listCmd = new Command('list')\n .description('List conversations (non-interactive)')\n .option('--limit <n>', 'Maximum number of conversations to show', '50')\n .option('--since <date>', 'Only show conversations created after this ISO date')\n .action(async (opts: { limit?: string; since?: string }) => {\n const sp = ora('Fetching conversations…').start();\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n sp.stop();\n\n let roots = data.messages ?? [];\n\n if (opts.since) {\n const since = new Date(opts.since).getTime();\n if (isNaN(since)) {\n console.error('Error: --since must be a valid ISO date string');\n process.exit(1);\n }\n roots = roots.filter((r) => {\n if (!r.createdDate) return true;\n return new Date(r.createdDate).getTime() >= since;\n });\n }\n\n const limit = parseInt(opts.limit ?? '50', 10);\n roots = roots.slice(0, limit);\n\n if (roots.length === 0) {\n console.log(chalk.yellow('No conversations found.'));\n return;\n }\n for (const r of roots) {\n const label = truncate(r.triggerIdContent ?? r.text ?? r.content ?? '(no content)', 80);\n const time = r.createdDate\n ? chalk.dim(`[${new Date(r.createdDate).toLocaleString()}] `)\n : '';\n const id = r.id ? chalk.dim(` --id ${r.id}`) : '';\n console.log(`${time}${label}${id}`);\n }\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── export ─────────────────────────────────────────────────────────────────\n\nconst exportCmd = new Command('export')\n .description('Export a conversation to a file')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .requiredOption('--output <file>', 'Output file path (.json or .md)')\n .action(async (opts: { id: string; output: string }) => {\n const sp = ora(`Fetching conversation ${opts.id}…`).start();\n try {\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${opts.id}`,\n });\n sp.stop();\n\n const outPath = path.resolve(opts.output);\n const ext = path.extname(outPath).toLowerCase();\n\n if (ext === '.md') {\n const messages = data.messages ?? [];\n const lines: string[] = [`# Conversation ${opts.id}`, ''];\n for (const msg of messages) {\n const role = msg.role === 'user' ? '**User**' : '**Assistant**';\n const time = msg.createdDate ? ` _(${msg.createdDate})_` : '';\n lines.push(`### ${role}${time}`, '', msg.content ?? '(empty)', '');\n }\n fs.writeFileSync(outPath, lines.join('\\n'), 'utf8');\n } else {\n fs.writeFileSync(outPath, JSON.stringify(data, null, 2), 'utf8');\n }\n\n console.log(`Exported conversation to ${outPath}`);\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── open ───────────────────────────────────────────────────────────────────\n\nconst openCmd = new Command('open')\n .description('Open a conversation in the browser')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .action(async (opts: { id: string }) => {\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${opts.id}`;\n console.log(`Opening ${browserUrl}`);\n await open(browserUrl);\n });\n\n// ── Command export ─────────────────────────────────────────────────────────\n\nconst wizardCmd = new Command('wizard')\n .description('Open the interactive TUI to browse conversation history')\n .option('--logs', 'Print raw API requests and responses for debugging')\n .action(async (opts) => {\n try {\n await runWizard(opts.logs ?? false);\n } catch (err) {\n const msg = (err as Error).message ?? '';\n if (msg.includes('force closed') || msg.includes('User force')) {\n console.log(chalk.dim('\\nBye.'));\n process.exit(0);\n }\n console.error(chalk.red('Unexpected error: ' + msg));\n process.exit(1);\n }\n });\n\nexport const conversationsCommand = new Command('conversations')\n .description('Conversation history')\n .action(function (this: Command) {\n this.outputHelp();\n })\n .addCommand(wizardCmd)\n .addCommand(getCmd)\n .addCommand(listCmd)\n .addCommand(exportCmd)\n .addCommand(openCmd);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Command","readline","fs","path","inquirer","chalk","ora","open","wixRequest","verbose","BOX_W","printHeader","breadcrumb","pad","repeat","Math","max","length","console","log","cyan","bold","printFooterHints","hints","line","dim","timeAgo","iso","diff","Date","now","getTime","mins","floor","hours","days","formatTime","toLocaleTimeString","hour","minute","truncate","text","clean","replace","trim","slice","renderMarkdownLine","h3","match","underline","h2","h1","_","t","yellow","renderMarkdown","split","map","join","pressEnterToContinue","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","close","buildRow","createdDate","label","time","ago","divider","white","showRootsScreen","spinner","start","roots","data","method","body","stop","messages","err","fail","error","red","message","type","clear","choices","r","i","name","triggerIdContent","content","value","Separator","rootIndex","prompt","pageSize","selected","messageId","id","userQuery","conversationId","showMessagesScreen","convLabel","msg","push","msgIndex","index","showMessageDetailScreen","isUser","role","icon","tid","triggerId","browserUrl","action","runWizard","verboseFlag","on","exit","screen","running","s","printMessages","format","view","_ref","JSON","stringify","green","getCmd","description","option","opts","answer","listCmd","sp","since","isNaN","filter","limit","parseInt","toLocaleString","exportCmd","requiredOption","outPath","ext","extname","toLowerCase","lines","writeFileSync","openCmd","wizardCmd","logs","includes","conversationsCommand","outputHelp","addCommand"],"sources":["../../../src/commands/conversationWizard.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport open from 'open';\nimport { wixRequest } from '../utils/wixApi';\n\n// ── API response shapes ────────────────────────────────────────────────────\n\ninterface ConversationRoot {\n id?: string;\n triggerId?: string;\n conversationId?: string;\n content?: string;\n text?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface QueryRootsResponse {\n messages?: ConversationRoot[];\n}\n\ninterface ConversationMessage {\n id?: string;\n triggerId?: string;\n role?: 'user' | 'assistant' | string;\n content?: string;\n triggerIdContent?: string;\n createdDate?: string;\n}\n\ninterface GetConversationResponse {\n messages?: ConversationMessage[];\n}\n\n// ── Verbose flag ───────────────────────────────────────────────────────────\n\nlet verbose = false;\n\n// ── Wizard state ───────────────────────────────────────────────────────────\n\ntype WizardScreen =\n | { type: 'roots' }\n | {\n type: 'messages';\n messageId: string;\n userQuery: string;\n conversationId: string;\n }\n | {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n }\n | { type: 'exit' };\n\n// ── UI primitives ──────────────────────────────────────────────────────────\n\nconst BOX_W = 66;\n\n/** Double-border header box — visually distinct section for breadcrumbs */\nfunction printHeader(breadcrumb: string): void {\n const pad = ' '.repeat(Math.max(0, BOX_W - breadcrumb.length - 1));\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold(breadcrumb)}${pad}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n}\n\n/** Thin separator line with inline hint text */\nfunction printFooterHints(hints: string): void {\n const line = '─'.repeat(BOX_W + 2);\n console.log(chalk.dim(line));\n console.log(chalk.dim(` ${hints}`));\n console.log();\n}\n\n// ── Time helpers ───────────────────────────────────────────────────────────\n\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) {\n return 'unknown';\n }\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n const hours = Math.floor(diff / 3_600_000);\n const days = Math.floor(diff / 86_400_000);\n if (mins < 1) {\n return 'just now';\n }\n if (mins < 60) {\n return `${mins}m ago`;\n }\n if (hours < 24) {\n return `${hours}h ago`;\n }\n return `${days}d ago`;\n}\n\nfunction formatTime(iso: string | undefined): string {\n if (!iso) {\n return '??:??';\n }\n try {\n return new Date(iso).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return iso;\n }\n}\n\nfunction truncate(text: string, max = 50): string {\n const clean = text\n .replace(/\\n/g, ' ')\n .replace(/<!--.*?-->/g, '')\n .trim();\n return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;\n}\n\n// ── Markdown renderer ──────────────────────────────────────────────────────\n\nfunction renderMarkdownLine(line: string): string {\n const h3 = line.match(/^### (.+)/);\n if (h3) {\n return chalk.bold.underline(h3[1]);\n }\n const h2 = line.match(/^## (.+)/);\n if (h2) {\n return chalk.bold.underline(h2[1]);\n }\n const h1 = line.match(/^# (.+)/);\n if (h1) {\n return chalk.bold.underline(h1[1]);\n }\n return line\n .replace(/\\*\\*(.+?)\\*\\*/g, (_, t: string) => chalk.bold(t))\n .replace(/`([^`]+)`/g, (_, t: string) => chalk.yellow(t));\n}\n\nfunction renderMarkdown(text: string): string {\n return text.split('\\n').map(renderMarkdownLine).join('\\n');\n}\n\nfunction pressEnterToContinue(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(chalk.dim('\\nPress Enter to go back…'), () => {\n rl.close();\n resolve();\n });\n });\n}\n\n// ── Row builder ────────────────────────────────────────────────────────────\n\n/** Builds a single list row: 🕒 HH:MM (Nm ago) │ message text */\nfunction buildRow(createdDate: string | undefined, label: string): string {\n const time = chalk.dim(`🕒 ${formatTime(createdDate)}`);\n const ago = chalk.dim(`(${timeAgo(createdDate)})`);\n const divider = chalk.dim(' │ ');\n const text = chalk.white(truncate(label, 42));\n return ` ${time} ${ago}${divider}${text}`;\n}\n\n// ── Screens ────────────────────────────────────────────────────────────────\n\nasync function showRootsScreen(): Promise<WizardScreen> {\n const spinner = ora('Fetching conversations…').start();\n\n let roots: ConversationRoot[] = [];\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n spinner.stop();\n roots = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to fetch conversations');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (roots.length === 0) {\n console.clear();\n console.log(chalk.yellow('No conversations found.'));\n await pressEnterToContinue();\n return { type: 'exit' };\n }\n\n console.clear();\n printHeader(`📁 Conversations ${chalk.dim(`${roots.length} total`)}`);\n printFooterHints('[↑↓] Navigate [Enter] Select [Ctrl+C] Quit');\n\n const choices = [\n ...roots.map((r, i) => ({\n name: buildRow(\n r.createdDate,\n r.triggerIdContent ?? r.text ?? r.content ?? '(no content)',\n ),\n value: i,\n })),\n new inquirer.Separator('─'.repeat(BOX_W)),\n { name: ` ${chalk.red('✕ Exit')}`, value: -1 },\n ];\n\n const { rootIndex } = await inquirer.prompt<{ rootIndex: number }>([\n {\n type: 'list',\n name: 'rootIndex',\n message: chalk.bold('Select a conversation'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (rootIndex === -1) {\n return { type: 'exit' };\n }\n\n const selected = roots[rootIndex];\n return {\n type: 'messages',\n messageId: selected.id ?? '',\n userQuery: selected.triggerIdContent ?? '',\n conversationId: selected.conversationId ?? '',\n };\n}\n\nasync function showMessagesScreen(\n messageId: string,\n userQuery: string,\n conversationId: string,\n): Promise<WizardScreen> {\n if (!messageId) {\n console.error(chalk.red('No message ID — returning to root list.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n const spinner = ora('Loading conversation…').start();\n\n let messages: ConversationMessage[] = [];\n try {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${messageId}`,\n verbose,\n });\n spinner.stop();\n messages = data.messages ?? [];\n } catch (err) {\n spinner.fail('Failed to load conversation');\n console.error(chalk.red((err as Error).message));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n if (messages.length === 0) {\n console.clear();\n console.log(chalk.yellow('No messages in this conversation.'));\n await pressEnterToContinue();\n return { type: 'roots' };\n }\n\n console.clear();\n const convLabel = conversationId || messageId.slice(0, 12) + '…';\n printHeader(\n `📁 Conversations ❯ 💬 ${convLabel} ${chalk.dim(\n `${messages.length} messages`,\n )}`,\n );\n printFooterHints('[↑↓] Navigate [Enter] Expand [Ctrl+C] Quit');\n\n const choices: (\n | { name: string; value: number }\n | InstanceType<typeof inquirer.Separator>\n )[] = messages.map((msg, i) => ({\n name: buildRow(\n msg.createdDate,\n msg.triggerIdContent ?? msg.content ?? '(no query)',\n ),\n value: i,\n }));\n\n choices.push(new inquirer.Separator('─'.repeat(BOX_W)));\n choices.push({ name: ` ${chalk.dim('← Back')}`, value: -1 });\n choices.push({ name: ` ${chalk.red('✕ Exit')}`, value: -2 });\n\n const { msgIndex } = await inquirer.prompt<{ msgIndex: number }>([\n {\n type: 'list',\n name: 'msgIndex',\n message: chalk.bold('Select a message to expand'),\n choices,\n pageSize: 12,\n },\n ]);\n\n if (msgIndex === -2) {\n return { type: 'exit' };\n }\n if (msgIndex === -1) {\n return { type: 'roots' };\n }\n return {\n type: 'message-detail',\n messages,\n messageId,\n userQuery,\n conversationId,\n index: msgIndex,\n };\n}\n\nasync function showMessageDetailScreen(\n messages: ConversationMessage[],\n index: number,\n conversationId: string,\n): Promise<void> {\n console.clear();\n\n const msg = messages[index];\n if (!msg) {\n console.error(chalk.red('Message not found.'));\n return;\n }\n\n const isUser = msg.role === 'user';\n const icon = isUser ? '👤' : '🤖';\n const label = isUser ? 'User Query' : 'AI Response';\n const convLabel = conversationId || 'message';\n\n printHeader(`📁 Conversations ❯ 💬 ${convLabel} ❯ ${icon} ${label}`);\n\n // Metadata row\n console.log(\n chalk.dim(\n ` 🕒 ${formatTime(msg.createdDate)} (${timeAgo(msg.createdDate)})\\n`,\n ),\n );\n\n // Content\n const content = msg.content ?? '(empty)';\n console.log(isUser ? chalk.cyan(content) : renderMarkdown(content));\n console.log();\n\n // Action section\n console.log(chalk.cyan('╔' + '═'.repeat(BOX_W) + '╗'));\n console.log(\n `${chalk.cyan('║')} ${chalk.bold('Actions')}${' '.repeat(\n BOX_W - 9,\n )}${chalk.cyan('║')}`,\n );\n console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));\n console.log();\n\n const tid = msg.triggerId ?? '';\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${tid}`;\n\n const { action } = await inquirer.prompt<{ action: string }>([\n {\n type: 'list',\n name: 'action',\n message: chalk.bold('What would you like to do?'),\n choices: [\n { name: ` ${chalk.dim('← Back')}`, value: 'back' },\n { name: ` 🌐 Open in browser`, value: 'browser' },\n ],\n },\n ]);\n\n if (action === 'browser') {\n await open(browserUrl);\n }\n}\n\n// ── Main loop ──────────────────────────────────────────────────────────────\n\nasync function runWizard(verboseFlag: boolean): Promise<void> {\n verbose = verboseFlag;\n process.on('SIGINT', () => {\n console.log(chalk.dim('\\nBye.\\n'));\n process.exit(0);\n });\n\n let screen: WizardScreen = { type: 'roots' };\n let running = true;\n\n while (running) {\n switch (screen.type) {\n case 'roots':\n screen = await showRootsScreen();\n break;\n\n case 'messages':\n screen = await showMessagesScreen(\n screen.messageId,\n screen.userQuery,\n screen.conversationId,\n );\n break;\n\n case 'message-detail': {\n const s: {\n type: 'message-detail';\n messages: ConversationMessage[];\n messageId: string;\n userQuery: string;\n conversationId: string;\n index: number;\n } = screen;\n await showMessageDetailScreen(s.messages, s.index, s.conversationId);\n screen = {\n type: 'messages',\n messageId: s.messageId,\n userQuery: s.userQuery,\n conversationId: s.conversationId,\n };\n break;\n }\n\n case 'exit':\n console.clear();\n console.log(chalk.dim('Bye.\\n'));\n running = false;\n break;\n }\n }\n process.exit(0);\n}\n\n// ── Subcommands ────────────────────────────────────────────────────────────\n\ninterface ConversationDetail {\n id?: string;\n triggerId?: string;\n active?: boolean;\n messages?: ConversationMessage[];\n [key: string]: unknown;\n}\n\n// ── get ────────────────────────────────────────────────────────────────────\n\nfunction printMessages(messages: ConversationMessage[], format: string): void {\n if (messages.length === 0) {\n console.log('(no messages)');\n return;\n }\n if (format === 'json') {\n const view = messages.map(({ role, content, createdDate }) => ({\n role,\n content,\n createdDate,\n }));\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n for (const msg of messages) {\n const isUser = msg.role === 'user';\n const role = isUser ? chalk.cyan('user: ') : chalk.green('assistant:');\n const time = msg.createdDate\n ? chalk.dim(` [${formatTime(msg.createdDate)}]`)\n : '';\n const text =\n (isUser ? msg.triggerIdContent ?? msg.content : msg.content) ?? '(empty)';\n console.log(`${role}${time}`);\n console.log(text);\n console.log();\n }\n}\n\nconst getCmd = new Command('get')\n .description('Get a conversation by message ID (--id) or trigger ID (--tid)')\n .option('--id <id>', 'Message ID — from conversations list')\n .option('--tid <tid>', 'Trigger ID (TID)')\n .option('--format <format>', 'Output format: text (default) or json', 'text')\n .action(async (opts: { id?: string; tid?: string; format?: string }) => {\n try {\n if (opts.id) {\n const data = await wixRequest<GetConversationResponse>({\n path: `/web5/conversations/cli/by-message/${opts.id}`,\n verbose,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n return;\n }\n\n let tid: string = opts.tid ?? '';\n if (!tid) {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n tid = await new Promise<string>((resolve) => {\n rl.question('Enter trigger ID (TID): ', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n }\n if (!tid) {\n console.error('Error: provide --id <message-id> or --tid <trigger-id>');\n process.exit(1);\n }\n\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${tid}`,\n });\n printMessages(data.messages ?? [], opts.format ?? 'text');\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nconst listCmd = new Command('list')\n .description('List conversations (non-interactive)')\n .option('--limit <n>', 'Maximum number of conversations to show', '50')\n .option(\n '--since <date>',\n 'Only show conversations created after this ISO date',\n )\n .action(async (opts: { limit?: string; since?: string }) => {\n const sp = ora('Fetching conversations…').start();\n try {\n const data = await wixRequest<QueryRootsResponse>({\n path: '/web5/conversations/cli/roots/query',\n method: 'POST',\n body: {},\n verbose,\n });\n sp.stop();\n\n let roots = data.messages ?? [];\n\n if (opts.since) {\n const since = new Date(opts.since).getTime();\n if (isNaN(since)) {\n console.error('Error: --since must be a valid ISO date string');\n process.exit(1);\n }\n roots = roots.filter((r) => {\n if (!r.createdDate) {\n return true;\n }\n return new Date(r.createdDate).getTime() >= since;\n });\n }\n\n const limit = parseInt(opts.limit ?? '50', 10);\n roots = roots.slice(0, limit);\n\n if (roots.length === 0) {\n console.log(chalk.yellow('No conversations found.'));\n return;\n }\n for (const r of roots) {\n const label = truncate(\n r.triggerIdContent ?? r.text ?? r.content ?? '(no content)',\n 80,\n );\n const time = r.createdDate\n ? chalk.dim(`[${new Date(r.createdDate).toLocaleString()}] `)\n : '';\n const id = r.id ? chalk.dim(` --id ${r.id}`) : '';\n console.log(`${time}${label}${id}`);\n }\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── export ─────────────────────────────────────────────────────────────────\n\nconst exportCmd = new Command('export')\n .description('Export a conversation to a file')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .requiredOption('--output <file>', 'Output file path (.json or .md)')\n .action(async (opts: { id: string; output: string }) => {\n const sp = ora(`Fetching conversation ${opts.id}…`).start();\n try {\n const data = await wixRequest<ConversationDetail>({\n path: `/_api/conversation-history/v1/conversations/by-trigger/${opts.id}`,\n });\n sp.stop();\n\n const outPath = path.resolve(opts.output);\n const ext = path.extname(outPath).toLowerCase();\n\n if (ext === '.md') {\n const messages = data.messages ?? [];\n const lines: string[] = [`# Conversation ${opts.id}`, ''];\n for (const msg of messages) {\n const role = msg.role === 'user' ? '**User**' : '**Assistant**';\n const time = msg.createdDate ? ` _(${msg.createdDate})_` : '';\n lines.push(`### ${role}${time}`, '', msg.content ?? '(empty)', '');\n }\n fs.writeFileSync(outPath, lines.join('\\n'), 'utf8');\n } else {\n fs.writeFileSync(outPath, JSON.stringify(data, null, 2), 'utf8');\n }\n\n console.log(`Exported conversation to ${outPath}`);\n } catch (err) {\n sp.stop();\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n });\n\n// ── open ───────────────────────────────────────────────────────────────────\n\nconst openCmd = new Command('open')\n .description('Open a conversation in the browser')\n .requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation')\n .action(async (opts: { id: string }) => {\n const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${opts.id}`;\n console.log(`Opening ${browserUrl}`);\n await open(browserUrl);\n });\n\n// ── Command export ─────────────────────────────────────────────────────────\n\nconst wizardCmd = new Command('wizard')\n .description('Open the interactive TUI to browse conversation history')\n .option('--logs', 'Print raw API requests and responses for debugging')\n .action(async (opts) => {\n try {\n await runWizard(opts.logs ?? false);\n } catch (err) {\n const msg = (err as Error).message ?? '';\n if (msg.includes('force closed') || msg.includes('User force')) {\n console.log(chalk.dim('\\nBye.'));\n process.exit(0);\n }\n console.error(chalk.red('Unexpected error: ' + msg));\n process.exit(1);\n }\n });\n\nexport const conversationsCommand = new Command('conversations')\n .description('Conversation history')\n .action(function (this: Command) {\n this.outputHelp();\n })\n .addCommand(wizardCmd)\n .addCommand(getCmd)\n .addCommand(listCmd)\n .addCommand(exportCmd)\n .addCommand(openCmd);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
+
import { load as yamlLoad } from 'js-yaml';
|
|
4
5
|
import { findProjectRoot } from '../utils/project';
|
|
5
6
|
import { wixRequest } from '../utils/wixApi';
|
|
6
7
|
import { success, error, warn, spinner, step } from '../utils/print';
|
|
@@ -27,14 +28,32 @@ async function deployAiInstructions(root, opts) {
|
|
|
27
28
|
process.exit(1);
|
|
28
29
|
}
|
|
29
30
|
const content = fs.readFileSync(yamlPath, 'utf8');
|
|
31
|
+
const parsed = yamlLoad(content);
|
|
32
|
+
|
|
33
|
+
// Load action definitions from src/actions/*.yaml
|
|
34
|
+
const actionsDir = path.join(root, 'src', 'actions');
|
|
35
|
+
const actionInstruction = [];
|
|
36
|
+
if (fs.existsSync(actionsDir)) {
|
|
37
|
+
const files = fs.readdirSync(actionsDir).filter(f => f.endsWith('.yaml'));
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const action = yamlLoad(fs.readFileSync(path.join(actionsDir, file), 'utf8'));
|
|
40
|
+
if (action) {
|
|
41
|
+
actionInstruction.push(action);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const body = {
|
|
46
|
+
intents: parsed.intent ?? {},
|
|
47
|
+
semantics: parsed.semantics ?? {},
|
|
48
|
+
actions: actionInstruction,
|
|
49
|
+
content: parsed.instructions ?? ''
|
|
50
|
+
};
|
|
30
51
|
const sp = spinner('Deploying AI instructions...');
|
|
31
52
|
try {
|
|
32
53
|
const data = await wixRequest({
|
|
33
54
|
path: '/web5/instruction/cli',
|
|
34
55
|
method: 'POST',
|
|
35
|
-
body
|
|
36
|
-
instruction: content
|
|
37
|
-
}
|
|
56
|
+
body
|
|
38
57
|
});
|
|
39
58
|
sp.stop();
|
|
40
59
|
success(`AI instructions deployed (version ${data.instruction.version})`);
|
|
@@ -102,6 +121,23 @@ async function rollbackInstructions() {
|
|
|
102
121
|
}
|
|
103
122
|
}
|
|
104
123
|
|
|
124
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
function deriveValidationFilters(targets) {
|
|
127
|
+
const hasInstructions = targets.includes('instructions');
|
|
128
|
+
const hasComponents = targets.includes('components');
|
|
129
|
+
if (hasInstructions && hasComponents) {
|
|
130
|
+
return undefined; // validate everything
|
|
131
|
+
}
|
|
132
|
+
if (hasInstructions) {
|
|
133
|
+
return ['ai', 'actions'];
|
|
134
|
+
}
|
|
135
|
+
if (hasComponents) {
|
|
136
|
+
return ['cms', 'scripts', 'sections'];
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
|
|
105
141
|
// ── Stepped runner ────────────────────────────────────────────────────────────
|
|
106
142
|
|
|
107
143
|
async function runWithSteps(root, targets, opts) {
|
|
@@ -112,14 +148,19 @@ async function runWithSteps(root, targets, opts) {
|
|
|
112
148
|
|
|
113
149
|
// Calculate total steps
|
|
114
150
|
let totalSteps = 0;
|
|
115
|
-
if (!opts.skipValidate)
|
|
116
|
-
|
|
151
|
+
if (!opts.skipValidate) {
|
|
152
|
+
totalSteps++;
|
|
153
|
+
}
|
|
154
|
+
if (needsBundle && !opts.skipBundle) {
|
|
155
|
+
totalSteps++;
|
|
156
|
+
}
|
|
117
157
|
totalSteps++; // deploy
|
|
118
158
|
|
|
119
159
|
let currentStep = 0;
|
|
120
160
|
if (!opts.skipValidate) {
|
|
121
161
|
step(++currentStep, totalSteps, 'Verification');
|
|
122
|
-
const
|
|
162
|
+
const filters = deriveValidationFilters(targets);
|
|
163
|
+
const valid = runValidation(root, filters);
|
|
123
164
|
if (!valid) {
|
|
124
165
|
error('Verification failed. Fix errors before deploying.');
|
|
125
166
|
process.exit(1);
|
|
@@ -139,10 +180,14 @@ async function runWithSteps(root, targets, opts) {
|
|
|
139
180
|
}
|
|
140
181
|
step(++currentStep, totalSteps, 'Deploy');
|
|
141
182
|
for (const target of targets) {
|
|
142
|
-
if (target === 'components')
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
183
|
+
if (target === 'components') {
|
|
184
|
+
await deployComponents();
|
|
185
|
+
}
|
|
186
|
+
if (target === 'instructions') {
|
|
187
|
+
await deployAiInstructions(root, {
|
|
188
|
+
activate: opts.activate
|
|
189
|
+
});
|
|
190
|
+
}
|
|
146
191
|
}
|
|
147
192
|
console.log('');
|
|
148
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Command","fs","path","findProjectRoot","wixRequest","success","error","warn","spinner","step","execSync","runValidation","getProjectRoot","root","process","cwd","exit","deployAiInstructions","opts","yamlPath","join","existsSync","content","readFileSync","sp","data","method","body","instruction","stop","version","activate","sp2","err_","message","deployComponents","rollbackInstructions","query","instructions","active","find","i","previous","filter","sort","a","b","runWithSteps","targets","needsBundle","includes","totalSteps","skipValidate","skipBundle","currentStep","valid","stdio","target","console","log","instructionsCmd","description","option","action","componentsCmd","deployCommand","rollback","addCommand","on","_ref","cmd"],"sources":["../../../src/commands/deploy.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { findProjectRoot } from '../utils/project';\nimport { wixRequest } from '../utils/wixApi';\nimport { success, error, warn, spinner, step } from '../utils/print';\nimport { execSync } from 'child_process';\nimport { runValidation } from './validate';\n\nfunction getProjectRoot(): string {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n error(\n 'Not inside a web5 project. Run this command from your project directory.',\n );\n process.exit(1);\n }\n return root;\n}\n\n// ── Sub-deployers ─────────────────────────────────────────────────────────────\n\ninterface Instruction {\n id: string;\n version: number;\n content: string;\n active?: boolean;\n}\n\nasync function deployAiInstructions(\n root: string,\n opts: { activate?: boolean } = {},\n): Promise<void> {\n const yamlPath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n\n if (!fs.existsSync(yamlPath)) {\n error(`AI instructions file not found: ${yamlPath}`);\n process.exit(1);\n }\n\n const content = fs.readFileSync(yamlPath, 'utf8');\n const sp = spinner('Deploying AI instructions...');\n\n try {\n const data = await wixRequest<{ instruction: Instruction }>({\n path: '/web5/instruction/cli',\n method: 'POST',\n body: { instruction: content },\n });\n sp.stop();\n success(`AI instructions deployed (version ${data.instruction.version})`);\n\n if (opts.activate) {\n const version = data.instruction.version;\n const sp2 = spinner(`Activating version ${version}...`);\n try {\n await wixRequest({\n path: `/web5/instructions/cli/activate/${version}`,\n method: 'POST',\n });\n sp2.stop();\n success(`Activated version ${version}`);\n } catch (err_) {\n sp2.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n}\n\nasync function deployComponents(): Promise<void> {\n warn('Components deploy: to be developed');\n}\n\n// ── Rollback ──────────────────────────────────────────────────────────────────\n\nasync function rollbackInstructions(): Promise<void> {\n const sp = spinner('Fetching instructions for rollback...');\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: '/web5/instructions/cli/query',\n method: 'POST',\n body: { query: {} },\n });\n sp.stop();\n\n const instructions = data.instructions ?? [];\n const active = instructions.find((i) => i.active);\n if (!active) {\n error('No active instruction found — nothing to roll back from.');\n process.exit(1);\n }\n\n const previous = instructions\n .filter((i) => !i.active && i.version < active.version)\n .sort((a, b) => b.version - a.version)[0];\n\n if (!previous) {\n error(`No previous version found before v${active.version}.`);\n process.exit(1);\n }\n\n const sp2 = spinner(`Rolling back to version ${previous.version}...`);\n await wixRequest({\n path: `/web5/instructions/cli/activate/${previous.version}`,\n method: 'POST',\n });\n sp2.stop();\n success(`Rolled back to version ${previous.version} (was v${active.version})`);\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n}\n\n// ── Stepped runner ────────────────────────────────────────────────────────────\n\nasync function runWithSteps(\n root: string,\n targets: ('components' | 'instructions')[],\n opts: { skipValidate?: boolean; skipBundle?: boolean; activate?: boolean } = {},\n): Promise<void> {\n const needsBundle = targets.includes('components');\n\n // Calculate total steps\n let totalSteps = 0;\n if (!opts.skipValidate) totalSteps++;\n if (needsBundle && !opts.skipBundle) totalSteps++;\n totalSteps++; // deploy\n\n let currentStep = 0;\n\n if (!opts.skipValidate) {\n step(++currentStep, totalSteps, 'Verification');\n const valid = runValidation(root);\n if (!valid) {\n error('Verification failed. Fix errors before deploying.');\n process.exit(1);\n }\n }\n\n if (needsBundle && !opts.skipBundle) {\n step(++currentStep, totalSteps, 'Bundle');\n try {\n execSync('npm run bundle', { cwd: root, stdio: 'inherit' });\n } catch {\n error('Bundle failed. Fix errors before deploying.');\n process.exit(1);\n }\n }\n\n step(++currentStep, totalSteps, 'Deploy');\n for (const target of targets) {\n if (target === 'components') await deployComponents();\n if (target === 'instructions') await deployAiInstructions(root, { activate: opts.activate });\n }\n\n console.log('');\n}\n\n// ── Subcommands ───────────────────────────────────────────────────────────────\n\nconst instructionsCmd = new Command('instructions')\n .description(\n 'Deploy AI instructions from src/configuration/ai/prompt-instructions.yaml',\n )\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option('--activate', 'Automatically activate the deployed version')\n .action(async (opts: { skipValidate?: boolean; activate?: boolean }) => {\n const root = getProjectRoot();\n await runWithSteps(root, ['instructions'], {\n skipValidate: opts.skipValidate,\n activate: opts.activate,\n });\n });\n\nconst componentsCmd = new Command('components')\n .description('Deploy components')\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option('--skip-bundle', 'Skip the bundle step (reuse existing build artifact)')\n .action(async (opts: { skipValidate?: boolean; skipBundle?: boolean }) => {\n const root = getProjectRoot();\n await runWithSteps(root, ['components'], {\n skipValidate: opts.skipValidate,\n skipBundle: opts.skipBundle,\n });\n });\n\n// ── Root deploy command ───────────────────────────────────────────────────────\n\nexport const deployCommand = new Command('deploy')\n .description('Deploy project resources to the Web5 platform')\n .option('--target <target>', 'What to deploy: instructions, components, or all')\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option('--skip-bundle', 'Skip the bundle step (reuse existing build artifact)')\n .option('--rollback', 'Re-activate the previous instruction version')\n .action(async (opts: {\n target?: string;\n skipValidate?: boolean;\n skipBundle?: boolean;\n rollback?: boolean;\n }) => {\n const root = getProjectRoot();\n\n if (opts.rollback) {\n await rollbackInstructions();\n return;\n }\n\n type DeployTarget = 'components' | 'instructions';\n let targets: DeployTarget[];\n\n if (!opts.target || opts.target === 'all') {\n targets = ['components', 'instructions'];\n } else if (opts.target === 'instructions' || opts.target === 'components') {\n targets = [opts.target as DeployTarget];\n } else {\n error(`Unknown target: '${opts.target}'. Valid values: instructions, components, all`);\n process.exit(1);\n }\n\n await runWithSteps(root, targets, {\n skipValidate: opts.skipValidate,\n skipBundle: opts.skipBundle,\n });\n })\n .addCommand(instructionsCmd)\n .addCommand(componentsCmd);\n\ndeployCommand.on('command:*', ([cmd]: string[]) => {\n error(\n `Unknown deploy target: '${cmd}'. Valid targets: components, instructions`,\n );\n process.exit(1);\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Command","fs","path","load","yamlLoad","findProjectRoot","wixRequest","success","error","warn","spinner","step","execSync","runValidation","getProjectRoot","root","process","cwd","exit","deployAiInstructions","opts","yamlPath","join","existsSync","content","readFileSync","parsed","actionsDir","actionInstruction","files","readdirSync","filter","f","endsWith","file","action","push","body","intents","intent","semantics","actions","instructions","sp","data","method","stop","instruction","version","activate","sp2","err_","message","deployComponents","rollbackInstructions","query","active","find","i","previous","sort","a","b","deriveValidationFilters","targets","hasInstructions","includes","hasComponents","undefined","runWithSteps","needsBundle","totalSteps","skipValidate","skipBundle","currentStep","filters","valid","stdio","target","console","log","instructionsCmd","description","option","componentsCmd","deployCommand","rollback","addCommand","on","_ref","cmd"],"sources":["../../../src/commands/deploy.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { load as yamlLoad } from 'js-yaml';\nimport { findProjectRoot } from '../utils/project';\nimport { wixRequest } from '../utils/wixApi';\nimport { success, error, warn, spinner, step } from '../utils/print';\nimport { execSync } from 'child_process';\nimport { runValidation, DomainFilter } from './validate';\n\nfunction getProjectRoot(): string {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n error(\n 'Not inside a web5 project. Run this command from your project directory.',\n );\n process.exit(1);\n }\n return root;\n}\n\n// ── Sub-deployers ─────────────────────────────────────────────────────────────\n\ninterface Instruction {\n id: string;\n version: number;\n content: string;\n active?: boolean;\n}\n\nasync function deployAiInstructions(\n root: string,\n opts: { activate?: boolean } = {},\n): Promise<void> {\n const yamlPath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n\n if (!fs.existsSync(yamlPath)) {\n error(`AI instructions file not found: ${yamlPath}`);\n process.exit(1);\n }\n\n const content = fs.readFileSync(yamlPath, 'utf8');\n const parsed = yamlLoad(content) as {\n intent?: Record<string, string>;\n semantics?: Record<string, string>;\n instructions?: string;\n [key: string]: unknown;\n };\n\n // Load action definitions from src/actions/*.yaml\n const actionsDir = path.join(root, 'src', 'actions');\n const actionInstruction: unknown[] = [];\n if (fs.existsSync(actionsDir)) {\n const files = fs.readdirSync(actionsDir).filter((f) => f.endsWith('.yaml'));\n for (const file of files) {\n const action = yamlLoad(\n fs.readFileSync(path.join(actionsDir, file), 'utf8'),\n );\n if (action) {\n actionInstruction.push(action);\n }\n }\n }\n\n const body = {\n intents: parsed.intent ?? {},\n semantics: parsed.semantics ?? {},\n actions: actionInstruction,\n content: parsed.instructions ?? '',\n };\n\n const sp = spinner('Deploying AI instructions...');\n\n try {\n const data = await wixRequest<{ instruction: Instruction }>({\n path: '/web5/instruction/cli',\n method: 'POST',\n body,\n });\n sp.stop();\n success(`AI instructions deployed (version ${data.instruction.version})`);\n\n if (opts.activate) {\n const version = data.instruction.version;\n const sp2 = spinner(`Activating version ${version}...`);\n try {\n await wixRequest({\n path: `/web5/instructions/cli/activate/${version}`,\n method: 'POST',\n });\n sp2.stop();\n success(`Activated version ${version}`);\n } catch (err_) {\n sp2.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n }\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n}\n\nasync function deployComponents(): Promise<void> {\n warn('Components deploy: to be developed');\n}\n\n// ── Rollback ──────────────────────────────────────────────────────────────────\n\nasync function rollbackInstructions(): Promise<void> {\n const sp = spinner('Fetching instructions for rollback...');\n try {\n const data = await wixRequest<{ instructions: Instruction[] }>({\n path: '/web5/instructions/cli/query',\n method: 'POST',\n body: { query: {} },\n });\n sp.stop();\n\n const instructions = data.instructions ?? [];\n const active = instructions.find((i) => i.active);\n if (!active) {\n error('No active instruction found — nothing to roll back from.');\n process.exit(1);\n }\n\n const previous = instructions\n .filter((i) => !i.active && i.version < active.version)\n .sort((a, b) => b.version - a.version)[0];\n\n if (!previous) {\n error(`No previous version found before v${active.version}.`);\n process.exit(1);\n }\n\n const sp2 = spinner(`Rolling back to version ${previous.version}...`);\n await wixRequest({\n path: `/web5/instructions/cli/activate/${previous.version}`,\n method: 'POST',\n });\n sp2.stop();\n success(\n `Rolled back to version ${previous.version} (was v${active.version})`,\n );\n } catch (err_) {\n sp.stop();\n error((err_ as Error).message);\n process.exit(1);\n }\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction deriveValidationFilters(\n targets: ('components' | 'instructions')[],\n): DomainFilter[] | undefined {\n const hasInstructions = targets.includes('instructions');\n const hasComponents = targets.includes('components');\n if (hasInstructions && hasComponents) {\n return undefined; // validate everything\n }\n if (hasInstructions) {\n return ['ai', 'actions'];\n }\n if (hasComponents) {\n return ['cms', 'scripts', 'sections'];\n }\n return undefined;\n}\n\n// ── Stepped runner ────────────────────────────────────────────────────────────\n\nasync function runWithSteps(\n root: string,\n targets: ('components' | 'instructions')[],\n opts: {\n skipValidate?: boolean;\n skipBundle?: boolean;\n activate?: boolean;\n } = {},\n): Promise<void> {\n const needsBundle = targets.includes('components');\n\n // Calculate total steps\n let totalSteps = 0;\n if (!opts.skipValidate) {\n totalSteps++;\n }\n if (needsBundle && !opts.skipBundle) {\n totalSteps++;\n }\n totalSteps++; // deploy\n\n let currentStep = 0;\n\n if (!opts.skipValidate) {\n step(++currentStep, totalSteps, 'Verification');\n const filters = deriveValidationFilters(targets);\n const valid = runValidation(root, filters);\n if (!valid) {\n error('Verification failed. Fix errors before deploying.');\n process.exit(1);\n }\n }\n\n if (needsBundle && !opts.skipBundle) {\n step(++currentStep, totalSteps, 'Bundle');\n try {\n execSync('npm run bundle', { cwd: root, stdio: 'inherit' });\n } catch {\n error('Bundle failed. Fix errors before deploying.');\n process.exit(1);\n }\n }\n\n step(++currentStep, totalSteps, 'Deploy');\n for (const target of targets) {\n if (target === 'components') {\n await deployComponents();\n }\n if (target === 'instructions') {\n await deployAiInstructions(root, { activate: opts.activate });\n }\n }\n\n console.log('');\n}\n\n// ── Subcommands ───────────────────────────────────────────────────────────────\n\nconst instructionsCmd = new Command('instructions')\n .description(\n 'Deploy AI instructions from src/configuration/ai/prompt-instructions.yaml',\n )\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option('--activate', 'Automatically activate the deployed version')\n .action(async (opts: { skipValidate?: boolean; activate?: boolean }) => {\n const root = getProjectRoot();\n await runWithSteps(root, ['instructions'], {\n skipValidate: opts.skipValidate,\n activate: opts.activate,\n });\n });\n\nconst componentsCmd = new Command('components')\n .description('Deploy components')\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option(\n '--skip-bundle',\n 'Skip the bundle step (reuse existing build artifact)',\n )\n .action(async (opts: { skipValidate?: boolean; skipBundle?: boolean }) => {\n const root = getProjectRoot();\n await runWithSteps(root, ['components'], {\n skipValidate: opts.skipValidate,\n skipBundle: opts.skipBundle,\n });\n });\n\n// ── Root deploy command ───────────────────────────────────────────────────────\n\nexport const deployCommand = new Command('deploy')\n .description('Deploy project resources to the Web5 platform')\n .option(\n '--target <target>',\n 'What to deploy: instructions, components, or all',\n )\n .option('--skip-validate', 'Skip the pre-deploy validation step')\n .option(\n '--skip-bundle',\n 'Skip the bundle step (reuse existing build artifact)',\n )\n .option('--rollback', 'Re-activate the previous instruction version')\n .action(\n async (opts: {\n target?: string;\n skipValidate?: boolean;\n skipBundle?: boolean;\n rollback?: boolean;\n }) => {\n const root = getProjectRoot();\n\n if (opts.rollback) {\n await rollbackInstructions();\n return;\n }\n\n type DeployTarget = 'components' | 'instructions';\n let targets: DeployTarget[];\n\n if (!opts.target || opts.target === 'all') {\n targets = ['components', 'instructions'];\n } else if (\n opts.target === 'instructions' ||\n opts.target === 'components'\n ) {\n targets = [opts.target as DeployTarget];\n } else {\n error(\n `Unknown target: '${opts.target}'. Valid values: instructions, components, all`,\n );\n process.exit(1);\n }\n\n await runWithSteps(root, targets, {\n skipValidate: opts.skipValidate,\n skipBundle: opts.skipBundle,\n });\n },\n )\n .addCommand(instructionsCmd)\n .addCommand(componentsCmd);\n\ndeployCommand.on('command:*', ([cmd]: string[]) => {\n error(\n `Unknown deploy target: '${cmd}'. Valid targets: components, instructions`,\n );\n process.exit(1);\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import open from 'open';
|
|
4
|
+
import { wixRequest } from '../utils/wixApi';
|
|
5
|
+
import { success, error, info, spinner, isJsonMode } from '../utils/print';
|
|
6
|
+
const BASE = '/_api/ecom-integrations/v1/ecom-integrations';
|
|
7
|
+
|
|
8
|
+
// ── Types ─────────────────────────────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
// ── connect ───────────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
const POLL_INTERVAL_MS = 3000;
|
|
13
|
+
const POLL_TIMEOUT_MS = 120_000;
|
|
14
|
+
async function pollUntilActive() {
|
|
15
|
+
const deadline = Date.now() + POLL_TIMEOUT_MS;
|
|
16
|
+
while (Date.now() < deadline) {
|
|
17
|
+
await new Promise(r => setTimeout(r, POLL_INTERVAL_MS));
|
|
18
|
+
try {
|
|
19
|
+
const data = await wixRequest({
|
|
20
|
+
path: `${BASE}/connection-status`,
|
|
21
|
+
method: 'GET'
|
|
22
|
+
});
|
|
23
|
+
if (data.status === 'ACTIVE') {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
} catch {
|
|
27
|
+
// ignore transient errors and keep polling
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const connectCmd = new Command('connect').description('Connect a Shopify store via OAuth2 (opens browser)').option('--store-id <id>', 'Shopify store slug (e.g. mystore)').action(async opts => {
|
|
33
|
+
const statusSp = spinner('Checking connection status...');
|
|
34
|
+
try {
|
|
35
|
+
const statusData = await wixRequest({
|
|
36
|
+
path: `${BASE}/connection-status`,
|
|
37
|
+
method: 'GET'
|
|
38
|
+
});
|
|
39
|
+
statusSp.stop();
|
|
40
|
+
if (statusData.status === 'ACTIVE') {
|
|
41
|
+
error('Already connected. Use `web5 ecom disconnect` first to reconnect.');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
statusSp.stop();
|
|
46
|
+
// not connected yet, proceed
|
|
47
|
+
}
|
|
48
|
+
let storeId = opts.storeId;
|
|
49
|
+
if (!storeId) {
|
|
50
|
+
const answer = await inquirer.prompt([{
|
|
51
|
+
type: 'input',
|
|
52
|
+
name: 'storeId',
|
|
53
|
+
message: 'Shopify store slug (e.g. mystore):',
|
|
54
|
+
validate: v => v.trim().length > 0 || 'Store ID is required'
|
|
55
|
+
}]);
|
|
56
|
+
storeId = answer.storeId.trim();
|
|
57
|
+
}
|
|
58
|
+
const sp = spinner('Initiating Shopify OAuth...');
|
|
59
|
+
try {
|
|
60
|
+
const data = await wixRequest({
|
|
61
|
+
path: `${BASE}/shopify-oauth/initiate`,
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body: {
|
|
64
|
+
platform: 'SHOPIFY',
|
|
65
|
+
shopify: {
|
|
66
|
+
storeId
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
sp.stop();
|
|
71
|
+
const url = data.authorizationUrl ?? data.authorization_url;
|
|
72
|
+
if (!url) {
|
|
73
|
+
error('No authorization URL returned by the server.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
info(`Authorization URL: ${url}`);
|
|
77
|
+
await open(url);
|
|
78
|
+
info('Browser opened — complete the Shopify authorization...');
|
|
79
|
+
const polling = spinner('Waiting for connection to become active...');
|
|
80
|
+
const active = await pollUntilActive();
|
|
81
|
+
polling.stop();
|
|
82
|
+
if (active) {
|
|
83
|
+
success('Connected! Your Shopify store is now active.');
|
|
84
|
+
} else {
|
|
85
|
+
error('Timed out waiting for the connection to become active. Run `web5 ecom status` to check.');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
} catch (err_) {
|
|
89
|
+
sp.stop();
|
|
90
|
+
error(err_.message);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// ── status ────────────────────────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
const statusCmd = new Command('status').description('Show the current ecom provider connection status').action(async () => {
|
|
98
|
+
const sp = spinner('Fetching connection status...');
|
|
99
|
+
try {
|
|
100
|
+
const data = await wixRequest({
|
|
101
|
+
path: `${BASE}/connection-status`,
|
|
102
|
+
method: 'GET'
|
|
103
|
+
});
|
|
104
|
+
sp.stop();
|
|
105
|
+
if (isJsonMode()) {
|
|
106
|
+
console.log(JSON.stringify(data));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const status = data.status ?? 'UNKNOWN';
|
|
110
|
+
if (status === 'UNKNOWN') {
|
|
111
|
+
info('Status: not connected');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (status === 'ACTIVE') {
|
|
115
|
+
success(`Status: ${status}`);
|
|
116
|
+
} else {
|
|
117
|
+
error(`Status: ${status}`);
|
|
118
|
+
if (data.errorMessage) {
|
|
119
|
+
info(`Error: ${data.errorMessage}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (data.lastFullSync) {
|
|
123
|
+
info(`Last full sync: ${data.lastFullSync}`);
|
|
124
|
+
} else {
|
|
125
|
+
info('Last full sync: never');
|
|
126
|
+
}
|
|
127
|
+
if (data.lastAlignmentSync) {
|
|
128
|
+
info(`Last alignment: ${data.lastAlignmentSync}`);
|
|
129
|
+
} else {
|
|
130
|
+
info('Last alignment: never');
|
|
131
|
+
}
|
|
132
|
+
} catch (err_) {
|
|
133
|
+
sp.stop();
|
|
134
|
+
error(err_.message);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// ── full-sync ─────────────────────────────────────────────────────────────────
|
|
140
|
+
|
|
141
|
+
const fullSyncCmd = new Command('full-sync').description('Trigger a full sync from the ecom provider into CMS').action(async () => {
|
|
142
|
+
const sp = spinner('Running full sync...');
|
|
143
|
+
try {
|
|
144
|
+
const data = await wixRequest({
|
|
145
|
+
path: `${BASE}/full-sync`,
|
|
146
|
+
method: 'POST',
|
|
147
|
+
body: {}
|
|
148
|
+
});
|
|
149
|
+
sp.stop();
|
|
150
|
+
success(data.status ?? 'Full sync triggered');
|
|
151
|
+
} catch (err_) {
|
|
152
|
+
sp.stop();
|
|
153
|
+
error(err_.message);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// ── alignment-sync ────────────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
const alignmentSyncCmd = new Command('alignment-sync').description('Run an alignment sync to catch any missed webhook updates').action(async () => {
|
|
161
|
+
const sp = spinner('Running alignment sync...');
|
|
162
|
+
try {
|
|
163
|
+
const data = await wixRequest({
|
|
164
|
+
path: `${BASE}/alignment-sync`,
|
|
165
|
+
method: 'POST',
|
|
166
|
+
body: {}
|
|
167
|
+
});
|
|
168
|
+
sp.stop();
|
|
169
|
+
success(data.status ?? 'Alignment sync complete');
|
|
170
|
+
const counts = data.syncedCounts ?? {};
|
|
171
|
+
for (const [table, count] of Object.entries(counts)) {
|
|
172
|
+
info(` ${table}: ${count}`);
|
|
173
|
+
}
|
|
174
|
+
} catch (err_) {
|
|
175
|
+
sp.stop();
|
|
176
|
+
error(err_.message);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// ── align-cms ─────────────────────────────────────────────────────────────────
|
|
182
|
+
|
|
183
|
+
const alignCmsCmd = new Command('align-cms').description('Align CMS collections with the ecom provider schema').action(async () => {
|
|
184
|
+
const sp = spinner('Aligning CMS collections...');
|
|
185
|
+
try {
|
|
186
|
+
await wixRequest({
|
|
187
|
+
path: `${BASE}/align-cms-collections`,
|
|
188
|
+
method: 'POST',
|
|
189
|
+
body: {}
|
|
190
|
+
});
|
|
191
|
+
sp.stop();
|
|
192
|
+
success('CMS collections aligned');
|
|
193
|
+
} catch (err_) {
|
|
194
|
+
sp.stop();
|
|
195
|
+
error(err_.message);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// ── disconnect ────────────────────────────────────────────────────────────────
|
|
201
|
+
|
|
202
|
+
const disconnectCmd = new Command('disconnect').description('Disconnect from the ecom provider').action(async () => {
|
|
203
|
+
const {
|
|
204
|
+
confirmed
|
|
205
|
+
} = await inquirer.prompt([{
|
|
206
|
+
type: 'confirm',
|
|
207
|
+
name: 'confirmed',
|
|
208
|
+
message: 'Are you sure you want to disconnect from the ecom provider?',
|
|
209
|
+
default: false
|
|
210
|
+
}]);
|
|
211
|
+
if (!confirmed) {
|
|
212
|
+
info('Disconnect cancelled.');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const sp = spinner('Disconnecting...');
|
|
216
|
+
try {
|
|
217
|
+
await wixRequest({
|
|
218
|
+
path: `${BASE}/disconnect`,
|
|
219
|
+
method: 'POST',
|
|
220
|
+
body: {}
|
|
221
|
+
});
|
|
222
|
+
sp.stop();
|
|
223
|
+
success('Disconnected from ecom provider');
|
|
224
|
+
} catch (err_) {
|
|
225
|
+
sp.stop();
|
|
226
|
+
error(err_.message);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// ── root ecom command ─────────────────────────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
export const ecomCommand = new Command('ecom').description('Manage ecom provider integrations').addCommand(connectCmd).addCommand(statusCmd).addCommand(fullSyncCmd).addCommand(alignmentSyncCmd).addCommand(alignCmsCmd).addCommand(disconnectCmd);
|
|
234
|
+
//# sourceMappingURL=ecom.js.map
|