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,258 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { setTimeout as sleep } from "node:timers/promises";
3
+ import { TwinnyError } from "../errors.js";
4
+ import { resolveLarkEndpoints } from "./auth.js";
5
+ export const LARK_APP_REGISTRATION_PATH = "/oauth/v1/app/registration";
6
+ export const LARK_DEVICE_AUTHORIZATION_PATH = "/oauth/v1/device_authorization";
7
+ export const LARK_OAUTH_TOKEN_PATH = "/authen/v2/oauth/token";
8
+ export const LARK_USER_INFO_PATH = "/authen/v1/user_info";
9
+ const deviceCodeGrantType = "urn:ietf:params:oauth:grant-type:device_code";
10
+ const maxPollIntervalSeconds = 60;
11
+ const maxAppRegistrationPollAttempts = 200;
12
+ const maxDeviceTokenPollAttempts = 600;
13
+ export async function requestLarkAppRegistration(brand, options = {}) {
14
+ const fetch = options.fetch ?? globalFetch;
15
+ const displayEndpoints = resolveLarkEndpoints(brand);
16
+ const registrationEndpoints = resolveLarkEndpoints("feishu");
17
+ const body = new URLSearchParams({
18
+ action: "begin",
19
+ archetype: "PersonalAgent",
20
+ auth_method: "client_secret",
21
+ request_user_info: "open_id tenant_brand"
22
+ });
23
+ const response = await fetch(`${registrationEndpoints.accounts}${LARK_APP_REGISTRATION_PATH}`, {
24
+ method: "POST",
25
+ headers: { "content-type": "application/x-www-form-urlencoded" },
26
+ body: body.toString(),
27
+ signal: options.signal
28
+ });
29
+ const payload = await readJsonBody(response);
30
+ if (!response.ok || stringField(payload, "error")) {
31
+ throw new TwinnyError(`app registration failed: ${errorDescription(payload, response.statusText)}`, "LARK_APP_REGISTRATION_FAILED");
32
+ }
33
+ const userCode = requiredString(payload, "user_code", "app registration response did not include user_code");
34
+ return {
35
+ deviceCode: requiredString(payload, "device_code", "app registration response did not include device_code"),
36
+ userCode,
37
+ verificationUri: stringField(payload, "verification_uri") ?? "",
38
+ verificationUriComplete: `${displayEndpoints.open}/page/cli?user_code=${encodeURIComponent(userCode)}`,
39
+ expiresIn: numberField(payload, "expires_in") ?? 300,
40
+ interval: numberField(payload, "interval") ?? 5
41
+ };
42
+ }
43
+ export async function pollLarkAppRegistration(brand, deviceCode, options = {}) {
44
+ const first = await pollLarkAppRegistrationOnce(brand, deviceCode, options);
45
+ if (!first.clientSecret && first.tenantBrand === "lark") {
46
+ const retry = await pollLarkAppRegistrationOnce("lark", deviceCode, options);
47
+ return normalizeAppRegistrationResult(retry, "lark");
48
+ }
49
+ return normalizeAppRegistrationResult(first, first.tenantBrand === "lark" ? "lark" : brand);
50
+ }
51
+ export function buildLarkVerificationUrl(baseUrl, cliVersion) {
52
+ const separator = baseUrl.includes("?") ? "&" : "?";
53
+ const version = encodeURIComponent(cliVersion);
54
+ return `${baseUrl}${separator}lpv=${version}&ocv=${version}&from=cli`;
55
+ }
56
+ export async function requestLarkDeviceAuthorization(input, options = {}) {
57
+ const fetch = options.fetch ?? globalFetch;
58
+ const endpoints = resolveLarkEndpoints(input.brand);
59
+ const scope = ensureOfflineAccessScope(input.scope ?? "");
60
+ const body = new URLSearchParams({
61
+ client_id: input.appId,
62
+ scope
63
+ });
64
+ const response = await fetch(`${endpoints.accounts}${LARK_DEVICE_AUTHORIZATION_PATH}`, {
65
+ method: "POST",
66
+ headers: {
67
+ "content-type": "application/x-www-form-urlencoded",
68
+ authorization: `Basic ${Buffer.from(`${input.appId}:${input.appSecret}`).toString("base64")}`
69
+ },
70
+ body: body.toString(),
71
+ signal: options.signal
72
+ });
73
+ const payload = await readJsonBody(response);
74
+ if (!response.ok || stringField(payload, "error")) {
75
+ throw new TwinnyError(`device authorization failed: ${errorDescription(payload, response.statusText)}`, "LARK_DEVICE_AUTH_FAILED");
76
+ }
77
+ const verificationUri = stringField(payload, "verification_uri") ?? "";
78
+ return {
79
+ deviceCode: requiredString(payload, "device_code", "device authorization response did not include device_code"),
80
+ userCode: requiredString(payload, "user_code", "device authorization response did not include user_code"),
81
+ verificationUri,
82
+ verificationUriComplete: stringField(payload, "verification_uri_complete") ?? verificationUri,
83
+ expiresIn: numberField(payload, "expires_in") ?? 240,
84
+ interval: numberField(payload, "interval") ?? 5
85
+ };
86
+ }
87
+ export async function pollLarkDeviceToken(input, options = {}) {
88
+ const fetch = options.fetch ?? globalFetch;
89
+ const endpoints = resolveLarkEndpoints(input.brand);
90
+ const startedAt = options.now?.() ?? Date.now();
91
+ const deadline = startedAt + Math.max(0, input.expiresIn ?? 240) * 1000;
92
+ let interval = Math.max(1, input.interval ?? 5);
93
+ for (let attempt = 0; attempt < maxDeviceTokenPollAttempts && (options.now?.() ?? Date.now()) < deadline; attempt += 1) {
94
+ await sleep(interval * 1000, undefined, { signal: options.signal });
95
+ const body = new URLSearchParams({
96
+ grant_type: deviceCodeGrantType,
97
+ device_code: input.deviceCode,
98
+ client_id: input.appId,
99
+ client_secret: input.appSecret
100
+ });
101
+ const response = await fetch(`${endpoints.openApi}${LARK_OAUTH_TOKEN_PATH}`, {
102
+ method: "POST",
103
+ headers: { "content-type": "application/x-www-form-urlencoded" },
104
+ body: body.toString(),
105
+ signal: options.signal
106
+ });
107
+ const payload = await readJsonBody(response);
108
+ const error = stringField(payload, "error");
109
+ if (response.ok && !error && stringField(payload, "access_token")) {
110
+ const accessToken = requiredString(payload, "access_token", "device token response did not include access_token");
111
+ const refreshToken = stringField(payload, "refresh_token");
112
+ const expiresIn = numberField(payload, "expires_in") ?? 7200;
113
+ return {
114
+ accessToken,
115
+ refreshToken,
116
+ expiresIn,
117
+ refreshExpiresIn: refreshToken ? numberField(payload, "refresh_token_expires_in") ?? 604800 : expiresIn,
118
+ scope: stringField(payload, "scope")
119
+ };
120
+ }
121
+ if (error === "authorization_pending") {
122
+ continue;
123
+ }
124
+ if (error === "slow_down") {
125
+ interval = Math.min(interval + 5, maxPollIntervalSeconds);
126
+ continue;
127
+ }
128
+ if (error === "access_denied") {
129
+ throw new TwinnyError(errorDescription(payload, "Authorization denied by user"), "LARK_DEVICE_AUTH_DENIED");
130
+ }
131
+ if (error === "expired_token" || error === "invalid_grant") {
132
+ throw new TwinnyError(errorDescription(payload, "Device code expired, please try again"), "LARK_DEVICE_AUTH_EXPIRED");
133
+ }
134
+ throw new TwinnyError(`device token polling failed: ${errorDescription(payload, response.statusText)}`, "LARK_DEVICE_TOKEN_FAILED");
135
+ }
136
+ throw new TwinnyError("device authorization timed out, please try again", "LARK_DEVICE_AUTH_TIMEOUT");
137
+ }
138
+ export async function getLarkBrowserUserInfo(input, options = {}) {
139
+ const fetch = options.fetch ?? globalFetch;
140
+ const endpoints = resolveLarkEndpoints(input.brand);
141
+ const response = await fetch(`${endpoints.openApi}${LARK_USER_INFO_PATH}`, {
142
+ method: "GET",
143
+ headers: {
144
+ authorization: `Bearer ${input.accessToken}`,
145
+ "content-type": "application/json"
146
+ },
147
+ signal: options.signal
148
+ });
149
+ const payload = await readJsonBody(response);
150
+ const data = recordField(payload, "data");
151
+ const code = numberField(payload, "code") ?? 0;
152
+ if (!response.ok || code !== 0) {
153
+ throw new TwinnyError(`failed to get user info: ${errorDescription(payload, response.statusText)}`, "LARK_USER_INFO_FAILED");
154
+ }
155
+ return {
156
+ openId: requiredString(data, "open_id", "user info response did not include open_id"),
157
+ name: stringField(data, "name") ?? "(unknown)"
158
+ };
159
+ }
160
+ async function pollLarkAppRegistrationOnce(brand, deviceCode, options) {
161
+ const fetch = options.fetch ?? globalFetch;
162
+ const endpoints = resolveLarkEndpoints(brand);
163
+ const startedAt = options.now?.() ?? Date.now();
164
+ const deadline = startedAt + Math.max(0, options.expiresIn ?? 300) * 1000;
165
+ let interval = Math.max(1, options.interval ?? 5);
166
+ for (let attempt = 0; attempt < maxAppRegistrationPollAttempts && (options.now?.() ?? Date.now()) < deadline; attempt += 1) {
167
+ await sleep(interval * 1000, undefined, { signal: options.signal });
168
+ const body = new URLSearchParams({
169
+ action: "poll",
170
+ device_code: deviceCode
171
+ });
172
+ const response = await fetch(`${endpoints.accounts}${LARK_APP_REGISTRATION_PATH}`, {
173
+ method: "POST",
174
+ headers: { "content-type": "application/x-www-form-urlencoded" },
175
+ body: body.toString(),
176
+ signal: options.signal
177
+ });
178
+ const payload = await readJsonBody(response);
179
+ const error = stringField(payload, "error");
180
+ const clientId = stringField(payload, "client_id");
181
+ if (response.ok && !error && clientId) {
182
+ const userInfo = recordField(payload, "user_info");
183
+ return {
184
+ clientId,
185
+ clientSecret: stringField(payload, "client_secret") ?? "",
186
+ tenantBrand: stringField(userInfo, "tenant_brand"),
187
+ openId: stringField(userInfo, "open_id")
188
+ };
189
+ }
190
+ if (error === "authorization_pending") {
191
+ continue;
192
+ }
193
+ if (error === "slow_down") {
194
+ interval = Math.min(interval + 5, maxPollIntervalSeconds);
195
+ continue;
196
+ }
197
+ if (error === "access_denied") {
198
+ throw new TwinnyError("app registration denied by user", "LARK_APP_REGISTRATION_DENIED");
199
+ }
200
+ if (error === "expired_token" || error === "invalid_grant") {
201
+ throw new TwinnyError("device code expired, please try again", "LARK_APP_REGISTRATION_EXPIRED");
202
+ }
203
+ throw new TwinnyError(`app registration failed: ${errorDescription(payload, response.statusText)}`, "LARK_APP_REGISTRATION_FAILED");
204
+ }
205
+ throw new TwinnyError("app registration timed out, please try again", "LARK_APP_REGISTRATION_TIMEOUT");
206
+ }
207
+ function normalizeAppRegistrationResult(raw, fallbackBrand) {
208
+ const brand = raw.tenantBrand === "lark" ? "lark" : raw.tenantBrand === "feishu" ? "feishu" : fallbackBrand;
209
+ if (!raw.clientId || !raw.clientSecret) {
210
+ throw new TwinnyError("app registration succeeded but missing client_id or client_secret", "LARK_APP_REGISTRATION_INCOMPLETE");
211
+ }
212
+ return {
213
+ appId: raw.clientId,
214
+ appSecret: raw.clientSecret,
215
+ brand,
216
+ ownerOpenId: raw.openId
217
+ };
218
+ }
219
+ function ensureOfflineAccessScope(scope) {
220
+ const scopes = scope.split(/\s+/).map((part) => part.trim()).filter(Boolean);
221
+ if (!scopes.includes("offline_access")) {
222
+ scopes.push("offline_access");
223
+ }
224
+ return scopes.join(" ");
225
+ }
226
+ async function readJsonBody(response) {
227
+ const value = await response.json();
228
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
229
+ }
230
+ function recordField(source, key) {
231
+ const value = source[key];
232
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
233
+ }
234
+ function stringField(source, key) {
235
+ const value = source[key];
236
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
237
+ }
238
+ function requiredString(source, key, message) {
239
+ const value = stringField(source, key);
240
+ if (!value) {
241
+ throw new TwinnyError(message, "LARK_BROWSER_AUTH_RESPONSE_INVALID");
242
+ }
243
+ return value;
244
+ }
245
+ function numberField(source, key) {
246
+ const value = source[key];
247
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
248
+ }
249
+ function errorDescription(payload, fallback) {
250
+ return stringField(payload, "error_description") ?? stringField(payload, "msg") ?? stringField(payload, "error") ?? fallback;
251
+ }
252
+ const globalFetch = async (input, init) => {
253
+ if (typeof fetch !== "function") {
254
+ throw new TwinnyError("global fetch is not available in this Node.js runtime", "LARK_FETCH_UNAVAILABLE");
255
+ }
256
+ return fetch(input, init);
257
+ };
258
+ //# sourceMappingURL=browser-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/lark/browser-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import type { CodexThreadMode, CodexThreadStatus, ConversationResponseMode, ConversationType, ProfileName, UserIdentity } from "../types.js";
2
+ export type LarkCardJson = Record<string, unknown>;
3
+ export type LarkCardElement = Record<string, unknown>;
4
+ export type TwinnyAgentCardStatus = "working" | "finished" | "interrupted" | "paused" | "failed" | "waiting_input" | "waiting_plan" | "interrupted_input" | "interrupted_plan" | "accepted_plan";
5
+ export interface TwinnyAgentCardMessage {
6
+ id: string;
7
+ text: string;
8
+ processOnly?: boolean;
9
+ }
10
+ export interface TwinnyAgentCardActionValue {
11
+ twinny: true;
12
+ action: "stop" | "next" | "queue" | "request_input_submit" | "request_input_interrupt" | "plan_implement" | "plan_interrupt";
13
+ stateKey: string;
14
+ runId: number;
15
+ }
16
+ export interface TwinnyStatusCardActionValue {
17
+ twinny: true;
18
+ action: "status_hide";
19
+ stateKey: string;
20
+ }
21
+ export interface TwinnyAgentCardInputQuestion {
22
+ id: string;
23
+ header: string;
24
+ question: string;
25
+ isOther: boolean;
26
+ isSecret: boolean;
27
+ options: Array<{
28
+ label: string;
29
+ description: string;
30
+ }> | null;
31
+ }
32
+ export type TwinnyAgentCardWaiting = {
33
+ kind: "request_user_input";
34
+ requestId: string;
35
+ questions: TwinnyAgentCardInputQuestion[];
36
+ } | {
37
+ kind: "plan";
38
+ planText: string;
39
+ };
40
+ export interface RenderTwinnyAgentCardOptions {
41
+ status: TwinnyAgentCardStatus;
42
+ messages: TwinnyAgentCardMessage[];
43
+ elapsedMs: number;
44
+ runtimeStats?: TwinnyAgentCardRuntimeStats;
45
+ queueDepth: number;
46
+ queueNextMessage: boolean;
47
+ stateKey: string;
48
+ runId: number;
49
+ iconImageKey?: string;
50
+ mode?: CodexThreadMode;
51
+ title?: string;
52
+ subtitle?: string;
53
+ hideQueueControls?: boolean;
54
+ waiting?: TwinnyAgentCardWaiting;
55
+ finalElements?: LarkCardElement[];
56
+ mentionOpenIds?: string[];
57
+ summaryText?: string;
58
+ error?: string;
59
+ }
60
+ export interface TwinnyAgentCardRuntimeStats {
61
+ model?: string;
62
+ effort?: string;
63
+ inputTokens: number;
64
+ cachedInputTokens: number;
65
+ outputTokens: number;
66
+ contextTokens: number;
67
+ contextWindow: number;
68
+ }
69
+ export declare const PLAN_IMPLEMENT_INSTRUCTION_FORM_NAME = "plan_implement_instruction";
70
+ export interface RenderTwinnyThreadSummaryCardOptions {
71
+ name: string;
72
+ status: CodexThreadStatus;
73
+ creatorOpenId?: string;
74
+ createdAt: number;
75
+ codexThreadId: string;
76
+ turnCount: number;
77
+ inputTokens: number;
78
+ outputTokens: number;
79
+ cachedInputTokens: number;
80
+ reasoningOutputTokens: number;
81
+ totalTokens: number;
82
+ totalWorkDurationMs: number;
83
+ contextTokens: number;
84
+ contextWindow: number;
85
+ iconImageKey?: string;
86
+ }
87
+ export interface RenderTwinnyStatusCardOptions {
88
+ topic: {
89
+ id?: string;
90
+ name?: string;
91
+ mode: CodexThreadMode;
92
+ model: string;
93
+ contextTokens: number;
94
+ contextWindow: number;
95
+ userMessageCount: number;
96
+ inputTokens: number;
97
+ cachedInputTokens: number;
98
+ outputTokens: number;
99
+ reasoningOutputTokens: number;
100
+ totalWorkDurationMs: number;
101
+ };
102
+ workspace: {
103
+ id: string;
104
+ type: ConversationType;
105
+ responseMode: ConversationResponseMode;
106
+ profile?: ProfileName;
107
+ path?: string;
108
+ topicCount: number;
109
+ userMessageCount: number;
110
+ inputTokens: number;
111
+ cachedInputTokens: number;
112
+ outputTokens: number;
113
+ reasoningOutputTokens: number;
114
+ totalWorkDurationMs: number;
115
+ };
116
+ user: {
117
+ openId: string;
118
+ identity: UserIdentity;
119
+ };
120
+ system?: {
121
+ twinnyHome: string;
122
+ twinnyVersion: string;
123
+ codexVersion: string;
124
+ larkAppId: string;
125
+ fiveHourRemainingLimit: string;
126
+ sevenDayRemainingLimit: string;
127
+ };
128
+ hideAction?: TwinnyStatusCardActionValue;
129
+ }
130
+ export interface RenderTwinnyBannerCardOptions {
131
+ bannerImageKey?: string;
132
+ twinnyVersion?: string;
133
+ }
134
+ export declare function renderTwinnyAgentCard(options: RenderTwinnyAgentCardOptions): LarkCardJson;
135
+ export declare function renderTwinnyStatusCard(options: RenderTwinnyStatusCardOptions): LarkCardJson;
136
+ export declare function renderTwinnyThreadSummaryCard(options: RenderTwinnyThreadSummaryCardOptions): LarkCardJson;
137
+ export declare function renderTwinnyBannerCard(options?: RenderTwinnyBannerCardOptions): LarkCardJson;
138
+ export declare function markdownElement(content: string, extra?: Record<string, unknown>): LarkCardElement;
139
+ export declare function imageElement(imageKey: string): LarkCardElement;
140
+ export declare function mediaElement(fileKey: string): LarkCardElement;