@wix/web50-cli 0.1.2 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"names":["spinner","info","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","_len","arguments","length","args","Array","_key","console","sleep","ms","Promise","resolve","setTimeout","requestDeviceCode","url","res","fetch","status","statusText","ok","body","text","catch","Error","data","json","JSON","stringify","pollToken","deviceCode","deadline","Date","now","grant_type","client_id","device_code","attempt","method","headers","token","access_token","refresh_token","errorBody","error","WEB5_SITES_URL","fetchWeb5Sites","accessToken","Authorization","Connection","sites","createWeb5Site","name","site","promptCreateSite","inquirer","siteName","prompt","type","message","validate","v","trim","spin","newSite","succeed","msid","promptSiteSelection","default","CREATE_NEW","choices","map","s","value","chosen","refreshAccessToken","refreshToken","siteId","site_id","pressEnterToContinue","readline","rl","createInterface","input","process","stdin","output","stdout","question","close","runDeviceFlow","verbose","noBrowser","code","userCode","verificationUri","open","err","fail"],"sources":["../../../src/auth/deviceFlow.ts"],"sourcesContent":["import { spinner, info } from '../utils/print';\n\nconst CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f'; // web5 cli client id\n// const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973'; // Regular wix client id\nconst DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';\nconst TOKEN_URL = 'https://www.wixapis.com/oauth2/token';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 60_000;\n\nlet verboseMode = false;\n\nfunction log(...args: unknown[]): void {\n if (verboseMode) {\n console.log('[auth]', ...args);\n }\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=offline_access`;\n log(`POST ${url}`);\n\n const res = await fetch(url);\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Device code request failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const data = (await res.json()) as DeviceCodeResponse;\n log(`Device code response:`, JSON.stringify(data, null, 2));\n return data;\n}\n\nasync function pollToken(deviceCode: string): Promise<TokenResponse> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n const body = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n client_id: CLIENT_ID,\n device_code: deviceCode,\n };\n\n log(`Poll URL: POST ${TOKEN_URL}`);\n log(`Request body:`, JSON.stringify(body, null, 2));\n\n let attempt = 0;\n while (Date.now() < deadline) {\n attempt++;\n log(`Poll attempt #${attempt}`);\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (res.ok) {\n const token = (await res.json()) as TokenResponse;\n log(\n `Token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n }\n\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Poll error body:`, JSON.stringify(errorBody, null, 2));\n\n if (errorBody.error === 'access_denied') {\n throw new Error('Access denied');\n }\n\n // authorization_pending, slow_down, unknown_error, or any transient error → keep polling\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\n 'Verification failed — timed out after 60 seconds. Please run `web5 login` again.',\n );\n}\n\nconst WEB5_SITES_URL = 'https://www.wixapis.com/web5/_api/cli/web5-sites';\n\ninterface Site {\n msid: string;\n name: string;\n}\n\nasync function fetchWeb5Sites(accessToken: string): Promise<Site[]> {\n log(`GET ${WEB5_SITES_URL}`);\n const res = await fetch(WEB5_SITES_URL, {\n headers: { Authorization: `Bearer ${accessToken}`, Connection: 'close' },\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to fetch sites: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const data = (await res.json()) as { sites?: Site[] };\n log(`Sites response:`, JSON.stringify(data, null, 2));\n return data.sites ?? [];\n}\n\nasync function createWeb5Site(\n accessToken: string,\n name: string,\n): Promise<Site> {\n const url = `${WEB5_SITES_URL}/create`;\n log(`POST ${url}`);\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n Connection: 'close',\n },\n body: JSON.stringify({ name }),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to create site: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const site = (await res.json()) as Site;\n log(`Create site response:`, JSON.stringify(site, null, 2));\n return site;\n}\n\nasync function promptCreateSite(\n accessToken: string,\n inquirer: typeof import('inquirer'),\n): Promise<string> {\n const { siteName } = await inquirer.prompt<{ siteName: string }>([\n {\n type: 'input',\n name: 'siteName',\n message: 'Enter a name for your new web5 site:',\n validate: (v: string) => v.trim().length > 0 || 'Name is required',\n },\n ]);\n const spin = spinner('Creating new site...');\n const newSite = await createWeb5Site(accessToken, siteName.trim());\n spin.succeed(`Created site \"${newSite.name}\" (${newSite.msid})`);\n return newSite.msid;\n}\n\nexport async function promptSiteSelection(\n accessToken: string,\n): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n const sites = await fetchWeb5Sites(accessToken);\n\n if (sites.length === 0) {\n info(\"No web5 sites found. Let's create one.\");\n return promptCreateSite(accessToken, inquirer);\n }\n\n const CREATE_NEW = '__create_new__';\n const choices = [\n ...sites.map((s) => ({ name: `${s.name} (${s.msid})`, value: s.msid })),\n { name: 'Create a new web5 site', value: CREATE_NEW },\n ];\n\n const { chosen } = await inquirer.prompt<{ chosen: string }>([\n {\n type: 'list',\n name: 'chosen',\n message: 'Select a web5 site:',\n choices,\n },\n ]);\n\n if (chosen === CREATE_NEW) {\n return promptCreateSite(accessToken, inquirer);\n }\n\n return chosen;\n}\n\nexport async function refreshAccessToken(\n refreshToken: string,\n siteId?: string,\n): Promise<TokenResponse> {\n const body: Record<string, string> = {\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n };\n\n if (siteId) {\n body.site_id = siteId;\n }\n\n log(`Refreshing access token: POST ${TOKEN_URL}`);\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n log(`Refresh response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Refresh error body:`, JSON.stringify(errorBody, null, 2));\n throw new Error(\n `Token refresh failed (${res.status}): ${\n errorBody.error ?? res.statusText\n }`,\n );\n }\n\n const token = (await res.json()) as TokenResponse;\n log(\n `Refresh token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n}\n\nasync function pressEnterToContinue(): Promise<void> {\n const readline = await import('readline');\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(' Press Enter to open in browser...', () => {\n rl.close();\n resolve();\n });\n });\n}\n\nexport async function runDeviceFlow(\n verbose = false,\n noBrowser = false,\n): Promise<TokenResponse> {\n verboseMode = verbose;\n const code = await requestDeviceCode();\n\n console.log('');\n info(`Verification code: ${code.userCode}`);\n console.log(` ${code.verificationUri}`);\n console.log('');\n\n if (noBrowser) {\n info('Open the URL above in your browser to authenticate.');\n } else {\n await pressEnterToContinue();\n const open = (await import('open')).default;\n await open(code.verificationUri);\n console.log('');\n }\n\n const spin = spinner('Waiting for approval...');\n\n try {\n const token = await pollToken(code.deviceCode);\n spin.succeed('Approved');\n return token;\n } catch (err) {\n spin.fail('Authentication failed');\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["spinner","info","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","_len","arguments","length","args","Array","_key","console","sleep","ms","Promise","resolve","setTimeout","requestDeviceCode","url","res","fetch","status","statusText","ok","body","text","catch","Error","data","json","JSON","stringify","pollToken","deviceCode","deadline","Date","now","grant_type","client_id","device_code","attempt","method","headers","token","access_token","refresh_token","errorBody","error","WEB5_SITES_URL","fetchWeb5Sites","accessToken","Authorization","Connection","sites","createWeb5Site","name","site","promptCreateSite","inquirer","siteName","prompt","type","message","validate","v","trimmed","trim","test","spin","newSite","succeed","msid","promptSiteSelection","default","CREATE_NEW","choices","map","s","value","chosen","refreshAccessToken","refreshToken","siteId","site_id","pressEnterToContinue","readline","rl","createInterface","input","process","stdin","output","stdout","question","close","runDeviceFlow","verbose","noBrowser","code","userCode","verificationUri","open","err","fail"],"sources":["../../../src/auth/deviceFlow.ts"],"sourcesContent":["import { spinner, info } from '../utils/print';\n\nconst CLIENT_ID = '602051c7-ec4b-4334-b90d-b029b076ba8f'; // web5 cli client id\n// const CLIENT_ID = '6f95cec8-3e98-48b9-b4e5-1fb92fcd9973'; // Regular wix client id\nconst DEVICE_CODE_URL = 'https://www.wixapis.com/oauth2/device/code';\nconst TOKEN_URL = 'https://www.wixapis.com/oauth2/token';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 60_000;\n\nlet verboseMode = false;\n\nfunction log(...args: unknown[]): void {\n if (verboseMode) {\n console.log('[auth]', ...args);\n }\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function requestDeviceCode(): Promise<DeviceCodeResponse> {\n const url = `${DEVICE_CODE_URL}?client_id=${CLIENT_ID}&scope=offline_access`;\n log(`POST ${url}`);\n\n const res = await fetch(url);\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Device code request failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const data = (await res.json()) as DeviceCodeResponse;\n log(`Device code response:`, JSON.stringify(data, null, 2));\n return data;\n}\n\nasync function pollToken(deviceCode: string): Promise<TokenResponse> {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n const body = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n client_id: CLIENT_ID,\n device_code: deviceCode,\n };\n\n log(`Poll URL: POST ${TOKEN_URL}`);\n log(`Request body:`, JSON.stringify(body, null, 2));\n\n let attempt = 0;\n while (Date.now() < deadline) {\n attempt++;\n log(`Poll attempt #${attempt}`);\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n\n if (res.ok) {\n const token = (await res.json()) as TokenResponse;\n log(\n `Token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n }\n\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Poll error body:`, JSON.stringify(errorBody, null, 2));\n\n if (errorBody.error === 'access_denied') {\n throw new Error('Access denied');\n }\n\n // authorization_pending, slow_down, unknown_error, or any transient error → keep polling\n await sleep(POLL_INTERVAL_MS);\n }\n\n throw new Error(\n 'Verification failed — timed out after 60 seconds. Please run `web5 login` again.',\n );\n}\n\nconst WEB5_SITES_URL = 'https://www.wixapis.com/web5/_api/cli/web5-sites';\n\ninterface Site {\n msid: string;\n name: string;\n}\n\nasync function fetchWeb5Sites(accessToken: string): Promise<Site[]> {\n log(`GET ${WEB5_SITES_URL}`);\n const res = await fetch(WEB5_SITES_URL, {\n headers: { Authorization: `Bearer ${accessToken}`, Connection: 'close' },\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to fetch sites: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const data = (await res.json()) as { sites?: Site[] };\n log(`Sites response:`, JSON.stringify(data, null, 2));\n return data.sites ?? [];\n}\n\nasync function createWeb5Site(\n accessToken: string,\n name: string,\n): Promise<Site> {\n const url = `${WEB5_SITES_URL}/create`;\n log(`POST ${url}`);\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n Connection: 'close',\n },\n body: JSON.stringify({ name }),\n });\n log(`Response: ${res.status} ${res.statusText}`);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n log(`Error body: ${body}`);\n throw new Error(\n `Failed to create site: ${res.status} ${res.statusText} — ${body}`,\n );\n }\n const body = (await res.json()) as { site: Site };\n log(`Create site response:`, JSON.stringify(body, null, 2));\n return body.site;\n}\n\nasync function promptCreateSite(\n accessToken: string,\n inquirer: typeof import('inquirer'),\n): Promise<string> {\n const { siteName } = await inquirer.prompt<{ siteName: string }>([\n {\n type: 'input',\n name: 'siteName',\n message: 'Enter a name for your new web5 site:',\n validate: (v: string) => {\n const trimmed = v.trim();\n if (trimmed.length === 0) return 'Name is required';\n if (trimmed.length > 20) return 'Name must be 20 characters or less';\n if (!/^[a-z0-9_]+$/.test(trimmed)) return 'Name must contain only lowercase letters, numbers, and underscores';\n return true;\n },\n },\n ]);\n const spin = spinner('Creating new site...');\n const newSite = await createWeb5Site(accessToken, siteName.trim());\n spin.succeed(`Created site \"${newSite.name}\" (${newSite.msid})`);\n return newSite.msid;\n}\n\nexport async function promptSiteSelection(\n accessToken: string,\n): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n const sites = await fetchWeb5Sites(accessToken);\n\n if (sites.length === 0) {\n info(\"No web5 sites found. Let's create one.\");\n return promptCreateSite(accessToken, inquirer);\n }\n\n const CREATE_NEW = '__create_new__';\n const choices = [\n ...sites.map((s) => ({ name: `${s.name} (${s.msid})`, value: s.msid })),\n { name: 'Create a new web5 site', value: CREATE_NEW },\n ];\n\n const { chosen } = await inquirer.prompt<{ chosen: string }>([\n {\n type: 'list',\n name: 'chosen',\n message: 'Select a web5 site:',\n choices,\n },\n ]);\n\n if (chosen === CREATE_NEW) {\n return promptCreateSite(accessToken, inquirer);\n }\n\n return chosen;\n}\n\nexport async function refreshAccessToken(\n refreshToken: string,\n siteId?: string,\n): Promise<TokenResponse> {\n const body: Record<string, string> = {\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n };\n\n if (siteId) {\n body.site_id = siteId;\n }\n\n log(`Refreshing access token: POST ${TOKEN_URL}`);\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n log(`Refresh response: ${res.status} ${res.statusText}`);\n\n if (!res.ok) {\n const errorBody = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n log(`Refresh error body:`, JSON.stringify(errorBody, null, 2));\n throw new Error(\n `Token refresh failed (${res.status}): ${\n errorBody.error ?? res.statusText\n }`,\n );\n }\n\n const token = (await res.json()) as TokenResponse;\n log(\n `Refresh token response:`,\n JSON.stringify(\n { ...token, access_token: '***', refresh_token: '***' },\n null,\n 2,\n ),\n );\n return token;\n}\n\nasync function pressEnterToContinue(): Promise<void> {\n const readline = await import('readline');\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(' Press Enter to open in browser...', () => {\n rl.close();\n resolve();\n });\n });\n}\n\nexport async function runDeviceFlow(\n verbose = false,\n noBrowser = false,\n): Promise<TokenResponse> {\n verboseMode = verbose;\n const code = await requestDeviceCode();\n\n console.log('');\n info(`Verification code: ${code.userCode}`);\n console.log(` ${code.verificationUri}`);\n console.log('');\n\n if (noBrowser) {\n info('Open the URL above in your browser to authenticate.');\n } else {\n await pressEnterToContinue();\n const open = (await import('open')).default;\n await open(code.verificationUri);\n console.log('');\n }\n\n const spin = spinner('Waiting for approval...');\n\n try {\n const token = await pollToken(code.deviceCode);\n spin.succeed('Approved');\n return token;\n } catch (err) {\n spin.fail('Authentication failed');\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,9 +7,22 @@ import chalk from 'chalk';
7
7
  import ora from 'ora';
8
8
  import open from 'open';
9
9
  import { wixRequest } from '../utils/wixApi';
10
+ import { findProjectRoot, readConfig } from '../utils/project';
10
11
 
11
12
  // ── API response shapes ────────────────────────────────────────────────────
12
13
 
14
+ // ── Config helpers ─────────────────────────────────────────────────────────
15
+
16
+ function getFirstAllowedDomain() {
17
+ var _config$allowedDomain;
18
+ const root = findProjectRoot(process.cwd());
19
+ if (!root) {
20
+ return null;
21
+ }
22
+ const config = readConfig(root);
23
+ return ((_config$allowedDomain = config.allowedDomains) == null ? void 0 : _config$allowedDomain[0]) ?? null;
24
+ }
25
+
13
26
  // ── Verbose flag ───────────────────────────────────────────────────────────
14
27
 
15
28
  let verbose = false;
@@ -290,23 +303,27 @@ async function showMessageDetailScreen(messages, index, conversationId) {
290
303
  console.log(chalk.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
291
304
  console.log();
292
305
  const tid = msg.triggerId ?? '';
293
- const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${tid}`;
306
+ const domain = getFirstAllowedDomain();
307
+ const choices = [{
308
+ name: ` ${chalk.dim('← Back')}`,
309
+ value: 'back'
310
+ }];
311
+ if (domain) {
312
+ choices.push({
313
+ name: ` 🌐 Open in browser`,
314
+ value: 'browser'
315
+ });
316
+ }
294
317
  const {
295
318
  action
296
319
  } = await inquirer.prompt([{
297
320
  type: 'list',
298
321
  name: 'action',
299
322
  message: chalk.bold('What would you like to do?'),
300
- choices: [{
301
- name: ` ${chalk.dim('← Back')}`,
302
- value: 'back'
303
- }, {
304
- name: ` 🌐 Open in browser`,
305
- value: 'browser'
306
- }]
323
+ choices
307
324
  }]);
308
- if (action === 'browser') {
309
- await open(browserUrl);
325
+ if (action === 'browser' && domain) {
326
+ await open(`${domain}/web5#tid=${tid}`);
310
327
  }
311
328
  }
312
329
 
@@ -503,7 +520,12 @@ const exportCmd = new Command('export').description('Export a conversation to a
503
520
  // ── open ───────────────────────────────────────────────────────────────────
504
521
 
505
522
  const openCmd = new Command('open').description('Open a conversation in the browser').requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation').action(async opts => {
506
- const browserUrl = `https://www.copyofcircanafordemo.com/web5#tid=${opts.id}`;
523
+ const domain = getFirstAllowedDomain();
524
+ if (!domain) {
525
+ console.error(chalk.red('No allowedDomains configured in web5.config.json'));
526
+ process.exit(1);
527
+ }
528
+ const browserUrl = `${domain}/web5#tid=${opts.id}`;
507
529
  console.log(`Opening ${browserUrl}`);
508
530
  await open(browserUrl);
509
531
  });
