@foxden-app/foxclaw 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +22 -0
  3. package/README.md +244 -0
  4. package/README_EN.md +244 -0
  5. package/dist/channels/bridge_messaging_router.d.ts +27 -0
  6. package/dist/channels/bridge_messaging_router.js +85 -0
  7. package/dist/channels/telegram/telegram_channel_adapter.d.ts +12 -0
  8. package/dist/channels/telegram/telegram_channel_adapter.js +21 -0
  9. package/dist/channels/telegram/telegram_messaging_port.d.ts +25 -0
  10. package/dist/channels/telegram/telegram_messaging_port.js +51 -0
  11. package/dist/channels/weixin/account_store.d.ts +15 -0
  12. package/dist/channels/weixin/account_store.js +54 -0
  13. package/dist/channels/weixin/ilink/aes_ecb.d.ts +3 -0
  14. package/dist/channels/weixin/ilink/aes_ecb.js +12 -0
  15. package/dist/channels/weixin/ilink/api.d.ts +44 -0
  16. package/dist/channels/weixin/ilink/api.js +187 -0
  17. package/dist/channels/weixin/ilink/cdn_upload.d.ts +11 -0
  18. package/dist/channels/weixin/ilink/cdn_upload.js +60 -0
  19. package/dist/channels/weixin/ilink/cdn_url.d.ts +7 -0
  20. package/dist/channels/weixin/ilink/cdn_url.js +7 -0
  21. package/dist/channels/weixin/ilink/constants.d.ts +7 -0
  22. package/dist/channels/weixin/ilink/constants.js +27 -0
  23. package/dist/channels/weixin/ilink/context.d.ts +13 -0
  24. package/dist/channels/weixin/ilink/context.js +13 -0
  25. package/dist/channels/weixin/ilink/login_qr.d.ts +34 -0
  26. package/dist/channels/weixin/ilink/login_qr.js +233 -0
  27. package/dist/channels/weixin/ilink/media_image.d.ts +11 -0
  28. package/dist/channels/weixin/ilink/media_image.js +44 -0
  29. package/dist/channels/weixin/ilink/mime.d.ts +3 -0
  30. package/dist/channels/weixin/ilink/mime.js +36 -0
  31. package/dist/channels/weixin/ilink/pic_decrypt.d.ts +2 -0
  32. package/dist/channels/weixin/ilink/pic_decrypt.js +56 -0
  33. package/dist/channels/weixin/ilink/random.d.ts +2 -0
  34. package/dist/channels/weixin/ilink/random.js +7 -0
  35. package/dist/channels/weixin/ilink/redact.d.ts +4 -0
  36. package/dist/channels/weixin/ilink/redact.js +34 -0
  37. package/dist/channels/weixin/ilink/runtime_attach.d.ts +3 -0
  38. package/dist/channels/weixin/ilink/runtime_attach.js +13 -0
  39. package/dist/channels/weixin/ilink/send.d.ts +21 -0
  40. package/dist/channels/weixin/ilink/send.js +108 -0
  41. package/dist/channels/weixin/ilink/session_guard.d.ts +6 -0
  42. package/dist/channels/weixin/ilink/session_guard.js +39 -0
  43. package/dist/channels/weixin/ilink/types.d.ts +155 -0
  44. package/dist/channels/weixin/ilink/types.js +10 -0
  45. package/dist/channels/weixin/ilink/upload.d.ts +15 -0
  46. package/dist/channels/weixin/ilink/upload.js +75 -0
  47. package/dist/channels/weixin/sync_buf_store.d.ts +3 -0
  48. package/dist/channels/weixin/sync_buf_store.js +19 -0
  49. package/dist/channels/weixin/weixin_channel_adapter.d.ts +18 -0
  50. package/dist/channels/weixin/weixin_channel_adapter.js +273 -0
  51. package/dist/channels/weixin/weixin_messaging_port.d.ts +29 -0
  52. package/dist/channels/weixin/weixin_messaging_port.js +113 -0
  53. package/dist/codex_app/client.d.ts +176 -0
  54. package/dist/codex_app/client.js +1230 -0
  55. package/dist/codex_app/deeplink.d.ts +7 -0
  56. package/dist/codex_app/deeplink.js +29 -0
  57. package/dist/codex_app/local_usage.d.ts +16 -0
  58. package/dist/codex_app/local_usage.js +123 -0
  59. package/dist/config.d.ts +44 -0
  60. package/dist/config.js +131 -0
  61. package/dist/controller/access.d.ts +11 -0
  62. package/dist/controller/access.js +33 -0
  63. package/dist/controller/activity.d.ts +62 -0
  64. package/dist/controller/activity.js +330 -0
  65. package/dist/controller/commands.d.ts +6 -0
  66. package/dist/controller/commands.js +17 -0
  67. package/dist/controller/controller.d.ts +326 -0
  68. package/dist/controller/controller.js +7503 -0
  69. package/dist/controller/observer.d.ts +16 -0
  70. package/dist/controller/observer.js +98 -0
  71. package/dist/controller/presentation.d.ts +80 -0
  72. package/dist/controller/presentation.js +568 -0
  73. package/dist/controller/service_tier.d.ts +9 -0
  74. package/dist/controller/service_tier.js +32 -0
  75. package/dist/controller/session_observer.d.ts +22 -0
  76. package/dist/controller/session_observer.js +259 -0
  77. package/dist/controller/status.d.ts +10 -0
  78. package/dist/controller/status.js +28 -0
  79. package/dist/core/bridge_scope.d.ts +18 -0
  80. package/dist/core/bridge_scope.js +46 -0
  81. package/dist/core/channel_port.d.ts +15 -0
  82. package/dist/core/channel_port.js +1 -0
  83. package/dist/i18n.d.ts +1108 -0
  84. package/dist/i18n.js +1154 -0
  85. package/dist/lock.d.ts +7 -0
  86. package/dist/lock.js +80 -0
  87. package/dist/logger.d.ts +12 -0
  88. package/dist/logger.js +57 -0
  89. package/dist/main.d.ts +2 -0
  90. package/dist/main.js +236 -0
  91. package/dist/runtime.d.ts +3 -0
  92. package/dist/runtime.js +14 -0
  93. package/dist/store/database.d.ts +79 -0
  94. package/dist/store/database.js +489 -0
  95. package/dist/store/migrate_bridge_scope.d.ts +6 -0
  96. package/dist/store/migrate_bridge_scope.js +59 -0
  97. package/dist/telegram/addressing.d.ts +33 -0
  98. package/dist/telegram/addressing.js +57 -0
  99. package/dist/telegram/api.d.ts +14 -0
  100. package/dist/telegram/api.js +89 -0
  101. package/dist/telegram/gateway.d.ts +76 -0
  102. package/dist/telegram/gateway.js +383 -0
  103. package/dist/telegram/media.d.ts +34 -0
  104. package/dist/telegram/media.js +180 -0
  105. package/dist/telegram/rendering.d.ts +10 -0
  106. package/dist/telegram/rendering.js +21 -0
  107. package/dist/telegram/scope.d.ts +6 -0
  108. package/dist/telegram/scope.js +24 -0
  109. package/dist/telegram/text.d.ts +7 -0
  110. package/dist/telegram/text.js +47 -0
  111. package/dist/types.d.ts +343 -0
  112. package/dist/types.js +1 -0
  113. package/docs/agent-assisted-install.md +84 -0
  114. package/docs/install-for-beginners.md +287 -0
  115. package/docs/troubleshooting.md +239 -0
  116. package/package.json +62 -0
  117. package/scripts/doctor.sh +3 -0
  118. package/scripts/launchd/install.sh +54 -0
  119. package/scripts/status.sh +3 -0
  120. package/scripts/systemd/install.sh +83 -0
  121. package/scripts/systemd/uninstall.sh +15 -0
  122. package/skills/foxclaw/SKILL.md +167 -0
  123. package/skills/foxclaw/agents/openai.yaml +4 -0
  124. package/skills/foxclaw/references/telegram-setup.md +93 -0
  125. package/skills/foxclaw/scripts/bootstrap_host.py +350 -0
  126. package/skills/foxclaw/scripts/bootstrap_remote.py +67 -0
