@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.
- package/dist/cjs/auth/deviceFlow.js +10 -4
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/commands/conversationWizard.js +33 -11
- package/dist/cjs/commands/conversationWizard.js.map +1 -1
- package/dist/cjs/commands/embed.js +41 -52
- package/dist/cjs/commands/embed.js.map +1 -1
- package/dist/cjs/commands/init.js +1 -1
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/templates/embedDocs.js +488 -0
- package/dist/cjs/templates/embedDocs.js.map +1 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/esm/auth/deviceFlow.js +10 -4
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/commands/conversationWizard.js +33 -11
- package/dist/esm/commands/conversationWizard.js.map +1 -1
- package/dist/esm/commands/embed.js +42 -52
- package/dist/esm/commands/embed.js.map +1 -1
- package/dist/esm/commands/init.js +1 -1
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/templates/embedDocs.js +484 -0
- package/dist/esm/templates/embedDocs.js.map +1 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/commands/conversationWizard.d.ts.map +1 -1
- package/dist/types/commands/embed.d.ts.map +1 -1
- package/dist/types/templates/embedDocs.d.ts +2 -0
- package/dist/types/templates/embedDocs.d.ts.map +1 -0
- package/dist/types/utils/project.d.ts +1 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -115,9 +115,9 @@ async function createWeb5Site(accessToken, name) {
|
|
|
115
115
|
log(`Error body: ${body}`);
|
|
116
116
|
throw new Error(`Failed to create site: ${res.status} ${res.statusText} — ${body}`);
|
|
117
117
|
}
|
|
118
|
-
const
|
|
119
|
-
log(`Create site response:`, JSON.stringify(
|
|
120
|
-
return site;
|
|
118
|
+
const body = await res.json();
|
|
119
|
+
log(`Create site response:`, JSON.stringify(body, null, 2));
|
|
120
|
+
return body.site;
|
|
121
121
|
}
|
|
122
122
|
async function promptCreateSite(accessToken, inquirer) {
|
|
123
123
|
const {
|
|
@@ -126,7 +126,13 @@ async function promptCreateSite(accessToken, inquirer) {
|
|
|
126
126
|
type: 'input',
|
|
127
127
|
name: 'siteName',
|
|
128
128
|
message: 'Enter a name for your new web5 site:',
|
|
129
|
-
validate: v =>
|
|
129
|
+
validate: v => {
|
|
130
|
+
const trimmed = v.trim();
|
|
131
|
+
if (trimmed.length === 0) return 'Name is required';
|
|
132
|
+
if (trimmed.length > 20) return 'Name must be 20 characters or less';
|
|
133
|
+
if (!/^[a-z0-9_]+$/.test(trimmed)) return 'Name must contain only lowercase letters, numbers, and underscores';
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
130
136
|
}]);
|
|
131
137
|
const spin = (0, _print.spinner)('Creating new site...');
|
|
132
138
|
const newSite = await createWeb5Site(accessToken, siteName.trim());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_print","require","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","args","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","length","spin","spinner","newSite","succeed","msid","promptSiteSelection","then","info","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":["_print","require","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CLIENT_ID","DEVICE_CODE_URL","TOKEN_URL","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","verboseMode","log","args","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","length","test","spin","spinner","newSite","succeed","msid","promptSiteSelection","then","info","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":[]}
|
|
@@ -12,9 +12,22 @@ var _chalk = _interopRequireDefault(require("chalk"));
|
|
|
12
12
|
var _ora = _interopRequireDefault(require("ora"));
|
|
13
13
|
var _open = _interopRequireDefault(require("open"));
|
|
14
14
|
var _wixApi = require("../utils/wixApi");
|
|
15
|
+
var _project = require("../utils/project");
|
|
15
16
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
17
|
// ── API response shapes ────────────────────────────────────────────────────
|
|
17
18
|
|
|
19
|
+
// ── Config helpers ─────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
function getFirstAllowedDomain() {
|
|
22
|
+
var _config$allowedDomain;
|
|
23
|
+
const root = (0, _project.findProjectRoot)(process.cwd());
|
|
24
|
+
if (!root) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const config = (0, _project.readConfig)(root);
|
|
28
|
+
return ((_config$allowedDomain = config.allowedDomains) == null ? void 0 : _config$allowedDomain[0]) ?? null;
|
|
29
|
+
}
|
|
30
|
+
|
|
18
31
|
// ── Verbose flag ───────────────────────────────────────────────────────────
|
|
19
32
|
|
|
20
33
|
let verbose = false;
|
|
@@ -292,23 +305,27 @@ async function showMessageDetailScreen(messages, index, conversationId) {
|
|
|
292
305
|
console.log(_chalk.default.cyan('╚' + '═'.repeat(BOX_W) + '╝'));
|
|
293
306
|
console.log();
|
|
294
307
|
const tid = msg.triggerId ?? '';
|
|
295
|
-
const
|
|
308
|
+
const domain = getFirstAllowedDomain();
|
|
309
|
+
const choices = [{
|
|
310
|
+
name: ` ${_chalk.default.dim('← Back')}`,
|
|
311
|
+
value: 'back'
|
|
312
|
+
}];
|
|
313
|
+
if (domain) {
|
|
314
|
+
choices.push({
|
|
315
|
+
name: ` 🌐 Open in browser`,
|
|
316
|
+
value: 'browser'
|
|
317
|
+
});
|
|
318
|
+
}
|
|
296
319
|
const {
|
|
297
320
|
action
|
|
298
321
|
} = await _inquirer.default.prompt([{
|
|
299
322
|
type: 'list',
|
|
300
323
|
name: 'action',
|
|
301
324
|
message: _chalk.default.bold('What would you like to do?'),
|
|
302
|
-
choices
|
|
303
|
-
name: ` ${_chalk.default.dim('← Back')}`,
|
|
304
|
-
value: 'back'
|
|
305
|
-
}, {
|
|
306
|
-
name: ` 🌐 Open in browser`,
|
|
307
|
-
value: 'browser'
|
|
308
|
-
}]
|
|
325
|
+
choices
|
|
309
326
|
}]);
|
|
310
|
-
if (action === 'browser') {
|
|
311
|
-
await (0, _open.default)(
|
|
327
|
+
if (action === 'browser' && domain) {
|
|
328
|
+
await (0, _open.default)(`${domain}/web5#tid=${tid}`);
|
|
312
329
|
}
|
|
313
330
|
}
|
|
314
331
|
|
|
@@ -502,7 +519,12 @@ const exportCmd = new _commander.Command('export').description('Export a convers
|
|
|
502
519
|
// ── open ───────────────────────────────────────────────────────────────────
|
|
503
520
|
|
|
504
521
|
const openCmd = new _commander.Command('open').description('Open a conversation in the browser').requiredOption('--id <tid>', 'Trigger ID (TID) of the conversation').action(async opts => {
|
|
505
|
-
const
|
|
522
|
+
const domain = getFirstAllowedDomain();
|
|
523
|
+
if (!domain) {
|
|
524
|
+
console.error(_chalk.default.red('No allowedDomains configured in web5.config.json'));
|
|
525
|
+
process.exit(1);
|
|
526
|
+
}
|
|
527
|
+
const browserUrl = `${domain}/web5#tid=${opts.id}`;
|
|
506
528
|
console.log(`Opening ${browserUrl}`);
|
|
507
529
|
await (0, _open.default)(browserUrl);
|
|
508
530
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_commander","require","readline","_interopRequireWildcard","fs","path","_inquirer","_interopRequireDefault","_chalk","_ora","_open","_wixApi","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","verbose","BOX_W","printHeader","breadcrumb","pad","repeat","Math","max","length","console","log","chalk","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","_","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","ora","start","roots","data","wixRequest","method","body","stop","messages","err","fail","error","red","message","type","clear","choices","name","triggerIdContent","content","value","inquirer","Separator","rootIndex","prompt","pageSize","selected","messageId","id","userQuery","conversationId","showMessagesScreen","convLabel","msg","push","msgIndex","index","showMessageDetailScreen","isUser","role","icon","tid","triggerId","browserUrl","action","open","runWizard","verboseFlag","on","exit","screen","running","s","printMessages","format","view","JSON","stringify","green","getCmd","Command","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","exports","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":["_commander","require","readline","_interopRequireWildcard","fs","path","_inquirer","_interopRequireDefault","_chalk","_ora","_open","_wixApi","_project","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getFirstAllowedDomain","_config$allowedDomain","root","findProjectRoot","process","cwd","config","readConfig","allowedDomains","verbose","BOX_W","printHeader","breadcrumb","pad","repeat","Math","max","length","console","log","chalk","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","_","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","ora","start","roots","data","wixRequest","method","body","stop","messages","err","fail","error","red","message","type","clear","choices","name","triggerIdContent","content","value","inquirer","Separator","rootIndex","prompt","pageSize","selected","messageId","id","userQuery","conversationId","showMessagesScreen","convLabel","msg","push","msgIndex","index","showMessageDetailScreen","isUser","role","icon","tid","triggerId","domain","action","open","runWizard","verboseFlag","on","exit","screen","running","s","printMessages","format","view","JSON","stringify","green","getCmd","Command","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","exports","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,52 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
3
|
exports.__esModule = true;
|
|
5
4
|
exports.embedCommand = void 0;
|
|
6
5
|
var _commander = require("commander");
|
|
7
|
-
var
|
|
6
|
+
var http = _interopRequireWildcard(require("http"));
|
|
8
7
|
var _child_process = require("child_process");
|
|
9
|
-
var _inquirer = _interopRequireDefault(require("inquirer"));
|
|
10
8
|
var _wixApi = require("../utils/wixApi");
|
|
11
9
|
var _print = require("../utils/print");
|
|
12
10
|
var _project = require("../utils/project");
|
|
11
|
+
var _embedDocs = require("../templates/embedDocs");
|
|
13
12
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
-
function
|
|
15
|
-
const cmd = process.platform === 'win32' ? `
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
async function promptCopyToClipboard(text) {
|
|
21
|
-
const rl = readline.createInterface({
|
|
22
|
-
input: process.stdin,
|
|
23
|
-
output: process.stdout
|
|
24
|
-
});
|
|
25
|
-
return new Promise(resolve => {
|
|
26
|
-
rl.question('\nPress Enter to copy to clipboard...', () => {
|
|
27
|
-
rl.close();
|
|
28
|
-
copyToClipboard(text);
|
|
29
|
-
console.log('Copied to clipboard.');
|
|
30
|
-
resolve();
|
|
13
|
+
function openBrowser(url) {
|
|
14
|
+
const cmd = process.platform === 'win32' ? `start "" "${url}"` : process.platform === 'darwin' ? `open "${url}"` : `xdg-open "${url}"`;
|
|
15
|
+
try {
|
|
16
|
+
(0, _child_process.execSync)(cmd, {
|
|
17
|
+
stdio: 'ignore'
|
|
31
18
|
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const {
|
|
36
|
-
type
|
|
37
|
-
} = await _inquirer.default.prompt([{
|
|
38
|
-
type: 'list',
|
|
39
|
-
name: 'type',
|
|
40
|
-
message: 'Select embed type:',
|
|
41
|
-
choices: [{
|
|
42
|
-
name: 'Script tag',
|
|
43
|
-
value: 'script'
|
|
44
|
-
}, {
|
|
45
|
-
name: 'React component',
|
|
46
|
-
value: 'react'
|
|
47
|
-
}]
|
|
48
|
-
}]);
|
|
49
|
-
return type;
|
|
19
|
+
} catch {
|
|
20
|
+
// URL is printed to stdout regardless
|
|
21
|
+
}
|
|
50
22
|
}
|
|
51
23
|
async function getOrCreateClientId() {
|
|
52
24
|
var _createData$oAuthApp;
|
|
@@ -80,13 +52,8 @@ async function getOrCreateClientId() {
|
|
|
80
52
|
console.log(`Client ID created: ${id}`);
|
|
81
53
|
return id;
|
|
82
54
|
}
|
|
83
|
-
const embedCommand = exports.embedCommand = new _commander.Command('embed').description('Generate embed code for a Web5 component').option('--
|
|
55
|
+
const embedCommand = exports.embedCommand = new _commander.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 => {
|
|
84
56
|
try {
|
|
85
|
-
const type = opts.type ?? (await promptForType());
|
|
86
|
-
if (type === 'react') {
|
|
87
|
-
console.log('no react for now');
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
57
|
const root = (0, _project.findProjectRoot)(process.cwd());
|
|
91
58
|
const config = root ? (0, _project.readConfig)(root) : null;
|
|
92
59
|
const clientId = opts.clientId ?? ((config == null ? void 0 : config.clientId) || undefined) ?? (await getOrCreateClientId());
|
|
@@ -96,20 +63,42 @@ const embedCommand = exports.embedCommand = new _commander.Command('embed').desc
|
|
|
96
63
|
clientId
|
|
97
64
|
});
|
|
98
65
|
}
|
|
99
|
-
|
|
66
|
+
|
|
67
|
+
// ── JSON mode: structured output, no server ──────────────────────────
|
|
100
68
|
if ((0, _print.isJsonMode)()) {
|
|
101
69
|
console.log(JSON.stringify({
|
|
102
|
-
|
|
103
|
-
clientId,
|
|
104
|
-
embedCode: embedScript
|
|
70
|
+
clientId
|
|
105
71
|
}));
|
|
106
72
|
return;
|
|
107
73
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (opts.
|
|
111
|
-
|
|
74
|
+
|
|
75
|
+
// ── --no-serve: print client ID only ────────────────────────────────
|
|
76
|
+
if (!opts.serve) {
|
|
77
|
+
console.log(clientId);
|
|
78
|
+
return;
|
|
112
79
|
}
|
|
80
|
+
|
|
81
|
+
// ── Default: launch documentation server ─────────────────────────────
|
|
82
|
+
const html = (0, _embedDocs.generateEmbedDocs)(clientId);
|
|
83
|
+
const server = http.createServer((_req, res) => {
|
|
84
|
+
res.writeHead(200, {
|
|
85
|
+
'Content-Type': 'text/html; charset=utf-8'
|
|
86
|
+
});
|
|
87
|
+
res.end(html);
|
|
88
|
+
});
|
|
89
|
+
server.listen(0, '127.0.0.1', () => {
|
|
90
|
+
const addr = server.address();
|
|
91
|
+
const url = `http://localhost:${addr.port}`;
|
|
92
|
+
(0, _print.success)(`Embed documentation ready at ${url}`);
|
|
93
|
+
(0, _print.info)('Opening in your browser...');
|
|
94
|
+
(0, _print.info)('Press Ctrl+C to stop.');
|
|
95
|
+
openBrowser(url);
|
|
96
|
+
});
|
|
97
|
+
process.on('SIGINT', () => {
|
|
98
|
+
(0, _print.info)('\nShutting down...');
|
|
99
|
+
server.close(() => process.exit(0));
|
|
100
|
+
setTimeout(() => process.exit(0), 1000).unref();
|
|
101
|
+
});
|
|
113
102
|
} catch (err) {
|
|
114
103
|
console.error('Error:', err.message);
|
|
115
104
|
process.exit(1);
|