@minionry/sdk 0.4.23

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.
@@ -0,0 +1,1967 @@
1
+ export declare const SCOPES: readonly ["identity", "storage", "files:app", "pm:read", "agents:run", "pm:write", "files:workspace:read", "files:workspace:write", "notifications", "pm:execute", "pm:schedule", "agents:sessions", "browser:read", "browser:control", "settings:read", "git:read", "git:write", "git:remote", "terminal:read", "terminal:exec", "tools:serve", "quality:read", "quality:run", "inference:run", "endpoints:register"];
2
+ export type Scope = (typeof SCOPES)[number];
3
+ export type ScopeRiskTier = 'low' | 'medium' | 'high' | 'critical';
4
+ export declare const SCOPE_RISK_TIERS: Readonly<Record<Scope, ScopeRiskTier>>;
5
+ export declare const MINIONRY_ERROR_CODES: readonly ["USER_REJECTED", "SCOPE_DENIED", "RATE_LIMITED", "SPACE_DISCONNECTED", "QUOTA_EXCEEDED", "UNSUPPORTED", "CANCELLED"];
6
+ export type MinionryErrorCode = (typeof MINIONRY_ERROR_CODES)[number];
7
+ export declare class MinionryError extends Error {
8
+ readonly code: MinionryErrorCode | (string & {});
9
+ constructor(code: MinionryErrorCode | (string & {}), message?: string);
10
+ }
11
+ export type Unsubscribe = () => void;
12
+ export interface ConnectRequest {
13
+ scopes: Scope[];
14
+ }
15
+ export interface SpaceInfo {
16
+ id: string;
17
+ name: string;
18
+ }
19
+ export interface UserInfo {
20
+ id: string;
21
+ name: string;
22
+ role: string;
23
+ }
24
+ export interface ConnectResult {
25
+ space: SpaceInfo;
26
+ user: UserInfo | null;
27
+ grants: Scope[];
28
+ viewOnly: boolean;
29
+ }
30
+ export declare const AGENT_RUN_LIMITS: {
31
+ readonly maxSystemPromptChars: 32000;
32
+ readonly maxTurns: 50;
33
+ readonly maxSeconds: 1800;
34
+ readonly endpointsPerApp: 8;
35
+ readonly maxTtlMs: 86400000;
36
+ };
37
+ export declare const AGENT_RUN_MODEL_SELECTIONS: readonly ["quality"];
38
+ export type AgentRunModelSelection = (typeof AGENT_RUN_MODEL_SELECTIONS)[number];
39
+ export interface AgentRunRequest {
40
+ prompt: string;
41
+ title?: string;
42
+ model?: string;
43
+ modelSelection?: AgentRunModelSelection;
44
+ systemPrompt?: string;
45
+ budget?: {
46
+ maxTurns?: number;
47
+ maxSeconds?: number;
48
+ };
49
+ sessionId?: string;
50
+ }
51
+ export type AgentRunResultStatus = 'done' | 'error' | 'cancelled';
52
+ export type AgentRunStatus = 'running' | AgentRunResultStatus;
53
+ export interface AgentRunResult {
54
+ status: AgentRunResultStatus;
55
+ text: string;
56
+ }
57
+ export interface AgentRunEventMap {
58
+ output: {
59
+ text: string;
60
+ };
61
+ toolUse: {
62
+ tool: string;
63
+ input?: unknown;
64
+ };
65
+ status: {
66
+ status: AgentRunStatus;
67
+ };
68
+ gap: {
69
+ message: string;
70
+ };
71
+ timelineEvent: SessionEvent;
72
+ }
73
+ export type AgentRunEvent = keyof AgentRunEventMap;
74
+ export interface AgentRun {
75
+ readonly id: string;
76
+ readonly sessionId: string;
77
+ on<E extends AgentRunEvent>(event: E, cb: (payload: AgentRunEventMap[E]) => void): Unsubscribe;
78
+ result(): Promise<AgentRunResult>;
79
+ cancel(): Promise<void>;
80
+ }
81
+ export interface SessionSummary {
82
+ id: string;
83
+ name: string;
84
+ createdAt: string;
85
+ lastActivityAt: string;
86
+ isExecuting: boolean;
87
+ leaseState?: 'active' | 'parked' | 'released';
88
+ }
89
+ export interface CreateSessionRequest {
90
+ name?: string;
91
+ }
92
+ export interface RenameSessionRequest {
93
+ name: string;
94
+ }
95
+ export type SessionEntry = {
96
+ id: string;
97
+ kind: 'user';
98
+ at: number;
99
+ engine?: string;
100
+ text: string;
101
+ attachments?: Array<{
102
+ fileName: string;
103
+ isImage: boolean;
104
+ }>;
105
+ turn?: number;
106
+ } | {
107
+ id: string;
108
+ kind: 'text';
109
+ at: number;
110
+ engine?: string;
111
+ text: string;
112
+ open: boolean;
113
+ } | {
114
+ id: string;
115
+ kind: 'thinking';
116
+ at: number;
117
+ engine?: string;
118
+ text: string;
119
+ open: boolean;
120
+ } | {
121
+ id: string;
122
+ kind: 'tool';
123
+ at: number;
124
+ engine?: string;
125
+ toolName: string;
126
+ toolUseId?: string;
127
+ input: Record<string, unknown>;
128
+ status: 'running' | 'success' | 'error';
129
+ result?: string;
130
+ completedAt?: number;
131
+ } | {
132
+ id: string;
133
+ kind: 'notice';
134
+ at: number;
135
+ engine?: string;
136
+ level: 'info' | 'warning' | 'error';
137
+ text: string;
138
+ code?: string;
139
+ data?: Record<string, unknown>;
140
+ } | {
141
+ id: string;
142
+ kind: 'question';
143
+ at: number;
144
+ engine?: string;
145
+ toolUseId: string;
146
+ questions: readonly unknown[];
147
+ state: 'pending' | 'answered' | 'auto-answered' | 'dismissed';
148
+ };
149
+ export type SessionEvent = {
150
+ kind: 'user';
151
+ at: number;
152
+ engine?: string;
153
+ entryId: string;
154
+ text: string;
155
+ attachments?: Array<{
156
+ fileName: string;
157
+ isImage: boolean;
158
+ }>;
159
+ turn?: number;
160
+ } | {
161
+ kind: 'text';
162
+ at: number;
163
+ engine?: string;
164
+ entryId: string;
165
+ delta: string;
166
+ } | {
167
+ kind: 'thinking';
168
+ at: number;
169
+ engine?: string;
170
+ entryId: string;
171
+ delta: string;
172
+ } | {
173
+ kind: 'tool_use';
174
+ at: number;
175
+ engine?: string;
176
+ entryId: string;
177
+ toolName: string;
178
+ toolUseId?: string;
179
+ input: Record<string, unknown>;
180
+ } | {
181
+ kind: 'tool_result';
182
+ at: number;
183
+ engine?: string;
184
+ entryId: string;
185
+ ok: boolean;
186
+ result: string;
187
+ } | {
188
+ kind: 'notice';
189
+ at: number;
190
+ engine?: string;
191
+ entryId: string;
192
+ level: 'info' | 'warning' | 'error';
193
+ text: string;
194
+ code?: string;
195
+ data?: Record<string, unknown>;
196
+ } | {
197
+ kind: 'question';
198
+ at: number;
199
+ engine?: string;
200
+ entryId: string;
201
+ toolUseId: string;
202
+ questions: readonly unknown[];
203
+ } | {
204
+ kind: 'question_state';
205
+ at: number;
206
+ engine?: string;
207
+ entryId: string;
208
+ state: 'pending' | 'answered' | 'auto-answered' | 'dismissed';
209
+ } | {
210
+ kind: 'tokens';
211
+ at: number;
212
+ engine?: string;
213
+ usage: {
214
+ inputTokens: number;
215
+ outputTokens: number;
216
+ cacheCreationTokens: number;
217
+ cacheReadTokens: number;
218
+ currentTurnInputTokens: number;
219
+ isFinal?: boolean;
220
+ };
221
+ } | {
222
+ kind: 'status';
223
+ at: number;
224
+ engine?: string;
225
+ executing: boolean;
226
+ startedAt?: number;
227
+ turn?: number;
228
+ } | {
229
+ kind: 'truncate';
230
+ at: number;
231
+ engine?: string;
232
+ throughEntryId: string;
233
+ };
234
+ export interface SessionHistory {
235
+ sessionId: string;
236
+ entries: SessionEntry[];
237
+ seq: number;
238
+ }
239
+ export interface SessionReplayResult {
240
+ sessionId: string;
241
+ fromSeq: number;
242
+ events: SessionEvent[];
243
+ currentSeq: number;
244
+ }
245
+ export interface SessionPromptResult {
246
+ queued: boolean;
247
+ }
248
+ export interface PromptAttachmentRef {
249
+ path: string;
250
+ }
251
+ export interface MinionryAgentSessions {
252
+ list(): Promise<SessionSummary[]>;
253
+ create(req?: CreateSessionRequest): Promise<SessionSummary>;
254
+ attach(sessionId: string): Promise<SessionSummary>;
255
+ close(sessionId: string): Promise<void>;
256
+ rename(sessionId: string, req: RenameSessionRequest): Promise<SessionSummary>;
257
+ history(sessionId: string): Promise<SessionHistory>;
258
+ replay(sessionId: string, afterSeq: number): Promise<SessionReplayResult>;
259
+ approve(sessionId: string, approved: boolean): Promise<void>;
260
+ answerQuestion(sessionId: string, toolUseId: string, answers: Record<string, string>): Promise<void>;
261
+ prompt(sessionId: string, text: string, attachments?: PromptAttachmentRef[]): Promise<SessionPromptResult>;
262
+ stop(sessionId: string): Promise<void>;
263
+ }
264
+ export interface BoardRunInput {
265
+ variables?: Record<string, string | number | boolean>;
266
+ data?: unknown;
267
+ gatherPrompt?: string;
268
+ }
269
+ export interface CreateBoardRequest {
270
+ prompt: string;
271
+ autoImplement?: boolean;
272
+ input?: BoardRunInput;
273
+ }
274
+ export interface CreateBoardResult {
275
+ boardId: string;
276
+ }
277
+ export interface BoardSummary {
278
+ id: string;
279
+ title: string;
280
+ status: 'draft' | 'active' | 'completed' | 'archived';
281
+ goal: string;
282
+ created: string;
283
+ completedAt: string | null;
284
+ }
285
+ export interface BoardIssue {
286
+ id: string;
287
+ title: string;
288
+ status: string;
289
+ type?: string;
290
+ priority?: string;
291
+ labels?: string[];
292
+ }
293
+ export interface BoardSnapshot {
294
+ boardId: string;
295
+ title: string;
296
+ statuses: string[];
297
+ issues: BoardIssue[];
298
+ }
299
+ export interface BoardIssueDetail {
300
+ id: string;
301
+ title: string;
302
+ type: 'issue' | 'epic' | 'bug' | 'task';
303
+ status: string;
304
+ priority: string;
305
+ estimate: number | string | null;
306
+ labels: string[];
307
+ epicId: string | null;
308
+ blockedBy: string[];
309
+ blocks: string[];
310
+ description: string;
311
+ acceptanceCriteria: Array<{
312
+ text: string;
313
+ checked: boolean;
314
+ }>;
315
+ created: string;
316
+ updated: string | null;
317
+ }
318
+ export interface UpdateIssueFields {
319
+ title?: string;
320
+ status?: string;
321
+ priority?: 'P0' | 'P1' | 'P2' | 'P3';
322
+ estimate?: number | string | null;
323
+ labels?: string[];
324
+ epicId?: string | null;
325
+ blockedBy?: string[];
326
+ blocks?: string[];
327
+ }
328
+ export interface CreateIssueRequest extends UpdateIssueFields {
329
+ boardId: string;
330
+ title: string;
331
+ type?: 'issue' | 'epic' | 'bug' | 'task';
332
+ description?: string;
333
+ acceptanceCriteria?: string[];
334
+ }
335
+ export interface UpdateBoardFields {
336
+ title?: string;
337
+ status?: 'draft' | 'active' | 'completed';
338
+ goal?: string;
339
+ maxParallelAgents?: number;
340
+ autoImplement?: boolean;
341
+ }
342
+ export interface BoardRunEventMap {
343
+ issueStarted: {
344
+ issueId: string;
345
+ title: string;
346
+ };
347
+ output: {
348
+ issueId: string;
349
+ text: string;
350
+ };
351
+ tokens: {
352
+ issueId: string;
353
+ inputTokens: number;
354
+ outputTokens: number;
355
+ cacheCreationTokens: number;
356
+ cacheReadTokens: number;
357
+ currentTurnInputTokens: number;
358
+ isFinal: boolean;
359
+ };
360
+ toolUse: {
361
+ issueId: string;
362
+ tool: string;
363
+ input?: unknown;
364
+ };
365
+ reviewProgress: {
366
+ issueId: string;
367
+ status: string;
368
+ };
369
+ issueComplete: {
370
+ issueId: string;
371
+ };
372
+ complete: {
373
+ reason: string;
374
+ };
375
+ gap: {
376
+ message: string;
377
+ };
378
+ }
379
+ export type BoardRunEvent = keyof BoardRunEventMap;
380
+ export interface BoardRun {
381
+ readonly id: string;
382
+ readonly boardId: string;
383
+ on<E extends BoardRunEvent>(event: E, cb: (payload: BoardRunEventMap[E]) => void): Unsubscribe;
384
+ pause(): Promise<void>;
385
+ resume(): Promise<void>;
386
+ stop(): Promise<void>;
387
+ }
388
+ export type ScheduleTiming =
389
+ {
390
+ kind: 'once';
391
+ at: string;
392
+ }
393
+ | {
394
+ kind: 'interval';
395
+ everyMs: number;
396
+ }
397
+ | {
398
+ kind: 'continuous';
399
+ };
400
+ export type ScheduleFireStatus = 'started' | 'completed' | 'failed' | 'skipped-overlap' | 'missed';
401
+ export interface ScheduleHistoryEntry {
402
+ at: string;
403
+ status: ScheduleFireStatus;
404
+ boardId: string | null;
405
+ error?: string;
406
+ }
407
+ export interface ScheduleSource {
408
+ kind: 'template-json' | 'board-zip';
409
+ originalName?: string;
410
+ }
411
+ export interface ScheduleSnapshot {
412
+ id: string;
413
+ createdAt: string;
414
+ name?: string;
415
+ source: ScheduleSource;
416
+ input?: BoardRunInput;
417
+ timing: ScheduleTiming;
418
+ enabled: boolean;
419
+ nextFireAt: string | null;
420
+ lastFire?: {
421
+ at: string;
422
+ boardId: string | null;
423
+ status: ScheduleFireStatus;
424
+ };
425
+ history: ScheduleHistoryEntry[];
426
+ }
427
+ export interface CreateScheduleRequest {
428
+ name?: string;
429
+ source: {
430
+ kind: 'template-json';
431
+ content: string;
432
+ };
433
+ timing: ScheduleTiming;
434
+ input?: BoardRunInput;
435
+ enabled?: boolean;
436
+ }
437
+ export interface UpdateScheduleRequest {
438
+ name?: string;
439
+ timing?: ScheduleTiming;
440
+ input?: BoardRunInput | null;
441
+ enabled?: boolean;
442
+ }
443
+ export interface MinionryPmSchedules {
444
+ list(): Promise<ScheduleSnapshot[]>;
445
+ create(req: CreateScheduleRequest): Promise<ScheduleSnapshot>;
446
+ update(scheduleId: string, patch: UpdateScheduleRequest): Promise<ScheduleSnapshot>;
447
+ delete(scheduleId: string): Promise<void>;
448
+ }
449
+ export interface FileEntry {
450
+ name: string;
451
+ dir: boolean;
452
+ kind: 'file' | 'directory';
453
+ size?: number;
454
+ modifiedAt?: string;
455
+ }
456
+ export type FileReadResult = {
457
+ kind: 'text';
458
+ content: string;
459
+ } | {
460
+ kind: 'binary';
461
+ content: string;
462
+ mimeType: string;
463
+ };
464
+ export interface FileSearchOptions {
465
+ caseSensitive?: boolean;
466
+ wholeWord?: boolean;
467
+ regex?: boolean;
468
+ contextLines?: number;
469
+ includeGlob?: string;
470
+ excludeGlob?: string;
471
+ maxResults?: number;
472
+ }
473
+ export interface FileSearchMatch {
474
+ path: string;
475
+ line: number;
476
+ column: number;
477
+ lineContent: string;
478
+ contextBefore: string[];
479
+ contextAfter: string[];
480
+ }
481
+ export interface FileSearchCompleteResult {
482
+ totalMatches: number;
483
+ fileCount: number;
484
+ truncated: boolean;
485
+ error?: string;
486
+ }
487
+ export interface FileSearchEventMap {
488
+ results: {
489
+ matches: FileSearchMatch[];
490
+ };
491
+ complete: FileSearchCompleteResult;
492
+ gap: {
493
+ message: string;
494
+ };
495
+ }
496
+ export type FileSearchEvent = keyof FileSearchEventMap;
497
+ export interface FileSearchHandle {
498
+ readonly id: string;
499
+ on<E extends FileSearchEvent>(event: E, cb: (payload: FileSearchEventMap[E]) => void): Unsubscribe;
500
+ cancel(): Promise<void>;
501
+ }
502
+ export interface FileDefinitionOptions {
503
+ language?: string;
504
+ currentFile?: string;
505
+ }
506
+ export interface FileDefinition {
507
+ path: string;
508
+ line: number;
509
+ column: number;
510
+ lineContent: string;
511
+ kind: string;
512
+ }
513
+ export interface FileChangeEvent {
514
+ path: string;
515
+ kind: 'changed' | 'opened';
516
+ }
517
+ export interface FileTransferProgress {
518
+ chunkIndex: number;
519
+ totalChunks: number;
520
+ bytesTransferred: number;
521
+ totalBytes: number;
522
+ }
523
+ export interface FileTransferEventMap {
524
+ progress: FileTransferProgress;
525
+ }
526
+ export type FileTransferEvent = keyof FileTransferEventMap;
527
+ export interface FileUploadOptions {
528
+ mimeType?: string;
529
+ overwrite?: boolean;
530
+ }
531
+ export interface FileUploadResult {
532
+ path: string;
533
+ bytesWritten: number;
534
+ }
535
+ export interface FileDownloadOptions {
536
+ asZip?: boolean;
537
+ }
538
+ export interface FileDownloadResult {
539
+ path: string;
540
+ bytes: Uint8Array;
541
+ mimeType: string;
542
+ isZip: boolean;
543
+ fileSize: number;
544
+ }
545
+ export interface FileTransferHandle<TResult> {
546
+ readonly id: string;
547
+ on<E extends FileTransferEvent>(event: E, cb: (payload: FileTransferEventMap[E]) => void): Unsubscribe;
548
+ result(): Promise<TResult>;
549
+ cancel(): Promise<void>;
550
+ }
551
+ export interface BrowserDeviceProfile {
552
+ formFactor: 'desktop' | 'mobile';
553
+ width: number;
554
+ height: number;
555
+ label: string;
556
+ }
557
+ export interface BrowserTab {
558
+ id: string;
559
+ url: string;
560
+ title: string;
561
+ favicon?: string;
562
+ isLoading: boolean;
563
+ canGoBack: boolean;
564
+ canGoForward: boolean;
565
+ error?: string;
566
+ deviceProfile?: BrowserDeviceProfile;
567
+ owner?: {
568
+ agentId: string;
569
+ label: string;
570
+ sessionId?: string;
571
+ };
572
+ }
573
+ export interface BrowserTabsPayload {
574
+ tabs: BrowserTab[];
575
+ currentTabId: string | null;
576
+ }
577
+ export interface BrowserOpenOptions {
578
+ pinnedApp?: boolean;
579
+ }
580
+ export interface BrowserSnapshotNode {
581
+ ref: string;
582
+ role: string;
583
+ name?: string;
584
+ value?: string;
585
+ description?: string;
586
+ level?: number;
587
+ checked?: boolean | 'mixed';
588
+ selected?: boolean;
589
+ expanded?: boolean;
590
+ disabled?: boolean;
591
+ focused?: boolean;
592
+ children: BrowserSnapshotNode[];
593
+ }
594
+ export interface BrowserSnapshotResult {
595
+ url: string;
596
+ title: string;
597
+ epoch: number;
598
+ root: BrowserSnapshotNode;
599
+ }
600
+ export interface BrowserScreenshotOptions {
601
+ fullPage?: boolean;
602
+ format?: 'png' | 'jpeg';
603
+ quality?: number;
604
+ }
605
+ export interface BrowserScreenshotResult {
606
+ format: 'png' | 'jpeg';
607
+ data: string;
608
+ }
609
+ export interface BrowserEvaluateOptions {
610
+ world?: 'main' | 'isolated';
611
+ timeoutMs?: number;
612
+ }
613
+ export interface BrowserEvaluateResult {
614
+ value: unknown;
615
+ type: string;
616
+ error?: string;
617
+ }
618
+ export interface BrowserPreflightCheck {
619
+ id: string;
620
+ label: string;
621
+ reason?: string | null;
622
+ fixCommands: string[];
623
+ advisory?: boolean;
624
+ }
625
+ export interface BrowserPreflightResult {
626
+ ok: boolean;
627
+ platform?: string;
628
+ packageManager?: string | null;
629
+ chromiumInstalling?: boolean;
630
+ missing?: BrowserPreflightCheck[];
631
+ message?: string;
632
+ }
633
+ export type BrowserAutomateEngine = 'claude-code' | 'codex' | 'hermes';
634
+ export interface BrowserAutomateOptions {
635
+ engine?: BrowserAutomateEngine;
636
+ model?: string;
637
+ tabId?: string;
638
+ }
639
+ export type BrowserAutomationPhase = 'observe' | 'act' | 'extract' | 'plan';
640
+ export type BrowserAutomationStatus = 'success' | 'error' | 'cancelled';
641
+ export type BrowserAutomationVerdict = 'approve' | 'edit' | 'deny';
642
+ export interface BrowserAutomationEventMap {
643
+ proposed: {
644
+ proposalId: string;
645
+ summary: string;
646
+ };
647
+ step: {
648
+ phase: BrowserAutomationPhase;
649
+ detail: string;
650
+ proposalId?: string;
651
+ engine?: BrowserAutomateEngine;
652
+ model?: string;
653
+ sessionId?: string;
654
+ };
655
+ done: {
656
+ status: BrowserAutomationStatus;
657
+ result?: string;
658
+ error?: string;
659
+ };
660
+ session: {
661
+ sessionId: string;
662
+ name: string;
663
+ };
664
+ gap: {
665
+ message: string;
666
+ };
667
+ }
668
+ export type BrowserAutomationEvent = keyof BrowserAutomationEventMap;
669
+ export interface BrowserAutomation {
670
+ readonly id: string;
671
+ on<E extends BrowserAutomationEvent>(event: E, cb: (payload: BrowserAutomationEventMap[E]) => void): Unsubscribe;
672
+ approve(proposalId: string, verdict?: BrowserAutomationVerdict, editedText?: string): Promise<void>;
673
+ cancel(): Promise<void>;
674
+ }
675
+ export interface BrowserIceCandidateInit {
676
+ candidate?: string;
677
+ sdpMLineIndex?: number | null;
678
+ sdpMid?: string | null;
679
+ usernameFragment?: string | null;
680
+ }
681
+ export interface BrowserIceServer {
682
+ urls: string | string[];
683
+ username?: string;
684
+ credential?: string;
685
+ }
686
+ export type BrowserViewConnectionState = 'negotiating' | 'connected' | 'failed' | 'closed';
687
+ export interface BrowserViewAttachOptions {
688
+ tabId?: string;
689
+ bounds?: BrowserViewBounds;
690
+ }
691
+ export interface BrowserViewBounds {
692
+ width: number;
693
+ height: number;
694
+ x?: number;
695
+ y?: number;
696
+ mobile?: boolean;
697
+ deviceScaleFactor?: number;
698
+ }
699
+ export declare const BROWSER_INPUT_MODIFIERS: {
700
+ readonly alt: 1;
701
+ readonly ctrl: 2;
702
+ readonly meta: 4;
703
+ readonly shift: 8;
704
+ };
705
+ export type BrowserMouseButton = 'none' | 'left' | 'middle' | 'right' | 'back' | 'forward';
706
+ export interface BrowserTouchPoint {
707
+ x: number;
708
+ y: number;
709
+ id: number;
710
+ force?: number;
711
+ radiusX?: number;
712
+ radiusY?: number;
713
+ }
714
+ export interface BrowserMouseInput {
715
+ kind: 'mouse';
716
+ eventType: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel';
717
+ x: number;
718
+ y: number;
719
+ button: BrowserMouseButton;
720
+ buttons: number;
721
+ clickCount: number;
722
+ modifiers: number;
723
+ deltaX?: number;
724
+ deltaY?: number;
725
+ deltaMode?: number;
726
+ sourceWidth?: number;
727
+ sourceHeight?: number;
728
+ }
729
+ export interface BrowserKeyInput {
730
+ kind: 'key';
731
+ eventType: 'keyDown' | 'rawKeyDown' | 'keyUp';
732
+ key: string;
733
+ code: string;
734
+ keyCode?: number;
735
+ text?: string;
736
+ modifiers: number;
737
+ isComposing?: boolean;
738
+ }
739
+ export interface BrowserTouchInput {
740
+ kind: 'touch';
741
+ eventType: 'touchStart' | 'touchMove' | 'touchEnd' | 'touchCancel';
742
+ touchPoints: BrowserTouchPoint[];
743
+ modifiers: number;
744
+ sourceWidth?: number;
745
+ sourceHeight?: number;
746
+ }
747
+ export interface BrowserTextInput {
748
+ kind: 'text';
749
+ text: string;
750
+ }
751
+ export interface BrowserImeInput {
752
+ kind: 'ime';
753
+ eventType: 'start' | 'update' | 'commit';
754
+ imeText?: string;
755
+ text?: string;
756
+ selectionStart?: number;
757
+ selectionEnd?: number;
758
+ }
759
+ export type BrowserInputEnvelope = BrowserMouseInput | BrowserKeyInput | BrowserTouchInput | BrowserTextInput | BrowserImeInput;
760
+ export type BrowserInputRejectReason = 'no_active_view' | 'unsupported_kind' | 'modifier_only_key' | 'host_not_ready' | 'malformed' | 'unknown';
761
+ export interface BrowserDriverStateSnapshot {
762
+ tabId: string;
763
+ state: 'idle' | 'automation' | 'human' | 'closed';
764
+ mode?: 'driving' | 'parked';
765
+ pendingResume?: boolean;
766
+ parkedReason?: string;
767
+ since: number;
768
+ lastInputAt?: number;
769
+ lastInputActor?: 'user' | 'agent';
770
+ ownerAgentId?: string;
771
+ ownerAgentLabel?: string;
772
+ }
773
+ export interface BrowserViewEventMap {
774
+ offer: {
775
+ sdp: string;
776
+ iceServers?: BrowserIceServer[];
777
+ };
778
+ ice: {
779
+ candidate: BrowserIceCandidateInit | null;
780
+ };
781
+ connectionState: {
782
+ state: BrowserViewConnectionState;
783
+ reason?: string;
784
+ };
785
+ navigationState: {
786
+ tabId: string;
787
+ url: string;
788
+ title: string;
789
+ isLoading: boolean;
790
+ canGoBack: boolean;
791
+ canGoForward: boolean;
792
+ };
793
+ driverState: BrowserDriverStateSnapshot;
794
+ inputFocus: {
795
+ focused: boolean;
796
+ };
797
+ inputRejected: {
798
+ kind: string;
799
+ reason: BrowserInputRejectReason;
800
+ message?: string;
801
+ };
802
+ gap: {
803
+ message: string;
804
+ };
805
+ }
806
+ export type BrowserViewEvent = keyof BrowserViewEventMap;
807
+ export interface BrowserInputResult {
808
+ delivered: boolean;
809
+ reason?: BrowserInputRejectReason;
810
+ }
811
+ export interface BrowserViewSession {
812
+ readonly id: string;
813
+ readonly tabId: string;
814
+ on<E extends BrowserViewEvent>(event: E, cb: (payload: BrowserViewEventMap[E]) => void): Unsubscribe;
815
+ answer(sdp: string): Promise<void>;
816
+ addIceCandidate(candidate: BrowserIceCandidateInit | null): Promise<void>;
817
+ setConnectionState(state: BrowserViewConnectionState, reason?: string): Promise<void>;
818
+ sendInput(input: BrowserInputEnvelope | BrowserInputEnvelope[]): Promise<BrowserInputResult>;
819
+ setBounds(bounds: BrowserViewBounds): Promise<void>;
820
+ detach(): Promise<void>;
821
+ }
822
+ export interface MinionryBrowserView {
823
+ attach(opts?: BrowserViewAttachOptions): Promise<BrowserViewSession>;
824
+ }
825
+ export interface MinionryBrowserTabs {
826
+ list(): Promise<BrowserTabsPayload>;
827
+ onChanged(cb: (payload: BrowserTabsPayload) => void): Unsubscribe;
828
+ }
829
+ export type BrowserErrorCode = 'BROWSER_NOT_PROVISIONED' | 'BROWSER_HOST_FAILED';
830
+ export interface MinionryBrowser {
831
+ readonly tabs: MinionryBrowserTabs;
832
+ readonly view: MinionryBrowserView;
833
+ navigate(url: string, tabId?: string): Promise<void>;
834
+ back(tabId?: string): Promise<void>;
835
+ forward(tabId?: string): Promise<void>;
836
+ reload(tabId?: string): Promise<void>;
837
+ stop(tabId?: string): Promise<void>;
838
+ open(url: string, opts?: BrowserOpenOptions): Promise<{
839
+ tabId: string;
840
+ }>;
841
+ close(tabId: string): Promise<void>;
842
+ select(tabId: string): Promise<void>;
843
+ snapshot(tabId: string): Promise<BrowserSnapshotResult>;
844
+ screenshot(tabId: string, opts?: BrowserScreenshotOptions): Promise<BrowserScreenshotResult>;
845
+ evaluate(tabId: string, expr: string, opts?: BrowserEvaluateOptions): Promise<BrowserEvaluateResult>;
846
+ automate(prompt: string, opts?: BrowserAutomateOptions): Promise<BrowserAutomation>;
847
+ preflight(): Promise<BrowserPreflightResult>;
848
+ resumeDriver(tabId: string): Promise<void>;
849
+ setDeviceProfile(tabId: string, formFactor: 'desktop' | 'mobile'): Promise<void>;
850
+ }
851
+ export interface OpenAppRequest {
852
+ app: string;
853
+ params?: Record<string, unknown>;
854
+ }
855
+ export type AppsOpenBrowserParams = {
856
+ tabId: string;
857
+ };
858
+ export type BrowserIntentParams = {
859
+ tabId: string;
860
+ };
861
+ export interface MinionryAuth {
862
+ getToken(): Promise<string>;
863
+ }
864
+ export interface MinionryAgents {
865
+ run(req: AgentRunRequest): Promise<AgentRun>;
866
+ readonly sessions: MinionryAgentSessions;
867
+ }
868
+ export interface MinionryPm {
869
+ createBoard(req: CreateBoardRequest): Promise<CreateBoardResult>;
870
+ getBoard(boardId: string): Promise<BoardSnapshot>;
871
+ listBoards(): Promise<BoardSummary[]>;
872
+ onBoardUpdate(boardId: string, cb: (snapshot: BoardSnapshot) => void): Unsubscribe;
873
+ createIssue(req: CreateIssueRequest): Promise<BoardIssueDetail>;
874
+ updateIssue(boardId: string, issueId: string, fields: UpdateIssueFields): Promise<BoardIssueDetail>;
875
+ deleteIssue(boardId: string, issueId: string): Promise<void>;
876
+ updateBoard(boardId: string, fields: UpdateBoardFields): Promise<BoardSummary>;
877
+ execute(boardId: string): Promise<BoardRun>;
878
+ readonly schedules: MinionryPmSchedules;
879
+ }
880
+ export interface MinionryFiles {
881
+ read(path: string): Promise<string>;
882
+ readEntry(path: string): Promise<FileReadResult>;
883
+ write(path: string, content: string): Promise<void>;
884
+ list(path: string): Promise<FileEntry[]>;
885
+ delete(path: string): Promise<void>;
886
+ mkdir(path: string): Promise<void>;
887
+ rename(path: string, newPath: string): Promise<void>;
888
+ search(path: string, query: string, options?: FileSearchOptions): Promise<FileSearchHandle>;
889
+ definition(path: string, symbolName: string, opts?: FileDefinitionOptions): Promise<FileDefinition[]>;
890
+ onChanged(path: string, cb: (change: FileChangeEvent) => void): Unsubscribe;
891
+ upload(path: string, data: Uint8Array, opts?: FileUploadOptions): Promise<FileTransferHandle<FileUploadResult>>;
892
+ download(path: string, opts?: FileDownloadOptions): Promise<FileTransferHandle<FileDownloadResult>>;
893
+ }
894
+ export interface MinionryApps {
895
+ open(req: OpenAppRequest): Promise<void>;
896
+ }
897
+ export interface MinionryStorage {
898
+ get(key: string): Promise<unknown>;
899
+ set(key: string, value: unknown): Promise<void>;
900
+ delete(key: string): Promise<void>;
901
+ keys(): Promise<string[]>;
902
+ }
903
+ export interface NotificationStatus {
904
+ granted: boolean;
905
+ }
906
+ export interface MinionryNotifications {
907
+ request(): Promise<void>;
908
+ status(): Promise<NotificationStatus>;
909
+ revoke(): Promise<void>;
910
+ }
911
+ export type ThemeMode = 'light' | 'dark';
912
+ export interface ThemeSnapshot {
913
+ mode: ThemeMode;
914
+ tokens: Record<string, string>;
915
+ }
916
+ export interface MinionryTheme {
917
+ get(): Promise<ThemeSnapshot>;
918
+ }
919
+ export interface LocaleSnapshot {
920
+ locale: string;
921
+ dir: 'ltr' | 'rtl';
922
+ }
923
+ export interface MinionryLocale {
924
+ get(): Promise<LocaleSnapshot>;
925
+ }
926
+ export interface AutocompleteEntry {
927
+ value: string;
928
+ label: string;
929
+ isDirectory: boolean;
930
+ isRecent: boolean;
931
+ fileType: string;
932
+ matchedIndices: Array<[number, number]>;
933
+ }
934
+ export interface SkillCatalogEntry {
935
+ name: string;
936
+ displayName: string;
937
+ description: string;
938
+ source: 'project' | 'user' | 'system' | 'builtin' | 'platform';
939
+ }
940
+ export interface SnippetCatalogEntry {
941
+ name: string;
942
+ aliases: readonly string[];
943
+ description: string;
944
+ origin: 'project' | 'personal';
945
+ preview: string;
946
+ bodyLength: number;
947
+ }
948
+ export interface ComposerModelEntry {
949
+ value: string;
950
+ engine: string;
951
+ label?: string;
952
+ description?: string;
953
+ isDefault?: boolean;
954
+ contextLength?: number;
955
+ }
956
+ export interface ComposerModelCatalogStatus {
957
+ fetchedAt: string | null;
958
+ stale: boolean;
959
+ refreshing: boolean;
960
+ }
961
+ export interface ComposerSettingsCatalog {
962
+ engines: string[];
963
+ defaults: {
964
+ engine: string;
965
+ model: string;
966
+ effortLevel: string;
967
+ fastMode: boolean;
968
+ };
969
+ models?: ComposerModelEntry[];
970
+ modelsStatus?: ComposerModelCatalogStatus;
971
+ effortLevels?: Record<string, string[]>;
972
+ inferenceEngines?: string[];
973
+ }
974
+ export interface MinionryComposer {
975
+ autocomplete(query: string): Promise<AutocompleteEntry[]>;
976
+ skills(): Promise<SkillCatalogEntry[]>;
977
+ snippets(query?: string): Promise<SnippetCatalogEntry[]>;
978
+ settings(): Promise<ComposerSettingsCatalog>;
979
+ }
980
+ export interface GitWorktreeSelector {
981
+ worktree?: string;
982
+ }
983
+ export interface GitFileStatus {
984
+ path: string;
985
+ status: 'M' | 'A' | 'D' | '?' | 'R' | 'C' | 'U';
986
+ staged: boolean;
987
+ originalPath?: string;
988
+ }
989
+ export interface GitCommitSuggestion {
990
+ workingDir: string;
991
+ branch: string;
992
+ message: string;
993
+ generatedAt: number;
994
+ }
995
+ export interface GitStatusResult {
996
+ branch: string;
997
+ isDirty: boolean;
998
+ staged: GitFileStatus[];
999
+ unstaged: GitFileStatus[];
1000
+ untracked: GitFileStatus[];
1001
+ ahead: number;
1002
+ behind: number;
1003
+ hasUpstream: boolean;
1004
+ commitSuggestion?: GitCommitSuggestion;
1005
+ }
1006
+ export interface GitLogRequest extends GitWorktreeSelector {
1007
+ limit?: number;
1008
+ skip?: number;
1009
+ search?: string;
1010
+ }
1011
+ export interface GitLogEntry {
1012
+ hash: string;
1013
+ shortHash: string;
1014
+ subject: string;
1015
+ author: string;
1016
+ date: string;
1017
+ }
1018
+ export interface GitLogResult {
1019
+ entries: GitLogEntry[];
1020
+ hasMore?: boolean;
1021
+ skip?: number;
1022
+ search?: string;
1023
+ }
1024
+ export interface GitDiffRequest extends GitWorktreeSelector {
1025
+ path: string;
1026
+ staged?: boolean;
1027
+ }
1028
+ export interface GitDiffResult {
1029
+ path: string;
1030
+ original: string;
1031
+ modified: string;
1032
+ staged: boolean;
1033
+ }
1034
+ export interface GitCommitFile {
1035
+ path: string;
1036
+ status: string;
1037
+ additions: number;
1038
+ deletions: number;
1039
+ oldPath?: string;
1040
+ }
1041
+ export interface GitCommitDetail {
1042
+ hash: string;
1043
+ shortHash: string;
1044
+ subject: string;
1045
+ body: string;
1046
+ author: string;
1047
+ date: string;
1048
+ files: GitCommitFile[];
1049
+ }
1050
+ export interface GitCommitDiffRequest extends GitWorktreeSelector {
1051
+ hash: string;
1052
+ path: string;
1053
+ }
1054
+ export interface GitCommitDiffResult {
1055
+ hash: string;
1056
+ path: string;
1057
+ original: string;
1058
+ modified: string;
1059
+ }
1060
+ export interface GitBranchEntry {
1061
+ name: string;
1062
+ shortHash: string;
1063
+ isRemote: boolean;
1064
+ isCurrent: boolean;
1065
+ upstream?: string;
1066
+ lastCommitDate?: string;
1067
+ ahead?: number;
1068
+ behind?: number;
1069
+ upstreamGone?: boolean;
1070
+ }
1071
+ export interface GitBranchListResult {
1072
+ branches: GitBranchEntry[];
1073
+ current: string;
1074
+ }
1075
+ export interface GitCreateBranchRequest extends GitWorktreeSelector {
1076
+ name: string;
1077
+ startPoint?: string;
1078
+ checkout?: boolean;
1079
+ }
1080
+ export interface GitBranchCreateResult {
1081
+ name: string;
1082
+ hash: string;
1083
+ }
1084
+ export interface GitDeleteBranchRequest extends GitWorktreeSelector {
1085
+ name: string;
1086
+ force?: boolean;
1087
+ }
1088
+ export interface MinionryGitBranches {
1089
+ list(req?: GitWorktreeSelector): Promise<GitBranchListResult>;
1090
+ create(req: GitCreateBranchRequest): Promise<GitBranchCreateResult>;
1091
+ delete(req: GitDeleteBranchRequest): Promise<void>;
1092
+ }
1093
+ export interface GitTagEntry {
1094
+ name: string;
1095
+ shortHash: string;
1096
+ date: string;
1097
+ message: string;
1098
+ }
1099
+ export interface GitTagListResult {
1100
+ tags: GitTagEntry[];
1101
+ }
1102
+ export interface GitCreateTagRequest extends GitWorktreeSelector {
1103
+ name: string;
1104
+ message?: string;
1105
+ commit?: string;
1106
+ }
1107
+ export interface GitTagCreateResult {
1108
+ name: string;
1109
+ hash: string;
1110
+ }
1111
+ export interface GitPushTagRequest extends GitWorktreeSelector {
1112
+ name?: string;
1113
+ all?: boolean;
1114
+ }
1115
+ export interface GitTagPushResult {
1116
+ name: string;
1117
+ output: string;
1118
+ }
1119
+ export interface MinionryGitTags {
1120
+ list(req?: GitWorktreeSelector): Promise<GitTagListResult>;
1121
+ create(req: GitCreateTagRequest): Promise<GitTagCreateResult>;
1122
+ push(req?: GitPushTagRequest): Promise<GitTagPushResult>;
1123
+ }
1124
+ export interface GitRemoteInfo {
1125
+ hasRemote: boolean;
1126
+ remoteUrl?: string;
1127
+ provider?: 'github' | 'gitlab' | 'unknown';
1128
+ defaultBranch?: string;
1129
+ currentBranch?: string;
1130
+ hasGhCli?: boolean;
1131
+ ghCliAuthenticated?: boolean;
1132
+ ghCliBinary?: 'gh' | 'glab';
1133
+ remoteBranches?: string[];
1134
+ preferredBaseBranch?: string;
1135
+ }
1136
+ export interface MinionryGitRemote {
1137
+ info(req?: GitWorktreeSelector): Promise<GitRemoteInfo>;
1138
+ }
1139
+ export interface GitRepoInfo {
1140
+ path: string;
1141
+ name: string;
1142
+ branch?: string;
1143
+ }
1144
+ export interface GitReposDiscoverResult {
1145
+ repos: GitRepoInfo[];
1146
+ rootIsGitRepo: boolean;
1147
+ }
1148
+ export interface MinionryGitRepos {
1149
+ discover(): Promise<GitReposDiscoverResult>;
1150
+ }
1151
+ export interface GitWorktreeStatusSummary {
1152
+ staged: number;
1153
+ unstaged: number;
1154
+ untracked: number;
1155
+ ahead: number;
1156
+ behind: number;
1157
+ hasUpstream: boolean;
1158
+ }
1159
+ export interface GitWorktreeInfo {
1160
+ path: string;
1161
+ branch?: string;
1162
+ head: string;
1163
+ isMain: boolean;
1164
+ isBare: boolean;
1165
+ prunable?: boolean;
1166
+ status?: GitWorktreeStatusSummary;
1167
+ }
1168
+ export interface GitWorktreesListResult {
1169
+ worktrees: GitWorktreeInfo[];
1170
+ activeWorktreePath: string | null;
1171
+ }
1172
+ export interface GitWorktreeCreateRequest {
1173
+ branchName: string;
1174
+ baseBranch?: string;
1175
+ path?: string;
1176
+ assign?: boolean;
1177
+ }
1178
+ export interface GitWorktreeCreateResult {
1179
+ path: string;
1180
+ branch: string;
1181
+ head: string;
1182
+ }
1183
+ export interface GitWorktreeRemoveRequest {
1184
+ path: string;
1185
+ force?: boolean;
1186
+ deleteBranch?: boolean;
1187
+ }
1188
+ export interface GitWorktreeSwitchActiveRequest {
1189
+ path?: string | null;
1190
+ }
1191
+ export interface GitWorktreeSwitchActiveResult {
1192
+ path: string | null;
1193
+ branch: string | null;
1194
+ }
1195
+ export interface MinionryGitWorktrees {
1196
+ list(): Promise<GitWorktreesListResult>;
1197
+ create(req: GitWorktreeCreateRequest): Promise<GitWorktreeCreateResult>;
1198
+ remove(req: GitWorktreeRemoveRequest): Promise<void>;
1199
+ switchActive(req?: GitWorktreeSwitchActiveRequest): Promise<GitWorktreeSwitchActiveResult>;
1200
+ onChanged(cb: (payload: GitWorktreesListResult) => void): Unsubscribe;
1201
+ }
1202
+ export interface GitMergeBlocker {
1203
+ path: string;
1204
+ status: 'M' | 'A' | 'D' | '?' | 'R' | 'C' | 'U';
1205
+ staged: boolean;
1206
+ }
1207
+ export interface GitMergePreviewRequest extends GitWorktreeSelector {
1208
+ sourceBranch: string;
1209
+ targetBranch: string;
1210
+ }
1211
+ export interface GitMergePreviewResult {
1212
+ clean: boolean;
1213
+ conflicts: string[];
1214
+ stat: string;
1215
+ commits: Array<{
1216
+ hash: string;
1217
+ message: string;
1218
+ }>;
1219
+ ahead: number;
1220
+ targetWorktreePath?: string;
1221
+ targetWorktreeBlockers?: GitMergeBlocker[];
1222
+ }
1223
+ export interface GitMergeRunRequest extends GitWorktreeSelector {
1224
+ sourceBranch: string;
1225
+ targetBranch: string;
1226
+ strategy: 'merge' | 'squash' | 'rebase';
1227
+ commitMessage?: string;
1228
+ deleteWorktree?: boolean;
1229
+ deleteBranch?: boolean;
1230
+ stashFirst?: boolean;
1231
+ }
1232
+ export interface GitMergeRunResult {
1233
+ success: boolean;
1234
+ mergeCommit?: string;
1235
+ error?: string;
1236
+ conflictFiles?: string[];
1237
+ warnings?: string[];
1238
+ targetWorktreePath?: string;
1239
+ targetWorktreeBlockers?: GitMergeBlocker[];
1240
+ stashRef?: string;
1241
+ stashSha?: string;
1242
+ stashMessage?: string;
1243
+ }
1244
+ export interface GitMergeAbortResult {
1245
+ aborted: boolean;
1246
+ }
1247
+ export interface GitMergeCompleteResult {
1248
+ success: boolean;
1249
+ mergeCommit: string;
1250
+ }
1251
+ export interface GitMergeStashPopRequest extends GitWorktreeSelector {
1252
+ stashSha: string;
1253
+ }
1254
+ export interface GitMergeStashPopResult {
1255
+ success: boolean;
1256
+ error?: string;
1257
+ targetWorktreePath?: string;
1258
+ }
1259
+ export interface GitMergeDiscardBlockersRequest extends GitWorktreeSelector {
1260
+ paths: string[];
1261
+ }
1262
+ export interface GitMergeDiscardBlockersResult {
1263
+ success: boolean;
1264
+ error?: string;
1265
+ targetWorktreePath?: string;
1266
+ paths?: string[];
1267
+ }
1268
+ export interface MinionryGitMerge {
1269
+ preview(req: GitMergePreviewRequest): Promise<GitMergePreviewResult>;
1270
+ run(req: GitMergeRunRequest): Promise<GitMergeRunResult>;
1271
+ abort(req?: GitWorktreeSelector): Promise<GitMergeAbortResult>;
1272
+ complete(req?: GitWorktreeSelector): Promise<GitMergeCompleteResult>;
1273
+ stashPop(req: GitMergeStashPopRequest): Promise<GitMergeStashPopResult>;
1274
+ discardBlockers(req: GitMergeDiscardBlockersRequest): Promise<GitMergeDiscardBlockersResult>;
1275
+ }
1276
+ export interface GitPrDescriptionRequest extends GitWorktreeSelector {
1277
+ baseBranch?: string;
1278
+ }
1279
+ export interface GitPrDescriptionResult {
1280
+ title: string;
1281
+ body: string;
1282
+ }
1283
+ export interface GitCreatePrRequest extends GitWorktreeSelector {
1284
+ title: string;
1285
+ body?: string;
1286
+ baseBranch?: string;
1287
+ draft?: boolean;
1288
+ }
1289
+ export interface GitCreatePrResult {
1290
+ url: string;
1291
+ method?: 'gh' | 'glab' | 'browser';
1292
+ prNumber?: number;
1293
+ }
1294
+ export interface MinionryGitPr {
1295
+ generateDescription(req?: GitPrDescriptionRequest): Promise<GitPrDescriptionResult>;
1296
+ create(req: GitCreatePrRequest): Promise<GitCreatePrResult>;
1297
+ }
1298
+ export interface GitStageRequest extends GitWorktreeSelector {
1299
+ paths?: string[];
1300
+ stageAll?: boolean;
1301
+ }
1302
+ export interface GitStageResult {
1303
+ paths: string[];
1304
+ }
1305
+ export interface GitUnstageRequest extends GitWorktreeSelector {
1306
+ paths: string[];
1307
+ }
1308
+ export interface GitCommitRequest extends GitWorktreeSelector {
1309
+ message: string;
1310
+ }
1311
+ export interface GitCommitResult {
1312
+ hash: string;
1313
+ message: string;
1314
+ }
1315
+ export interface GitGenerateCommitMessageResult {
1316
+ message: string;
1317
+ }
1318
+ export interface GitCheckoutRequest extends GitWorktreeSelector {
1319
+ branch: string;
1320
+ create?: boolean;
1321
+ startPoint?: string;
1322
+ }
1323
+ export interface GitCheckoutResult {
1324
+ branch: string;
1325
+ previous: string;
1326
+ }
1327
+ export interface GitPushRequest extends GitWorktreeSelector {
1328
+ remote?: string;
1329
+ branch?: string;
1330
+ setUpstream?: boolean;
1331
+ }
1332
+ export interface GitPushResult {
1333
+ output: string;
1334
+ upstream?: string;
1335
+ }
1336
+ export interface GitPullResult {
1337
+ output: string;
1338
+ }
1339
+ export interface GitBranchChangedEvent {
1340
+ worktreePath: string;
1341
+ branch: string;
1342
+ }
1343
+ export interface MinionryGit {
1344
+ status(req?: GitWorktreeSelector): Promise<GitStatusResult>;
1345
+ log(req?: GitLogRequest): Promise<GitLogResult>;
1346
+ diff(req: GitDiffRequest): Promise<GitDiffResult>;
1347
+ show(hash: string, req?: GitWorktreeSelector): Promise<GitCommitDetail>;
1348
+ commitDiff(req: GitCommitDiffRequest): Promise<GitCommitDiffResult>;
1349
+ readonly branches: MinionryGitBranches;
1350
+ readonly tags: MinionryGitTags;
1351
+ readonly remote: MinionryGitRemote;
1352
+ readonly repos: MinionryGitRepos;
1353
+ readonly worktrees: MinionryGitWorktrees;
1354
+ readonly merge: MinionryGitMerge;
1355
+ readonly pr: MinionryGitPr;
1356
+ stage(req: GitStageRequest): Promise<GitStageResult>;
1357
+ unstage(req: GitUnstageRequest): Promise<GitStageResult>;
1358
+ commit(req: GitCommitRequest): Promise<GitCommitResult>;
1359
+ generateCommitMessage(req?: GitWorktreeSelector): Promise<GitGenerateCommitMessageResult>;
1360
+ checkout(req: GitCheckoutRequest): Promise<GitCheckoutResult>;
1361
+ push(req?: GitPushRequest): Promise<GitPushResult>;
1362
+ pull(req?: GitWorktreeSelector): Promise<GitPullResult>;
1363
+ onBranchChanged(cb: (payload: GitBranchChangedEvent) => void): Unsubscribe;
1364
+ onCommitSuggestion(cb: (payload: GitCommitSuggestion) => void): Unsubscribe;
1365
+ }
1366
+ export interface TerminalSessionSummary {
1367
+ id: string;
1368
+ shell: string;
1369
+ cwd: string;
1370
+ cols: number;
1371
+ rows: number;
1372
+ createdAt: string;
1373
+ lastActivityAt: string;
1374
+ ownerLabel?: string;
1375
+ }
1376
+ export type TerminalSessionChangeEvent = {
1377
+ kind: 'opened';
1378
+ session: TerminalSessionSummary;
1379
+ } | {
1380
+ kind: 'closed';
1381
+ id: string;
1382
+ };
1383
+ export interface MinionryTerminalSessions {
1384
+ list(): Promise<TerminalSessionSummary[]>;
1385
+ onChanged(cb: (change: TerminalSessionChangeEvent) => void): Unsubscribe;
1386
+ }
1387
+ export interface TerminalOpenOptions {
1388
+ cwd?: string;
1389
+ cols: number;
1390
+ rows: number;
1391
+ }
1392
+ export interface TerminalOpenResult {
1393
+ id: string;
1394
+ shell: string;
1395
+ cwd: string;
1396
+ cols: number;
1397
+ rows: number;
1398
+ platform: string;
1399
+ }
1400
+ export interface TerminalSize {
1401
+ cols: number;
1402
+ rows: number;
1403
+ }
1404
+ export interface TerminalEventMap {
1405
+ output: {
1406
+ data: string;
1407
+ };
1408
+ exit: {
1409
+ exitCode: number;
1410
+ };
1411
+ error: {
1412
+ message: string;
1413
+ };
1414
+ scrollback: {
1415
+ data: string;
1416
+ };
1417
+ gap: {
1418
+ message: string;
1419
+ };
1420
+ }
1421
+ export type TerminalEvent = keyof TerminalEventMap;
1422
+ export interface TerminalHandle {
1423
+ readonly id: string;
1424
+ on<E extends TerminalEvent>(event: E, cb: (payload: TerminalEventMap[E]) => void): Unsubscribe;
1425
+ detach(): Promise<void>;
1426
+ }
1427
+ export type TerminalErrorCode = 'PTY_NOT_AVAILABLE';
1428
+ export interface MinionryTerminal {
1429
+ readonly sessions: MinionryTerminalSessions;
1430
+ open(opts: TerminalOpenOptions): Promise<TerminalOpenResult>;
1431
+ attach(id: string): Promise<TerminalHandle>;
1432
+ write(id: string, data: string | string[]): Promise<void>;
1433
+ resize(id: string, size: TerminalSize): Promise<void>;
1434
+ close(id: string): Promise<void>;
1435
+ }
1436
+ export type AppToolProfile = 'browser';
1437
+ export interface AppToolSpec {
1438
+ name: string;
1439
+ description: string;
1440
+ inputSchema: Record<string, unknown>;
1441
+ timeoutMs?: number;
1442
+ }
1443
+ export interface AppToolDefinition extends AppToolSpec {
1444
+ handler(input: unknown, ctx: AppToolCallContext): unknown | Promise<unknown>;
1445
+ }
1446
+ export interface AppToolCallContext {
1447
+ readonly callId: string;
1448
+ readonly tool: string;
1449
+ readonly signal: AbortSignal;
1450
+ }
1451
+ export interface RegisterToolsRequest {
1452
+ tools: AppToolDefinition[];
1453
+ profile?: AppToolProfile;
1454
+ }
1455
+ export interface ToolsRegistration {
1456
+ readonly id: string;
1457
+ readonly tools: readonly string[];
1458
+ unregister(): Promise<void>;
1459
+ }
1460
+ export interface MinionryTools {
1461
+ register(req: RegisterToolsRequest): Promise<ToolsRegistration>;
1462
+ }
1463
+ export type AppToolsErrorCode = 'APP_UNAVAILABLE' | 'APP_TIMEOUT' | 'APP_ERROR';
1464
+ export type QualityGrade = 'A+' | 'A' | 'A-' | 'B+' | 'B' | 'B-' | 'C+' | 'C' | 'C-' | 'D' | 'F+' | 'F' | 'F-' | 'N/A';
1465
+ export type QualityDimensionName = 'security' | 'reliability' | 'maintainability';
1466
+ export type QualitySeverity = 'critical' | 'high' | 'medium' | 'low';
1467
+ export type QualityFindingStatus = 'confirmed' | 'uncertain' | 'likely-fp';
1468
+ export interface QualityFindingDismissal {
1469
+ reason: string;
1470
+ dismissedAt: string;
1471
+ }
1472
+ export interface QualityFinding {
1473
+ severity: QualitySeverity;
1474
+ category: string;
1475
+ file: string;
1476
+ line: number | null;
1477
+ title: string;
1478
+ description: string;
1479
+ suggestion?: string;
1480
+ evidence?: string;
1481
+ verified?: boolean;
1482
+ verificationNote?: string;
1483
+ status?: QualityFindingStatus;
1484
+ confidence?: number;
1485
+ triageRationale?: string;
1486
+ fingerprint?: string;
1487
+ introduced?: boolean;
1488
+ dismissal?: QualityFindingDismissal;
1489
+ }
1490
+ export interface QualityDimension {
1491
+ name: QualityDimensionName;
1492
+ score: number | null;
1493
+ grade: QualityGrade;
1494
+ rationale: string;
1495
+ available: boolean;
1496
+ findingCount: number;
1497
+ worstSeverity: QualitySeverity | null;
1498
+ }
1499
+ export type QualityReadinessLevel = 'insufficient-data' | 'blocked' | 'testing' | 'develop' | 'production';
1500
+ export interface QualityReadiness {
1501
+ level: QualityReadinessLevel;
1502
+ headline: string;
1503
+ rationale: string;
1504
+ blockers: string[];
1505
+ }
1506
+ export interface QualityGateResult {
1507
+ passed: boolean;
1508
+ failingConditions: string[];
1509
+ }
1510
+ export interface QualityTriageSummary {
1511
+ total: number;
1512
+ confirmed: number;
1513
+ likelyFalsePositive: number;
1514
+ uncertain: number;
1515
+ }
1516
+ export interface QualityCategoryScore {
1517
+ name: string;
1518
+ score: number;
1519
+ available: boolean;
1520
+ issueCount?: number;
1521
+ reason?: string;
1522
+ }
1523
+ export interface QualityCategoryPenalty {
1524
+ category: string;
1525
+ score: number;
1526
+ grade: string;
1527
+ penalty: number;
1528
+ findingCount: number;
1529
+ }
1530
+ export interface QualityScoreBreakdown {
1531
+ penaltyDensity: number;
1532
+ totalPenalty: number;
1533
+ issueDensity: number;
1534
+ kloc: number;
1535
+ categoryPenalties: QualityCategoryPenalty[];
1536
+ }
1537
+ export interface QualityReport {
1538
+ path: string;
1539
+ overall: number | null;
1540
+ grade: QualityGrade;
1541
+ dimensions: QualityDimension[];
1542
+ categories: QualityCategoryScore[];
1543
+ findings: QualityFinding[];
1544
+ codeReview: QualityFinding[];
1545
+ analyzedFiles: number;
1546
+ totalLines: number;
1547
+ timestamp: string;
1548
+ ecosystem: string[];
1549
+ scoreBreakdown?: QualityScoreBreakdown;
1550
+ gate?: QualityGateResult;
1551
+ gradeRationale?: string;
1552
+ readiness?: QualityReadiness;
1553
+ triage?: QualityTriageSummary;
1554
+ scanDurationMs?: number;
1555
+ reviewDurationMs?: number;
1556
+ reviewSessionId?: string;
1557
+ baselineAt?: string;
1558
+ agentCost?: QualityAgentCost;
1559
+ structuralScope?: QualityStructuralScope;
1560
+ changeActivity?: QualityChangeActivity;
1561
+ commit?: QualityCommitRef;
1562
+ }
1563
+ export interface QualityStructuralScope {
1564
+ files: number;
1565
+ extensions: string[];
1566
+ }
1567
+ export interface QualityCommitRef {
1568
+ sha: string;
1569
+ branch: string;
1570
+ dirty: boolean;
1571
+ }
1572
+ export interface QualityChangeActivityFile {
1573
+ commits: number;
1574
+ linesChanged: number;
1575
+ lastChangedAt: string;
1576
+ }
1577
+ export interface QualityChangeActivity {
1578
+ available: boolean;
1579
+ reason?: string;
1580
+ windowDays: number;
1581
+ commitsScanned: number;
1582
+ truncated: boolean;
1583
+ files: Record<string, QualityChangeActivityFile>;
1584
+ }
1585
+ export type QualityAgentCost =
1586
+ {
1587
+ available: false;
1588
+ reason: string;
1589
+ } | {
1590
+ available: true;
1591
+ sampledAt: string;
1592
+ sampledTurns: number;
1593
+ truncated: boolean;
1594
+ attributedTurns: number;
1595
+ unattributed: {
1596
+ missingOutputTokens: number;
1597
+ outsideSpaceRoot: number;
1598
+ unknownWriteTools: number;
1599
+ };
1600
+ unreadableFiles: number;
1601
+ files: QualityAgentCostFile[];
1602
+ comparison: QualityAgentCostComparison;
1603
+ };
1604
+ export interface QualityAgentCostFile {
1605
+ file: string;
1606
+ turns: number;
1607
+ medianOutputTokens?: number;
1608
+ medianDurationMs?: number;
1609
+ reason?: string;
1610
+ }
1611
+ export interface QualityAgentCostSide {
1612
+ turns: number;
1613
+ medianOutputTokens?: number;
1614
+ reason?: string;
1615
+ }
1616
+ export interface QualityAgentCostComparison {
1617
+ withStructuralFindings: QualityAgentCostSide;
1618
+ withoutStructuralFindings: QualityAgentCostSide;
1619
+ }
1620
+ export interface QualityDirectory {
1621
+ path: string;
1622
+ label: string;
1623
+ }
1624
+ export interface QualityHistoryEntry {
1625
+ timestamp: string;
1626
+ overall: number | null;
1627
+ grade: QualityGrade;
1628
+ issueDensity?: number;
1629
+ categoryScores?: Array<{
1630
+ category: string;
1631
+ score: number;
1632
+ grade: string;
1633
+ }>;
1634
+ dimensionScores?: Record<QualityDimensionName, {
1635
+ score: number | null;
1636
+ grade: QualityGrade;
1637
+ }>;
1638
+ directories: Array<{
1639
+ path: string;
1640
+ score: number | null;
1641
+ grade: QualityGrade;
1642
+ }>;
1643
+ scanDurationMs?: number;
1644
+ reviewDurationMs?: number;
1645
+ commit?: QualityCommitRef;
1646
+ }
1647
+ export type QualityOperationKind = 'scanning' | 'reviewing' | 'fixing';
1648
+ export interface QualityActiveOperation {
1649
+ kind: QualityOperationKind;
1650
+ path: string;
1651
+ startedAt: string;
1652
+ sessionId?: string;
1653
+ }
1654
+ export type QualityPendingResult = {
1655
+ kind: 'scanResults';
1656
+ path: string;
1657
+ completedAt: string;
1658
+ report: QualityReport;
1659
+ } | {
1660
+ kind: 'codeReview';
1661
+ path: string;
1662
+ completedAt: string;
1663
+ findings: QualityFinding[];
1664
+ };
1665
+ export interface QualityState {
1666
+ directories: QualityDirectory[];
1667
+ reports: Record<string, QualityReport>;
1668
+ history: QualityHistoryEntry[];
1669
+ activeOperations: QualityActiveOperation[];
1670
+ pendingResults: QualityPendingResult[];
1671
+ schedules?: QualityScheduleSnapshot[];
1672
+ }
1673
+ export type QualityScheduleTiming =
1674
+ {
1675
+ kind: 'daily';
1676
+ time: string;
1677
+ timeZone: string;
1678
+ days?: number[];
1679
+ }
1680
+ | {
1681
+ kind: 'interval';
1682
+ everyMs: number;
1683
+ };
1684
+ export interface QualityScheduleHistoryEntry {
1685
+ at: string;
1686
+ status: ScheduleFireStatus;
1687
+ error?: string;
1688
+ }
1689
+ export interface QualityScheduleSnapshot {
1690
+ id: string;
1691
+ createdAt: string;
1692
+ name?: string;
1693
+ path: string;
1694
+ timing: QualityScheduleTiming;
1695
+ enabled: boolean;
1696
+ nextFireAt: string | null;
1697
+ lastFire?: {
1698
+ at: string;
1699
+ status: ScheduleFireStatus;
1700
+ };
1701
+ history: QualityScheduleHistoryEntry[];
1702
+ }
1703
+ export interface CreateQualityScheduleRequest {
1704
+ path?: string;
1705
+ name?: string;
1706
+ timing: QualityScheduleTiming;
1707
+ enabled?: boolean;
1708
+ }
1709
+ export interface UpdateQualityScheduleRequest {
1710
+ name?: string;
1711
+ timing?: QualityScheduleTiming;
1712
+ enabled?: boolean;
1713
+ }
1714
+ export interface MinionryQualitySchedules {
1715
+ list(): Promise<QualityScheduleSnapshot[]>;
1716
+ create(req: CreateQualityScheduleRequest): Promise<QualityScheduleSnapshot>;
1717
+ update(scheduleId: string, patch: UpdateQualityScheduleRequest): Promise<QualityScheduleSnapshot>;
1718
+ delete(scheduleId: string): Promise<void>;
1719
+ }
1720
+ export interface QualityTool {
1721
+ name: string;
1722
+ installed: boolean;
1723
+ installCommand: string;
1724
+ category: 'linter' | 'formatter' | 'complexity' | 'general' | 'security';
1725
+ }
1726
+ export interface QualityToolsResult {
1727
+ path: string;
1728
+ tools: QualityTool[];
1729
+ ecosystem: string[];
1730
+ }
1731
+ export interface QualitySettings {
1732
+ engine: string;
1733
+ model: string;
1734
+ effortLevel: string;
1735
+ fastMode: boolean;
1736
+ agentNotes?: boolean;
1737
+ }
1738
+ export interface QualitySettingsUpdate {
1739
+ engine?: string;
1740
+ model?: string;
1741
+ effortLevel?: string;
1742
+ fastMode?: boolean;
1743
+ agentNotes?: boolean;
1744
+ }
1745
+ export type QualityChangeEvent =
1746
+ {
1747
+ kind: 'results';
1748
+ path: string;
1749
+ report: QualityReport;
1750
+ }
1751
+ | {
1752
+ kind: 'directories';
1753
+ directories: QualityDirectory[];
1754
+ }
1755
+ | {
1756
+ kind: 'tools';
1757
+ path: string;
1758
+ tools: QualityTool[];
1759
+ ecosystem: string[];
1760
+ }
1761
+ | {
1762
+ kind: 'postSession';
1763
+ path: string;
1764
+ report: QualityReport;
1765
+ }
1766
+ | {
1767
+ kind: 'agentTurn';
1768
+ path: string;
1769
+ worktree?: true;
1770
+ changedFiles: string[];
1771
+ report: QualityReport;
1772
+ }
1773
+ | {
1774
+ kind: 'schedules';
1775
+ schedules: QualityScheduleSnapshot[];
1776
+ };
1777
+ export type QualityRunPhase = 'detecting' | 'installing' | 'scanning' | 'reviewing' | 'complete';
1778
+ export interface QualityRunProgress {
1779
+ phase: QualityRunPhase;
1780
+ step: string;
1781
+ current: number;
1782
+ total: number;
1783
+ detail?: string;
1784
+ etaMs?: number;
1785
+ startedAt?: number;
1786
+ sessionId?: string;
1787
+ }
1788
+ export interface QualityRunEventMap {
1789
+ progress: QualityRunProgress;
1790
+ phase: {
1791
+ phase: QualityRunPhase;
1792
+ sessionId?: string;
1793
+ };
1794
+ session: {
1795
+ sessionId: string;
1796
+ };
1797
+ }
1798
+ export type QualityRunEvent = keyof QualityRunEventMap;
1799
+ export type QualityLegStatus = 'ok' | 'skipped' | 'failed';
1800
+ export interface QualityLegOutcome {
1801
+ status: QualityLegStatus;
1802
+ code?: string;
1803
+ message?: string;
1804
+ sessionId?: string;
1805
+ }
1806
+ export type QualityRunStatus = 'ok' | 'partial' | 'error' | 'cancelled';
1807
+ export interface QualityRunResult {
1808
+ path: string;
1809
+ status: QualityRunStatus;
1810
+ report: QualityReport | null;
1811
+ legs: {
1812
+ scan: QualityLegOutcome;
1813
+ review: QualityLegOutcome;
1814
+ };
1815
+ sessionId?: string;
1816
+ }
1817
+ export interface QualityRun {
1818
+ readonly path: string;
1819
+ readonly attached: boolean;
1820
+ on<E extends QualityRunEvent>(event: E, cb: (payload: QualityRunEventMap[E]) => void): Unsubscribe;
1821
+ result(): Promise<QualityRunResult>;
1822
+ }
1823
+ export type QualityErrorCode = 'CLAUDE_NOT_INSTALLED' | 'OPERATION_IN_PROGRESS';
1824
+ export type QualityFindingState = 'dismissed' | 'active';
1825
+ export interface QualityFindingStateRequest {
1826
+ path: string;
1827
+ fingerprints: string[];
1828
+ state: QualityFindingState;
1829
+ reason?: string;
1830
+ }
1831
+ export interface QualityFindingStateResult {
1832
+ applied: number;
1833
+ dropped: number;
1834
+ }
1835
+ export interface MinionryQuality {
1836
+ state(): Promise<QualityState>;
1837
+ detectTools(path?: string): Promise<QualityToolsResult>;
1838
+ run(path?: string): Promise<QualityRun>;
1839
+ cancel(path?: string): Promise<void>;
1840
+ installTools(path?: string, tools?: string[]): Promise<QualityToolsResult>;
1841
+ saveDirectories(directories: QualityDirectory[]): Promise<void>;
1842
+ settings(): Promise<QualitySettings>;
1843
+ setSettings(settings: QualitySettingsUpdate): Promise<QualitySettings>;
1844
+ onChanged(cb: (change: QualityChangeEvent) => void): Unsubscribe;
1845
+ setFindingState(request: QualityFindingStateRequest): Promise<QualityFindingStateResult>;
1846
+ readonly schedules: MinionryQualitySchedules;
1847
+ }
1848
+ export interface InferenceMessage {
1849
+ role: 'user' | 'assistant';
1850
+ content: string;
1851
+ }
1852
+ export interface InferenceChatRequest {
1853
+ messages: InferenceMessage[];
1854
+ system?: string;
1855
+ engine?: string;
1856
+ model?: string;
1857
+ effortLevel?: string;
1858
+ }
1859
+ export type InferenceRunResultStatus = 'done' | 'error' | 'cancelled';
1860
+ export type InferenceRunStatus = 'running' | InferenceRunResultStatus;
1861
+ export interface InferenceUsage {
1862
+ inputTokens: number;
1863
+ outputTokens: number;
1864
+ }
1865
+ export type InferenceErrorCode = 'ENGINE_UNAVAILABLE' | 'ENGINE_AUTH' | 'ENGINE_LIMIT' | 'TIMEOUT' | 'UPSTREAM_ERROR';
1866
+ export interface InferenceRunResult {
1867
+ status: InferenceRunResultStatus;
1868
+ text: string;
1869
+ engine: string;
1870
+ model?: string;
1871
+ usage?: InferenceUsage;
1872
+ error?: {
1873
+ code: InferenceErrorCode | (string & {});
1874
+ message: string;
1875
+ };
1876
+ }
1877
+ export interface InferenceRunEventMap {
1878
+ delta: {
1879
+ text: string;
1880
+ };
1881
+ usage: InferenceUsage;
1882
+ status: {
1883
+ status: InferenceRunStatus;
1884
+ };
1885
+ gap: {
1886
+ message: string;
1887
+ };
1888
+ }
1889
+ export type InferenceRunEvent = keyof InferenceRunEventMap;
1890
+ export interface InferenceRun {
1891
+ readonly id: string;
1892
+ on<E extends InferenceRunEvent>(event: E, cb: (payload: InferenceRunEventMap[E]) => void): Unsubscribe;
1893
+ result(): Promise<InferenceRunResult>;
1894
+ cancel(): Promise<void>;
1895
+ }
1896
+ export interface MinionryInference {
1897
+ chat(req: InferenceChatRequest): Promise<InferenceRun>;
1898
+ }
1899
+ export type AppEndpointErrorCode = 'ENDPOINT_INVALID' | 'MODEL_NOT_ALLOWED' | 'ENGINE_UNAVAILABLE';
1900
+ export interface RegisterEndpointRequest {
1901
+ id: string;
1902
+ label: string;
1903
+ engine: 'hermes';
1904
+ baseUrl: string;
1905
+ apiKey: string;
1906
+ model: string;
1907
+ contextLength?: number;
1908
+ ttlMs?: number;
1909
+ }
1910
+ export interface RegisteredEndpoint {
1911
+ id: string;
1912
+ label: string;
1913
+ engine: 'hermes';
1914
+ modelValue: string;
1915
+ model: string;
1916
+ contextLength?: number;
1917
+ expiresAt: string;
1918
+ }
1919
+ export interface MinionryEndpoints {
1920
+ register(req: RegisterEndpointRequest): Promise<RegisteredEndpoint>;
1921
+ unregister(id: string): Promise<void>;
1922
+ list(): Promise<RegisteredEndpoint[]>;
1923
+ }
1924
+ export interface ProviderEventMap {
1925
+ disconnect: void;
1926
+ grantsChanged: Scope[];
1927
+ spaceChanged: SpaceInfo;
1928
+ fileChangeGap: {
1929
+ path: string;
1930
+ message: string;
1931
+ };
1932
+ themeChanged: ThemeSnapshot;
1933
+ localeChanged: LocaleSnapshot;
1934
+ boardGap: {
1935
+ boardId: string;
1936
+ message: string;
1937
+ };
1938
+ intent: {
1939
+ source: string;
1940
+ params?: Record<string, unknown>;
1941
+ };
1942
+ }
1943
+ export type ProviderEvent = keyof ProviderEventMap;
1944
+ export interface MinionryProvider {
1945
+ readonly version: '1';
1946
+ features(): Promise<string[]>;
1947
+ connect(req: ConnectRequest): Promise<ConnectResult>;
1948
+ disconnect(): Promise<void>;
1949
+ readonly auth: MinionryAuth;
1950
+ readonly agents: MinionryAgents;
1951
+ readonly apps: MinionryApps;
1952
+ readonly pm: MinionryPm;
1953
+ readonly files: MinionryFiles;
1954
+ readonly storage: MinionryStorage;
1955
+ readonly notifications: MinionryNotifications;
1956
+ readonly theme: MinionryTheme;
1957
+ readonly locale: MinionryLocale;
1958
+ readonly browser: MinionryBrowser;
1959
+ readonly composer: MinionryComposer;
1960
+ readonly terminal: MinionryTerminal;
1961
+ readonly git: MinionryGit;
1962
+ readonly tools: MinionryTools;
1963
+ readonly quality: MinionryQuality;
1964
+ readonly inference: MinionryInference;
1965
+ readonly endpoints: MinionryEndpoints;
1966
+ on<E extends ProviderEvent>(event: E, cb: (payload: ProviderEventMap[E]) => void): Unsubscribe;
1967
+ }