@@ -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 }) => ({\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
+ {"version":3,"names":["Command","readline","fs","path","inquirer","chalk","ora","open","wixRequest","findProjectRoot","readConfig","getFirstAllowedDomain","_config$allowedDomain","root","process","cwd","config","allowedDomains","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","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","domain","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","browserUrl","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';\nimport { findProjectRoot, readConfig } from '../utils/project';\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// ── Config helpers ─────────────────────────────────────────────────────────\n\nfunction getFirstAllowedDomain(): string | null {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n return null;\n }\n const config = readConfig(root);\n return config.allowedDomains?.[0] ?? null;\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 domain = getFirstAllowedDomain();\n\n const choices: { name: string; value: string }[] = [\n { name: ` ${chalk.dim('← Back')}`, value: 'back' },\n ];\n if (domain) {\n choices.push({ name: ` 🌐 Open in browser`, value: 'browser' });\n }\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 },\n ]);\n\n if (action === 'browser' && domain) {\n await open(`${domain}/web5#tid=${tid}`);\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 domain = getFirstAllowedDomain();\n if (!domain) {\n console.error(chalk.red('No allowedDomains configured in web5.config.json'));\n process.exit(1);\n }\n const browserUrl = `${domain}/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,46 +1,19 @@
1
1
  import { Command } from 'commander';
2
- import * as readline from 'readline';
2
+ import * as http from 'http';
3
3
  import { execSync } from 'child_process';
4
- import inquirer from 'inquirer';
5
4
  import { wixRequest } from '../utils/wixApi';
6
- import { isJsonMode } from '../utils/print';
5
+ import { isJsonMode, info, success } from '../utils/print';
7
6
  import { findProjectRoot, readConfig, writeConfig } from '../utils/project';
8
- function copyToClipboard(text) {
9
- const cmd = process.platform === 'win32' ? `echo ${text} | clip` : process.platform === 'darwin' ? 'pbcopy' : 'xclip -selection clipboard';
10
- execSync(process.platform === 'win32' ? `echo ${text} | clip` : cmd, process.platform === 'win32' ? undefined : {
11
- input: text
12
- });
13
- }
14
- async function promptCopyToClipboard(text) {
15
- const rl = readline.createInterface({
16
- input: process.stdin,
17
- output: process.stdout
18
- });
19
- return new Promise(resolve => {
20
- rl.question('\nPress Enter to copy to clipboard...', () => {
21
- rl.close();
22
- copyToClipboard(text);
23
- console.log('Copied to clipboard.');
24
- resolve();
7
+ import { generateEmbedDocs } from '../templates/embedDocs';
8
+ function openBrowser(url) {
9
+ const cmd = process.platform === 'win32' ? `start "" "${url}"` : process.platform === 'darwin' ? `open "${url}"` : `xdg-open "${url}"`;
10
+ try {
11
+ execSync(cmd, {
12
+ stdio: 'ignore'
25
13
  });
26
- });
27
- }
28
- async function promptForType() {
29
- const {
30
- type
31
- } = await inquirer.prompt([{
32
- type: 'list',
33
- name: 'type',
34
- message: 'Select embed type:',
35
- choices: [{
36
- name: 'Script tag',
37
- value: 'script'
38
- }, {
39
- name: 'React component',
40
- value: 'react'
41
- }]
42
- }]);
43
- return type;
14
+ } catch {
15
+ // URL is printed to stdout regardless
16
+ }
44
17
  }
45
18
  async function getOrCreateClientId() {
46
19
  var _createData$oAuthApp;
@@ -74,13 +47,8 @@ async function getOrCreateClientId() {
74
47
  console.log(`Client ID created: ${id}`);
75
48
  return id;
76
49
  }
77
- export const embedCommand = new Command('embed').description('Generate embed code for a Web5 component').option('--type <type>', 'Embed type: script or react').option('--client-id <id>', 'Use this client ID instead of fetching from the API').option('--no-clipboard', 'Print to stdout only skip the clipboard prompt').action(async opts => {
50
+ export const embedCommand = new Command('embed').description('Generate embed code for a Web5 component').option('--client-id <id>', 'Use this client ID instead of fetching from the API').option('--no-serve', 'Print client ID to stdout instead of launching a browser').action(async opts => {
78
51
  try {
79
- const type = opts.type ?? (await promptForType());
80
- if (type === 'react') {
81
- console.log('no react for now');
82
- return;
83
- }
84
52
  const root = findProjectRoot(process.cwd());
85
53
  const config = root ? readConfig(root) : null;
86
54
  const clientId = opts.clientId ?? ((config == null ? void 0 : config.clientId) || undefined) ?? (await getOrCreateClientId());
@@ -90,20 +58,42 @@ export const embedCommand = new Command('embed').description('Generate embed cod
90
58
  clientId
91
59
  });
92
60
  }
93
- const embedScript = `<script src="https://www.wix.com/embed/v1/component.js" data-client-id="${clientId}"></script>`;
61
+
62
+ // ── JSON mode: structured output, no server ──────────────────────────
94
63
  if (isJsonMode()) {
95
64
  console.log(JSON.stringify({
96
- type,
97
- clientId,
98
- embedCode: embedScript
65
+ clientId
99
66
  }));
100
67
  return;
101
68
  }
102
- console.log('\nEmbed script:\n');
103
- console.log(embedScript);
104
- if (opts.clipboard !== false && process.stdout.isTTY) {
105
- await promptCopyToClipboard(embedScript);
69
+
70
+ // ── --no-serve: print client ID only ────────────────────────────────
71
+ if (!opts.serve) {
72
+ console.log(clientId);
73
+ return;
106
74
  }
75
+
76
+ // ── Default: launch documentation server ─────────────────────────────
77
+ const html = generateEmbedDocs(clientId);
78
+ const server = http.createServer((_req, res) => {
79
+ res.writeHead(200, {
80
+ 'Content-Type': 'text/html; charset=utf-8'
81
+ });
82
+ res.end(html);
83
+ });
84
+ server.listen(0, '127.0.0.1', () => {
85
+ const addr = server.address();
86
+ const url = `http://localhost:${addr.port}`;
87
+ success(`Embed documentation ready at ${url}`);
88
+ info('Opening in your browser...');
89
+ info('Press Ctrl+C to stop.');
90
+ openBrowser(url);
91
+ });
92
+ process.on('SIGINT', () => {
93
+ info('\nShutting down...');
94
+ server.close(() => process.exit(0));
95
+ setTimeout(() => process.exit(0), 1000).unref();
96
+ });
107
97
  } catch (err) {
108
98
  console.error('Error:', err.message);
109
99
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"names":["Command","readline","execSync","inquirer","wixRequest","isJsonMode","findProjectRoot","readConfig","writeConfig","copyToClipboard","text","cmd","process","platform","undefined","input","promptCopyToClipboard","rl","createInterface","stdin","output","stdout","Promise","resolve","question","close","console","log","promptForType","type","prompt","name","message","choices","value","getOrCreateClientId","_createData$oAuthApp","queryData","path","method","body","apps","oAuthApps","existing","find","app","id","createData","oAuthApp","application_type","Error","embedCommand","description","option","action","opts","root","cwd","config","clientId","embedScript","JSON","stringify","embedCode","clipboard","isTTY","err","error","exit"],"sources":["../../../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as readline from 'readline';\nimport { execSync } from 'child_process';\nimport inquirer from 'inquirer';\nimport { wixRequest } from '../utils/wixApi';\nimport { isJsonMode } from '../utils/print';\nimport { findProjectRoot, readConfig, writeConfig } from '../utils/project';\n\nfunction copyToClipboard(text: string): void {\n const cmd =\n process.platform === 'win32'\n ? `echo ${text} | clip`\n : process.platform === 'darwin'\n ? 'pbcopy'\n : 'xclip -selection clipboard';\n\n execSync(\n process.platform === 'win32' ? `echo ${text} | clip` : cmd,\n process.platform === 'win32' ? undefined : { input: text },\n );\n}\n\nasync function promptCopyToClipboard(text: string): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question('\\nPress Enter to copy to clipboard...', () => {\n rl.close();\n copyToClipboard(text);\n console.log('Copied to clipboard.');\n resolve();\n });\n });\n}\n\ntype EmbedType = 'script' | 'react';\n\ninterface OAuthApp {\n id: string;\n name: string;\n}\n\ninterface QueryResponse {\n oAuthApps?: OAuthApp[];\n}\n\ninterface CreateResponse {\n oAuthApp?: OAuthApp;\n}\n\nasync function promptForType(): Promise<EmbedType> {\n const { type } = await inquirer.prompt<{ type: EmbedType }>([\n {\n type: 'list',\n name: 'type',\n message: 'Select embed type:',\n choices: [\n { name: 'Script tag', value: 'script' },\n { name: 'React component', value: 'react' },\n ],\n },\n ]);\n return type;\n}\n\nasync function getOrCreateClientId(): Promise<string> {\n console.log('Searching for client ID...');\n\n const queryData = await wixRequest<QueryResponse>({\n path: '/oauth-app/v1/oauth-apps/query',\n method: 'POST',\n body: {},\n });\n\n const apps = queryData.oAuthApps ?? [];\n const existing = apps.find((app) => app.name === 'web5');\n\n if (existing) {\n console.log(`Found client ID: ${existing.id}`);\n return existing.id;\n }\n\n console.log('Client ID not found, creating...');\n\n const createData = await wixRequest<CreateResponse>({\n path: '/oauth-app/v1/oauth-apps',\n method: 'POST',\n body: { oAuthApp: { name: 'web5', application_type: 'WEB_APP' } },\n });\n\n const id = createData.oAuthApp?.id;\n if (!id) {\n throw new Error('Failed to create OAuth app — no ID returned');\n }\n\n console.log(`Client ID created: ${id}`);\n return id;\n}\n\nexport const embedCommand = new Command('embed')\n .description('Generate embed code for a Web5 component')\n .option('--type <type>', 'Embed type: script or react')\n .option(\n '--client-id <id>',\n 'Use this client ID instead of fetching from the API',\n )\n .option('--no-clipboard', 'Print to stdout only skip the clipboard prompt')\n .action(\n async (opts: { type?: string; clientId?: string; clipboard: boolean }) => {\n try {\n const type: EmbedType =\n (opts.type as EmbedType) ?? (await promptForType());\n\n if (type === 'react') {\n console.log('no react for now');\n return;\n }\n\n const root = findProjectRoot(process.cwd());\n const config = root ? readConfig(root) : null;\n\n const clientId =\n opts.clientId ??\n (config?.clientId || undefined) ??\n (await getOrCreateClientId());\n\n if (root && config && config.clientId !== clientId) {\n writeConfig(root, { ...config, clientId });\n }\n\n const embedScript = `<script src=\"https://www.wix.com/embed/v1/component.js\" data-client-id=\"${clientId}\"></script>`;\n\n if (isJsonMode()) {\n console.log(\n JSON.stringify({ type, clientId, embedCode: embedScript }),\n );\n return;\n }\n\n console.log('\\nEmbed script:\\n');\n console.log(embedScript);\n\n if (opts.clipboard !== false && process.stdout.isTTY) {\n await promptCopyToClipboard(embedScript);\n }\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n },\n );\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Command","http","execSync","wixRequest","isJsonMode","info","success","findProjectRoot","readConfig","writeConfig","generateEmbedDocs","openBrowser","url","cmd","process","platform","stdio","getOrCreateClientId","_createData$oAuthApp","console","log","queryData","path","method","body","apps","oAuthApps","existing","find","app","name","id","createData","oAuthApp","application_type","Error","embedCommand","description","option","action","opts","root","cwd","config","clientId","undefined","JSON","stringify","serve","html","server","createServer","_req","res","writeHead","end","listen","addr","address","port","on","close","exit","setTimeout","unref","err","error","message"],"sources":["../../../src/commands/embed.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as http from 'http';\nimport type { AddressInfo } from 'net';\nimport { execSync } from 'child_process';\nimport { wixRequest } from '../utils/wixApi';\nimport { isJsonMode, info, success } from '../utils/print';\nimport { findProjectRoot, readConfig, writeConfig } from '../utils/project';\nimport { generateEmbedDocs } from '../templates/embedDocs';\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : process.platform === 'darwin'\n ? `open \"${url}\"`\n : `xdg-open \"${url}\"`;\n try {\n execSync(cmd, { stdio: 'ignore' });\n } catch {\n // URL is printed to stdout regardless\n }\n}\n\n\ninterface OAuthApp {\n id: string;\n name: string;\n}\n\ninterface QueryResponse {\n oAuthApps?: OAuthApp[];\n}\n\ninterface CreateResponse {\n oAuthApp?: OAuthApp;\n}\n\nasync function getOrCreateClientId(): Promise<string> {\n console.log('Searching for client ID...');\n\n const queryData = await wixRequest<QueryResponse>({\n path: '/oauth-app/v1/oauth-apps/query',\n method: 'POST',\n body: {},\n });\n\n const apps = queryData.oAuthApps ?? [];\n const existing = apps.find((app) => app.name === 'web5');\n\n if (existing) {\n console.log(`Found client ID: ${existing.id}`);\n return existing.id;\n }\n\n console.log('Client ID not found, creating...');\n\n const createData = await wixRequest<CreateResponse>({\n path: '/oauth-app/v1/oauth-apps',\n method: 'POST',\n body: { oAuthApp: { name: 'web5', application_type: 'WEB_APP' } },\n });\n\n const id = createData.oAuthApp?.id;\n if (!id) {\n throw new Error('Failed to create OAuth app — no ID returned');\n }\n\n console.log(`Client ID created: ${id}`);\n return id;\n}\n\nexport const embedCommand = new Command('embed')\n .description('Generate embed code for a Web5 component')\n .option(\n '--client-id <id>',\n 'Use this client ID instead of fetching from the API',\n )\n .option('--no-serve', 'Print client ID to stdout instead of launching a browser')\n .action(\n async (opts: {\n clientId?: string;\n serve: boolean;\n }) => {\n try {\n const root = findProjectRoot(process.cwd());\n const config = root ? readConfig(root) : null;\n\n const clientId =\n opts.clientId ??\n (config?.clientId || undefined) ??\n (await getOrCreateClientId());\n\n if (root && config && config.clientId !== clientId) {\n writeConfig(root, { ...config, clientId });\n }\n\n // ── JSON mode: structured output, no server ──────────────────────────\n if (isJsonMode()) {\n console.log(JSON.stringify({ clientId }));\n return;\n }\n\n // ── --no-serve: print client ID only ────────────────────────────────\n if (!opts.serve) {\n console.log(clientId);\n return;\n }\n\n // ── Default: launch documentation server ─────────────────────────────\n const html = generateEmbedDocs(clientId);\n\n const server = http.createServer((_req, res) => {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(html);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address() as AddressInfo;\n const url = `http://localhost:${addr.port}`;\n\n success(`Embed documentation ready at ${url}`);\n info('Opening in your browser...');\n info('Press Ctrl+C to stop.');\n\n openBrowser(url);\n });\n\n process.on('SIGINT', () => {\n info('\\nShutting down...');\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n });\n } catch (err) {\n console.error('Error:', (err as Error).message);\n process.exit(1);\n }\n },\n );\n"],"mappings":"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","ignoreList":[]}
@@ -141,7 +141,7 @@ export const initCommand = new Command('init').description('Scaffold a new Web5
141
141
  };
142
142
 
143
143
  // ── Root config files ─────────────────────────────────────────────────
144
- await copyDefault('.web5.config.json', path.join(outDir, 'web5.config.json'), subs);
144
+ await copyDefault('web5.config.template.json', path.join(outDir, 'web5.config.json'), subs);
145
145
  await copyDefault('package.template.json', path.join(outDir, 'package.json'), subs);
146
146
  await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));
147
147