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.
- package/LICENSE +21 -0
- package/README.md +264 -0
- package/README.zh-CN.md +252 -0
- package/configs/banner.png +0 -0
- package/configs/logo.png +0 -0
- package/dist/app/caffeinate.d.ts +28 -0
- package/dist/app/caffeinate.js +96 -0
- package/dist/app/caffeinate.js.map +1 -0
- package/dist/app/daemon.d.ts +1 -0
- package/dist/app/daemon.js +44 -0
- package/dist/app/daemon.js.map +1 -0
- package/dist/app/lark-assets.d.ts +25 -0
- package/dist/app/lark-assets.js +108 -0
- package/dist/app/lark-assets.js.map +1 -0
- package/dist/app/startup-probe.d.ts +17 -0
- package/dist/app/startup-probe.js +90 -0
- package/dist/app/startup-probe.js.map +1 -0
- package/dist/app/wiring.d.ts +122 -0
- package/dist/app/wiring.js +694 -0
- package/dist/app/wiring.js.map +1 -0
- package/dist/cli/commands.d.ts +1 -0
- package/dist/cli/commands.js +47 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/install-wizard.d.ts +41 -0
- package/dist/cli/install-wizard.js +629 -0
- package/dist/cli/install-wizard.js.map +1 -0
- package/dist/codex/appserver.d.ts +109 -0
- package/dist/codex/appserver.js +308 -0
- package/dist/codex/appserver.js.map +1 -0
- package/dist/codex/goal.d.ts +64 -0
- package/dist/codex/goal.js +433 -0
- package/dist/codex/goal.js.map +1 -0
- package/dist/codex/index.d.ts +6 -0
- package/dist/codex/index.js +7 -0
- package/dist/codex/index.js.map +1 -0
- package/dist/codex/protocol.d.ts +95 -0
- package/dist/codex/protocol.js +205 -0
- package/dist/codex/protocol.js.map +1 -0
- package/dist/codex/thread-name.d.ts +3 -0
- package/dist/codex/thread-name.js +27 -0
- package/dist/codex/thread-name.js.map +1 -0
- package/dist/codex/thread.d.ts +76 -0
- package/dist/codex/thread.js +80 -0
- package/dist/codex/thread.js.map +1 -0
- package/dist/codex/turn.d.ts +166 -0
- package/dist/codex/turn.js +746 -0
- package/dist/codex/turn.js.map +1 -0
- package/dist/config/bootstrap.d.ts +14 -0
- package/dist/config/bootstrap.js +56 -0
- package/dist/config/bootstrap.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +49 -0
- package/dist/config/loader.js +467 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +11 -0
- package/dist/config/paths.js +43 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/secrets.d.ts +33 -0
- package/dist/config/secrets.js +85 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/conversation/manager.d.ts +701 -0
- package/dist/conversation/manager.js +7673 -0
- package/dist/conversation/manager.js.map +1 -0
- package/dist/conversation/queue.d.ts +8 -0
- package/dist/conversation/queue.js +28 -0
- package/dist/conversation/queue.js.map +1 -0
- package/dist/conversation/routing.d.ts +11 -0
- package/dist/conversation/routing.js +55 -0
- package/dist/conversation/routing.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lark/auth.d.ts +41 -0
- package/dist/lark/auth.js +132 -0
- package/dist/lark/auth.js.map +1 -0
- package/dist/lark/browser-auth.d.ts +68 -0
- package/dist/lark/browser-auth.js +258 -0
- package/dist/lark/browser-auth.js.map +1 -0
- package/dist/lark/cards.d.ts +140 -0
- package/dist/lark/cards.js +1150 -0
- package/dist/lark/cards.js.map +1 -0
- package/dist/lark/contact.d.ts +41 -0
- package/dist/lark/contact.js +122 -0
- package/dist/lark/contact.js.map +1 -0
- package/dist/lark/events.d.ts +65 -0
- package/dist/lark/events.js +218 -0
- package/dist/lark/events.js.map +1 -0
- package/dist/lark/files.d.ts +36 -0
- package/dist/lark/files.js +191 -0
- package/dist/lark/files.js.map +1 -0
- package/dist/lark/filters.d.ts +73 -0
- package/dist/lark/filters.js +678 -0
- package/dist/lark/filters.js.map +1 -0
- package/dist/lark/index.d.ts +10 -0
- package/dist/lark/index.js +11 -0
- package/dist/lark/index.js.map +1 -0
- package/dist/lark/messages.d.ts +87 -0
- package/dist/lark/messages.js +428 -0
- package/dist/lark/messages.js.map +1 -0
- package/dist/lark/openapi.d.ts +58 -0
- package/dist/lark/openapi.js +206 -0
- package/dist/lark/openapi.js.map +1 -0
- package/dist/lark/redactor.d.ts +5 -0
- package/dist/lark/redactor.js +68 -0
- package/dist/lark/redactor.js.map +1 -0
- package/dist/lark/types.d.ts +49 -0
- package/dist/lark/types.js +18 -0
- package/dist/lark/types.js.map +1 -0
- package/dist/launchd/install.d.ts +22 -0
- package/dist/launchd/install.js +114 -0
- package/dist/launchd/install.js.map +1 -0
- package/dist/launchd/plist.d.ts +10 -0
- package/dist/launchd/plist.js +61 -0
- package/dist/launchd/plist.js.map +1 -0
- package/dist/lock/index.d.ts +20 -0
- package/dist/lock/index.js +74 -0
- package/dist/lock/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +11 -0
- package/dist/main.js.map +1 -0
- package/dist/markdown.d.ts +12 -0
- package/dist/markdown.js +149 -0
- package/dist/markdown.js.map +1 -0
- package/dist/observability/health.d.ts +25 -0
- package/dist/observability/health.js +187 -0
- package/dist/observability/health.js.map +1 -0
- package/dist/observability/logs.d.ts +10 -0
- package/dist/observability/logs.js +34 -0
- package/dist/observability/logs.js.map +1 -0
- package/dist/observability/system-notifications.d.ts +25 -0
- package/dist/observability/system-notifications.js +33 -0
- package/dist/observability/system-notifications.js.map +1 -0
- package/dist/profiles/guest.d.ts +19 -0
- package/dist/profiles/guest.js +241 -0
- package/dist/profiles/guest.js.map +1 -0
- package/dist/profiles/index.d.ts +5 -0
- package/dist/profiles/index.js +14 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/owner.d.ts +1 -0
- package/dist/profiles/owner.js +6 -0
- package/dist/profiles/owner.js.map +1 -0
- package/dist/store/db.d.ts +10 -0
- package/dist/store/db.js +29 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.js +4 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/migrations.d.ts +13 -0
- package/dist/store/migrations.js +79 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/repositories.d.ts +227 -0
- package/dist/store/repositories.js +1384 -0
- package/dist/store/repositories.js.map +1 -0
- package/dist/telemetry/client.d.ts +60 -0
- package/dist/telemetry/client.js +204 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/hash.d.ts +1 -0
- package/dist/telemetry/hash.js +8 -0
- package/dist/telemetry/hash.js.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.js +5 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/posthog.d.ts +27 -0
- package/dist/telemetry/posthog.js +45 -0
- package/dist/telemetry/posthog.js.map +1 -0
- package/dist/telemetry/reporter.d.ts +13 -0
- package/dist/telemetry/reporter.js +29 -0
- package/dist/telemetry/reporter.js.map +1 -0
- package/dist/types.d.ts +330 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/dist/version.js.map +1 -0
- package/dist/version.json +3 -0
- package/dist/workspace/index.d.ts +2 -0
- package/dist/workspace/index.js +3 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/manager.d.ts +14 -0
- package/dist/workspace/manager.js +69 -0
- package/dist/workspace/manager.js.map +1 -0
- package/dist/workspace/slug.d.ts +8 -0
- package/dist/workspace/slug.js +59 -0
- package/dist/workspace/slug.js.map +1 -0
- package/migrations/0001_initial.sql +102 -0
- package/package.json +85 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
export type ProfileName = string;
|
|
2
|
+
export type UserIdentity = "owner" | "guest";
|
|
3
|
+
export declare const HOST_PROFILE_NAME = "host";
|
|
4
|
+
export declare const GUEST_PROFILE_NAME = "guest";
|
|
5
|
+
export declare const NONE_PROFILE_NAME = "none";
|
|
6
|
+
export type ConversationType = "p2p" | "group" | "topic_group";
|
|
7
|
+
export type LarkChatMode = "group" | "topic";
|
|
8
|
+
export type LarkGroupMessageType = "chat" | "thread";
|
|
9
|
+
export type LarkBrand = "feishu" | "lark";
|
|
10
|
+
export type ConversationResponseMode = "all" | "all_at" | "owner" | "owner_at" | "none";
|
|
11
|
+
export type AgentMessagePhase = "commentary" | "final_answer";
|
|
12
|
+
export type LarkMessageRedactionStrategy = "mask" | "whitespace" | "none";
|
|
13
|
+
export type CodexThreadMode = "default" | "plan";
|
|
14
|
+
export type CodexThreadStatus = "idle" | "working" | "waiting";
|
|
15
|
+
export type CodexThreadGoalStatus = "none" | "active" | "paused" | "blocked" | "usageLimited" | "budgetLimited" | "complete";
|
|
16
|
+
export interface CodexAgentMessage {
|
|
17
|
+
id: string;
|
|
18
|
+
text: string;
|
|
19
|
+
phase?: AgentMessagePhase | null;
|
|
20
|
+
}
|
|
21
|
+
export interface CodexImageGeneration {
|
|
22
|
+
id: string;
|
|
23
|
+
status?: string;
|
|
24
|
+
savedPath?: string;
|
|
25
|
+
revisedPrompt?: string;
|
|
26
|
+
result?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CodexThreadNameUpdate {
|
|
29
|
+
threadId: string;
|
|
30
|
+
name: string;
|
|
31
|
+
}
|
|
32
|
+
export type LarkMessageRouteKind = "message" | "side_message" | "goal_message" | "steered_message" | "queued_message" | "control_message" | "card_action" | "menu_action";
|
|
33
|
+
export type LarkMessageStatus = "queued" | "recalled" | "processing" | "steered" | "completed" | "failed" | "interrupted" | "cleared";
|
|
34
|
+
export declare const DEFAULT_LARK_WORKING_REACTION = "Typing";
|
|
35
|
+
export declare const DEFAULT_LARK_COMPLETED_REACTION = "DONE";
|
|
36
|
+
export declare const DEFAULT_LARK_QUEUED_REACTION = "OneSecond";
|
|
37
|
+
export declare const DEFAULT_LARK_MAX_MESSAGE_AGE_SECONDS = 60;
|
|
38
|
+
export declare const DEFAULT_LARK_MESSAGE_REDACTION_STRATEGY: LarkMessageRedactionStrategy;
|
|
39
|
+
export interface LarkMessageRedactionConfig {
|
|
40
|
+
email: LarkMessageRedactionStrategy;
|
|
41
|
+
chinesePhoneNumber: LarkMessageRedactionStrategy;
|
|
42
|
+
}
|
|
43
|
+
export interface OwnerConfig {
|
|
44
|
+
openId: string;
|
|
45
|
+
userId?: string;
|
|
46
|
+
displayName: string;
|
|
47
|
+
}
|
|
48
|
+
export interface TwinnyAuthFile {
|
|
49
|
+
larkAppId: string;
|
|
50
|
+
larkBrand: LarkBrand;
|
|
51
|
+
ownerOpenId: string;
|
|
52
|
+
displayName: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TwinnyHomeIdentity {
|
|
55
|
+
random: string;
|
|
56
|
+
telemetryHashSalt: string;
|
|
57
|
+
keychainAccounts: {
|
|
58
|
+
larkAppSecret: string;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export interface LarkConfig {
|
|
62
|
+
workingReaction: string;
|
|
63
|
+
completedReaction: string;
|
|
64
|
+
queuedReaction: string;
|
|
65
|
+
maxMessageAgeSeconds: number;
|
|
66
|
+
messageRedaction: LarkMessageRedactionConfig;
|
|
67
|
+
}
|
|
68
|
+
export interface CodexConfig {
|
|
69
|
+
binary: string;
|
|
70
|
+
}
|
|
71
|
+
export interface ProfileConfig {
|
|
72
|
+
codexHome: string;
|
|
73
|
+
defaultModel?: string;
|
|
74
|
+
defaultEffort?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface PermissionsConfig {
|
|
77
|
+
p2pDefaultProfile: ProfileName;
|
|
78
|
+
}
|
|
79
|
+
export interface TelemetryConfig {
|
|
80
|
+
enabled: boolean;
|
|
81
|
+
posthogProjectToken: string;
|
|
82
|
+
posthogHost: string;
|
|
83
|
+
}
|
|
84
|
+
export interface TwinnyConfig {
|
|
85
|
+
home: string;
|
|
86
|
+
codex: CodexConfig;
|
|
87
|
+
lark: LarkConfig;
|
|
88
|
+
auth: TwinnyAuthFile;
|
|
89
|
+
homeIdentity: TwinnyHomeIdentity;
|
|
90
|
+
permissions: PermissionsConfig;
|
|
91
|
+
telemetry?: TelemetryConfig;
|
|
92
|
+
owner: OwnerConfig;
|
|
93
|
+
profiles: Record<ProfileName, ProfileConfig>;
|
|
94
|
+
}
|
|
95
|
+
export interface RuntimePaths {
|
|
96
|
+
home: string;
|
|
97
|
+
configFile: string;
|
|
98
|
+
authFile: string;
|
|
99
|
+
homeRandomFile: string;
|
|
100
|
+
sqliteDir: string;
|
|
101
|
+
sqliteFile: string;
|
|
102
|
+
workspacesDir: string;
|
|
103
|
+
runtimeDir: string;
|
|
104
|
+
larkAssetsFile: string;
|
|
105
|
+
lockFile: string;
|
|
106
|
+
logsDir: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ConversationRecord {
|
|
109
|
+
id: number;
|
|
110
|
+
conversationKey: string;
|
|
111
|
+
type: ConversationType;
|
|
112
|
+
chatId: string;
|
|
113
|
+
name: string;
|
|
114
|
+
responseMode: ConversationResponseMode;
|
|
115
|
+
profile: ProfileName;
|
|
116
|
+
codexThreadId: string;
|
|
117
|
+
workspace: string;
|
|
118
|
+
profileCodexHome: string;
|
|
119
|
+
createdAt: number;
|
|
120
|
+
updatedAt: number;
|
|
121
|
+
}
|
|
122
|
+
export interface NewConversationRecord {
|
|
123
|
+
conversationKey: string;
|
|
124
|
+
type: ConversationType;
|
|
125
|
+
chatId: string;
|
|
126
|
+
name: string;
|
|
127
|
+
responseMode?: ConversationResponseMode;
|
|
128
|
+
profile: ProfileName;
|
|
129
|
+
codexThreadId: string;
|
|
130
|
+
workspace: string;
|
|
131
|
+
profileCodexHome: string;
|
|
132
|
+
}
|
|
133
|
+
export interface CodexThreadRecord {
|
|
134
|
+
id: number;
|
|
135
|
+
codexThreadId: string;
|
|
136
|
+
conversationKey: string;
|
|
137
|
+
name: string;
|
|
138
|
+
larkThreadId?: string;
|
|
139
|
+
profile: ProfileName;
|
|
140
|
+
model?: string;
|
|
141
|
+
effort?: string;
|
|
142
|
+
mode: CodexThreadMode;
|
|
143
|
+
status: CodexThreadStatus;
|
|
144
|
+
goalStatus: CodexThreadGoalStatus;
|
|
145
|
+
goalUpdatedAt?: number;
|
|
146
|
+
forkedFromCodexThreadId?: string;
|
|
147
|
+
forkedAt?: number;
|
|
148
|
+
creatorOpenId?: string;
|
|
149
|
+
cardMessageId?: string;
|
|
150
|
+
codexThreadHasRollout: boolean;
|
|
151
|
+
inputTokens: number;
|
|
152
|
+
outputTokens: number;
|
|
153
|
+
cachedInputTokens: number;
|
|
154
|
+
reasoningOutputTokens: number;
|
|
155
|
+
totalTokens: number;
|
|
156
|
+
contextTokens: number;
|
|
157
|
+
contextWindow: number;
|
|
158
|
+
tokenUsageJson: string;
|
|
159
|
+
createdAt: number;
|
|
160
|
+
updatedAt: number;
|
|
161
|
+
}
|
|
162
|
+
export interface LarkMessageRecord {
|
|
163
|
+
id: number;
|
|
164
|
+
larkMessageId?: string;
|
|
165
|
+
eventId: string;
|
|
166
|
+
larkUserId: string;
|
|
167
|
+
larkGroupId?: string;
|
|
168
|
+
larkThreadId?: string;
|
|
169
|
+
conversationKey?: string;
|
|
170
|
+
codexThreadId?: string;
|
|
171
|
+
codexTurnId?: string;
|
|
172
|
+
routeKind: LarkMessageRouteKind;
|
|
173
|
+
status: LarkMessageStatus;
|
|
174
|
+
text: string;
|
|
175
|
+
larkCreateTime?: number;
|
|
176
|
+
receivedAt: number;
|
|
177
|
+
updatedAt: number;
|
|
178
|
+
processingStartedAt?: number;
|
|
179
|
+
completedAt?: number;
|
|
180
|
+
failedAt?: number;
|
|
181
|
+
clearedAt?: number;
|
|
182
|
+
sideId?: number;
|
|
183
|
+
agentCardMessageId?: string;
|
|
184
|
+
rawEventJson?: string;
|
|
185
|
+
inputTokens: number;
|
|
186
|
+
outputTokens: number;
|
|
187
|
+
cachedInputTokens: number;
|
|
188
|
+
reasoningOutputTokens: number;
|
|
189
|
+
tokenUsageJson: string;
|
|
190
|
+
}
|
|
191
|
+
export interface IncomingLarkMessage {
|
|
192
|
+
eventId: string;
|
|
193
|
+
messageId: string;
|
|
194
|
+
chatId: string;
|
|
195
|
+
chatType: "p2p" | "group" | "topic_group" | string;
|
|
196
|
+
messageType: string;
|
|
197
|
+
senderOpenId: string;
|
|
198
|
+
senderName?: string;
|
|
199
|
+
chatName?: string;
|
|
200
|
+
larkGroupId?: string;
|
|
201
|
+
larkThreadId?: string;
|
|
202
|
+
larkRootMessageId?: string;
|
|
203
|
+
larkParentMessageId?: string;
|
|
204
|
+
mentions?: IncomingLarkMention[];
|
|
205
|
+
resources?: IncomingLarkMessageResource[];
|
|
206
|
+
downloadedFiles?: DownloadedLarkFile[];
|
|
207
|
+
rawForCodex?: boolean;
|
|
208
|
+
text: string;
|
|
209
|
+
createTime?: number;
|
|
210
|
+
raw: unknown;
|
|
211
|
+
}
|
|
212
|
+
export interface IncomingLarkMention {
|
|
213
|
+
key: string;
|
|
214
|
+
openId?: string;
|
|
215
|
+
userId?: string;
|
|
216
|
+
unionId?: string;
|
|
217
|
+
name?: string;
|
|
218
|
+
}
|
|
219
|
+
export interface IncomingLarkMessageRecall {
|
|
220
|
+
eventId: string;
|
|
221
|
+
messageId: string;
|
|
222
|
+
chatId?: string;
|
|
223
|
+
recallTime?: number;
|
|
224
|
+
raw: unknown;
|
|
225
|
+
}
|
|
226
|
+
export type LarkBotMenuActionKey = "stop" | "new" | "queue" | "status" | "help" | "new_session";
|
|
227
|
+
export interface IncomingLarkBotMenuAction {
|
|
228
|
+
eventId: string;
|
|
229
|
+
eventKey: string;
|
|
230
|
+
action: LarkBotMenuActionKey;
|
|
231
|
+
operatorOpenId: string;
|
|
232
|
+
operatorName?: string;
|
|
233
|
+
chatId?: string;
|
|
234
|
+
timestamp?: number;
|
|
235
|
+
raw: unknown;
|
|
236
|
+
}
|
|
237
|
+
export interface IncomingLarkCardAction {
|
|
238
|
+
eventId: string;
|
|
239
|
+
operatorOpenId: string;
|
|
240
|
+
openMessageId?: string;
|
|
241
|
+
openChatId?: string;
|
|
242
|
+
actionTag?: string;
|
|
243
|
+
actionValue: Record<string, unknown>;
|
|
244
|
+
formValue?: Record<string, unknown>;
|
|
245
|
+
raw: unknown;
|
|
246
|
+
}
|
|
247
|
+
export interface IncomingLarkMessageResource {
|
|
248
|
+
resourceType: "image" | "file";
|
|
249
|
+
fileKey: string;
|
|
250
|
+
fileName?: string;
|
|
251
|
+
codexTag?: "img" | "video" | "file";
|
|
252
|
+
textPlaceholder?: string;
|
|
253
|
+
}
|
|
254
|
+
export interface DownloadedLarkFile extends IncomingLarkMessageResource {
|
|
255
|
+
path: string;
|
|
256
|
+
size: number;
|
|
257
|
+
contentType?: string;
|
|
258
|
+
}
|
|
259
|
+
export interface LarkReactionHandle {
|
|
260
|
+
messageId: string;
|
|
261
|
+
reactionId: string;
|
|
262
|
+
}
|
|
263
|
+
export interface CodexTurnRequest {
|
|
264
|
+
threadId: string;
|
|
265
|
+
input: string;
|
|
266
|
+
cwd: string;
|
|
267
|
+
profile: ProfileName;
|
|
268
|
+
}
|
|
269
|
+
export interface CodexTurnResult {
|
|
270
|
+
threadId: string;
|
|
271
|
+
turnId?: string;
|
|
272
|
+
text: string;
|
|
273
|
+
status: "completed" | "failed" | "interrupted";
|
|
274
|
+
error?: string;
|
|
275
|
+
durationMs?: number;
|
|
276
|
+
generatedImages?: CodexImageGeneration[];
|
|
277
|
+
}
|
|
278
|
+
export interface CodexRequestUserInputOption {
|
|
279
|
+
label: string;
|
|
280
|
+
description: string;
|
|
281
|
+
}
|
|
282
|
+
export interface CodexRequestUserInputQuestion {
|
|
283
|
+
id: string;
|
|
284
|
+
header: string;
|
|
285
|
+
question: string;
|
|
286
|
+
isOther: boolean;
|
|
287
|
+
isSecret: boolean;
|
|
288
|
+
options: CodexRequestUserInputOption[] | null;
|
|
289
|
+
}
|
|
290
|
+
export interface CodexRequestUserInputParams {
|
|
291
|
+
threadId: string;
|
|
292
|
+
turnId: string;
|
|
293
|
+
itemId: string;
|
|
294
|
+
questions: CodexRequestUserInputQuestion[];
|
|
295
|
+
}
|
|
296
|
+
export interface CodexRequestUserInputAnswer {
|
|
297
|
+
answers: string[];
|
|
298
|
+
}
|
|
299
|
+
export interface CodexRequestUserInputResponse {
|
|
300
|
+
answers: Record<string, CodexRequestUserInputAnswer | undefined>;
|
|
301
|
+
}
|
|
302
|
+
export interface CodexRequestUserInputRequest {
|
|
303
|
+
requestId: string | number;
|
|
304
|
+
params: CodexRequestUserInputParams;
|
|
305
|
+
}
|
|
306
|
+
export interface CodexPlanStep {
|
|
307
|
+
step: string;
|
|
308
|
+
status: "pending" | "inProgress" | "completed";
|
|
309
|
+
}
|
|
310
|
+
export interface CodexPlanUpdate {
|
|
311
|
+
threadId: string;
|
|
312
|
+
turnId: string;
|
|
313
|
+
explanation: string | null;
|
|
314
|
+
plan: CodexPlanStep[];
|
|
315
|
+
}
|
|
316
|
+
export interface CodexThreadTokenUsageUpdate {
|
|
317
|
+
threadId: string;
|
|
318
|
+
turnId?: string;
|
|
319
|
+
totalTokens: number;
|
|
320
|
+
raw: unknown;
|
|
321
|
+
}
|
|
322
|
+
export interface HealthCheck {
|
|
323
|
+
name: string;
|
|
324
|
+
ok: boolean;
|
|
325
|
+
detail?: string;
|
|
326
|
+
}
|
|
327
|
+
export interface HealthSnapshot {
|
|
328
|
+
ok: boolean;
|
|
329
|
+
checks: HealthCheck[];
|
|
330
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const HOST_PROFILE_NAME = "host";
|
|
2
|
+
export const GUEST_PROFILE_NAME = "guest";
|
|
3
|
+
export const NONE_PROFILE_NAME = "none";
|
|
4
|
+
export const DEFAULT_LARK_WORKING_REACTION = "Typing";
|
|
5
|
+
export const DEFAULT_LARK_COMPLETED_REACTION = "DONE";
|
|
6
|
+
export const DEFAULT_LARK_QUEUED_REACTION = "OneSecond";
|
|
7
|
+
export const DEFAULT_LARK_MAX_MESSAGE_AGE_SECONDS = 60;
|
|
8
|
+
export const DEFAULT_LARK_MESSAGE_REDACTION_STRATEGY = "mask";
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAoExC,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAQ,CAAC;AACtD,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC;AACtD,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAC;AACxD,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,uCAAuC,GAAiC,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TWINNY_VERSION: string;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const TWINNY_VERSION = "0.0.0-dev.260525150705";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RuntimePaths } from "../types.js";
|
|
2
|
+
export interface WorkspaceManagerOptions {
|
|
3
|
+
workspacesDir: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class WorkspaceManager {
|
|
6
|
+
readonly workspacesDir: string;
|
|
7
|
+
constructor(options: WorkspaceManagerOptions);
|
|
8
|
+
static fromTwinnyHome(twinnyHome: string): WorkspaceManager;
|
|
9
|
+
static fromRuntimePaths(paths: Pick<RuntimePaths, "workspacesDir">): WorkspaceManager;
|
|
10
|
+
getWorkspacePath(conversationKey: string): string;
|
|
11
|
+
ensureWorkspace(conversationKey: string): string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getWorkspacePath(twinnyHome: string, conversationKey: string): string;
|
|
14
|
+
export declare function ensureWorkspace(twinnyHome: string, conversationKey: string): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { TwinnyError } from "../errors.js";
|
|
4
|
+
import { assertValidConversationKey } from "./slug.js";
|
|
5
|
+
export class WorkspaceManager {
|
|
6
|
+
workspacesDir;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.workspacesDir = path.resolve(options.workspacesDir);
|
|
9
|
+
}
|
|
10
|
+
static fromTwinnyHome(twinnyHome) {
|
|
11
|
+
return new WorkspaceManager({ workspacesDir: path.join(twinnyHome, "workspaces") });
|
|
12
|
+
}
|
|
13
|
+
static fromRuntimePaths(paths) {
|
|
14
|
+
return new WorkspaceManager({ workspacesDir: paths.workspacesDir });
|
|
15
|
+
}
|
|
16
|
+
getWorkspacePath(conversationKey) {
|
|
17
|
+
assertValidConversationKey(conversationKey);
|
|
18
|
+
const workspace = path.resolve(this.workspacesDir, conversationKey);
|
|
19
|
+
assertPathInside(this.workspacesDir, workspace);
|
|
20
|
+
return workspace;
|
|
21
|
+
}
|
|
22
|
+
ensureWorkspace(conversationKey) {
|
|
23
|
+
const workspace = this.getWorkspacePath(conversationKey);
|
|
24
|
+
ensureDirectory(this.workspacesDir, "workspacesDir");
|
|
25
|
+
ensureDirectory(workspace, "workspace");
|
|
26
|
+
return workspace;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function getWorkspacePath(twinnyHome, conversationKey) {
|
|
30
|
+
return WorkspaceManager.fromTwinnyHome(twinnyHome).getWorkspacePath(conversationKey);
|
|
31
|
+
}
|
|
32
|
+
export function ensureWorkspace(twinnyHome, conversationKey) {
|
|
33
|
+
return WorkspaceManager.fromTwinnyHome(twinnyHome).ensureWorkspace(conversationKey);
|
|
34
|
+
}
|
|
35
|
+
function ensureDirectory(directory, field) {
|
|
36
|
+
const existing = safeLstat(directory);
|
|
37
|
+
if (existing) {
|
|
38
|
+
if (existing.isSymbolicLink()) {
|
|
39
|
+
throw new TwinnyError(`${field} must not be a symbolic link`, "WORKSPACE_SYMLINK");
|
|
40
|
+
}
|
|
41
|
+
if (!existing.isDirectory()) {
|
|
42
|
+
throw new TwinnyError(`${field} must be a directory`, "WORKSPACE_PATH_NOT_DIRECTORY");
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
fs.mkdirSync(directory, { recursive: true });
|
|
47
|
+
const created = fs.lstatSync(directory);
|
|
48
|
+
if (created.isSymbolicLink() || !created.isDirectory()) {
|
|
49
|
+
throw new TwinnyError(`${field} must be a real directory`, "WORKSPACE_PATH_INVALID");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function safeLstat(target) {
|
|
53
|
+
try {
|
|
54
|
+
return fs.lstatSync(target);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function assertPathInside(root, child) {
|
|
64
|
+
const relative = path.relative(root, child);
|
|
65
|
+
if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
66
|
+
throw new TwinnyError("Workspace path escaped the workspaces directory", "WORKSPACE_PATH_ESCAPE");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/workspace/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAMvD,MAAM,OAAO,gBAAgB;IAClB,aAAa,CAAS;IAE/B,YAAY,OAAgC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,UAAkB;QACtC,OAAO,IAAI,gBAAgB,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,KAA0C;QAChE,OAAO,IAAI,gBAAgB,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,gBAAgB,CAAC,eAAuB;QACtC,0BAA0B,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACpE,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,eAAuB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACzD,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACrD,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,eAAuB;IAC1E,OAAO,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,eAAuB;IACzE,OAAO,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB,EAAE,KAAa;IACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,WAAW,CAAC,GAAG,KAAK,8BAA8B,EAAE,mBAAmB,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,WAAW,CAAC,GAAG,KAAK,sBAAsB,EAAE,8BAA8B,CAAC,CAAC;QACxF,CAAC;QACD,OAAO;IACT,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,WAAW,CAAC,GAAG,KAAK,2BAA2B,EAAE,wBAAwB,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,WAAW,CAAC,iDAAiD,EAAE,uBAAuB,CAAC,CAAC;IACpG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const p2pConversationKeyPrefix = "p2p_";
|
|
2
|
+
export declare const groupConversationKeyPrefix = "group_";
|
|
3
|
+
export declare function createP2PConversationKey(chatId: string): string;
|
|
4
|
+
export declare function createGroupConversationKey(chatId: string): string;
|
|
5
|
+
export declare function getP2PChatIdFromConversationKey(conversationKey: string): string;
|
|
6
|
+
export declare function getGroupChatIdFromConversationKey(conversationKey: string): string;
|
|
7
|
+
export declare function assertValidConversationKey(conversationKey: string): void;
|
|
8
|
+
export declare function isValidConversationKey(conversationKey: string): boolean;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TwinnyError } from "../errors.js";
|
|
2
|
+
export const p2pConversationKeyPrefix = "p2p_";
|
|
3
|
+
export const groupConversationKeyPrefix = "group_";
|
|
4
|
+
export function createP2PConversationKey(chatId) {
|
|
5
|
+
assertSafePathSegment(chatId, "chatId");
|
|
6
|
+
return `${p2pConversationKeyPrefix}${chatId}`;
|
|
7
|
+
}
|
|
8
|
+
export function createGroupConversationKey(chatId) {
|
|
9
|
+
assertSafePathSegment(chatId, "chatId");
|
|
10
|
+
return `${groupConversationKeyPrefix}${chatId}`;
|
|
11
|
+
}
|
|
12
|
+
export function getP2PChatIdFromConversationKey(conversationKey) {
|
|
13
|
+
assertValidConversationKey(conversationKey);
|
|
14
|
+
if (!conversationKey.startsWith(p2pConversationKeyPrefix)) {
|
|
15
|
+
throw new TwinnyError(`conversationKey must start with ${p2pConversationKeyPrefix}`, "CONVERSATION_KEY_INVALID");
|
|
16
|
+
}
|
|
17
|
+
return conversationKey.slice(p2pConversationKeyPrefix.length);
|
|
18
|
+
}
|
|
19
|
+
export function getGroupChatIdFromConversationKey(conversationKey) {
|
|
20
|
+
assertValidConversationKey(conversationKey);
|
|
21
|
+
if (!conversationKey.startsWith(groupConversationKeyPrefix)) {
|
|
22
|
+
throw new TwinnyError(`conversationKey must start with ${groupConversationKeyPrefix}`, "CONVERSATION_KEY_INVALID");
|
|
23
|
+
}
|
|
24
|
+
return conversationKey.slice(groupConversationKeyPrefix.length);
|
|
25
|
+
}
|
|
26
|
+
export function assertValidConversationKey(conversationKey) {
|
|
27
|
+
assertSafePathSegment(conversationKey, "conversationKey");
|
|
28
|
+
const prefix = conversationKey.startsWith(p2pConversationKeyPrefix)
|
|
29
|
+
? p2pConversationKeyPrefix
|
|
30
|
+
: conversationKey.startsWith(groupConversationKeyPrefix)
|
|
31
|
+
? groupConversationKeyPrefix
|
|
32
|
+
: undefined;
|
|
33
|
+
if (!prefix) {
|
|
34
|
+
throw new TwinnyError(`conversationKey must start with ${p2pConversationKeyPrefix} or ${groupConversationKeyPrefix}`, "CONVERSATION_KEY_INVALID");
|
|
35
|
+
}
|
|
36
|
+
const chatId = conversationKey.slice(prefix.length);
|
|
37
|
+
assertSafePathSegment(chatId, "chatId");
|
|
38
|
+
}
|
|
39
|
+
export function isValidConversationKey(conversationKey) {
|
|
40
|
+
try {
|
|
41
|
+
assertValidConversationKey(conversationKey);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function assertSafePathSegment(value, field) {
|
|
49
|
+
if (value.length === 0) {
|
|
50
|
+
throw new TwinnyError(`${field} must not be empty`, "WORKSPACE_KEY_EMPTY");
|
|
51
|
+
}
|
|
52
|
+
if (value.includes("/") || value.includes("\\")) {
|
|
53
|
+
throw new TwinnyError(`${field} must not contain slashes`, "WORKSPACE_KEY_SLASH");
|
|
54
|
+
}
|
|
55
|
+
if (value === "." || value.includes("..")) {
|
|
56
|
+
throw new TwinnyError(`${field} must not contain dot traversal`, "WORKSPACE_KEY_DOT_SEGMENT");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/workspace/slug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
CREATE TABLE conversations (
|
|
2
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
3
|
+
conversation_key TEXT NOT NULL UNIQUE,
|
|
4
|
+
type TEXT NOT NULL,
|
|
5
|
+
chat_id TEXT NOT NULL,
|
|
6
|
+
name TEXT NOT NULL,
|
|
7
|
+
profile TEXT NOT NULL,
|
|
8
|
+
thread_id TEXT NOT NULL,
|
|
9
|
+
workspace TEXT NOT NULL,
|
|
10
|
+
profile_codex_home TEXT NOT NULL,
|
|
11
|
+
created_at INTEGER NOT NULL,
|
|
12
|
+
updated_at INTEGER NOT NULL,
|
|
13
|
+
response_mode TEXT NOT NULL DEFAULT 'all'
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE INDEX idx_conversations_type_chat_id ON conversations(type, chat_id);
|
|
17
|
+
CREATE INDEX idx_conversations_thread_id ON conversations(thread_id);
|
|
18
|
+
CREATE INDEX idx_conversations_profile ON conversations(profile);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE threads (
|
|
21
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
22
|
+
thread_id TEXT NOT NULL UNIQUE,
|
|
23
|
+
conversation_key TEXT NOT NULL,
|
|
24
|
+
lark_thread_id TEXT,
|
|
25
|
+
profile TEXT NOT NULL,
|
|
26
|
+
forked_from_thread_id TEXT,
|
|
27
|
+
forked_at INTEGER,
|
|
28
|
+
total_tokens INTEGER NOT NULL DEFAULT 0,
|
|
29
|
+
token_usage_json TEXT NOT NULL DEFAULT '{}',
|
|
30
|
+
created_at INTEGER NOT NULL,
|
|
31
|
+
updated_at INTEGER NOT NULL,
|
|
32
|
+
creator_open_id TEXT,
|
|
33
|
+
card_message_id TEXT,
|
|
34
|
+
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
35
|
+
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
36
|
+
cached_input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
37
|
+
reasoning_output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
38
|
+
context_tokens INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
context_window INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
thread_has_rollout INTEGER NOT NULL DEFAULT 1,
|
|
41
|
+
mode TEXT NOT NULL DEFAULT 'default' CHECK(mode IN ('default', 'plan')),
|
|
42
|
+
status TEXT NOT NULL DEFAULT 'idle' CHECK(status IN ('idle', 'working', 'waiting')),
|
|
43
|
+
name TEXT NOT NULL DEFAULT '新会话',
|
|
44
|
+
goal_status TEXT NOT NULL DEFAULT 'none' CHECK(goal_status IN ('none', 'active', 'paused', 'blocked', 'usageLimited', 'budgetLimited', 'complete')),
|
|
45
|
+
goal_updated_at INTEGER,
|
|
46
|
+
model TEXT,
|
|
47
|
+
effort TEXT
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE INDEX idx_threads_conversation_key ON threads(conversation_key);
|
|
51
|
+
CREATE UNIQUE INDEX idx_threads_conversation_lark_thread
|
|
52
|
+
ON threads(conversation_key, lark_thread_id)
|
|
53
|
+
WHERE lark_thread_id IS NOT NULL;
|
|
54
|
+
|
|
55
|
+
CREATE TABLE lark_messages (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
lark_message_id TEXT,
|
|
58
|
+
event_id TEXT NOT NULL,
|
|
59
|
+
lark_user_id TEXT NOT NULL,
|
|
60
|
+
lark_group_id TEXT,
|
|
61
|
+
lark_thread_id TEXT,
|
|
62
|
+
conversation_key TEXT,
|
|
63
|
+
thread_id TEXT,
|
|
64
|
+
codex_turn_id TEXT,
|
|
65
|
+
route_kind TEXT NOT NULL,
|
|
66
|
+
status TEXT NOT NULL,
|
|
67
|
+
text TEXT NOT NULL,
|
|
68
|
+
lark_create_time INTEGER,
|
|
69
|
+
received_at INTEGER NOT NULL,
|
|
70
|
+
updated_at INTEGER NOT NULL,
|
|
71
|
+
processing_started_at INTEGER,
|
|
72
|
+
completed_at INTEGER,
|
|
73
|
+
failed_at INTEGER,
|
|
74
|
+
cleared_at INTEGER,
|
|
75
|
+
raw_event_json TEXT,
|
|
76
|
+
side_id INTEGER,
|
|
77
|
+
agent_card_message_id TEXT,
|
|
78
|
+
input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
79
|
+
output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
cached_input_tokens INTEGER NOT NULL DEFAULT 0,
|
|
81
|
+
reasoning_output_tokens INTEGER NOT NULL DEFAULT 0,
|
|
82
|
+
token_usage_json TEXT NOT NULL DEFAULT '{}'
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
CREATE UNIQUE INDEX idx_lark_messages_event_id
|
|
86
|
+
ON lark_messages(event_id);
|
|
87
|
+
CREATE UNIQUE INDEX idx_lark_messages_lark_message_id
|
|
88
|
+
ON lark_messages(lark_message_id)
|
|
89
|
+
WHERE lark_message_id IS NOT NULL;
|
|
90
|
+
CREATE INDEX idx_lark_messages_conversation_route
|
|
91
|
+
ON lark_messages(conversation_key, route_kind);
|
|
92
|
+
CREATE INDEX idx_lark_messages_conversation_turn
|
|
93
|
+
ON lark_messages(conversation_key, thread_id, codex_turn_id, processing_started_at)
|
|
94
|
+
WHERE thread_id IS NOT NULL
|
|
95
|
+
AND codex_turn_id IS NOT NULL
|
|
96
|
+
AND processing_started_at IS NOT NULL
|
|
97
|
+
AND route_kind <> 'side_message';
|
|
98
|
+
CREATE UNIQUE INDEX idx_lark_messages_card_action_event_id
|
|
99
|
+
ON lark_messages(event_id)
|
|
100
|
+
WHERE route_kind = 'card_action';
|
|
101
|
+
CREATE INDEX idx_lark_messages_thread_turn
|
|
102
|
+
ON lark_messages(thread_id, codex_turn_id);
|