twinny 0.0.0-dev.260525150705

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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +264 -0
  3. package/README.zh-CN.md +252 -0
  4. package/configs/banner.png +0 -0
  5. package/configs/logo.png +0 -0
  6. package/dist/app/caffeinate.d.ts +28 -0
  7. package/dist/app/caffeinate.js +96 -0
  8. package/dist/app/caffeinate.js.map +1 -0
  9. package/dist/app/daemon.d.ts +1 -0
  10. package/dist/app/daemon.js +44 -0
  11. package/dist/app/daemon.js.map +1 -0
  12. package/dist/app/lark-assets.d.ts +25 -0
  13. package/dist/app/lark-assets.js +108 -0
  14. package/dist/app/lark-assets.js.map +1 -0
  15. package/dist/app/startup-probe.d.ts +17 -0
  16. package/dist/app/startup-probe.js +90 -0
  17. package/dist/app/startup-probe.js.map +1 -0
  18. package/dist/app/wiring.d.ts +122 -0
  19. package/dist/app/wiring.js +694 -0
  20. package/dist/app/wiring.js.map +1 -0
  21. package/dist/cli/commands.d.ts +1 -0
  22. package/dist/cli/commands.js +47 -0
  23. package/dist/cli/commands.js.map +1 -0
  24. package/dist/cli/install-wizard.d.ts +41 -0
  25. package/dist/cli/install-wizard.js +629 -0
  26. package/dist/cli/install-wizard.js.map +1 -0
  27. package/dist/codex/appserver.d.ts +109 -0
  28. package/dist/codex/appserver.js +308 -0
  29. package/dist/codex/appserver.js.map +1 -0
  30. package/dist/codex/goal.d.ts +64 -0
  31. package/dist/codex/goal.js +433 -0
  32. package/dist/codex/goal.js.map +1 -0
  33. package/dist/codex/index.d.ts +6 -0
  34. package/dist/codex/index.js +7 -0
  35. package/dist/codex/index.js.map +1 -0
  36. package/dist/codex/protocol.d.ts +95 -0
  37. package/dist/codex/protocol.js +205 -0
  38. package/dist/codex/protocol.js.map +1 -0
  39. package/dist/codex/thread-name.d.ts +3 -0
  40. package/dist/codex/thread-name.js +27 -0
  41. package/dist/codex/thread-name.js.map +1 -0
  42. package/dist/codex/thread.d.ts +76 -0
  43. package/dist/codex/thread.js +80 -0
  44. package/dist/codex/thread.js.map +1 -0
  45. package/dist/codex/turn.d.ts +166 -0
  46. package/dist/codex/turn.js +746 -0
  47. package/dist/codex/turn.js.map +1 -0
  48. package/dist/config/bootstrap.d.ts +14 -0
  49. package/dist/config/bootstrap.js +56 -0
  50. package/dist/config/bootstrap.js.map +1 -0
  51. package/dist/config/index.d.ts +4 -0
  52. package/dist/config/index.js +5 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/config/loader.d.ts +49 -0
  55. package/dist/config/loader.js +467 -0
  56. package/dist/config/loader.js.map +1 -0
  57. package/dist/config/paths.d.ts +11 -0
  58. package/dist/config/paths.js +43 -0
  59. package/dist/config/paths.js.map +1 -0
  60. package/dist/config/secrets.d.ts +33 -0
  61. package/dist/config/secrets.js +85 -0
  62. package/dist/config/secrets.js.map +1 -0
  63. package/dist/conversation/manager.d.ts +701 -0
  64. package/dist/conversation/manager.js +7673 -0
  65. package/dist/conversation/manager.js.map +1 -0
  66. package/dist/conversation/queue.d.ts +8 -0
  67. package/dist/conversation/queue.js +28 -0
  68. package/dist/conversation/queue.js.map +1 -0
  69. package/dist/conversation/routing.d.ts +11 -0
  70. package/dist/conversation/routing.js +55 -0
  71. package/dist/conversation/routing.js.map +1 -0
  72. package/dist/errors.d.ts +6 -0
  73. package/dist/errors.js +17 -0
  74. package/dist/errors.js.map +1 -0
  75. package/dist/index.d.ts +3 -0
  76. package/dist/index.js +4 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/lark/auth.d.ts +41 -0
  79. package/dist/lark/auth.js +132 -0
  80. package/dist/lark/auth.js.map +1 -0
  81. package/dist/lark/browser-auth.d.ts +68 -0
  82. package/dist/lark/browser-auth.js +258 -0
  83. package/dist/lark/browser-auth.js.map +1 -0
  84. package/dist/lark/cards.d.ts +140 -0
  85. package/dist/lark/cards.js +1150 -0
  86. package/dist/lark/cards.js.map +1 -0
  87. package/dist/lark/contact.d.ts +41 -0
  88. package/dist/lark/contact.js +122 -0
  89. package/dist/lark/contact.js.map +1 -0
  90. package/dist/lark/events.d.ts +65 -0
  91. package/dist/lark/events.js +218 -0
  92. package/dist/lark/events.js.map +1 -0
  93. package/dist/lark/files.d.ts +36 -0
  94. package/dist/lark/files.js +191 -0
  95. package/dist/lark/files.js.map +1 -0
  96. package/dist/lark/filters.d.ts +73 -0
  97. package/dist/lark/filters.js +678 -0
  98. package/dist/lark/filters.js.map +1 -0
  99. package/dist/lark/index.d.ts +10 -0
  100. package/dist/lark/index.js +11 -0
  101. package/dist/lark/index.js.map +1 -0
  102. package/dist/lark/messages.d.ts +87 -0
  103. package/dist/lark/messages.js +428 -0
  104. package/dist/lark/messages.js.map +1 -0
  105. package/dist/lark/openapi.d.ts +58 -0
  106. package/dist/lark/openapi.js +206 -0
  107. package/dist/lark/openapi.js.map +1 -0
  108. package/dist/lark/redactor.d.ts +5 -0
  109. package/dist/lark/redactor.js +68 -0
  110. package/dist/lark/redactor.js.map +1 -0
  111. package/dist/lark/types.d.ts +49 -0
  112. package/dist/lark/types.js +18 -0
  113. package/dist/lark/types.js.map +1 -0
  114. package/dist/launchd/install.d.ts +22 -0
  115. package/dist/launchd/install.js +114 -0
  116. package/dist/launchd/install.js.map +1 -0
  117. package/dist/launchd/plist.d.ts +10 -0
  118. package/dist/launchd/plist.js +61 -0
  119. package/dist/launchd/plist.js.map +1 -0
  120. package/dist/lock/index.d.ts +20 -0
  121. package/dist/lock/index.js +74 -0
  122. package/dist/lock/index.js.map +1 -0
  123. package/dist/main.d.ts +2 -0
  124. package/dist/main.js +11 -0
  125. package/dist/main.js.map +1 -0
  126. package/dist/markdown.d.ts +12 -0
  127. package/dist/markdown.js +149 -0
  128. package/dist/markdown.js.map +1 -0
  129. package/dist/observability/health.d.ts +25 -0
  130. package/dist/observability/health.js +187 -0
  131. package/dist/observability/health.js.map +1 -0
  132. package/dist/observability/logs.d.ts +10 -0
  133. package/dist/observability/logs.js +34 -0
  134. package/dist/observability/logs.js.map +1 -0
  135. package/dist/observability/system-notifications.d.ts +25 -0
  136. package/dist/observability/system-notifications.js +33 -0
  137. package/dist/observability/system-notifications.js.map +1 -0
  138. package/dist/profiles/guest.d.ts +19 -0
  139. package/dist/profiles/guest.js +241 -0
  140. package/dist/profiles/guest.js.map +1 -0
  141. package/dist/profiles/index.d.ts +5 -0
  142. package/dist/profiles/index.js +14 -0
  143. package/dist/profiles/index.js.map +1 -0
  144. package/dist/profiles/owner.d.ts +1 -0
  145. package/dist/profiles/owner.js +6 -0
  146. package/dist/profiles/owner.js.map +1 -0
  147. package/dist/store/db.d.ts +10 -0
  148. package/dist/store/db.js +29 -0
  149. package/dist/store/db.js.map +1 -0
  150. package/dist/store/index.d.ts +3 -0
  151. package/dist/store/index.js +4 -0
  152. package/dist/store/index.js.map +1 -0
  153. package/dist/store/migrations.d.ts +13 -0
  154. package/dist/store/migrations.js +79 -0
  155. package/dist/store/migrations.js.map +1 -0
  156. package/dist/store/repositories.d.ts +227 -0
  157. package/dist/store/repositories.js +1384 -0
  158. package/dist/store/repositories.js.map +1 -0
  159. package/dist/telemetry/client.d.ts +60 -0
  160. package/dist/telemetry/client.js +204 -0
  161. package/dist/telemetry/client.js.map +1 -0
  162. package/dist/telemetry/hash.d.ts +1 -0
  163. package/dist/telemetry/hash.js +8 -0
  164. package/dist/telemetry/hash.js.map +1 -0
  165. package/dist/telemetry/index.d.ts +4 -0
  166. package/dist/telemetry/index.js +5 -0
  167. package/dist/telemetry/index.js.map +1 -0
  168. package/dist/telemetry/posthog.d.ts +27 -0
  169. package/dist/telemetry/posthog.js +45 -0
  170. package/dist/telemetry/posthog.js.map +1 -0
  171. package/dist/telemetry/reporter.d.ts +13 -0
  172. package/dist/telemetry/reporter.js +29 -0
  173. package/dist/telemetry/reporter.js.map +1 -0
  174. package/dist/types.d.ts +330 -0
  175. package/dist/types.js +9 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/version.d.ts +1 -0
  178. package/dist/version.js +1 -0
  179. package/dist/version.js.map +1 -0
  180. package/dist/version.json +3 -0
  181. package/dist/workspace/index.d.ts +2 -0
  182. package/dist/workspace/index.js +3 -0
  183. package/dist/workspace/index.js.map +1 -0
  184. package/dist/workspace/manager.d.ts +14 -0
  185. package/dist/workspace/manager.js +69 -0
  186. package/dist/workspace/manager.js.map +1 -0
  187. package/dist/workspace/slug.d.ts +8 -0
  188. package/dist/workspace/slug.js +59 -0
  189. package/dist/workspace/slug.js.map +1 -0
  190. package/migrations/0001_initial.sql +102 -0
  191. package/package.json +85 -0
