asyar-sdk 1.10.2 → 1.12.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.
- package/README.md +70 -4
- package/dist/ExtensionBridge.d.ts +48 -0
- package/dist/ExtensionBridge.d.ts.map +1 -1
- package/dist/ExtensionBridge.js +141 -3
- package/dist/ExtensionBridge.js.map +1 -1
- package/dist/ExtensionBridge.test.js +65 -0
- package/dist/ExtensionBridge.test.js.map +1 -1
- package/dist/ExtensionContext.d.ts +77 -1
- package/dist/ExtensionContext.d.ts.map +1 -1
- package/dist/ExtensionContext.js +114 -0
- package/dist/ExtensionContext.js.map +1 -1
- package/dist/ExtensionContext.test.d.ts +2 -0
- package/dist/ExtensionContext.test.d.ts.map +1 -0
- package/dist/ExtensionContext.test.js +101 -0
- package/dist/ExtensionContext.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +17 -7
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/lib/manifest.d.ts +22 -1
- package/dist/cli/lib/manifest.d.ts.map +1 -1
- package/dist/cli/lib/manifest.js +129 -1
- package/dist/cli/lib/manifest.js.map +1 -1
- package/dist/icons/iconData.d.ts.map +1 -1
- package/dist/icons/iconData.js +28 -0
- package/dist/icons/iconData.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/search/textUtils.d.ts +2 -1
- package/dist/search/textUtils.d.ts.map +1 -1
- package/dist/search/textUtils.js +143 -7
- package/dist/search/textUtils.js.map +1 -1
- package/dist/search/textUtils.test.js +47 -0
- package/dist/search/textUtils.test.js.map +1 -1
- package/dist/services/AIServiceProxy.d.ts +6 -0
- package/dist/services/AIServiceProxy.d.ts.map +1 -0
- package/dist/services/AIServiceProxy.js +99 -0
- package/dist/services/AIServiceProxy.js.map +1 -0
- package/dist/services/AIServiceProxy.test.d.ts +2 -0
- package/dist/services/AIServiceProxy.test.d.ts.map +1 -0
- package/dist/services/AIServiceProxy.test.js +192 -0
- package/dist/services/AIServiceProxy.test.js.map +1 -0
- package/dist/services/ActionServiceProxy.d.ts +1 -0
- package/dist/services/ActionServiceProxy.d.ts.map +1 -1
- package/dist/services/ActionServiceProxy.js +3 -0
- package/dist/services/ActionServiceProxy.js.map +1 -1
- package/dist/services/ApplicationService.d.ts +39 -0
- package/dist/services/ApplicationService.d.ts.map +1 -0
- package/dist/services/ApplicationService.js +32 -0
- package/dist/services/ApplicationService.js.map +1 -0
- package/dist/services/ApplicationService.test.d.ts +2 -0
- package/dist/services/ApplicationService.test.d.ts.map +1 -0
- package/dist/services/ApplicationService.test.js +75 -0
- package/dist/services/ApplicationService.test.js.map +1 -0
- package/dist/services/BaseServiceProxy.d.ts.map +1 -1
- package/dist/services/BaseServiceProxy.js +3 -1
- package/dist/services/BaseServiceProxy.js.map +1 -1
- package/dist/services/CacheServiceProxy.d.ts +27 -0
- package/dist/services/CacheServiceProxy.d.ts.map +1 -0
- package/dist/services/CacheServiceProxy.js +67 -0
- package/dist/services/CacheServiceProxy.js.map +1 -0
- package/dist/services/CacheServiceProxy.test.d.ts +2 -0
- package/dist/services/CacheServiceProxy.test.d.ts.map +1 -0
- package/dist/services/CacheServiceProxy.test.js +61 -0
- package/dist/services/CacheServiceProxy.test.js.map +1 -0
- package/dist/services/ClipboardHistoryServiceProxy.d.ts +1 -0
- package/dist/services/ClipboardHistoryServiceProxy.d.ts.map +1 -1
- package/dist/services/ClipboardHistoryServiceProxy.js +3 -0
- package/dist/services/ClipboardHistoryServiceProxy.js.map +1 -1
- package/dist/services/CommandServiceProxy.d.ts +3 -0
- package/dist/services/CommandServiceProxy.d.ts.map +1 -1
- package/dist/services/CommandServiceProxy.js +8 -0
- package/dist/services/CommandServiceProxy.js.map +1 -1
- package/dist/services/CommandServiceProxy.test.d.ts +2 -0
- package/dist/services/CommandServiceProxy.test.d.ts.map +1 -0
- package/dist/services/CommandServiceProxy.test.js +69 -0
- package/dist/services/CommandServiceProxy.test.js.map +1 -0
- package/dist/services/ExtensionManagerProxy.d.ts +1 -1
- package/dist/services/ExtensionManagerProxy.d.ts.map +1 -1
- package/dist/services/ExtensionManagerProxy.js +2 -2
- package/dist/services/ExtensionManagerProxy.js.map +1 -1
- package/dist/services/FeedbackServiceProxy.d.ts +25 -0
- package/dist/services/FeedbackServiceProxy.d.ts.map +1 -0
- package/dist/services/FeedbackServiceProxy.js +41 -0
- package/dist/services/FeedbackServiceProxy.js.map +1 -0
- package/dist/services/FileManagerServiceProxy.d.ts +7 -0
- package/dist/services/FileManagerServiceProxy.d.ts.map +1 -0
- package/dist/services/FileManagerServiceProxy.js +27 -0
- package/dist/services/FileManagerServiceProxy.js.map +1 -0
- package/dist/services/FileManagerServiceProxy.test.d.ts +2 -0
- package/dist/services/FileManagerServiceProxy.test.d.ts.map +1 -0
- package/dist/services/FileManagerServiceProxy.test.js +56 -0
- package/dist/services/FileManagerServiceProxy.test.js.map +1 -0
- package/dist/services/IAIService.d.ts +66 -0
- package/dist/services/IAIService.d.ts.map +1 -0
- package/dist/services/IAIService.js +3 -0
- package/dist/services/IAIService.js.map +1 -0
- package/dist/services/ICacheService.d.ts +45 -0
- package/dist/services/ICacheService.d.ts.map +1 -0
- package/dist/services/ICacheService.js +3 -0
- package/dist/services/ICacheService.js.map +1 -0
- package/dist/services/IClipboardHistoryService.d.ts +6 -0
- package/dist/services/IClipboardHistoryService.d.ts.map +1 -1
- package/dist/services/ICommandService.d.ts +3 -0
- package/dist/services/ICommandService.d.ts.map +1 -1
- package/dist/services/IExtensionManager.d.ts +7 -4
- package/dist/services/IExtensionManager.d.ts.map +1 -1
- package/dist/services/IFeedbackService.d.ts +84 -0
- package/dist/services/IFeedbackService.d.ts.map +1 -0
- package/dist/services/IFeedbackService.js +3 -0
- package/dist/services/IFeedbackService.js.map +1 -0
- package/dist/services/IFileManagerService.d.ts +33 -0
- package/dist/services/IFileManagerService.d.ts.map +1 -0
- package/dist/services/IFileManagerService.js +3 -0
- package/dist/services/IFileManagerService.js.map +1 -0
- package/dist/services/IInteropService.d.ts +16 -0
- package/dist/services/IInteropService.d.ts.map +1 -0
- package/dist/services/IInteropService.js +12 -0
- package/dist/services/IInteropService.js.map +1 -0
- package/dist/services/IOAuthService.d.ts +68 -0
- package/dist/services/IOAuthService.d.ts.map +1 -0
- package/dist/services/IOAuthService.js +3 -0
- package/dist/services/IOAuthService.js.map +1 -0
- package/dist/services/ISelectionService.d.ts +23 -0
- package/dist/services/ISelectionService.d.ts.map +1 -0
- package/dist/services/ISelectionService.js +3 -0
- package/dist/services/ISelectionService.js.map +1 -0
- package/dist/services/IShellService.d.ts +39 -0
- package/dist/services/IShellService.d.ts.map +1 -0
- package/dist/services/IShellService.js +3 -0
- package/dist/services/IShellService.js.map +1 -0
- package/dist/services/IStorageService.d.ts +22 -0
- package/dist/services/IStorageService.d.ts.map +1 -0
- package/dist/services/IStorageService.js +3 -0
- package/dist/services/IStorageService.js.map +1 -0
- package/dist/services/InteropServiceProxy.d.ts +6 -0
- package/dist/services/InteropServiceProxy.d.ts.map +1 -0
- package/dist/services/InteropServiceProxy.js +26 -0
- package/dist/services/InteropServiceProxy.js.map +1 -0
- package/dist/services/InteropServiceProxy.test.d.ts +2 -0
- package/dist/services/InteropServiceProxy.test.d.ts.map +1 -0
- package/dist/services/InteropServiceProxy.test.js +59 -0
- package/dist/services/InteropServiceProxy.test.js.map +1 -0
- package/dist/services/OAuthServiceProxy.d.ts +18 -0
- package/dist/services/OAuthServiceProxy.d.ts.map +1 -0
- package/dist/services/OAuthServiceProxy.js +70 -0
- package/dist/services/OAuthServiceProxy.js.map +1 -0
- package/dist/services/OAuthServiceProxy.test.d.ts +2 -0
- package/dist/services/OAuthServiceProxy.test.d.ts.map +1 -0
- package/dist/services/OAuthServiceProxy.test.js +165 -0
- package/dist/services/OAuthServiceProxy.test.js.map +1 -0
- package/dist/services/SelectionServiceProxy.d.ts +10 -0
- package/dist/services/SelectionServiceProxy.d.ts.map +1 -0
- package/dist/services/SelectionServiceProxy.js +17 -0
- package/dist/services/SelectionServiceProxy.js.map +1 -0
- package/dist/services/ShellServiceProxy.d.ts +6 -0
- package/dist/services/ShellServiceProxy.d.ts.map +1 -0
- package/dist/services/ShellServiceProxy.js +78 -0
- package/dist/services/ShellServiceProxy.js.map +1 -0
- package/dist/services/StorageServiceProxy.d.ts +16 -0
- package/dist/services/StorageServiceProxy.d.ts.map +1 -0
- package/dist/services/StorageServiceProxy.js +48 -0
- package/dist/services/StorageServiceProxy.js.map +1 -0
- package/dist/services/WindowManagementService.d.ts +48 -0
- package/dist/services/WindowManagementService.d.ts.map +1 -0
- package/dist/services/WindowManagementService.js +37 -0
- package/dist/services/WindowManagementService.js.map +1 -0
- package/dist/services/WindowManagementService.test.d.ts +2 -0
- package/dist/services/WindowManagementService.test.d.ts.map +1 -0
- package/dist/services/WindowManagementService.test.js +51 -0
- package/dist/services/WindowManagementService.test.js.map +1 -0
- package/dist/services/index.d.ts +23 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +27 -1
- package/dist/services/index.js.map +1 -1
- package/dist/types/ActionType.d.ts +2 -0
- package/dist/types/ActionType.d.ts.map +1 -1
- package/dist/types/ActionType.js.map +1 -1
- package/dist/types/ClipboardType.d.ts +13 -0
- package/dist/types/ClipboardType.d.ts.map +1 -1
- package/dist/types/ExtensionType.d.ts +72 -0
- package/dist/types/ExtensionType.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visual style for a toast.
|
|
3
|
+
*
|
|
4
|
+
* - `animated` — loading state, no auto-dismiss; the caller is expected to
|
|
5
|
+
* transition to `success` or `failure` (or call `hideToast`) once the
|
|
6
|
+
* underlying operation finishes.
|
|
7
|
+
* - `success` — completed successfully; auto-dismisses after `durationMs`.
|
|
8
|
+
* - `failure` — failed; auto-dismisses after `durationMs`.
|
|
9
|
+
*/
|
|
10
|
+
export type ToastStyle = "animated" | "success" | "failure";
|
|
11
|
+
export interface ShowToastOptions {
|
|
12
|
+
/** Primary message. Required. */
|
|
13
|
+
title: string;
|
|
14
|
+
/** Optional second line (e.g. error details, secondary info). */
|
|
15
|
+
message?: string;
|
|
16
|
+
/** Visual style. Defaults to `animated` (loading look, no auto-dismiss). */
|
|
17
|
+
style?: ToastStyle;
|
|
18
|
+
/**
|
|
19
|
+
* Auto-dismiss in ms. Ignored when `style === 'animated'`. Defaults to 2500.
|
|
20
|
+
*/
|
|
21
|
+
durationMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ConfirmAlertOptions {
|
|
24
|
+
/** Dialog heading. Required. */
|
|
25
|
+
title: string;
|
|
26
|
+
/** Body text. Required. */
|
|
27
|
+
message: string;
|
|
28
|
+
/** Confirm button label. Defaults to `"Confirm"`. */
|
|
29
|
+
confirmText?: string;
|
|
30
|
+
/** Cancel button label. Defaults to `"Cancel"`. */
|
|
31
|
+
cancelText?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Visual variant. `'danger'` shows ⚠️ + red confirm button.
|
|
34
|
+
* Defaults to `'default'`.
|
|
35
|
+
*/
|
|
36
|
+
variant?: "default" | "danger";
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Unified in-launcher feedback service.
|
|
40
|
+
*
|
|
41
|
+
* Exposes the three Raycast-style primitives — toast, HUD, confirm dialog —
|
|
42
|
+
* to both Tier 1 built-in features and Tier 2 sandboxed extensions through
|
|
43
|
+
* the same SDK proxy interface.
|
|
44
|
+
*
|
|
45
|
+
* The host service maintains the active toast/dialog and renders them
|
|
46
|
+
* through `<ToastHost />` and `<DialogHost />` mounted at the launcher root.
|
|
47
|
+
* The HUD is rendered in a dedicated transient Tauri window so it survives
|
|
48
|
+
* the main launcher window being hidden.
|
|
49
|
+
*/
|
|
50
|
+
export interface IFeedbackService {
|
|
51
|
+
/**
|
|
52
|
+
* Show a non-blocking toast at the bottom of the launcher window.
|
|
53
|
+
* Returns the toast id so the caller can update or hide it later.
|
|
54
|
+
* Multiple successive calls REPLACE the current toast (only one toast
|
|
55
|
+
* at a time).
|
|
56
|
+
*/
|
|
57
|
+
showToast(options: ShowToastOptions): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Update an existing toast in place. Use to transition
|
|
60
|
+
* `animated` → `success`/`failure`. No-op if the toast id no longer
|
|
61
|
+
* matches the active toast.
|
|
62
|
+
*/
|
|
63
|
+
updateToast(toastId: string, options: Partial<ShowToastOptions>): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Dismiss a toast immediately. No-op if not the active toast.
|
|
66
|
+
*/
|
|
67
|
+
hideToast(toastId: string): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Show a HUD message at the bottom of the active screen AND close the
|
|
70
|
+
* launcher window. Fire-and-forget. Auto-dismisses after ~1500ms.
|
|
71
|
+
*/
|
|
72
|
+
showHUD(title: string): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Show a blocking confirmation dialog. Resolves with `true` (confirmed)
|
|
75
|
+
* or `false` (cancelled / Escape / backdrop click).
|
|
76
|
+
*
|
|
77
|
+
* Only one dialog can be open at a time. If a dialog is already open
|
|
78
|
+
* when this is called, the new call resolves with `false` and the
|
|
79
|
+
* existing dialog is left unchanged. Callers do NOT need to wrap this
|
|
80
|
+
* in try/catch.
|
|
81
|
+
*/
|
|
82
|
+
confirmAlert(options: ConfirmAlertOptions): Promise<boolean>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=IFeedbackService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IFeedbackService.d.ts","sourceRoot":"","sources":["../../src/services/IFeedbackService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAChC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD;;;;OAIG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;;;;;OAQG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IFeedbackService.js","sourceRoot":"","sources":["../../src/services/IFeedbackService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform file manager operations.
|
|
3
|
+
*
|
|
4
|
+
* Reveals files in the OS file manager (Finder on macOS, Explorer on Windows,
|
|
5
|
+
* default file manager on Linux) or moves files to the OS trash/recycle bin.
|
|
6
|
+
*
|
|
7
|
+
* **Permissions required:**
|
|
8
|
+
* - `fs:read` for `showInFileManager`
|
|
9
|
+
* - `fs:write` for `trash`
|
|
10
|
+
*/
|
|
11
|
+
export interface IFileManagerService {
|
|
12
|
+
/**
|
|
13
|
+
* Reveals a file or directory in the OS file manager, selecting it.
|
|
14
|
+
*
|
|
15
|
+
* - macOS: Opens Finder and selects the item.
|
|
16
|
+
* - Windows: Opens Explorer and selects the item.
|
|
17
|
+
* - Linux: Opens the parent directory in the default file manager.
|
|
18
|
+
*
|
|
19
|
+
* @param path Absolute path to the file or directory.
|
|
20
|
+
* @throws If the path is not absolute or does not exist.
|
|
21
|
+
*/
|
|
22
|
+
showInFileManager(path: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Moves a file or directory to the OS trash / recycle bin.
|
|
25
|
+
* The item can be restored from trash by the user.
|
|
26
|
+
* Path must be within the user's home directory tree.
|
|
27
|
+
*
|
|
28
|
+
* @param path Absolute path to the file or directory.
|
|
29
|
+
* @throws If the path is not absolute, does not exist, or is outside the home directory.
|
|
30
|
+
*/
|
|
31
|
+
trash(path: string): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=IFileManagerService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IFileManagerService.d.ts","sourceRoot":"","sources":["../../src/services/IFileManagerService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;OASG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IFileManagerService.js","sourceRoot":"","sources":["../../src/services/IFileManagerService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface IInteropService {
|
|
2
|
+
/**
|
|
3
|
+
* Invoke a command from another installed extension.
|
|
4
|
+
* Requires `extension:invoke` permission in manifest.
|
|
5
|
+
*
|
|
6
|
+
* @param extensionId - The target extension's manifest id (e.g. 'com.example.calc')
|
|
7
|
+
* @param commandId - The command's id as declared in the target manifest (e.g. 'run')
|
|
8
|
+
* @param args - Optional arguments forwarded to the command
|
|
9
|
+
*/
|
|
10
|
+
launchCommand(extensionId: string, commandId: string, args?: Record<string, unknown>): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare class LaunchCommandError extends Error {
|
|
13
|
+
readonly code: 'EXTENSION_NOT_FOUND' | 'COMMAND_NOT_FOUND';
|
|
14
|
+
constructor(code: 'EXTENSION_NOT_FOUND' | 'COMMAND_NOT_FOUND', message: string);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=IInteropService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IInteropService.d.ts","sourceRoot":"","sources":["../../src/services/IInteropService.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,IAAI,EAAE,qBAAqB,GAAG,mBAAmB;gBAAjD,IAAI,EAAE,qBAAqB,GAAG,mBAAmB,EACjE,OAAO,EAAE,MAAM;CAKlB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LaunchCommandError = void 0;
|
|
4
|
+
class LaunchCommandError extends Error {
|
|
5
|
+
constructor(code, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.name = 'LaunchCommandError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.LaunchCommandError = LaunchCommandError;
|
|
12
|
+
//# sourceMappingURL=IInteropService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IInteropService.js","sourceRoot":"","sources":["../../src/services/IInteropService.ts"],"names":[],"mappings":";;;AAgBA,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YACkB,IAAiD,EACjE,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,SAAI,GAAJ,IAAI,CAA6C;QAIjE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AARD,gDAQC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for an OAuth 2.0 PKCE flow.
|
|
3
|
+
* Pass this to `IOAuthService.authorize()`.
|
|
4
|
+
*/
|
|
5
|
+
export interface OAuthConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Stable identifier for this provider, used as the storage key.
|
|
8
|
+
* E.g. `"github"`, `"notion"`, `"google"`.
|
|
9
|
+
*/
|
|
10
|
+
providerId: string;
|
|
11
|
+
/** OAuth 2.0 client ID registered with the provider. */
|
|
12
|
+
clientId: string;
|
|
13
|
+
/** The provider's authorization endpoint URL. */
|
|
14
|
+
authorizationUrl: string;
|
|
15
|
+
/** The provider's token exchange endpoint URL. */
|
|
16
|
+
tokenUrl: string;
|
|
17
|
+
/** Requested OAuth scopes. */
|
|
18
|
+
scopes: string[];
|
|
19
|
+
}
|
|
20
|
+
/** An OAuth 2.0 token set returned after a successful authorization flow. */
|
|
21
|
+
export interface OAuthToken {
|
|
22
|
+
accessToken: string;
|
|
23
|
+
refreshToken?: string;
|
|
24
|
+
tokenType: string;
|
|
25
|
+
scopes: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Token expiry as a Unix timestamp in seconds.
|
|
28
|
+
* `undefined` means the token has no expiry.
|
|
29
|
+
*/
|
|
30
|
+
expiresAt?: number;
|
|
31
|
+
}
|
|
32
|
+
/** Error payload posted back to the extension when an OAuth flow fails. */
|
|
33
|
+
export interface OAuthError {
|
|
34
|
+
code: 'access_denied' | 'exchange_failed' | 'timeout' | string;
|
|
35
|
+
message: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* OAuth 2.0 PKCE flow for extensions.
|
|
39
|
+
*
|
|
40
|
+
* Requires the `oauth:use` permission in the extension manifest.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const token = await ctx.proxies.OAuthService.authorize({
|
|
45
|
+
* providerId: 'github',
|
|
46
|
+
* clientId: 'my-client-id',
|
|
47
|
+
* authorizationUrl: 'https://github.com/login/oauth/authorize',
|
|
48
|
+
* tokenUrl: 'https://github.com/login/oauth/access_token',
|
|
49
|
+
* scopes: ['repo', 'read:user'],
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export interface IOAuthService {
|
|
54
|
+
/**
|
|
55
|
+
* Authorize with a third-party provider using PKCE.
|
|
56
|
+
*
|
|
57
|
+
* Returns a cached, valid token immediately if one exists (no browser popup).
|
|
58
|
+
* Otherwise opens the system browser for the user to authorize, then resolves
|
|
59
|
+
* with the token once the callback deep-link arrives.
|
|
60
|
+
*/
|
|
61
|
+
authorize(config: OAuthConfig): Promise<OAuthToken>;
|
|
62
|
+
/**
|
|
63
|
+
* Remove the stored token for the given provider.
|
|
64
|
+
* The next call to `authorize()` will start a fresh browser flow.
|
|
65
|
+
*/
|
|
66
|
+
revokeToken(providerId: string): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=IOAuthService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IOAuthService.d.ts","sourceRoot":"","sources":["../../src/services/IOAuthService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpD;;;OAGG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IOAuthService.js","sourceRoot":"","sources":["../../src/services/IOAuthService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type SelectionErrorCode = "ACCESSIBILITY_PERMISSION_REQUIRED" | "ACCESSIBILITY_UNAVAILABLE" | "CLIPBOARD_RESTORE_FAILED" | "OPERATION_FAILED";
|
|
2
|
+
export interface SelectionError extends Error {
|
|
3
|
+
code: SelectionErrorCode;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Selection service — allows reading selected text or file items from the frontmost application.
|
|
7
|
+
*/
|
|
8
|
+
export interface ISelectionService {
|
|
9
|
+
/**
|
|
10
|
+
* Returns selected text or null if nothing is selected.
|
|
11
|
+
* Throws SelectionError on hard failure only.
|
|
12
|
+
*
|
|
13
|
+
* Requires the `selection:read` permission.
|
|
14
|
+
*/
|
|
15
|
+
getSelectedText(): Promise<string | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns absolute paths of selected file-manager items, or [] if none.
|
|
18
|
+
*
|
|
19
|
+
* Requires the `selection:read` permission.
|
|
20
|
+
*/
|
|
21
|
+
getSelectedFinderItems(): Promise<string[]>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ISelectionService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ISelectionService.d.ts","sourceRoot":"","sources":["../../src/services/ISelectionService.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,mCAAmC,GACnC,2BAA2B,GAC3B,0BAA0B,GAC1B,kBAAkB,CAAC;AAEvB,MAAM,WAAW,cAAe,SAAQ,KAAK;IAC3C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;;;OAIG;IACH,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ISelectionService.js","sourceRoot":"","sources":["../../src/services/ISelectionService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface SpawnParams {
|
|
2
|
+
program: string;
|
|
3
|
+
args?: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface ShellChunk {
|
|
6
|
+
stream: 'stdout' | 'stderr';
|
|
7
|
+
data: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ShellHandle {
|
|
10
|
+
/**
|
|
11
|
+
* Fired when a line of output is received from stdout or stderr.
|
|
12
|
+
*/
|
|
13
|
+
onChunk(cb: (chunk: ShellChunk) => void): void;
|
|
14
|
+
/**
|
|
15
|
+
* Fired when the process exits successfully.
|
|
16
|
+
* @param exitCode The numeric exit code if available.
|
|
17
|
+
*/
|
|
18
|
+
onDone(cb: (exitCode?: number) => void): void;
|
|
19
|
+
/**
|
|
20
|
+
* Fired if the process fails to start or encounters a runtime error.
|
|
21
|
+
*/
|
|
22
|
+
onError(cb: (error: {
|
|
23
|
+
code: string;
|
|
24
|
+
message: string;
|
|
25
|
+
}) => void): void;
|
|
26
|
+
/**
|
|
27
|
+
* Kills the running process.
|
|
28
|
+
*/
|
|
29
|
+
abort(): void;
|
|
30
|
+
}
|
|
31
|
+
export interface IShellService {
|
|
32
|
+
/**
|
|
33
|
+
* Spawns an arbitrary OS process and streams its output.
|
|
34
|
+
* Requires the 'shell:spawn' permission in manifest.json.
|
|
35
|
+
* User will be prompted to trust the binary on first use.
|
|
36
|
+
*/
|
|
37
|
+
spawn(params: SpawnParams): ShellHandle;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=IShellService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IShellService.d.ts","sourceRoot":"","sources":["../../src/services/IShellService.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAE/C;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE9C;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAEtE;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC1B;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IShellService.js","sourceRoot":"","sources":["../../src/services/IShellService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension key-value storage service.
|
|
3
|
+
*
|
|
4
|
+
* Each extension gets its own isolated namespace — extensions cannot read
|
|
5
|
+
* or write other extensions' data. Values are JSON-serialized strings stored
|
|
6
|
+
* in SQLite on the Rust side.
|
|
7
|
+
*
|
|
8
|
+
* Requires `storage:read` / `storage:write` permissions in manifest.json.
|
|
9
|
+
*/
|
|
10
|
+
export interface IStorageService {
|
|
11
|
+
/** Get a value by key. Returns null if the key does not exist. */
|
|
12
|
+
get(key: string): Promise<string | null>;
|
|
13
|
+
/** Set a key-value pair. Overwrites if the key already exists. */
|
|
14
|
+
set(key: string, value: string): Promise<void>;
|
|
15
|
+
/** Delete a key. Returns true if the key existed. */
|
|
16
|
+
delete(key: string): Promise<boolean>;
|
|
17
|
+
/** Get all key-value pairs for this extension. */
|
|
18
|
+
getAll(): Promise<Record<string, string>>;
|
|
19
|
+
/** Delete all stored data for this extension. */
|
|
20
|
+
clear(): Promise<number>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=IStorageService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IStorageService.d.ts","sourceRoot":"","sources":["../../src/services/IStorageService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzC,kEAAkE;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,qDAAqD;IACrD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC,kDAAkD;IAClD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1C,iDAAiD;IACjD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IStorageService.js","sourceRoot":"","sources":["../../src/services/IStorageService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BaseServiceProxy } from './BaseServiceProxy';
|
|
2
|
+
import type { IInteropService } from './IInteropService';
|
|
3
|
+
export declare class InteropServiceProxy extends BaseServiceProxy implements IInteropService {
|
|
4
|
+
launchCommand(extensionId: string, commandId: string, args?: Record<string, unknown>): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=InteropServiceProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteropServiceProxy.d.ts","sourceRoot":"","sources":["../../src/services/InteropServiceProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,qBAAa,mBAAoB,SAAQ,gBAAiB,YAAW,eAAe;IAC5E,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;CAOjB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.InteropServiceProxy = void 0;
|
|
13
|
+
const BaseServiceProxy_1 = require("./BaseServiceProxy");
|
|
14
|
+
class InteropServiceProxy extends BaseServiceProxy_1.BaseServiceProxy {
|
|
15
|
+
launchCommand(extensionId, commandId, args) {
|
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
17
|
+
yield this.broker.invoke('InteropService:launchCommand', {
|
|
18
|
+
extensionId,
|
|
19
|
+
commandId,
|
|
20
|
+
args: args !== null && args !== void 0 ? args : null,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.InteropServiceProxy = InteropServiceProxy;
|
|
26
|
+
//# sourceMappingURL=InteropServiceProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteropServiceProxy.js","sourceRoot":"","sources":["../../src/services/InteropServiceProxy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAsD;AAGtD,MAAa,mBAAoB,SAAQ,mCAAgB;IACjD,aAAa,CACjB,WAAmB,EACnB,SAAiB,EACjB,IAA8B;;YAE9B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAO,8BAA8B,EAAE;gBAC7D,WAAW;gBACX,SAAS;gBACT,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAZD,kDAYC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteropServiceProxy.test.d.ts","sourceRoot":"","sources":["../../src/services/InteropServiceProxy.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const vitest_1 = require("vitest");
|
|
13
|
+
const MessageBroker_1 = require("../ipc/MessageBroker");
|
|
14
|
+
// Mock MessageBroker before importing InteropServiceProxy
|
|
15
|
+
vitest_1.vi.mock('../ipc/MessageBroker', () => ({
|
|
16
|
+
MessageBroker: {
|
|
17
|
+
getInstance: vitest_1.vi.fn(),
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
const InteropServiceProxy_1 = require("./InteropServiceProxy");
|
|
21
|
+
(0, vitest_1.describe)('InteropServiceProxy', () => {
|
|
22
|
+
let mockBroker;
|
|
23
|
+
let proxy;
|
|
24
|
+
(0, vitest_1.beforeEach)(() => {
|
|
25
|
+
vitest_1.vi.clearAllMocks();
|
|
26
|
+
mockBroker = {
|
|
27
|
+
invoke: vitest_1.vi.fn(),
|
|
28
|
+
};
|
|
29
|
+
vitest_1.vi.mocked(MessageBroker_1.MessageBroker.getInstance).mockReturnValue(mockBroker);
|
|
30
|
+
proxy = new InteropServiceProxy_1.InteropServiceProxy();
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.it)('calls broker.invoke with correct command and parameters', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
mockBroker.invoke.mockResolvedValueOnce(undefined);
|
|
34
|
+
yield proxy.launchCommand('com.example.calc', 'run', { query: '5+3' });
|
|
35
|
+
(0, vitest_1.expect)(mockBroker.invoke).toHaveBeenCalledWith('InteropService:launchCommand', {
|
|
36
|
+
extensionId: 'com.example.calc',
|
|
37
|
+
commandId: 'run',
|
|
38
|
+
args: { query: '5+3' },
|
|
39
|
+
});
|
|
40
|
+
}));
|
|
41
|
+
(0, vitest_1.it)('defaults args to null if not provided', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
+
mockBroker.invoke.mockResolvedValueOnce(undefined);
|
|
43
|
+
yield proxy.launchCommand('com.example.calc', 'run');
|
|
44
|
+
(0, vitest_1.expect)(mockBroker.invoke).toHaveBeenCalledWith('InteropService:launchCommand', {
|
|
45
|
+
extensionId: 'com.example.calc',
|
|
46
|
+
commandId: 'run',
|
|
47
|
+
args: null,
|
|
48
|
+
});
|
|
49
|
+
}));
|
|
50
|
+
(0, vitest_1.it)('resolves when broker resolves', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
51
|
+
mockBroker.invoke.mockResolvedValueOnce(undefined);
|
|
52
|
+
yield (0, vitest_1.expect)(proxy.launchCommand('ext', 'cmd')).resolves.toBeUndefined();
|
|
53
|
+
}));
|
|
54
|
+
(0, vitest_1.it)('rejects when broker rejects', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
mockBroker.invoke.mockRejectedValueOnce(new Error('Invoke failed'));
|
|
56
|
+
yield (0, vitest_1.expect)(proxy.launchCommand('ext', 'cmd')).rejects.toThrow('Invoke failed');
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=InteropServiceProxy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteropServiceProxy.test.js","sourceRoot":"","sources":["../../src/services/InteropServiceProxy.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAA6D;AAC7D,wDAAoD;AAEpD,0DAA0D;AAC1D,WAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,aAAa,EAAE;QACb,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;KACrB;CACF,CAAC,CAAC,CAAA;AAEH,+DAA2D;AAE3D,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,UAAe,CAAA;IACnB,IAAI,KAA0B,CAAA;IAE9B,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAA;QAClB,UAAU,GAAG;YACX,MAAM,EAAE,WAAE,CAAC,EAAE,EAAE;SAChB,CAAA;QACD,WAAE,CAAC,MAAM,CAAC,6BAAa,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;QAChE,KAAK,GAAG,IAAI,yCAAmB,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAS,EAAE;QACvE,UAAU,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAElD,MAAM,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAEtE,IAAA,eAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,8BAA8B,EAAE;YAC7E,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;IACJ,CAAC,CAAA,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,UAAU,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAElD,MAAM,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;QAEpD,IAAA,eAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,8BAA8B,EAAE;YAC7E,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAA,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAS,EAAE;QAC7C,UAAU,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAClD,MAAM,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IAC1E,CAAC,CAAA,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAS,EAAE;QAC3C,UAAU,CAAC,MAAM,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;QACnE,MAAM,IAAA,eAAM,EAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAClF,CAAC,CAAA,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseServiceProxy } from './BaseServiceProxy';
|
|
2
|
+
import type { IOAuthService, OAuthConfig, OAuthToken } from './IOAuthService';
|
|
3
|
+
/**
|
|
4
|
+
* SDK proxy for the OAuthService.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the AIServiceProxy "fire-and-forget" pattern:
|
|
7
|
+
* - Registers a window message listener BEFORE calling broker.invoke() to
|
|
8
|
+
* prevent a race condition where the result arrives before we are listening.
|
|
9
|
+
* - broker.invoke() returns either a cached OAuthToken (resolve immediately)
|
|
10
|
+
* or { pending: true } (wait for 'asyar:oauth:result' postMessage from host).
|
|
11
|
+
*
|
|
12
|
+
* Requires `oauth:use` manifest permission.
|
|
13
|
+
*/
|
|
14
|
+
export declare class OAuthServiceProxy extends BaseServiceProxy implements IOAuthService {
|
|
15
|
+
authorize(config: OAuthConfig): Promise<OAuthToken>;
|
|
16
|
+
revokeToken(providerId: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=OAuthServiceProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuthServiceProxy.d.ts","sourceRoot":"","sources":["../../src/services/OAuthServiceProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAc,MAAM,iBAAiB,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,gBAAiB,YAAW,aAAa;IAC9E,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAsDnD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAuthServiceProxy = void 0;
|
|
4
|
+
const BaseServiceProxy_1 = require("./BaseServiceProxy");
|
|
5
|
+
/**
|
|
6
|
+
* SDK proxy for the OAuthService.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors the AIServiceProxy "fire-and-forget" pattern:
|
|
9
|
+
* - Registers a window message listener BEFORE calling broker.invoke() to
|
|
10
|
+
* prevent a race condition where the result arrives before we are listening.
|
|
11
|
+
* - broker.invoke() returns either a cached OAuthToken (resolve immediately)
|
|
12
|
+
* or { pending: true } (wait for 'asyar:oauth:result' postMessage from host).
|
|
13
|
+
*
|
|
14
|
+
* Requires `oauth:use` manifest permission.
|
|
15
|
+
*/
|
|
16
|
+
class OAuthServiceProxy extends BaseServiceProxy_1.BaseServiceProxy {
|
|
17
|
+
authorize(config) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
// crypto.randomUUID is available in modern browsers and in Tauri WebViews.
|
|
20
|
+
const flowId = crypto.randomUUID();
|
|
21
|
+
const handler = (event) => {
|
|
22
|
+
const msg = event.data;
|
|
23
|
+
if ((msg === null || msg === void 0 ? void 0 : msg.type) !== 'asyar:oauth:result')
|
|
24
|
+
return;
|
|
25
|
+
if ((msg === null || msg === void 0 ? void 0 : msg.flowId) !== flowId)
|
|
26
|
+
return;
|
|
27
|
+
window.removeEventListener('message', handler);
|
|
28
|
+
if (msg.error) {
|
|
29
|
+
const err = msg.error;
|
|
30
|
+
reject(new Error(`OAuth error [${err.code}]: ${err.message}`));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
resolve(msg.token);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
// Register BEFORE invoke — prevents race condition where deep-link
|
|
37
|
+
// callback resolves synchronously before the listener is attached.
|
|
38
|
+
window.addEventListener('message', handler);
|
|
39
|
+
this.broker
|
|
40
|
+
.invoke('asyar:service:OAuthService:authorize', {
|
|
41
|
+
// Key insertion order must match Object.values() dispatch in IpcRouter,
|
|
42
|
+
// which maps to host service parameter order after extensionId injection:
|
|
43
|
+
// authorize(extensionId, providerId, clientId, authorizationUrl, tokenUrl, scopes, flowId)
|
|
44
|
+
providerId: config.providerId,
|
|
45
|
+
clientId: config.clientId,
|
|
46
|
+
authorizationUrl: config.authorizationUrl,
|
|
47
|
+
tokenUrl: config.tokenUrl,
|
|
48
|
+
scopes: config.scopes,
|
|
49
|
+
flowId,
|
|
50
|
+
})
|
|
51
|
+
.then((result) => {
|
|
52
|
+
if ('accessToken' in result) {
|
|
53
|
+
// Host returned a cached token directly — no postMessage needed
|
|
54
|
+
window.removeEventListener('message', handler);
|
|
55
|
+
resolve(result);
|
|
56
|
+
}
|
|
57
|
+
// If { pending: true }, keep the listener active and wait
|
|
58
|
+
})
|
|
59
|
+
.catch((err) => {
|
|
60
|
+
window.removeEventListener('message', handler);
|
|
61
|
+
reject(err);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
revokeToken(providerId) {
|
|
66
|
+
return this.broker.invoke('asyar:service:OAuthService:revokeToken', { providerId });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.OAuthServiceProxy = OAuthServiceProxy;
|
|
70
|
+
//# sourceMappingURL=OAuthServiceProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuthServiceProxy.js","sourceRoot":"","sources":["../../src/services/OAuthServiceProxy.ts"],"names":[],"mappings":";;;AAAA,yDAAsD;AAGtD;;;;;;;;;;GAUG;AACH,MAAa,iBAAkB,SAAQ,mCAAgB;IACrD,SAAS,CAAC,MAAmB;QAC3B,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,2EAA2E;YAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAEnC,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;gBACtC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;gBACvB,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,MAAK,oBAAoB;oBAAE,OAAO;gBAC/C,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,MAAK,MAAM;oBAAE,OAAO;gBAEnC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAE/C,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBACd,MAAM,GAAG,GAAG,GAAG,CAAC,KAAmB,CAAC;oBACpC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAmB,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC;YAEF,mEAAmE;YACnE,mEAAmE;YACnE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAE5C,IAAI,CAAC,MAAM;iBACR,MAAM,CACL,sCAAsC,EACtC;gBACE,wEAAwE;gBACxE,0EAA0E;gBAC1E,2FAA2F;gBAC3F,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM;aACP,CACF;iBACA,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;oBAC5B,gEAAgE;oBAChE,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC/C,OAAO,CAAC,MAAoB,CAAC,CAAC;gBAChC,CAAC;gBACD,0DAA0D;YAC5D,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,UAAkB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,wCAAwC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACtF,CAAC;CACF;AA1DD,8CA0DC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuthServiceProxy.test.d.ts","sourceRoot":"","sources":["../../src/services/OAuthServiceProxy.test.ts"],"names":[],"mappings":""}
|