webchat: hide model selector in embedded UI
This commit is contained in:
@@ -53,7 +53,8 @@ let ChatPanel = class ChatPanel extends LitElement {
|
|||||||
this.agentInterface = document.createElement("agent-interface");
|
this.agentInterface = document.createElement("agent-interface");
|
||||||
this.agentInterface.session = agent;
|
this.agentInterface.session = agent;
|
||||||
this.agentInterface.enableAttachments = true;
|
this.agentInterface.enableAttachments = true;
|
||||||
this.agentInterface.enableModelSelector = true;
|
// Hide model selector in the embedded chat; use fixed model configured at bootstrap.
|
||||||
|
this.agentInterface.enableModelSelector = false;
|
||||||
this.agentInterface.enableThinkingSelector = true;
|
this.agentInterface.enableThinkingSelector = true;
|
||||||
this.agentInterface.showThemeToggle = false;
|
this.agentInterface.showThemeToggle = false;
|
||||||
this.agentInterface.onApiKeyRequired = config?.onApiKeyRequired;
|
this.agentInterface.onApiKeyRequired = config?.onApiKeyRequired;
|
||||||
@@ -190,4 +191,4 @@ ChatPanel = __decorate([
|
|||||||
customElement("pi-chat-panel")
|
customElement("pi-chat-panel")
|
||||||
], ChatPanel);
|
], ChatPanel);
|
||||||
export { ChatPanel };
|
export { ChatPanel };
|
||||||
//# sourceMappingURL=ChatPanel.js.map
|
//# sourceMappingURL=ChatPanel.js.map
|
||||||
|
|||||||
@@ -71,10 +71,42 @@ const startChat = async () => {
|
|||||||
const { Agent } = await import("./agent/agent.js");
|
const { Agent } = await import("./agent/agent.js");
|
||||||
const { ChatPanel } = await import("./ChatPanel.js");
|
const { ChatPanel } = await import("./ChatPanel.js");
|
||||||
const { AppStorage, setAppStorage } = await import("./storage/app-storage.js");
|
const { AppStorage, setAppStorage } = await import("./storage/app-storage.js");
|
||||||
|
const { SettingsStore } = await import("./storage/stores/settings-store.js");
|
||||||
|
const { ProviderKeysStore } = await import("./storage/stores/provider-keys-store.js");
|
||||||
|
const { SessionsStore } = await import("./storage/stores/sessions-store.js");
|
||||||
|
const { CustomProvidersStore } = await import("./storage/stores/custom-providers-store.js");
|
||||||
|
const { IndexedDBStorageBackend } = await import("./storage/backends/indexeddb-storage-backend.js");
|
||||||
const { getModel } = await import("@mariozechner/pi-ai");
|
const { getModel } = await import("@mariozechner/pi-ai");
|
||||||
logStatus("boot: modules loaded");
|
logStatus("boot: modules loaded");
|
||||||
|
|
||||||
const storage = new AppStorage();
|
// Initialize storage with an in-browser IndexedDB backend.
|
||||||
|
const backend = new IndexedDBStorageBackend({
|
||||||
|
dbName: "clawdis-webchat",
|
||||||
|
version: 1,
|
||||||
|
stores: [
|
||||||
|
new SettingsStore().getConfig(),
|
||||||
|
new ProviderKeysStore().getConfig(),
|
||||||
|
new SessionsStore().getConfig(),
|
||||||
|
SessionsStore.getMetadataConfig(),
|
||||||
|
new CustomProvidersStore().getConfig(),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
const settingsStore = new SettingsStore();
|
||||||
|
const providerKeysStore = new ProviderKeysStore();
|
||||||
|
const sessionsStore = new SessionsStore();
|
||||||
|
const customProvidersStore = new CustomProvidersStore();
|
||||||
|
|
||||||
|
for (const store of [settingsStore, providerKeysStore, sessionsStore, customProvidersStore]) {
|
||||||
|
store.setBackend(backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
const storage = new AppStorage(
|
||||||
|
settingsStore,
|
||||||
|
providerKeysStore,
|
||||||
|
sessionsStore,
|
||||||
|
customProvidersStore,
|
||||||
|
backend,
|
||||||
|
);
|
||||||
setAppStorage(storage);
|
setAppStorage(storage);
|
||||||
|
|
||||||
const agent = new Agent({
|
const agent = new Agent({
|
||||||
|
|||||||
@@ -24732,9 +24732,9 @@ var init_sticker = __esmMin((() => {
|
|||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
//#region apps/macos/Sources/Clawdis/Resources/WebChat/vendor/lucide/dist/esm/icons/store.js
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/vendor/lucide/dist/esm/icons/store.js
|
||||||
var Store;
|
var Store$1;
|
||||||
var init_store = __esmMin((() => {
|
var init_store$1 = __esmMin((() => {
|
||||||
Store = [
|
Store$1 = [
|
||||||
["path", { d: "M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5" }],
|
["path", { d: "M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5" }],
|
||||||
["path", { d: "M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244" }],
|
["path", { d: "M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244" }],
|
||||||
["path", { d: "M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05" }]
|
["path", { d: "M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05" }]
|
||||||
@@ -29670,7 +29670,7 @@ var iconsAndAliases_exports = /* @__PURE__ */ __export({
|
|||||||
Sticker: () => Sticker,
|
Sticker: () => Sticker,
|
||||||
StickyNote: () => StickyNote,
|
StickyNote: () => StickyNote,
|
||||||
StopCircle: () => CircleStop,
|
StopCircle: () => CircleStop,
|
||||||
Store: () => Store,
|
Store: () => Store$1,
|
||||||
StretchHorizontal: () => StretchHorizontal,
|
StretchHorizontal: () => StretchHorizontal,
|
||||||
StretchVertical: () => StretchVertical,
|
StretchVertical: () => StretchVertical,
|
||||||
Strikethrough: () => Strikethrough,
|
Strikethrough: () => Strikethrough,
|
||||||
@@ -31336,7 +31336,7 @@ var init_iconsAndAliases = __esmMin((() => {
|
|||||||
init_step_forward();
|
init_step_forward();
|
||||||
init_stethoscope();
|
init_stethoscope();
|
||||||
init_sticker();
|
init_sticker();
|
||||||
init_store();
|
init_store$1();
|
||||||
init_sticky_note();
|
init_sticky_note();
|
||||||
init_stretch_horizontal();
|
init_stretch_horizontal();
|
||||||
init_stretch_vertical();
|
init_stretch_vertical();
|
||||||
@@ -32981,7 +32981,7 @@ var init_lucide = __esmMin((() => {
|
|||||||
init_step_forward();
|
init_step_forward();
|
||||||
init_stethoscope();
|
init_stethoscope();
|
||||||
init_sticker();
|
init_sticker();
|
||||||
init_store();
|
init_store$1();
|
||||||
init_sticky_note();
|
init_sticky_note();
|
||||||
init_stretch_horizontal();
|
init_stretch_horizontal();
|
||||||
init_stretch_vertical();
|
init_stretch_vertical();
|
||||||
@@ -195303,7 +195303,7 @@ var init_ChatPanel = __esmMin((() => {
|
|||||||
this.agentInterface = document.createElement("agent-interface");
|
this.agentInterface = document.createElement("agent-interface");
|
||||||
this.agentInterface.session = agent;
|
this.agentInterface.session = agent;
|
||||||
this.agentInterface.enableAttachments = true;
|
this.agentInterface.enableAttachments = true;
|
||||||
this.agentInterface.enableModelSelector = true;
|
this.agentInterface.enableModelSelector = false;
|
||||||
this.agentInterface.enableThinkingSelector = true;
|
this.agentInterface.enableThinkingSelector = true;
|
||||||
this.agentInterface.showThemeToggle = false;
|
this.agentInterface.showThemeToggle = false;
|
||||||
this.agentInterface.onApiKeyRequired = config?.onApiKeyRequired;
|
this.agentInterface.onApiKeyRequired = config?.onApiKeyRequired;
|
||||||
@@ -195413,6 +195413,403 @@ var init_ChatPanel = __esmMin((() => {
|
|||||||
ChatPanel = __decorate([t("pi-chat-panel")], ChatPanel);
|
ChatPanel = __decorate([t("pi-chat-panel")], ChatPanel);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/store.js
|
||||||
|
var Store;
|
||||||
|
var init_store = __esmMin((() => {
|
||||||
|
Store = class {
|
||||||
|
constructor() {
|
||||||
|
this.backend = null;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Sets the storage backend. Called by AppStorage after backend creation.
|
||||||
|
*/
|
||||||
|
setBackend(backend) {
|
||||||
|
this.backend = backend;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Gets the storage backend. Throws if backend not set.
|
||||||
|
* Concrete stores must use this to access the backend.
|
||||||
|
*/
|
||||||
|
getBackend() {
|
||||||
|
if (!this.backend) {
|
||||||
|
throw new Error(`Backend not set on ${this.constructor.name}`);
|
||||||
|
}
|
||||||
|
return this.backend;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/stores/settings-store.js
|
||||||
|
var settings_store_exports = /* @__PURE__ */ __export({ SettingsStore: () => SettingsStore });
|
||||||
|
var SettingsStore;
|
||||||
|
var init_settings_store = __esmMin((() => {
|
||||||
|
init_store();
|
||||||
|
SettingsStore = class extends Store {
|
||||||
|
getConfig() {
|
||||||
|
return { name: "settings" };
|
||||||
|
}
|
||||||
|
async get(key) {
|
||||||
|
return this.getBackend().get("settings", key);
|
||||||
|
}
|
||||||
|
async set(key, value) {
|
||||||
|
await this.getBackend().set("settings", key, value);
|
||||||
|
}
|
||||||
|
async delete(key) {
|
||||||
|
await this.getBackend().delete("settings", key);
|
||||||
|
}
|
||||||
|
async list() {
|
||||||
|
return this.getBackend().keys("settings");
|
||||||
|
}
|
||||||
|
async clear() {
|
||||||
|
await this.getBackend().clear("settings");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/stores/provider-keys-store.js
|
||||||
|
var provider_keys_store_exports = /* @__PURE__ */ __export({ ProviderKeysStore: () => ProviderKeysStore });
|
||||||
|
var ProviderKeysStore;
|
||||||
|
var init_provider_keys_store = __esmMin((() => {
|
||||||
|
init_store();
|
||||||
|
ProviderKeysStore = class extends Store {
|
||||||
|
getConfig() {
|
||||||
|
return { name: "provider-keys" };
|
||||||
|
}
|
||||||
|
async get(provider) {
|
||||||
|
return this.getBackend().get("provider-keys", provider);
|
||||||
|
}
|
||||||
|
async set(provider, key) {
|
||||||
|
await this.getBackend().set("provider-keys", provider, key);
|
||||||
|
}
|
||||||
|
async delete(provider) {
|
||||||
|
await this.getBackend().delete("provider-keys", provider);
|
||||||
|
}
|
||||||
|
async list() {
|
||||||
|
return this.getBackend().keys("provider-keys");
|
||||||
|
}
|
||||||
|
async has(provider) {
|
||||||
|
return this.getBackend().has("provider-keys", provider);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/stores/sessions-store.js
|
||||||
|
var sessions_store_exports = /* @__PURE__ */ __export({ SessionsStore: () => SessionsStore });
|
||||||
|
var SessionsStore;
|
||||||
|
var init_sessions_store = __esmMin((() => {
|
||||||
|
init_store();
|
||||||
|
SessionsStore = class extends Store {
|
||||||
|
getConfig() {
|
||||||
|
return {
|
||||||
|
name: "sessions",
|
||||||
|
keyPath: "id",
|
||||||
|
indices: [{
|
||||||
|
name: "lastModified",
|
||||||
|
keyPath: "lastModified"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Additional config for sessions-metadata store.
|
||||||
|
* Must be included when creating the backend.
|
||||||
|
*/
|
||||||
|
static getMetadataConfig() {
|
||||||
|
return {
|
||||||
|
name: "sessions-metadata",
|
||||||
|
keyPath: "id",
|
||||||
|
indices: [{
|
||||||
|
name: "lastModified",
|
||||||
|
keyPath: "lastModified"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
async save(data, metadata) {
|
||||||
|
await this.getBackend().transaction(["sessions", "sessions-metadata"], "readwrite", async (tx) => {
|
||||||
|
await tx.set("sessions", data.id, data);
|
||||||
|
await tx.set("sessions-metadata", metadata.id, metadata);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async get(id) {
|
||||||
|
return this.getBackend().get("sessions", id);
|
||||||
|
}
|
||||||
|
async getMetadata(id) {
|
||||||
|
return this.getBackend().get("sessions-metadata", id);
|
||||||
|
}
|
||||||
|
async getAllMetadata() {
|
||||||
|
return this.getBackend().getAllFromIndex("sessions-metadata", "lastModified", "desc");
|
||||||
|
}
|
||||||
|
async delete(id) {
|
||||||
|
await this.getBackend().transaction(["sessions", "sessions-metadata"], "readwrite", async (tx) => {
|
||||||
|
await tx.delete("sessions", id);
|
||||||
|
await tx.delete("sessions-metadata", id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async deleteSession(id) {
|
||||||
|
return this.delete(id);
|
||||||
|
}
|
||||||
|
async updateTitle(id, title) {
|
||||||
|
const metadata = await this.getMetadata(id);
|
||||||
|
if (metadata) {
|
||||||
|
metadata.title = title;
|
||||||
|
await this.getBackend().set("sessions-metadata", id, metadata);
|
||||||
|
}
|
||||||
|
const data = await this.get(id);
|
||||||
|
if (data) {
|
||||||
|
data.title = title;
|
||||||
|
await this.getBackend().set("sessions", id, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async getQuotaInfo() {
|
||||||
|
return this.getBackend().getQuotaInfo();
|
||||||
|
}
|
||||||
|
async requestPersistence() {
|
||||||
|
return this.getBackend().requestPersistence();
|
||||||
|
}
|
||||||
|
async saveSession(id, state$1, metadata, title) {
|
||||||
|
const meta = metadata || {
|
||||||
|
id,
|
||||||
|
title: title || "",
|
||||||
|
createdAt: new Date().toISOString(),
|
||||||
|
lastModified: new Date().toISOString(),
|
||||||
|
messageCount: state$1.messages?.length || 0,
|
||||||
|
usage: {
|
||||||
|
input: 0,
|
||||||
|
output: 0,
|
||||||
|
cacheRead: 0,
|
||||||
|
cacheWrite: 0,
|
||||||
|
cost: {
|
||||||
|
input: 0,
|
||||||
|
output: 0,
|
||||||
|
cacheRead: 0,
|
||||||
|
cacheWrite: 0,
|
||||||
|
total: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
thinkingLevel: state$1.thinkingLevel || "off",
|
||||||
|
preview: ""
|
||||||
|
};
|
||||||
|
const data = {
|
||||||
|
id,
|
||||||
|
title: title || meta.title,
|
||||||
|
model: state$1.model,
|
||||||
|
thinkingLevel: state$1.thinkingLevel,
|
||||||
|
messages: state$1.messages || [],
|
||||||
|
createdAt: meta.createdAt,
|
||||||
|
lastModified: new Date().toISOString()
|
||||||
|
};
|
||||||
|
await this.save(data, meta);
|
||||||
|
}
|
||||||
|
async loadSession(id) {
|
||||||
|
return this.get(id);
|
||||||
|
}
|
||||||
|
async getLatestSessionId() {
|
||||||
|
const allMetadata = await this.getAllMetadata();
|
||||||
|
if (allMetadata.length === 0) return null;
|
||||||
|
allMetadata.sort((a$2, b$3) => b$3.lastModified.localeCompare(a$2.lastModified));
|
||||||
|
return allMetadata[0].id;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/stores/custom-providers-store.js
|
||||||
|
var custom_providers_store_exports = /* @__PURE__ */ __export({ CustomProvidersStore: () => CustomProvidersStore });
|
||||||
|
var CustomProvidersStore;
|
||||||
|
var init_custom_providers_store = __esmMin((() => {
|
||||||
|
init_store();
|
||||||
|
CustomProvidersStore = class extends Store {
|
||||||
|
getConfig() {
|
||||||
|
return { name: "custom-providers" };
|
||||||
|
}
|
||||||
|
async get(id) {
|
||||||
|
return this.getBackend().get("custom-providers", id);
|
||||||
|
}
|
||||||
|
async set(provider) {
|
||||||
|
await this.getBackend().set("custom-providers", provider.id, provider);
|
||||||
|
}
|
||||||
|
async delete(id) {
|
||||||
|
await this.getBackend().delete("custom-providers", id);
|
||||||
|
}
|
||||||
|
async getAll() {
|
||||||
|
const keys$1 = await this.getBackend().keys("custom-providers");
|
||||||
|
const providers = [];
|
||||||
|
for (const key of keys$1) {
|
||||||
|
const provider = await this.get(key);
|
||||||
|
if (provider) {
|
||||||
|
providers.push(provider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return providers;
|
||||||
|
}
|
||||||
|
async has(id) {
|
||||||
|
return this.getBackend().has("custom-providers", id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/storage/backends/indexeddb-storage-backend.js
|
||||||
|
var indexeddb_storage_backend_exports = /* @__PURE__ */ __export({ IndexedDBStorageBackend: () => IndexedDBStorageBackend });
|
||||||
|
var IndexedDBStorageBackend;
|
||||||
|
var init_indexeddb_storage_backend = __esmMin((() => {
|
||||||
|
IndexedDBStorageBackend = class {
|
||||||
|
constructor(config) {
|
||||||
|
this.config = config;
|
||||||
|
this.dbPromise = null;
|
||||||
|
}
|
||||||
|
async getDB() {
|
||||||
|
if (!this.dbPromise) {
|
||||||
|
this.dbPromise = new Promise((resolve, reject) => {
|
||||||
|
const request = indexedDB.open(this.config.dbName, this.config.version);
|
||||||
|
request.onerror = () => reject(request.error);
|
||||||
|
request.onsuccess = () => resolve(request.result);
|
||||||
|
request.onupgradeneeded = (_event) => {
|
||||||
|
const db = request.result;
|
||||||
|
for (const storeConfig of this.config.stores) {
|
||||||
|
if (!db.objectStoreNames.contains(storeConfig.name)) {
|
||||||
|
const store = db.createObjectStore(storeConfig.name, {
|
||||||
|
keyPath: storeConfig.keyPath,
|
||||||
|
autoIncrement: storeConfig.autoIncrement
|
||||||
|
});
|
||||||
|
if (storeConfig.indices) {
|
||||||
|
for (const indexConfig of storeConfig.indices) {
|
||||||
|
store.createIndex(indexConfig.name, indexConfig.keyPath, { unique: indexConfig.unique });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.dbPromise;
|
||||||
|
}
|
||||||
|
promisifyRequest(request) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
request.onsuccess = () => resolve(request.result);
|
||||||
|
request.onerror = () => reject(request.error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async get(storeName, key) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readonly");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
const result = await this.promisifyRequest(store.get(key));
|
||||||
|
return result ?? null;
|
||||||
|
}
|
||||||
|
async set(storeName, key, value) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readwrite");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
if (store.keyPath) {
|
||||||
|
await this.promisifyRequest(store.put(value));
|
||||||
|
} else {
|
||||||
|
await this.promisifyRequest(store.put(value, key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async delete(storeName, key) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readwrite");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
await this.promisifyRequest(store.delete(key));
|
||||||
|
}
|
||||||
|
async keys(storeName, prefix) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readonly");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
if (prefix) {
|
||||||
|
const range = IDBKeyRange.bound(prefix, prefix + "", false, false);
|
||||||
|
const keys$1 = await this.promisifyRequest(store.getAllKeys(range));
|
||||||
|
return keys$1.map((k$2) => String(k$2));
|
||||||
|
} else {
|
||||||
|
const keys$1 = await this.promisifyRequest(store.getAllKeys());
|
||||||
|
return keys$1.map((k$2) => String(k$2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async getAllFromIndex(storeName, indexName, direction = "asc") {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readonly");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
const index = store.index(indexName);
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const results = [];
|
||||||
|
const request = index.openCursor(null, direction === "desc" ? "prev" : "next");
|
||||||
|
request.onsuccess = () => {
|
||||||
|
const cursor = request.result;
|
||||||
|
if (cursor) {
|
||||||
|
results.push(cursor.value);
|
||||||
|
cursor.continue();
|
||||||
|
} else {
|
||||||
|
resolve(results);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
request.onerror = () => reject(request.error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async clear(storeName) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readwrite");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
await this.promisifyRequest(store.clear());
|
||||||
|
}
|
||||||
|
async has(storeName, key) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const tx = db.transaction(storeName, "readonly");
|
||||||
|
const store = tx.objectStore(storeName);
|
||||||
|
const result = await this.promisifyRequest(store.getKey(key));
|
||||||
|
return result !== undefined;
|
||||||
|
}
|
||||||
|
async transaction(storeNames, mode, operation) {
|
||||||
|
const db = await this.getDB();
|
||||||
|
const idbTx = db.transaction(storeNames, mode);
|
||||||
|
const storageTx = {
|
||||||
|
get: async (storeName, key) => {
|
||||||
|
const store = idbTx.objectStore(storeName);
|
||||||
|
const result = await this.promisifyRequest(store.get(key));
|
||||||
|
return result ?? null;
|
||||||
|
},
|
||||||
|
set: async (storeName, key, value) => {
|
||||||
|
const store = idbTx.objectStore(storeName);
|
||||||
|
if (store.keyPath) {
|
||||||
|
await this.promisifyRequest(store.put(value));
|
||||||
|
} else {
|
||||||
|
await this.promisifyRequest(store.put(value, key));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
delete: async (storeName, key) => {
|
||||||
|
const store = idbTx.objectStore(storeName);
|
||||||
|
await this.promisifyRequest(store.delete(key));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return operation(storageTx);
|
||||||
|
}
|
||||||
|
async getQuotaInfo() {
|
||||||
|
if (navigator.storage?.estimate) {
|
||||||
|
const estimate = await navigator.storage.estimate();
|
||||||
|
return {
|
||||||
|
usage: estimate.usage || 0,
|
||||||
|
quota: estimate.quota || 0,
|
||||||
|
percent: estimate.quota ? (estimate.usage || 0) / estimate.quota * 100 : 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
usage: 0,
|
||||||
|
quota: 0,
|
||||||
|
percent: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
async requestPersistence() {
|
||||||
|
if (navigator.storage?.persist) {
|
||||||
|
return await navigator.storage.persist();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
//#region apps/macos/Sources/Clawdis/Resources/WebChat/bootstrap.js
|
//#region apps/macos/Sources/Clawdis/Resources/WebChat/bootstrap.js
|
||||||
if (!globalThis.process) {
|
if (!globalThis.process) {
|
||||||
@@ -195492,9 +195889,37 @@ const startChat = async () => {
|
|||||||
const { Agent: Agent$1 } = await Promise.resolve().then(() => (init_agent(), agent_exports));
|
const { Agent: Agent$1 } = await Promise.resolve().then(() => (init_agent(), agent_exports));
|
||||||
const { ChatPanel: ChatPanel$1 } = await Promise.resolve().then(() => (init_ChatPanel(), ChatPanel_exports));
|
const { ChatPanel: ChatPanel$1 } = await Promise.resolve().then(() => (init_ChatPanel(), ChatPanel_exports));
|
||||||
const { AppStorage: AppStorage$1, setAppStorage: setAppStorage$1 } = await Promise.resolve().then(() => (init_app_storage(), app_storage_exports));
|
const { AppStorage: AppStorage$1, setAppStorage: setAppStorage$1 } = await Promise.resolve().then(() => (init_app_storage(), app_storage_exports));
|
||||||
|
const { SettingsStore: SettingsStore$1 } = await Promise.resolve().then(() => (init_settings_store(), settings_store_exports));
|
||||||
|
const { ProviderKeysStore: ProviderKeysStore$1 } = await Promise.resolve().then(() => (init_provider_keys_store(), provider_keys_store_exports));
|
||||||
|
const { SessionsStore: SessionsStore$1 } = await Promise.resolve().then(() => (init_sessions_store(), sessions_store_exports));
|
||||||
|
const { CustomProvidersStore: CustomProvidersStore$1 } = await Promise.resolve().then(() => (init_custom_providers_store(), custom_providers_store_exports));
|
||||||
|
const { IndexedDBStorageBackend: IndexedDBStorageBackend$1 } = await Promise.resolve().then(() => (init_indexeddb_storage_backend(), indexeddb_storage_backend_exports));
|
||||||
const { getModel: getModel$1 } = await Promise.resolve().then(() => (init_pi_ai_stub(), pi_ai_stub_exports));
|
const { getModel: getModel$1 } = await Promise.resolve().then(() => (init_pi_ai_stub(), pi_ai_stub_exports));
|
||||||
logStatus("boot: modules loaded");
|
logStatus("boot: modules loaded");
|
||||||
const storage = new AppStorage$1();
|
const backend = new IndexedDBStorageBackend$1({
|
||||||
|
dbName: "clawdis-webchat",
|
||||||
|
version: 1,
|
||||||
|
stores: [
|
||||||
|
new SettingsStore$1().getConfig(),
|
||||||
|
new ProviderKeysStore$1().getConfig(),
|
||||||
|
new SessionsStore$1().getConfig(),
|
||||||
|
SessionsStore$1.getMetadataConfig(),
|
||||||
|
new CustomProvidersStore$1().getConfig()
|
||||||
|
]
|
||||||
|
});
|
||||||
|
const settingsStore = new SettingsStore$1();
|
||||||
|
const providerKeysStore = new ProviderKeysStore$1();
|
||||||
|
const sessionsStore = new SessionsStore$1();
|
||||||
|
const customProvidersStore = new CustomProvidersStore$1();
|
||||||
|
for (const store of [
|
||||||
|
settingsStore,
|
||||||
|
providerKeysStore,
|
||||||
|
sessionsStore,
|
||||||
|
customProvidersStore
|
||||||
|
]) {
|
||||||
|
store.setBackend(backend);
|
||||||
|
}
|
||||||
|
const storage = new AppStorage$1(settingsStore, providerKeysStore, sessionsStore, customProvidersStore, backend);
|
||||||
setAppStorage$1(storage);
|
setAppStorage$1(storage);
|
||||||
const agent = new Agent$1({
|
const agent = new Agent$1({
|
||||||
initialState: {
|
initialState: {
|
||||||
|
|||||||
Reference in New Issue
Block a user