@@ -0,0 +1,629 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import * as p from "@clack/prompts";
6
+ import { execa } from "execa";
7
+ import { parse } from "smol-toml";
8
+ import { bootstrapTwinnyHome, createRuntimePaths, createTwinnyConfig, expandHomePath, generateTwinnyHomeRandom, resolveBundledBannerPath, resolveBundledLogoPath, resolveTwinnyHome, SecurityCliSecretStore } from "../config/index.js";
9
+ import { provisionLarkAssetImageKeys } from "../app/lark-assets.js";
10
+ import { installLaunchAgent, startLaunchAgent } from "../launchd/install.js";
11
+ import { createTwinnyTelemetryClient } from "../telemetry/index.js";
12
+ import { buildLarkVerificationUrl, getLarkBrowserUserInfo, LarkFileDownloader, LarkOpenApiClient, LarkUserDirectory, pollLarkAppRegistration, pollLarkDeviceToken, requestLarkAppRegistration, requestLarkDeviceAuthorization, resolveLarkEndpoints, TenantAccessTokenManager } from "../lark/index.js";
13
+ import { TWINNY_VERSION } from "../version.js";
14
+ const minimumCodexVersion = "0.130.0";
15
+ export const installWizardLarkBrand = "feishu";
16
+ const sensitiveEnvPattern = /(?:SECRET|TOKEN|PASSWORD|PASS|PWD|API_KEY|ACCESS_KEY|PRIVATE_KEY|COOKIE|SESSION|CREDENTIAL|AUTH)/i;
17
+ const terminalEnvKeys = new Set([
18
+ "_",
19
+ "COLORTERM",
20
+ "OLDPWD",
21
+ "PWD",
22
+ "SHLVL",
23
+ "SSH_AUTH_SOCK",
24
+ "TERM",
25
+ "TERM_PROGRAM",
26
+ "TERM_PROGRAM_VERSION",
27
+ "TERM_SESSION_ID",
28
+ "TMPDIR",
29
+ "TTY"
30
+ ]);
31
+ export async function runInstallWizard(options = {}) {
32
+ const startedAt = Date.now();
33
+ const env = options.env ?? process.env;
34
+ const terminal = installTerminalSnapshot(options);
35
+ let telemetry = options.telemetry;
36
+ let config;
37
+ let codex;
38
+ let botSetup;
39
+ let ownerSetup;
40
+ let launchEnvironment;
41
+ let codexDefaults;
42
+ let finalizeResult;
43
+ let startedAfterInstall = false;
44
+ try {
45
+ if (!terminal.stdinIsTty || !terminal.stdoutIsTty) {
46
+ throw new Error("Twinny install wizard requires an interactive terminal. Run `twinny install` from a terminal.");
47
+ }
48
+ p.intro("Twinny install");
49
+ const home = resolveInstallHome(env);
50
+ await assertInstallHomeIsEmpty(home);
51
+ const homeRandom = generateTwinnyHomeRandom();
52
+ codex = await detectCodexBinary(env);
53
+ p.log.success(`Codex ${codex.version} (${codex.binary})`);
54
+ botSetup = await promptBotCredentials();
55
+ const bot = botSetup.credentials;
56
+ ownerSetup = await promptOwnerIdentity(bot);
57
+ const owner = ownerSetup.identity;
58
+ launchEnvironment = await promptLaunchEnvironment(home, env);
59
+ codexDefaults = await readCodexDefaults();
60
+ p.log.info(`Host profile defaults: ${codexDefaults.model} / ${codexDefaults.effort}`);
61
+ config = createTwinnyConfig({
62
+ home,
63
+ homeRandom,
64
+ codex: { binary: codex.binary },
65
+ auth: {
66
+ larkAppId: bot.appId,
67
+ larkBrand: bot.brand,
68
+ ownerOpenId: owner.openId,
69
+ displayName: owner.displayName
70
+ },
71
+ telemetry: installTelemetryConfigFromEnv(env),
72
+ profiles: {
73
+ host: {
74
+ defaultModel: codexDefaults.model,
75
+ defaultEffort: codexDefaults.effort
76
+ },
77
+ guest: {}
78
+ }
79
+ });
80
+ telemetry ??= createTwinnyTelemetryClient(config, { codexVersion: () => codex?.version });
81
+ finalizeResult = await finalizeInstall({ config, appSecret: bot.appSecret, environment: launchEnvironment.environment });
82
+ const shouldStart = await cancelable(p.confirm({
83
+ message: "安装完成。现在启动 Twinny?",
84
+ initialValue: true
85
+ }));
86
+ startedAfterInstall = shouldStart;
87
+ if (shouldStart) {
88
+ const s = p.spinner();
89
+ s.start("启动 Twinny");
90
+ await startLaunchAgent({ home });
91
+ s.stop("Twinny 已启动");
92
+ }
93
+ else {
94
+ p.log.info(`稍后可执行:TWINNY_HOME=${shellQuote(home)} twinny start`);
95
+ }
96
+ telemetry.capture("twinny_install", {
97
+ install_status: "completed",
98
+ install_duration_ms: Date.now() - startedAt,
99
+ stdin_is_tty: terminal.stdinIsTty,
100
+ stdout_is_tty: terminal.stdoutIsTty,
101
+ tty_mode: terminal.ttyMode,
102
+ imported_env_key_count: launchEnvironment.stats.importedEnvKeyCount,
103
+ candidate_env_key_count: launchEnvironment.stats.candidateEnvKeyCount,
104
+ default_included_env_key_count: launchEnvironment.stats.defaultIncludedEnvKeyCount,
105
+ started_after_install: startedAfterInstall,
106
+ home_created: finalizeResult.homeCreated,
107
+ wrote_home_random: finalizeResult.wroteHomeRandom,
108
+ wrote_config: finalizeResult.wroteConfig,
109
+ wrote_auth: finalizeResult.wroteAuth,
110
+ launch_agent_installed: finalizeResult.launchAgentInstalled,
111
+ asset_upload_attempted: finalizeResult.assetUploadAttempted,
112
+ codex_binary_id: telemetry.hashId("codex_binary", codex.binary),
113
+ default_model: codexDefaults.model,
114
+ default_effort: codexDefaults.effort,
115
+ bot_setup_method: botSetup.method,
116
+ owner_setup_method: ownerSetup.method
117
+ }, {
118
+ insertId: `twinny_install:${telemetry.hashId("install_event", config.homeIdentity.random)}`,
119
+ codexVersion: codex.version
120
+ });
121
+ p.outro("Twinny 安装完成");
122
+ }
123
+ catch (error) {
124
+ telemetry?.captureError(error, {
125
+ errorType: "install",
126
+ errorSite: "cli.runInstallWizard",
127
+ operation: "install",
128
+ fatal: true,
129
+ codexVersion: codex?.version,
130
+ properties: {
131
+ install_duration_ms: Date.now() - startedAt,
132
+ stdin_is_tty: terminal.stdinIsTty,
133
+ stdout_is_tty: terminal.stdoutIsTty,
134
+ tty_mode: terminal.ttyMode,
135
+ imported_env_key_count: launchEnvironment?.stats.importedEnvKeyCount ?? null,
136
+ candidate_env_key_count: launchEnvironment?.stats.candidateEnvKeyCount ?? null,
137
+ default_included_env_key_count: launchEnvironment?.stats.defaultIncludedEnvKeyCount ?? null,
138
+ started_after_install: startedAfterInstall,
139
+ home_created: finalizeResult?.homeCreated ?? false,
140
+ wrote_home_random: finalizeResult?.wroteHomeRandom ?? false,
141
+ wrote_config: finalizeResult?.wroteConfig ?? false,
142
+ wrote_auth: finalizeResult?.wroteAuth ?? false,
143
+ launch_agent_installed: finalizeResult?.launchAgentInstalled ?? false,
144
+ asset_upload_attempted: finalizeResult?.assetUploadAttempted ?? false,
145
+ codex_binary_id: codex ? telemetry.hashId("codex_binary", codex.binary) : null,
146
+ default_model: codexDefaults?.model ?? null,
147
+ default_effort: codexDefaults?.effort ?? null,
148
+ bot_setup_method: botSetup?.method ?? null,
149
+ owner_setup_method: ownerSetup?.method ?? null
150
+ }
151
+ });
152
+ throw error;
153
+ }
154
+ finally {
155
+ await telemetry?.shutdown?.();
156
+ }
157
+ }
158
+ export function resolveInstallHome(env = process.env) {
159
+ return resolveTwinnyHome({ env });
160
+ }
161
+ function installTerminalSnapshot(options) {
162
+ const stdinIsTty = options.stdinIsTTY ?? Boolean(process.stdin.isTTY);
163
+ const stdoutIsTty = options.stdoutIsTTY ?? Boolean(process.stdout.isTTY);
164
+ return {
165
+ stdinIsTty,
166
+ stdoutIsTty,
167
+ ttyMode: stdinIsTty && stdoutIsTty ? "tty" : "non_tty"
168
+ };
169
+ }
170
+ function installTelemetryConfigFromEnv(env) {
171
+ const posthogProjectToken = optionalEnv(env.TWINNY_TELEMETRY_POSTHOG_PROJECT_TOKEN) ??
172
+ optionalEnv(env.TWINNY_POSTHOG_PROJECT_TOKEN);
173
+ const posthogHost = optionalEnv(env.TWINNY_TELEMETRY_POSTHOG_HOST) ?? optionalEnv(env.TWINNY_POSTHOG_HOST);
174
+ const enabled = booleanEnv(env.TWINNY_TELEMETRY_ENABLED);
175
+ if (posthogProjectToken === undefined && posthogHost === undefined && enabled === undefined) {
176
+ return undefined;
177
+ }
178
+ return {
179
+ ...(enabled !== undefined ? { enabled } : {}),
180
+ ...(posthogProjectToken ? { posthogProjectToken } : {}),
181
+ ...(posthogHost ? { posthogHost } : {})
182
+ };
183
+ }
184
+ function optionalEnv(value) {
185
+ const trimmed = value?.trim();
186
+ return trimmed ? trimmed : undefined;
187
+ }
188
+ function booleanEnv(value) {
189
+ const normalized = optionalEnv(value)?.toLowerCase();
190
+ if (normalized === undefined) {
191
+ return undefined;
192
+ }
193
+ if (["1", "true", "yes", "on"].includes(normalized)) {
194
+ return true;
195
+ }
196
+ if (["0", "false", "no", "off"].includes(normalized)) {
197
+ return false;
198
+ }
199
+ return undefined;
200
+ }
201
+ export async function assertInstallHomeIsEmpty(home) {
202
+ let stat;
203
+ try {
204
+ stat = await fs.stat(home);
205
+ }
206
+ catch (error) {
207
+ if (isNodeError(error, "ENOENT")) {
208
+ return;
209
+ }
210
+ throw error;
211
+ }
212
+ if (!stat.isDirectory()) {
213
+ throw new Error(`TWINNY_HOME must be a directory: ${home}`);
214
+ }
215
+ const entries = await fs.readdir(home);
216
+ if (entries.length > 0) {
217
+ throw new Error(`TWINNY_HOME is not empty: ${home}. Choose an empty directory and retry with TWINNY_HOME=/path twinny install.`);
218
+ }
219
+ }
220
+ export async function detectCodexBinary(env = process.env) {
221
+ const binary = env.CODEX_BINARY?.trim()
222
+ ? path.resolve(expandHomePath(env.CODEX_BINARY.trim()))
223
+ : (await execa("which", ["codex"])).stdout.trim().split("\n")[0] ?? "";
224
+ if (!binary) {
225
+ throw new Error(`codex was not found in PATH. Install Codex ${minimumCodexVersion}+ or set CODEX_BINARY.`);
226
+ }
227
+ const result = await execa(binary, ["--version"], { reject: false });
228
+ if (result.exitCode !== 0) {
229
+ throw new Error(`failed to run ${binary} --version: ${result.stderr || `exit ${result.exitCode}`}`);
230
+ }
231
+ const version = parseCodexVersion(result.stdout.trim());
232
+ if (!version || compareSemver(version, minimumCodexVersion) < 0) {
233
+ throw new Error(`Codex ${minimumCodexVersion}+ is required. Found: ${result.stdout.trim() || "unknown"}. Install a newer Codex or set CODEX_BINARY.`);
234
+ }
235
+ return { binary, version };
236
+ }
237
+ export function parseCodexVersion(output) {
238
+ return /(\d+\.\d+\.\d+(?:[-+][A-Za-z0-9._-]+)?)/.exec(output)?.[1];
239
+ }
240
+ export function compareSemver(left, right) {
241
+ const leftParts = left.replace(/[-+].*$/, "").split(".").map((part) => Number(part));
242
+ const rightParts = right.replace(/[-+].*$/, "").split(".").map((part) => Number(part));
243
+ for (let index = 0; index < 3; index += 1) {
244
+ const diff = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);
245
+ if (diff !== 0) {
246
+ return diff;
247
+ }
248
+ }
249
+ return 0;
250
+ }
251
+ export function buildEnvSelection(env) {
252
+ const keys = Object.keys(env)
253
+ .filter((key) => !key.startsWith("TWINNY_") && env[key] !== undefined)
254
+ .sort((left, right) => left.localeCompare(right));
255
+ return {
256
+ options: keys.map((key) => ({
257
+ value: key,
258
+ label: key,
259
+ hint: defaultIncludeEnvKey(key) ? undefined : "默认排除"
260
+ })),
261
+ initialValues: keys.filter(defaultIncludeEnvKey)
262
+ };
263
+ }
264
+ export function buildLaunchEnvironmentStats(env, environment) {
265
+ const selection = buildEnvSelection(env);
266
+ return {
267
+ importedEnvKeyCount: Object.keys(environment).filter((key) => environment[key] !== undefined).length,
268
+ candidateEnvKeyCount: selection.options.length,
269
+ defaultIncludedEnvKeyCount: selection.initialValues.length
270
+ };
271
+ }
272
+ export function defaultIncludeEnvKey(key) {
273
+ return !sensitiveEnvPattern.test(key) && !terminalEnvKeys.has(key);
274
+ }
275
+ export async function readCodexDefaults(homeDir = os.homedir()) {
276
+ const fallback = { model: "gpt-5.5", effort: "medium" };
277
+ const configPath = path.join(homeDir, ".codex", "config.toml");
278
+ let raw;
279
+ try {
280
+ raw = await fs.readFile(configPath, "utf8");
281
+ }
282
+ catch (error) {
283
+ if (isNodeError(error, "ENOENT")) {
284
+ return fallback;
285
+ }
286
+ throw error;
287
+ }
288
+ const parsed = parse(raw);
289
+ return {
290
+ model: stringField(parsed, "model") ?? fallback.model,
291
+ effort: stringField(parsed, "model_reasoning_effort") ?? fallback.effort
292
+ };
293
+ }
294
+ async function promptBotCredentials() {
295
+ for (;;) {
296
+ const choice = await cancelable(p.select({
297
+ message: "使用什么飞书机器人?",
298
+ options: [
299
+ { value: "auto", label: "一键创建/选择", hint: "推荐" },
300
+ { value: "manual", label: "手动输入 AppID / AppSecret" }
301
+ ],
302
+ initialValue: "auto"
303
+ }));
304
+ try {
305
+ const credentials = choice === "auto" ? await createBotWithBrowser() : await promptManualBotCredentials();
306
+ await validateBotCredentials(credentials);
307
+ return { credentials, method: choice };
308
+ }
309
+ catch (error) {
310
+ p.log.error(error instanceof Error ? error.message : String(error));
311
+ }
312
+ }
313
+ }
314
+ async function createBotWithBrowser() {
315
+ const begin = await requestLarkAppRegistration(installWizardLarkBrand);
316
+ const verificationUrl = buildLarkVerificationUrl(begin.verificationUriComplete, TWINNY_VERSION);
317
+ p.note(verificationUrl, "在浏览器中完成机器人创建/选择");
318
+ await openBrowserBestEffort(verificationUrl);
319
+ const result = await pollWithEscape("等待浏览器内操作完成,按 Esc 返回上一步", (signal) => pollLarkAppRegistration(installWizardLarkBrand, begin.deviceCode, {
320
+ interval: begin.interval,
321
+ expiresIn: begin.expiresIn,
322
+ signal
323
+ }));
324
+ if (!result) {
325
+ throw new Error("已返回机器人选择");
326
+ }
327
+ if (result.brand !== installWizardLarkBrand) {
328
+ throw new Error("Twinny install wizard currently only supports Feishu apps.");
329
+ }
330
+ return {
331
+ appId: result.appId,
332
+ appSecret: result.appSecret,
333
+ brand: installWizardLarkBrand
334
+ };
335
+ }
336
+ async function promptManualBotCredentials() {
337
+ const appId = await cancelable(p.text({
338
+ message: "App ID",
339
+ validate: (value) => (value?.trim() ? undefined : "App ID is required")
340
+ }));
341
+ const appSecret = await cancelable(p.password({
342
+ message: "App Secret",
343
+ validate: (value) => (value?.trim() ? undefined : "App Secret is required")
344
+ }));
345
+ return {
346
+ appId: appId.trim(),
347
+ appSecret: appSecret.trim(),
348
+ brand: installWizardLarkBrand
349
+ };
350
+ }
351
+ async function validateBotCredentials(credentials) {
352
+ const s = p.spinner();
353
+ s.start("校验机器人凭据");
354
+ try {
355
+ const tokenManager = createTenantAccessTokenManager(credentials);
356
+ await tokenManager.getTenantAccessToken({ forceRefresh: true });
357
+ s.stop("机器人凭据可用");
358
+ }
359
+ catch (error) {
360
+ s.error("机器人凭据校验失败");
361
+ throw error;
362
+ }
363
+ }
364
+ async function promptOwnerIdentity(bot) {
365
+ for (;;) {
366
+ const choice = await cancelable(p.select({
367
+ message: "获取 owner 信息",
368
+ options: [
369
+ { value: "browser", label: "通过浏览器授权", hint: "推荐" },
370
+ { value: "manual", label: "手动设置" }
371
+ ],
372
+ initialValue: "browser"
373
+ }));
374
+ try {
375
+ const identity = choice === "browser" ? await authorizeOwnerInBrowser(bot) : await promptManualOwner(bot);
376
+ return { identity, method: choice };
377
+ }
378
+ catch (error) {
379
+ p.log.error(error instanceof Error ? error.message : String(error));
380
+ }
381
+ }
382
+ }
383
+ async function authorizeOwnerInBrowser(bot) {
384
+ const authorization = await requestLarkDeviceAuthorization({
385
+ appId: bot.appId,
386
+ appSecret: bot.appSecret,
387
+ brand: bot.brand
388
+ });
389
+ p.note(authorization.verificationUriComplete, "在浏览器中完成 owner 授权");
390
+ await openBrowserBestEffort(authorization.verificationUriComplete);
391
+ const token = await pollWithEscape("等待 owner 授权完成,按 Esc 返回上一步", (signal) => pollLarkDeviceToken({
392
+ appId: bot.appId,
393
+ appSecret: bot.appSecret,
394
+ brand: bot.brand,
395
+ deviceCode: authorization.deviceCode,
396
+ interval: authorization.interval,
397
+ expiresIn: authorization.expiresIn
398
+ }, { signal }));
399
+ if (!token) {
400
+ throw new Error("已返回 owner 选择");
401
+ }
402
+ const user = await getLarkBrowserUserInfo({ accessToken: token.accessToken, brand: bot.brand });
403
+ return { openId: user.openId, displayName: user.name };
404
+ }
405
+ async function promptManualOwner(bot) {
406
+ const openId = await cancelable(p.text({
407
+ message: "Owner open_id",
408
+ validate: (value) => (value?.trim() ? undefined : "open_id is required")
409
+ }));
410
+ const discoveredName = await lookupOwnerName(bot, openId.trim()).catch(() => undefined);
411
+ if (discoveredName) {
412
+ p.log.success(`Owner: ${discoveredName}`);
413
+ return { openId: openId.trim(), displayName: discoveredName };
414
+ }
415
+ const displayName = await cancelable(p.text({
416
+ message: "无法通过 bot 查询到 owner 名称,请手动输入 display name",
417
+ validate: (value) => (value?.trim() ? undefined : "display name is required")
418
+ }));
419
+ return { openId: openId.trim(), displayName: displayName.trim() };
420
+ }
421
+ async function lookupOwnerName(bot, openId) {
422
+ const openApiClient = createOpenApiClient(bot);
423
+ return new LarkUserDirectory({ openApiClient }).getUserNameByOpenId(openId);
424
+ }
425
+ async function promptLaunchEnvironment(home, env) {
426
+ const result = {};
427
+ for (const [key, value] of Object.entries(env)) {
428
+ if (key.startsWith("TWINNY_") && value !== undefined) {
429
+ result[key] = value;
430
+ }
431
+ }
432
+ result.TWINNY_HOME = home;
433
+ const includeOther = await cancelable(p.confirm({
434
+ message: "是否导入其它环境变量到 LaunchAgent?",
435
+ initialValue: true
436
+ }));
437
+ if (!includeOther) {
438
+ return { environment: result, stats: buildLaunchEnvironmentStats(env, result) };
439
+ }
440
+ const selection = buildEnvSelection(env);
441
+ if (selection.options.length === 0) {
442
+ return { environment: result, stats: buildLaunchEnvironmentStats(env, result) };
443
+ }
444
+ const selected = await cancelable(p.multiselect({
445
+ message: "选择要导入的环境变量",
446
+ options: selection.options,
447
+ initialValues: selection.initialValues,
448
+ required: false,
449
+ maxItems: 14
450
+ }));
451
+ for (const key of selected) {
452
+ const value = env[key];
453
+ if (value !== undefined) {
454
+ result[key] = value;
455
+ }
456
+ }
457
+ result.TWINNY_HOME = home;
458
+ return { environment: result, stats: buildLaunchEnvironmentStats(env, result) };
459
+ }
460
+ async function finalizeInstall(input) {
461
+ const s = p.spinner();
462
+ s.start("初始化 Twinny home");
463
+ let homeCreated = false;
464
+ let wroteHomeRandom = false;
465
+ let wroteConfig = false;
466
+ let wroteAuth = false;
467
+ let launchAgentInstalled = false;
468
+ let assetUploadAttempted = false;
469
+ try {
470
+ const entrypoint = await resolveLaunchAgentEntrypoint(input.config.home);
471
+ const bootstrap = await bootstrapTwinnyHome(input.config);
472
+ homeCreated = true;
473
+ wroteHomeRandom = bootstrap.wroteHomeRandom;
474
+ wroteConfig = bootstrap.wroteConfig;
475
+ wroteAuth = bootstrap.wroteAuth;
476
+ await (input.secretStore ?? new SecurityCliSecretStore()).set(input.config.homeIdentity.keychainAccounts.larkAppSecret, input.appSecret);
477
+ await installLaunchAgent({
478
+ config: input.config,
479
+ entrypoint,
480
+ environment: input.environment
481
+ });
482
+ launchAgentInstalled = true;
483
+ s.stop("Twinny home 和 LaunchAgent 已创建");
484
+ }
485
+ catch (error) {
486
+ s.error("初始化失败");
487
+ throw error;
488
+ }
489
+ const assetSpinner = p.spinner();
490
+ assetSpinner.start("上传 Twinny 资源");
491
+ assetUploadAttempted = true;
492
+ await uploadBundledAssets(input.config, input.appSecret);
493
+ assetSpinner.stop("资源上传步骤完成");
494
+ return {
495
+ homeCreated,
496
+ wroteHomeRandom,
497
+ wroteConfig,
498
+ wroteAuth,
499
+ launchAgentInstalled,
500
+ assetUploadAttempted
501
+ };
502
+ }
503
+ async function uploadBundledAssets(config, appSecret) {
504
+ const paths = createRuntimePaths(config.home);
505
+ const larkFiles = new LarkFileDownloader({ openApiClient: createOpenApiClient({ appId: config.auth.larkAppId, appSecret, brand: config.auth.larkBrand }) });
506
+ await provisionLarkAssetImageKeys({
507
+ cacheFile: paths.larkAssetsFile,
508
+ logoFilePath: resolveBundledLogoPath(),
509
+ bannerFilePath: resolveBundledBannerPath(),
510
+ uploader: larkFiles,
511
+ logger: {
512
+ warn: (_metadataOrMessage, message) => p.log.warn(message ?? "failed to upload lark asset image; continuing without it")
513
+ }
514
+ });
515
+ }
516
+ function createTenantAccessTokenManager(credentials) {
517
+ return new TenantAccessTokenManager({
518
+ appId: credentials.appId,
519
+ appSecret: credentials.appSecret,
520
+ baseUrl: resolveLarkEndpoints(credentials.brand).openApi
521
+ });
522
+ }
523
+ function createOpenApiClient(credentials) {
524
+ const tokenManager = createTenantAccessTokenManager(credentials);
525
+ return new LarkOpenApiClient({
526
+ tokenManager,
527
+ baseUrl: resolveLarkEndpoints(credentials.brand).openApi
528
+ });
529
+ }
530
+ async function resolveLaunchAgentEntrypoint(home) {
531
+ const entrypoint = process.argv[1] ? path.resolve(process.argv[1]) : process.execPath;
532
+ if (!isNpxEntrypoint(entrypoint)) {
533
+ return entrypoint;
534
+ }
535
+ const identity = await readPackageIdentity();
536
+ const runnerDir = path.join(home, "runner");
537
+ await execa("npm", ["install", "--prefix", runnerDir, "--omit=dev", "--no-audit", "--no-fund", `${identity.name}@${identity.version}`], {
538
+ stdio: "inherit"
539
+ });
540
+ return path.join(runnerDir, "node_modules", ".bin", "twinny");
541
+ }
542
+ export function isNpxEntrypoint(entrypoint) {
543
+ return entrypoint.split(path.sep).includes("_npx");
544
+ }
545
+ async function readPackageIdentity() {
546
+ const packageJsonPath = fileURLToPath(new URL("../../package.json", import.meta.url));
547
+ const raw = JSON.parse(await fs.readFile(packageJsonPath, "utf8"));
548
+ if (typeof raw.name !== "string" || typeof raw.version !== "string") {
549
+ throw new Error("package.json is missing name or version");
550
+ }
551
+ return { name: raw.name, version: raw.version };
552
+ }
553
+ async function pollWithEscape(message, run) {
554
+ const controller = new AbortController();
555
+ const cleanup = installEscapeAbort(controller);
556
+ const s = p.spinner();
557
+ s.start(message);
558
+ try {
559
+ const result = await run(controller.signal);
560
+ s.stop("完成");
561
+ return result;
562
+ }
563
+ catch (error) {
564
+ if (controller.signal.aborted || isAbortError(error)) {
565
+ s.cancel("已取消");
566
+ return undefined;
567
+ }
568
+ s.error("失败");
569
+ throw error;
570
+ }
571
+ finally {
572
+ cleanup();
573
+ }
574
+ }
575
+ function installEscapeAbort(controller) {
576
+ const stdin = process.stdin;
577
+ if (!stdin.isTTY || typeof stdin.setRawMode !== "function") {
578
+ return () => undefined;
579
+ }
580
+ const wasRaw = stdin.isRaw;
581
+ const onData = (chunk) => {
582
+ if (chunk.includes(0x1b)) {
583
+ controller.abort();
584
+ }
585
+ };
586
+ stdin.setRawMode(true);
587
+ stdin.resume();
588
+ stdin.on("data", onData);
589
+ return () => {
590
+ stdin.off("data", onData);
591
+ stdin.setRawMode(wasRaw);
592
+ };
593
+ }
594
+ async function openBrowserBestEffort(url) {
595
+ if (process.platform === "darwin") {
596
+ await execa("open", [url], { reject: false });
597
+ return;
598
+ }
599
+ if (process.platform === "win32") {
600
+ await execa("cmd", ["/c", "start", "", url], { reject: false });
601
+ return;
602
+ }
603
+ await execa("xdg-open", [url], { reject: false });
604
+ }
605
+ async function cancelable(value) {
606
+ const result = await value;
607
+ if (p.isCancel(result)) {
608
+ p.cancel("安装已取消");
609
+ process.exit(0);
610
+ }
611
+ return result;
612
+ }
613
+ function stringField(source, key) {
614
+ if (!source || typeof source !== "object" || Array.isArray(source)) {
615
+ return undefined;
616
+ }
617
+ const value = source[key];
618
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
619
+ }
620
+ function isAbortError(error) {
621
+ return error instanceof Error && error.name === "AbortError";
622
+ }
623
+ function isNodeError(error, code) {
624
+ return typeof error === "object" && error !== null && "code" in error && error.code === code;
625
+ }
626
+ function shellQuote(value) {
627
+ return `'${value.replaceAll("'", "'\\''")}'`;
628
+ }
629
+ //# sourceMappingURL=install-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-wizard.js","sourceRoot":"","sources":["../../src/cli/install-wizard.ts"],"names":[],"mappings":"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"}