@agentdeck/bridge 0.1.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 (93) hide show
  1. package/dist/adapters/claude-code.d.ts +38 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +184 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/index.d.ts +8 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +18 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/openclaw.d.ts +70 -0
  10. package/dist/adapters/openclaw.d.ts.map +1 -0
  11. package/dist/adapters/openclaw.js +664 -0
  12. package/dist/adapters/openclaw.js.map +1 -0
  13. package/dist/auth.d.ts +9 -0
  14. package/dist/auth.d.ts.map +1 -0
  15. package/dist/auth.js +64 -0
  16. package/dist/auth.js.map +1 -0
  17. package/dist/check-deps.d.ts +5 -0
  18. package/dist/check-deps.d.ts.map +1 -0
  19. package/dist/check-deps.js +47 -0
  20. package/dist/check-deps.js.map +1 -0
  21. package/dist/diag-analyzer.d.ts +29 -0
  22. package/dist/diag-analyzer.d.ts.map +1 -0
  23. package/dist/diag-analyzer.js +145 -0
  24. package/dist/diag-analyzer.js.map +1 -0
  25. package/dist/event-journal.d.ts +22 -0
  26. package/dist/event-journal.d.ts.map +1 -0
  27. package/dist/event-journal.js +117 -0
  28. package/dist/event-journal.js.map +1 -0
  29. package/dist/hook-server.d.ts +31 -0
  30. package/dist/hook-server.d.ts.map +1 -0
  31. package/dist/hook-server.js +260 -0
  32. package/dist/hook-server.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +796 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/logger.d.ts +11 -0
  38. package/dist/logger.d.ts.map +1 -0
  39. package/dist/logger.js +27 -0
  40. package/dist/logger.js.map +1 -0
  41. package/dist/mdns.d.ts +9 -0
  42. package/dist/mdns.d.ts.map +1 -0
  43. package/dist/mdns.js +44 -0
  44. package/dist/mdns.js.map +1 -0
  45. package/dist/model-catalog.d.ts +29 -0
  46. package/dist/model-catalog.d.ts.map +1 -0
  47. package/dist/model-catalog.js +91 -0
  48. package/dist/model-catalog.js.map +1 -0
  49. package/dist/output-parser.d.ts +65 -0
  50. package/dist/output-parser.d.ts.map +1 -0
  51. package/dist/output-parser.js +1089 -0
  52. package/dist/output-parser.js.map +1 -0
  53. package/dist/pty-manager.d.ts +14 -0
  54. package/dist/pty-manager.d.ts.map +1 -0
  55. package/dist/pty-manager.js +93 -0
  56. package/dist/pty-manager.js.map +1 -0
  57. package/dist/pty-ringbuffer.d.ts +23 -0
  58. package/dist/pty-ringbuffer.d.ts.map +1 -0
  59. package/dist/pty-ringbuffer.js +65 -0
  60. package/dist/pty-ringbuffer.js.map +1 -0
  61. package/dist/session-registry.d.ts +17 -0
  62. package/dist/session-registry.d.ts.map +1 -0
  63. package/dist/session-registry.js +107 -0
  64. package/dist/session-registry.js.map +1 -0
  65. package/dist/state-machine.d.ts +48 -0
  66. package/dist/state-machine.d.ts.map +1 -0
  67. package/dist/state-machine.js +470 -0
  68. package/dist/state-machine.js.map +1 -0
  69. package/dist/types.d.ts +28 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +4 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/usage-api.d.ts +16 -0
  74. package/dist/usage-api.d.ts.map +1 -0
  75. package/dist/usage-api.js +84 -0
  76. package/dist/usage-api.js.map +1 -0
  77. package/dist/usage-tracker.d.ts +24 -0
  78. package/dist/usage-tracker.d.ts.map +1 -0
  79. package/dist/usage-tracker.js +89 -0
  80. package/dist/usage-tracker.js.map +1 -0
  81. package/dist/voice.d.ts +27 -0
  82. package/dist/voice.d.ts.map +1 -0
  83. package/dist/voice.js +412 -0
  84. package/dist/voice.js.map +1 -0
  85. package/dist/whisper-server-manager.d.ts +19 -0
  86. package/dist/whisper-server-manager.d.ts.map +1 -0
  87. package/dist/whisper-server-manager.js +171 -0
  88. package/dist/whisper-server-manager.js.map +1 -0
  89. package/dist/ws-server.d.ts +18 -0
  90. package/dist/ws-server.d.ts.map +1 -0
  91. package/dist/ws-server.js +86 -0
  92. package/dist/ws-server.js.map +1 -0
  93. package/package.json +43 -0
