@rolino/cli 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +80 -61
- package/dist/bin.cjs +30 -14
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/{chunk-2B34YBKX.js → chunk-VQOMONSS.js} +32 -15
- package/dist/chunk-VQOMONSS.js.map +1 -0
- package/dist/index.cjs +30 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/dist/chunk-2B34YBKX.js.map +0 -1
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rolino/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Agent-friendly command-line interface for Rolino",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"dev": "tsx src/bin.ts"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@rolino/contracts": "0.
|
|
61
|
-
"@rolino/local-auth": "0.
|
|
62
|
-
"@rolino/sdk": "0.
|
|
60
|
+
"@rolino/contracts": "0.4.0",
|
|
61
|
+
"@rolino/local-auth": "0.4.0",
|
|
62
|
+
"@rolino/sdk": "0.4.0",
|
|
63
63
|
"commander": "^15.0.0",
|
|
64
64
|
"open": "^11.0.0"
|
|
65
65
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/exit-codes.ts","../src/mcp-setup.ts","../src/cli.ts","../package.json","../src/browser-login.ts","../src/output.ts"],"sourcesContent":["export const EXIT_CODES = {\r\n success: 0,\r\n unexpected: 1,\r\n usage: 2,\r\n authentication: 3,\r\n permission: 4,\r\n notFound: 5,\r\n conflict: 6,\r\n validation: 7,\r\n rateLimited: 8,\r\n server: 9,\r\n network: 10,\r\n timeout: 11,\r\n cancelled: 12,\r\n} as const;\r\n\r\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n","import { spawnSync } from \"node:child_process\"\r\nimport { constants } from \"node:fs\"\r\nimport {\r\n access,\r\n chmod,\r\n mkdir,\r\n readFile,\r\n rename,\r\n unlink,\r\n writeFile,\r\n} from \"node:fs/promises\"\r\nimport { createRequire } from \"node:module\"\r\nimport { homedir } from \"node:os\"\r\nimport { dirname, isAbsolute, join, resolve } from \"node:path\"\r\n\r\nexport type McpClientName = \"codex\" | \"claude-code\"\r\nexport type McpSetupScope = \"user\" | \"project\"\r\n\r\nexport type McpSetupResult = {\r\n client: McpClientName\r\n scope: McpSetupScope\r\n target: string\r\n backupPath: string | null\r\n changed: boolean\r\n dryRun: boolean\r\n server: {\r\n command: string\r\n args: string[]\r\n env: { ROLINO_URL: string }\r\n }\r\n}\r\n\r\nexport type McpSetupOptions = {\r\n client: McpClientName\r\n scope: McpSetupScope\r\n baseUrl: string\r\n cwd: string\r\n env: Record<string, string | undefined>\r\n nodePath: string\r\n cliEntryPath: string\r\n serverPath?: string\r\n dryRun?: boolean\r\n force?: boolean\r\n}\r\n\r\nconst CODEX_BEGIN = \"# BEGIN ROLINO MCP (managed by rolino setup mcp)\"\r\nconst CODEX_END = \"# END ROLINO MCP\"\r\n\r\nfunction homeDirectory(env: Record<string, string | undefined>) {\r\n return env.USERPROFILE || env.HOME || homedir()\r\n}\r\n\r\nfunction tomlString(value: string) {\r\n return JSON.stringify(value)\r\n}\r\n\r\nasync function pathExists(path: string) {\r\n try {\r\n await access(path, constants.F_OK)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nasync function resolveServerPath(options: McpSetupOptions) {\r\n if (options.serverPath) {\r\n const path = isAbsolute(options.serverPath)\r\n ? options.serverPath\r\n : resolve(options.cwd, options.serverPath)\r\n if (await pathExists(path)) return path\r\n throw new TypeError(\r\n `Rolino MCP server was not found at ${path}. Check --server-path and try again.`,\r\n )\r\n }\r\n\r\n try {\r\n const requireFromCli = createRequire(resolve(options.cliEntryPath))\r\n const installedPath = join(\r\n dirname(requireFromCli.resolve(\"@rolino/mcp\")),\r\n \"bin.js\",\r\n )\r\n if (await pathExists(installedPath)) return installedPath\r\n throw new TypeError(\r\n \"The installed @rolino/mcp package is incomplete. Reinstall it with npm install --global @rolino/mcp, or pass --server-path.\",\r\n )\r\n } catch (error) {\r\n if (error instanceof TypeError) throw error\r\n }\r\n\r\n const workspacePath = resolve(\r\n dirname(resolve(options.cliEntryPath)),\r\n \"../../mcp/dist/bin.js\",\r\n )\r\n if (await pathExists(workspacePath)) return workspacePath\r\n\r\n throw new TypeError(\r\n \"Rolino MCP is not installed. Run npm install --global @rolino/mcp, then rerun this command. From a Rolino source checkout, run npm run packages:build instead. You can also pass --server-path.\",\r\n )\r\n}\r\n\r\nasync function readOptional(path: string) {\r\n try {\r\n return { exists: true, value: await readFile(path, \"utf8\") }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return { exists: false, value: \"\" }\r\n }\r\n throw error\r\n }\r\n}\r\n\r\nasync function replaceFile(path: string, value: string) {\r\n await mkdir(dirname(path), { recursive: true, mode: 0o700 })\r\n const temporaryPath = `${path}.rolino-${process.pid}.tmp`\r\n await writeFile(temporaryPath, value, { encoding: \"utf8\", mode: 0o600 })\r\n try {\r\n await rename(temporaryPath, path)\r\n } catch {\r\n // Windows does not consistently replace an existing file with rename().\r\n await writeFile(path, value, { encoding: \"utf8\", mode: 0o600 })\r\n await unlink(temporaryPath).catch(() => undefined)\r\n }\r\n await chmod(path, 0o600).catch(() => undefined)\r\n}\r\n\r\nasync function writeConfiguredFile(\r\n path: string,\r\n previous: { exists: boolean; value: string },\r\n value: string,\r\n) {\r\n const backupPath = previous.exists ? `${path}.rolino-backup` : null\r\n if (backupPath) await replaceFile(backupPath, previous.value)\r\n await replaceFile(path, value)\r\n return backupPath\r\n}\r\n\r\nfunction removeExistingCodexEntry(source: string, newline: string) {\r\n if (/^\\s*\\[\\[mcp_servers\\.rolino(?:\\.|\\]\\])/m.test(source)) {\r\n throw new TypeError(\r\n \"Codex config uses an unsupported array-table entry for mcp_servers.rolino.\",\r\n )\r\n }\r\n\r\n const lines = source.split(/\\r?\\n/)\r\n const kept: string[] = []\r\n let insideRolino = false\r\n\r\n for (const line of lines) {\r\n const header = line.match(/^\\s*\\[([^\\]]+)]\\s*(?:#.*)?$/)?.[1]?.trim()\r\n if (header) {\r\n insideRolino = header === \"mcp_servers.rolino\"\r\n || header.startsWith(\"mcp_servers.rolino.\")\r\n }\r\n if (!insideRolino) kept.push(line)\r\n }\r\n\r\n return kept.join(newline).trimEnd()\r\n}\r\n\r\nfunction codexBlock(server: McpSetupResult[\"server\"], newline: string) {\r\n return [\r\n CODEX_BEGIN,\r\n \"[mcp_servers.rolino]\",\r\n `command = ${tomlString(server.command)}`,\r\n `args = [${server.args.map(tomlString).join(\", \")}]`,\r\n `env = { ROLINO_URL = ${tomlString(server.env.ROLINO_URL)} }`,\r\n CODEX_END,\r\n ].join(newline)\r\n}\r\n\r\nexport function updateCodexConfig(\r\n source: string,\r\n server: McpSetupResult[\"server\"],\r\n) {\r\n const newline = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\"\r\n const block = codexBlock(server, newline)\r\n const begin = source.indexOf(CODEX_BEGIN)\r\n const end = source.indexOf(CODEX_END)\r\n\r\n if ((begin === -1) !== (end === -1) || (begin !== -1 && end < begin)) {\r\n throw new TypeError(\"Codex config contains an incomplete Rolino-managed block.\")\r\n }\r\n\r\n let unmanagedSource = source\r\n if (begin !== -1) {\r\n const after = end + CODEX_END.length\r\n unmanagedSource = `${source.slice(0, begin)}${source.slice(after)}`\r\n }\r\n\r\n const withoutRolino = removeExistingCodexEntry(unmanagedSource, newline)\r\n return `${withoutRolino ? `${withoutRolino}${newline}${newline}` : \"\"}${block}${newline}`\r\n}\r\n\r\nexport function updateClaudeProjectConfig(\r\n source: string,\r\n server: McpSetupResult[\"server\"],\r\n) {\r\n let parsed: Record<string, unknown> = {}\r\n if (source.trim()) {\r\n try {\r\n parsed = JSON.parse(source) as Record<string, unknown>\r\n } catch {\r\n throw new TypeError(\"Claude project .mcp.json is not valid JSON.\")\r\n }\r\n }\r\n if (!parsed || Array.isArray(parsed) || typeof parsed !== \"object\") {\r\n throw new TypeError(\"Claude project .mcp.json must contain a JSON object.\")\r\n }\r\n\r\n const currentServers = parsed.mcpServers\r\n if (\r\n currentServers !== undefined\r\n && (!currentServers || Array.isArray(currentServers) || typeof currentServers !== \"object\")\r\n ) {\r\n throw new TypeError(\"Claude project .mcp.json mcpServers must be an object.\")\r\n }\r\n\r\n return `${JSON.stringify({\r\n ...parsed,\r\n mcpServers: {\r\n ...(currentServers as Record<string, unknown> | undefined),\r\n rolino: { type: \"stdio\", ...server },\r\n },\r\n }, null, 2)}\\n`\r\n}\r\n\r\nfunction claudeCommand(\r\n args: string[],\r\n options: Pick<McpSetupOptions, \"cwd\" | \"env\">,\r\n) {\r\n const command = options.env.ROLINO_CLAUDE_COMMAND || \"claude\"\r\n const executable = process.platform === \"win32\"\r\n ? options.env.ComSpec || options.env.COMSPEC || \"cmd.exe\"\r\n : command\r\n const commandArgs = process.platform === \"win32\"\r\n ? [\"/d\", \"/s\", \"/c\", command, ...args]\r\n : args\r\n return spawnSync(executable, commandArgs, {\r\n cwd: options.cwd,\r\n env: options.env as NodeJS.ProcessEnv,\r\n encoding: \"utf8\",\r\n windowsHide: true,\r\n })\r\n}\r\n\r\nasync function setupCodex(\r\n options: McpSetupOptions,\r\n server: McpSetupResult[\"server\"],\r\n): Promise<McpSetupResult> {\r\n const target = options.scope === \"project\"\r\n ? join(options.cwd, \".codex\", \"config.toml\")\r\n : join(options.env.CODEX_HOME || join(homeDirectory(options.env), \".codex\"), \"config.toml\")\r\n const current = await readOptional(target)\r\n const updated = updateCodexConfig(current.value, server)\r\n const changed = updated !== current.value\r\n const backupPath = changed && current.exists\r\n ? `${target}.rolino-backup`\r\n : null\r\n if (changed && !options.dryRun) {\r\n await writeConfiguredFile(target, current, updated)\r\n }\r\n\r\n return {\r\n client: \"codex\",\r\n scope: options.scope,\r\n target,\r\n backupPath,\r\n changed,\r\n dryRun: options.dryRun ?? false,\r\n server,\r\n }\r\n}\r\n\r\nasync function setupClaudeCode(\r\n options: McpSetupOptions,\r\n server: McpSetupResult[\"server\"],\r\n): Promise<McpSetupResult> {\r\n if (options.scope === \"project\") {\r\n const target = join(options.cwd, \".mcp.json\")\r\n const current = await readOptional(target)\r\n const updated = updateClaudeProjectConfig(current.value, server)\r\n const changed = updated !== current.value\r\n const backupPath = changed && current.exists\r\n ? `${target}.rolino-backup`\r\n : null\r\n if (changed && !options.dryRun) {\r\n await writeConfiguredFile(target, current, updated)\r\n }\r\n return {\r\n client: \"claude-code\",\r\n scope: \"project\",\r\n target,\r\n backupPath,\r\n changed,\r\n dryRun: options.dryRun ?? false,\r\n server,\r\n }\r\n }\r\n\r\n const target = \"Claude Code user MCP configuration\"\r\n if (options.dryRun) {\r\n return {\r\n client: \"claude-code\",\r\n scope: \"user\",\r\n target,\r\n backupPath: null,\r\n changed: true,\r\n dryRun: true,\r\n server,\r\n }\r\n }\r\n\r\n if (options.force) {\r\n claudeCommand(\r\n [\"mcp\", \"remove\", \"rolino\", \"--scope\", \"user\"],\r\n options,\r\n )\r\n }\r\n const result = claudeCommand([\r\n \"mcp\",\r\n \"add-json\",\r\n \"rolino\",\r\n JSON.stringify({ type: \"stdio\", ...server }),\r\n \"--scope\",\r\n \"user\",\r\n ], options)\r\n if (result.error || result.status !== 0) {\r\n throw new TypeError(\r\n \"Claude Code could not add the Rolino MCP server. Install the `claude` command, or use --scope project. If Rolino already exists, rerun with --force.\",\r\n )\r\n }\r\n\r\n return {\r\n client: \"claude-code\",\r\n scope: \"user\",\r\n target,\r\n backupPath: null,\r\n changed: true,\r\n dryRun: false,\r\n server,\r\n }\r\n}\r\n\r\nexport async function setupMcp(options: McpSetupOptions): Promise<McpSetupResult> {\r\n const serverPath = await resolveServerPath(options)\r\n const server = {\r\n command: options.nodePath,\r\n args: [serverPath],\r\n env: { ROLINO_URL: options.baseUrl },\r\n }\r\n\r\n return options.client === \"codex\"\r\n ? setupCodex(options, server)\r\n : setupClaudeCode(options, server)\r\n}\r\n","import { randomUUID } from \"node:crypto\";\nimport { openAsBlob } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { basename, extname, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\r\n\r\nimport { Command, CommanderError, InvalidArgumentError } from \"commander\";\r\nimport packageManifest from \"../package.json\" with { type: \"json\" };\r\nimport {\r\n PostStatusSchema,\r\n ProjectCreateInputSchema,\r\n ProjectTypeSchema,\n PublishingProviderSchema,\n TikTokDraftSettingsSchema,\n YouTubePostSettingsSchema,\n type DraftPostInput,\n type DraftPostUpdateInput,\n type PostStatus,\r\n type ProjectType,\r\n type PublishingProvider,\r\n} from \"@rolino/contracts\";\r\nimport {\r\n RolinoApiError,\r\n RolinoClient,\r\n RolinoNetworkError,\r\n normalizeRolinoBaseUrl,\r\n parseRolinoTimeout,\r\n} from \"@rolino/sdk\";\r\n\r\nimport {\r\n CliAuthorizationDeniedError,\r\n loginWithBrowser,\r\n} from \"./browser-login.js\";\r\nimport {\r\n clearStoredCredential,\r\n resolveCredential,\r\n saveStoredCredential,\r\n} from \"@rolino/local-auth\";\r\nimport { EXIT_CODES, type ExitCode } from \"./exit-codes.js\";\r\nimport {\r\n formatActor,\r\n formatCalendarEvents,\r\n formatIntegrationHealth,\n formatProviderDeliveryOptions,\n formatMediaAsset,\n formatMediaAssets,\n formatPost,\r\n formatPostPublishPreview,\r\n formatPostReadiness,\r\n formatPostSchedulePreview,\r\n formatPostSchedulePending,\r\n formatPosts,\r\n formatProject,\r\n formatProjects,\r\n writeFailure,\r\n writeSuccess,\r\n type OutputContext,\r\n type OutputFormat,\r\n type WritableOutput,\r\n} from \"./output.js\";\r\nimport {\r\n setupMcp,\r\n type McpClientName,\r\n type McpSetupScope,\r\n} from \"./mcp-setup.js\";\r\n\r\nexport const ROLINO_CLI_VERSION = packageManifest.version;\r\n\r\ntype Runtime = {\r\n stdout: WritableOutput;\r\n stderr: WritableOutput;\r\n isTTY: boolean;\r\n env: Record<string, string | undefined>;\r\n fetch?: typeof globalThis.fetch;\r\n cwd: string;\r\n nodePath: string;\r\n cliEntryPath: string;\r\n confirm(message: string): Promise<boolean>;\r\n};\r\n\r\ntype GlobalOptions = {\r\n baseUrl?: string;\r\n output?: OutputFormat;\r\n json?: boolean;\r\n agent?: boolean;\r\n color?: boolean;\r\n timeout?: number;\r\n requestId?: string;\r\n};\r\n\r\nconst REQUEST_ID_PATTERN = /^[A-Za-z0-9._-]{1,128}$/;\r\n\r\nfunction duration(value: string) {\r\n try {\r\n return parseRolinoTimeout(value);\r\n } catch (error) {\r\n throw new InvalidArgumentError(\r\n error instanceof Error ? error.message : \"Timeout is invalid.\",\r\n );\r\n }\r\n}\r\n\r\nfunction requestId(value: string) {\r\n if (!REQUEST_ID_PATTERN.test(value)) {\r\n throw new InvalidArgumentError(\r\n \"Request ID must be 1-128 letters, numbers, dots, underscores, or dashes.\",\r\n );\r\n }\r\n return value;\r\n}\r\n\r\nfunction outputFormat(value: string): OutputFormat {\r\n if (value === \"human\" || value === \"json\" || value === \"jsonl\") return value;\r\n throw new InvalidArgumentError(\"Output must be human, json, or jsonl.\");\r\n}\r\n\r\nfunction postStatus(value: string): PostStatus {\r\n const parsed = PostStatusSchema.safeParse(value.toUpperCase());\r\n if (parsed.success) return parsed.data;\r\n throw new InvalidArgumentError(\r\n `Status must be one of ${PostStatusSchema.options.join(\", \")}.`,\r\n );\r\n}\r\n\r\nfunction projectType(value: string): ProjectType {\r\n const parsed = ProjectTypeSchema.safeParse(value.toUpperCase());\r\n if (parsed.success) return parsed.data;\r\n throw new InvalidArgumentError(\r\n `Type must be one of ${ProjectTypeSchema.options.join(\", \")}.`,\r\n );\r\n}\r\n\r\nfunction publishingProvider(value: string): PublishingProvider {\r\n const normalized = value.toUpperCase();\r\n const parsed = PublishingProviderSchema.safeParse(normalized);\r\n if (parsed.success) return parsed.data;\r\n throw new InvalidArgumentError(\r\n `Platform must be one of ${PublishingProviderSchema.options.join(\", \")}.`,\r\n );\r\n}\r\n\r\nfunction collectPublishingProvider(\r\n value: string,\r\n previous: PublishingProvider[] | undefined,\r\n) {\r\n return [...(previous ?? []), publishingProvider(value)];\r\n}\r\n\r\nfunction collectString(value: string, previous: string[] | undefined) {\n return [...(previous ?? []), value];\n}\n\nfunction tiktokPostMode(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"direct\" || normalized === \"direct_post\") {\n return \"DIRECT_POST\" as const;\n }\n if (normalized === \"inbox\" || normalized === \"media_upload\") {\n return \"MEDIA_UPLOAD\" as const;\n }\n throw new InvalidArgumentError(\"TikTok mode must be direct or inbox.\");\n}\n\nfunction nonnegativeInteger(value: string) {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new InvalidArgumentError(\"Expected a nonnegative integer.\");\n }\n return parsed;\n}\n\r\nfunction youtubePrivacy(value: string) {\r\n const normalized = value.toUpperCase();\r\n if (\r\n normalized === \"PUBLIC\"\r\n || normalized === \"UNLISTED\"\r\n || normalized === \"PRIVATE\"\r\n ) {\r\n return normalized;\r\n }\r\n throw new InvalidArgumentError(\r\n \"YouTube privacy must be PUBLIC, UNLISTED, or PRIVATE.\",\r\n );\r\n}\r\n\r\nfunction yesOrNo(value: string) {\n const normalized = value.trim().toLowerCase();\r\n if (normalized === \"yes\") return true;\r\n if (normalized === \"no\") return false;\r\n throw new InvalidArgumentError(\"Expected yes or no.\");\r\n}\r\n\r\ntype YouTubeDraftOptions = {\n platform?: PublishingProvider[];\n youtubeTitle?: string;\r\n youtubeCategoryId?: string;\r\n youtubePrivacy?: \"PUBLIC\" | \"UNLISTED\" | \"PRIVATE\";\r\n youtubeMadeForKids?: boolean;\n youtubeSyntheticMedia?: boolean;\n youtubeNotifySubscribers?: boolean;\n youtubeTag?: string[];\n};\n\r\nfunction youtubeSettings(options: YouTubeDraftOptions) {\r\n const hasYouTubeOptions = options.youtubeTitle !== undefined\r\n || options.youtubeCategoryId !== undefined\r\n || options.youtubePrivacy !== undefined\r\n || options.youtubeMadeForKids !== undefined\r\n || options.youtubeSyntheticMedia === true\r\n || options.youtubeNotifySubscribers === false\r\n || (options.youtubeTag?.length ?? 0) > 0;\n if (!hasYouTubeOptions) return null;\r\n\r\n return YouTubePostSettingsSchema.parse({\r\n title: options.youtubeTitle,\r\n categoryId: options.youtubeCategoryId,\r\n privacyStatus: options.youtubePrivacy,\r\n madeForKids: options.youtubeMadeForKids,\r\n containsSyntheticMedia: options.youtubeSyntheticMedia ?? false,\r\n notifySubscribers: options.youtubeNotifySubscribers ?? true,\r\n tags: options.youtubeTag ?? [],\n });\r\n}\r\n\r\nfunction positiveInteger(value: string) {\r\n const parsed = Number(value);\r\n if (!Number.isSafeInteger(parsed) || parsed < 1) {\r\n throw new InvalidArgumentError(\"Expected version must be a positive integer.\");\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction mcpClient(value: string): McpClientName {\r\n if (value === \"codex\" || value === \"claude-code\") return value;\r\n throw new InvalidArgumentError(\"MCP client must be codex or claude-code.\");\r\n}\r\n\r\nfunction mcpScope(value: string): McpSetupScope {\r\n if (value === \"user\" || value === \"project\") return value;\r\n throw new InvalidArgumentError(\"MCP setup scope must be user or project.\");\r\n}\r\n\r\nfunction isoDateTime(value: string) {\r\n const date = new Date(value);\r\n if (Number.isNaN(date.getTime())) {\r\n throw new InvalidArgumentError(\"Date and time must be a valid ISO-8601 value.\");\r\n }\r\n return date.toISOString();\r\n}\r\n\r\nclass CliUserCancelledError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"CliUserCancelledError\";\r\n }\r\n}\r\n\r\nasync function confirmInTerminal(message: string) {\r\n const prompt = createInterface({ input: process.stdin, output: process.stderr });\r\n try {\r\n const answer = await prompt.question(`${message}\\nContinue? [y/N] `);\r\n return answer.trim().toLowerCase() === \"y\"\r\n || answer.trim().toLowerCase() === \"yes\";\r\n } finally {\r\n prompt.close();\r\n }\r\n}\r\n\r\nasync function requireWriteConsent(options: {\r\n yes?: boolean;\r\n global: GlobalOptions;\r\n runtime: Runtime;\r\n preview: string;\r\n subject?: \"draft\" | \"project\" | \"media\";\n}) {\n if (options.yes) return;\r\n const projectCreation = options.subject === \"project\";\n const mediaUpload = options.subject === \"media\";\n if (options.global.agent || !options.runtime.isTTY) {\r\n throw new TypeError(\r\n projectCreation\r\n ? \"Project creation requires explicit consent. Review the command and pass --yes.\"\n : mediaUpload\n ? \"Media upload requires explicit consent. Review the command and pass --yes.\"\n : \"Draft writes require explicit consent. Review the command and pass --yes.\",\n );\r\n }\r\n if (!await options.runtime.confirm(options.preview)) {\r\n throw new CliUserCancelledError(\r\n projectCreation\r\n ? \"Project creation was cancelled.\"\n : mediaUpload\n ? \"The media upload was cancelled.\"\n : \"The draft write was cancelled.\",\n );\r\n }\r\n}\r\n\r\nfunction formatMcpSetupPreview(result: Awaited<ReturnType<typeof setupMcp>>) {\r\n return [\r\n `Client: ${result.client === \"codex\" ? \"Codex\" : \"Claude Code\"}`,\r\n `Scope: ${result.scope}`,\r\n `Target: ${result.target}`,\r\n `Command: ${result.server.command}`,\r\n `Arguments: ${result.server.args.join(\" \")}`,\r\n `Rolino URL: ${result.server.env.ROLINO_URL}`,\r\n \"No token will be written to MCP configuration.\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction resolveFormat(options: GlobalOptions, runtime: Runtime): OutputFormat {\r\n if (options.agent || options.json) return \"json\";\r\n if (options.output) return options.output;\r\n const fromEnvironment = runtime.env.ROLINO_OUTPUT;\r\n if (fromEnvironment) return outputFormat(fromEnvironment);\r\n return runtime.isTTY ? \"human\" : \"json\";\r\n}\r\n\r\nfunction baseUrlFor(options: GlobalOptions, runtime: Runtime) {\r\n return normalizeRolinoBaseUrl(\r\n options.baseUrl ?? runtime.env.ROLINO_URL ?? \"https://getrolino.com\",\r\n );\r\n}\r\n\r\nfunction clientFor(options: GlobalOptions, runtime: Runtime) {\r\n const timeoutMs = options.timeout\r\n ?? (runtime.env.ROLINO_TIMEOUT ? duration(runtime.env.ROLINO_TIMEOUT) : 15_000);\r\n\r\n const baseUrl = baseUrlFor(options, runtime);\r\n const credential = resolveCredential(baseUrl, runtime.env);\r\n return new RolinoClient({\r\n baseUrl,\r\n token: credential.token ?? undefined,\r\n timeoutMs,\r\n fetch: runtime.fetch,\r\n });\r\n}\r\n\r\nfunction exitCodeFor(error: unknown): ExitCode {\r\n if (error instanceof CliAuthorizationDeniedError\r\n || error instanceof CliUserCancelledError) {\r\n return EXIT_CODES.cancelled;\r\n }\r\n if (error instanceof RolinoNetworkError) {\r\n return error.kind === \"TIMEOUT\" ? EXIT_CODES.timeout : EXIT_CODES.network;\r\n }\r\n if (error instanceof RolinoApiError) {\r\n switch (error.code) {\r\n case \"AUTH_REQUIRED\": return EXIT_CODES.authentication;\n case \"FORBIDDEN\": return EXIT_CODES.permission;\n case \"BILLING_REQUIRED\": return EXIT_CODES.permission;\n case \"NOT_FOUND\":\n case \"FEATURE_DISABLED\": return EXIT_CODES.notFound;\n case \"LIMIT_REACHED\": return EXIT_CODES.conflict;\n case \"CONFLICT\": return EXIT_CODES.conflict;\n case \"VALIDATION_ERROR\": return EXIT_CODES.validation;\r\n case \"RATE_LIMITED\": return EXIT_CODES.rateLimited;\r\n case \"INTERNAL_ERROR\": return EXIT_CODES.server;\r\n }\r\n }\r\n if (error instanceof TypeError) return EXIT_CODES.usage;\r\n return EXIT_CODES.unexpected;\r\n}\r\n\r\nfunction errorForOutput(error: unknown) {\n if (error instanceof CliAuthorizationDeniedError\r\n || error instanceof CliUserCancelledError) {\r\n return { code: \"CANCELLED\", message: error.message };\r\n }\r\n if (error instanceof RolinoApiError) {\r\n return {\r\n code: error.code,\r\n message: error.message,\r\n requestId: error.requestId,\r\n retryAfterSeconds: error.retryAfterSeconds,\r\n };\r\n }\r\n if (error instanceof RolinoNetworkError) {\r\n return { code: error.kind, message: error.message };\r\n }\r\n if (error instanceof TypeError) {\r\n return { code: \"USAGE_ERROR\", message: error.message };\r\n }\r\n if (error instanceof Error) {\r\n return { code: \"CLI_ERROR\", message: error.message };\r\n }\r\n return { code: \"CLI_ERROR\", message: \"The command failed unexpectedly.\" };\n}\n\ntype TikTokDraftOptions = {\n tiktokMode?: \"DIRECT_POST\" | \"MEDIA_UPLOAD\";\n tiktokVisibility?: string;\n tiktokComments?: boolean;\n tiktokDuet?: boolean;\n tiktokStitch?: boolean;\n tiktokCommercialContent?: boolean;\n tiktokPromotesOwnBrand?: boolean;\n tiktokPromotesThirdParty?: boolean;\n tiktokAiGenerated?: boolean;\n tiktokCoverTimestampMs?: number;\n tiktokSettingsReviewed?: boolean;\n};\n\nfunction tiktokSettings(options: TikTokDraftOptions) {\n const hasTikTokOptions = options.tiktokMode !== undefined\n || options.tiktokVisibility !== undefined\n || options.tiktokComments !== undefined\n || options.tiktokDuet !== undefined\n || options.tiktokStitch !== undefined\n || options.tiktokCommercialContent !== undefined\n || options.tiktokPromotesOwnBrand !== undefined\n || options.tiktokPromotesThirdParty !== undefined\n || options.tiktokAiGenerated !== undefined\n || options.tiktokCoverTimestampMs !== undefined\n || options.tiktokSettingsReviewed === true;\n if (!hasTikTokOptions) return undefined;\n\n return TikTokDraftSettingsSchema.parse({\n postMode: options.tiktokMode,\n privacyLevel: options.tiktokVisibility,\n allowComment: options.tiktokComments,\n allowDuet: options.tiktokDuet,\n allowStitch: options.tiktokStitch,\n commercialContentEnabled: options.tiktokCommercialContent,\n promotesOwnBrand: options.tiktokPromotesOwnBrand,\n promotesThirdParty: options.tiktokPromotesThirdParty,\n isAiGenerated: options.tiktokAiGenerated,\n videoCoverTimestampMs: options.tiktokCoverTimestampMs,\n reviewed: options.tiktokSettingsReviewed === true,\n });\n}\n\nfunction recoverySuggestions(code: string, command: string) {\n switch (code) {\n case \"AUTH_REQUIRED\":\n return [\n \"rolino auth login\",\n \"After browser approval, run: rolino --agent auth status\",\n ];\n case \"FORBIDDEN\":\n return [\n \"Check granted access: rolino --agent auth status\",\n \"Ask the user to reauthorize Rolino with the required capability.\",\n ];\n case \"BILLING_REQUIRED\":\n case \"LIMIT_REACHED\":\n return [\"Open the workspace billing page: https://getrolino.com/settings/billing\"];\n case \"FEATURE_DISABLED\":\n return [\"Check the project Connections page and hosted channel availability.\"];\n case \"VALIDATION_ERROR\":\n case \"USAGE_ERROR\":\n return [`rolino ${command} --help`];\n case \"CONFLICT\":\n return [\"Fetch the latest resource state before retrying with a new decision.\"];\n case \"RATE_LIMITED\":\n return [\"Wait for retryAfterSeconds before retrying.\"];\n case \"TIMEOUT\":\n case \"NETWORK\":\n return [\n \"rolino --agent doctor\",\n \"Inspect current Rolino state before retrying a schedule or publish operation.\",\n ];\n default:\n return [];\n }\n}\n\r\nfunction commandContext(\r\n command: string,\r\n options: GlobalOptions,\r\n runtime: Runtime,\r\n): OutputContext {\r\n return {\r\n stdout: runtime.stdout,\r\n stderr: runtime.stderr,\r\n format: resolveFormat(options, runtime),\r\n agent: options.agent ?? false,\r\n command,\r\n requestId: options.requestId ?? randomUUID(),\r\n };\r\n}\r\n\r\nasync function execute(options: {\r\n command: string;\r\n global: GlobalOptions;\r\n runtime: Runtime;\r\n action(context: OutputContext, client: RolinoClient): Promise<void>;\r\n}) {\r\n let context: OutputContext = {\r\n stdout: options.runtime.stdout,\r\n stderr: options.runtime.stderr,\r\n format: options.runtime.isTTY ? \"human\" : \"json\",\r\n agent: options.global.agent ?? false,\r\n command: options.command,\r\n requestId: options.global.requestId ?? randomUUID(),\r\n };\r\n\r\n try {\n context = commandContext(options.command, options.global, options.runtime);\r\n await options.action(context, clientFor(options.global, options.runtime));\r\n return EXIT_CODES.success;\r\n } catch (error) {\n const outputError = errorForOutput(error);\n writeFailure(context, {\n ...outputError,\n suggestions: recoverySuggestions(outputError.code, options.command),\n });\n return exitCodeFor(error);\n }\n}\n\r\nexport async function runCli(\r\n argv: string[] = process.argv,\r\n overrides: Partial<Runtime> = {},\r\n) {\r\n const runtime: Runtime = {\r\n stdout: overrides.stdout ?? process.stdout,\r\n stderr: overrides.stderr ?? process.stderr,\r\n isTTY: overrides.isTTY ?? Boolean(process.stdout.isTTY),\r\n env: overrides.env ?? process.env,\r\n fetch: overrides.fetch,\r\n cwd: overrides.cwd ?? process.cwd(),\r\n nodePath: overrides.nodePath ?? process.execPath,\r\n cliEntryPath: overrides.cliEntryPath ?? process.argv[1] ?? process.execPath,\r\n confirm: overrides.confirm ?? confirmInTerminal,\r\n };\r\n let commandExitCode: ExitCode = EXIT_CODES.success;\r\n const parserStderr: string[] = [];\r\n\r\n const program = new Command()\r\n .name(\"rolino\")\r\n .description(\"Agent-friendly command-line interface for Rolino\")\r\n .version(ROLINO_CLI_VERSION)\r\n .option(\"--base-url <url>\", \"hosted or self-hosted Rolino base URL\")\r\n .option(\"--output <format>\", \"human, json, or jsonl output\", outputFormat)\r\n .option(\"--json\", \"alias for --output json\")\r\n .option(\"--agent\", \"deterministic machine mode with next-step suggestions\")\r\n .option(\"--no-color\", \"disable color in human output\")\r\n .option(\"--timeout <duration>\", \"request timeout, for example 15s\", duration)\r\n .option(\"--request-id <id>\", \"caller correlation ID\", requestId)\r\n .showHelpAfterError()\r\n .exitOverride()\r\n .configureOutput({\r\n writeOut: (value) => runtime.stdout.write(value),\r\n writeErr: (value) => parserStderr.push(value),\r\n });\r\n\r\n program.command(\"whoami\")\r\n .description(\"Show the authenticated Rolino identity and organization\")\r\n .action(async () => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"whoami\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const actor = await client.whoami({ requestId: context.requestId });\r\n writeSuccess(\r\n context,\r\n actor,\r\n formatActor(actor),\r\n [\"rolino projects list --agent\"],\r\n );\r\n },\r\n });\r\n });\r\n\r\n const projects = program.command(\"projects\")\n .description(\"Read and create projects for the current Rolino actor\");\r\n\r\n projects.command(\"list\")\r\n .description(\"List projects\")\r\n .option(\"--limit <number>\", \"maximum projects to return\", (value) => {\r\n const parsed = Number(value);\r\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\r\n throw new InvalidArgumentError(\"Limit must be an integer from 1 to 100.\");\r\n }\r\n return parsed;\r\n })\r\n .option(\"--cursor <id>\", \"continue after a project ID\")\r\n .action(async (local: { limit?: number; cursor?: string }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"projects list\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const data = await client.projects.list(local, {\r\n requestId: context.requestId,\r\n });\r\n const suggestions = data.items.slice(0, 3).map((project) => (\r\n `rolino posts list --project ${project.id} --agent`\r\n ));\r\n writeSuccess(context, data, formatProjects(data), suggestions);\r\n },\r\n });\r\n });\r\n\r\n projects.command(\"create\")\r\n .description(\"Create a saved project with its paired brand\")\r\n .requiredOption(\"--name <name>\", \"project and paired brand name\")\r\n .option(\"--type <type>\", \"project type; defaults to PRODUCT\", projectType)\r\n .option(\"--website <url>\", \"absolute http or https website URL\")\r\n .option(\"--description <text>\", \"optional project description\")\r\n .option(\"--idempotency-key <key>\", \"stable retry key; defaults to the request ID\")\r\n .option(\"--yes\", \"confirm creation without an interactive prompt\")\r\n .action(async (local: {\r\n name: string;\r\n type?: ProjectType;\r\n website?: string;\r\n description?: string;\r\n idempotencyKey?: string;\r\n yes?: boolean;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"projects create\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const parsed = ProjectCreateInputSchema.safeParse({\r\n name: local.name,\r\n type: local.type,\r\n websiteUrl: local.website,\r\n description: local.description,\r\n });\r\n if (!parsed.success) {\r\n throw new TypeError(\r\n parsed.error.issues[0]?.message\r\n ?? \"Project creation input is invalid.\",\r\n );\r\n }\r\n await requireWriteConsent({\r\n yes: local.yes,\r\n global,\r\n runtime,\r\n subject: \"project\",\r\n preview: [\r\n `Create project \"${parsed.data.name}\"?`,\r\n `Type: ${parsed.data.type}`,\r\n `Website: ${parsed.data.websiteUrl ?? \"none\"}`,\r\n \"A paired brand will be saved with the project.\",\r\n \"No research, connection, scheduling, or publishing will occur.\",\r\n ].join(\"\\n\"),\r\n });\r\n const project = await client.projects.create(parsed.data, {\r\n requestId: context.requestId,\r\n idempotencyKey: local.idempotencyKey ?? context.requestId,\r\n });\r\n writeSuccess(\r\n context,\r\n project,\r\n formatProject(project),\r\n [`rolino projects show ${project.id} --agent`],\r\n );\r\n },\r\n });\r\n });\n\n const media = program.command(\"media\")\n .description(\"List and upload reusable project media\");\n\n media.command(\"list\")\n .description(\"List media assets in a project\")\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\n .option(\"--limit <number>\", \"maximum assets to return\", (value) => {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) throw new InvalidArgumentError(\"Limit must be an integer from 1 to 100.\");\n return parsed;\n })\n .option(\"--cursor <id>\", \"continue after a media asset ID\")\n .option(\"--type <type>\", \"IMAGE or VIDEO\", (value) => {\n const normalized = value.toUpperCase();\n if (normalized !== \"IMAGE\" && normalized !== \"VIDEO\") throw new InvalidArgumentError(\"Type must be IMAGE or VIDEO.\");\n return normalized;\n })\n .option(\"--query <text>\", \"filter by original file name\")\n .action(async (local: { project: string; limit?: number; cursor?: string; type?: \"IMAGE\" | \"VIDEO\"; query?: string }) => {\n const global = program.opts<GlobalOptions>();\n commandExitCode = await execute({\n command: \"media list\", global, runtime,\n async action(context, client) {\n const { project, ...options } = local;\n const data = await client.media.list(project, options, { requestId: context.requestId });\n writeSuccess(context, data, formatMediaAssets(data), data.items.slice(0, 3).map((asset) => `rolino posts create --project ${project} --caption <text> --media ${asset.id} --agent --yes`));\n },\n });\n });\n\n media.command(\"upload\")\n .description(\"Upload one local image or video to a project's media library\")\n .argument(\"<file-path>\")\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\n .option(\"--yes\", \"confirm upload without an interactive prompt\")\n .action(async (filePath: string, local: { project: string; yes?: boolean }) => {\n const global = program.opts<GlobalOptions>();\n commandExitCode = await execute({\n command: \"media upload\", global, runtime,\n async action(context, client) {\n const absolutePath = resolve(runtime.cwd, filePath);\n const details = await stat(absolutePath).catch(() => null);\n if (!details?.isFile()) throw new TypeError(\"The media path must point to a readable file.\");\n const contentTypes: Record<string, string> = { \".jpg\": \"image/jpeg\", \".jpeg\": \"image/jpeg\", \".png\": \"image/png\", \".webp\": \"image/webp\", \".mp4\": \"video/mp4\", \".mov\": \"video/quicktime\" };\n const contentType = contentTypes[extname(absolutePath).toLowerCase()];\n if (!contentType) throw new TypeError(\"Use a JPEG, PNG, WebP, MP4, or MOV file.\");\n await requireWriteConsent({ yes: local.yes, global, runtime, subject: \"media\", preview: [`Upload ${basename(absolutePath)} to Rolino?`, `Project: ${local.project}`, `Size: ${details.size} bytes`, \"This adds a reusable media asset but does not create, schedule, or publish a post.\"].join(\"\\n\") });\n const body = await openAsBlob(absolutePath, { type: contentType });\n const asset = await client.media.upload(local.project, { fileName: basename(absolutePath), contentType, fileSize: details.size, body }, { requestId: context.requestId });\n writeSuccess(context, asset, formatMediaAsset(asset), [`rolino posts create --project ${local.project} --caption <text> --media ${asset.id} --agent --yes`]);\n },\n });\n });\n\n const authCommands = program.command(\"auth\")\n .description(\"Authenticate the Rolino CLI\");\r\n\r\n authCommands.command(\"login\")\r\n .description(\"Authorize this CLI through your browser\")\r\n .action(async () => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"auth login\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n if (runtime.env.ROLINO_TOKEN) {\r\n throw new TypeError(\r\n \"ROLINO_TOKEN is set and overrides browser login. Unset it before saving a CLI credential.\",\r\n );\r\n }\r\n\r\n const meta = await client.meta({ requestId: context.requestId });\r\n if (!meta.authentication.cliBrowserAuthorization) {\r\n throw new TypeError(\r\n \"This Rolino server does not support browser CLI authorization.\",\r\n );\r\n }\r\n\r\n const credential = await loginWithBrowser({\r\n baseUrl: client.baseUrl,\r\n stderr: runtime.stderr,\r\n exchange: (input) => client.auth.exchangeCliAuthorization(input, {\r\n requestId: context.requestId,\r\n }),\r\n });\r\n const authenticatedClient = new RolinoClient({\r\n baseUrl: client.baseUrl,\r\n token: credential.token,\r\n timeoutMs: client.timeoutMs,\r\n fetch: runtime.fetch,\r\n });\r\n let credentialSaved = false;\r\n\r\n try {\r\n const actor = await authenticatedClient.whoami({\r\n requestId: context.requestId,\r\n });\r\n const path = saveStoredCredential(client.baseUrl, {\r\n token: credential.token,\r\n createdAt: new Date().toISOString(),\r\n expiresAt: credential.expiresAt,\r\n organization: credential.organization,\r\n }, runtime.env);\r\n credentialSaved = true;\r\n writeSuccess(\r\n context,\r\n {\r\n authenticated: true,\r\n user: actor.user,\r\n organization: actor.organization,\r\n capabilities: actor.capabilities,\r\n expiresAt: credential.expiresAt,\r\n },\r\n [\r\n `Authenticated as ${actor.user.email}.`,\r\n `Workspace: ${actor.organization.name}`,\r\n `Expires: ${credential.expiresAt}`,\r\n `Credential saved in a permission-restricted file at ${path}`,\r\n ].join(\"\\n\"),\r\n [\"rolino whoami --agent\", \"rolino projects list --agent\"],\r\n );\r\n } catch (error) {\r\n if (credentialSaved) {\r\n clearStoredCredential(client.baseUrl, runtime.env);\r\n }\r\n await authenticatedClient.auth.revokeCurrentCredential({\r\n requestId: context.requestId,\r\n }).catch(() => undefined);\r\n throw error;\r\n }\r\n },\r\n });\r\n });\r\n\r\n authCommands.command(\"status\")\r\n .description(\"Show the active CLI authentication source and identity\")\r\n .action(async () => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"auth status\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const credential = resolveCredential(client.baseUrl, runtime.env);\r\n if (credential.source === \"none\") {\r\n writeSuccess(\r\n context,\r\n { authenticated: false, source: \"none\", baseUrl: client.baseUrl },\r\n `Not authenticated for ${client.baseUrl}`,\r\n [\"rolino auth login\"],\r\n );\r\n return;\r\n }\r\n const actor = await client.whoami({ requestId: context.requestId });\r\n writeSuccess(\r\n context,\r\n {\r\n authenticated: true,\r\n source: credential.source,\r\n baseUrl: client.baseUrl,\r\n user: actor.user,\r\n organization: actor.organization,\r\n ...(credential.source === \"stored\"\r\n ? { expiresAt: credential.credential.expiresAt }\r\n : {}),\r\n },\r\n [\r\n `Authenticated as ${actor.user.email}.`,\r\n `Workspace: ${actor.organization.name}`,\r\n `Source: ${credential.source}`,\r\n ].join(\"\\n\"),\r\n );\r\n },\r\n });\r\n });\r\n\r\n authCommands.command(\"logout\")\r\n .description(\"Revoke and remove the saved CLI credential\")\r\n .action(async () => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"auth logout\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const credential = resolveCredential(client.baseUrl, runtime.env);\r\n if (credential.source === \"environment\") {\r\n throw new TypeError(\r\n \"ROLINO_TOKEN is set. Remove it from the environment instead of using auth logout.\",\r\n );\r\n }\r\n if (credential.source === \"none\") {\r\n writeSuccess(\r\n context,\r\n { revoked: false, reason: \"not_authenticated\", baseUrl: client.baseUrl },\r\n `No saved credential exists for ${client.baseUrl}`,\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n await client.auth.revokeCurrentCredential({\r\n requestId: context.requestId,\r\n });\r\n } catch (error) {\r\n const alreadyUnavailable = error instanceof RolinoApiError\r\n && (error.code === \"AUTH_REQUIRED\" || error.code === \"NOT_FOUND\");\r\n if (!alreadyUnavailable) throw error;\r\n }\r\n clearStoredCredential(client.baseUrl, runtime.env);\r\n writeSuccess(\r\n context,\r\n { revoked: true, baseUrl: client.baseUrl },\r\n \"The CLI credential was revoked and removed from this machine.\",\r\n );\r\n },\r\n });\r\n });\r\n\r\n const setup = program.command(\"setup\")\r\n .description(\"Configure local agent tools for Rolino\");\r\n\r\n setup.command(\"mcp\")\r\n .description(\"Configure the Rolino stdio MCP server for a supported client\")\r\n .requiredOption(\"--client <client>\", \"codex or claude-code\", mcpClient)\r\n .option(\"--scope <scope>\", \"user or project\", mcpScope, \"user\")\r\n .option(\"--server-path <path>\", \"absolute or working-directory-relative MCP server path\")\r\n .option(\"--dry-run\", \"show the intended configuration without writing it\")\r\n .option(\"--yes\", \"apply without an interactive confirmation\")\r\n .option(\"--force\", \"replace an existing Claude Code user-scoped Rolino server\")\r\n .action(async (local: {\r\n client: McpClientName;\r\n scope: McpSetupScope;\r\n serverPath?: string;\r\n dryRun?: boolean;\r\n yes?: boolean;\r\n force?: boolean;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"setup mcp\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const setupOptions = {\r\n ...local,\r\n baseUrl: client.baseUrl,\r\n cwd: runtime.cwd,\r\n env: runtime.env,\r\n nodePath: runtime.nodePath,\r\n cliEntryPath: runtime.cliEntryPath,\r\n };\r\n const preview = await setupMcp({ ...setupOptions, dryRun: true });\r\n let result = preview;\r\n\r\n if (!local.dryRun && preview.changed) {\r\n if (!local.yes) {\r\n if (global.agent || !runtime.isTTY) {\r\n throw new TypeError(\r\n \"MCP setup requires confirmation. Preview with --dry-run or apply with --yes.\",\r\n );\r\n }\r\n const approved = await runtime.confirm(formatMcpSetupPreview(preview));\r\n if (!approved) {\r\n throw new CliUserCancelledError(\"MCP setup was cancelled.\");\r\n }\r\n }\r\n result = await setupMcp({ ...setupOptions, dryRun: false });\r\n }\r\n const state = result.dryRun\r\n ? \"Would configure\"\r\n : result.changed\r\n ? \"Configured\"\r\n : \"Already configured\";\r\n const clientLabel = result.client === \"codex\" ? \"Codex\" : \"Claude Code\";\r\n writeSuccess(\r\n context,\r\n result,\r\n [\r\n `${state} Rolino MCP for ${clientLabel}.`,\r\n `Scope: ${result.scope}`,\r\n `Target: ${result.target}`,\r\n ...(result.backupPath && !result.dryRun\r\n ? [`Backup: ${result.backupPath}`]\r\n : []),\r\n `Rolino URL: ${client.baseUrl}`,\r\n \"No token was written to MCP configuration.\",\r\n ].join(\"\\n\"),\r\n result.client === \"codex\"\r\n ? [\"codex mcp list\", \"rolino auth login\"]\r\n : [\"claude mcp get rolino\", \"rolino auth login\"],\r\n );\r\n },\r\n });\r\n });\r\n\r\n projects.command(\"show\")\r\n .description(\"Show one project\")\r\n .argument(\"<project-id>\")\r\n .action(async (projectId: string) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"projects show\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const project = await client.projects.get(projectId, {\r\n requestId: context.requestId,\r\n });\r\n writeSuccess(\r\n context,\r\n project,\r\n formatProject(project),\r\n [`rolino posts list --project ${project.id} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n const posts = program.command(\"posts\")\r\n .description(\"Read and prepare posts in a Rolino project\");\r\n\r\n posts.command(\"create\")\r\n .description(\"Create a draft post without scheduling or publishing it\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--caption <text>\", \"draft caption; use an empty string for media-only drafts\")\r\n .option(\"--platform <provider>\", \"INSTAGRAM, TIKTOK, YOUTUBE, or BLUESKY; repeat as needed\", collectPublishingProvider, [])\n .option(\"--media <asset-id>\", \"existing project media asset ID; repeat for multiple\", collectString, [])\r\n .option(\"--instagram-caption <text>\", \"Instagram-specific caption override\")\n .option(\"--tiktok-caption <text>\", \"TikTok-specific caption override\")\n .option(\"--tiktok-mode <mode>\", \"direct publishing or inbox draft delivery\", tiktokPostMode)\n .option(\"--tiktok-visibility <value>\", \"exact visibility returned by integrations delivery-options\")\n .option(\"--tiktok-comments <yes|no>\", \"allow TikTok comments\", yesOrNo)\n .option(\"--tiktok-duet <yes|no>\", \"allow TikTok duets\", yesOrNo)\n .option(\"--tiktok-stitch <yes|no>\", \"allow TikTok stitches\", yesOrNo)\n .option(\"--tiktok-commercial-content <yes|no>\", \"declare commercial TikTok content\", yesOrNo)\n .option(\"--tiktok-promotes-own-brand <yes|no>\", \"declare own-brand promotion\", yesOrNo)\n .option(\"--tiktok-promotes-third-party <yes|no>\", \"declare third-party promotion\", yesOrNo)\n .option(\"--tiktok-ai-generated <yes|no>\", \"declare AI-generated TikTok content\", yesOrNo)\n .option(\"--tiktok-cover-timestamp-ms <number>\", \"video cover timestamp in milliseconds\", nonnegativeInteger)\n .option(\"--tiktok-settings-reviewed\", \"confirm the TikTok account choices were reviewed; separate from --yes\")\n .option(\"--youtube-caption <text>\", \"YouTube description override; otherwise the shared caption is used\")\n .option(\"--bluesky-caption <text>\", \"Bluesky-specific caption override; limited to 300 graphemes\")\n .option(\"--youtube-title <text>\", \"required YouTube video title\")\r\n .option(\"--youtube-category-id <id>\", \"required numeric YouTube video category ID\")\r\n .option(\"--youtube-privacy <status>\", \"required PUBLIC, UNLISTED, or PRIVATE visibility\", youtubePrivacy)\r\n .option(\"--youtube-made-for-kids <yes|no>\", \"required explicit YouTube audience declaration\", yesOrNo)\r\n .option(\"--youtube-synthetic-media\", \"declare realistic altered or synthetic media to YouTube\")\r\n .option(\"--no-youtube-notify-subscribers\", \"disable eligible YouTube subscriber notifications\")\r\n .option(\"--youtube-tag <tag>\", \"YouTube tag; repeat as needed\", collectString, [])\r\n .option(\"--idempotency-key <key>\", \"stable retry key; defaults to the request ID\")\r\n .option(\"--yes\", \"confirm creation without an interactive prompt\")\r\n .action(async (local: {\r\n project: string;\r\n caption: string;\r\n platform: PublishingProvider[];\r\n media: string[];\r\n instagramCaption?: string;\r\n tiktokCaption?: string;\n tiktokMode?: \"DIRECT_POST\" | \"MEDIA_UPLOAD\";\n tiktokVisibility?: string;\n tiktokComments?: boolean;\n tiktokDuet?: boolean;\n tiktokStitch?: boolean;\n tiktokCommercialContent?: boolean;\n tiktokPromotesOwnBrand?: boolean;\n tiktokPromotesThirdParty?: boolean;\n tiktokAiGenerated?: boolean;\n tiktokCoverTimestampMs?: number;\n tiktokSettingsReviewed?: boolean;\n youtubeCaption?: string;\n blueskyCaption?: string;\n youtubeTitle?: string;\r\n youtubeCategoryId?: string;\r\n youtubePrivacy?: \"PUBLIC\" | \"UNLISTED\" | \"PRIVATE\";\r\n youtubeMadeForKids?: boolean;\r\n youtubeSyntheticMedia?: boolean;\r\n youtubeNotifySubscribers?: boolean;\r\n youtubeTag: string[];\r\n idempotencyKey?: string;\r\n yes?: boolean;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts create\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n await requireWriteConsent({\r\n yes: local.yes,\r\n global,\r\n runtime,\r\n preview: [\r\n \"Create a Rolino draft post?\",\r\n `Project: ${local.project}`,\r\n `Destinations: ${local.platform.join(\", \") || \"none\"}`,\r\n \"This will not schedule or publish the post.\",\r\n ].join(\"\\n\"),\r\n });\r\n const input: DraftPostInput = {\r\n caption: local.caption,\r\n platforms: local.platform,\r\n mediaAssetIds: local.media,\r\n captionOverrides: {\r\n ...(local.instagramCaption === undefined\r\n ? {} : { INSTAGRAM: local.instagramCaption }),\r\n ...(local.tiktokCaption === undefined\r\n ? {} : { TIKTOK: local.tiktokCaption }),\r\n ...(local.youtubeCaption === undefined\n ? {} : { YOUTUBE: local.youtubeCaption }),\n ...(local.blueskyCaption === undefined\n ? {} : { BLUESKY: local.blueskyCaption }),\n },\r\n tiktokSettings: tiktokSettings(local) ?? null,\n youtubeSettings: youtubeSettings(local),\r\n };\r\n const post = await client.posts.create(local.project, input, {\r\n requestId: context.requestId,\r\n idempotencyKey: local.idempotencyKey ?? context.requestId,\r\n });\r\n writeSuccess(\r\n context,\r\n post,\r\n formatPost(post),\r\n [`rolino posts readiness ${post.id} --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n posts.command(\"update\")\n .description(\"Update selected draft fields using optimistic concurrency\")\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--expected-version <number>\", \"current post version from posts show\", positiveInteger)\r\n .option(\"--caption <text>\", \"replacement draft caption; omitted fields are preserved\")\n .option(\"--platform <provider>\", \"replacement destinations; repeat as needed\", collectPublishingProvider)\n .option(\"--clear-platforms\", \"remove every draft destination\")\n .option(\"--media <asset-id>\", \"replacement media asset ID; repeat for multiple\", collectString)\n .option(\"--clear-media\", \"remove every media asset from the draft\")\n .option(\"--instagram-caption <text>\", \"Instagram-specific caption override\")\n .option(\"--tiktok-caption <text>\", \"TikTok-specific caption override\")\n .option(\"--tiktok-mode <mode>\", \"direct publishing or inbox draft delivery\", tiktokPostMode)\n .option(\"--tiktok-visibility <value>\", \"exact visibility returned by integrations delivery-options\")\n .option(\"--tiktok-comments <yes|no>\", \"allow TikTok comments\", yesOrNo)\n .option(\"--tiktok-duet <yes|no>\", \"allow TikTok duets\", yesOrNo)\n .option(\"--tiktok-stitch <yes|no>\", \"allow TikTok stitches\", yesOrNo)\n .option(\"--tiktok-commercial-content <yes|no>\", \"declare commercial TikTok content\", yesOrNo)\n .option(\"--tiktok-promotes-own-brand <yes|no>\", \"declare own-brand promotion\", yesOrNo)\n .option(\"--tiktok-promotes-third-party <yes|no>\", \"declare third-party promotion\", yesOrNo)\n .option(\"--tiktok-ai-generated <yes|no>\", \"declare AI-generated TikTok content\", yesOrNo)\n .option(\"--tiktok-cover-timestamp-ms <number>\", \"video cover timestamp in milliseconds\", nonnegativeInteger)\n .option(\"--tiktok-settings-reviewed\", \"confirm the TikTok account choices were reviewed; separate from --yes\")\n .option(\"--youtube-caption <text>\", \"YouTube description override; otherwise the shared caption is used\")\n .option(\"--bluesky-caption <text>\", \"Bluesky-specific caption override; limited to 300 graphemes\")\n .option(\"--youtube-title <text>\", \"required YouTube video title\")\r\n .option(\"--youtube-category-id <id>\", \"required numeric YouTube video category ID\")\r\n .option(\"--youtube-privacy <status>\", \"required PUBLIC, UNLISTED, or PRIVATE visibility\", youtubePrivacy)\r\n .option(\"--youtube-made-for-kids <yes|no>\", \"required explicit YouTube audience declaration\", yesOrNo)\r\n .option(\"--youtube-synthetic-media\", \"declare realistic altered or synthetic media to YouTube\")\r\n .option(\"--no-youtube-notify-subscribers\", \"disable eligible YouTube subscriber notifications\")\r\n .option(\"--youtube-tag <tag>\", \"replacement YouTube tag; repeat as needed\", collectString)\n .option(\"--idempotency-key <key>\", \"stable retry key; defaults to the request ID\")\r\n .option(\"--yes\", \"confirm the update without an interactive prompt\")\r\n .action(async (postId: string, local: {\r\n project: string;\r\n expectedVersion: number;\r\n caption?: string;\n platform?: PublishingProvider[];\n clearPlatforms?: boolean;\n media?: string[];\n clearMedia?: boolean;\n instagramCaption?: string;\r\n tiktokCaption?: string;\n tiktokMode?: \"DIRECT_POST\" | \"MEDIA_UPLOAD\";\n tiktokVisibility?: string;\n tiktokComments?: boolean;\n tiktokDuet?: boolean;\n tiktokStitch?: boolean;\n tiktokCommercialContent?: boolean;\n tiktokPromotesOwnBrand?: boolean;\n tiktokPromotesThirdParty?: boolean;\n tiktokAiGenerated?: boolean;\n tiktokCoverTimestampMs?: number;\n tiktokSettingsReviewed?: boolean;\n youtubeCaption?: string;\n blueskyCaption?: string;\n youtubeTitle?: string;\r\n youtubeCategoryId?: string;\r\n youtubePrivacy?: \"PUBLIC\" | \"UNLISTED\" | \"PRIVATE\";\r\n youtubeMadeForKids?: boolean;\r\n youtubeSyntheticMedia?: boolean;\r\n youtubeNotifySubscribers?: boolean;\r\n youtubeTag?: string[];\n idempotencyKey?: string;\r\n yes?: boolean;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts update\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n await requireWriteConsent({\r\n yes: local.yes,\r\n global,\r\n runtime,\r\n preview: [\r\n `Update draft ${postId}?`,\n `Project: ${local.project}`,\r\n `Expected version: ${local.expectedVersion}`,\r\n \"This will not schedule or publish the post.\",\r\n ].join(\"\\n\"),\r\n });\r\n if (local.clearPlatforms && local.platform !== undefined) {\n throw new TypeError(\"Use either --platform or --clear-platforms, not both.\");\n }\n if (local.clearMedia && local.media !== undefined) {\n throw new TypeError(\"Use either --media or --clear-media, not both.\");\n }\n const captionOverrides = {\n ...(local.instagramCaption === undefined\n ? {} : { INSTAGRAM: local.instagramCaption }),\n ...(local.tiktokCaption === undefined\r\n ? {} : { TIKTOK: local.tiktokCaption }),\r\n ...(local.youtubeCaption === undefined\n ? {} : { YOUTUBE: local.youtubeCaption }),\n ...(local.blueskyCaption === undefined\n ? {} : { BLUESKY: local.blueskyCaption }),\n };\n const resolvedTikTokSettings = tiktokSettings(local);\n const resolvedYouTubeSettings = youtubeSettings(local);\n const input: DraftPostUpdateInput = {\n ...(local.caption === undefined ? {} : { caption: local.caption }),\n ...(local.platform === undefined && !local.clearPlatforms\n ? {} : { platforms: local.clearPlatforms ? [] : local.platform }),\n ...(local.media === undefined && !local.clearMedia\n ? {} : { mediaAssetIds: local.clearMedia ? [] : local.media }),\n ...(Object.keys(captionOverrides).length ? { captionOverrides } : {}),\n ...(resolvedTikTokSettings === undefined\n ? {} : { tiktokSettings: resolvedTikTokSettings }),\n ...(resolvedYouTubeSettings === null\n ? {} : { youtubeSettings: resolvedYouTubeSettings }),\n };\n const post = await client.posts.update(local.project, postId, input, {\r\n requestId: context.requestId,\r\n idempotencyKey: local.idempotencyKey ?? context.requestId,\r\n expectedVersion: local.expectedVersion,\r\n });\r\n writeSuccess(\r\n context,\r\n post,\r\n formatPost(post),\r\n [`rolino posts readiness ${post.id} --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n posts.command(\"list\")\r\n .description(\"List posts in a project\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .option(\"--limit <number>\", \"maximum posts to return\", (value) => {\r\n const parsed = Number(value);\r\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\r\n throw new InvalidArgumentError(\"Limit must be an integer from 1 to 100.\");\r\n }\r\n return parsed;\r\n })\r\n .option(\"--cursor <id>\", \"continue after a post ID\")\r\n .option(\"--status <status>\", \"filter by post status\", postStatus)\r\n .action(async (local: {\r\n project: string;\r\n limit?: number;\r\n cursor?: string;\r\n status?: PostStatus;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts list\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const { project, ...options } = local;\r\n const data = await client.posts.list(project, options, {\r\n requestId: context.requestId,\r\n });\r\n const suggestions = data.items.slice(0, 3).map((post) => (\r\n `rolino posts show ${post.id} --project ${project} --agent`\r\n ));\r\n writeSuccess(context, data, formatPosts(data), suggestions);\r\n },\r\n });\r\n });\r\n\r\n posts.command(\"show\")\r\n .description(\"Show one post\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .action(async (postId: string, local: { project: string }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts show\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const post = await client.posts.get(local.project, postId, {\r\n requestId: context.requestId,\r\n });\r\n writeSuccess(context, post, formatPost(post));\r\n },\r\n });\r\n });\r\n\r\n posts.command(\"readiness\")\r\n .description(\"Show deterministic publishing readiness for one post\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .action(async (postId: string, local: { project: string }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts readiness\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const readiness = await client.posts.readiness(\r\n local.project,\r\n postId,\r\n { requestId: context.requestId },\r\n );\r\n writeSuccess(\r\n context,\r\n readiness,\r\n formatPostReadiness(readiness),\r\n [`rolino integrations health --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n const schedule = posts.command(\"schedule\")\r\n .description(\"Preview and execute server-confirmed post scheduling\");\r\n\r\n schedule.command(\"preview\")\r\n .description(\"Validate an exact schedule and issue a five-minute confirmation\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--expected-version <number>\", \"current post version from posts show\", positiveInteger)\r\n .requiredOption(\"--at <datetime>\", \"ISO-8601 publishing time\", isoDateTime)\r\n .requiredOption(\"--timezone <iana-timezone>\", \"IANA timezone such as America/Toronto\")\r\n .action(async (postId: string, local: {\r\n project: string;\r\n expectedVersion: number;\r\n at: string;\r\n timezone: string;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts schedule preview\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const preview = await client.posts.previewSchedule(\r\n local.project,\r\n postId,\r\n { scheduledAt: local.at, timezone: local.timezone },\r\n {\r\n expectedVersion: local.expectedVersion,\r\n requestId: context.requestId,\r\n },\r\n );\r\n writeSuccess(\r\n context,\r\n preview,\r\n formatPostSchedulePreview(preview),\r\n [\r\n `rolino posts schedule execute ${postId} --project ${local.project} --expected-version ${local.expectedVersion} --at ${preview.schedule.scheduledAt} --timezone ${preview.schedule.timezone} --confirmation-token <token> --agent`,\r\n ],\r\n );\r\n },\r\n });\r\n });\r\n\r\n schedule.command(\"execute\")\r\n .description(\"Consume a matching confirmation and schedule the post\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--expected-version <number>\", \"version used by schedule preview\", positiveInteger)\r\n .requiredOption(\"--at <datetime>\", \"exact ISO-8601 time returned by preview\", isoDateTime)\r\n .requiredOption(\"--timezone <iana-timezone>\", \"exact IANA timezone returned by preview\")\r\n .option(\"--confirmation-token <token>\", \"one-time token returned by schedule preview; ROLINO_CONFIRMATION_TOKEN is safer for scripts\")\r\n .option(\"--idempotency-key <key>\", \"stable retry key; defaults to the request ID\")\r\n .action(async (postId: string, local: {\r\n project: string;\r\n expectedVersion: number;\r\n at: string;\r\n timezone: string;\r\n confirmationToken?: string;\r\n idempotencyKey?: string;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts schedule execute\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const confirmationToken = local.confirmationToken\r\n ?? runtime.env.ROLINO_CONFIRMATION_TOKEN;\r\n if (!confirmationToken) {\r\n throw new TypeError(\r\n \"A confirmation token is required. Preview first, then use --confirmation-token or ROLINO_CONFIRMATION_TOKEN.\",\r\n );\r\n }\r\n const result = await client.posts.executeSchedule(\r\n local.project,\r\n postId,\r\n {\r\n scheduledAt: local.at,\r\n timezone: local.timezone,\r\n confirmationToken,\r\n },\r\n {\r\n expectedVersion: local.expectedVersion,\r\n idempotencyKey: local.idempotencyKey ?? context.requestId,\r\n requestId: context.requestId,\r\n },\r\n );\r\n writeSuccess(\r\n context,\r\n result,\r\n result.status === \"PENDING\"\r\n ? formatPostSchedulePending(result)\r\n : formatPost(result),\r\n [`rolino calendar list --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n const publish = posts.command(\"publish\")\r\n .description(\"Preview and queue server-confirmed immediate publishing\");\r\n\r\n publish.command(\"preview\")\r\n .description(\"Validate exact destinations and issue a five-minute confirmation\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--expected-version <number>\", \"current post version from posts show\", positiveInteger)\r\n .requiredOption(\"--platform <provider>\", \"INSTAGRAM, TIKTOK, YOUTUBE, or BLUESKY; repeat as needed\", collectPublishingProvider)\n .action(async (postId: string, local: {\r\n project: string;\r\n expectedVersion: number;\r\n platform: PublishingProvider[];\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts publish preview\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const preview = await client.posts.previewPublish(\r\n local.project,\r\n postId,\r\n { destinations: local.platform },\r\n {\r\n expectedVersion: local.expectedVersion,\r\n requestId: context.requestId,\r\n },\r\n );\r\n const platforms = preview.destinations\r\n .map((provider) => `--platform ${provider}`)\r\n .join(\" \");\r\n writeSuccess(\r\n context,\r\n preview,\r\n formatPostPublishPreview(preview),\r\n [\r\n `rolino posts publish execute ${postId} --project ${local.project} --expected-version ${local.expectedVersion} ${platforms} --confirmation-token <token> --agent`,\r\n ],\r\n );\r\n },\r\n });\r\n });\r\n\r\n publish.command(\"execute\")\r\n .description(\"Consume a matching confirmation and queue publishing now\")\r\n .argument(\"<post-id>\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .requiredOption(\"--expected-version <number>\", \"version used by publish preview\", positiveInteger)\r\n .requiredOption(\"--platform <provider>\", \"exact destination from preview; repeat for both\", collectPublishingProvider)\r\n .option(\"--confirmation-token <token>\", \"one-time token returned by publish preview; ROLINO_CONFIRMATION_TOKEN is safer for scripts\")\r\n .option(\"--idempotency-key <key>\", \"stable retry key; defaults to the request ID\")\r\n .action(async (postId: string, local: {\r\n project: string;\r\n expectedVersion: number;\r\n platform: PublishingProvider[];\r\n confirmationToken?: string;\r\n idempotencyKey?: string;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"posts publish execute\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const confirmationToken = local.confirmationToken\r\n ?? runtime.env.ROLINO_CONFIRMATION_TOKEN;\r\n if (!confirmationToken) {\r\n throw new TypeError(\r\n \"A confirmation token is required. Preview first, then use --confirmation-token or ROLINO_CONFIRMATION_TOKEN.\",\r\n );\r\n }\r\n const post = await client.posts.executePublish(\r\n local.project,\r\n postId,\r\n {\r\n destinations: local.platform,\r\n confirmationToken,\r\n },\r\n {\r\n expectedVersion: local.expectedVersion,\r\n idempotencyKey: local.idempotencyKey ?? context.requestId,\r\n requestId: context.requestId,\r\n },\r\n );\r\n writeSuccess(\r\n context,\r\n post,\r\n formatPost(post),\r\n [`rolino posts show ${postId} --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\r\n\r\n const integrations = program.command(\"integrations\")\r\n .description(\"Read publishing integration state\");\r\n\r\n integrations.command(\"health\")\n .description(\"Show cached health for every enabled publishing provider\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .action(async (local: { project: string }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"integrations health\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const health = await client.integrations.health(local.project, {\r\n requestId: context.requestId,\r\n });\r\n writeSuccess(\r\n context,\r\n health,\r\n formatIntegrationHealth(health),\r\n [`rolino posts list --project ${local.project} --agent`],\r\n );\r\n },\r\n });\r\n });\n\n integrations.command(\"delivery-options\")\n .description(\"Refresh secret-safe creator delivery choices for one provider\")\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\n .requiredOption(\"--provider <provider>\", \"publishing provider; currently TIKTOK\", publishingProvider)\n .action(async (local: { project: string; provider: PublishingProvider }) => {\n const global = program.opts<GlobalOptions>();\n commandExitCode = await execute({\n command: \"integrations delivery-options\",\n global,\n runtime,\n async action(context, client) {\n if (local.provider !== \"TIKTOK\") {\n throw new TypeError(\"Delivery options are currently available for TIKTOK.\");\n }\n const options = await client.integrations.deliveryOptions(\n local.project,\n local.provider,\n { requestId: context.requestId },\n );\n writeSuccess(\n context,\n options,\n formatProviderDeliveryOptions(options),\n [`rolino posts create --project ${local.project} --caption <text> --platform TIKTOK --agent --yes`],\n );\n },\n });\n });\n\r\n const calendar = program.command(\"calendar\")\r\n .description(\"Read scheduled publishing events\");\r\n\r\n calendar.command(\"list\")\r\n .description(\"List scheduled posts in a bounded calendar window\")\r\n .requiredOption(\"--project <project-id>\", \"exact Rolino project ID\")\r\n .option(\"--from <datetime>\", \"inclusive ISO-8601 window start\", isoDateTime)\r\n .option(\"--to <datetime>\", \"exclusive ISO-8601 window end\", isoDateTime)\r\n .option(\"--limit <number>\", \"maximum events to return\", (value) => {\r\n const parsed = Number(value);\r\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {\r\n throw new InvalidArgumentError(\"Limit must be an integer from 1 to 100.\");\r\n }\r\n return parsed;\r\n })\r\n .option(\"--cursor <cursor>\", \"continue from a calendar cursor\")\r\n .action(async (local: {\r\n project: string;\r\n from?: string;\r\n to?: string;\r\n limit?: number;\r\n cursor?: string;\r\n }) => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"calendar list\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n if ((local.from === undefined) !== (local.to === undefined)) {\r\n throw new TypeError(\"--from and --to must be provided together.\");\r\n }\r\n const { project, ...options } = local;\r\n const events = await client.calendar.list(project, options, {\r\n requestId: context.requestId,\r\n });\r\n writeSuccess(\r\n context,\r\n events,\r\n formatCalendarEvents(events),\r\n events.items.slice(0, 3).map((event) => (\r\n `rolino posts show ${event.postId} --project ${project} --agent`\r\n )),\r\n );\r\n },\r\n });\r\n });\r\n\r\n program.command(\"doctor\")\r\n .description(\"Check configuration, compatibility, and authentication\")\r\n .action(async () => {\r\n const global = program.opts<GlobalOptions>();\r\n commandExitCode = await execute({\r\n command: \"doctor\",\r\n global,\r\n runtime,\r\n async action(context, client) {\r\n const meta = await client.meta({ requestId: context.requestId });\r\n const checks = [\r\n {\r\n name: \"server\",\r\n status: \"pass\",\r\n message: `${meta.name} ${meta.serverVersion} is reachable.`,\r\n },\r\n {\r\n name: \"api\",\r\n status: meta.apiVersion === \"v1\" ? \"pass\" : \"fail\",\r\n message: `API ${meta.apiVersion}, contracts ${meta.contractVersion}.`,\r\n },\r\n {\r\n name: \"remote-mcp\",\r\n status: meta.mcp.streamableHttp ? \"pass\" : \"info\",\r\n message: meta.mcp.streamableHttp\r\n ? \"Remote Streamable HTTP is available.\"\r\n : \"Remote MCP is gated; use the stdio server.\",\r\n },\r\n ];\r\n\r\n const credential = resolveCredential(client.baseUrl, runtime.env);\r\n if (credential.source !== \"none\") {\r\n const actor = await client.whoami({ requestId: context.requestId });\r\n checks.push({\r\n name: \"authentication\",\r\n status: \"pass\",\r\n message: `Authenticated as ${actor.user.email} via ${credential.source} credential.`,\r\n });\r\n } else {\r\n checks.push({\r\n name: \"authentication\",\r\n status: \"info\",\r\n message: \"No environment or saved credential is available; run rolino auth login.\",\r\n });\r\n }\r\n\r\n const data = { healthy: true, checks, server: meta };\r\n const human = checks\r\n .map((check) => `${check.status.toUpperCase()}\\t${check.name}\\t${check.message}`)\r\n .join(\"\\n\");\r\n writeSuccess(context, data, human);\r\n },\r\n });\r\n });\r\n\r\n try {\r\n await program.parseAsync(argv);\r\n return commandExitCode;\r\n } catch (error) {\r\n if (error instanceof CommanderError) {\r\n if (error.code === \"commander.helpDisplayed\"\r\n || error.code === \"commander.version\") {\r\n return EXIT_CODES.success;\r\n }\r\n\r\n const global = program.opts<GlobalOptions>();\r\n let context: OutputContext;\r\n try {\r\n context = commandContext(\"usage\", global, runtime);\r\n } catch {\r\n context = {\r\n stdout: runtime.stdout,\r\n stderr: runtime.stderr,\r\n format: runtime.isTTY ? \"human\" : \"json\",\r\n agent: global.agent ?? false,\r\n command: \"usage\",\r\n requestId: global.requestId ?? randomUUID(),\r\n };\r\n }\r\n\r\n if (context.format === \"human\") {\r\n runtime.stderr.write(\r\n parserStderr.join(\"\") || `Error: ${error.message}\\n`,\r\n );\r\n } else {\r\n writeFailure(context, {\r\n code: \"USAGE_ERROR\",\r\n message: error.message,\r\n });\r\n }\r\n return EXIT_CODES.usage;\r\n }\r\n throw error;\r\n }\r\n}\r\n","{\n \"name\": \"@rolino/cli\",\n \"version\": \"0.2.0\",\n \"description\": \"Agent-friendly command-line interface for Rolino\",\n \"type\": \"module\",\n \"license\": \"MIT\",\n \"keywords\": [\n \"rolino\",\n \"cli\",\n \"social-media\",\n \"automation\",\n \"ai-agent\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/deifos/rolino.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/deifos/rolino/tree/main/packages/cli#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/deifos/rolino/issues\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"rolino\": \"./dist/bin.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist/**/*.js\",\n \"dist/**/*.cjs\",\n \"dist/**/*.map\",\n \"dist/**/*.d.ts\",\n \"dist/**/*.d.cts\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts src/bin.ts --format esm,cjs --dts --sourcemap --clean\",\n \"typecheck\": \"tsc --noEmit\",\n \"dev\": \"tsx src/bin.ts\"\n },\n \"dependencies\": {\n \"@rolino/contracts\": \"0.2.0\",\n \"@rolino/local-auth\": \"0.2.0\",\n \"@rolino/sdk\": \"0.2.0\",\n \"commander\": \"^15.0.0\",\n \"open\": \"^11.0.0\"\n },\n \"devDependencies\": {\n \"tsx\": \"^4.21.0\"\n },\n \"engines\": {\n \"node\": \">=20.19.0\"\n }\n}\n","import { createHash, randomBytes, timingSafeEqual } from \"node:crypto\";\r\nimport { createServer, type ServerResponse } from \"node:http\";\r\nimport { hostname } from \"node:os\";\r\n\r\nimport {\r\n CLI_BROWSER_AUTHORIZATION_TIMEOUT_MS,\r\n type CliAuthorizationCredential,\r\n} from \"@rolino/contracts\";\r\nimport open from \"open\";\r\n\r\nimport type { WritableOutput } from \"./output.js\";\r\n\r\nconst PAGE_HEADERS = {\r\n \"cache-control\": \"no-store\",\r\n \"content-security-policy\": \"default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'\",\r\n \"content-type\": \"text/html; charset=utf-8\",\r\n \"referrer-policy\": \"no-referrer\",\r\n \"x-content-type-options\": \"nosniff\",\r\n};\r\n\r\nconst ROLINO_MASCOT_SVG = '<svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\"><path fill=\"#34C78A\" d=\"M256 142c-48-29-71-58-62-84 28-4 52 11 62 36 10-25 34-40 62-36 9 26-14 55-62 84Z\"/><path fill=\"#FACC15\" stroke=\"#0F172A\" stroke-width=\"12\" stroke-linejoin=\"round\" d=\"M256 112c-89 0-156 74-156 176v57c0 31 19 54 50 54h212c31 0 50-23 50-54v-57c0-102-67-176-156-176Z\"/><circle cx=\"204\" cy=\"272\" r=\"18\" fill=\"#0F172A\"/><circle cx=\"308\" cy=\"272\" r=\"18\" fill=\"#0F172A\"/><path fill=\"none\" stroke=\"#0F172A\" stroke-linecap=\"round\" stroke-width=\"16\" d=\"M226 318c18 25 42 25 60 0\"/></svg>';\r\n\r\nfunction escapeHtml(value: string) {\r\n return value.replace(/[&<>\"']/g, (character) => ({\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n })[character]!);\r\n}\r\n\r\nexport function renderCliAuthorizationResultPage(options: {\r\n title: string;\r\n message: string;\r\n success: boolean;\r\n}) {\r\n const tone = options.success ? \"success\" : \"failure\";\r\n const eyebrow = options.success ? \"CLI handoff complete\" : \"CLI handoff paused\";\r\n const detail = options.success\r\n ? '<div class=\"terminal\" aria-label=\"Terminal authentication status\"><div class=\"terminal-bar\"><i></i><i></i><i></i><span>ROLINO CLI</span></div><div class=\"command\"><b>$</b> rolino whoami</div><div class=\"terminal-result\"><span>✓</span> Authenticated. Ready for your next command.</div></div>'\r\n : '<div class=\"return-note\"><span>→</span><div><strong>Return to your terminal</strong><small>Start the login flow again when you are ready.</small></div></div>';\r\n\r\n return `<!doctype html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n <meta name=\"color-scheme\" content=\"light\">\r\n <title>${escapeHtml(options.title)} · Rolino</title>\r\n <style>\r\n *{box-sizing:border-box}\r\n html,body{height:100%;margin:0}\r\n body{min-height:100svh;overflow:hidden;background:#faf9f1;color:#0f172a;font-family:\"Poppins\",\"Avenir Next\",\"Trebuchet MS\",ui-rounded,system-ui,sans-serif}\r\n .shell{position:relative;isolation:isolate;display:grid;min-height:100svh;grid-template-rows:auto 1fr auto;padding:clamp(18px,3vw,38px);overflow:hidden}\r\n .shape{position:absolute;z-index:-1;border-radius:999px;pointer-events:none}\r\n .shape-a{top:-160px;left:-130px;width:390px;height:390px;background:#facc1530;filter:blur(2px)}\r\n .shape-b{right:-100px;bottom:-160px;width:360px;height:360px;background:#34c78a20}\r\n .shape-c{right:9%;top:14%;width:22px;height:22px;background:#ef6a5b;transform:rotate(18deg);border-radius:7px}\r\n .topbar,.footer{display:flex;width:min(100%,1100px);margin:auto;align-items:center;justify-content:space-between}\r\n .brand{display:flex;align-items:center;gap:10px;color:#0f172a;font-size:22px;font-weight:800;letter-spacing:-.04em}\r\n .brand svg{display:block;width:36px;height:36px}\r\n .secure{display:flex;align-items:center;gap:8px;color:#52607a;font-size:11px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}\r\n .secure-dot{display:block;width:8px;height:8px;border-radius:50%;background:#34c78a;box-shadow:0 0 0 5px #34c78a1f}\r\n .stage{display:grid;min-height:0;place-items:center;padding:12px 0}\r\n .panel{width:min(100%,590px);padding:clamp(26px,4vw,46px);text-align:center;background:#fffefa;border:1px solid #e3e6ed;border-radius:32px;box-shadow:0 36px 90px -52px #0f172a73;animation:arrive .55s cubic-bezier(.22,1,.36,1) both}\r\n .mascot-wrap{position:relative;display:grid;width:112px;height:96px;margin:0 auto 12px;place-items:center}\r\n .mascot-wrap:before{position:absolute;width:88px;height:88px;border-radius:50%;background:#fff4a8;content:\"\";box-shadow:0 0 0 14px #fff9d8}\r\n .mascot-wrap svg{position:relative;width:78px;height:78px;filter:drop-shadow(0 10px 12px #c58e0026);animation:mascot-arrive .65s .08s cubic-bezier(.22,1,.36,1) both}\r\n .eyebrow{display:inline-flex;align-items:center;gap:7px;margin:0 0 12px;padding:6px 11px;border-radius:999px;background:#fff8b8;color:#7a4d00;font-size:10px;font-weight:900;letter-spacing:.14em;text-transform:uppercase}\r\n .eyebrow:before{width:7px;height:7px;border-radius:50%;background:#34c78a;content:\"\"}\r\n .failure .eyebrow{background:#fee6df;color:#9f2f24}\r\n .failure .eyebrow:before{background:#ef6a5b}\r\n h1{margin:0;color:#0f172a;font-family:\"Outfit\",\"Avenir Next\",\"Trebuchet MS\",ui-rounded,system-ui,sans-serif;font-size:clamp(34px,5vw,48px);line-height:1;letter-spacing:-.045em}\r\n .message{max-width:450px;margin:14px auto 0;color:#52607a;font-size:15px;line-height:1.65}\r\n .terminal{max-width:450px;margin:24px auto 0;padding:14px 16px 16px;text-align:left;background:#111b30;color:#eff3fa;border:1px solid #293550;border-radius:18px;box-shadow:0 18px 42px -26px #0f172acc}\r\n .terminal-bar{display:flex;align-items:center;gap:6px;padding-bottom:12px;color:#8f9bb1;font-size:9px;font-weight:800;letter-spacing:.13em}\r\n .terminal-bar i{display:block;width:7px;height:7px;border-radius:50%;background:#ef6a5b}\r\n .terminal-bar i:nth-child(2){background:#facc15}\r\n .terminal-bar i:nth-child(3){margin-right:5px;background:#34c78a}\r\n .command{font-family:\"Cascadia Code\",Consolas,monospace;font-size:13px}\r\n .command b{color:#facc15}\r\n .terminal-result{display:flex;align-items:center;gap:8px;margin-top:9px;color:#aeb9ca;font-size:12px}\r\n .terminal-result span{color:#52d49e;font-weight:900}\r\n .return-note{display:flex;max-width:420px;margin:24px auto 0;padding:14px 16px;align-items:center;gap:12px;text-align:left;background:#fff2ed;border:1px solid #f6c9bd;border-radius:18px;color:#7e2f29}\r\n .return-note>span{font-size:24px}\r\n .return-note strong,.return-note small{display:block}\r\n .return-note small{margin-top:3px;color:#875b56}\r\n .footer{justify-content:center;color:#6f788a;font-size:11px}\r\n @keyframes arrive{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}\r\n @keyframes mascot-arrive{from{opacity:0;transform:translateY(10px) rotate(-4deg) scale(.88)}to{opacity:1;transform:none}}\r\n @media(max-width:600px){.secure{display:none}.panel{border-radius:24px}.shape-c{display:none}}\r\n @media(max-height:700px){.shell{padding:16px}.stage{padding:6px 0}.panel{padding:20px 26px}.mascot-wrap{width:88px;height:72px;margin-bottom:6px}.mascot-wrap:before{width:68px;height:68px;box-shadow:0 0 0 10px #fff9d8}.mascot-wrap svg{width:60px;height:60px}.eyebrow{margin-bottom:8px}h1{font-size:32px}.message{margin-top:10px}.terminal,.return-note{margin-top:14px}}\r\n @media(prefers-reduced-motion:reduce){.panel,.mascot-wrap svg{animation:none}}\r\n </style>\r\n</head>\r\n<body class=\"${tone}\">\r\n <main class=\"shell\">\r\n <span class=\"shape shape-a\"></span><span class=\"shape shape-b\"></span><span class=\"shape shape-c\"></span>\r\n <header class=\"topbar\">\r\n <div class=\"brand\">${ROLINO_MASCOT_SVG}<span>Rolino</span></div>\r\n <div class=\"secure\"><span class=\"secure-dot\"></span>Secure CLI authorization</div>\r\n </header>\r\n <section class=\"stage\">\r\n <div class=\"panel\">\r\n <div class=\"mascot-wrap\">${ROLINO_MASCOT_SVG}</div>\r\n <p class=\"eyebrow\">${eyebrow}</p>\r\n <h1>${escapeHtml(options.title)}</h1>\r\n <p class=\"message\">${escapeHtml(options.message)}</p>\r\n ${detail}\r\n </div>\r\n </section>\r\n <footer class=\"footer\">Secure browser handoff · no password shared</footer>\r\n </main>\r\n</body>\r\n</html>`;\r\n}\r\n\r\nfunction writePage(response: ServerResponse, status: number, html: string) {\r\n response.writeHead(status, PAGE_HEADERS);\r\n response.end(html);\r\n}\r\n\r\nfunction secretsMatch(left: string, right: string) {\r\n const leftBytes = Buffer.from(left);\r\n const rightBytes = Buffer.from(right);\r\n return leftBytes.length === rightBytes.length\r\n && timingSafeEqual(leftBytes, rightBytes);\r\n}\r\n\r\nexport function createBrowserAuthorizationRequest(options: {\r\n baseUrl: string;\r\n redirectUri: string;\r\n clientName?: string;\r\n}) {\r\n const state = randomBytes(32).toString(\"base64url\");\r\n const codeVerifier = randomBytes(32).toString(\"base64url\");\r\n const codeChallenge = createHash(\"sha256\")\r\n .update(codeVerifier)\r\n .digest(\"base64url\");\r\n const url = new URL(\"/cli/authorize\", options.baseUrl);\r\n const requestExpiresAt = new Date(\r\n Date.now() + CLI_BROWSER_AUTHORIZATION_TIMEOUT_MS,\r\n ).toISOString();\r\n url.searchParams.set(\"redirect_uri\", options.redirectUri);\r\n url.searchParams.set(\"state\", state);\r\n url.searchParams.set(\"code_challenge\", codeChallenge);\r\n url.searchParams.set(\"code_challenge_method\", \"S256\");\r\n url.searchParams.set(\r\n \"client_name\",\r\n (options.clientName ?? `Rolino CLI on ${hostname()}`).slice(0, 32),\r\n );\r\n url.searchParams.set(\"request_expires_at\", requestExpiresAt);\r\n return {\r\n url: url.toString(),\r\n state,\r\n codeVerifier,\r\n codeChallenge,\r\n requestExpiresAt,\r\n };\r\n}\r\n\r\nexport class CliAuthorizationDeniedError extends Error {\r\n constructor() {\r\n super(\"Authorization was denied.\");\r\n this.name = \"CliAuthorizationDeniedError\";\r\n }\r\n}\r\n\r\nexport async function loginWithBrowser(options: {\r\n baseUrl: string;\r\n stderr: WritableOutput;\r\n exchange(input: { code: string; codeVerifier: string }): Promise<CliAuthorizationCredential>;\r\n}) {\r\n return new Promise<CliAuthorizationCredential>((resolve, reject) => {\r\n let settled = false;\r\n let authorization: ReturnType<typeof createBrowserAuthorizationRequest> | null = null;\r\n\r\n const finish = (callback: () => void) => {\r\n if (settled) return;\r\n settled = true;\r\n clearTimeout(timeout);\r\n server.close();\r\n callback();\r\n };\r\n\r\n const server = createServer((request, response) => {\r\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\r\n if (request.method !== \"GET\" || url.pathname !== \"/callback\") {\r\n response.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\r\n response.end(\"Not found\");\r\n return;\r\n }\r\n\r\n void (async () => {\r\n if (!authorization) {\r\n writePage(response, 503, renderCliAuthorizationResultPage({\r\n title: \"Authorization is starting\",\r\n message: \"Return to your terminal and try the browser link again in a moment.\",\r\n success: false,\r\n }));\r\n return;\r\n }\r\n if (!secretsMatch(url.searchParams.get(\"state\") ?? \"\", authorization.state)) {\r\n writePage(response, 400, renderCliAuthorizationResultPage({\r\n title: \"Authorization failed\",\r\n message: \"The callback state did not match. Return to your terminal and try again.\",\r\n success: false,\r\n }));\r\n finish(() => reject(new Error(\"The browser callback state did not match.\")));\r\n return;\r\n }\r\n if (url.searchParams.get(\"error\") === \"access_denied\") {\r\n writePage(response, 200, renderCliAuthorizationResultPage({\r\n title: \"Access denied\",\r\n message: \"No credential was created. You can close this window and return to your terminal.\",\r\n success: false,\r\n }));\r\n finish(() => reject(new CliAuthorizationDeniedError()));\r\n return;\r\n }\r\n\r\n const code = url.searchParams.get(\"code\");\r\n if (!code || !/^[A-Za-z0-9_-]{43,128}$/.test(code)) {\r\n writePage(response, 400, renderCliAuthorizationResultPage({\r\n title: \"Authorization failed\",\r\n message: \"Rolino did not return a valid one-time code. Return to your terminal and try again.\",\r\n success: false,\r\n }));\r\n finish(() => reject(new Error(\"The browser callback did not include a valid code.\")));\r\n return;\r\n }\r\n\r\n try {\r\n const credential = await options.exchange({\r\n code,\r\n codeVerifier: authorization.codeVerifier,\r\n });\r\n writePage(response, 200, renderCliAuthorizationResultPage({\r\n title: \"Terminal connected\",\r\n message: \"Rolino is ready in your terminal. You can close this window.\",\r\n success: true,\r\n }));\r\n finish(() => resolve(credential));\r\n } catch (error) {\r\n writePage(response, 502, renderCliAuthorizationResultPage({\r\n title: \"Authorization failed\",\r\n message: \"The CLI could not exchange its one-time code. Return to your terminal and try again.\",\r\n success: false,\r\n }));\r\n finish(() => reject(error));\r\n }\r\n })();\r\n });\r\n\r\n server.once(\"error\", (error) => finish(() => reject(error)));\r\n server.listen(0, \"127.0.0.1\", () => {\r\n const address = server.address();\r\n if (!address || typeof address === \"string\") {\r\n finish(() => reject(new Error(\"Rolino could not start the local authorization callback.\")));\r\n return;\r\n }\r\n\r\n authorization = createBrowserAuthorizationRequest({\r\n baseUrl: options.baseUrl,\r\n redirectUri: `http://127.0.0.1:${address.port}/callback`,\r\n });\r\n options.stderr.write(`Opening Rolino in your browser…\\n`);\r\n options.stderr.write(`If it does not open, visit:\\n${authorization.url}\\n`);\r\n options.stderr.write(\"Waiting for authorization…\\n\");\r\n void open(authorization.url).catch(() => undefined);\r\n });\r\n\r\n const timeout = setTimeout(() => {\r\n finish(() => reject(new Error(\"Browser authorization timed out after 5 minutes.\")));\r\n }, CLI_BROWSER_AUTHORIZATION_TIMEOUT_MS);\r\n });\r\n}\r\n","import type {\r\n Actor,\r\n CalendarListData,\r\n IntegrationHealthListData,\n MediaAsset,\n MediaAssetListData,\n Post,\r\n PostListData,\r\n PostPublishPreview,\r\n PostReadiness,\r\n PostSchedulePreview,\n PostSchedulePending,\n ProviderDeliveryOptions,\n Project,\r\n ProjectListData,\r\n} from \"@rolino/contracts\";\r\n\r\nexport type OutputFormat = \"human\" | \"json\" | \"jsonl\";\r\n\r\nexport type WritableOutput = {\r\n write(chunk: string): unknown;\r\n};\r\n\r\nexport type OutputContext = {\r\n stdout: WritableOutput;\r\n stderr: WritableOutput;\r\n format: OutputFormat;\r\n agent: boolean;\r\n command: string;\r\n requestId: string;\r\n};\r\n\r\nfunction jsonLine(value: unknown) {\r\n return `${JSON.stringify(value)}\\n`;\r\n}\r\n\r\nexport function writeSuccess(\r\n context: OutputContext,\r\n data: unknown,\r\n human: string,\r\n suggestions: string[] = [],\r\n) {\r\n if (context.format === \"human\") {\r\n context.stdout.write(human.endsWith(\"\\n\") ? human : `${human}\\n`);\r\n return;\r\n }\r\n\r\n context.stdout.write(jsonLine({\r\n ok: true,\r\n data,\r\n meta: {\r\n command: context.command,\r\n requestId: context.requestId,\r\n ...(context.agent && suggestions.length > 0 ? { suggestions } : {}),\r\n },\r\n }));\r\n}\r\n\r\nexport function writeFailure(\n context: OutputContext,\n error: {\n code: string;\n message: string;\n requestId?: string | null;\n retryAfterSeconds?: number | null;\n suggestions?: string[];\n },\n) {\n const requestId = error.requestId ?? context.requestId;\n if (context.format === \"human\") {\n context.stderr.write(`Error [${error.code}]: ${error.message}\\n`);\n for (const suggestion of error.suggestions ?? []) {\n context.stderr.write(`Next: ${suggestion}\\n`);\n }\n context.stderr.write(`Request ID: ${requestId}\\n`);\n return;\n }\n\r\n context.stdout.write(jsonLine({\r\n ok: false,\r\n error: {\r\n code: error.code,\r\n message: error.message,\r\n ...(error.retryAfterSeconds === null\r\n || error.retryAfterSeconds === undefined\r\n ? {}\r\n : { retryAfterSeconds: error.retryAfterSeconds }),\r\n },\r\n meta: {\n command: context.command,\n requestId,\n ...(context.agent && error.suggestions?.length\n ? { suggestions: error.suggestions }\n : {}),\n },\n }));\n}\n\r\nexport function formatActor(actor: Actor) {\r\n return [\r\n `${actor.user.name} <${actor.user.email}>`,\r\n `Organization: ${actor.organization.name} (${actor.organization.role})`,\r\n `Authentication: ${actor.authentication.kind}`,\r\n `Capabilities: ${actor.capabilities.join(\", \") || \"none\"}`,\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function formatProjects(data: ProjectListData) {\r\n if (data.items.length === 0) return \"No projects found.\";\r\n\r\n const rows = data.items.map((project) => (\r\n `${project.id}\\t${project.name}\\t${project.status}`\r\n ));\r\n return [\"ID\\tNAME\\tSTATUS\", ...rows].join(\"\\n\");\r\n}\r\n\r\nexport function formatProject(project: Project) {\n return [\r\n `${project.name} (${project.id})`,\r\n `Status: ${project.status}`,\r\n `Type: ${project.type}`,\r\n `Slug: ${project.slug}`,\r\n ...(project.websiteUrl ? [`Website: ${project.websiteUrl}`] : []),\r\n ...(project.description ? [`Description: ${project.description}`] : []),\r\n ].join(\"\\n\");\r\n}\n\nexport function formatMediaAssets(data: MediaAssetListData) {\n if (data.items.length === 0) return \"No media assets found.\";\n return [\n \"ID\\tTYPE\\tSIZE\\tFILE\",\n ...data.items.map((asset) => `${asset.id}\\t${asset.type}\\t${asset.sizeBytes ?? \"-\"}\\t${asset.originalFileName ?? \"-\"}`),\n ].join(\"\\n\");\n}\n\nexport function formatMediaAsset(asset: MediaAsset) {\n return [\n `${asset.originalFileName ?? \"Media asset\"} (${asset.id})`,\n `Type: ${asset.type}`,\n `Content type: ${asset.mimeType}`,\n `Size: ${asset.sizeBytes ?? \"unknown\"} bytes`,\n `URL: ${asset.url}`,\n ].join(\"\\n\");\n}\n\r\nexport function formatPosts(data: PostListData) {\r\n if (data.items.length === 0) return \"No posts found.\";\r\n\r\n const rows = data.items.map((post) => (\r\n `${post.id}\\t${post.status}\\t${post.scheduledAt ?? \"-\"}\\t${post.caption.replace(/\\s+/g, \" \").slice(0, 60) || \"-\"}`\r\n ));\r\n return [\"ID\\tSTATUS\\tSCHEDULED\\tCAPTION\", ...rows].join(\"\\n\");\r\n}\r\n\r\nexport function formatPost(post: Post) {\r\n const queued = post.status === \"PUBLISHING\";\r\n return [\r\n `Post ${post.id}`,\r\n `Project: ${post.projectId}`,\r\n `Version: ${post.version}`,\r\n `Status: ${post.status}`,\r\n `Caption: ${post.caption || \"-\"}`,\r\n ...(post.campaign ? [`Campaign: ${post.campaign.title} (${post.campaign.id})`] : []),\r\n ...(post.scheduledAt ? [\r\n `${queued ? \"Queued for publishing\" : \"Scheduled\"}: ${post.scheduledAt}${post.timezone ? ` (${post.timezone})` : \"\"}`,\r\n ] : []),\r\n ...(post.publishedAt ? [`Published: ${post.publishedAt}`] : []),\r\n `Media: ${post.media.length}`,\n `Destinations: ${post.destinations.map((destination) => (\n `${destination.provider}:${queued && destination.status === \"SCHEDULED\" ? \"QUEUED\" : destination.status}`\n )).join(\", \") || \"none\"}`,\n ...(post.providerSettings?.TIKTOK ? [\n `TikTok: ${post.providerSettings.TIKTOK.postMode}, ${post.providerSettings.TIKTOK.privacyLevel ?? \"visibility not set\"}, settings ${post.providerSettings.TIKTOK.consentedAt ? \"reviewed\" : \"not reviewed\"}`,\n ] : []),\n ...(post.providerSettings?.YOUTUBE ? [\n `YouTube: ${post.providerSettings.YOUTUBE.privacyStatus}, ${post.providerSettings.YOUTUBE.title}`,\n ] : []),\n ].join(\"\\n\");\n}\n\r\nexport function formatPostSchedulePending(pending: PostSchedulePending) {\r\n return [\r\n `YouTube schedule change pending for post ${pending.postId}.`,\r\n pending.message,\r\n `Mutation: ${pending.mutationId}`,\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function formatIntegrationHealth(data: IntegrationHealthListData) {\n const rows = data.items.map((item) => (\r\n `${item.provider}\\t${item.connected ? \"connected\" : \"disconnected\"}\\t${item.health.status}\\t${item.health.isStale ? \"stale\" : \"current\"}\\t${item.health.message}`\r\n ));\r\n return [\"PROVIDER\\tCONNECTION\\tHEALTH\\tFRESHNESS\\tDETAIL\", ...rows].join(\"\\n\");\r\n}\n\nexport function formatProviderDeliveryOptions(options: ProviderDeliveryOptions) {\n switch (options.provider) {\n case \"TIKTOK\":\n return [\n `TikTok delivery options for ${options.account.displayName ?? options.account.username ?? \"connected account\"}`,\n `Checked: ${options.checkedAt}`,\n `Health: ${options.health.status} (${options.health.code}) ${options.health.message}`,\n `Modes: ${options.allowedPostModes.join(\", \") || \"none\"}`,\n `Visibility: ${options.visibilityOptions.join(\", \") || \"none\"}`,\n `Interactions: comments ${options.interactions.comment.available ? \"available\" : \"disabled\"}, duet ${options.interactions.duet.available ? \"available\" : \"disabled\"}, stitch ${options.interactions.stitch.available ? \"available\" : \"disabled\"}`,\n `Maximum video duration: ${options.maxVideoDurationMs === null ? \"unknown\" : `${options.maxVideoDurationMs} ms`}`,\n ].join(\"\\n\");\n }\n}\n\r\nexport function formatPostReadiness(readiness: PostReadiness) {\r\n const attention = readiness.checks.filter((check) => check.status !== \"pass\");\r\n const summary = readiness.hasBlockingChecks\r\n ? \"Post is not ready to publish.\"\r\n : readiness.requiresLiveRefresh.length\r\n ? \"Local checks passed; live provider health must be refreshed.\"\r\n : \"Post is ready to publish.\";\r\n if (!attention.length) return summary;\r\n return [\r\n summary,\r\n ...attention.map((check) => (\r\n `${check.status.toUpperCase()}\\t${check.provider ?? \"POST\"}\\t${check.code}\\t${check.message}`\r\n )),\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function formatPostSchedulePreview(preview: PostSchedulePreview) {\r\n const attention = preview.readiness.checks.filter((check) => check.status !== \"pass\");\r\n return [\r\n `Schedule preview for post ${preview.post.id}`,\r\n `Current version: ${preview.post.version}`,\r\n `Publish at: ${preview.schedule.scheduledAt} (${preview.schedule.timezone})`,\r\n `Destinations: ${preview.destinations.join(\", \")}`,\r\n ...(preview.providerReconciliation\r\n ? [`Provider reconciliation: ${preview.providerReconciliation.message}`]\r\n : []),\r\n `Confirmation expires: ${preview.confirmation.expiresAt}`,\r\n `Confirmation token: ${preview.confirmation.token}`,\r\n ...(attention.length\r\n ? [\"Readiness notes:\", ...attention.map((check) => (\r\n `${check.status.toUpperCase()}\\t${check.provider ?? \"POST\"}\\t${check.code}\\t${check.message}`\r\n ))]\r\n : [\"All required readiness checks passed.\"]),\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function formatPostPublishPreview(preview: PostPublishPreview) {\r\n const attention = preview.readiness.checks.filter((check) => check.status !== \"pass\");\r\n return [\r\n `Immediate publish preview for post ${preview.post.id}`,\r\n `Current version: ${preview.post.version}`,\r\n `Destinations: ${preview.destinations.join(\", \")}`,\r\n \"Effect: confirmed execution queues these destinations for immediate publishing.\",\r\n ...(preview.destinations.includes(\"YOUTUBE\")\r\n ? [\"YouTube effect: execution starts a resumable upload; PREPARING remains visible until upload, processing, and configured visibility are provider-confirmed.\"]\r\n : []),\r\n `Confirmation expires: ${preview.confirmation.expiresAt}`,\r\n `Confirmation token: ${preview.confirmation.token}`,\r\n ...(attention.length\r\n ? [\"Readiness notes:\", ...attention.map((check) => (\r\n `${check.status.toUpperCase()}\\t${check.provider ?? \"POST\"}\\t${check.code}\\t${check.message}`\r\n ))]\r\n : [\"All required readiness checks passed.\"]),\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function formatCalendarEvents(data: CalendarListData) {\r\n if (!data.items.length) {\r\n return `No scheduled posts found from ${data.window.from} to ${data.window.to}.`;\r\n }\r\n const rows = data.items.map((event) => (\r\n `${event.postId}\\t${event.scheduledAt}\\t${event.status}\\t${event.destinations.map((item) => item.provider).join(\",\") || \"-\"}\\t${event.title}`\r\n ));\r\n return [\"POST ID\\tSCHEDULED\\tSTATUS\\tDESTINATIONS\\tTITLE\", ...rows].join(\"\\n\");\r\n}\r\n"],"mappings":"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","names":["target","resolve","resolve","requestId","resolve"]}
|