@opentag/cli 0.2.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/LICENSE +21 -0
- package/README.md +77 -0
- package/dist/catalogs/executors.d.ts +23 -0
- package/dist/catalogs/executors.d.ts.map +1 -0
- package/dist/catalogs/languages.d.ts +8 -0
- package/dist/catalogs/languages.d.ts.map +1 -0
- package/dist/catalogs/platforms.d.ts +16 -0
- package/dist/catalogs/platforms.d.ts.map +1 -0
- package/dist/commands/executors.d.ts +5 -0
- package/dist/commands/executors.d.ts.map +1 -0
- package/dist/commands/platforms.d.ts +2 -0
- package/dist/commands/platforms.d.ts.map +1 -0
- package/dist/commands/setup.d.ts +10 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/config.d.ts +638 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/doctor.d.ts +5 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/health.d.ts +11 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2320 -0
- package/dist/index.js.map +1 -0
- package/dist/lark-registration.d.ts +2 -0
- package/dist/lark-registration.d.ts.map +1 -0
- package/dist/platforms/github/display.d.ts +10 -0
- package/dist/platforms/github/display.d.ts.map +1 -0
- package/dist/platforms/lark/display.d.ts +13 -0
- package/dist/platforms/lark/display.d.ts.map +1 -0
- package/dist/platforms/lark/registration-ui.d.ts +10 -0
- package/dist/platforms/lark/registration-ui.d.ts.map +1 -0
- package/dist/platforms/lark/saved-config.d.ts +14 -0
- package/dist/platforms/lark/saved-config.d.ts.map +1 -0
- package/dist/platforms/ports.d.ts +4 -0
- package/dist/platforms/ports.d.ts.map +1 -0
- package/dist/setup/builders.d.ts +4 -0
- package/dist/setup/builders.d.ts.map +1 -0
- package/dist/setup/defaults.d.ts +5 -0
- package/dist/setup/defaults.d.ts.map +1 -0
- package/dist/setup/flow.d.ts +44 -0
- package/dist/setup/flow.d.ts.map +1 -0
- package/dist/setup/guides.d.ts +25 -0
- package/dist/setup/guides.d.ts.map +1 -0
- package/dist/setup/summary.d.ts +5 -0
- package/dist/setup/summary.d.ts.map +1 -0
- package/dist/setup/types.d.ts +68 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup.d.ts +7 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/start.d.ts +34 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/status.d.ts +25 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/ui/clack.d.ts +3 -0
- package/dist/ui/clack.d.ts.map +1 -0
- package/dist/ui/messages.d.ts +12 -0
- package/dist/ui/messages.d.ts.map +1 -0
- package/dist/ui/prompts.d.ts +30 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/catalogs/executors.ts","../src/commands/executors.ts","../src/catalogs/platforms.ts","../src/commands/platforms.ts","../src/doctor.ts","../src/commands/setup.ts","../src/setup/builders.ts","../src/setup/flow.ts","../src/catalogs/languages.ts","../src/platforms/lark/display.ts","../src/platforms/lark/saved-config.ts","../src/platforms/ports.ts","../src/ui/messages.ts","../src/setup/defaults.ts","../src/setup/guides.ts","../src/platforms/github/display.ts","../src/setup/summary.ts","../src/ui/clack.ts","../src/platforms/lark/registration-ui.ts","../src/start.ts","../src/health.ts","../src/status.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport {\n defaultConfigPath,\n formatCliConfigError,\n readCliConfig,\n redactedCliConfig\n} from \"./config.js\";\nimport { runExecutorsCommand } from \"./commands/executors.js\";\nimport { runPlatformsCommand } from \"./commands/platforms.js\";\nimport { runDoctorCommand } from \"./doctor.js\";\nimport { runSetupCommand } from \"./commands/setup.js\";\nimport { runStartCommand } from \"./start.js\";\nimport { runStatusCommand } from \"./status.js\";\n\nconst program = new Command();\n\nfunction handleError(error: unknown): never {\n console.error(formatCliConfigError(error));\n process.exit(1);\n}\n\nprogram.name(process.env.OPENTAG_CLI_NAME?.trim() || \"opentag\").description(\"OpenTag CLI\");\n\nprogram\n .command(\"setup\")\n .description(\"Create a local OpenTag config\")\n .option(\"--platform <platform>\", \"Platform to configure\")\n .option(\"--config <path>\", \"Config file path\")\n .option(\"--project <path>\", \"Project checkout path\")\n .option(\"--language <language>\", \"Setup language: en or zh-CN\")\n .option(\"--executor <executor>\", \"Default executor: echo, codex, or claude-code\")\n .option(\"--lark-setup <method>\", \"Lark setup method: saved, scan, or manual\")\n .option(\"--lark-app-id <id>\", \"Lark app id\")\n .option(\"--lark-app-secret <secret>\", \"Lark app secret\")\n .option(\"--lark-domain <domain>\", \"Lark domain: lark or feishu\")\n .option(\"--lark-bot-open-id <openId>\", \"Lark bot open id for group mentions\")\n .option(\"--slack-mode <mode>\", \"Slack connection mode: socket_mode or events_api\")\n .option(\"--slack-app-token <token>\", \"Slack app-level token for Socket Mode\")\n .option(\"--slack-signing-secret <secret>\", \"Slack signing secret\")\n .option(\"--slack-bot-token <token>\", \"Slack bot user OAuth token\")\n .option(\"--slack-app-id <id>\", \"Slack app id\")\n .option(\"--slack-team-id <id>\", \"Slack team id\")\n .option(\"--slack-channel-id <id>\", \"Slack channel id\")\n .option(\"--slack-port <port>\", \"Local Slack Events API port\")\n .option(\"--github-token <token>\", \"GitHub token for comments and apply-1 pull requests\")\n .option(\"--github-webhook-secret <secret>\", \"GitHub webhook secret; generated when omitted\")\n .option(\"--github-repository <ownerRepo>\", \"GitHub repository as owner/repo\")\n .option(\"--github-webhook-path <path>\", \"GitHub webhook path\")\n .option(\"--github-port <port>\", \"Local GitHub webhook port\")\n .option(\"--github-auto-create-pr\", \"Create pull requests immediately after runs\")\n .option(\"--no-github-auto-create-pr\", \"Use the default apply-1 pull request flow\")\n .option(\"--binding <method>\", \"Binding method: default_project or bind_later\")\n .option(\"--force\", \"Overwrite an existing config\")\n .option(\"--start\", \"Start OpenTag immediately after setup\")\n .option(\"--no-start\", \"Do not ask to start OpenTag after setup\")\n .option(\"-y, --yes\", \"Skip setup confirmation\")\n .action(async (options) => {\n try {\n await runSetupCommand(options);\n } catch (error) {\n handleError(error);\n }\n });\n\nprogram\n .command(\"start\")\n .description(\"Start the local OpenTag stack\")\n .option(\"--config <path>\", \"Config file path\")\n .action(async (options) => {\n try {\n await runStartCommand(options);\n } catch (error) {\n handleError(error);\n }\n });\n\nprogram\n .command(\"status\")\n .description(\"Show the local OpenTag status\")\n .option(\"--config <path>\", \"Config file path\")\n .action(async (options) => {\n try {\n await runStatusCommand(options);\n } catch (error) {\n handleError(error);\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check dispatcher, bindings, checkouts, and executors\")\n .option(\"--config <path>\", \"Config file path\")\n .action(async (options) => {\n try {\n await runDoctorCommand(options);\n } catch (error) {\n handleError(error);\n }\n });\n\nprogram\n .command(\"platforms\")\n .description(\"List OpenTag platform setup support\")\n .action(() => {\n runPlatformsCommand();\n });\n\nprogram\n .command(\"executors\")\n .description(\"List available coding agents\")\n .action(() => {\n runExecutorsCommand();\n });\n\nconst configCommand = program.command(\"config\").description(\"Inspect OpenTag config\");\n\nconfigCommand\n .command(\"path\")\n .description(\"Print the OpenTag config path\")\n .action(() => {\n console.log(defaultConfigPath());\n });\n\nconfigCommand\n .command(\"show\")\n .description(\"Print the OpenTag config with secrets redacted\")\n .option(\"--config <path>\", \"Config file path\")\n .action((options) => {\n try {\n console.log(JSON.stringify(redactedCliConfig(readCliConfig(options.config ?? defaultConfigPath())), null, 2));\n } catch (error) {\n handleError(error);\n }\n });\n\nawait program.parseAsync(process.argv);\n","import { randomUUID } from \"node:crypto\";\nimport { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { formatConfigError as formatDaemonConfigError, parseDaemonConfig, type OpenTagDaemonConfig } from \"@opentag/local-runtime\";\nimport { z } from \"zod\";\nimport type { ExecutorId } from \"./catalogs/executors.js\";\nimport type { CliLanguage } from \"./catalogs/languages.js\";\nimport type { PlatformId } from \"./catalogs/platforms.js\";\n\nconst ExecutorSchema = z.enum([\"echo\", \"codex\", \"claude-code\"]);\nconst KeepWorktreeSchema = z.enum([\"always\", \"on_failure\", \"never\"]);\nconst PositiveIntegerSchema = z.number().int().positive();\nconst CliLanguageSchema = z.enum([\"en\", \"zh-CN\"]);\nconst PlatformSchema = z.enum([\"lark\", \"slack\", \"github\", \"telegram\"]);\nconst LarkSetupMethodSchema = z.enum([\"saved\", \"scan\", \"manual\"]);\nconst SlackModeSchema = z.enum([\"socket_mode\", \"events_api\"]);\nconst BindingMethodSchema = z.enum([\"default_project\", \"bind_later\"]);\nconst OptionalPortSchema = z.number().int().min(1).max(65535).optional();\n\nconst RepositoryBindingSchema = z\n .object({\n provider: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n checkoutPath: z.string().min(1),\n defaultExecutor: ExecutorSchema,\n baseBranch: z.string().min(1),\n pushRemote: z.string().min(1),\n worktreeRoot: z.string().min(1),\n keepWorktree: KeepWorktreeSchema\n })\n .strict();\n\nconst ChannelBindingSchema = z\n .object({\n provider: z.string().min(1),\n accountId: z.string().min(1),\n conversationId: z.string().min(1),\n repoProvider: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n metadata: z.record(z.string(), z.unknown()).optional()\n })\n .strict();\n\nconst ClaudeCodeSchema = z\n .object({\n command: z.string().min(1).optional(),\n model: z.string().min(1).optional(),\n permissionMode: z.enum([\"acceptEdits\", \"auto\", \"bypassPermissions\", \"default\", \"plan\"]).optional(),\n dangerouslySkipPermissions: z.boolean().optional()\n })\n .strict();\n\nconst SecuritySchema = z\n .object({\n mode: z.enum([\"enforce\", \"audit\", \"off\"]).optional(),\n allowedWorkspaceRoot: z.string().min(1).optional(),\n allowUnsafePrompts: z.boolean().optional(),\n extraSafeEnv: z.array(z.string().min(1)).optional()\n })\n .strict();\n\nconst DaemonConfigSchema = z\n .object({\n runnerId: z.string().min(1),\n dispatcherUrl: z.string().url(),\n repositories: z.array(RepositoryBindingSchema).min(1),\n channelBindings: z.array(ChannelBindingSchema).optional(),\n claudeCode: ClaudeCodeSchema.optional(),\n security: SecuritySchema.optional(),\n githubToken: z.string().min(1).optional(),\n preparePullRequestBranch: z.boolean().optional(),\n allowAutoCreatePullRequest: z.boolean().optional(),\n pairingToken: z.string().min(1),\n pollIntervalMs: PositiveIntegerSchema,\n heartbeatIntervalMs: PositiveIntegerSchema\n })\n .strict();\n\nconst LarkPlatformSchema = z\n .object({\n appId: z.string().min(1),\n appSecret: z.string().min(1),\n domain: z.enum([\"lark\", \"feishu\"]),\n botOpenId: z.string().min(1).optional(),\n defaultProjectBinding: z.boolean().optional()\n })\n .strict();\n\nconst SlackPlatformSchema = z\n .object({\n mode: SlackModeSchema.optional(),\n appToken: z.string().min(1).optional(),\n signingSecret: z.string().min(1).optional(),\n botToken: z.string().min(1),\n teamId: z.string().min(1),\n channelId: z.string().min(1),\n appId: z.string().min(1).optional(),\n defaultProjectBinding: z.boolean().optional(),\n port: OptionalPortSchema\n })\n .strict()\n .superRefine((value, context) => {\n const mode = value.mode ?? \"events_api\";\n if (mode === \"socket_mode\" && !value.appToken) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"appToken\"],\n message: \"Slack Socket Mode requires appToken.\"\n });\n }\n if (mode === \"events_api\" && !value.signingSecret) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"signingSecret\"],\n message: \"Slack Events API requires signingSecret.\"\n });\n }\n });\n\nconst GitHubPlatformSchema = z\n .object({\n webhookSecret: z.string().min(1),\n owner: z.string().min(1),\n repo: z.string().min(1),\n webhookPath: z.string().min(1).optional(),\n port: OptionalPortSchema\n })\n .strict();\n\nconst PreferencesSchema = z\n .object({\n language: CliLanguageSchema.optional(),\n lastSetup: z\n .object({\n platforms: z.array(PlatformSchema).optional(),\n executor: ExecutorSchema.optional(),\n projectPath: z.string().min(1).optional(),\n larkSetupMethod: LarkSetupMethodSchema.optional(),\n larkDomain: z.enum([\"lark\", \"feishu\"]).optional(),\n bindingMethod: BindingMethodSchema.optional(),\n slackMode: SlackModeSchema.optional(),\n slackTeamId: z.string().min(1).optional(),\n slackChannelId: z.string().min(1).optional(),\n slackPort: OptionalPortSchema,\n githubOwner: z.string().min(1).optional(),\n githubRepo: z.string().min(1).optional(),\n githubPort: OptionalPortSchema,\n githubAutoCreatePullRequest: z.boolean().optional()\n })\n .strict()\n .optional()\n })\n .strict();\n\nexport const OpenTagCliConfigSchema = z\n .object({\n schemaVersion: z.literal(1),\n state: z\n .object({\n directory: z.string().min(1),\n databasePath: z.string().min(1),\n worktreeRoot: z.string().min(1)\n })\n .strict(),\n preferences: PreferencesSchema.optional(),\n daemon: DaemonConfigSchema,\n platforms: z\n .object({\n lark: LarkPlatformSchema.optional(),\n slack: SlackPlatformSchema.optional(),\n github: GitHubPlatformSchema.optional()\n })\n .strict()\n })\n .strict();\n\nexport type OpenTagCliConfig = Omit<z.infer<typeof OpenTagCliConfigSchema>, \"daemon\"> & {\n daemon: OpenTagDaemonConfig;\n};\n\nexport type OpenTagCliPreferences = NonNullable<OpenTagCliConfig[\"preferences\"]>;\nexport type OpenTagCliLastSetup = NonNullable<OpenTagCliPreferences[\"lastSetup\"]>;\nexport type OpenTagCliLanguage = CliLanguage;\nexport type OpenTagCliPlatform = PlatformId;\nexport type OpenTagCliExecutor = ExecutorId;\n\nexport type PathEnvironment = Partial<\n Record<\"OPENTAG_CONFIG_PATH\" | \"OPENTAG_CONFIG_HOME\" | \"OPENTAG_STATE_DIR\" | \"XDG_CONFIG_HOME\" | \"XDG_STATE_HOME\", string>\n>;\n\nfunction configHome(env: PathEnvironment, home = homedir()): string {\n if (env.OPENTAG_CONFIG_HOME) return resolve(env.OPENTAG_CONFIG_HOME);\n if (env.XDG_CONFIG_HOME) return resolve(env.XDG_CONFIG_HOME, \"opentag\");\n return join(home, \".config\", \"opentag\");\n}\n\nexport function defaultConfigPath(env: PathEnvironment = process.env, home = homedir()): string {\n if (env.OPENTAG_CONFIG_PATH) return resolve(env.OPENTAG_CONFIG_PATH);\n return join(configHome(env, home), \"config.json\");\n}\n\nexport function defaultStateDirectory(env: PathEnvironment = process.env, home = homedir()): string {\n if (env.OPENTAG_STATE_DIR) return resolve(env.OPENTAG_STATE_DIR);\n if (env.XDG_STATE_HOME) return resolve(env.XDG_STATE_HOME, \"opentag\");\n return join(home, \".local\", \"state\", \"opentag\");\n}\n\nfunction formatPath(path: Array<string | number>): string {\n return path.length ? path.join(\".\") : \"config\";\n}\n\nexport function formatCliConfigError(error: unknown): string {\n if (error instanceof z.ZodError) {\n return error.issues.map((issue) => `${formatPath(issue.path)}: ${issue.message}`).join(\"\\n\");\n }\n return formatDaemonConfigError(error);\n}\n\nexport function parseCliConfig(value: unknown): OpenTagCliConfig {\n const parsed = OpenTagCliConfigSchema.parse(value);\n return {\n ...parsed,\n daemon: parseDaemonConfig(parsed.daemon)\n };\n}\n\nexport function readCliConfig(path = defaultConfigPath()): OpenTagCliConfig {\n assertPrivateConfigFile(path);\n return parseCliConfig(JSON.parse(readFileSync(path, \"utf8\")));\n}\n\nexport function ensurePrivateDirectory(path: string): void {\n const createdPath = mkdirSync(path, { recursive: true, mode: 0o700 });\n if (createdPath) {\n chmodSync(path, 0o700);\n }\n}\n\nexport function writeCliConfigAtomic(path: string, config: OpenTagCliConfig): void {\n ensurePrivateDirectory(dirname(path));\n const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tempPath, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600, flag: \"wx\" });\n chmodSync(tempPath, 0o600);\n renameSync(tempPath, path);\n chmodSync(path, 0o600);\n } catch (error) {\n rmSync(tempPath, { force: true });\n throw error;\n }\n}\n\nexport function assertPrivateConfigFile(path: string): void {\n if (process.platform === \"win32\") return;\n const mode = statSync(path).mode & 0o777;\n if ((mode & 0o077) !== 0) {\n throw new Error(`OpenTag config contains secrets and must not be readable by group or others: ${path}\\nFix it with: chmod 600 ${path}`);\n }\n}\n\nfunction redactValue(key: string, value: unknown): unknown {\n if ([\"appSecret\", \"appToken\", \"botToken\", \"githubToken\", \"pairingToken\", \"signingSecret\", \"webhookSecret\"].includes(key)) {\n return \"[REDACTED]\";\n }\n if (Array.isArray(value)) {\n return value.map((entry) => redactValue(\"\", entry));\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(Object.entries(value).map(([entryKey, entryValue]) => [entryKey, redactValue(entryKey, entryValue)]));\n }\n return value;\n}\n\nexport function redactedCliConfig(config: OpenTagCliConfig): unknown {\n return redactValue(\"\", config);\n}\n","import { existsSync } from \"node:fs\";\nimport { delimiter, extname, join } from \"node:path\";\n\nexport type ExecutorId = \"echo\" | \"codex\" | \"claude-code\";\n\nexport type ExecutorDescriptor = {\n id: ExecutorId;\n label: string;\n command?: string;\n alwaysAvailable?: boolean;\n devOnly?: boolean;\n};\n\nexport type ExecutorDetection = {\n id: ExecutorId;\n available: boolean;\n reason: string;\n};\n\nexport const EXECUTOR_CATALOG: ExecutorDescriptor[] = [\n {\n id: \"codex\",\n label: \"Codex\",\n command: \"codex\"\n },\n {\n id: \"claude-code\",\n label: \"Claude Code\",\n command: \"claude\"\n },\n {\n id: \"echo\",\n label: \"Echo\",\n alwaysAvailable: true,\n devOnly: true\n }\n];\n\nfunction pathExistsOnPath(command: string, env: NodeJS.ProcessEnv = process.env): boolean {\n const paths = env.PATH?.split(delimiter).filter(Boolean) ?? [];\n const candidates =\n process.platform === \"win32\" && !extname(command)\n ? [command, ...(env.PATHEXT?.split(delimiter).filter(Boolean) ?? [\".COM\", \".EXE\", \".BAT\", \".CMD\"]).map((extension) => `${command}${extension.toLowerCase()}`)]\n : [command];\n return paths.some((directory) => candidates.some((candidate) => existsSync(join(directory, candidate))));\n}\n\nexport function parseExecutorId(value: string): ExecutorId {\n if (value === \"echo\" || value === \"codex\" || value === \"claude-code\") {\n return value;\n }\n throw new Error(\"Executor must be echo, codex, or claude-code.\");\n}\n\nexport function detectExecutors(env: NodeJS.ProcessEnv = process.env): ExecutorDetection[] {\n return EXECUTOR_CATALOG.map((executor) => {\n if (executor.alwaysAvailable) {\n return {\n id: executor.id,\n available: true,\n reason: executor.devOnly ? \"Dev/test only; does not run a real coding agent\" : \"Built in\"\n };\n }\n const available = executor.command ? pathExistsOnPath(executor.command, env) : false;\n return {\n id: executor.id,\n available,\n reason: available ? `Found ${executor.command} on PATH` : `Could not find ${executor.command} on PATH`\n };\n });\n}\n\nexport function defaultExecutorId(input: {\n previous?: ExecutorId;\n detections?: ExecutorDetection[];\n} = {}): ExecutorId {\n if (input.previous) {\n return input.previous;\n }\n const detections = input.detections ?? detectExecutors();\n if (detections.find((executor) => executor.id === \"codex\")?.available) {\n return \"codex\";\n }\n if (detections.find((executor) => executor.id === \"claude-code\")?.available) {\n return \"claude-code\";\n }\n return \"echo\";\n}\n\nexport function executorLabel(id: ExecutorId): string {\n return EXECUTOR_CATALOG.find((executor) => executor.id === id)?.label ?? id;\n}\n\nfunction formatExecutorStatus(executor: ExecutorDescriptor, available: boolean): string {\n if (executor.devOnly) {\n return \"dev/test only\";\n }\n return available ? \"available\" : \"not found\";\n}\n\nexport function formatExecutors(env: NodeJS.ProcessEnv = process.env): string {\n const detections = detectExecutors(env);\n return [\n \"Coding agents:\",\n ...EXECUTOR_CATALOG.map((executor) => {\n const detection = detections.find((entry) => entry.id === executor.id);\n const status = formatExecutorStatus(executor, detection?.available ?? false);\n return ` ${executor.label}: ${status}${detection ? ` (${detection.reason})` : \"\"}`;\n })\n ].join(\"\\n\");\n}\n","import { formatExecutors } from \"../catalogs/executors.js\";\n\nexport type ExecutorsCommandOptions = {\n env?: NodeJS.ProcessEnv;\n};\n\nexport function runExecutorsCommand(options: ExecutorsCommandOptions = {}): void {\n console.log(formatExecutors(options.env ?? process.env));\n}\n","import type { CliLanguage } from \"./languages.js\";\n\nexport type PlatformId = \"lark\" | \"slack\" | \"github\" | \"telegram\";\n\nexport type PlatformStatus = \"setup_ready\" | \"setup_pending\" | \"experimental_setup_pending\";\n\nexport type PlatformDescriptor = {\n id: PlatformId;\n label: string;\n status: PlatformStatus;\n startable: boolean;\n};\n\nconst SETUP_GUIDE_BASE_URL = \"https://github.com/amplifthq/opentag/blob/main/docs/platforms\";\n\nconst PLATFORM_SETUP_GUIDE_FILES: Partial<Record<PlatformId, Record<CliLanguage, string>>> = {\n lark: {\n en: \"lark.en.md\",\n \"zh-CN\": \"lark.zh-CN.md\"\n },\n slack: {\n en: \"slack.en.md\",\n \"zh-CN\": \"slack.zh-CN.md\"\n },\n github: {\n en: \"github.en.md\",\n \"zh-CN\": \"github.zh-CN.md\"\n }\n};\n\nexport const PLATFORM_CATALOG: PlatformDescriptor[] = [\n {\n id: \"lark\",\n label: \"Lark / Feishu\",\n status: \"setup_ready\",\n startable: true\n },\n {\n id: \"slack\",\n label: \"Slack\",\n status: \"setup_ready\",\n startable: true\n },\n {\n id: \"github\",\n label: \"GitHub\",\n status: \"setup_ready\",\n startable: true\n },\n {\n id: \"telegram\",\n label: \"Telegram\",\n status: \"experimental_setup_pending\",\n startable: false\n }\n];\n\nexport function parsePlatformId(value: string): PlatformId {\n if (value === \"lark\" || value === \"slack\" || value === \"github\" || value === \"telegram\") {\n return value;\n }\n throw new Error(\"Platform must be lark, slack, github, or telegram.\");\n}\n\nexport function platformById(id: PlatformId): PlatformDescriptor {\n const descriptor = PLATFORM_CATALOG.find((platform) => platform.id === id);\n if (!descriptor) {\n throw new Error(`Unknown platform: ${id}`);\n }\n return descriptor;\n}\n\nexport function platformSetupGuideUrl(id: PlatformId, language: CliLanguage): string | undefined {\n const file = PLATFORM_SETUP_GUIDE_FILES[id]?.[language];\n return file ? `${SETUP_GUIDE_BASE_URL}/${file}` : undefined;\n}\n\nexport function formatPlatformStatus(status: PlatformStatus): string {\n switch (status) {\n case \"setup_ready\":\n return \"Setup wizard ready\";\n case \"setup_pending\":\n return \"Adapter exists; CLI setup pending\";\n case \"experimental_setup_pending\":\n return \"Experimental adapter; CLI setup pending\";\n }\n}\n\nexport function formatPlatforms(): string {\n return [\n \"CLI setup support:\",\n ...PLATFORM_CATALOG.map((platform) => {\n return ` ${platform.label}: ${formatPlatformStatus(platform.status)}`;\n })\n ].join(\"\\n\");\n}\n","import { formatPlatforms } from \"../catalogs/platforms.js\";\n\nexport function runPlatformsCommand(): void {\n console.log(formatPlatforms());\n}\n","import { doctorHasFailures, executorsFromConfig, formatDoctorChecks, runDoctor } from \"@opentag/local-runtime\";\nimport { defaultConfigPath, readCliConfig } from \"./config.js\";\n\nexport type DoctorCommandOptions = {\n config?: string;\n};\n\nexport async function runDoctorCommand(options: DoctorCommandOptions): Promise<void> {\n const config = readCliConfig(options.config ?? defaultConfigPath());\n const checks = await runDoctor({\n config: config.daemon,\n executors: executorsFromConfig(config.daemon)\n });\n console.log(formatDoctorChecks(checks));\n if (doctorHasFailures(checks)) {\n process.exitCode = 1;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n defaultConfigPath,\n ensurePrivateDirectory,\n writeCliConfigAtomic\n} from \"../config.js\";\nimport { createSetupConfig } from \"../setup/builders.js\";\nimport { collectSetupInput, type SetupCommandOptions, type SetupFlowDependencies } from \"../setup/flow.js\";\nimport { formatSetupComplete } from \"../setup/summary.js\";\nimport { createClackPromptAdapter } from \"../ui/clack.js\";\nimport { scanLarkPersonalAgent } from \"../platforms/lark/registration-ui.js\";\nimport { runStartCommand, type StartCommandOptions } from \"../start.js\";\n\nexport type { SetupCommandOptions };\n\nexport type SetupCommandDependencies = Partial<Omit<SetupFlowDependencies, \"prompts\" | \"scanLarkPersonalAgent\">> & {\n prompts?: SetupFlowDependencies[\"prompts\"];\n scanLarkPersonalAgent?: SetupFlowDependencies[\"scanLarkPersonalAgent\"];\n startOpenTag?(options: StartCommandOptions): Promise<void>;\n};\n\nfunction startPromptMessage(language: string | undefined): string {\n return language === \"zh-CN\" ? \"现在启动 OpenTag?\" : \"Start OpenTag now?\";\n}\n\nfunction setupCompleteMessage(language: string | undefined): string {\n return language === \"zh-CN\" ? \"OpenTag 设置完成。\" : \"OpenTag setup complete.\";\n}\n\nfunction startingMessage(language: string | undefined): string {\n return language === \"zh-CN\" ? \"正在启动 OpenTag...\" : \"Starting OpenTag...\";\n}\n\nexport async function runSetupCommand(options: SetupCommandOptions, dependencies: SetupCommandDependencies = {}): Promise<void> {\n const env = dependencies.env ?? process.env;\n const configPath = options.config ?? defaultConfigPath(env);\n if (options.yes && existsSync(configPath) && !options.force) {\n throw new Error(`OpenTag config already exists at ${configPath}. Use --force with --yes to overwrite it.`);\n }\n\n const prompts = dependencies.prompts ?? createClackPromptAdapter();\n const setupInput = await collectSetupInput(options, configPath, {\n prompts,\n scanLarkPersonalAgent: dependencies.scanLarkPersonalAgent ?? scanLarkPersonalAgent,\n ...(dependencies.cwd ? { cwd: dependencies.cwd } : {}),\n ...(dependencies.env ? { env: dependencies.env } : {}),\n ...(dependencies.defaults ? { defaults: dependencies.defaults } : {})\n });\n const config = createSetupConfig(setupInput, env);\n ensurePrivateDirectory(config.state.directory);\n ensurePrivateDirectory(config.state.worktreeRoot);\n writeCliConfigAtomic(configPath, config);\n\n prompts.note(formatSetupComplete(config, configPath));\n\n const shouldStart =\n options.start ??\n (!options.yes\n ? await prompts.confirm({\n message: startPromptMessage(config.preferences?.language),\n initialValue: true\n })\n : false);\n if (shouldStart) {\n prompts.outro(startingMessage(config.preferences?.language));\n await (dependencies.startOpenTag ?? runStartCommand)({ config: configPath });\n } else {\n prompts.outro(setupCompleteMessage(config.preferences?.language));\n }\n}\n","import { randomBytes } from \"node:crypto\";\nimport { realpathSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { projectTargetRefFromLocalPath } from \"@opentag/core\";\nimport {\n defaultStateDirectory,\n type OpenTagCliConfig,\n type PathEnvironment\n} from \"../config.js\";\nimport type { OpenTagSetupInput } from \"./types.js\";\n\nfunction pairingToken(): string {\n return randomBytes(32).toString(\"hex\");\n}\n\nexport function createSetupConfig(input: OpenTagSetupInput, env: PathEnvironment = process.env): OpenTagCliConfig {\n const checkoutPath = realpathSync.native(input.projectPath);\n const target = projectTargetRefFromLocalPath(checkoutPath);\n const stateDirectory = input.stateDirectory ?? defaultStateDirectory(env);\n const worktreeRoot = join(stateDirectory, \"worktrees\");\n const databasePath = join(stateDirectory, \"opentag.db\");\n const repositoryBindings = [\n {\n provider: target.provider,\n owner: target.owner,\n repo: target.repo,\n checkoutPath,\n defaultExecutor: input.executor,\n baseBranch: \"main\",\n pushRemote: \"origin\",\n worktreeRoot,\n keepWorktree: \"on_failure\" as const\n },\n ...(input.github\n ? [\n {\n provider: \"github\",\n owner: input.github.owner,\n repo: input.github.repo,\n checkoutPath,\n defaultExecutor: input.executor,\n baseBranch: \"main\",\n pushRemote: \"origin\",\n worktreeRoot,\n keepWorktree: \"on_failure\" as const\n }\n ]\n : [])\n ].filter((binding, index, bindings) => {\n return bindings.findIndex((candidate) => candidate.provider === binding.provider && candidate.owner === binding.owner && candidate.repo === binding.repo) === index;\n });\n\n const channelBindings = [\n ...(input.slack && input.slack.bindingMethod === \"default_project\"\n ? [\n {\n provider: \"slack\",\n accountId: input.slack.teamId,\n conversationId: input.slack.channelId,\n repoProvider: target.provider,\n owner: target.owner,\n repo: target.repo\n }\n ]\n : [])\n ];\n\n return {\n schemaVersion: 1,\n preferences: {\n language: input.language,\n lastSetup: {\n platforms: [input.platform],\n executor: input.executor,\n projectPath: checkoutPath,\n ...(input.lark\n ? {\n larkSetupMethod: input.lark.setupMethod,\n larkDomain: input.lark.domain,\n bindingMethod: input.lark.bindingMethod\n }\n : {}),\n ...(input.slack\n ? {\n bindingMethod: input.slack.bindingMethod,\n slackMode: input.slack.mode,\n slackTeamId: input.slack.teamId,\n slackChannelId: input.slack.channelId,\n ...(input.slack.port ? { slackPort: input.slack.port } : {})\n }\n : {}),\n ...(input.github\n ? {\n githubOwner: input.github.owner,\n githubRepo: input.github.repo,\n githubPort: input.github.port,\n githubAutoCreatePullRequest: input.github.autoCreatePullRequest\n }\n : {})\n }\n },\n state: {\n directory: stateDirectory,\n databasePath,\n worktreeRoot\n },\n daemon: {\n runnerId: \"runner_local\",\n dispatcherUrl: \"http://localhost:3030\",\n pairingToken: pairingToken(),\n repositories: repositoryBindings,\n ...(channelBindings.length > 0 ? { channelBindings } : {}),\n ...(input.github ? { githubToken: input.github.token } : {}),\n ...(input.github ? { preparePullRequestBranch: true } : {}),\n ...(input.github ? { allowAutoCreatePullRequest: input.github.autoCreatePullRequest } : {}),\n pollIntervalMs: 5000,\n heartbeatIntervalMs: 15000\n },\n platforms: {\n ...(input.lark\n ? {\n lark: {\n appId: input.lark.appId,\n appSecret: input.lark.appSecret,\n domain: input.lark.domain,\n defaultProjectBinding: input.lark.bindingMethod === \"default_project\",\n ...(input.lark.botOpenId ? { botOpenId: input.lark.botOpenId } : {})\n }\n }\n : {}),\n ...(input.slack\n ? {\n slack: {\n mode: input.slack.mode,\n ...(input.slack.appToken ? { appToken: input.slack.appToken } : {}),\n ...(input.slack.signingSecret ? { signingSecret: input.slack.signingSecret } : {}),\n botToken: input.slack.botToken,\n teamId: input.slack.teamId,\n channelId: input.slack.channelId,\n defaultProjectBinding: input.slack.bindingMethod === \"default_project\",\n ...(input.slack.appId ? { appId: input.slack.appId } : {}),\n ...(input.slack.port ? { port: input.slack.port } : {})\n }\n }\n : {}),\n ...(input.github\n ? {\n github: {\n webhookSecret: input.github.webhookSecret,\n owner: input.github.owner,\n repo: input.github.repo,\n webhookPath: input.github.webhookPath,\n port: input.github.port\n }\n }\n : {})\n }\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport type { LarkDomain, RegisteredLarkPersonalAgent } from \"@opentag/lark\";\nimport {\n defaultExecutorId,\n detectExecutors,\n EXECUTOR_CATALOG,\n executorLabel,\n parseExecutorId,\n type ExecutorId\n} from \"../catalogs/executors.js\";\nimport { LANGUAGE_OPTIONS, parseCliLanguage, type CliLanguage } from \"../catalogs/languages.js\";\nimport { formatPlatformStatus, PLATFORM_CATALOG, parsePlatformId, platformById, type PlatformId } from \"../catalogs/platforms.js\";\nimport { formatSavedLarkCredentialsHint } from \"../platforms/lark/display.js\";\nimport { readLegacyLarkCredentials, type SavedLarkCredentials } from \"../platforms/lark/saved-config.js\";\nimport { DEFAULT_GITHUB_WEBHOOK_PORT, DEFAULT_SLACK_EVENTS_PORT, parseLocalPort } from \"../platforms/ports.js\";\nimport type { PromptAdapter } from \"../ui/prompts.js\";\nimport { bindingMethodHint, bindingMethodLabel, larkSetupHint, larkSetupLabel, slackModeHint, slackModeLabel, t } from \"../ui/messages.js\";\nimport { loadSetupDefaults } from \"./defaults.js\";\nimport { formatGitHubTokenHelp, formatLarkManualCredentialHelp, formatPlatformSetupGuide, formatSlackCredentialHelp } from \"./guides.js\";\nimport { formatSetupReview } from \"./summary.js\";\nimport type { BindingMethod, GitHubSetupInput, LarkSetupMethod, OpenTagSetupInput, SetupDefaults, SlackSetupInput, SlackSetupMode } from \"./types.js\";\n\ntype LarkCredentialInput = {\n appId: string;\n appSecret: string;\n botOpenId?: string;\n};\n\nexport type SetupCommandOptions = {\n platform?: string;\n config?: string;\n project?: string;\n executor?: string;\n language?: string;\n larkSetup?: string;\n larkAppId?: string;\n larkAppSecret?: string;\n larkDomain?: string;\n larkBotOpenId?: string;\n slackMode?: string;\n slackAppToken?: string;\n slackSigningSecret?: string;\n slackBotToken?: string;\n slackAppId?: string;\n slackTeamId?: string;\n slackChannelId?: string;\n slackPort?: string;\n githubToken?: string;\n githubWebhookSecret?: string;\n githubRepository?: string;\n githubWebhookPath?: string;\n githubPort?: string;\n githubAutoCreatePr?: boolean;\n binding?: string;\n force?: boolean;\n yes?: boolean;\n start?: boolean;\n};\n\nexport type SetupFlowDependencies = {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n prompts: PromptAdapter;\n scanLarkPersonalAgent(input: { domain: LarkDomain }): Promise<RegisteredLarkPersonalAgent>;\n defaults?: SetupDefaults;\n};\n\nfunction parseLarkSetupMethod(value: string): LarkSetupMethod {\n if (value === \"saved\" || value === \"scan\" || value === \"manual\") return value;\n throw new Error(\"Lark setup method must be saved, scan, or manual.\");\n}\n\nfunction parseLarkDomain(value: string): LarkDomain {\n if (value === \"lark\" || value === \"feishu\") return value;\n throw new Error(\"Lark domain must be lark or feishu.\");\n}\n\nfunction parseSlackSetupMode(value: string): SlackSetupMode {\n const normalized = value.trim().toLowerCase().replace(/-/g, \"_\");\n if (normalized === \"socket_mode\" || normalized === \"events_api\") return normalized;\n throw new Error(\"Slack mode must be socket_mode or events_api.\");\n}\n\nfunction parseBindingMethod(value: string): BindingMethod {\n if (value === \"default_project\" || value === \"bind_later\") return value;\n throw new Error(\"Binding method must be default_project or bind_later.\");\n}\n\nfunction parseGitHubRepository(value: string): { owner: string; repo: string } {\n const trimmed = value.trim().replace(/^github:/, \"\");\n const match = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (!match) {\n throw new Error(\"GitHub repository must use owner/repo.\");\n }\n return {\n owner: match[1]!,\n repo: match[2]!.replace(/\\.git$/, \"\")\n };\n}\n\nfunction parsePortInput(value: string | undefined, label: string): number | undefined {\n return value === undefined ? undefined : parseLocalPort(value, label);\n}\n\nfunction githubRepositoryFromRemote(projectPath: string): string | undefined {\n let remote: string;\n try {\n remote = execFileSync(\"git\", [\"-C\", projectPath, \"remote\", \"get-url\", \"origin\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return undefined;\n }\n\n const patterns = [\n /^git@github\\.com:([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/,\n /^https:\\/\\/github\\.com\\/([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/,\n /^ssh:\\/\\/git@github\\.com\\/([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/\n ];\n for (const pattern of patterns) {\n const match = remote.match(pattern);\n if (match) {\n return `${match[1]}/${match[2]}`;\n }\n }\n return undefined;\n}\n\nfunction nonEmpty(value: string, label: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`${label} is required.`);\n }\n return trimmed;\n}\n\nfunction assertExistingPath(path: string): string {\n if (!existsSync(path)) {\n throw new Error(`Path does not exist: ${path}`);\n }\n return path;\n}\n\nfunction optionalTrimmed(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction generateGitHubWebhookSecret(): string {\n return randomBytes(32).toString(\"hex\");\n}\n\nfunction parseGitHubWebhookPath(value: string): string {\n const trimmed = nonEmpty(value, \"GitHub webhook path\");\n if (!trimmed.startsWith(\"/\")) {\n throw new Error(\"GitHub webhook path must start with /.\");\n }\n return trimmed;\n}\n\nfunction hasManualLarkCredentials(options: SetupCommandOptions): boolean {\n return Boolean(options.larkAppId || options.larkAppSecret || options.larkBotOpenId);\n}\n\nfunction hasCompleteManualLarkCredentials(options: SetupCommandOptions): boolean {\n return Boolean(options.larkAppId && options.larkAppSecret);\n}\n\nfunction assertCompleteManualLarkCredentials(options: SetupCommandOptions): void {\n if (options.larkAppId && !options.larkAppSecret) {\n throw new Error(\"--lark-app-secret is required when --lark-app-id is provided.\");\n }\n if (options.larkAppSecret && !options.larkAppId) {\n throw new Error(\"--lark-app-id is required when --lark-app-secret is provided.\");\n }\n}\n\nfunction assertNoManualLarkCredentialFlags(options: SetupCommandOptions): void {\n if (hasManualLarkCredentials(options)) {\n throw new Error(\"--lark-app-id, --lark-app-secret, and --lark-bot-open-id can only be used with --lark-setup manual.\");\n }\n}\n\nfunction findSavedLarkCredentials(defaults: SetupDefaults, projectPath: string): SavedLarkCredentials | undefined {\n return defaults.savedLarkCredentials ?? readLegacyLarkCredentials(projectPath);\n}\n\nfunction shouldReadSavedLarkCredentials(options: SetupCommandOptions): boolean {\n return !options.larkSetup || parseLarkSetupMethod(options.larkSetup) === \"saved\";\n}\n\nfunction loadDefaultsForSetup(options: SetupCommandOptions, configPath: string): SetupDefaults {\n try {\n return loadSetupDefaults(configPath);\n } catch (error) {\n if (options.force) {\n return {};\n }\n throw error;\n }\n}\n\nfunction defaultLanguage(options: SetupCommandOptions, defaults: SetupDefaults): CliLanguage {\n return options.language ? parseCliLanguage(options.language) : defaults.language ?? \"en\";\n}\n\nfunction formatPlatformStatusForSetup(language: CliLanguage, status: (typeof PLATFORM_CATALOG)[number][\"status\"]): string {\n if (language === \"zh-CN\") {\n switch (status) {\n case \"setup_ready\":\n return \"这个 setup 向导现在可配置\";\n case \"setup_pending\":\n return \"适配器已有,setup 向导待接入\";\n case \"experimental_setup_pending\":\n return \"实验适配器,setup 向导待接入\";\n }\n }\n return formatPlatformStatus(status);\n}\n\nfunction formatPlatformsForSetup(language: CliLanguage): string {\n const lines = PLATFORM_CATALOG.map((platform) => `- ${platform.label}: ${formatPlatformStatusForSetup(language, platform.status)}`);\n if (language === \"zh-CN\") {\n return [\"这个 setup 向导当前可配置的平台:\", ...lines].join(\"\\n\");\n }\n return [\"This setup wizard can configure:\", ...lines].join(\"\\n\");\n}\n\nfunction formatExecutorHint(input: {\n language: CliLanguage;\n executor: (typeof EXECUTOR_CATALOG)[number];\n available: boolean;\n current: boolean;\n selectedByDefault: boolean;\n}): string {\n if (input.executor.devOnly) {\n const echoHint = input.language === \"zh-CN\" ? \"开发测试用,不会调用真实 coding agent\" : \"dev/test only; no real coding agent\";\n return input.current ? `${input.language === \"zh-CN\" ? \"当前选择,\" : \"current, \"}${echoHint}` : echoHint;\n }\n\n const availability = input.language === \"zh-CN\" ? (input.available ? \"已检测到\" : \"未检测到\") : input.available ? \"available\" : \"not found\";\n const current = input.current ? (input.language === \"zh-CN\" ? \"当前选择,\" : \"current, \") : \"\";\n const recommended = input.selectedByDefault ? (input.language === \"zh-CN\" ? \"推荐,\" : \"recommended, \") : \"\";\n return `${current || recommended}${availability}`;\n}\n\nasync function collectLanguage(options: SetupCommandOptions, defaults: SetupDefaults, prompts: PromptAdapter): Promise<CliLanguage> {\n if (options.language) {\n return parseCliLanguage(options.language);\n }\n return prompts.select({\n message: t(\"en\", \"language\"),\n initialValue: defaultLanguage(options, defaults),\n options: LANGUAGE_OPTIONS.map((language) => ({\n value: language.id,\n label: language.label,\n hint: language.hint\n }))\n });\n}\n\nasync function collectPlatform(options: SetupCommandOptions, defaults: SetupDefaults, prompts: PromptAdapter, language: CliLanguage): Promise<PlatformId> {\n prompts.note(formatPlatformsForSetup(language));\n const selected = options.platform\n ? parsePlatformId(options.platform)\n : await prompts.select({\n message: t(language, \"platform\"),\n initialValue: defaults.platform ?? \"lark\",\n options: PLATFORM_CATALOG.filter((platform) => platform.startable).map((platform) => ({\n value: platform.id,\n label: platform.label,\n hint: formatPlatformStatusForSetup(language, platform.status)\n }))\n });\n const descriptor = platformById(selected);\n if (!descriptor.startable) {\n throw new Error(`${descriptor.label} setup is not available in the OpenTag CLI yet.`);\n }\n const guide = formatPlatformSetupGuide(selected, language);\n if (guide) {\n prompts.note(guide);\n }\n return selected;\n}\n\nasync function collectExecutor(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage,\n env: NodeJS.ProcessEnv | undefined\n): Promise<ExecutorId> {\n if (options.executor) {\n return parseExecutorId(options.executor);\n }\n const detections = detectExecutors(env);\n const previous = defaults.executor;\n const initialValue = defaultExecutorId({\n ...(previous ? { previous } : {}),\n detections\n });\n\n return prompts.select({\n message: t(language, \"executor\"),\n initialValue,\n options: EXECUTOR_CATALOG.map((executor) => {\n const detection = detections.find((entry) => entry.id === executor.id);\n return {\n value: executor.id,\n label: executor.label,\n hint: formatExecutorHint({\n language,\n executor,\n available: detection?.available ?? false,\n current: executor.id === previous,\n selectedByDefault: executor.id === initialValue\n })\n };\n })\n });\n}\n\nasync function collectProjectPath(options: SetupCommandOptions, defaults: SetupDefaults, prompts: PromptAdapter, language: CliLanguage, cwd: string): Promise<string> {\n if (options.project) {\n return assertExistingPath(options.project);\n }\n const initialValue = defaults.projectPath ?? cwd;\n return prompts.text({\n message: t(language, \"projectPath\"),\n initialValue,\n placeholder: initialValue,\n validate(value) {\n const candidate = value.trim() || initialValue;\n if (!existsSync(candidate)) {\n return `Path does not exist: ${candidate}`;\n }\n return undefined;\n }\n });\n}\n\nasync function collectLarkSetupMethod(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage,\n savedLarkCredentials: SavedLarkCredentials | undefined\n): Promise<LarkSetupMethod> {\n if (options.larkSetup) {\n const setupMethod = parseLarkSetupMethod(options.larkSetup);\n if (setupMethod === \"saved\" && !savedLarkCredentials) {\n throw new Error(\"No saved Lark Personal Agent config was found. Use --lark-setup scan or --lark-setup manual.\");\n }\n return setupMethod;\n }\n if (hasManualLarkCredentials(options)) {\n return \"manual\";\n }\n const methods: LarkSetupMethod[] = savedLarkCredentials ? [\"saved\", \"scan\", \"manual\"] : [\"scan\", \"manual\"];\n const previous = defaults.larkSetupMethod && methods.includes(defaults.larkSetupMethod) ? defaults.larkSetupMethod : undefined;\n return prompts.select({\n message: t(language, \"larkSetup\"),\n initialValue: savedLarkCredentials ? \"saved\" : previous ?? \"scan\",\n options: methods.map((method) => ({\n value: method,\n label: larkSetupLabel(language, method),\n hint:\n method === \"saved\" && savedLarkCredentials\n ? formatSavedLarkCredentialsHint(savedLarkCredentials, language)\n : larkSetupHint(language, method)\n }))\n });\n}\n\nasync function collectLarkDomain(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage,\n setupMethod: LarkSetupMethod,\n savedLarkCredentials: SavedLarkCredentials | undefined\n): Promise<LarkDomain> {\n if (setupMethod === \"saved\") {\n if (!savedLarkCredentials) {\n throw new Error(\"No saved Lark Personal Agent config was found.\");\n }\n return savedLarkCredentials.domain;\n }\n if (options.larkDomain) {\n return parseLarkDomain(options.larkDomain);\n }\n return prompts.select({\n message: t(language, \"larkDomain\"),\n initialValue: defaults.larkDomain ?? \"lark\",\n options: [\n { value: \"lark\", label: \"Lark\", hint: \"larksuite.com\" },\n { value: \"feishu\", label: \"Feishu\", hint: \"feishu.cn\" }\n ]\n });\n}\n\nasync function collectLarkCredentials(input: {\n options: SetupCommandOptions;\n prompts: PromptAdapter;\n language: CliLanguage;\n setupMethod: LarkSetupMethod;\n domain: LarkDomain;\n savedLarkCredentials?: SavedLarkCredentials;\n scanLarkPersonalAgent(input: { domain: LarkDomain }): Promise<RegisteredLarkPersonalAgent>;\n}): Promise<LarkCredentialInput> {\n if (input.setupMethod === \"saved\") {\n if (!input.savedLarkCredentials) {\n throw new Error(\"No saved Lark Personal Agent config was found.\");\n }\n return {\n appId: input.savedLarkCredentials.appId,\n appSecret: input.savedLarkCredentials.appSecret,\n ...(input.savedLarkCredentials.botOpenId ? { botOpenId: input.savedLarkCredentials.botOpenId } : {})\n };\n }\n\n if (input.setupMethod === \"scan\") {\n assertNoManualLarkCredentialFlags(input.options);\n const registered = await input.scanLarkPersonalAgent({ domain: input.domain });\n return {\n appId: registered.appId,\n appSecret: registered.appSecret,\n ...(registered.botOpenId ? { botOpenId: registered.botOpenId } : {})\n };\n }\n\n assertCompleteManualLarkCredentials(input.options);\n if (!hasCompleteManualLarkCredentials(input.options)) {\n input.prompts.note(formatLarkManualCredentialHelp(input.language, input.domain));\n }\n const appId = nonEmpty(input.options.larkAppId ?? (await input.prompts.text({ message: t(input.language, \"larkAppId\") })), \"Lark App ID\");\n const appSecret = nonEmpty(\n input.options.larkAppSecret ??\n (await input.prompts.password({\n message: t(input.language, \"larkAppSecret\"),\n validate(value) {\n if (!value.trim()) return \"Lark App Secret is required.\";\n return undefined;\n }\n })),\n \"Lark App Secret\"\n );\n const botOpenIdInput =\n input.options.larkBotOpenId ??\n (hasCompleteManualLarkCredentials(input.options)\n ? undefined\n : await input.prompts.text({\n message: t(input.language, \"larkBotOpenId\"),\n placeholder: \"ou_...\"\n }));\n const botOpenId = optionalTrimmed(botOpenIdInput);\n return {\n appId,\n appSecret,\n ...(botOpenId ? { botOpenId } : {})\n };\n}\n\nasync function collectSlackSetup(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage\n): Promise<SlackSetupInput> {\n const derivedMode = options.slackMode\n ? parseSlackSetupMode(options.slackMode)\n : options.slackAppToken && !options.slackSigningSecret\n ? \"socket_mode\"\n : options.slackSigningSecret && !options.slackAppToken\n ? \"events_api\"\n : undefined;\n const selectedMode = derivedMode\n ? derivedMode\n : await prompts.select({\n message: t(language, \"slackMode\"),\n initialValue: defaults.slackMode ?? \"socket_mode\",\n options: ([\"socket_mode\", \"events_api\"] satisfies SlackSetupMode[]).map((candidate) => ({\n value: candidate,\n label: slackModeLabel(language, candidate),\n hint: slackModeHint(language, candidate)\n }))\n });\n\n if (selectedMode === \"socket_mode\" && options.slackPort) {\n throw new Error(\"--slack-port can only be used with --slack-mode events_api.\");\n }\n\n if (\n (selectedMode === \"socket_mode\" && (!options.slackAppToken || !options.slackBotToken)) ||\n (selectedMode === \"events_api\" && (!options.slackSigningSecret || !options.slackBotToken))\n ) {\n prompts.note(formatSlackCredentialHelp(language, selectedMode));\n }\n\n const appToken =\n selectedMode === \"socket_mode\"\n ? nonEmpty(\n options.slackAppToken ?? (await prompts.password({ message: t(language, \"slackAppToken\") })),\n \"Slack App-Level Token\"\n )\n : undefined;\n const signingSecret =\n selectedMode === \"events_api\"\n ? nonEmpty(\n options.slackSigningSecret ?? (await prompts.password({ message: t(language, \"slackSigningSecret\") })),\n \"Slack Signing Secret\"\n )\n : undefined;\n const botToken = nonEmpty(\n options.slackBotToken ?? (await prompts.password({ message: t(language, \"slackBotToken\") })),\n \"Slack Bot User OAuth Token\"\n );\n const appId = optionalTrimmed(\n options.slackAppId ??\n (await prompts.text({\n message: t(language, \"slackAppId\"),\n placeholder: \"A...\"\n }))\n );\n const teamId = nonEmpty(\n options.slackTeamId ??\n (await prompts.text({\n message: t(language, \"slackTeamId\"),\n placeholder: \"T...\",\n ...(defaults.slackTeamId ? { initialValue: defaults.slackTeamId } : {})\n })),\n \"Slack Team ID\"\n );\n const channelId = nonEmpty(\n options.slackChannelId ??\n (await prompts.text({\n message: t(language, \"slackChannelId\"),\n placeholder: \"C...\",\n ...(defaults.slackChannelId ? { initialValue: defaults.slackChannelId } : {})\n })),\n \"Slack Channel ID\"\n );\n const port =\n selectedMode === \"events_api\"\n ? (parsePortInput(options.slackPort, \"Slack Events API port\") ??\n (options.yes\n ? defaults.slackPort ?? DEFAULT_SLACK_EVENTS_PORT\n : parseLocalPort(\n await prompts.text({\n message: t(language, \"slackPort\"),\n initialValue: String(defaults.slackPort ?? DEFAULT_SLACK_EVENTS_PORT),\n placeholder: String(DEFAULT_SLACK_EVENTS_PORT)\n }),\n \"Slack Events API port\"\n )))\n : undefined;\n const bindingMethod = await collectBindingMethod(options, defaults, prompts, language, \"slack\");\n return {\n mode: selectedMode,\n ...(appToken ? { appToken } : {}),\n ...(signingSecret ? { signingSecret } : {}),\n botToken,\n teamId,\n channelId,\n bindingMethod,\n ...(appId ? { appId } : {}),\n ...(port ? { port } : {})\n };\n}\n\nasync function collectGitHubSetup(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage,\n projectPath: string\n): Promise<GitHubSetupInput> {\n const repositoryDefault =\n options.githubRepository ??\n (defaults.githubOwner && defaults.githubRepo ? `${defaults.githubOwner}/${defaults.githubRepo}` : undefined) ??\n githubRepositoryFromRemote(projectPath);\n const repositoryInput = nonEmpty(\n options.githubRepository ??\n (await prompts.text({\n message: t(language, \"githubRepository\"),\n ...(repositoryDefault ? { initialValue: repositoryDefault, placeholder: repositoryDefault } : { placeholder: \"owner/repo\" }),\n validate(value) {\n try {\n parseGitHubRepository(value);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n }\n })),\n \"GitHub repository\"\n );\n const repository = parseGitHubRepository(repositoryInput);\n const autoCreatePullRequest =\n options.githubAutoCreatePr ??\n (options.yes\n ? defaults.githubAutoCreatePullRequest ?? false\n : await prompts.confirm({\n message: t(language, \"githubAutoCreatePr\"),\n initialValue: defaults.githubAutoCreatePullRequest ?? false\n }));\n if (!options.githubToken) {\n prompts.note(formatGitHubTokenHelp(language, { autoCreatePullRequest }));\n }\n const token = nonEmpty(options.githubToken ?? (await prompts.password({ message: t(language, \"githubToken\") })), \"GitHub token\");\n const webhookSecret = options.githubWebhookSecret\n ? nonEmpty(options.githubWebhookSecret, \"GitHub webhook secret\")\n : defaults.githubWebhookSecret ?? generateGitHubWebhookSecret();\n const port =\n parsePortInput(options.githubPort, \"GitHub webhook port\") ??\n (options.yes\n ? defaults.githubPort ?? DEFAULT_GITHUB_WEBHOOK_PORT\n : parseLocalPort(\n await prompts.text({\n message: t(language, \"githubPort\"),\n initialValue: String(defaults.githubPort ?? DEFAULT_GITHUB_WEBHOOK_PORT),\n placeholder: String(DEFAULT_GITHUB_WEBHOOK_PORT)\n }),\n \"GitHub webhook port\"\n ));\n return {\n token,\n webhookSecret,\n owner: repository.owner,\n repo: repository.repo,\n webhookPath: parseGitHubWebhookPath(options.githubWebhookPath ?? defaults.githubWebhookPath ?? \"/github/webhooks\"),\n autoCreatePullRequest,\n port\n };\n}\n\nasync function collectBindingMethod(\n options: SetupCommandOptions,\n defaults: SetupDefaults,\n prompts: PromptAdapter,\n language: CliLanguage,\n platform: \"lark\" | \"slack\"\n): Promise<BindingMethod> {\n if (options.binding) {\n const binding = parseBindingMethod(options.binding);\n if (platform === \"slack\" && binding === \"bind_later\") {\n throw new Error(\"Slack setup requires a channel binding. Use --binding default_project.\");\n }\n return binding;\n }\n if (platform === \"slack\") {\n return \"default_project\";\n }\n const message =\n t(language, \"bindingMethod\");\n return prompts.select({\n message,\n initialValue: defaults.bindingMethod ?? \"default_project\",\n options: ([\"default_project\", \"bind_later\"] satisfies BindingMethod[]).map((method) => ({\n value: method,\n label: bindingMethodLabel(language, method, platform),\n hint: bindingMethodHint(language, method, platform)\n }))\n });\n}\n\nexport async function collectSetupInput(\n options: SetupCommandOptions,\n configPath: string,\n dependencies: SetupFlowDependencies\n): Promise<OpenTagSetupInput> {\n const defaults = dependencies.defaults ?? loadDefaultsForSetup(options, configPath);\n const prompts = dependencies.prompts;\n const cwd = dependencies.cwd ?? process.cwd();\n\n prompts.intro(t(defaultLanguage(options, defaults), \"intro\"));\n\n const language = await collectLanguage(options, defaults, prompts);\n const platform = await collectPlatform(options, defaults, prompts, language);\n const executor = await collectExecutor(options, defaults, prompts, language, dependencies.env);\n const projectPath = await collectProjectPath(options, defaults, prompts, language, cwd);\n const resolvedProjectPath = projectPath.trim() || cwd;\n const savedLarkCredentials =\n platform === \"lark\" && shouldReadSavedLarkCredentials(options)\n ? findSavedLarkCredentials(defaults, resolvedProjectPath)\n : undefined;\n const larkSetupMethod =\n platform === \"lark\" ? await collectLarkSetupMethod(options, defaults, prompts, language, savedLarkCredentials) : undefined;\n const larkDomain =\n platform === \"lark\" && larkSetupMethod\n ? await collectLarkDomain(options, defaults, prompts, language, larkSetupMethod, savedLarkCredentials)\n : undefined;\n const larkCredentials =\n platform === \"lark\" && larkSetupMethod && larkDomain\n ? await collectLarkCredentials({\n options,\n prompts,\n language,\n setupMethod: larkSetupMethod,\n domain: larkDomain,\n ...(savedLarkCredentials ? { savedLarkCredentials } : {}),\n scanLarkPersonalAgent: dependencies.scanLarkPersonalAgent\n })\n : undefined;\n const larkBindingMethod = platform === \"lark\" ? await collectBindingMethod(options, defaults, prompts, language, \"lark\") : undefined;\n const slackSetup = platform === \"slack\" ? await collectSlackSetup(options, defaults, prompts, language) : undefined;\n const githubSetup = platform === \"github\" ? await collectGitHubSetup(options, defaults, prompts, language, resolvedProjectPath) : undefined;\n\n const setupInput: OpenTagSetupInput = {\n language,\n platform,\n projectPath: resolvedProjectPath,\n executor,\n ...(larkCredentials && larkDomain && larkSetupMethod && larkBindingMethod\n ? {\n lark: {\n ...larkCredentials,\n domain: larkDomain,\n setupMethod: larkSetupMethod,\n bindingMethod: larkBindingMethod,\n ...(larkSetupMethod === \"saved\" && savedLarkCredentials ? { savedCredentialsSource: savedLarkCredentials.source } : {})\n }\n }\n : {}),\n ...(slackSetup ? { slack: slackSetup } : {}),\n ...(githubSetup ? { github: githubSetup } : {})\n };\n\n prompts.note(formatSetupReview(setupInput, configPath));\n if (!options.yes) {\n const confirmed = await prompts.confirm({\n message: t(language, \"confirmSetup\"),\n initialValue: true\n });\n if (!confirmed) {\n throw new Error(t(language, \"cancelled\"));\n }\n }\n return setupInput;\n}\n","export type CliLanguage = \"en\" | \"zh-CN\";\n\nexport const LANGUAGE_OPTIONS: Array<{\n id: CliLanguage;\n label: string;\n hint: string;\n}> = [\n { id: \"en\", label: \"English\", hint: \"Default\" },\n { id: \"zh-CN\", label: \"简体中文\", hint: \"Chinese\" }\n];\n\nexport function parseCliLanguage(value: string): CliLanguage {\n if (value === \"en\" || value === \"zh-CN\") {\n return value;\n }\n throw new Error(\"Language must be en or zh-CN.\");\n}\n","import type { LarkDomain } from \"@opentag/lark\";\nimport type { CliLanguage } from \"../../catalogs/languages.js\";\nimport type { SavedLarkCredentials } from \"./saved-config.js\";\n\ntype LarkPersonalAgentSummaryInput = {\n appId: string;\n domain: LarkDomain;\n botOpenId?: string;\n source?: SavedLarkCredentials[\"source\"];\n};\n\nfunction shortId(value: string): string {\n if (value.length <= 16) return value;\n return `${value.slice(0, 6)}...${value.slice(-6)}`;\n}\n\nfunction domainLabel(domain: LarkDomain): string {\n return domain === \"feishu\" ? \"Feishu\" : \"Lark\";\n}\n\nfunction sourceLabel(source: SavedLarkCredentials[\"source\"], language: CliLanguage): string {\n if (language === \"zh-CN\") {\n return source === \"opentag_config\" ? \"OpenTag 配置\" : \"旧 start-lark 配置\";\n }\n return source === \"opentag_config\" ? \"OpenTag config\" : \"legacy start-lark config\";\n}\n\nexport function formatLarkPersonalAgentSummary(input: LarkPersonalAgentSummaryInput, language: CliLanguage): string {\n const parts = [\n domainLabel(input.domain),\n `App ID ${shortId(input.appId)}`,\n input.botOpenId ? `Bot Open ID ${shortId(input.botOpenId)}` : undefined,\n input.source\n ? language === \"zh-CN\"\n ? `来源: ${sourceLabel(input.source, language)}`\n : `from ${sourceLabel(input.source, language)}`\n : undefined\n ];\n return parts.filter((part): part is string => Boolean(part)).join(\" | \");\n}\n\nexport function formatSavedLarkCredentialsHint(credentials: SavedLarkCredentials, language: CliLanguage): string {\n return formatLarkPersonalAgentSummary(credentials, language);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { LarkDomain } from \"@opentag/lark\";\nimport { assertPrivateConfigFile, type OpenTagCliConfig } from \"../../config.js\";\n\nconst SavedLarkCredentialsSchema = z\n .object({\n appId: z.string().min(1),\n appSecret: z.string().min(1),\n domain: z.enum([\"lark\", \"feishu\"]),\n botOpenId: z.string().min(1).optional()\n })\n .passthrough();\n\nexport type SavedLarkCredentials = {\n appId: string;\n appSecret: string;\n domain: LarkDomain;\n botOpenId?: string;\n source: \"opentag_config\" | \"legacy_start_lark\";\n path?: string;\n};\n\nexport function savedLarkCredentialsFromCliConfig(config: OpenTagCliConfig): SavedLarkCredentials | undefined {\n const lark = config.platforms.lark;\n if (!lark) return undefined;\n return {\n appId: lark.appId,\n appSecret: lark.appSecret,\n domain: lark.domain,\n ...(lark.botOpenId ? { botOpenId: lark.botOpenId } : {}),\n source: \"opentag_config\"\n };\n}\n\nexport function legacyLarkConfigPath(projectPath: string): string {\n return join(projectPath, \".opentag\", \"lark\", \"lark.local.json\");\n}\n\nfunction parseJsonFile(path: string): unknown {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch (error) {\n throw new Error(`Saved Lark config at ${path} is invalid JSON: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nexport function readLegacyLarkCredentials(projectPath: string): SavedLarkCredentials | undefined {\n const path = legacyLarkConfigPath(projectPath);\n if (!existsSync(path)) return undefined;\n assertPrivateConfigFile(path);\n\n const parsed = SavedLarkCredentialsSchema.safeParse(parseJsonFile(path));\n if (!parsed.success) {\n throw new Error(`Saved Lark config at ${path} is invalid: ${parsed.error.message}`);\n }\n\n return {\n appId: parsed.data.appId,\n appSecret: parsed.data.appSecret,\n domain: parsed.data.domain,\n ...(parsed.data.botOpenId ? { botOpenId: parsed.data.botOpenId } : {}),\n source: \"legacy_start_lark\",\n path\n };\n}\n","export const DEFAULT_SLACK_EVENTS_PORT = 3040;\nexport const DEFAULT_GITHUB_WEBHOOK_PORT = 3050;\n\nexport function parseLocalPort(value: string | number, label: string): number {\n const port = typeof value === \"number\" ? value : Number(value.trim());\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`${label} must be an integer from 1 to 65535.`);\n }\n return port;\n}\n","import type { CliLanguage } from \"../catalogs/languages.js\";\nimport type { BindingMethod, LarkSetupMethod, SlackSetupMode } from \"../setup/types.js\";\n\ntype MessageKey =\n | \"intro\"\n | \"language\"\n | \"platform\"\n | \"executor\"\n | \"projectPath\"\n | \"larkSetup\"\n | \"larkDomain\"\n | \"larkAppId\"\n | \"larkAppSecret\"\n | \"larkBotOpenId\"\n | \"slackMode\"\n | \"slackAppToken\"\n | \"slackSigningSecret\"\n | \"slackBotToken\"\n | \"slackAppId\"\n | \"slackTeamId\"\n | \"slackChannelId\"\n | \"slackPort\"\n | \"githubRepository\"\n | \"githubToken\"\n | \"githubWebhookSecret\"\n | \"githubPort\"\n | \"githubAutoCreatePr\"\n | \"bindingMethod\"\n | \"confirmSetup\"\n | \"cancelled\"\n | \"complete\";\n\nconst MESSAGES: Record<CliLanguage, Record<MessageKey, string>> = {\n en: {\n intro: \"OpenTag setup\",\n language: \"Language / 语言\",\n platform: \"Where should OpenTag listen?\",\n executor: \"Which coding agent should OpenTag use?\",\n projectPath: \"Which project should OpenTag use?\",\n larkSetup: \"How should OpenTag connect to Lark / Feishu?\",\n larkDomain: \"Which Lark domain should OpenTag use?\",\n larkAppId: \"Lark App ID\",\n larkAppSecret: \"Lark App Secret\",\n larkBotOpenId: \"Lark Bot Open ID (optional)\",\n slackMode: \"How should OpenTag connect to Slack?\",\n slackAppToken: \"Slack App-Level Token\",\n slackSigningSecret: \"Slack Signing Secret\",\n slackBotToken: \"Slack Bot User OAuth Token\",\n slackAppId: \"Slack App ID (optional)\",\n slackTeamId: \"Slack Team ID\",\n slackChannelId: \"Slack Channel ID\",\n slackPort: \"Local Slack Events API port\",\n githubRepository: \"GitHub repository (owner/repo)\",\n githubToken: \"GitHub token for comments and `apply 1` pull requests\",\n githubWebhookSecret: \"GitHub webhook secret\",\n githubPort: \"Local GitHub webhook port\",\n githubAutoCreatePr: \"Create pull requests immediately after runs? (advanced)\",\n bindingMethod: \"How should Lark chats bind to this project?\",\n confirmSetup: \"Write this OpenTag config?\",\n cancelled: \"OpenTag setup cancelled.\",\n complete: \"OpenTag setup complete.\"\n },\n \"zh-CN\": {\n intro: \"OpenTag 设置\",\n language: \"Language / 语言\",\n platform: \"OpenTag 要监听哪个平台?\",\n executor: \"OpenTag 要使用哪个 coding agent?\",\n projectPath: \"OpenTag 要使用哪个项目?\",\n larkSetup: \"OpenTag 要如何连接 Lark / 飞书?\",\n larkDomain: \"OpenTag 要使用哪个 Lark 域名?\",\n larkAppId: \"Lark App ID\",\n larkAppSecret: \"Lark App Secret\",\n larkBotOpenId: \"Lark Bot Open ID(可选)\",\n slackMode: \"OpenTag 要如何连接 Slack?\",\n slackAppToken: \"Slack App-Level Token\",\n slackSigningSecret: \"Slack Signing Secret\",\n slackBotToken: \"Slack Bot User OAuth Token\",\n slackAppId: \"Slack App ID(可选)\",\n slackTeamId: \"Slack Team ID\",\n slackChannelId: \"Slack Channel ID\",\n slackPort: \"本地 Slack Events API 端口\",\n githubRepository: \"GitHub 仓库(owner/repo)\",\n githubToken: \"GitHub token(用于回写评论和 apply 1 创建 PR)\",\n githubWebhookSecret: \"GitHub webhook secret\",\n githubPort: \"本地 GitHub webhook 端口\",\n githubAutoCreatePr: \"run 结束后立刻自动创建 pull request 吗?(高级选项)\",\n bindingMethod: \"Lark 群聊要如何绑定到这个项目?\",\n confirmSetup: \"写入这份 OpenTag 配置?\",\n cancelled: \"OpenTag 设置已取消。\",\n complete: \"OpenTag 设置完成。\"\n }\n};\n\nexport function t(language: CliLanguage, key: MessageKey): string {\n return MESSAGES[language][key];\n}\n\nexport function larkSetupLabel(language: CliLanguage, method: LarkSetupMethod): string {\n if (language === \"zh-CN\") {\n if (method === \"saved\") return \"使用已保存的 Personal Agent\";\n return method === \"scan\" ? \"创建新的 Personal Agent\" : \"手动填写 App ID / Secret\";\n }\n if (method === \"saved\") return \"Use saved Personal Agent\";\n return method === \"scan\" ? \"Create a new Personal Agent\" : \"Manual credentials\";\n}\n\nexport function larkSetupHint(language: CliLanguage, method: LarkSetupMethod): string {\n if (language === \"zh-CN\") {\n if (method === \"saved\") return \"推荐,不需要重新扫码\";\n return method === \"scan\" ? \"没有已保存配置时使用\" : \"已有自建应用时使用\";\n }\n if (method === \"saved\") return \"Recommended; no new scan\";\n return method === \"scan\" ? \"Use when no saved app exists\" : \"Use an existing app\";\n}\n\nexport function slackModeLabel(language: CliLanguage, mode: SlackSetupMode): string {\n if (language === \"zh-CN\") {\n return mode === \"socket_mode\" ? \"本地 Socket Mode(推荐)\" : \"公网 Events API\";\n }\n return mode === \"socket_mode\" ? \"Local Socket Mode (Recommended)\" : \"Public Events API\";\n}\n\nexport function slackModeHint(language: CliLanguage, mode: SlackSetupMode): string {\n if (language === \"zh-CN\") {\n return mode === \"socket_mode\" ? \"适合本机运行,不需要公网 URL\" : \"适合云端部署或 tunnel 测试\";\n }\n return mode === \"socket_mode\" ? \"Best for this computer; no public URL\" : \"Best for hosted OpenTag or tunnel testing\";\n}\n\nexport function bindingMethodLabel(language: CliLanguage, method: BindingMethod, platform: \"lark\" | \"slack\" = \"lark\"): string {\n if (language === \"zh-CN\") {\n if (method === \"default_project\") return \"默认使用这个项目\";\n return platform === \"slack\" ? \"稍后在 OpenTag 配置里绑定\" : \"稍后在 Lark 里用 /bind 绑定\";\n }\n if (method === \"default_project\") return \"Use this project by default\";\n return platform === \"slack\" ? \"Bind later from OpenTag config\" : \"Bind later from Lark with /bind\";\n}\n\nexport function bindingMethodHint(language: CliLanguage, method: BindingMethod, platform: \"lark\" | \"slack\" = \"lark\"): string {\n if (language === \"zh-CN\") {\n if (method === \"default_project\") return \"推荐,最快跑通\";\n return platform === \"slack\" ? \"适合先只保存 Slack 连接\" : \"适合多个项目\";\n }\n if (method === \"default_project\") return \"Recommended\";\n return platform === \"slack\" ? \"Use when you only want to save the Slack connection first\" : \"Best for multiple projects\";\n}\n","import { existsSync } from \"node:fs\";\nimport { defaultConfigPath, readCliConfig, type OpenTagCliConfig } from \"../config.js\";\nimport { savedLarkCredentialsFromCliConfig } from \"../platforms/lark/saved-config.js\";\nimport type { BindingMethod, SetupDefaults } from \"./types.js\";\n\nfunction defaultBindingMethod(config: OpenTagCliConfig): BindingMethod | undefined {\n const lastSetup = config.preferences?.lastSetup;\n if (lastSetup?.bindingMethod) return lastSetup.bindingMethod;\n if (config.platforms.lark?.defaultProjectBinding === false) return \"bind_later\";\n if (config.platforms.lark) return \"default_project\";\n if (config.platforms.slack?.defaultProjectBinding === false) return \"bind_later\";\n if (config.platforms.slack) return \"default_project\";\n return undefined;\n}\n\nexport function setupDefaultsFromConfig(config: OpenTagCliConfig): SetupDefaults {\n const repository = config.daemon.repositories[0];\n const lark = config.platforms.lark;\n const slack = config.platforms.slack;\n const github = config.platforms.github;\n const lastSetup = config.preferences?.lastSetup;\n const savedLarkCredentials = savedLarkCredentialsFromCliConfig(config);\n const bindingMethod = defaultBindingMethod(config);\n\n return {\n ...(config.preferences?.language ? { language: config.preferences.language } : {}),\n ...(lastSetup?.platforms?.[0] ? { platform: lastSetup.platforms[0] } : lark ? { platform: \"lark\" } : slack ? { platform: \"slack\" } : github ? { platform: \"github\" } : {}),\n ...(repository?.checkoutPath ? { projectPath: repository.checkoutPath } : {}),\n ...(repository?.defaultExecutor ? { executor: repository.defaultExecutor } : {}),\n ...(lastSetup?.larkSetupMethod ? { larkSetupMethod: lastSetup.larkSetupMethod } : {}),\n ...(lastSetup?.larkDomain ? { larkDomain: lastSetup.larkDomain } : lark?.domain ? { larkDomain: lark.domain } : {}),\n ...(bindingMethod ? { bindingMethod } : {}),\n ...(lastSetup?.slackMode ? { slackMode: lastSetup.slackMode } : slack ? { slackMode: slack.mode ?? \"events_api\" } : {}),\n ...(lastSetup?.slackTeamId ? { slackTeamId: lastSetup.slackTeamId } : slack?.teamId ? { slackTeamId: slack.teamId } : {}),\n ...(lastSetup?.slackChannelId ? { slackChannelId: lastSetup.slackChannelId } : slack?.channelId ? { slackChannelId: slack.channelId } : {}),\n ...(lastSetup?.slackPort ? { slackPort: lastSetup.slackPort } : slack?.port ? { slackPort: slack.port } : {}),\n ...(lastSetup?.githubOwner ? { githubOwner: lastSetup.githubOwner } : github?.owner ? { githubOwner: github.owner } : {}),\n ...(lastSetup?.githubRepo ? { githubRepo: lastSetup.githubRepo } : github?.repo ? { githubRepo: github.repo } : {}),\n ...(lastSetup?.githubPort ? { githubPort: lastSetup.githubPort } : github?.port ? { githubPort: github.port } : {}),\n ...(github?.webhookSecret ? { githubWebhookSecret: github.webhookSecret } : {}),\n ...(github?.webhookPath ? { githubWebhookPath: github.webhookPath } : {}),\n ...(lastSetup?.githubAutoCreatePullRequest !== undefined\n ? { githubAutoCreatePullRequest: lastSetup.githubAutoCreatePullRequest }\n : config.daemon.allowAutoCreatePullRequest !== undefined\n ? { githubAutoCreatePullRequest: config.daemon.allowAutoCreatePullRequest }\n : {}),\n ...(savedLarkCredentials ? { savedLarkCredentials } : {})\n };\n}\n\nexport function loadSetupDefaults(path = defaultConfigPath()): SetupDefaults {\n if (!existsSync(path)) {\n return {};\n }\n return setupDefaultsFromConfig(readCliConfig(path));\n}\n","import type { LarkDomain } from \"@opentag/lark\";\nimport type { CliLanguage } from \"../catalogs/languages.js\";\nimport { platformById, platformSetupGuideUrl, type PlatformId } from \"../catalogs/platforms.js\";\nimport type { SlackSetupMode } from \"./types.js\";\n\nexport const OFFICIAL_SETUP_LINKS = {\n githubTokenPage: \"https://github.com/settings/personal-access-tokens/new\",\n githubTokenDocs: \"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens\",\n githubWebhookDocs: \"https://docs.github.com/en/webhooks/using-webhooks/creating-webhooks\",\n slackApps: \"https://api.slack.com/apps\",\n slackSocketModeDocs: \"https://docs.slack.dev/apis/events-api/using-socket-mode/\",\n slackQuickstartDocs: \"https://docs.slack.dev/quickstart/\",\n slackSigningSecretDocs: \"https://docs.slack.dev/authentication/verifying-requests-from-slack/\",\n larkConsole: \"https://open.larksuite.com/app\",\n feishuConsole: \"https://open.feishu.cn/app\",\n larkAppIdDocs: \"https://open.larksuite.com/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-app-id\",\n larkWebSocketDocs: \"https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/use-websocket\",\n feishuWebSocketDocs: \"https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/use-websocket?lang=zh-CN\"\n} as const;\n\nfunction setupNeeds(platform: PlatformId, language: CliLanguage): string[] {\n if (language === \"zh-CN\") {\n switch (platform) {\n case \"lark\":\n return [\"推荐直接扫码创建 Personal Agent\", \"手动配置时需要 Lark App ID 和 App Secret\"];\n case \"slack\":\n return [\"推荐本地使用 Socket Mode\", \"Socket Mode 需要 Slack App-Level Token 和 Bot User OAuth Token\", \"Events API 需要 Slack Signing Secret 和公网 Request URL\", \"Slack bot scopes 需要 app_mentions:read、chat:write、channels:history\", \"订阅 bot events: app_mention、message.channels\", \"Slack Team ID\", \"Slack Channel ID\", \"测试前需要把 Slack app 邀请进目标 channel\"];\n case \"github\":\n return [\"GitHub 仓库 owner/repo\", \"GitHub token(用于回写评论;你回复 apply 1 后也用于创建 PR)\", \"OpenTag 会自动生成 webhook secret\", \"本地 webhook 端口,默认 3050\", \"需要一个公网 tunnel 转发 GitHub webhook\"];\n case \"telegram\":\n return [];\n }\n }\n\n switch (platform) {\n case \"lark\":\n return [\"QR scan is the recommended path\", \"manual setup needs a Lark App ID and App Secret\"];\n case \"slack\":\n return [\"Socket Mode is recommended for local OpenTag\", \"Socket Mode needs a Slack App-Level Token and Bot User OAuth Token\", \"Events API needs a Slack Signing Secret and public Request URL\", \"Slack bot scopes need app_mentions:read, chat:write, channels:history\", \"Subscribe to bot events: app_mention, message.channels\", \"Slack Team ID\", \"Slack Channel ID\", \"Invite the Slack app to the target channel before testing\"];\n case \"github\":\n return [\"GitHub repository owner/repo\", \"GitHub token for comments and PR creation after you reply `apply 1`\", \"OpenTag generates the webhook secret\", \"Local webhook port, default 3050\", \"A public tunnel is required for GitHub webhook delivery\"];\n case \"telegram\":\n return [];\n }\n}\n\nfunction officialSetupLinks(platform: PlatformId, language: CliLanguage): string[] {\n if (language === \"zh-CN\") {\n switch (platform) {\n case \"lark\":\n return [\n `Lark 开发者后台: ${OFFICIAL_SETUP_LINKS.larkConsole}`,\n `飞书开发者后台: ${OFFICIAL_SETUP_LINKS.feishuConsole}`\n ];\n case \"slack\":\n return [\n `Slack App 管理页: ${OFFICIAL_SETUP_LINKS.slackApps}`,\n `Socket Mode 官方文档: ${OFFICIAL_SETUP_LINKS.slackSocketModeDocs}`\n ];\n case \"github\":\n return [\n `GitHub token 创建页: ${OFFICIAL_SETUP_LINKS.githubTokenPage}`,\n `Repository webhook 官方文档: ${OFFICIAL_SETUP_LINKS.githubWebhookDocs}`\n ];\n case \"telegram\":\n return [];\n }\n }\n\n switch (platform) {\n case \"lark\":\n return [\n `Lark Developer Console: ${OFFICIAL_SETUP_LINKS.larkConsole}`,\n `Feishu Developer Console: ${OFFICIAL_SETUP_LINKS.feishuConsole}`\n ];\n case \"slack\":\n return [\n `Slack app settings: ${OFFICIAL_SETUP_LINKS.slackApps}`,\n `Socket Mode docs: ${OFFICIAL_SETUP_LINKS.slackSocketModeDocs}`\n ];\n case \"github\":\n return [\n `GitHub token page: ${OFFICIAL_SETUP_LINKS.githubTokenPage}`,\n `Repository webhook docs: ${OFFICIAL_SETUP_LINKS.githubWebhookDocs}`\n ];\n case \"telegram\":\n return [];\n }\n}\n\nexport function formatPlatformSetupGuide(platform: PlatformId, language: CliLanguage): string | undefined {\n const url = platformSetupGuideUrl(platform, language);\n if (!url) return undefined;\n\n const descriptor = platformById(platform);\n const needs = setupNeeds(platform, language);\n const officialLinks = officialSetupLinks(platform, language);\n if (language === \"zh-CN\") {\n return [\n `${descriptor.label} 配置教程:`,\n url,\n \"\",\n \"官方入口:\",\n ...officialLinks.map((item) => `- ${item}`),\n \"\",\n \"继续填写前,先打开教程确认这些值在哪里拿:\",\n ...needs.map((item) => `- ${item}`)\n ].join(\"\\n\");\n }\n\n return [\n `${descriptor.label} setup guide:`,\n url,\n \"\",\n \"Official setup pages:\",\n ...officialLinks.map((item) => `- ${item}`),\n \"\",\n \"Open the guide before filling in these values:\",\n ...needs.map((item) => `- ${item}`)\n ].join(\"\\n\");\n}\n\nexport function formatLarkManualCredentialHelp(language: CliLanguage, domain: LarkDomain): string {\n const consoleUrl = domain === \"feishu\" ? OFFICIAL_SETUP_LINKS.feishuConsole : OFFICIAL_SETUP_LINKS.larkConsole;\n const websocketDocs = domain === \"feishu\" ? OFFICIAL_SETUP_LINKS.feishuWebSocketDocs : OFFICIAL_SETUP_LINKS.larkWebSocketDocs;\n if (language === \"zh-CN\") {\n return [\n \"手动 Lark / 飞书凭据在哪里拿:\",\n `- 开发者后台: ${consoleUrl}`,\n \"- App ID / App Secret: 打开你的应用,进入 Credentials & Basic Info / 凭证与基础信息\",\n \"- 事件接收方式: 使用长连接 / WebSocket\",\n `- 长连接官方文档: ${websocketDocs}`,\n \"\",\n \"如果你没有自建应用,建议返回选择扫码创建 Personal Agent。\"\n ].join(\"\\n\");\n }\n\n return [\n \"Where to find manual Lark / Feishu credentials:\",\n `- Developer console: ${consoleUrl}`,\n \"- App ID / App Secret: open your app, then go to Credentials & Basic Info\",\n \"- Event delivery mode: use long connection / WebSocket\",\n `- WebSocket docs: ${websocketDocs}`,\n \"\",\n \"If you do not already manage a self-built app, use QR scan instead.\"\n ].join(\"\\n\");\n}\n\nexport function formatSlackCredentialHelp(language: CliLanguage, mode: SlackSetupMode): string {\n if (language === \"zh-CN\") {\n const modeSpecific =\n mode === \"socket_mode\"\n ? [\n `- Socket Mode 官方文档: ${OFFICIAL_SETUP_LINKS.slackSocketModeDocs}`,\n \"- Slack App-Level Token: Basic Information -> App-Level Tokens -> Generate Token and Scopes,scope 选 connections:write\",\n \"- Socket Mode 不需要 Request URL\"\n ]\n : [\n `- Signing Secret 官方文档: ${OFFICIAL_SETUP_LINKS.slackSigningSecretDocs}`,\n \"- Slack Signing Secret: Basic Information -> App Credentials\",\n \"- Request URL: 填你的公网 tunnel,例如 https://<your-tunnel>/slack/events\"\n ];\n return [\n \"Slack 这些值在哪里拿:\",\n `- Slack App 管理页: ${OFFICIAL_SETUP_LINKS.slackApps}`,\n ...modeSpecific,\n \"- Slack Bot User OAuth Token: OAuth & Permissions -> Bot User OAuth Token\",\n \"- Bot Token Scopes: app_mentions:read, chat:write, channels:history\",\n \"- Bot Events: app_mention, message.channels\",\n \"- Team ID / Channel ID: 用浏览器打开 Slack channel,从地址里复制 T... 和 C...\",\n \"- 测试前在目标 channel 里运行 /invite @你的 App 名称,把 app 邀请进 channel\"\n ].join(\"\\n\");\n }\n\n const modeSpecific =\n mode === \"socket_mode\"\n ? [\n `- Socket Mode docs: ${OFFICIAL_SETUP_LINKS.slackSocketModeDocs}`,\n \"- Slack App-Level Token: Basic Information -> App-Level Tokens -> Generate Token and Scopes, then add connections:write\",\n \"- Socket Mode does not need a Request URL\"\n ]\n : [\n `- Signing Secret docs: ${OFFICIAL_SETUP_LINKS.slackSigningSecretDocs}`,\n \"- Slack Signing Secret: Basic Information -> App Credentials\",\n \"- Request URL: use your public tunnel, for example https://<your-tunnel>/slack/events\"\n ];\n return [\n \"Where to find these Slack values:\",\n `- Slack app settings: ${OFFICIAL_SETUP_LINKS.slackApps}`,\n ...modeSpecific,\n \"- Slack Bot User OAuth Token: OAuth & Permissions -> Bot User OAuth Token\",\n \"- Bot Token Scopes: app_mentions:read, chat:write, channels:history\",\n \"- Bot Events: app_mention, message.channels\",\n \"- Team ID / Channel ID: open the Slack channel in a browser and copy the T... and C... values from the URL\",\n \"- Before testing, run /invite @your app name in the target channel so Slack sends mentions to the app\"\n ].join(\"\\n\");\n}\n\nexport function formatGitHubTokenHelp(language: CliLanguage, input: { autoCreatePullRequest: boolean }): string {\n if (language === \"zh-CN\") {\n const permissions =\n input.autoCreatePullRequest\n ? [\"- Issues: Read and write\", \"- Pull requests: Read and write\", \"- Contents: Read and write\"]\n : [\"- Issues: Read and write\", \"- Pull requests: Read and write\", \"- Contents: 默认 apply 1 流程不需要;run branch 会使用本机 git remote 凭据推送\"];\n return [\n \"GitHub token 在哪里创建:\",\n `- 直接打开: ${OFFICIAL_SETUP_LINKS.githubTokenPage}`,\n `- 官方教程: ${OFFICIAL_SETUP_LINKS.githubTokenDocs}`,\n \"\",\n \"推荐创建 fine-grained personal access token,只授权当前仓库。需要权限:\",\n ...permissions,\n \"\",\n \"GitHub 只会展示 token 一次,创建后马上复制并粘贴到下一步。\"\n ].join(\"\\n\");\n }\n\n const permissions =\n input.autoCreatePullRequest\n ? [\"- Issues: Read and write\", \"- Pull requests: Read and write\", \"- Contents: Read and write\"]\n : [\"- Issues: Read and write\", \"- Pull requests: Read and write\", \"- Contents: not needed for the default apply-1 flow; branch push uses your local git remote credentials\"];\n return [\n \"Where to create the GitHub token:\",\n `- Direct token page: ${OFFICIAL_SETUP_LINKS.githubTokenPage}`,\n `- Official guide: ${OFFICIAL_SETUP_LINKS.githubTokenDocs}`,\n \"\",\n \"Create a fine-grained personal access token and limit it to this repository. Required permissions:\",\n ...permissions,\n \"\",\n \"GitHub only shows the token once. Copy it immediately, then paste it into the next prompt.\"\n ].join(\"\\n\");\n}\n","import { DEFAULT_GITHUB_WEBHOOK_PORT } from \"../ports.js\";\n\nexport function githubLocalWebhookUrl(input: { port?: number | undefined; webhookPath?: string | undefined }): string {\n return `http://127.0.0.1:${input.port ?? DEFAULT_GITHUB_WEBHOOK_PORT}${input.webhookPath ?? \"/github/webhooks\"}`;\n}\n\nexport function githubPublicWebhookUrlPlaceholder(webhookPath = \"/github/webhooks\"): string {\n return `https://<your-tunnel-host>${webhookPath}`;\n}\n\nexport function githubWebhooksSettingsUrl(input: { owner: string; repo: string }): string {\n return `https://github.com/${input.owner}/${input.repo}/settings/hooks`;\n}\n","import { executorLabel } from \"../catalogs/executors.js\";\nimport { platformById } from \"../catalogs/platforms.js\";\nimport type { CliLanguage } from \"../catalogs/languages.js\";\nimport type { OpenTagCliConfig } from \"../config.js\";\nimport { githubLocalWebhookUrl, githubPublicWebhookUrlPlaceholder, githubWebhooksSettingsUrl } from \"../platforms/github/display.js\";\nimport { formatLarkPersonalAgentSummary } from \"../platforms/lark/display.js\";\nimport { DEFAULT_GITHUB_WEBHOOK_PORT, DEFAULT_SLACK_EVENTS_PORT } from \"../platforms/ports.js\";\nimport type { LarkSetupMethod, OpenTagSetupInput } from \"./types.js\";\n\nfunction yesNo(value: boolean, language: CliLanguage): string {\n return language === \"zh-CN\" ? (value ? \"是\" : \"否\") : value ? \"yes\" : \"no\";\n}\n\nfunction larkSetupDescription(method: LarkSetupMethod, language: CliLanguage): string {\n if (language === \"zh-CN\") {\n if (method === \"saved\") return \"使用已保存的 Personal Agent\";\n return method === \"scan\" ? \"创建新的 Personal Agent\" : \"手动填写\";\n }\n if (method === \"saved\") return \"Saved Personal Agent\";\n return method === \"scan\" ? \"Create new Personal Agent\" : \"Manual credentials\";\n}\n\nexport function formatSetupReview(input: OpenTagSetupInput, configPath: string): string {\n const platform = platformById(input.platform);\n const commonLines =\n input.language === \"zh-CN\"\n ? [\n \"请确认 OpenTag 配置:\",\n `配置文件: ${configPath}`,\n `平台: ${platform.label}`,\n `Coding agent: ${executorLabel(input.executor)}`,\n `项目路径: ${input.projectPath}`\n ]\n : [\n \"Review your OpenTag setup:\",\n `Config: ${configPath}`,\n `Platform: ${platform.label}`,\n `Coding agent: ${executorLabel(input.executor)}`,\n `Project path: ${input.projectPath}`\n ];\n\n const platformLines: string[] = [];\n if (input.lark) {\n const larkPersonalAgent = formatLarkPersonalAgentSummary(\n {\n ...input.lark,\n ...(input.lark.savedCredentialsSource ? { source: input.lark.savedCredentialsSource } : {})\n },\n input.language\n );\n platformLines.push(\n ...(input.language === \"zh-CN\"\n ? [\n `Lark 连接方式: ${larkSetupDescription(input.lark.setupMethod, input.language)}`,\n `Personal Agent: ${larkPersonalAgent}`,\n `Lark 域名: ${input.lark.domain}`,\n `默认绑定当前项目: ${yesNo(input.lark.bindingMethod === \"default_project\", input.language)}`\n ]\n : [\n `Lark setup: ${larkSetupDescription(input.lark.setupMethod, input.language)}`,\n `Personal Agent: ${larkPersonalAgent}`,\n `Lark domain: ${input.lark.domain}`,\n `Default project binding: ${yesNo(input.lark.bindingMethod === \"default_project\", input.language)}`\n ])\n );\n }\n if (input.slack) {\n const slackConnectionLines =\n input.slack.mode === \"socket_mode\"\n ? input.language === \"zh-CN\"\n ? [\"Slack 连接方式: 本地 Socket Mode\", \"Slack 入站: 通过 Slack WebSocket,不需要公网 URL\"]\n : [\"Slack connection: Local Socket Mode\", \"Slack ingress: Slack WebSocket; no public URL required\"]\n : input.language === \"zh-CN\"\n ? [\"Slack 连接方式: 公网 Events API\", `Slack Events URL: http://localhost:${input.slack.port ?? DEFAULT_SLACK_EVENTS_PORT}/slack/events`]\n : [\"Slack connection: Public Events API\", `Slack Events URL: http://localhost:${input.slack.port ?? DEFAULT_SLACK_EVENTS_PORT}/slack/events`];\n platformLines.push(\n ...(input.language === \"zh-CN\"\n ? [\n ...slackConnectionLines,\n `Slack Team ID: ${input.slack.teamId}`,\n `Slack Channel ID: ${input.slack.channelId}`,\n `默认绑定当前项目: ${yesNo(input.slack.bindingMethod === \"default_project\", input.language)}`\n ]\n : [\n ...slackConnectionLines,\n `Slack Team ID: ${input.slack.teamId}`,\n `Slack Channel ID: ${input.slack.channelId}`,\n `Default project binding: ${yesNo(input.slack.bindingMethod === \"default_project\", input.language)}`\n ])\n );\n }\n if (input.github) {\n const webhookPath = input.github.webhookPath;\n platformLines.push(\n ...(input.language === \"zh-CN\"\n ? [\n `GitHub 仓库: ${input.github.owner}/${input.github.repo}`,\n `GitHub 本地 webhook: ${githubLocalWebhookUrl({ port: input.github.port, webhookPath })}`,\n `GitHub Payload URL: ${githubPublicWebhookUrlPlaceholder(webhookPath)}`,\n \"Webhook secret: OpenTag 会自动生成\",\n \"默认 PR 流程: 回复 apply 1 后创建\",\n `run 后立刻自动创建 PR: ${yesNo(input.github.autoCreatePullRequest, input.language)}`\n ]\n : [\n `GitHub repository: ${input.github.owner}/${input.github.repo}`,\n `GitHub local webhook: ${githubLocalWebhookUrl({ port: input.github.port, webhookPath })}`,\n `GitHub Payload URL: ${githubPublicWebhookUrlPlaceholder(webhookPath)}`,\n \"Webhook secret: generated by OpenTag\",\n \"Default PR flow: create after replying `apply 1`\",\n `Immediate PR after run: ${yesNo(input.github.autoCreatePullRequest, input.language)}`\n ])\n );\n }\n const lines = [...commonLines, ...platformLines];\n return lines.join(\"\\n\");\n}\n\nexport function formatSetupComplete(config: OpenTagCliConfig, configPath: string): string {\n const repository = config.daemon.repositories[0];\n const language = config.preferences?.language ?? \"en\";\n const github = config.platforms.github;\n const slack = config.platforms.slack;\n const githubPort = github?.port ?? DEFAULT_GITHUB_WEBHOOK_PORT;\n if (language === \"zh-CN\") {\n return [\n \"OpenTag 配置已保存。\",\n `配置文件: ${configPath}`,\n repository ? `项目路径: ${repository.checkoutPath}` : undefined,\n slack ? \"\" : undefined,\n slack ? \"Slack 下一步:\" : undefined,\n slack ? `绑定 channel: ${slack.teamId}/${slack.channelId}` : undefined,\n slack ? \"测试前先在 Slack channel 里运行 /invite @你的 App 名称。\" : undefined,\n slack?.mode === \"socket_mode\" ? \"Socket Mode 不需要公网 URL;直接保持 opentag start 运行即可。\" : undefined,\n slack?.mode !== \"socket_mode\" && slack ? `Events API 本地监听: http://localhost:${slack.port ?? DEFAULT_SLACK_EVENTS_PORT}/slack/events` : undefined,\n github ? \"\" : undefined,\n github ? \"GitHub webhook 下一步:\" : undefined,\n github ? `GitHub 设置页: ${githubWebhooksSettingsUrl(github)}` : undefined,\n github ? `Payload URL: ${githubPublicWebhookUrlPlaceholder(github.webhookPath ?? \"/github/webhooks\")}` : undefined,\n github ? `Secret: ${github.webhookSecret}` : undefined,\n github ? \"Content type: application/json\" : undefined,\n github ? \"Events: Issue comments, Pull request review comments\" : undefined,\n github ? `本地监听: ${githubLocalWebhookUrl({ port: github.port, webhookPath: github.webhookPath })}` : undefined,\n github ? `公网 URL 需要由 tunnel 指向本地监听地址,例如 ngrok http ${githubPort}。` : undefined,\n github ? \"当 OpenTag 给出 create_pull_request 建议动作后,在 thread 里回复 apply 1 创建 PR。\" : undefined\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n }\n return [\n \"OpenTag config saved.\",\n `Config: ${configPath}`,\n repository ? `Project path: ${repository.checkoutPath}` : undefined,\n slack ? \"\" : undefined,\n slack ? \"Slack next steps:\" : undefined,\n slack ? `Bound channel: ${slack.teamId}/${slack.channelId}` : undefined,\n slack ? \"Before testing, run /invite @your app name in that Slack channel.\" : undefined,\n slack?.mode === \"socket_mode\" ? \"Socket Mode does not need a public URL; keep opentag start running.\" : undefined,\n slack?.mode !== \"socket_mode\" && slack ? `Events API local listener: http://localhost:${slack.port ?? DEFAULT_SLACK_EVENTS_PORT}/slack/events` : undefined,\n github ? \"\" : undefined,\n github ? \"GitHub webhook next steps:\" : undefined,\n github ? `GitHub settings: ${githubWebhooksSettingsUrl(github)}` : undefined,\n github ? `Payload URL: ${githubPublicWebhookUrlPlaceholder(github.webhookPath ?? \"/github/webhooks\")}` : undefined,\n github ? `Secret: ${github.webhookSecret}` : undefined,\n github ? \"Content type: application/json\" : undefined,\n github ? \"Events: Issue comments, Pull request review comments\" : undefined,\n github ? `Local listener: ${githubLocalWebhookUrl({ port: github.port, webhookPath: github.webhookPath })}` : undefined,\n github ? `Point a public tunnel at the local listener, for example: ngrok http ${githubPort}.` : undefined,\n github ? \"When OpenTag shows a create_pull_request action, reply `apply 1` in the thread to create the PR.\" : undefined\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n}\n","import * as p from \"@clack/prompts\";\nimport type { PromptAdapter, PromptOption } from \"./prompts.js\";\n\nfunction cancelled(): never {\n p.cancel(\"OpenTag setup cancelled.\");\n process.exit(0);\n}\n\nfunction unwrapPromptResult<Value>(value: Value | symbol): Value {\n if (p.isCancel(value)) {\n cancelled();\n }\n return value;\n}\n\ntype ClackStringOption<Value extends string> = {\n value: Value;\n label: string;\n hint?: string;\n};\n\nfunction clackOptions<Value extends string>(options: Array<PromptOption<Value>>): Array<ClackStringOption<Value>> {\n return options.map((option) => {\n const clackOption: ClackStringOption<Value> = {\n value: option.value,\n label: option.label\n };\n return option.hint ? { ...clackOption, hint: option.hint } : clackOption;\n });\n}\n\nexport function createClackPromptAdapter(): PromptAdapter {\n return {\n intro(message) {\n p.intro(message);\n },\n outro(message) {\n p.outro(message);\n },\n note(message) {\n p.log.message(message);\n },\n async select<Value extends string>(input: {\n message: string;\n options: Array<PromptOption<Value>>;\n initialValue?: Value;\n }): Promise<Value> {\n const selected = unwrapPromptResult(\n await p.select<string>({\n message: input.message,\n options: clackOptions(input.options),\n ...(input.initialValue ? { initialValue: input.initialValue } : {})\n })\n );\n return selected as Value;\n },\n async text(input) {\n return unwrapPromptResult(await p.text(input));\n },\n async password(input) {\n return unwrapPromptResult(await p.password({ ...input, mask: \"*\" }));\n },\n async confirm(input) {\n return unwrapPromptResult(await p.confirm(input));\n }\n };\n}\n","import qrcode from \"qrcode-terminal\";\nimport { registerLarkPersonalAgent, type LarkDomain, type RegisteredLarkPersonalAgent } from \"@opentag/lark\";\n\nexport type ScanLarkPersonalAgentDependencies = {\n output?: Pick<NodeJS.WriteStream, \"write\">;\n register?: typeof registerLarkPersonalAgent;\n showQrCode?: boolean;\n};\n\nexport async function scanLarkPersonalAgent(\n input: { domain: LarkDomain },\n dependencies: ScanLarkPersonalAgentDependencies = {}\n): Promise<RegisteredLarkPersonalAgent> {\n const output = dependencies.output ?? process.stdout;\n const register = dependencies.register ?? registerLarkPersonalAgent;\n const showQrCode = dependencies.showQrCode ?? process.env.OPENTAG_SHOW_QR === \"1\";\n\n const registered = await register({\n domain: input.domain,\n onQrCode(info) {\n output.write(\"\\nOpen this URL to create the Lark / Feishu Personal Agent app:\\n\");\n output.write(`URL: ${info.url}\\n`);\n output.write(`This QR code expires in about ${Math.ceil(info.expireIn / 60)} minute(s).\\n`);\n if (showQrCode) {\n output.write(\"\\nTerminal QR code:\\n\");\n qrcode.generate(info.url, { small: true }, (qr) => {\n output.write(`${qr}\\n`);\n });\n } else {\n output.write(\"Terminal QR codes are hidden by default because Lark setup links are large.\\n\");\n output.write(\"Set OPENTAG_SHOW_QR=1 if you prefer scanning a terminal QR code.\\n\");\n }\n output.write(\"Keep this terminal open. OpenTag will continue automatically after the app is created.\\n\\n\");\n },\n onStatus(info) {\n if (info.status === \"slow_down\") {\n output.write(`Lark asked OpenTag to poll more slowly. Next check in ${info.interval ?? \"a few\"} seconds.\\n`);\n } else if (info.status === \"domain_switched\") {\n output.write(\"Detected a Lark tenant. Continuing registration on larksuite.com.\\n\");\n }\n },\n onWarning(message) {\n output.write(`${message}\\n`);\n }\n });\n\n output.write(\"Lark Personal Agent connected.\\n\");\n output.write(`App ID: ${registered.appId}\\n`);\n output.write(`Domain: ${registered.domain}\\n`);\n if (registered.operatorOpenId) {\n output.write(`Setup user: ${registered.operatorOpenId}\\n`);\n }\n if (registered.botOpenId) {\n output.write(`Bot: ${registered.botName ?? \"OpenTag\"} (${registered.botOpenId})\\n`);\n }\n output.write(\"\\n\");\n\n return registered;\n}\n","import { createServer } from \"node:net\";\nimport { createDispatcherAdminClient, type ChannelBindingInput, type RepositoryBindingConfig } from \"@opentag/client\";\nimport { startGitHubIngress, type GitHubIngressConfig, type GitHubIngressHandle } from \"@opentag/github\";\nimport { DEFAULT_AGENT_ID, startLarkIngress, type LarkIngressConfig, type LarkIngressHandle } from \"@opentag/lark\";\nimport {\n createDaemonRuntimeInput,\n normalizeChannelBindings,\n serveDaemon,\n startDispatcher,\n type LocalDispatcherRuntimeInput\n} from \"@opentag/local-runtime\";\nimport {\n startSlackIngress,\n startSlackSocketModeIngress,\n type SlackEventsApiIngressConfig,\n type SlackIngressHandle,\n type SlackSocketModeIngressConfig,\n type SlackSocketModeIngressHandle\n} from \"@opentag/slack\";\nimport { defaultConfigPath, ensurePrivateDirectory, readCliConfig, type OpenTagCliConfig } from \"./config.js\";\nimport { probeDispatcherHealth } from \"./health.js\";\nimport { githubLocalWebhookUrl, githubPublicWebhookUrlPlaceholder, githubWebhooksSettingsUrl } from \"./platforms/github/display.js\";\nimport { DEFAULT_GITHUB_WEBHOOK_PORT, DEFAULT_SLACK_EVENTS_PORT } from \"./platforms/ports.js\";\n\nexport type StartCommandOptions = {\n config?: string;\n};\n\nexport type BootstrapClient = {\n registerRunner(name?: string): Promise<void>;\n bindRepository(binding: RepositoryBindingConfig): Promise<void>;\n bindChannel(binding: ChannelBindingInput): Promise<void>;\n};\n\ntype PlatformIngressHandle =\n | { platform: \"lark\"; url?: string; handle: LarkIngressHandle }\n | { platform: \"slack\"; mode: \"events_api\"; url: string; handle: SlackIngressHandle }\n | { platform: \"slack\"; mode: \"socket_mode\"; handle: SlackSocketModeIngressHandle }\n | { platform: \"github\"; url: string; webhookPath: string; handle: GitHubIngressHandle };\n\nfunction dispatcherPortFromUrl(dispatcherUrl: string): number {\n const url = new URL(dispatcherUrl);\n if (url.protocol !== \"http:\" || (url.hostname !== \"localhost\" && url.hostname !== \"127.0.0.1\")) {\n throw new Error(\"opentag start currently supports only local http dispatcher URLs.\");\n }\n if (url.pathname !== \"/\" || url.search || url.hash) {\n throw new Error(\"Dispatcher URL must not include a path, query, or hash.\");\n }\n const port = url.port ? Number(url.port) : 80;\n if (!Number.isInteger(port) || port <= 0) {\n throw new Error(`Dispatcher URL has an invalid port: ${dispatcherUrl}`);\n }\n return port;\n}\n\nfunction requireLarkConfig(config: OpenTagCliConfig): NonNullable<OpenTagCliConfig[\"platforms\"][\"lark\"]> {\n const lark = config.platforms.lark;\n if (!lark) {\n throw new Error(\"This config has no Lark platform config.\");\n }\n return lark;\n}\n\nfunction requireSlackConfig(config: OpenTagCliConfig): NonNullable<OpenTagCliConfig[\"platforms\"][\"slack\"]> {\n const slack = config.platforms.slack;\n if (!slack) {\n throw new Error(\"This config has no Slack platform config.\");\n }\n return slack;\n}\n\nfunction requireGitHubConfig(config: OpenTagCliConfig): NonNullable<OpenTagCliConfig[\"platforms\"][\"github\"]> {\n const github = config.platforms.github;\n if (!github) {\n throw new Error(\"This config has no GitHub platform config.\");\n }\n return github;\n}\n\nfunction hasStartablePlatform(config: OpenTagCliConfig): boolean {\n return Boolean(config.platforms.lark || config.platforms.slack || config.platforms.github);\n}\n\ntype LocalPortCheck = {\n label: string;\n port: number;\n fix: string;\n};\n\nfunction localStartPortChecks(config: OpenTagCliConfig): LocalPortCheck[] {\n const checks: LocalPortCheck[] = [\n {\n label: \"dispatcher\",\n port: dispatcherPortFromUrl(config.daemon.dispatcherUrl),\n fix: \"Change daemon.dispatcherUrl in the OpenTag config.\"\n }\n ];\n const slack = config.platforms.slack;\n if (slack && slackModeFromCliConfig(config) === \"events_api\") {\n checks.push({\n label: \"Slack Events API\",\n port: slack.port ?? DEFAULT_SLACK_EVENTS_PORT,\n fix: \"Run `opentag setup --platform slack --slack-mode events_api --slack-port <port> --force`, or edit platforms.slack.port in the OpenTag config.\"\n });\n }\n const github = config.platforms.github;\n if (github) {\n checks.push({\n label: \"GitHub local webhook\",\n port: github.port ?? DEFAULT_GITHUB_WEBHOOK_PORT,\n fix: \"Run `opentag setup --platform github --github-port <port> --force`, or edit platforms.github.port in the OpenTag config.\"\n });\n }\n return checks;\n}\n\nasync function assertPortAvailable(check: LocalPortCheck): Promise<void> {\n const server = createServer();\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"EADDRINUSE\") {\n reject(\n new Error(\n [\n `OpenTag cannot start ${check.label} because port ${check.port} is already in use.`,\n check.fix,\n `To inspect the current process: lsof -nP -iTCP:${check.port} -sTCP:LISTEN`\n ].join(\"\\n\")\n )\n );\n return;\n }\n reject(\n new Error(\n [`OpenTag cannot start ${check.label} on port ${check.port}: ${error.message}`, check.fix].join(\"\\n\")\n )\n );\n });\n // Tunnels commonly forward to localhost/127.0.0.1; this catches the real\n // collision even when another address family would still let Node listen.\n server.listen(check.port, \"127.0.0.1\", () => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n });\n}\n\nexport async function assertStartPortsAvailable(config: OpenTagCliConfig): Promise<void> {\n const checks = localStartPortChecks(config);\n const seen = new Map<number, LocalPortCheck>();\n for (const check of checks) {\n const existing = seen.get(check.port);\n if (existing) {\n throw new Error(\n [\n `OpenTag cannot start because ${existing.label} and ${check.label} both use port ${check.port}.`,\n `${existing.label}: ${existing.fix}`,\n `${check.label}: ${check.fix}`\n ].join(\"\\n\")\n );\n }\n seen.set(check.port, check);\n }\n for (const check of checks) {\n await assertPortAvailable(check);\n }\n}\n\nexport function dispatcherRuntimeInputFromCliConfig(config: OpenTagCliConfig): LocalDispatcherRuntimeInput {\n if (!hasStartablePlatform(config)) {\n throw new Error(\"This config has no startable platform. Run `opentag setup` and choose Lark, Slack, or GitHub.\");\n }\n const lark = config.platforms.lark;\n const slack = config.platforms.slack;\n const github = config.platforms.github;\n if (github && !config.daemon.githubToken) {\n throw new Error(\"GitHub platform requires daemon.githubToken for callbacks.\");\n }\n if (github && !config.daemon.preparePullRequestBranch && !config.daemon.allowAutoCreatePullRequest) {\n throw new Error(\n \"GitHub platform requires daemon.preparePullRequestBranch=true unless legacy daemon.allowAutoCreatePullRequest is enabled. Run `opentag setup` and choose GitHub to update this config.\"\n );\n }\n return {\n port: dispatcherPortFromUrl(config.daemon.dispatcherUrl),\n databasePath: config.state.databasePath,\n ...(config.daemon.pairingToken ? { pairingToken: config.daemon.pairingToken } : {}),\n ...(config.daemon.githubToken ? { githubToken: config.daemon.githubToken } : {}),\n ...(lark\n ? {\n lark: {\n appId: lark.appId,\n appSecret: lark.appSecret,\n domain: lark.domain\n }\n }\n : {}),\n ...(slack ? { slackBotToken: slack.botToken } : {})\n };\n}\n\nfunction defaultRepoBindingFromConfig(config: OpenTagCliConfig): LarkIngressConfig[\"defaultRepoBinding\"] {\n if (config.platforms.lark?.defaultProjectBinding === false) return undefined;\n if (config.daemon.repositories.length !== 1) return undefined;\n const repository = config.daemon.repositories[0];\n if (!repository) return undefined;\n return {\n repoProvider: repository.provider,\n owner: repository.owner,\n repo: repository.repo\n };\n}\n\nexport function larkIngressConfigFromCliConfig(config: OpenTagCliConfig): LarkIngressConfig {\n const lark = requireLarkConfig(config);\n const defaultRepoBinding = defaultRepoBindingFromConfig(config);\n return {\n appId: lark.appId,\n appSecret: lark.appSecret,\n dispatcherUrl: config.daemon.dispatcherUrl,\n domain: lark.domain,\n agentId: DEFAULT_AGENT_ID,\n ...(config.daemon.pairingToken ? { dispatcherToken: config.daemon.pairingToken } : {}),\n ...(lark.botOpenId ? { botOpenId: lark.botOpenId } : {}),\n ...(defaultRepoBinding ? { defaultRepoBinding } : {})\n };\n}\n\nfunction slackModeFromCliConfig(config: OpenTagCliConfig): \"socket_mode\" | \"events_api\" {\n const slack = requireSlackConfig(config);\n return slack.mode ?? \"events_api\";\n}\n\nexport function slackIngressConfigFromCliConfig(config: OpenTagCliConfig): SlackEventsApiIngressConfig {\n const slack = requireSlackConfig(config);\n if (!slack.signingSecret) {\n throw new Error(\"Slack Events API mode requires platforms.slack.signingSecret.\");\n }\n return {\n signingSecret: slack.signingSecret,\n dispatcherUrl: config.daemon.dispatcherUrl,\n ...(config.daemon.pairingToken ? { dispatcherToken: config.daemon.pairingToken } : {}),\n ...(slack.appId ? { appId: slack.appId } : {}),\n ...(slack.port ? { port: slack.port } : {})\n };\n}\n\nexport function slackSocketModeIngressConfigFromCliConfig(config: OpenTagCliConfig): SlackSocketModeIngressConfig {\n const slack = requireSlackConfig(config);\n if (!slack.appToken) {\n throw new Error(\"Slack Socket Mode requires platforms.slack.appToken.\");\n }\n return {\n appToken: slack.appToken,\n dispatcherUrl: config.daemon.dispatcherUrl,\n ...(config.daemon.pairingToken ? { dispatcherToken: config.daemon.pairingToken } : {}),\n ...(slack.appId ? { appId: slack.appId } : {})\n };\n}\n\nexport function githubIngressConfigFromCliConfig(config: OpenTagCliConfig): GitHubIngressConfig {\n const github = requireGitHubConfig(config);\n return {\n webhookSecret: github.webhookSecret,\n dispatcherUrl: config.daemon.dispatcherUrl,\n ...(config.daemon.pairingToken ? { dispatcherToken: config.daemon.pairingToken } : {}),\n port: github.port ?? DEFAULT_GITHUB_WEBHOOK_PORT,\n ...(github.webhookPath ? { webhookPath: github.webhookPath } : {})\n };\n}\n\nexport async function bootstrapLocalDispatcher(config: OpenTagCliConfig, client?: BootstrapClient): Promise<void> {\n const admin =\n client ??\n createDispatcherAdminClient({\n dispatcherUrl: config.daemon.dispatcherUrl,\n runnerId: config.daemon.runnerId,\n ...(config.daemon.pairingToken ? { pairingToken: config.daemon.pairingToken } : {})\n });\n\n await admin.registerRunner(config.daemon.runnerId);\n for (const repository of config.daemon.repositories) {\n await admin.bindRepository({\n provider: repository.provider,\n owner: repository.owner,\n repo: repository.repo,\n checkoutPath: repository.checkoutPath,\n ...(repository.defaultExecutor ? { defaultExecutor: repository.defaultExecutor } : {}),\n ...(repository.baseBranch ? { baseBranch: repository.baseBranch } : {}),\n ...(repository.pushRemote ? { pushRemote: repository.pushRemote } : {}),\n ...(repository.worktreeRoot ? { worktreeRoot: repository.worktreeRoot } : {}),\n ...(repository.keepWorktree ? { keepWorktree: repository.keepWorktree } : {})\n });\n }\n for (const binding of normalizeChannelBindings(config.daemon)) {\n await admin.bindChannel({\n provider: binding.provider,\n accountId: binding.accountId,\n conversationId: binding.conversationId,\n repoProvider: binding.repoProvider,\n owner: binding.owner,\n repo: binding.repo,\n ...(binding.metadata ? { metadata: binding.metadata } : {})\n });\n }\n}\n\nexport async function waitForDispatcher(input: {\n dispatcherUrl: string;\n fetchImpl?: typeof fetch;\n attempts?: number;\n delayMs?: number;\n timeoutMs?: number;\n}): Promise<void> {\n const attempts = input.attempts ?? 60;\n const delayMs = input.delayMs ?? 500;\n const timeoutMs = input.timeoutMs ?? 1_000;\n const healthUrl = `${input.dispatcherUrl.replace(/\\/$/, \"\")}/healthz`;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n const healthy = await probeDispatcherHealth({\n dispatcherUrl: input.dispatcherUrl,\n ...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}),\n timeoutMs\n });\n if (healthy) return;\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n throw new Error(`Dispatcher did not become healthy at ${healthUrl}.`);\n}\n\nfunction waitForAbort(signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n}\n\nexport function shouldRethrowAbortReason(input: { shutdownRequested: boolean; reason: unknown }): boolean {\n return !input.shutdownRequested && input.reason instanceof Error;\n}\n\nexport async function runStartCommand(options: StartCommandOptions): Promise<void> {\n const configPath = options.config ?? defaultConfigPath();\n const config = readCliConfig(configPath);\n\n ensurePrivateDirectory(config.state.directory);\n ensurePrivateDirectory(config.state.worktreeRoot);\n await assertStartPortsAvailable(config);\n\n const abortController = new AbortController();\n const dispatcher = startDispatcher(dispatcherRuntimeInputFromCliConfig(config));\n const ingresses: PlatformIngressHandle[] = [];\n let shutdownRequested = false;\n\n const onSignal = () => {\n shutdownRequested = true;\n abortController.abort();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n\n try {\n await waitForDispatcher({ dispatcherUrl: config.daemon.dispatcherUrl });\n await bootstrapLocalDispatcher(config);\n\n const daemonPromise = serveDaemon({\n ...createDaemonRuntimeInput(config.daemon),\n signal: abortController.signal\n });\n if (config.platforms.lark) {\n const handle = startLarkIngress(larkIngressConfigFromCliConfig(config));\n ingresses.push({ platform: \"lark\", handle });\n handle.startPromise.catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n abortController.abort(error);\n }\n });\n }\n if (config.platforms.slack) {\n if (slackModeFromCliConfig(config) === \"socket_mode\") {\n const handle = startSlackSocketModeIngress(slackSocketModeIngressConfigFromCliConfig(config));\n ingresses.push({ platform: \"slack\", mode: \"socket_mode\", handle });\n handle.startPromise.catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n abortController.abort(error);\n }\n });\n } else {\n const handle = startSlackIngress(slackIngressConfigFromCliConfig(config));\n ingresses.push({ platform: \"slack\", mode: \"events_api\", url: handle.url, handle });\n }\n }\n if (config.platforms.github) {\n const handle = startGitHubIngress(githubIngressConfigFromCliConfig(config));\n ingresses.push({ platform: \"github\", url: handle.url, webhookPath: handle.webhookPath, handle });\n }\n daemonPromise.catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n abortController.abort(error);\n }\n });\n\n console.log(\"OpenTag is running.\");\n console.log(`Config: ${configPath}`);\n console.log(`Dispatcher: ${config.daemon.dispatcherUrl}`);\n for (const ingress of ingresses) {\n if (ingress.platform === \"slack\") {\n const slack = config.platforms.slack!;\n if (ingress.mode === \"socket_mode\") {\n console.log(\"Slack: using Socket Mode\");\n console.log(`Slack channel binding: ${slack.teamId}/${slack.channelId}`);\n console.log(\"Before testing, invite the Slack app to that channel with /invite @your app name.\");\n } else {\n console.log(`Slack Events: ${ingress.url}/slack/events`);\n console.log(`Slack channel binding: ${slack.teamId}/${slack.channelId}`);\n console.log(\"Before testing, invite the Slack app to that channel with /invite @your app name.\");\n }\n } else if (ingress.platform === \"github\") {\n const github = config.platforms.github!;\n console.log(`GitHub local webhook: ${githubLocalWebhookUrl({ port: github.port, webhookPath: ingress.webhookPath })}`);\n console.log(`GitHub Payload URL: ${githubPublicWebhookUrlPlaceholder(ingress.webhookPath)}`);\n console.log(`GitHub settings: ${githubWebhooksSettingsUrl(github)}`);\n console.log(`Tunnel example: ngrok http ${github.port ?? DEFAULT_GITHUB_WEBHOOK_PORT}`);\n } else {\n console.log(\"Lark / Feishu: connected through Personal Agent long connection\");\n }\n }\n console.log(\"Press Ctrl-C to stop.\");\n\n await waitForAbort(abortController.signal);\n const reason = abortController.signal.reason;\n if (shouldRethrowAbortReason({ shutdownRequested, reason })) {\n throw reason;\n }\n } finally {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n abortController.abort();\n await Promise.allSettled([...ingresses].reverse().map((ingress) => ingress.handle.close()));\n await dispatcher.close();\n }\n}\n","export async function fetchWithTimeout(input: {\n url: string;\n fetchImpl?: typeof fetch;\n timeoutMs: number;\n}): Promise<Response> {\n const fetchImpl = input.fetchImpl ?? fetch;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), input.timeoutMs);\n try {\n return await fetchImpl(input.url, { signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function probeDispatcherHealth(input: {\n dispatcherUrl: string;\n fetchImpl?: typeof fetch;\n timeoutMs: number;\n}): Promise<boolean> {\n const healthUrl = `${input.dispatcherUrl.replace(/\\/$/, \"\")}/healthz`;\n try {\n const response = await fetchWithTimeout({\n url: healthUrl,\n ...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}),\n timeoutMs: input.timeoutMs\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n","import { defaultConfigPath, readCliConfig, type OpenTagCliConfig } from \"./config.js\";\nimport { probeDispatcherHealth } from \"./health.js\";\n\nexport type StatusCommandOptions = {\n config?: string;\n};\n\nexport type StatusSummary = {\n configPath: string;\n dispatcher: \"online\" | \"offline\";\n dispatcherUrl: string;\n runnerId: string;\n repositories: string[];\n platforms: string[];\n};\n\nexport async function getStatusSummary(input: {\n configPath?: string;\n fetchImpl?: typeof fetch;\n} = {}): Promise<StatusSummary> {\n const configPath = input.configPath ?? defaultConfigPath();\n const config = readCliConfig(configPath);\n return statusFromConfig({ config, configPath, ...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}) });\n}\n\nexport async function statusFromConfig(input: {\n config: OpenTagCliConfig;\n configPath: string;\n fetchImpl?: typeof fetch;\n healthTimeoutMs?: number;\n}): Promise<StatusSummary> {\n const dispatcher = (await probeDispatcherHealth({\n dispatcherUrl: input.config.daemon.dispatcherUrl,\n ...(input.fetchImpl ? { fetchImpl: input.fetchImpl } : {}),\n timeoutMs: input.healthTimeoutMs ?? 1_000\n }))\n ? \"online\"\n : \"offline\";\n\n return {\n configPath: input.configPath,\n dispatcher,\n dispatcherUrl: input.config.daemon.dispatcherUrl,\n runnerId: input.config.daemon.runnerId,\n repositories: input.config.daemon.repositories.map((repository) => {\n return `${repository.provider}:${repository.owner}/${repository.repo} -> ${repository.checkoutPath}`;\n }),\n platforms: Object.entries(input.config.platforms)\n .filter(([, value]) => value !== undefined)\n .map(([key]) => key)\n };\n}\n\nexport function formatStatus(summary: StatusSummary): string {\n return [\n `Config: ${summary.configPath}`,\n `Dispatcher: ${summary.dispatcher} (${summary.dispatcherUrl})`,\n `Runner: ${summary.runnerId}`,\n `Platforms: ${summary.platforms.length ? summary.platforms.join(\", \") : \"none\"}`,\n \"Project Targets:\",\n ...(summary.repositories.length ? summary.repositories.map((repository) => ` ${repository}`) : [\" none\"])\n ].join(\"\\n\");\n}\n\nexport async function runStatusCommand(options: StatusCommandOptions): Promise<void> {\n console.log(formatStatus(await getStatusSummary({ ...(options.config ? { configPath: options.config } : {}) })));\n}\n"],"mappings":"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","names":["join","existsSync","join","join","randomBytes","existsSync","existsSync","readFileSync","join","z","z","join","readFileSync","existsSync","existsSync","existsSync","modeSpecific","permissions","existsSync","randomBytes","resolve","existsSync"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-registration.d.ts","sourceRoot":"","sources":["../src/lark-registration.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function githubLocalWebhookUrl(input: {
|
|
2
|
+
port?: number | undefined;
|
|
3
|
+
webhookPath?: string | undefined;
|
|
4
|
+
}): string;
|
|
5
|
+
export declare function githubPublicWebhookUrlPlaceholder(webhookPath?: string): string;
|
|
6
|
+
export declare function githubWebhooksSettingsUrl(input: {
|
|
7
|
+
owner: string;
|
|
8
|
+
repo: string;
|
|
9
|
+
}): string;
|
|
10
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/platforms/github/display.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAEpH;AAED,wBAAgB,iCAAiC,CAAC,WAAW,SAAqB,GAAG,MAAM,CAE1F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAExF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LarkDomain } from "@opentag/lark";
|
|
2
|
+
import type { CliLanguage } from "../../catalogs/languages.js";
|
|
3
|
+
import type { SavedLarkCredentials } from "./saved-config.js";
|
|
4
|
+
type LarkPersonalAgentSummaryInput = {
|
|
5
|
+
appId: string;
|
|
6
|
+
domain: LarkDomain;
|
|
7
|
+
botOpenId?: string;
|
|
8
|
+
source?: SavedLarkCredentials["source"];
|
|
9
|
+
};
|
|
10
|
+
export declare function formatLarkPersonalAgentSummary(input: LarkPersonalAgentSummaryInput, language: CliLanguage): string;
|
|
11
|
+
export declare function formatSavedLarkCredentialsHint(credentials: SavedLarkCredentials, language: CliLanguage): string;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/platforms/lark/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,KAAK,6BAA6B,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;CACzC,CAAC;AAkBF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAYlH;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAE/G"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { registerLarkPersonalAgent, type LarkDomain, type RegisteredLarkPersonalAgent } from "@opentag/lark";
|
|
2
|
+
export type ScanLarkPersonalAgentDependencies = {
|
|
3
|
+
output?: Pick<NodeJS.WriteStream, "write">;
|
|
4
|
+
register?: typeof registerLarkPersonalAgent;
|
|
5
|
+
showQrCode?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function scanLarkPersonalAgent(input: {
|
|
8
|
+
domain: LarkDomain;
|
|
9
|
+
}, dependencies?: ScanLarkPersonalAgentDependencies): Promise<RegisteredLarkPersonalAgent>;
|
|
10
|
+
//# sourceMappingURL=registration-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-ui.d.ts","sourceRoot":"","sources":["../../../src/platforms/lark/registration-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,KAAK,UAAU,EAAE,KAAK,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAE7G,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,yBAAyB,CAAC;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,KAAK,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,EAC7B,YAAY,GAAE,iCAAsC,GACnD,OAAO,CAAC,2BAA2B,CAAC,CA8CtC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LarkDomain } from "@opentag/lark";
|
|
2
|
+
import { type OpenTagCliConfig } from "../../config.js";
|
|
3
|
+
export type SavedLarkCredentials = {
|
|
4
|
+
appId: string;
|
|
5
|
+
appSecret: string;
|
|
6
|
+
domain: LarkDomain;
|
|
7
|
+
botOpenId?: string;
|
|
8
|
+
source: "opentag_config" | "legacy_start_lark";
|
|
9
|
+
path?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function savedLarkCredentialsFromCliConfig(config: OpenTagCliConfig): SavedLarkCredentials | undefined;
|
|
12
|
+
export declare function legacyLarkConfigPath(projectPath: string): string;
|
|
13
|
+
export declare function readLegacyLarkCredentials(projectPath: string): SavedLarkCredentials | undefined;
|
|
14
|
+
//# sourceMappingURL=saved-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saved-config.d.ts","sourceRoot":"","sources":["../../../src/platforms/lark/saved-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAWjF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,SAAS,CAU5G;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAUD,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAkB/F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/platforms/ports.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM5E"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OpenTagCliConfig, type PathEnvironment } from "../config.js";
|
|
2
|
+
import type { OpenTagSetupInput } from "./types.js";
|
|
3
|
+
export declare function createSetupConfig(input: OpenTagSetupInput, env?: PathEnvironment): OpenTagCliConfig;
|
|
4
|
+
//# sourceMappingURL=builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../src/setup/builders.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,GAAE,eAA6B,GAAG,gBAAgB,CA+IhH"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type OpenTagCliConfig } from "../config.js";
|
|
2
|
+
import type { SetupDefaults } from "./types.js";
|
|
3
|
+
export declare function setupDefaultsFromConfig(config: OpenTagCliConfig): SetupDefaults;
|
|
4
|
+
export declare function loadSetupDefaults(path?: string): SetupDefaults;
|
|
5
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/setup/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAoC,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAY/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAiC/E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,SAAsB,GAAG,aAAa,CAK3E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LarkDomain, RegisteredLarkPersonalAgent } from "@opentag/lark";
|
|
2
|
+
import type { PromptAdapter } from "../ui/prompts.js";
|
|
3
|
+
import type { OpenTagSetupInput, SetupDefaults } from "./types.js";
|
|
4
|
+
export type SetupCommandOptions = {
|
|
5
|
+
platform?: string;
|
|
6
|
+
config?: string;
|
|
7
|
+
project?: string;
|
|
8
|
+
executor?: string;
|
|
9
|
+
language?: string;
|
|
10
|
+
larkSetup?: string;
|
|
11
|
+
larkAppId?: string;
|
|
12
|
+
larkAppSecret?: string;
|
|
13
|
+
larkDomain?: string;
|
|
14
|
+
larkBotOpenId?: string;
|
|
15
|
+
slackMode?: string;
|
|
16
|
+
slackAppToken?: string;
|
|
17
|
+
slackSigningSecret?: string;
|
|
18
|
+
slackBotToken?: string;
|
|
19
|
+
slackAppId?: string;
|
|
20
|
+
slackTeamId?: string;
|
|
21
|
+
slackChannelId?: string;
|
|
22
|
+
slackPort?: string;
|
|
23
|
+
githubToken?: string;
|
|
24
|
+
githubWebhookSecret?: string;
|
|
25
|
+
githubRepository?: string;
|
|
26
|
+
githubWebhookPath?: string;
|
|
27
|
+
githubPort?: string;
|
|
28
|
+
githubAutoCreatePr?: boolean;
|
|
29
|
+
binding?: string;
|
|
30
|
+
force?: boolean;
|
|
31
|
+
yes?: boolean;
|
|
32
|
+
start?: boolean;
|
|
33
|
+
};
|
|
34
|
+
export type SetupFlowDependencies = {
|
|
35
|
+
cwd?: string;
|
|
36
|
+
env?: NodeJS.ProcessEnv;
|
|
37
|
+
prompts: PromptAdapter;
|
|
38
|
+
scanLarkPersonalAgent(input: {
|
|
39
|
+
domain: LarkDomain;
|
|
40
|
+
}): Promise<RegisteredLarkPersonalAgent>;
|
|
41
|
+
defaults?: SetupDefaults;
|
|
42
|
+
};
|
|
43
|
+
export declare function collectSetupInput(options: SetupCommandOptions, configPath: string, dependencies: SetupFlowDependencies): Promise<OpenTagSetupInput>;
|
|
44
|
+
//# sourceMappingURL=flow.d.ts.map
|