@@ -0,0 +1,330 @@
1
+ export function normalizeTurnActivityEvent(notification) {
2
+ switch (notification.method) {
3
+ case 'item/started':
4
+ return normalizeStartedEvent(notification.params);
5
+ case 'item/agentMessage/delta':
6
+ return normalizeAgentDeltaEvent(notification.params);
7
+ case 'item/plan/delta':
8
+ return normalizePlanDeltaEvent(notification.params);
9
+ case 'item/completed':
10
+ return normalizeCompletedEvent(notification.params);
11
+ case 'turn/plan/updated':
12
+ return normalizePlanUpdatedEvent(notification.params);
13
+ case 'codex/event/exec_command_begin':
14
+ return normalizeToolEvent(notification.params, 'tool_started');
15
+ case 'codex/event/exec_command_end':
16
+ return normalizeToolEvent(notification.params, 'tool_completed');
17
+ case 'turn/completed': {
18
+ const turnId = extractTurnId(notification.params);
19
+ if (!turnId)
20
+ return null;
21
+ return {
22
+ kind: 'turn_completed',
23
+ turnId,
24
+ state: 'completed',
25
+ };
26
+ }
27
+ case 'turn/interrupted':
28
+ case 'turn/aborted': {
29
+ const turnId = extractTurnId(notification.params);
30
+ if (!turnId)
31
+ return null;
32
+ return {
33
+ kind: 'turn_completed',
34
+ turnId,
35
+ state: 'interrupted',
36
+ };
37
+ }
38
+ default:
39
+ return null;
40
+ }
41
+ }
42
+ function normalizeStartedEvent(params) {
43
+ const turnId = extractTurnId(params);
44
+ if (!turnId)
45
+ return null;
46
+ const item = params?.item;
47
+ const itemType = normalizeEventItemType(item);
48
+ if (itemType === 'reasoning') {
49
+ return {
50
+ kind: 'reasoning_started',
51
+ turnId,
52
+ state: 'thinking',
53
+ };
54
+ }
55
+ if (!isRelayableTextItemType(itemType)) {
56
+ return null;
57
+ }
58
+ const itemId = extractItemId(item);
59
+ if (!itemId)
60
+ return null;
61
+ const phase = itemType === 'plan' ? 'commentary' : extractAgentPhase(item);
62
+ return {
63
+ kind: 'agent_message_started',
64
+ turnId,
65
+ itemId,
66
+ phase,
67
+ outputKind: outputKindForItemType(itemType, phase, false),
68
+ isPlan: itemType === 'plan',
69
+ };
70
+ }
71
+ function normalizeAgentDeltaEvent(params) {
72
+ const turnId = extractTurnId(params);
73
+ const delta = extractAgentDeltaText(params);
74
+ const itemId = extractItemId(params);
75
+ if (!turnId || !delta || !itemId) {
76
+ return null;
77
+ }
78
+ const phase = extractAgentPhase(params);
79
+ return {
80
+ kind: 'agent_message_delta',
81
+ turnId,
82
+ itemId,
83
+ delta,
84
+ outputKind: classifyAgentOutput(phase, false),
85
+ };
86
+ }
87
+ function normalizePlanDeltaEvent(params) {
88
+ const turnId = extractTurnId(params);
89
+ const delta = extractAgentDeltaText(params);
90
+ const itemId = extractItemId(params);
91
+ if (!turnId || !delta || !itemId) {
92
+ return null;
93
+ }
94
+ return {
95
+ kind: 'agent_message_delta',
96
+ turnId,
97
+ itemId,
98
+ delta,
99
+ outputKind: 'commentary',
100
+ isPlan: true,
101
+ };
102
+ }
103
+ function normalizeCompletedEvent(params) {
104
+ const turnId = extractTurnId(params);
105
+ if (!turnId)
106
+ return null;
107
+ const item = params?.item;
108
+ const itemType = normalizeEventItemType(item);
109
+ if (itemType === 'reasoning') {
110
+ return {
111
+ kind: 'reasoning_completed',
112
+ turnId,
113
+ state: 'thinking',
114
+ };
115
+ }
116
+ if (!isRelayableTextItemType(itemType)) {
117
+ return null;
118
+ }
119
+ const itemId = extractItemId(item);
120
+ if (!itemId)
121
+ return null;
122
+ const phase = itemType === 'plan' ? 'commentary' : extractAgentPhase(item);
123
+ return {
124
+ kind: 'agent_message_completed',
125
+ turnId,
126
+ itemId,
127
+ phase,
128
+ text: extractCompletedAgentText(params),
129
+ outputKind: outputKindForItemType(itemType, phase, true),
130
+ isPlan: itemType === 'plan',
131
+ };
132
+ }
133
+ function normalizePlanUpdatedEvent(params) {
134
+ const turnId = extractTurnId(params);
135
+ if (!turnId) {
136
+ return null;
137
+ }
138
+ const text = formatPlanUpdateText(params);
139
+ if (!text) {
140
+ return null;
141
+ }
142
+ return {
143
+ kind: 'agent_message_completed',
144
+ turnId,
145
+ itemId: `${turnId}:plan`,
146
+ phase: 'commentary',
147
+ text,
148
+ outputKind: 'commentary',
149
+ isPlan: true,
150
+ };
151
+ }
152
+ function normalizeToolEvent(params, kind) {
153
+ const exec = extractRawExecCommandEvent(params);
154
+ if (!exec) {
155
+ return null;
156
+ }
157
+ return {
158
+ kind,
159
+ turnId: exec.turnId,
160
+ exec,
161
+ state: inferToolActivityState(exec),
162
+ };
163
+ }
164
+ export function classifyAgentOutput(phase, completed) {
165
+ if (!phase) {
166
+ return completed ? 'final_answer' : 'commentary';
167
+ }
168
+ const normalized = phase.replace(/[^a-z]/gi, '').toLowerCase();
169
+ if (normalized === 'final' || normalized === 'answer' || normalized === 'response') {
170
+ return 'final_answer';
171
+ }
172
+ return 'commentary';
173
+ }
174
+ export function inferToolActivityState(event) {
175
+ const parsedTypes = (event.parsedCmd ?? [])
176
+ .map((entry) => (typeof entry?.type === 'string' ? entry.type : ''))
177
+ .filter(Boolean);
178
+ if (parsedTypes.includes('search')) {
179
+ return 'searching';
180
+ }
181
+ if (parsedTypes.includes('read') || parsedTypes.includes('list_files')) {
182
+ return 'reading';
183
+ }
184
+ if (parsedTypes.some(type => ['write', 'edit', 'apply_patch', 'move', 'copy', 'delete', 'mkdir'].includes(type))) {
185
+ return 'editing';
186
+ }
187
+ return 'running_command';
188
+ }
189
+ function extractRawExecCommandEvent(params) {
190
+ const msg = params?.msg;
191
+ if (!msg || typeof msg !== 'object') {
192
+ return null;
193
+ }
194
+ const callId = typeof msg.call_id === 'string' ? msg.call_id : null;
195
+ const turnId = typeof msg.turn_id === 'string' ? msg.turn_id : null;
196
+ if (!callId || !turnId) {
197
+ return null;
198
+ }
199
+ return {
200
+ callId,
201
+ turnId,
202
+ command: Array.isArray(msg.command) ? msg.command.map((entry) => String(entry)) : [],
203
+ cwd: msg.cwd ? String(msg.cwd) : null,
204
+ parsedCmd: Array.isArray(msg.parsed_cmd) ? msg.parsed_cmd : [],
205
+ };
206
+ }
207
+ function extractTurnId(params) {
208
+ const candidates = [
209
+ params?.turnId,
210
+ params?.turn_id,
211
+ params?.turn?.id,
212
+ params?.turn?.turnId,
213
+ params?.item?.turnId,
214
+ params?.item?.turn_id,
215
+ ];
216
+ for (const candidate of candidates) {
217
+ if (candidate !== null && candidate !== undefined && String(candidate).trim()) {
218
+ return String(candidate);
219
+ }
220
+ }
221
+ return null;
222
+ }
223
+ function extractItemId(value) {
224
+ const candidates = [
225
+ value?.itemId,
226
+ value?.item_id,
227
+ value?.id,
228
+ value?.item?.id,
229
+ ];
230
+ for (const candidate of candidates) {
231
+ if (candidate !== null && candidate !== undefined && String(candidate).trim()) {
232
+ return String(candidate);
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+ function extractAgentPhase(value) {
238
+ const phase = value?.phase ?? value?.item?.phase ?? null;
239
+ return typeof phase === 'string' && phase.trim() ? phase : null;
240
+ }
241
+ function extractAgentDeltaText(params) {
242
+ const candidates = [
243
+ params?.delta,
244
+ params?.textDelta,
245
+ params?.contentDelta,
246
+ params?.text,
247
+ ];
248
+ for (const candidate of candidates) {
249
+ const text = extractTextCandidate(candidate);
250
+ if (text) {
251
+ return text;
252
+ }
253
+ }
254
+ return null;
255
+ }
256
+ function extractCompletedAgentText(params) {
257
+ const itemType = normalizeEventItemType(params?.item ?? params);
258
+ if (!isRelayableTextItemType(itemType)) {
259
+ return null;
260
+ }
261
+ const item = params?.item ?? params;
262
+ const directText = extractTextCandidate(item?.text)
263
+ ?? extractTextCandidate(item?.content)
264
+ ?? extractTextCandidate(item?.value);
265
+ if (directText !== null) {
266
+ return directText;
267
+ }
268
+ return '';
269
+ }
270
+ function isRelayableTextItemType(itemType) {
271
+ return itemType === 'agentmessage' || itemType === 'assistantmessage' || itemType === 'plan';
272
+ }
273
+ function outputKindForItemType(itemType, phase, completed) {
274
+ if (itemType === 'plan') {
275
+ return 'commentary';
276
+ }
277
+ return classifyAgentOutput(phase, completed);
278
+ }
279
+ function formatPlanUpdateText(params) {
280
+ const lines = [];
281
+ const explanation = extractTextCandidate(params?.explanation);
282
+ if (explanation) {
283
+ lines.push(explanation);
284
+ }
285
+ const plan = Array.isArray(params?.plan) ? params.plan : [];
286
+ for (const entry of plan) {
287
+ const step = extractTextCandidate(entry?.step);
288
+ if (!step) {
289
+ continue;
290
+ }
291
+ const status = typeof entry?.status === 'string' && entry.status ? ` [${entry.status}]` : '';
292
+ lines.push(`- ${step}${status}`);
293
+ }
294
+ return lines.join('\n').trim() || null;
295
+ }
296
+ function normalizeEventItemType(value) {
297
+ const raw = value?.type ?? value?.itemType ?? value?.item_type ?? value?.kind;
298
+ if (typeof raw !== 'string') {
299
+ return null;
300
+ }
301
+ return raw.replace(/[^a-z]/gi, '').toLowerCase();
302
+ }
303
+ function extractTextCandidate(value) {
304
+ if (typeof value === 'string') {
305
+ return value;
306
+ }
307
+ if (!value || typeof value !== 'object') {
308
+ return null;
309
+ }
310
+ for (const key of ['text', 'delta', 'content', 'value']) {
311
+ const candidate = value[key];
312
+ if (typeof candidate === 'string') {
313
+ return candidate;
314
+ }
315
+ }
316
+ for (const key of ['parts', 'segments', 'content']) {
317
+ const candidate = value[key];
318
+ if (!Array.isArray(candidate)) {
319
+ continue;
320
+ }
321
+ const text = candidate
322
+ .map((entry) => extractTextCandidate(entry))
323
+ .filter((entry) => entry !== null)
324
+ .join('');
325
+ if (text) {
326
+ return text;
327
+ }
328
+ }
329
+ return null;
330
+ }
@@ -0,0 +1,6 @@
1
+ export interface ParsedCommand {
2
+ name: string;
3
+ args: string[];
4
+ targetBot: string | null;
5
+ }
6
+ export declare function parseCommand(text: string): ParsedCommand | null;
@@ -0,0 +1,17 @@
1
+ export function parseCommand(text) {
2
+ if (!text.startsWith('/'))
3
+ return null;
4
+ const parts = text.trim().split(/\s+/);
5
+ const rawName = parts.shift();
6
+ if (!rawName)
7
+ return null;
8
+ const [namePart, targetPart] = rawName.slice(1).split('@', 2);
9
+ const name = (namePart ?? '').toLowerCase();
10
+ if (!name)
11
+ return null;
12
+ return {
13
+ name,
14
+ args: parts,
15
+ targetBot: targetPart ? targetPart.toLowerCase() : null,
16
+ };
17
+ }
@@ -0,0 +1,326 @@
1
+ import type { AppConfig } from '../config.js';
2
+ import type { Logger } from '../logger.js';
3
+ import type { BridgeStore } from '../store/database.js';
4
+ import type { RuntimeStatus } from '../types.js';
5
+ import type { TelegramGateway, TelegramTextEvent } from '../telegram/gateway.js';
6
+ import { BridgeMessagingRouter } from '../channels/bridge_messaging_router.js';
7
+ import type { CodexAppClient } from '../codex_app/client.js';
8
+ export declare class BridgeSessionCore {
9
+ private readonly config;
10
+ private readonly store;
11
+ private readonly logger;
12
+ private readonly bot;
13
+ private readonly app;
14
+ private activeTurns;
15
+ private activeTurnsByTurnId;
16
+ private observedThreadWatchers;
17
+ private queuedPrompts;
18
+ private pendingTurnErrors;
19
+ private pendingUserInputs;
20
+ private pendingMcpElicitations;
21
+ private pendingPlanImplementations;
22
+ private pendingLoginsByScope;
23
+ private pendingLoginScopesById;
24
+ private pendingAuthAddsByLoginId;
25
+ private latestTurnDiffs;
26
+ private threadTokenUsageAlerts;
27
+ private pendingAuthChoiceLists;
28
+ private pendingApprovalMessages;
29
+ private pendingAuthRotation;
30
+ private authRotationInProgress;
31
+ private authRotationFailedTargets;
32
+ private localUsageCache;
33
+ private lastRemoteControlStatus;
34
+ private pendingThreadRenames;
35
+ private pendingThreadNewCwds;
36
+ private recentCommandUsageByScope;
37
+ private commandUsageSequence;
38
+ private locks;
39
+ private approvalTimers;
40
+ private submittedUserInputTimers;
41
+ private attachedThreads;
42
+ private botUsername;
43
+ private lastError;
44
+ /** Last threads-panel pagination state per scope (Telegram inline nav + /open index alignment). */
45
+ private threadListPresentationState;
46
+ private readonly messaging;
47
+ constructor(config: AppConfig, store: BridgeStore, logger: Logger, bot: TelegramGateway, app: CodexAppClient, outbound: BridgeMessagingRouter);
48
+ /** Wire Telegram inbound events. Call before {@link startCodexApp}. */
49
+ registerTelegramInboundHandlers(): void;
50
+ /**
51
+ * Deliver an inbound user message through the same pipeline as Telegram `text` events
52
+ * (used by the Weixin adapter).
53
+ */
54
+ dispatchInboundLikeTelegramText(event: TelegramTextEvent): void;
55
+ /** Start Codex app-server transport and attach RPC listeners. */
56
+ startCodexApp(): Promise<void>;
57
+ /** Begin Telegram Bot API long-polling after handlers and Codex are ready. */
58
+ startTelegramPolling(): Promise<void>;
59
+ /** Telegram-only default startup (single channel). */
60
+ start(): Promise<void>;
61
+ stop(): Promise<void>;
62
+ getRuntimeStatus(): RuntimeStatus;
63
+ private handleText;
64
+ private handleCommand;
65
+ private buildHelpLines;
66
+ private rememberCommandUsage;
67
+ private sendNewThreadStartedMessage;
68
+ private handleWatchCommand;
69
+ private handleThreadArchiveIndexCommand;
70
+ private handleThreadRenameIndexCommand;
71
+ private handleCallback;
72
+ private handleApprovalTextCommand;
73
+ private handleNotification;
74
+ private handleServerRequest;
75
+ private sendApprovalRequestToThreadScopes;
76
+ private markApprovalResolvedForAllScopes;
77
+ private handleCodexErrorNotification;
78
+ private handleTurnStartedNotification;
79
+ private handleTurnDiffUpdated;
80
+ private handleThreadStatusChanged;
81
+ private handleThreadTokenUsageUpdated;
82
+ private handleThreadGoalNotification;
83
+ private handleMcpToolCallProgress;
84
+ private handleModelNotification;
85
+ private handleRemoteControlStatusChanged;
86
+ private shouldNotifyThreadTokenUsage;
87
+ private handleThreadLifecycleNotification;
88
+ private handleServerRequestResolved;
89
+ private handleAccountLoginCompleted;
90
+ private restorePendingAuthAdd;
91
+ private restoreAuthAfterAddFailure;
92
+ private handleAccountUpdated;
93
+ private handleRateLimitsUpdated;
94
+ private handleSkillsChangedNotification;
95
+ private handleAppListUpdated;
96
+ private handleMcpStartupStatusUpdated;
97
+ private handleMcpOauthLoginCompleted;
98
+ private handleBridgeWarningNotification;
99
+ private notifyBoundScopes;
100
+ private recordActiveTurnError;
101
+ private finishTerminalErroredActiveTurn;
102
+ private handleUserInputRequest;
103
+ private hasPendingUserInput;
104
+ private findPendingUserInputForScope;
105
+ private handleUserInputCallback;
106
+ private handleUserInputTextReply;
107
+ private handleUserInputAnswerCommand;
108
+ private refreshOrFinishUserInput;
109
+ private submitPendingUserInput;
110
+ private persistPendingUserInputAnswers;
111
+ private restorePendingUserInputs;
112
+ private restorePendingUserInputMessage;
113
+ private retireStalePendingUserInput;
114
+ private isPendingUserInputTurnLive;
115
+ private maybeSendPlanImplementationPrompt;
116
+ private findPendingPlanImplementation;
117
+ private clearPlanImplementationPromptsForScope;
118
+ private hasPendingUserInputForTurn;
119
+ private finalizeUserInputsForTurn;
120
+ private handlePlanImplementationCallback;
121
+ private handlePlanImplementationTextCommand;
122
+ private startPlanImplementationTurn;
123
+ private handleMcpElicitationRequest;
124
+ private hasPendingMcpElicitation;
125
+ private findPendingMcpElicitationForScope;
126
+ private handleMcpElicitationTextReply;
127
+ private handleMcpElicitationCallback;
128
+ private handleMcpElicitationTextCommand;
129
+ private createBinding;
130
+ private startTurnWithRecovery;
131
+ private buildTurnInput;
132
+ private resolveServiceTierForTurn;
133
+ private stageAttachments;
134
+ private registerActiveTurn;
135
+ private createActiveTurnState;
136
+ private setActiveTurn;
137
+ private getActiveTurn;
138
+ private getActiveTurnsForTurn;
139
+ private getPrimaryActiveTurnForTurn;
140
+ private hasAnyActiveTurnForTurn;
141
+ private deleteActiveTurn;
142
+ private deleteActiveTurnRecord;
143
+ private completeTurn;
144
+ private handleTurnActivityEvent;
145
+ private handleTurnActivityForActive;
146
+ private createApprovalRecord;
147
+ private createPermissionApprovalRecord;
148
+ private findChatByThread;
149
+ private findAllChatsByThread;
150
+ private scopeCanApproveThread;
151
+ private withLock;
152
+ private updateStatus;
153
+ private sendMessage;
154
+ private sendHtmlMessage;
155
+ private editMessage;
156
+ private editHtmlMessage;
157
+ private deleteMessage;
158
+ private sendTyping;
159
+ private sendObservedCliUserMessage;
160
+ private cleanupObservedTransientMessages;
161
+ private hasObservedPersistentReply;
162
+ private ensureThreadReady;
163
+ private handleAsyncError;
164
+ private armApprovalTimer;
165
+ private clearApprovalTimer;
166
+ private armSubmittedUserInputTimer;
167
+ private clearSubmittedUserInputTimer;
168
+ private notifySubmittedUserInputStillWaiting;
169
+ private expireApproval;
170
+ private tryRevealThread;
171
+ private bindCachedThread;
172
+ private resumeThreadForScope;
173
+ private setChatAccessPreset;
174
+ private clearAttachedThreadsForScope;
175
+ private storeThreadSession;
176
+ private resolveEffectiveAccess;
177
+ private localeForChat;
178
+ private findActiveTurn;
179
+ private clearObservedThreadWatchers;
180
+ private clearObservedTurnWatcher;
181
+ private stopWatchingScopeThread;
182
+ private forgetStaleActiveTurn;
183
+ private unwatchThread;
184
+ private watchThread;
185
+ private scheduleObservedThreadPoll;
186
+ private pollObservedThread;
187
+ private pollObservedSessionFile;
188
+ private ensureObservedActiveTurnState;
189
+ private applyObservedSessionEvents;
190
+ private applyObservedTurnSnapshot;
191
+ private handleTakeoverCommand;
192
+ private handleQueueCommand;
193
+ private handleActiveTurnInboundMessage;
194
+ private queuePromptAfterActiveTurn;
195
+ private steerActiveTurn;
196
+ private startQueuedPromptIfPresent;
197
+ private handleModeCommand;
198
+ private handleActiveTurnMessageModeCommand;
199
+ private handleGoalCommand;
200
+ private handleHistoryCommand;
201
+ private handleFilesCommand;
202
+ private handleRemoteCommand;
203
+ private handleFastCommand;
204
+ private setCollaborationMode;
205
+ private handleAuthReloadCommand;
206
+ private handleAuthCommand;
207
+ private handleAuthUseCommand;
208
+ private handleAuthToggleCommand;
209
+ private findLatestAuthChoiceList;
210
+ private handleAuthAddCommand;
211
+ private handleAccountCommand;
212
+ private handleQuotaCommand;
213
+ private handleQuotaNudgeCommand;
214
+ private handleLoginDeviceCommand;
215
+ private handleLoginCancelCommand;
216
+ private handleLogoutCommand;
217
+ private handleSteerCommand;
218
+ private handleForkCommand;
219
+ private handleRollbackCommand;
220
+ private handleRenameCommand;
221
+ private handleCompactCommand;
222
+ private handleArchiveCommand;
223
+ private handleUnarchiveCommand;
224
+ private handleReviewCommand;
225
+ private handleDiffCommand;
226
+ private handleLoadedCommand;
227
+ private handleSkillsCommand;
228
+ private handleSkillCommand;
229
+ private handleSkillConfigCommand;
230
+ private handleHooksCommand;
231
+ private handlePluginsCommand;
232
+ private handlePluginCommand;
233
+ private handlePluginSkillCommand;
234
+ private handleAppsCommand;
235
+ private handleFeaturesCommand;
236
+ private handleConfigCommand;
237
+ private handleRequirementsCommand;
238
+ private handleProviderCommand;
239
+ private handleMcpCommand;
240
+ private handleMcpReloadCommand;
241
+ private handleMcpLoginCommand;
242
+ private handleMcpResourceCommand;
243
+ private listSkillsForScope;
244
+ private requireReadyBinding;
245
+ private handleAuthPanelActionCallback;
246
+ private handleAuthToggleCallback;
247
+ private handleAuthSwitchCallback;
248
+ private maybeRunPendingAuthRotation;
249
+ private retryTurnAfterAuthRotation;
250
+ private selectNextCodexAuthCandidate;
251
+ private listCodexAuthState;
252
+ private switchCodexAuthAndRestart;
253
+ private buildNativeCollaborationMode;
254
+ private buildCodexUsageStatusLines;
255
+ private buildCodexLocalUsageStatusLines;
256
+ private resolveFastStatusLabel;
257
+ private readCachedCodexLocalUsageStats;
258
+ private handleModelCommand;
259
+ private handleEffortCommand;
260
+ private handleThreadOpenCallback;
261
+ private handleThreadActionCallback;
262
+ private handleThreadNewCallback;
263
+ private handleThreadNewCwdCallback;
264
+ private handleThreadNewCwdTextReply;
265
+ private startNewThreadForRequestedCwd;
266
+ private createAndBindNewThread;
267
+ private promptCreateMissingNewThreadCwd;
268
+ private createMissingCwdAndStartNewThread;
269
+ private finishThreadNewCwdConfirmation;
270
+ private inspectNewThreadCwd;
271
+ private handleThreadRenameTextReply;
272
+ private archiveThreadFromPanel;
273
+ private showThreadsPanelFromStoredState;
274
+ private handleTurnInterruptCallback;
275
+ private handleNavigationCallback;
276
+ private showWherePanel;
277
+ private handleThreadListNavigationCallback;
278
+ private showThreadsPanel;
279
+ private showModelSettingsPanel;
280
+ private showSetupPanel;
281
+ private showAccessSettingsPanel;
282
+ private handleSettingsCallback;
283
+ private handleSetupCallback;
284
+ private handleAccessSettingsCallback;
285
+ private refreshModelSettingsPanel;
286
+ private refreshSetupPanel;
287
+ private refreshAccessSettingsPanel;
288
+ private startBoundTurnFromEvent;
289
+ private requestInterrupt;
290
+ private queueTurnRender;
291
+ private syncTurnStatus;
292
+ private syncTurnStream;
293
+ private cleanupStaleTurnPreviews;
294
+ private recoverLiveTurnPreview;
295
+ private interruptOrphanWaitingUserInput;
296
+ private cleanupFinishedPreview;
297
+ private cleanupStaleInterruptButton;
298
+ private cleanupTransientPreview;
299
+ private abandonActiveTurns;
300
+ private releaseActiveTurnsForBridgeShutdown;
301
+ private retirePreviewMessage;
302
+ private forgetPreviewRecord;
303
+ private clearMessageButtons;
304
+ private sendDraft;
305
+ private renderActiveStatus;
306
+ private dismissTurnPreview;
307
+ private ensureStatusMessage;
308
+ private rebaseStatusMessage;
309
+ private archiveStatusMessage;
310
+ private noteToolCommandStart;
311
+ private noteToolCommandEnd;
312
+ private scheduleToolBatchArchive;
313
+ private promoteReadyToolBatch;
314
+ private clearToolBatchTimer;
315
+ private scheduleRenderRetry;
316
+ private clearRenderRetry;
317
+ private notePendingApprovalStatus;
318
+ private clearPendingApprovalStatus;
319
+ private syncDraftTurnStream;
320
+ private renderDraftStreamText;
321
+ private findStreamingSegment;
322
+ private findActiveTurnByThreadId;
323
+ private findActiveTurnsByThreadId;
324
+ private syncSegmentTimeline;
325
+ }
326
+ export { BridgeSessionCore as BridgeController };