@@ -0,0 +1,470 @@
1
+ import { EventEmitter } from 'events';
2
+ import { State, PermissionMode, STUCK_TIMEOUT_MS, transitions, } from './types.js';
3
+ import { debug } from './logger.js';
4
+ /** Extract the most useful field from tool_input for display on E4 */
5
+ function formatToolInput(toolName, input) {
6
+ if (!input || !toolName)
7
+ return null;
8
+ // Tool-specific key extraction
9
+ const keyMap = {
10
+ Bash: 'command',
11
+ Read: 'file_path',
12
+ Write: 'file_path',
13
+ Edit: 'file_path',
14
+ Glob: 'pattern',
15
+ Grep: 'pattern',
16
+ WebFetch: 'url',
17
+ WebSearch: 'query',
18
+ Task: 'prompt',
19
+ };
20
+ const key = keyMap[toolName];
21
+ if (key && typeof input[key] === 'string') {
22
+ return truncateToolInput(input[key]);
23
+ }
24
+ // Fallback: first short string value
25
+ for (const v of Object.values(input)) {
26
+ if (typeof v === 'string' && v.length > 0 && v.length < 200) {
27
+ return truncateToolInput(v);
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ function truncateToolInput(s) {
33
+ // Take first line, max 120 chars
34
+ const line = s.split('\n')[0];
35
+ return line.length > 120 ? line.slice(0, 119) + '\u2026' : line;
36
+ }
37
+ export class StateMachine extends EventEmitter {
38
+ state = State.DISCONNECTED;
39
+ permissionMode = PermissionMode.DEFAULT;
40
+ currentTool = null;
41
+ toolInput = null;
42
+ toolProgress = null;
43
+ options = [];
44
+ question = null;
45
+ navigable = false;
46
+ cursorIndex = 0;
47
+ cursorAuthority = 'pty';
48
+ optimisticCursorTime = 0;
49
+ projectName = null;
50
+ modelName = null;
51
+ remoteUrl = null;
52
+ billingType = 'unknown';
53
+ suggestedPrompt = null;
54
+ lastValidSuggestedPrompt = null;
55
+ usageTracker;
56
+ stuckTimer = null;
57
+ constructor(usageTracker) {
58
+ super();
59
+ this.usageTracker = usageTracker;
60
+ }
61
+ handleHookEvent(eventName, data) {
62
+ debug('SM', `hookEvent: ${eventName} (current: ${this.state})`);
63
+ switch (eventName) {
64
+ case 'SessionStart':
65
+ this.usageTracker.start();
66
+ this.transition(State.IDLE, 'session_start', 'hook');
67
+ break;
68
+ case 'UserPromptSubmit':
69
+ this.suggestedPrompt = null;
70
+ this.lastValidSuggestedPrompt = null;
71
+ this.transition(State.PROCESSING, 'user_prompt_submit', 'hook');
72
+ break;
73
+ case 'PreToolUse': {
74
+ const toolName = data.tool_name || null;
75
+ const toolInputData = data.tool_input;
76
+ this.currentTool = toolName;
77
+ this.toolInput = formatToolInput(toolName, toolInputData);
78
+ this.toolProgress = `Using ${toolName}`;
79
+ this.emitSnapshot();
80
+ break;
81
+ }
82
+ case 'PostToolUse': {
83
+ this.usageTracker.addToolCall(data);
84
+ this.currentTool = null;
85
+ this.toolInput = null;
86
+ this.toolProgress = null;
87
+ this.emitSnapshot();
88
+ break;
89
+ }
90
+ case 'Stop':
91
+ this.currentTool = null;
92
+ this.toolInput = null;
93
+ this.toolProgress = null;
94
+ this.options = [];
95
+ this.question = null;
96
+ this.navigable = false;
97
+ this.cursorIndex = 0;
98
+ this.transition(State.IDLE, 'stop', 'hook');
99
+ break;
100
+ case 'SessionEnd':
101
+ this.transition(State.DISCONNECTED, 'session_end', 'hook');
102
+ break;
103
+ case 'Notification': {
104
+ if (typeof data.input_tokens === 'number' && typeof data.output_tokens === 'number') {
105
+ this.usageTracker.addTokens(data.input_tokens, data.output_tokens);
106
+ }
107
+ break;
108
+ }
109
+ default:
110
+ break;
111
+ }
112
+ }
113
+ handleParserEvent(eventName, data) {
114
+ debug('SM', `parserEvent: ${eventName} (current: ${this.state})`);
115
+ switch (eventName) {
116
+ case 'permission_prompt': {
117
+ this.options = data?.options || [];
118
+ this.question = data?.question || null;
119
+ this.navigable = data?.navigable ?? false;
120
+ this.cursorIndex = data?.cursorIndex ?? 0;
121
+ this.transition(State.AWAITING_PERMISSION, 'permission_prompt', 'pty');
122
+ break;
123
+ }
124
+ case 'option_prompt': {
125
+ this.options = data?.options || [];
126
+ this.navigable = data?.navigable ?? false;
127
+ this.cursorIndex = data?.cursorIndex ?? 0;
128
+ if (this.state === State.AWAITING_OPTION) {
129
+ // Already in AWAITING_OPTION — just update options and re-emit snapshot
130
+ // (debounced chunks may re-parse with more complete data)
131
+ debug('SM', `option_prompt update: ${this.options.length} options, nav=${this.navigable}, cursor=${this.cursorIndex}`);
132
+ this.emitSnapshot();
133
+ }
134
+ else {
135
+ this.transition(State.AWAITING_OPTION, 'option_ui_detected', 'pty');
136
+ }
137
+ break;
138
+ }
139
+ case 'diff_prompt': {
140
+ this.options = data?.options || [];
141
+ this.transition(State.AWAITING_DIFF, 'diff_ui_detected', 'pty');
142
+ break;
143
+ }
144
+ case 'suggested_prompt': {
145
+ this.suggestedPrompt = data?.text ?? null;
146
+ if (this.suggestedPrompt) {
147
+ this.lastValidSuggestedPrompt = this.suggestedPrompt;
148
+ }
149
+ this.emitSnapshot();
150
+ break;
151
+ }
152
+ case 'spinner_start':
153
+ this.suggestedPrompt = null;
154
+ if (this.state !== State.PROCESSING) {
155
+ // Clean up awaiting state data if recovering from a prompt
156
+ if (this.state === State.AWAITING_OPTION ||
157
+ this.state === State.AWAITING_PERMISSION ||
158
+ this.state === State.AWAITING_DIFF) {
159
+ this.options = [];
160
+ this.question = null;
161
+ this.navigable = false;
162
+ this.cursorIndex = 0;
163
+ this.toolInput = null;
164
+ }
165
+ this.transition(State.PROCESSING, 'spinner_start', 'pty');
166
+ }
167
+ break;
168
+ case 'spinner_stop':
169
+ // Spinner stopped — if we're in an active state, go to IDLE
170
+ if (this.state === State.PROCESSING ||
171
+ this.state === State.AWAITING_PERMISSION ||
172
+ this.state === State.AWAITING_OPTION ||
173
+ this.state === State.AWAITING_DIFF) {
174
+ this.currentTool = null;
175
+ this.toolInput = null;
176
+ this.toolProgress = null;
177
+ this.options = [];
178
+ this.question = null;
179
+ this.navigable = false;
180
+ this.cursorIndex = 0;
181
+ this.transition(State.IDLE, 'idle_detected', 'pty');
182
+ }
183
+ break;
184
+ case 'idle':
185
+ if (this.state === State.PROCESSING ||
186
+ this.state === State.AWAITING_PERMISSION ||
187
+ this.state === State.AWAITING_OPTION ||
188
+ this.state === State.AWAITING_DIFF) {
189
+ this.currentTool = null;
190
+ this.toolInput = null;
191
+ this.toolProgress = null;
192
+ this.options = [];
193
+ this.question = null;
194
+ this.navigable = false;
195
+ this.cursorIndex = 0;
196
+ this.transition(State.IDLE, 'idle_detected', 'pty');
197
+ }
198
+ break;
199
+ case 'mode_change': {
200
+ const mode = data?.mode;
201
+ if (mode === 'plan') {
202
+ this.setPermissionMode(PermissionMode.PLAN);
203
+ }
204
+ else if (mode === 'acceptEdits') {
205
+ this.setPermissionMode(PermissionMode.ACCEPT_EDITS);
206
+ }
207
+ else {
208
+ this.setPermissionMode(PermissionMode.DEFAULT);
209
+ }
210
+ break;
211
+ }
212
+ // --- Metadata events (don't change state, update display data) ---
213
+ case 'status_line': {
214
+ // Token/duration from PTY status line: "1m 0s · ↓ 1.9k tokens"
215
+ const durationSec = data?.durationSec;
216
+ const tokens = data?.tokens;
217
+ if (durationSec != null) {
218
+ this.usageTracker.setDuration(durationSec);
219
+ }
220
+ if (tokens != null) {
221
+ this.usageTracker.setOutputTokens(tokens);
222
+ }
223
+ this.emitSnapshot();
224
+ break;
225
+ }
226
+ case 'tool_action': {
227
+ const toolName = data?.toolName;
228
+ const toolArgs = data?.toolArgs;
229
+ if (toolName) {
230
+ this.currentTool = toolName;
231
+ this.toolProgress = `Using ${toolName}`;
232
+ // PTY args as fallback when hook data hasn't provided toolInput
233
+ if (toolArgs && !this.toolInput) {
234
+ this.toolInput = toolArgs;
235
+ }
236
+ this.usageTracker.incrementToolCalls();
237
+ this.emitSnapshot();
238
+ }
239
+ break;
240
+ }
241
+ case 'project_name': {
242
+ const name = data?.name;
243
+ if (name) {
244
+ this.projectName = name;
245
+ debug('SM', `project: ${name}`);
246
+ this.emitSnapshot();
247
+ }
248
+ break;
249
+ }
250
+ case 'model_info': {
251
+ const model = data?.model;
252
+ const plan = data?.plan;
253
+ if (model) {
254
+ this.modelName = model;
255
+ debug('SM', `model: ${model}`);
256
+ }
257
+ if (plan) {
258
+ if (/max/i.test(plan)) {
259
+ this.billingType = 'subscription';
260
+ }
261
+ else if (/api/i.test(plan)) {
262
+ this.billingType = 'api';
263
+ }
264
+ debug('SM', `billingType: ${this.billingType} (plan="${plan}")`);
265
+ }
266
+ if (model || plan) {
267
+ this.emitSnapshot();
268
+ }
269
+ break;
270
+ }
271
+ case 'remote_url': {
272
+ const url = data?.url;
273
+ if (url) {
274
+ this.remoteUrl = url;
275
+ debug('SM', `remoteUrl: ${url}`);
276
+ this.emitSnapshot();
277
+ }
278
+ break;
279
+ }
280
+ default:
281
+ break;
282
+ }
283
+ }
284
+ /** Update billing type from external source (e.g., OAuth API response) if still unknown */
285
+ inferBillingType(inferred) {
286
+ if (this.billingType === 'unknown') {
287
+ this.billingType = inferred;
288
+ debug('SM', `billingType inferred from API: ${inferred}`);
289
+ this.emitSnapshot();
290
+ }
291
+ }
292
+ handleUserAction(action) {
293
+ switch (action) {
294
+ case 'respond':
295
+ if (this.state === State.AWAITING_PERMISSION ||
296
+ this.state === State.AWAITING_DIFF) {
297
+ this.options = [];
298
+ this.question = null;
299
+ this.navigable = false;
300
+ this.cursorIndex = 0;
301
+ this.toolInput = null;
302
+ this.transition(State.PROCESSING, 'user_response', 'user');
303
+ }
304
+ break;
305
+ case 'select_option':
306
+ if (this.state === State.AWAITING_OPTION ||
307
+ this.state === State.AWAITING_PERMISSION ||
308
+ this.state === State.AWAITING_DIFF) {
309
+ this.options = [];
310
+ this.question = null;
311
+ this.navigable = false;
312
+ this.cursorIndex = 0;
313
+ this.toolInput = null;
314
+ this.transition(State.PROCESSING, 'user_selection', 'user');
315
+ }
316
+ break;
317
+ case 'send_prompt':
318
+ if (this.state === State.IDLE) {
319
+ this.suggestedPrompt = null;
320
+ this.transition(State.PROCESSING, 'user_prompt_submit', 'hook');
321
+ }
322
+ break;
323
+ case 'interrupt':
324
+ this.currentTool = null;
325
+ this.toolInput = null;
326
+ this.toolProgress = null;
327
+ this.options = [];
328
+ this.question = null;
329
+ this.navigable = false;
330
+ this.cursorIndex = 0;
331
+ this.transition(State.IDLE, 'interrupt', 'user');
332
+ break;
333
+ default:
334
+ break;
335
+ }
336
+ }
337
+ transition(to, trigger, source) {
338
+ const valid = transitions.some((t) => (t.from === this.state || t.from === '*') &&
339
+ t.to === to &&
340
+ t.trigger === trigger);
341
+ if (!valid) {
342
+ debug('SM', `Invalid transition blocked: ${this.state} -> ${to} (trigger: ${trigger}, source: ${source})`);
343
+ return;
344
+ }
345
+ const prev = this.state;
346
+ this.state = to;
347
+ // Reset cursor authority when leaving AWAITING states
348
+ if (prev === State.AWAITING_OPTION ||
349
+ prev === State.AWAITING_PERMISSION ||
350
+ prev === State.AWAITING_DIFF) {
351
+ this.cursorAuthority = 'pty';
352
+ }
353
+ // Manage stuck-state timer: only for PROCESSING (Claude seems hung).
354
+ // AWAITING_* states wait indefinitely for user response — no timeout.
355
+ this.resetStuckTimer();
356
+ if (to === State.PROCESSING) {
357
+ this.stuckTimer = setTimeout(() => {
358
+ debug('SM', `Stuck timeout: ${to} for >${STUCK_TIMEOUT_MS / 1000}s, recovering to IDLE`);
359
+ this.currentTool = null;
360
+ this.toolInput = null;
361
+ this.toolProgress = null;
362
+ this.options = [];
363
+ this.question = null;
364
+ this.navigable = false;
365
+ this.cursorIndex = 0;
366
+ this.transition(State.IDLE, 'stuck_timeout', 'internal');
367
+ }, STUCK_TIMEOUT_MS);
368
+ }
369
+ if (prev !== to) {
370
+ debug('SM', `${prev} -> ${to} (trigger: ${trigger}, source: ${source})`);
371
+ this.emitSnapshot();
372
+ }
373
+ }
374
+ /** Reset stuck timer on PTY activity while PROCESSING */
375
+ onPtyActivity() {
376
+ if (this.stuckTimer && this.state === State.PROCESSING) {
377
+ debug('SM', 'PTY activity — resetting stuck timer');
378
+ this.resetStuckTimer();
379
+ this.stuckTimer = setTimeout(() => {
380
+ debug('SM', `Stuck timeout: PROCESSING for >${STUCK_TIMEOUT_MS / 1000}s, recovering to IDLE`);
381
+ this.currentTool = null;
382
+ this.toolInput = null;
383
+ this.toolProgress = null;
384
+ this.options = [];
385
+ this.question = null;
386
+ this.navigable = false;
387
+ this.cursorIndex = 0;
388
+ this.transition(State.IDLE, 'stuck_timeout', 'internal');
389
+ }, STUCK_TIMEOUT_MS);
390
+ }
391
+ }
392
+ resetStuckTimer() {
393
+ if (this.stuckTimer) {
394
+ clearTimeout(this.stuckTimer);
395
+ this.stuckTimer = null;
396
+ }
397
+ }
398
+ emitSnapshot() {
399
+ this.emit('state_changed', this.getSnapshot());
400
+ }
401
+ /** Update cursor index with source discrimination to prevent race conditions.
402
+ * 'optimistic' — from StreamDeck dial navigation (immediate, may be overridden by PTY)
403
+ * 'pty' — from parser cursor_update (authoritative, but may be stale during rapid navigation)
404
+ */
405
+ updateCursorIndex(idx, source = 'pty') {
406
+ if (source === 'optimistic') {
407
+ this.cursorIndex = idx;
408
+ this.cursorAuthority = 'optimistic';
409
+ this.optimisticCursorTime = Date.now();
410
+ this.emitSnapshot();
411
+ }
412
+ else {
413
+ // PTY confirmation: always accept unless very recent optimistic update
414
+ const elapsed = Date.now() - this.optimisticCursorTime;
415
+ if (this.cursorAuthority === 'pty' || elapsed > 200) {
416
+ this.cursorIndex = idx;
417
+ this.cursorAuthority = 'pty';
418
+ this.emitSnapshot();
419
+ }
420
+ // else: suppress stale PTY value (optimistic update is fresher)
421
+ }
422
+ }
423
+ getCursorIndex() {
424
+ return this.cursorIndex;
425
+ }
426
+ getOptionsCount() {
427
+ return this.options.length;
428
+ }
429
+ getSnapshot() {
430
+ const usage = this.usageTracker.getSnapshot();
431
+ return {
432
+ state: this.state,
433
+ permissionMode: this.permissionMode,
434
+ currentTool: this.currentTool,
435
+ toolInput: this.toolInput,
436
+ toolProgress: this.toolProgress,
437
+ options: this.options,
438
+ question: this.question,
439
+ navigable: this.navigable,
440
+ cursorIndex: this.cursorIndex,
441
+ projectName: this.projectName,
442
+ modelName: this.modelName,
443
+ billingType: this.billingType,
444
+ sessionDurationSec: usage.sessionDurationSec,
445
+ inputTokens: usage.inputTokens,
446
+ outputTokens: usage.outputTokens,
447
+ toolCalls: usage.toolCalls,
448
+ estimatedCostUsd: usage.estimatedCostUsd,
449
+ sessionPercent: usage.sessionPercent,
450
+ costSpent: usage.costSpent,
451
+ costLimit: usage.costLimit,
452
+ resetTime: usage.resetTime,
453
+ resetDate: usage.resetDate,
454
+ suggestedPrompt: this.suggestedPrompt,
455
+ remoteUrl: this.remoteUrl,
456
+ };
457
+ }
458
+ setPermissionMode(mode) {
459
+ this.permissionMode = mode;
460
+ this.emitSnapshot();
461
+ }
462
+ getState() {
463
+ return this.state;
464
+ }
465
+ /** Get last valid suggested prompt (for reconnection recovery when suggestedPrompt is already null) */
466
+ getLastValidSuggestedPrompt() {
467
+ return this.lastValidSuggestedPrompt;
468
+ }
469
+ }
470
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export { State, PermissionMode, type TransitionSource, type StateTransition, transitions, type PromptOption, type StateSnapshot, type BillingType, type AgentType, type AgentCapabilities, type AgentAdapter, type AgentAdapterEvents, type AdapterStartOptions, type AdapterEvent, type AdapterHookEvent, type AdapterParserEvent, type AdapterMetadataEvent, type AdapterActivityEvent, type AdapterConnectionEvent, CLAUDE_CODE_CAPABILITIES, OPENCLAW_CAPABILITIES, OPENCLAW_GATEWAY_PORT, } from '@agentdeck/shared';
2
+ export { type ModelCatalogEntry, type StateUpdateEvent, type PromptOptionsEvent, type UsageEvent, type ConnectionEvent, type UserPromptEvent, type VoiceStateEvent, type BridgeEvent, type ResponseCommand, type SelectOptionCommand, type NavigateOptionCommand, type SendPromptCommand, type SwitchModeCommand, type InterruptCommand, type VoiceCommand, type QueryUsageCommand, type PluginCommand, type HookEvent, BRIDGE_WS_PORT, BRIDGE_HTTP_PORT, RECONNECT_INTERVAL_MS, STUCK_TIMEOUT_MS, } from '@agentdeck/shared';
3
+ export interface VoiceState {
4
+ recording: boolean;
5
+ transcribing: boolean;
6
+ lastTranscription: string | null;
7
+ error: string | null;
8
+ }
9
+ export interface SessionInfo {
10
+ sessionId: string;
11
+ startedAt: number;
12
+ pid: number | null;
13
+ port: number;
14
+ workingDirectory: string;
15
+ }
16
+ export interface UsageSnapshot {
17
+ sessionDurationSec: number;
18
+ inputTokens: number;
19
+ outputTokens: number;
20
+ toolCalls: number;
21
+ estimatedCostUsd: number | null;
22
+ sessionPercent: number | null;
23
+ costSpent: number | null;
24
+ costLimit: number | null;
25
+ resetTime: string | null;
26
+ resetDate: string | null;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // Re-export all shared types
2
+ export { State, PermissionMode, transitions, CLAUDE_CODE_CAPABILITIES, OPENCLAW_CAPABILITIES, OPENCLAW_GATEWAY_PORT, } from '@agentdeck/shared';
3
+ export { BRIDGE_WS_PORT, BRIDGE_HTTP_PORT, RECONNECT_INTERVAL_MS, STUCK_TIMEOUT_MS, } from '@agentdeck/shared';
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EACL,KAAK,EACL,cAAc,EAGd,WAAW,EAeX,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAmBL,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ApiUsageData {
2
+ fiveHourPercent: number | null;
3
+ fiveHourResetsAt: string | null;
4
+ sevenDayPercent: number | null;
5
+ sevenDayResetsAt: string | null;
6
+ extraUsageEnabled: boolean;
7
+ extraUsageMonthlyLimit: number | null;
8
+ extraUsageUsedCredits: number | null;
9
+ extraUsageUtilization: number | null;
10
+ /** Inferred from API response: subscription if rate-limit fields present, api if 401/no fields */
11
+ inferredBillingType: 'subscription' | 'api' | null;
12
+ }
13
+ export declare function fetchUsageFromApi(): Promise<ApiUsageData | null>;
14
+ /** Format ISO timestamp to relative time like "2h 30m" or "10:30am" */
15
+ export declare function formatResetTime(isoString: string): string;
16
+ //# sourceMappingURL=usage-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-api.d.ts","sourceRoot":"","sources":["../src/usage-api.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,kGAAkG;IAClG,mBAAmB,EAAE,cAAc,GAAG,KAAK,GAAG,IAAI,CAAC;CACpD;AAgBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkDtE;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAoBzD"}
@@ -0,0 +1,84 @@
1
+ import { execSync } from 'child_process';
2
+ import { debug } from './logger.js';
3
+ const USAGE_API_URL = 'https://api.anthropic.com/api/oauth/usage';
4
+ const KEYCHAIN_SERVICE = 'Claude Code-credentials';
5
+ function getOAuthToken() {
6
+ try {
7
+ const raw = execSync(`security find-generic-password -s "${KEYCHAIN_SERVICE}" -w`, { encoding: 'utf-8', timeout: 5000 }).trim();
8
+ const creds = JSON.parse(raw);
9
+ return creds?.claudeAiOauth?.accessToken ?? null;
10
+ }
11
+ catch {
12
+ debug('UsageAPI', 'Failed to read OAuth token from Keychain');
13
+ return null;
14
+ }
15
+ }
16
+ export async function fetchUsageFromApi() {
17
+ const token = getOAuthToken();
18
+ if (!token) {
19
+ debug('UsageAPI', 'No OAuth token available');
20
+ return null;
21
+ }
22
+ try {
23
+ const res = await fetch(USAGE_API_URL, {
24
+ method: 'GET',
25
+ headers: {
26
+ 'Authorization': `Bearer ${token}`,
27
+ 'anthropic-beta': 'oauth-2025-04-20',
28
+ 'Accept': 'application/json',
29
+ },
30
+ signal: AbortSignal.timeout(10000),
31
+ });
32
+ if (!res.ok) {
33
+ debug('UsageAPI', `API returned ${res.status}: ${res.statusText}`);
34
+ return null;
35
+ }
36
+ const data = await res.json();
37
+ if (data.error) {
38
+ debug('UsageAPI', `API error: ${data.error.type}`);
39
+ return null;
40
+ }
41
+ const extraUsage = data.extra_usage;
42
+ const hasRateLimitData = data.five_hour != null || data.seven_day != null;
43
+ const result = {
44
+ fiveHourPercent: data.five_hour?.utilization ?? null,
45
+ fiveHourResetsAt: data.five_hour?.resets_at ?? null,
46
+ sevenDayPercent: data.seven_day?.utilization ?? null,
47
+ sevenDayResetsAt: data.seven_day?.resets_at ?? null,
48
+ extraUsageEnabled: !!extraUsage?.enabled,
49
+ extraUsageMonthlyLimit: extraUsage?.monthly_limit ?? null,
50
+ extraUsageUsedCredits: extraUsage?.used_credits ?? null,
51
+ extraUsageUtilization: extraUsage?.utilization ?? null,
52
+ inferredBillingType: hasRateLimitData ? 'subscription' : 'api',
53
+ };
54
+ debug('UsageAPI', `5h: ${result.fiveHourPercent}%, 7d: ${result.sevenDayPercent}%, extra: ${result.extraUsageEnabled ? 'enabled' : 'disabled'}`);
55
+ return result;
56
+ }
57
+ catch (err) {
58
+ debug('UsageAPI', `Fetch failed: ${err}`);
59
+ return null;
60
+ }
61
+ }
62
+ /** Format ISO timestamp to relative time like "2h 30m" or "10:30am" */
63
+ export function formatResetTime(isoString) {
64
+ try {
65
+ const resetAt = new Date(isoString);
66
+ const now = new Date();
67
+ const diffMs = resetAt.getTime() - now.getTime();
68
+ if (diffMs <= 0)
69
+ return 'now';
70
+ const diffMin = Math.floor(diffMs / 60000);
71
+ if (diffMin < 60)
72
+ return `${diffMin}m`;
73
+ const h = Math.floor(diffMin / 60);
74
+ const m = diffMin % 60;
75
+ if (h < 24)
76
+ return m > 0 ? `${h}h ${m}m` : `${h}h`;
77
+ const d = Math.floor(h / 24);
78
+ return `${d}d ${h % 24}h`;
79
+ }
80
+ catch {
81
+ return isoString;
82
+ }
83
+ }
84
+ //# sourceMappingURL=usage-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-api.js","sourceRoot":"","sources":["../src/usage-api.ts"],"names":[],"mappings":"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"}