@haex-space/vault-sdk 3.2.7 → 3.2.8
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/dist/{client-Bbm83Oy6.d.mts → client-BBD-YsPv.d.ts} +2 -1
- package/dist/{client-exZiz0Ph.d.ts → client-DaS2fAf-.d.mts} +2 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +135 -220
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +135 -220
- package/dist/index.mjs.map +1 -1
- package/dist/node.d.mts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/react.d.mts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +139 -224
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +139 -224
- package/dist/react.mjs.map +1 -1
- package/dist/runtime/nuxt.plugin.client.d.mts +2 -2
- package/dist/runtime/nuxt.plugin.client.d.ts +2 -2
- package/dist/runtime/nuxt.plugin.client.js +139 -224
- package/dist/runtime/nuxt.plugin.client.js.map +1 -1
- package/dist/runtime/nuxt.plugin.client.mjs +139 -224
- package/dist/runtime/nuxt.plugin.client.mjs.map +1 -1
- package/dist/svelte.d.mts +2 -2
- package/dist/svelte.d.ts +2 -2
- package/dist/svelte.js +139 -224
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +139 -224
- package/dist/svelte.mjs.map +1 -1
- package/dist/{types-CDMBvvjl.d.mts → types-Cji-mUN0.d.mts} +4 -0
- package/dist/{types-CDMBvvjl.d.ts → types-Cji-mUN0.d.ts} +4 -0
- package/dist/vue.d.mts +2 -2
- package/dist/vue.d.ts +2 -2
- package/dist/vue.js +139 -224
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +139 -224
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
package/dist/node.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { H as HaextensionConfig, g as getExtensionDir, r as readHaextensionConfig } from './config-D_HXjsEV.mjs';
|
|
2
|
-
import { E as ExtensionManifest } from './types-
|
|
2
|
+
import { E as ExtensionManifest } from './types-Cji-mUN0.mjs';
|
|
3
3
|
|
|
4
4
|
interface ReadManifestOptions {
|
|
5
5
|
/** Root directory of the project */
|
package/dist/node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { H as HaextensionConfig, g as getExtensionDir, r as readHaextensionConfig } from './config-D_HXjsEV.js';
|
|
2
|
-
import { E as ExtensionManifest } from './types-
|
|
2
|
+
import { E as ExtensionManifest } from './types-Cji-mUN0.js';
|
|
3
3
|
|
|
4
4
|
interface ReadManifestOptions {
|
|
5
5
|
/** Root directory of the project */
|
package/dist/react.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { H as HaexVaultSdk, S as StorageAPI } from './client-
|
|
1
|
+
import { H as HaexVaultSdk, S as StorageAPI } from './client-DaS2fAf-.mjs';
|
|
2
2
|
import * as drizzle_orm_sqlite_proxy from 'drizzle-orm/sqlite-proxy';
|
|
3
|
-
import { H as HaexHubConfig, a as ExtensionInfo, A as ApplicationContext } from './types-
|
|
3
|
+
import { H as HaexHubConfig, a as ExtensionInfo, A as ApplicationContext } from './types-Cji-mUN0.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* React hook for HaexVault SDK
|
package/dist/react.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { H as HaexVaultSdk, S as StorageAPI } from './client-
|
|
1
|
+
import { H as HaexVaultSdk, S as StorageAPI } from './client-BBD-YsPv.js';
|
|
2
2
|
import * as drizzle_orm_sqlite_proxy from 'drizzle-orm/sqlite-proxy';
|
|
3
|
-
import { H as HaexHubConfig, a as ExtensionInfo, A as ApplicationContext } from './types-
|
|
3
|
+
import { H as HaexHubConfig, a as ExtensionInfo, A as ApplicationContext } from './types-Cji-mUN0.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* React hook for HaexVault SDK
|
package/dist/react.js
CHANGED
|
@@ -398,16 +398,17 @@ var HAEXTENSION_EVENTS = {
|
|
|
398
398
|
/** File system change detected (from native file watcher) */
|
|
399
399
|
FILE_CHANGED: "filesync:file-changed",
|
|
400
400
|
/** Tables have been updated via sync (CRDT pull from server) */
|
|
401
|
-
SYNC_TABLES_UPDATED: "haextension:sync:tables-updated"
|
|
401
|
+
SYNC_TABLES_UPDATED: "haextension:sync:tables-updated",
|
|
402
|
+
/** A runtime permission prompt was resolved (granted/denied) by the user.
|
|
403
|
+
* The SDK uses this to auto-retry the original request; extensions may also
|
|
404
|
+
* subscribe via `client.on(HAEXTENSION_EVENTS.PERMISSION_RESOLVED, ...)`. */
|
|
405
|
+
PERMISSION_RESOLVED: "extension:permission-resolved"
|
|
402
406
|
};
|
|
403
407
|
var EXTERNAL_EVENTS = {
|
|
404
408
|
/** External request from authorized client */
|
|
405
409
|
REQUEST: "haextension:external:request",
|
|
406
410
|
/** AI action request (tool calls from AI assistant) */
|
|
407
|
-
ACTION_REQUEST: "haextension:action:request"
|
|
408
|
-
/** New external client requesting authorization */
|
|
409
|
-
AUTHORIZATION_REQUEST: "external:authorization-request"
|
|
410
|
-
};
|
|
411
|
+
ACTION_REQUEST: "haextension:action:request"};
|
|
411
412
|
var SHELL_EVENTS = {
|
|
412
413
|
/** PTY output data from a shell session */
|
|
413
414
|
OUTPUT: "shell:output",
|
|
@@ -421,6 +422,9 @@ var TABLE_SEPARATOR = "__";
|
|
|
421
422
|
function getTableName(publicKey, extensionName, tableName) {
|
|
422
423
|
return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;
|
|
423
424
|
}
|
|
425
|
+
function isPermissionPromptError(error) {
|
|
426
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === 1004 /* PROMPT_REQUIRED */;
|
|
427
|
+
}
|
|
424
428
|
var HaexVaultSdkError = class extends Error {
|
|
425
429
|
constructor(code, messageKey, details) {
|
|
426
430
|
super(messageKey);
|
|
@@ -1875,6 +1879,21 @@ async function initNativeMode(ctx, log, onEvent, onContextChange) {
|
|
|
1875
1879
|
await setupTauriEventListeners(ctx, log, onEvent, onContextChange);
|
|
1876
1880
|
return { extensionInfo, context };
|
|
1877
1881
|
}
|
|
1882
|
+
async function forwardEvent(listen, log, onEvent, listenOptions, eventName, shape) {
|
|
1883
|
+
try {
|
|
1884
|
+
await listen(eventName, (event) => {
|
|
1885
|
+
if (event.payload == null) {
|
|
1886
|
+
log(`Event '${eventName}' received with no payload`);
|
|
1887
|
+
return;
|
|
1888
|
+
}
|
|
1889
|
+
const extra = shape ? shape(event.payload) : { data: event.payload };
|
|
1890
|
+
onEvent({ type: eventName, timestamp: Date.now(), ...extra });
|
|
1891
|
+
}, listenOptions);
|
|
1892
|
+
log(`Listener registered: ${eventName}`);
|
|
1893
|
+
} catch (error) {
|
|
1894
|
+
log(`Failed to register listener '${eventName}':`, error);
|
|
1895
|
+
}
|
|
1896
|
+
}
|
|
1878
1897
|
async function setupTauriEventListeners(ctx, log, onEvent, onContextChange) {
|
|
1879
1898
|
const { listen } = getTauriEvent();
|
|
1880
1899
|
const webviewLabel = getCurrentWebviewLabel();
|
|
@@ -1906,207 +1925,29 @@ async function setupTauriEventListeners(ctx, log, onEvent, onContextChange) {
|
|
|
1906
1925
|
} catch (error) {
|
|
1907
1926
|
log("Failed to setup context change listener:", error);
|
|
1908
1927
|
}
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
onEvent({
|
|
1933
|
-
type: EXTERNAL_EVENTS.ACTION_REQUEST,
|
|
1934
|
-
data: event.payload,
|
|
1935
|
-
timestamp: Date.now()
|
|
1936
|
-
});
|
|
1937
|
-
} else {
|
|
1938
|
-
log("AI action request event has no payload!");
|
|
1939
|
-
}
|
|
1940
|
-
}, listenOptions);
|
|
1941
|
-
log("AI action request listener registered successfully");
|
|
1942
|
-
} catch (error) {
|
|
1943
|
-
log("Failed to setup AI action request listener:", error);
|
|
1944
|
-
}
|
|
1945
|
-
log("Registering file change listener for:", HAEXTENSION_EVENTS.FILE_CHANGED);
|
|
1946
|
-
try {
|
|
1947
|
-
await listen(HAEXTENSION_EVENTS.FILE_CHANGED, (event) => {
|
|
1948
|
-
log("File change event received:", event.payload);
|
|
1949
|
-
if (event.payload) {
|
|
1950
|
-
const payload = event.payload;
|
|
1951
|
-
onEvent({
|
|
1952
|
-
type: HAEXTENSION_EVENTS.FILE_CHANGED,
|
|
1953
|
-
ruleId: payload.ruleId,
|
|
1954
|
-
changeType: payload.changeType,
|
|
1955
|
-
path: payload.path,
|
|
1956
|
-
timestamp: Date.now()
|
|
1957
|
-
});
|
|
1958
|
-
}
|
|
1959
|
-
}, listenOptions);
|
|
1960
|
-
log("File change listener registered successfully");
|
|
1961
|
-
} catch (error) {
|
|
1962
|
-
log("Failed to setup file change listener:", error);
|
|
1963
|
-
}
|
|
1964
|
-
log("Registering sync tables updated listener for:", HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED);
|
|
1965
|
-
try {
|
|
1966
|
-
await listen(HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED, (event) => {
|
|
1967
|
-
log("Sync tables updated event received:", event.payload);
|
|
1968
|
-
if (event.payload) {
|
|
1969
|
-
const payload = event.payload;
|
|
1970
|
-
onEvent({
|
|
1971
|
-
type: HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED,
|
|
1972
|
-
data: { tables: payload.tables },
|
|
1973
|
-
timestamp: Date.now()
|
|
1974
|
-
});
|
|
1975
|
-
}
|
|
1976
|
-
}, listenOptions);
|
|
1977
|
-
log("Sync tables updated listener registered successfully");
|
|
1978
|
-
} catch (error) {
|
|
1979
|
-
log("Failed to setup sync tables updated listener:", error);
|
|
1980
|
-
}
|
|
1981
|
-
log("Setting up LocalSend event listeners");
|
|
1982
|
-
try {
|
|
1983
|
-
await setupLocalSendEventListeners(log, onEvent, listenOptions);
|
|
1984
|
-
log("LocalSend event listeners setup complete");
|
|
1985
|
-
} catch (error) {
|
|
1986
|
-
log("Failed to setup LocalSend event listeners:", error);
|
|
1987
|
-
}
|
|
1988
|
-
log("Setting up Shell event listeners");
|
|
1989
|
-
try {
|
|
1990
|
-
await listen(SHELL_EVENTS.OUTPUT, (event) => {
|
|
1991
|
-
if (event.payload) {
|
|
1992
|
-
const payload = event.payload;
|
|
1993
|
-
onEvent({
|
|
1994
|
-
type: SHELL_EVENTS.OUTPUT,
|
|
1995
|
-
timestamp: Date.now(),
|
|
1996
|
-
sessionId: payload.sessionId,
|
|
1997
|
-
data: payload.data
|
|
1998
|
-
});
|
|
1999
|
-
}
|
|
2000
|
-
}, listenOptions);
|
|
2001
|
-
log("Shell output listener registered");
|
|
2002
|
-
await listen(SHELL_EVENTS.EXIT, (event) => {
|
|
2003
|
-
if (event.payload) {
|
|
2004
|
-
const payload = event.payload;
|
|
2005
|
-
onEvent({
|
|
2006
|
-
type: SHELL_EVENTS.EXIT,
|
|
2007
|
-
timestamp: Date.now(),
|
|
2008
|
-
sessionId: payload.sessionId,
|
|
2009
|
-
exitCode: payload.exitCode
|
|
2010
|
-
});
|
|
2011
|
-
}
|
|
2012
|
-
}, listenOptions);
|
|
2013
|
-
log("Shell exit listener registered");
|
|
2014
|
-
} catch (error) {
|
|
2015
|
-
log("Failed to setup Shell event listeners:", error);
|
|
2016
|
-
}
|
|
2017
|
-
}
|
|
2018
|
-
async function setupLocalSendEventListeners(log, onEvent, listenOptions) {
|
|
2019
|
-
const { listen } = getTauriEvent();
|
|
2020
|
-
try {
|
|
2021
|
-
await listen(LOCALSEND_EVENTS.deviceDiscovered, (event) => {
|
|
2022
|
-
log("LocalSend device discovered:", event.payload);
|
|
2023
|
-
if (event.payload) {
|
|
2024
|
-
onEvent({
|
|
2025
|
-
type: LOCALSEND_EVENTS.deviceDiscovered,
|
|
2026
|
-
data: event.payload,
|
|
2027
|
-
timestamp: Date.now()
|
|
2028
|
-
});
|
|
2029
|
-
}
|
|
2030
|
-
}, listenOptions);
|
|
2031
|
-
log("LocalSend device discovered listener registered");
|
|
2032
|
-
} catch (error) {
|
|
2033
|
-
log("Failed to setup LocalSend device discovered listener:", error);
|
|
2034
|
-
}
|
|
2035
|
-
try {
|
|
2036
|
-
await listen(LOCALSEND_EVENTS.deviceLost, (event) => {
|
|
2037
|
-
log("LocalSend device lost:", event.payload);
|
|
2038
|
-
if (event.payload) {
|
|
2039
|
-
onEvent({
|
|
2040
|
-
type: LOCALSEND_EVENTS.deviceLost,
|
|
2041
|
-
data: event.payload,
|
|
2042
|
-
timestamp: Date.now()
|
|
2043
|
-
});
|
|
2044
|
-
}
|
|
2045
|
-
}, listenOptions);
|
|
2046
|
-
log("LocalSend device lost listener registered");
|
|
2047
|
-
} catch (error) {
|
|
2048
|
-
log("Failed to setup LocalSend device lost listener:", error);
|
|
2049
|
-
}
|
|
2050
|
-
try {
|
|
2051
|
-
await listen(LOCALSEND_EVENTS.transferRequest, (event) => {
|
|
2052
|
-
log("LocalSend transfer request:", event.payload);
|
|
2053
|
-
if (event.payload) {
|
|
2054
|
-
onEvent({
|
|
2055
|
-
type: LOCALSEND_EVENTS.transferRequest,
|
|
2056
|
-
data: event.payload,
|
|
2057
|
-
timestamp: Date.now()
|
|
2058
|
-
});
|
|
2059
|
-
}
|
|
2060
|
-
}, listenOptions);
|
|
2061
|
-
log("LocalSend transfer request listener registered");
|
|
2062
|
-
} catch (error) {
|
|
2063
|
-
log("Failed to setup LocalSend transfer request listener:", error);
|
|
2064
|
-
}
|
|
2065
|
-
try {
|
|
2066
|
-
await listen(LOCALSEND_EVENTS.transferProgress, (event) => {
|
|
2067
|
-
log("LocalSend transfer progress event:", event);
|
|
2068
|
-
if (event.payload) {
|
|
2069
|
-
onEvent({
|
|
2070
|
-
type: LOCALSEND_EVENTS.transferProgress,
|
|
2071
|
-
data: event.payload,
|
|
2072
|
-
timestamp: Date.now()
|
|
2073
|
-
});
|
|
2074
|
-
}
|
|
2075
|
-
}, listenOptions);
|
|
2076
|
-
log("LocalSend transfer progress listener registered");
|
|
2077
|
-
} catch (error) {
|
|
2078
|
-
log("Failed to setup LocalSend transfer progress listener:", error);
|
|
2079
|
-
}
|
|
2080
|
-
try {
|
|
2081
|
-
await listen(LOCALSEND_EVENTS.transferComplete, (event) => {
|
|
2082
|
-
log("LocalSend transfer complete:", event.payload);
|
|
2083
|
-
if (event.payload) {
|
|
2084
|
-
onEvent({
|
|
2085
|
-
type: LOCALSEND_EVENTS.transferComplete,
|
|
2086
|
-
data: event.payload,
|
|
2087
|
-
timestamp: Date.now()
|
|
2088
|
-
});
|
|
2089
|
-
}
|
|
2090
|
-
}, listenOptions);
|
|
2091
|
-
log("LocalSend transfer complete listener registered");
|
|
2092
|
-
} catch (error) {
|
|
2093
|
-
log("Failed to setup LocalSend transfer complete listener:", error);
|
|
2094
|
-
}
|
|
2095
|
-
try {
|
|
2096
|
-
await listen(LOCALSEND_EVENTS.transferFailed, (event) => {
|
|
2097
|
-
log("LocalSend transfer failed:", event.payload);
|
|
2098
|
-
if (event.payload) {
|
|
2099
|
-
onEvent({
|
|
2100
|
-
type: LOCALSEND_EVENTS.transferFailed,
|
|
2101
|
-
data: event.payload,
|
|
2102
|
-
timestamp: Date.now()
|
|
2103
|
-
});
|
|
2104
|
-
}
|
|
2105
|
-
}, listenOptions);
|
|
2106
|
-
log("LocalSend transfer failed listener registered");
|
|
2107
|
-
} catch (error) {
|
|
2108
|
-
log("Failed to setup LocalSend transfer failed listener:", error);
|
|
2109
|
-
}
|
|
1928
|
+
for (const eventName of [
|
|
1929
|
+
HAEXTENSION_EVENTS.PERMISSION_RESOLVED,
|
|
1930
|
+
EXTERNAL_EVENTS.REQUEST,
|
|
1931
|
+
EXTERNAL_EVENTS.ACTION_REQUEST,
|
|
1932
|
+
...Object.values(LOCALSEND_EVENTS)
|
|
1933
|
+
]) {
|
|
1934
|
+
await forwardEvent(listen, log, onEvent, listenOptions, eventName);
|
|
1935
|
+
}
|
|
1936
|
+
await forwardEvent(listen, log, onEvent, listenOptions, HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED, (payload) => ({
|
|
1937
|
+
data: { tables: payload.tables }
|
|
1938
|
+
}));
|
|
1939
|
+
await forwardEvent(listen, log, onEvent, listenOptions, HAEXTENSION_EVENTS.FILE_CHANGED, (payload) => {
|
|
1940
|
+
const { ruleId, changeType, path } = payload;
|
|
1941
|
+
return { ruleId, changeType, path };
|
|
1942
|
+
});
|
|
1943
|
+
await forwardEvent(listen, log, onEvent, listenOptions, SHELL_EVENTS.OUTPUT, (payload) => {
|
|
1944
|
+
const { sessionId, data } = payload;
|
|
1945
|
+
return { sessionId, data };
|
|
1946
|
+
});
|
|
1947
|
+
await forwardEvent(listen, log, onEvent, listenOptions, SHELL_EVENTS.EXIT, (payload) => {
|
|
1948
|
+
const { sessionId, exitCode } = payload;
|
|
1949
|
+
return { sessionId, exitCode };
|
|
1950
|
+
});
|
|
2110
1951
|
}
|
|
2111
1952
|
async function initIframeMode(ctx, log, messageHandler) {
|
|
2112
1953
|
if (!isInIframe()) {
|
|
@@ -2450,6 +2291,68 @@ var AI_COMMANDS = {
|
|
|
2450
2291
|
actionRespond: "ai_action_respond"
|
|
2451
2292
|
};
|
|
2452
2293
|
|
|
2294
|
+
// src/client/permissionRetry.ts
|
|
2295
|
+
var PERMISSION_DECISION_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
2296
|
+
var MAX_PERMISSION_RETRIES = 3;
|
|
2297
|
+
function permissionKey(resourceType, action, target) {
|
|
2298
|
+
return `${resourceType}:${action}:${target}`;
|
|
2299
|
+
}
|
|
2300
|
+
var PermissionWaiterRegistry = class {
|
|
2301
|
+
constructor() {
|
|
2302
|
+
this.waiters = /* @__PURE__ */ new Map();
|
|
2303
|
+
}
|
|
2304
|
+
/** Wait for a decision on `key`; resolves "timeout" if none arrives in time. */
|
|
2305
|
+
wait(key, timeoutMs = PERMISSION_DECISION_TIMEOUT_MS) {
|
|
2306
|
+
return new Promise((resolve) => {
|
|
2307
|
+
const set = this.waiters.get(key) ?? /* @__PURE__ */ new Set();
|
|
2308
|
+
this.waiters.set(key, set);
|
|
2309
|
+
const settle = (outcome) => {
|
|
2310
|
+
if (!set.has(callback)) return;
|
|
2311
|
+
set.delete(callback);
|
|
2312
|
+
if (set.size === 0) this.waiters.delete(key);
|
|
2313
|
+
clearTimeout(timer);
|
|
2314
|
+
resolve(outcome);
|
|
2315
|
+
};
|
|
2316
|
+
const callback = (outcome) => settle(outcome);
|
|
2317
|
+
const timer = setTimeout(() => settle("timeout"), timeoutMs);
|
|
2318
|
+
set.add(callback);
|
|
2319
|
+
});
|
|
2320
|
+
}
|
|
2321
|
+
/** Resolve everyone waiting on `key` with the user's decision. */
|
|
2322
|
+
resolve(key, decision) {
|
|
2323
|
+
const set = this.waiters.get(key);
|
|
2324
|
+
if (!set) return;
|
|
2325
|
+
for (const callback of [...set]) callback(decision);
|
|
2326
|
+
}
|
|
2327
|
+
};
|
|
2328
|
+
function toDeniedError(error) {
|
|
2329
|
+
return { ...error, code: 1002 /* DENIED */ };
|
|
2330
|
+
}
|
|
2331
|
+
async function withPermissionRetry(send, registry, log, timeoutMs = PERMISSION_DECISION_TIMEOUT_MS) {
|
|
2332
|
+
for (let attempt = 0; ; attempt++) {
|
|
2333
|
+
try {
|
|
2334
|
+
return await send();
|
|
2335
|
+
} catch (error) {
|
|
2336
|
+
if (!isPermissionPromptError(error) || attempt >= MAX_PERMISSION_RETRIES) {
|
|
2337
|
+
throw error;
|
|
2338
|
+
}
|
|
2339
|
+
const key = permissionKey(error.resourceType, error.action, error.target);
|
|
2340
|
+
log(`Permission prompt required for ${key} \u2014 waiting for user decision`);
|
|
2341
|
+
const outcome = await registry.wait(key, timeoutMs);
|
|
2342
|
+
if (outcome === "granted") {
|
|
2343
|
+
log(`Permission ${key} granted \u2014 retrying request`);
|
|
2344
|
+
continue;
|
|
2345
|
+
}
|
|
2346
|
+
if (outcome === "denied") {
|
|
2347
|
+
log(`Permission ${key} denied`);
|
|
2348
|
+
throw toDeniedError(error);
|
|
2349
|
+
}
|
|
2350
|
+
log(`Permission ${key} prompt timed out`);
|
|
2351
|
+
throw error;
|
|
2352
|
+
}
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2453
2356
|
// src/client.ts
|
|
2454
2357
|
var HaexVaultSdk = class {
|
|
2455
2358
|
constructor(config = {}) {
|
|
@@ -2465,6 +2368,7 @@ var HaexVaultSdk = class {
|
|
|
2465
2368
|
this.eventListeners = /* @__PURE__ */ new Map();
|
|
2466
2369
|
this.externalRequestHandlers = /* @__PURE__ */ new Map();
|
|
2467
2370
|
this.reactiveSubscribers = /* @__PURE__ */ new Set();
|
|
2371
|
+
this.permissionWaiters = new PermissionWaiterRegistry();
|
|
2468
2372
|
// Handlers
|
|
2469
2373
|
this.messageHandler = null;
|
|
2470
2374
|
/**
|
|
@@ -2501,6 +2405,14 @@ var HaexVaultSdk = class {
|
|
|
2501
2405
|
this.passwords = new PasswordsAPI(this);
|
|
2502
2406
|
this.mail = new MailAPI(this);
|
|
2503
2407
|
installConsoleForwarding(this.config.debug);
|
|
2408
|
+
this.on(HAEXTENSION_EVENTS.PERMISSION_RESOLVED, (event) => {
|
|
2409
|
+
const data = event.data;
|
|
2410
|
+
if (!data) return;
|
|
2411
|
+
this.permissionWaiters.resolve(
|
|
2412
|
+
permissionKey(data.resourceType, data.action, data.target),
|
|
2413
|
+
data.decision === "denied" ? "denied" : "granted"
|
|
2414
|
+
);
|
|
2415
|
+
});
|
|
2504
2416
|
this.readyPromise = new Promise((resolve, reject) => {
|
|
2505
2417
|
this.resolveReady = resolve;
|
|
2506
2418
|
this.rejectReady = reject;
|
|
@@ -2649,24 +2561,27 @@ var HaexVaultSdk = class {
|
|
|
2649
2561
|
// ==========================================================================
|
|
2650
2562
|
async request(method, params) {
|
|
2651
2563
|
const resolvedParams = params ?? {};
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2564
|
+
const send = () => {
|
|
2565
|
+
if (this.isNativeWindow && hasTauri()) {
|
|
2566
|
+
const paramsWithCredentials = {
|
|
2567
|
+
...resolvedParams,
|
|
2568
|
+
publicKey: this._extensionInfo?.publicKey,
|
|
2569
|
+
name: this._extensionInfo?.name
|
|
2570
|
+
};
|
|
2571
|
+
return sendInvoke(method, paramsWithCredentials, this.config, this.log.bind(this));
|
|
2572
|
+
}
|
|
2573
|
+
const requestId = generateRequestId(++this.requestCounter);
|
|
2574
|
+
return sendPostMessage(
|
|
2575
|
+
method,
|
|
2576
|
+
resolvedParams,
|
|
2577
|
+
requestId,
|
|
2578
|
+
this.config,
|
|
2579
|
+
this._extensionInfo,
|
|
2580
|
+
this.pendingRequests,
|
|
2581
|
+
this.hostPort
|
|
2582
|
+
);
|
|
2583
|
+
};
|
|
2584
|
+
return withPermissionRetry(send, this.permissionWaiters, this.log.bind(this));
|
|
2670
2585
|
}
|
|
2671
2586
|
// ==========================================================================
|
|
2672
2587
|
// Private: Initialization
|