actoviq-agent-sdk 0.4.21 → 0.4.22
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-zh.md +50 -113
- package/README.md +51 -164
- package/assets/hadamard-icon.ico +0 -0
- package/assets/hadamard-icon.png +0 -0
- package/bin/hadamard-gui.js +31 -12
- package/dist/src/codeIntel/codeIntelligenceService.d.ts +16 -0
- package/dist/src/codeIntel/codeIntelligenceService.d.ts.map +1 -1
- package/dist/src/codeIntel/codeIntelligenceService.js +87 -2
- package/dist/src/codeIntel/codeIntelligenceService.js.map +1 -1
- package/dist/src/codeIntel/codeIntelligenceTools.d.ts.map +1 -1
- package/dist/src/codeIntel/codeIntelligenceTools.js +6 -0
- package/dist/src/codeIntel/codeIntelligenceTools.js.map +1 -1
- package/dist/src/codeIntel/index.d.ts +1 -0
- package/dist/src/codeIntel/index.d.ts.map +1 -1
- package/dist/src/codeIntel/index.js +1 -0
- package/dist/src/codeIntel/index.js.map +1 -1
- package/dist/src/codeIntel/languageServerPresets.d.ts +13 -0
- package/dist/src/codeIntel/languageServerPresets.d.ts.map +1 -0
- package/dist/src/codeIntel/languageServerPresets.js +51 -0
- package/dist/src/codeIntel/languageServerPresets.js.map +1 -0
- package/dist/src/codeIntel/languageServerRegistry.d.ts +1 -0
- package/dist/src/codeIntel/languageServerRegistry.d.ts.map +1 -1
- package/dist/src/codeIntel/languageServerRegistry.js +2 -2
- package/dist/src/codeIntel/languageServerRegistry.js.map +1 -1
- package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
- package/dist/src/config/resolveRuntimeConfig.js +5 -0
- package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
- package/dist/src/extensions/builtInExtensions.d.ts +61 -0
- package/dist/src/extensions/builtInExtensions.d.ts.map +1 -0
- package/dist/src/extensions/builtInExtensions.js +218 -0
- package/dist/src/extensions/builtInExtensions.js.map +1 -0
- package/dist/src/extensions/filterOutputPolicy.d.ts +21 -0
- package/dist/src/extensions/filterOutputPolicy.d.ts.map +1 -0
- package/dist/src/extensions/filterOutputPolicy.js +121 -0
- package/dist/src/extensions/filterOutputPolicy.js.map +1 -0
- package/dist/src/extensions/securityPolicy.d.ts +27 -0
- package/dist/src/extensions/securityPolicy.d.ts.map +1 -0
- package/dist/src/extensions/securityPolicy.js +238 -0
- package/dist/src/extensions/securityPolicy.js.map +1 -0
- package/dist/src/extensions/sessionCostTracker.d.ts +63 -0
- package/dist/src/extensions/sessionCostTracker.d.ts.map +1 -0
- package/dist/src/extensions/sessionCostTracker.js +213 -0
- package/dist/src/extensions/sessionCostTracker.js.map +1 -0
- package/dist/src/extensions/taskNotifications.d.ts +31 -0
- package/dist/src/extensions/taskNotifications.d.ts.map +1 -0
- package/dist/src/extensions/taskNotifications.js +50 -0
- package/dist/src/extensions/taskNotifications.js.map +1 -0
- package/dist/src/extensions/usageBar.d.ts +35 -0
- package/dist/src/extensions/usageBar.d.ts.map +1 -0
- package/dist/src/extensions/usageBar.js +67 -0
- package/dist/src/extensions/usageBar.js.map +1 -0
- package/dist/src/gui/contextRailStore.d.ts +13 -0
- package/dist/src/gui/contextRailStore.d.ts.map +1 -1
- package/dist/src/gui/contextRailStore.js +16 -0
- package/dist/src/gui/contextRailStore.js.map +1 -1
- package/dist/src/gui/electronMain.js +45 -5
- package/dist/src/gui/electronMain.js.map +1 -1
- package/dist/src/gui/guiDesignClientScript.d.ts.map +1 -1
- package/dist/src/gui/guiDesignClientScript.js +31 -0
- package/dist/src/gui/guiDesignClientScript.js.map +1 -1
- package/dist/src/gui/guiUsageRoutingAssets.d.ts +7 -0
- package/dist/src/gui/guiUsageRoutingAssets.d.ts.map +1 -0
- package/dist/src/gui/guiUsageRoutingAssets.js +509 -0
- package/dist/src/gui/guiUsageRoutingAssets.js.map +1 -0
- package/dist/src/gui/guiUsageRoutingHttpController.d.ts +11 -0
- package/dist/src/gui/guiUsageRoutingHttpController.d.ts.map +1 -0
- package/dist/src/gui/guiUsageRoutingHttpController.js +125 -0
- package/dist/src/gui/guiUsageRoutingHttpController.js.map +1 -0
- package/dist/src/gui/guiUsageRoutingRuntime.d.ts +36 -0
- package/dist/src/gui/guiUsageRoutingRuntime.d.ts.map +1 -0
- package/dist/src/gui/guiUsageRoutingRuntime.js +98 -0
- package/dist/src/gui/guiUsageRoutingRuntime.js.map +1 -0
- package/dist/src/gui/hadamardGui.d.ts +5 -0
- package/dist/src/gui/hadamardGui.d.ts.map +1 -1
- package/dist/src/gui/hadamardGui.js +159 -16
- package/dist/src/gui/hadamardGui.js.map +1 -1
- package/dist/src/gui/hadamardGuiAssets.d.ts.map +1 -1
- package/dist/src/gui/hadamardGuiAssets.js +297 -41
- package/dist/src/gui/hadamardGuiAssets.js.map +1 -1
- package/dist/src/index.d.ts +32 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +16 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/keyway/electronSecretStore.d.ts +37 -0
- package/dist/src/keyway/electronSecretStore.d.ts.map +1 -0
- package/dist/src/keyway/electronSecretStore.js +105 -0
- package/dist/src/keyway/electronSecretStore.js.map +1 -0
- package/dist/src/keyway/embeddedKeyway.d.ts +34 -0
- package/dist/src/keyway/embeddedKeyway.d.ts.map +1 -0
- package/dist/src/keyway/embeddedKeyway.js +81 -0
- package/dist/src/keyway/embeddedKeyway.js.map +1 -0
- package/dist/src/keyway/keywayLoopbackGateway.d.ts +30 -0
- package/dist/src/keyway/keywayLoopbackGateway.d.ts.map +1 -0
- package/dist/src/keyway/keywayLoopbackGateway.js +71 -0
- package/dist/src/keyway/keywayLoopbackGateway.js.map +1 -0
- package/dist/src/keyway/keywayMigrationService.d.ts +44 -0
- package/dist/src/keyway/keywayMigrationService.d.ts.map +1 -0
- package/dist/src/keyway/keywayMigrationService.js +219 -0
- package/dist/src/keyway/keywayMigrationService.js.map +1 -0
- package/dist/src/keyway/keywayModelApi.d.ts +24 -0
- package/dist/src/keyway/keywayModelApi.d.ts.map +1 -0
- package/dist/src/keyway/keywayModelApi.js +106 -0
- package/dist/src/keyway/keywayModelApi.js.map +1 -0
- package/dist/src/keyway/keywayPorts.d.ts +189 -0
- package/dist/src/keyway/keywayPorts.d.ts.map +1 -0
- package/dist/src/keyway/keywayPorts.js +2 -0
- package/dist/src/keyway/keywayPorts.js.map +1 -0
- package/dist/src/keyway/keywayProviderExecutor.d.ts +30 -0
- package/dist/src/keyway/keywayProviderExecutor.d.ts.map +1 -0
- package/dist/src/keyway/keywayProviderExecutor.js +257 -0
- package/dist/src/keyway/keywayProviderExecutor.js.map +1 -0
- package/dist/src/keyway/routingComposition.d.ts +18 -0
- package/dist/src/keyway/routingComposition.d.ts.map +1 -0
- package/dist/src/keyway/routingComposition.js +19 -0
- package/dist/src/keyway/routingComposition.js.map +1 -0
- package/dist/src/keyway/usageRoutingAdminService.d.ts +86 -0
- package/dist/src/keyway/usageRoutingAdminService.d.ts.map +1 -0
- package/dist/src/keyway/usageRoutingAdminService.js +384 -0
- package/dist/src/keyway/usageRoutingAdminService.js.map +1 -0
- package/dist/src/nativeCli/crushManagedClient.d.ts +84 -0
- package/dist/src/nativeCli/crushManagedClient.d.ts.map +1 -0
- package/dist/src/nativeCli/crushManagedClient.js +978 -0
- package/dist/src/nativeCli/crushManagedClient.js.map +1 -0
- package/dist/src/nativeCli/crushNativeCliClient.d.ts +19 -0
- package/dist/src/nativeCli/crushNativeCliClient.d.ts.map +1 -0
- package/dist/src/nativeCli/crushNativeCliClient.js +243 -0
- package/dist/src/nativeCli/crushNativeCliClient.js.map +1 -0
- package/dist/src/nativeCli/keywayNativeCliAdapter.d.ts +31 -0
- package/dist/src/nativeCli/keywayNativeCliAdapter.d.ts.map +1 -0
- package/dist/src/nativeCli/keywayNativeCliAdapter.js +35 -0
- package/dist/src/nativeCli/keywayNativeCliAdapter.js.map +1 -0
- package/dist/src/nativeCli/nativeCliAuth.d.ts +24 -0
- package/dist/src/nativeCli/nativeCliAuth.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliAuth.js +327 -0
- package/dist/src/nativeCli/nativeCliAuth.js.map +1 -0
- package/dist/src/nativeCli/nativeCliClient.d.ts +16 -0
- package/dist/src/nativeCli/nativeCliClient.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliClient.js +575 -0
- package/dist/src/nativeCli/nativeCliClient.js.map +1 -0
- package/dist/src/nativeCli/nativeCliCodewhaleProtocol.d.ts +18 -0
- package/dist/src/nativeCli/nativeCliCodewhaleProtocol.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliCodewhaleProtocol.js +376 -0
- package/dist/src/nativeCli/nativeCliCodewhaleProtocol.js.map +1 -0
- package/dist/src/nativeCli/nativeCliContracts.d.ts +22 -0
- package/dist/src/nativeCli/nativeCliContracts.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliContracts.js +2 -0
- package/dist/src/nativeCli/nativeCliContracts.js.map +1 -0
- package/dist/src/nativeCli/nativeCliCursorProtocol.d.ts +7 -0
- package/dist/src/nativeCli/nativeCliCursorProtocol.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliCursorProtocol.js +210 -0
- package/dist/src/nativeCli/nativeCliCursorProtocol.js.map +1 -0
- package/dist/src/nativeCli/nativeCliEnvironment.d.ts +3 -0
- package/dist/src/nativeCli/nativeCliEnvironment.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliEnvironment.js +17 -0
- package/dist/src/nativeCli/nativeCliEnvironment.js.map +1 -0
- package/dist/src/nativeCli/nativeCliExecResolver.d.ts +26 -0
- package/dist/src/nativeCli/nativeCliExecResolver.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliExecResolver.js +152 -0
- package/dist/src/nativeCli/nativeCliExecResolver.js.map +1 -0
- package/dist/src/nativeCli/nativeCliPiProtocol.d.ts +15 -0
- package/dist/src/nativeCli/nativeCliPiProtocol.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliPiProtocol.js +329 -0
- package/dist/src/nativeCli/nativeCliPiProtocol.js.map +1 -0
- package/dist/src/nativeCli/nativeCliProcessTree.d.ts +3 -0
- package/dist/src/nativeCli/nativeCliProcessTree.d.ts.map +1 -0
- package/dist/src/nativeCli/nativeCliProcessTree.js +104 -0
- package/dist/src/nativeCli/nativeCliProcessTree.js.map +1 -0
- package/dist/src/nativeCli/reasonixAcpSession.d.ts +35 -0
- package/dist/src/nativeCli/reasonixAcpSession.d.ts.map +1 -0
- package/dist/src/nativeCli/reasonixAcpSession.js +472 -0
- package/dist/src/nativeCli/reasonixAcpSession.js.map +1 -0
- package/dist/src/nativeCli/reasonixManagedClient.d.ts +56 -0
- package/dist/src/nativeCli/reasonixManagedClient.d.ts.map +1 -0
- package/dist/src/nativeCli/reasonixManagedClient.js +293 -0
- package/dist/src/nativeCli/reasonixManagedClient.js.map +1 -0
- package/dist/src/nativeCli/reasonixNativeCliClient.d.ts +20 -0
- package/dist/src/nativeCli/reasonixNativeCliClient.d.ts.map +1 -0
- package/dist/src/nativeCli/reasonixNativeCliClient.js +317 -0
- package/dist/src/nativeCli/reasonixNativeCliClient.js.map +1 -0
- package/dist/src/parity/bridgeExecResolver.d.ts +2 -25
- package/dist/src/parity/bridgeExecResolver.d.ts.map +1 -1
- package/dist/src/parity/bridgeExecResolver.js +2 -151
- package/dist/src/parity/bridgeExecResolver.js.map +1 -1
- package/dist/src/parity/bridgeProcessTree.d.ts +2 -2
- package/dist/src/parity/bridgeProcessTree.d.ts.map +1 -1
- package/dist/src/parity/bridgeProcessTree.js +2 -82
- package/dist/src/parity/bridgeProcessTree.js.map +1 -1
- package/dist/src/parity/crushManagedClient.d.ts +2 -83
- package/dist/src/parity/crushManagedClient.d.ts.map +1 -1
- package/dist/src/parity/crushManagedClient.js +2 -977
- package/dist/src/parity/crushManagedClient.js.map +1 -1
- package/dist/src/parity/externalCliAuth.d.ts +2 -22
- package/dist/src/parity/externalCliAuth.d.ts.map +1 -1
- package/dist/src/parity/externalCliAuth.js +2 -295
- package/dist/src/parity/externalCliAuth.js.map +1 -1
- package/dist/src/parity/hadamardBridgeSdk.d.ts.map +1 -1
- package/dist/src/parity/hadamardBridgeSdk.js +14 -1
- package/dist/src/parity/hadamardBridgeSdk.js.map +1 -1
- package/dist/src/parity/nativeCliBridgeAdapter.d.ts +6 -0
- package/dist/src/parity/nativeCliBridgeAdapter.d.ts.map +1 -0
- package/dist/src/parity/nativeCliBridgeAdapter.js +38 -0
- package/dist/src/parity/nativeCliBridgeAdapter.js.map +1 -0
- package/dist/src/parity/reasonixAcpSession.d.ts +2 -34
- package/dist/src/parity/reasonixAcpSession.d.ts.map +1 -1
- package/dist/src/parity/reasonixAcpSession.js +2 -471
- package/dist/src/parity/reasonixAcpSession.js.map +1 -1
- package/dist/src/parity/reasonixManagedClient.d.ts +2 -55
- package/dist/src/parity/reasonixManagedClient.d.ts.map +1 -1
- package/dist/src/parity/reasonixManagedClient.js +2 -292
- package/dist/src/parity/reasonixManagedClient.js.map +1 -1
- package/dist/src/provider/openai-client.js +2 -2
- package/dist/src/provider/openai-client.js.map +1 -1
- package/dist/src/provider/openai-model-api.d.ts.map +1 -1
- package/dist/src/provider/openai-model-api.js +5 -1
- package/dist/src/provider/openai-model-api.js.map +1 -1
- package/dist/src/runtime/agentClient.d.ts +14 -1
- package/dist/src/runtime/agentClient.d.ts.map +1 -1
- package/dist/src/runtime/agentClient.js +60 -6
- package/dist/src/runtime/agentClient.js.map +1 -1
- package/dist/src/runtime/toolPolicyPipeline.d.ts +32 -1
- package/dist/src/runtime/toolPolicyPipeline.d.ts.map +1 -1
- package/dist/src/runtime/toolPolicyPipeline.js +43 -3
- package/dist/src/runtime/toolPolicyPipeline.js.map +1 -1
- package/dist/src/tui/hadamardTuiController.d.ts.map +1 -1
- package/dist/src/tui/hadamardTuiController.js +62 -8
- package/dist/src/tui/hadamardTuiController.js.map +1 -1
- package/dist/src/tui/tuiBasicCommandHandler.d.ts +4 -0
- package/dist/src/tui/tuiBasicCommandHandler.d.ts.map +1 -1
- package/dist/src/tui/tuiBasicCommandHandler.js +23 -2
- package/dist/src/tui/tuiBasicCommandHandler.js.map +1 -1
- package/dist/src/tui/tuiCatalogCommandHandler.d.ts +2 -0
- package/dist/src/tui/tuiCatalogCommandHandler.d.ts.map +1 -1
- package/dist/src/tui/tuiCatalogCommandHandler.js +10 -1
- package/dist/src/tui/tuiCatalogCommandHandler.js.map +1 -1
- package/dist/src/tui/tuiUsageRoutingRuntime.d.ts +22 -0
- package/dist/src/tui/tuiUsageRoutingRuntime.d.ts.map +1 -0
- package/dist/src/tui/tuiUsageRoutingRuntime.js +81 -0
- package/dist/src/tui/tuiUsageRoutingRuntime.js.map +1 -0
- package/dist/src/types.d.ts +16 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/ui/commandSurface.d.ts.map +1 -1
- package/dist/src/ui/commandSurface.js +45 -1
- package/dist/src/ui/commandSurface.js.map +1 -1
- package/dist/src/ui/extensionsCommandView.d.ts +18 -0
- package/dist/src/ui/extensionsCommandView.d.ts.map +1 -0
- package/dist/src/ui/extensionsCommandView.js +82 -0
- package/dist/src/ui/extensionsCommandView.js.map +1 -0
- package/dist/src/ui/lspCommandView.d.ts +17 -0
- package/dist/src/ui/lspCommandView.d.ts.map +1 -0
- package/dist/src/ui/lspCommandView.js +25 -0
- package/dist/src/ui/lspCommandView.js.map +1 -0
- package/dist/src/ui/usageRoutingCommand.d.ts +13 -0
- package/dist/src/ui/usageRoutingCommand.d.ts.map +1 -0
- package/dist/src/ui/usageRoutingCommand.js +224 -0
- package/dist/src/ui/usageRoutingCommand.js.map +1 -0
- package/dist/src/usage/budgetService.d.ts +28 -0
- package/dist/src/usage/budgetService.d.ts.map +1 -0
- package/dist/src/usage/budgetService.js +50 -0
- package/dist/src/usage/budgetService.js.map +1 -0
- package/dist/src/usage/contracts.d.ts +149 -0
- package/dist/src/usage/contracts.d.ts.map +1 -0
- package/dist/src/usage/contracts.js +2 -0
- package/dist/src/usage/contracts.js.map +1 -0
- package/dist/src/usage/index.d.ts +7 -0
- package/dist/src/usage/index.d.ts.map +1 -0
- package/dist/src/usage/index.js +4 -0
- package/dist/src/usage/index.js.map +1 -0
- package/dist/src/usage/usageLedger.d.ts +19 -0
- package/dist/src/usage/usageLedger.d.ts.map +1 -0
- package/dist/src/usage/usageLedger.js +389 -0
- package/dist/src/usage/usageLedger.js.map +1 -0
- package/dist/src/usage/usageQueryService.d.ts +12 -0
- package/dist/src/usage/usageQueryService.d.ts.map +1 -0
- package/dist/src/usage/usageQueryService.js +29 -0
- package/dist/src/usage/usageQueryService.js.map +1 -0
- package/package.json +14 -2
- package/scripts/prepare-gui-launcher.mjs +62 -0
|
@@ -2,22 +2,41 @@
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { app, BrowserWindow, dialog, Menu, nativeImage, shell } from 'electron';
|
|
5
|
+
import { app, BrowserWindow, dialog, Menu, nativeImage, safeStorage, shell } from 'electron';
|
|
6
6
|
import electronUpdater from 'electron-updater';
|
|
7
7
|
import { parseHadamardGuiArgs, startHadamardGuiServer, } from './hadamardGui.js';
|
|
8
8
|
import { resolveGuiIconPath } from './guiAssets.js';
|
|
9
9
|
import { readPackageVersion } from '../cli/version.js';
|
|
10
10
|
import { getDefaultHadamardSettingsPath, persistHadamardSettingsStore, } from '../config/hadamardSettingsStore.js';
|
|
11
11
|
import { resolveHadamardHome } from '../config/hadamardHome.js';
|
|
12
|
+
import { ElectronSecretStore } from '../keyway/electronSecretStore.js';
|
|
12
13
|
import { createAppUpdateController, createUnsupportedAppUpdateController, canUseNativeDesktopAutoUpdater, } from '../update/appUpdateService.js';
|
|
13
14
|
let guiServer = null;
|
|
14
15
|
let mainWindow = null;
|
|
15
16
|
let cleanupInProgress = false;
|
|
16
17
|
let quittingAfterCleanup = false;
|
|
17
18
|
const { autoUpdater } = electronUpdater;
|
|
19
|
+
const windowsAppUserModelId = process.env.HADAMARD_GUI_APP_USER_MODEL_ID?.trim()
|
|
20
|
+
|| (process.env.HADAMARD_GUI_DEVELOPMENT === '1'
|
|
21
|
+
? 'com.hadamard.desktop.dev'
|
|
22
|
+
: 'com.hadamard.desktop');
|
|
23
|
+
function quoteWindowsCommandArgument(value) {
|
|
24
|
+
return `"${value.replaceAll('"', '\\"')}"`;
|
|
25
|
+
}
|
|
26
|
+
function getWindowsRelaunchCommand() {
|
|
27
|
+
const developmentNode = process.env.HADAMARD_GUI_NODE;
|
|
28
|
+
const guiRoot = process.env.HADAMARD_GUI_ROOT;
|
|
29
|
+
if (process.env.HADAMARD_GUI_DEVELOPMENT === '1' && developmentNode && guiRoot) {
|
|
30
|
+
return [developmentNode, path.join(guiRoot, 'bin', 'hadamard-gui.js')]
|
|
31
|
+
.map(quoteWindowsCommandArgument)
|
|
32
|
+
.join(' ');
|
|
33
|
+
}
|
|
34
|
+
return quoteWindowsCommandArgument(process.execPath);
|
|
35
|
+
}
|
|
18
36
|
if (process.platform === 'win32') {
|
|
19
|
-
//
|
|
20
|
-
|
|
37
|
+
// Keep development windows out of an installed shortcut's taskbar group. Otherwise
|
|
38
|
+
// Windows can reuse the icon cached for an older installed Hadamard executable.
|
|
39
|
+
app.setAppUserModelId(windowsAppUserModelId);
|
|
21
40
|
}
|
|
22
41
|
function executeInFocusedWindow(script) {
|
|
23
42
|
const focusedWindow = BrowserWindow.getFocusedWindow();
|
|
@@ -175,6 +194,10 @@ async function createWindow() {
|
|
|
175
194
|
guiServer = await startHadamardGuiServer({
|
|
176
195
|
...args,
|
|
177
196
|
appUpdater: createDesktopAppUpdater(),
|
|
197
|
+
keywaySecretStore: new ElectronSecretStore({
|
|
198
|
+
filePath: path.join(resolveHadamardHome(args.homeDir), 'keyway', 'secrets.safe-storage.json'),
|
|
199
|
+
safeStorage,
|
|
200
|
+
}),
|
|
178
201
|
});
|
|
179
202
|
installApplicationMenu();
|
|
180
203
|
const { iconPath, iconImage } = loadWindowIcon();
|
|
@@ -186,7 +209,11 @@ async function createWindow() {
|
|
|
186
209
|
minHeight: 620,
|
|
187
210
|
title: 'Hadamard',
|
|
188
211
|
backgroundColor: '#f3f3f3',
|
|
189
|
-
|
|
212
|
+
// Apply the Windows AppUserModelID before the taskbar button is created.
|
|
213
|
+
// Showing the window here lets Explorer group it with an installed shortcut
|
|
214
|
+
// before setAppDetails() runs, which can resurrect that shortcut's stale icon.
|
|
215
|
+
show: false,
|
|
216
|
+
...(process.platform === 'win32' ? { skipTaskbar: true } : {}),
|
|
190
217
|
...(hasIcon ? { icon: iconPath } : {}),
|
|
191
218
|
webPreferences: {
|
|
192
219
|
contextIsolation: true,
|
|
@@ -196,6 +223,14 @@ async function createWindow() {
|
|
|
196
223
|
},
|
|
197
224
|
});
|
|
198
225
|
mainWindow = window;
|
|
226
|
+
if (process.platform === 'win32') {
|
|
227
|
+
window.setAppDetails({
|
|
228
|
+
appId: windowsAppUserModelId,
|
|
229
|
+
...(hasIcon ? { appIconPath: process.execPath, appIconIndex: 0 } : {}),
|
|
230
|
+
relaunchCommand: getWindowsRelaunchCommand(),
|
|
231
|
+
relaunchDisplayName: 'Hadamard',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
199
234
|
window.on('closed', () => {
|
|
200
235
|
if (mainWindow === window)
|
|
201
236
|
mainWindow = null;
|
|
@@ -205,6 +240,8 @@ async function createWindow() {
|
|
|
205
240
|
window.setIcon(iconPath);
|
|
206
241
|
}
|
|
207
242
|
window.once('ready-to-show', () => {
|
|
243
|
+
if (process.platform === 'win32')
|
|
244
|
+
window.setSkipTaskbar(false);
|
|
208
245
|
window.show();
|
|
209
246
|
if (hasIcon && iconPath)
|
|
210
247
|
window.setIcon(iconPath);
|
|
@@ -214,8 +251,11 @@ async function createWindow() {
|
|
|
214
251
|
return { action: 'deny' };
|
|
215
252
|
});
|
|
216
253
|
await window.loadURL(guiServer.url);
|
|
217
|
-
if (!window.isVisible())
|
|
254
|
+
if (!window.isVisible()) {
|
|
255
|
+
if (process.platform === 'win32')
|
|
256
|
+
window.setSkipTaskbar(false);
|
|
218
257
|
window.show();
|
|
258
|
+
}
|
|
219
259
|
}
|
|
220
260
|
app.whenReady().then(() => {
|
|
221
261
|
void createWindow().catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electronMain.js","sourceRoot":"","sources":["../../../src/gui/electronMain.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"electronMain.js","sourceRoot":"","sources":["../../../src/gui/electronMain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guiDesignClientScript.d.ts","sourceRoot":"","sources":["../../../src/gui/guiDesignClientScript.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"guiDesignClientScript.d.ts","sourceRoot":"","sources":["../../../src/gui/guiDesignClientScript.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,QAiepC,CAAC"}
|
|
@@ -281,6 +281,37 @@ function designIconButton(id, icon, title, action) {
|
|
|
281
281
|
control.addEventListener('click', action);
|
|
282
282
|
return control;
|
|
283
283
|
}
|
|
284
|
+
function currentProjectDocBlockStyle() {
|
|
285
|
+
const rich = el('projectDocRich');
|
|
286
|
+
const selection = window.getSelection();
|
|
287
|
+
if (!rich || !selection?.rangeCount || !rich.contains(selection.anchorNode)) return 'p';
|
|
288
|
+
const anchor = selection.anchorNode.nodeType === Node.ELEMENT_NODE ? selection.anchorNode : selection.anchorNode.parentElement;
|
|
289
|
+
const block = anchor?.closest?.('h1, h2, h3, h4, h5, h6');
|
|
290
|
+
return block && rich.contains(block) ? block.tagName.toLowerCase() : 'p';
|
|
291
|
+
}
|
|
292
|
+
function syncProjectDocHeadingSelect() {
|
|
293
|
+
const select = el('projectDocHeadingSelect');
|
|
294
|
+
if (select) select.value = currentProjectDocBlockStyle();
|
|
295
|
+
}
|
|
296
|
+
function createProjectDocHeadingSelect() {
|
|
297
|
+
const select = document.createElement('select'); select.id = 'projectDocHeadingSelect'; select.title = 'Text style'; select.setAttribute('aria-label', 'Text style');
|
|
298
|
+
for (const [value, label] of [['p', 'T'], ['h1', 'H1'], ['h2', 'H2'], ['h3', 'H3'], ['h4', 'H4'], ['h5', 'H5'], ['h6', 'H6']]) {
|
|
299
|
+
const option = document.createElement('option'); option.value = value; option.textContent = label; select.appendChild(option);
|
|
300
|
+
}
|
|
301
|
+
let range = null;
|
|
302
|
+
select.addEventListener('mousedown', () => {
|
|
303
|
+
syncProjectDocHeadingSelect();
|
|
304
|
+
const rich = el('projectDocRich'); const selection = window.getSelection();
|
|
305
|
+
range = rich && selection?.rangeCount && rich.contains(selection.anchorNode) ? selection.getRangeAt(0).cloneRange() : null;
|
|
306
|
+
});
|
|
307
|
+
select.addEventListener('change', () => {
|
|
308
|
+
const requestedStyle = select.value;
|
|
309
|
+
const rich = el('projectDocRich'); if (rich) rich.focus();
|
|
310
|
+
if (range) { const selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); }
|
|
311
|
+
runProjectDocFormat('heading', requestedStyle); range = null; syncProjectDocHeadingSelect();
|
|
312
|
+
});
|
|
313
|
+
return select;
|
|
314
|
+
}
|
|
284
315
|
function setDesignEntryMode(mode) {
|
|
285
316
|
const next = mode === 'html' ? 'html' : 'markdown';
|
|
286
317
|
if (state.designEntryMode === next) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guiDesignClientScript.js","sourceRoot":"","sources":["../../../src/gui/guiDesignClientScript.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"guiDesignClientScript.js","sourceRoot":"","sources":["../../../src/gui/guiDesignClientScript.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiejD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const usageRoutingConfigurationHeaderHtml = "\n <header class=\"region-header\">\n <div class=\"region-titles\">\n <h1>Configuration</h1>\n <p>Configure models, providers, and local API or CLI runtimes</p>\n </div>\n <div class=\"region-actions\" role=\"tablist\" aria-label=\"Configuration sections\">\n <button type=\"button\" id=\"configurationModelsTab\" class=\"pill-btn active\" role=\"tab\" aria-selected=\"true\">Models & runtimes</button>\n <button type=\"button\" id=\"configurationUsageTab\" class=\"pill-btn\" role=\"tab\" aria-selected=\"false\">Usage & Routing</button>\n <button type=\"button\" id=\"bridgeNewConfig\" class=\"pill-btn primary\">+ New config</button>\n </div>\n </header>\n";
|
|
2
|
+
export declare const usageRoutingConfigurationPageHtml = "\n <div class=\"region-body bridge-region-body configuration-usage-page\" id=\"configurationUsagePage\" hidden>\n <div id=\"configurationUsageSlot\"></div>\n </div>\n";
|
|
3
|
+
export declare const usageRoutingHtml = "\n <section class=\"settings-panel\" data-configuration-usage-panel>\n <h1>Usage & Routing</h1>\n <p class=\"muted\">One local control center for the token ledger, limits, managed API keys, Gateway Routes, and native CLI login status.</p>\n <div class=\"usage-routing-tabs\" role=\"tablist\" aria-label=\"Usage and routing pages\">\n <button type=\"button\" class=\"active\" data-usage-routing-page-tab=\"overview\">Overview</button>\n <button type=\"button\" data-usage-routing-page-tab=\"ledger\">Ledger</button>\n <button type=\"button\" data-usage-routing-page-tab=\"limits\">Limits</button>\n <button type=\"button\" data-usage-routing-page-tab=\"keys\">API Keys</button>\n <button type=\"button\" data-usage-routing-page-tab=\"routes\">Routes</button>\n </div>\n <div class=\"settings-group usage-filter-bar\">\n <label>Range<select id=\"usageRange\"><option value=\"7\">Last 7 days</option><option value=\"30\" selected>Last 30 days</option><option value=\"0\">All time</option></select></label>\n <label>Provider<input id=\"usageProviderFilter\" autocomplete=\"off\" placeholder=\"All providers\"></label>\n <label>Model<input id=\"usageModelFilter\" autocomplete=\"off\" placeholder=\"All models\"></label>\n <label>Status<select id=\"usageStatusFilter\"><option value=\"\">All statuses</option><option value=\"succeeded\">Succeeded</option><option value=\"failed\">Failed</option><option value=\"denied\">Denied</option><option value=\"cancelled\">Cancelled</option></select></label>\n <button type=\"button\" id=\"usageRoutingRefresh\" class=\"secondary-btn\">Refresh</button>\n </div>\n <p id=\"usageRoutingStatus\" class=\"muted\" role=\"status\">Open this tab to load local usage and routing data.</p>\n\n <div class=\"usage-routing-page\" data-usage-routing-page=\"overview\">\n <div class=\"usage-kpis\">\n <article><span>Requests</span><strong id=\"usageKpiRequests\">\u2014</strong></article>\n <article><span>Total tokens</span><strong id=\"usageKpiTokens\">\u2014</strong></article>\n <article><span>Cache read</span><strong id=\"usageKpiCache\">\u2014</strong></article>\n <article><span>Estimated cost</span><strong id=\"usageKpiCost\">\u2014</strong></article>\n </div>\n <div class=\"settings-group\">\n <div class=\"settings-group-head\"><div><h2>Token trend</h2><p class=\"muted\">Daily totals under the active filter.</p></div></div>\n <svg id=\"usageTrendChart\" class=\"usage-trend-chart\" viewBox=\"0 0 720 220\" role=\"img\" aria-label=\"No usage trend data\"><desc>Daily token usage trend.</desc></svg>\n <div id=\"usageTrendFallback\" class=\"sr-only\" aria-live=\"polite\"></div>\n </div>\n <div class=\"settings-group\"><h2>Provider breakdown</h2><div id=\"usageProviderBreakdown\" class=\"settings-card-list compact\"></div></div>\n </div>\n\n <div class=\"usage-routing-page\" data-usage-routing-page=\"ledger\" hidden>\n <div class=\"settings-group usage-table-wrap\">\n <table class=\"usage-table\"><thead><tr><th>Time</th><th>Source</th><th>Provider / route</th><th>Model</th><th>Input</th><th>Output</th><th>Cache</th><th>Cost</th><th>Status</th></tr></thead><tbody id=\"usageLedgerBody\"></tbody></table>\n <p id=\"usageLedgerEmpty\" class=\"muted\">No matching ledger entries.</p>\n <div class=\"settings-action-row\"><button type=\"button\" id=\"usageLedgerPrev\" class=\"secondary-btn\">Previous</button><span id=\"usageLedgerPage\" class=\"muted\">Page 1</span><button type=\"button\" id=\"usageLedgerNext\" class=\"secondary-btn\">Next</button></div>\n </div>\n </div>\n\n <div class=\"usage-routing-page\" data-usage-routing-page=\"limits\" hidden>\n <div class=\"settings-group\"><h2>Usage limits</h2><div id=\"usageBudgetList\" class=\"settings-card-list\"></div></div>\n <div class=\"settings-group\"><h2>Add or update a limit</h2><div class=\"usage-admin-grid\">\n <label>ID<input id=\"usageBudgetId\" autocomplete=\"off\" placeholder=\"budget.monthly\"></label>\n <label>Scope<select id=\"usageBudgetScope\"><option value=\"global\">Global</option><option value=\"provider\">Provider</option><option value=\"credential\">Credential</option><option value=\"route\">Route</option><option value=\"model\">Model</option></select></label>\n <label>Scope ID<input id=\"usageBudgetScopeId\" autocomplete=\"off\" placeholder=\"Not used for global\"></label>\n <label>Period<select id=\"usageBudgetPeriod\"><option value=\"daily\">Daily</option><option value=\"monthly\" selected>Monthly</option><option value=\"lifetime\">Lifetime</option></select></label>\n <label>Metric<select id=\"usageBudgetMetric\"><option value=\"totalTokens\">Tokens</option><option value=\"requests\">Requests</option><option value=\"costUsd\">USD cost</option></select></label>\n <label>Limit<input id=\"usageBudgetLimit\" type=\"number\" min=\"0\" step=\"any\" value=\"1000000\"></label>\n <label>Action<select id=\"usageBudgetAction\"><option value=\"warn\">Warn</option><option value=\"deny\">Deny</option><option value=\"fallbackRoute\">Fallback route</option></select></label>\n <label>Fallback route ID<input id=\"usageBudgetFallback\" autocomplete=\"off\"></label>\n </div><div class=\"settings-action-row\"><button type=\"button\" id=\"usageBudgetSave\" class=\"primary\">Save limit</button></div></div>\n </div>\n\n <div class=\"usage-routing-page\" data-usage-routing-page=\"keys\" hidden>\n <div class=\"settings-group\"><h2>Managed API credentials</h2><p class=\"muted\">Secrets are write-only and encrypted by the desktop host. Native CLI OAuth/session data is never imported here.</p><div id=\"usageCredentialList\" class=\"settings-card-list\"></div></div>\n <div class=\"settings-group\"><h2>Add or rotate a credential</h2><div class=\"usage-admin-grid\">\n <label>ID<input id=\"usageCredentialId\" autocomplete=\"off\" placeholder=\"credential.provider.primary\"></label>\n <label>Provider ID<input id=\"usageCredentialProvider\" autocomplete=\"off\" placeholder=\"provider-id\"></label>\n <label>Label<input id=\"usageCredentialLabel\" autocomplete=\"off\" placeholder=\"Primary\"></label>\n <label>Priority<input id=\"usageCredentialPriority\" type=\"number\" min=\"0\" value=\"0\"></label>\n <label>Weight<input id=\"usageCredentialWeight\" type=\"number\" min=\"1\" value=\"1\"></label>\n <label>New secret<input id=\"usageCredentialSecret\" type=\"password\" autocomplete=\"new-password\" placeholder=\"Leave blank to keep existing\"></label>\n </div><div class=\"settings-action-row\"><button type=\"button\" id=\"usageCredentialSave\" class=\"primary\">Save credential</button></div></div>\n <div class=\"settings-group\"><h2>Migration</h2><p class=\"muted\">Preview first. Bridge API keys are copied into write-only storage only on Apply; native CLI OAuth/session secrets are never read. KeywayExportV1 files contain metadata and usage, not secrets.</p>\n <div class=\"settings-action-row\"><button type=\"button\" id=\"usageBridgeMigrationPreview\" class=\"secondary-btn\">Preview bridge configs</button><button type=\"button\" id=\"usageBridgeMigrationApply\" class=\"secondary-btn\">Apply ready configs</button></div>\n <label class=\"inline-field\">KeywayExportV1 file<input id=\"usagePortableMigrationFile\" autocomplete=\"off\" placeholder=\"C:\\path\\to\\keyway-export-v1.json\"></label>\n <div class=\"settings-action-row\"><button type=\"button\" id=\"usagePortableMigrationPreview\" class=\"secondary-btn\">Preview file</button><button type=\"button\" id=\"usagePortableMigrationApply\" class=\"secondary-btn\">Import transactionally</button></div>\n </div>\n </div>\n\n <div class=\"usage-routing-page\" data-usage-routing-page=\"routes\" hidden>\n <div class=\"settings-group\"><h2>Authenticated loopback gateway</h2><p id=\"usageGatewayStatus\" class=\"muted\">Stopped. Embedded in-process routing remains available.</p><div class=\"settings-action-row\"><button type=\"button\" id=\"usageGatewayStart\" class=\"secondary-btn\">Start</button><button type=\"button\" id=\"usageGatewayStop\" class=\"secondary-btn\">Stop</button></div><p class=\"muted\">Binds to 127.0.0.1 only. A client key is shown once after startup and is never returned by status.</p></div>\n <div class=\"settings-group\"><h2>Execution targets</h2><div id=\"usageTargetList\" class=\"settings-card-list\"></div></div>\n <div class=\"settings-group\"><h2>Add or update a target</h2><div class=\"usage-admin-grid\">\n <label>ID<input id=\"usageTargetId\" autocomplete=\"off\" placeholder=\"target.ark\"></label>\n <label>Kind<select id=\"usageTargetKind\"><option value=\"managed-api\">Managed API</option><option value=\"native-cli\">Native CLI login</option></select></label>\n <label>Provider / runtime<input id=\"usageTargetProvider\" autocomplete=\"off\" placeholder=\"ark or claude\"></label>\n <label>Protocol<select id=\"usageTargetProtocol\"><option value=\"openai\">OpenAI-compatible</option><option value=\"anthropic\">Anthropic-compatible</option></select></label>\n <label>Base URL / profile<input id=\"usageTargetLocation\" autocomplete=\"off\" placeholder=\"https://api.example.com/v1\"></label>\n </div><div class=\"settings-action-row\"><button type=\"button\" id=\"usageTargetSave\" class=\"primary\">Save target</button></div></div>\n <div class=\"settings-group\"><h2>Gateway Routes</h2><div id=\"usageRouteList\" class=\"settings-card-list\"></div></div>\n <div class=\"settings-group\"><h2>Add or update a route</h2><div class=\"usage-admin-grid\">\n <label>ID<input id=\"usageRouteId\" autocomplete=\"off\" placeholder=\"route.chat\"></label>\n <label>Alias<input id=\"usageRouteAlias\" autocomplete=\"off\" placeholder=\"chat-default\"></label>\n <label>Mode<select id=\"usageRouteMode\"><option value=\"direct\">Direct</option><option value=\"priority-failover\">Priority failover</option></select></label>\n <label class=\"usage-wide\">Candidates<textarea id=\"usageRouteCandidates\" rows=\"4\" placeholder=\"target.ark | glm-5.2 | 0 target.backup | glm-5.3 | 1\"></textarea><small>One per line: target ID | upstream model | priority</small></label>\n </div><div class=\"settings-action-row\"><button type=\"button\" id=\"usageRouteSave\" class=\"primary\">Save route</button></div></div>\n </div>\n </section>\n";
|
|
4
|
+
export declare const usageRoutingStyles = "\n.usage-routing-tabs { display: flex; gap: 4px; margin: 18px 0 0; padding-bottom: 10px; overflow-x: auto; border-bottom: 1px solid var(--border); }\n.configuration-usage-page { justify-content: center; }\n.configuration-usage-page[hidden], #configurationModelsPage[hidden] { display: none !important; }\n.configuration-usage-page .settings-panel { display: block !important; width: min(960px, 100%); max-width: 960px; }\n.configuration-usage-page .settings-panel > h1 { margin-top: 2px; }\n.usage-routing-tabs button { flex: 0 0 auto; border: 0; border-radius: 8px; min-height: 32px; padding: 0 12px; background: transparent; color: var(--text-2); cursor: pointer; }\n.usage-routing-tabs button.active { background: color-mix(in srgb, var(--text-1) 10%, transparent); color: var(--text-1); font-weight: 600; }\n.usage-routing-page[hidden] { display: none; }\n.usage-filter-bar { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) auto; align-items: end; gap: 10px; }\n.usage-filter-bar label, .usage-admin-grid label { display: grid; gap: 5px; color: var(--text-2); font-size: 11.5px; }\n.usage-filter-bar input, .usage-filter-bar select, .usage-admin-grid input, .usage-admin-grid select, .usage-admin-grid textarea {\n width: 100%; min-width: 0; min-height: 34px; border: 1px solid var(--border-hover); border-radius: 8px; padding: 6px 9px; background: var(--bg-surface); color: var(--text-1); font: inherit;\n}\n.usage-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; padding-top: 18px; }\n.usage-kpis article { min-width: 0; padding: 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-surface); }\n.usage-kpis span { display: block; color: var(--text-2); font-size: 11.5px; }\n.usage-kpis strong { display: block; margin-top: 8px; overflow-wrap: anywhere; font-size: 20px; font-variant-numeric: tabular-nums; }\n.usage-trend-chart { width: 100%; height: 220px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-surface); }\n.usage-trend-chart .grid { stroke: var(--border); stroke-width: 1; }\n.usage-trend-chart .area { fill: color-mix(in srgb, var(--brand) 14%, transparent); }\n.usage-trend-chart .line { fill: none; stroke: var(--brand); stroke-width: 2.5; vector-effect: non-scaling-stroke; }\n.usage-table-wrap { overflow-x: auto; }\n.usage-table { width: 100%; min-width: 860px; border-collapse: collapse; font-size: 11.5px; }\n.usage-table th, .usage-table td { padding: 9px 8px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; }\n.usage-table th { color: var(--text-2); font-weight: 600; }\n.usage-table td { font-variant-numeric: tabular-nums; }\n.usage-admin-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }\n.usage-admin-grid .usage-wide { grid-column: 1 / -1; }\n.usage-admin-grid textarea { resize: vertical; min-height: 88px; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }\n.usage-admin-card { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px 14px; align-items: center; }\n.usage-admin-card small { overflow-wrap: anywhere; }\n.usage-admin-actions { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }\n.usage-admin-actions button { min-height: 28px; padding: 0 8px; border: 1px solid var(--border); border-radius: 7px; background: var(--bg-surface); color: var(--text-1); cursor: pointer; }\n.usage-admin-actions button.danger { color: var(--err); }\n.sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0,0,0,0) !important; white-space: nowrap !important; border: 0 !important; }\n@media (max-width: 760px) {\n .usage-filter-bar { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .usage-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .usage-admin-grid { grid-template-columns: 1fr; }\n .usage-admin-grid .usage-wide { grid-column: auto; }\n}\n";
|
|
5
|
+
export declare const usageRoutingClient = "\nlet usageRoutingActivePage = 'overview';\nlet usageLedgerOffset = 0;\nconst USAGE_LEDGER_PAGE_SIZE = 50;\n\nfunction compactUsageNumber(value) {\n const number = Number(value || 0);\n return new Intl.NumberFormat(undefined, { notation: number >= 10000 ? 'compact' : 'standard', maximumFractionDigits: 1 }).format(number);\n}\n\nfunction usageFilterSearch(includePage) {\n const search = new URLSearchParams();\n const days = Number(el('usageRange')?.value || 0);\n if (days > 0) search.set('from', new Date(Date.now() - days * 86400000).toISOString());\n const provider = el('usageProviderFilter')?.value.trim();\n const model = el('usageModelFilter')?.value.trim();\n const status = el('usageStatusFilter')?.value;\n if (provider) search.set('providerId', provider);\n if (model) search.set('model', model);\n if (status) search.set('status', status);\n if (includePage) {\n search.set('limit', String(USAGE_LEDGER_PAGE_SIZE));\n search.set('offset', String(usageLedgerOffset));\n }\n return search.toString();\n}\n\nasync function usageRoutingJson(path, options) {\n const response = await api(path, options || {});\n const payload = await response.json().catch(() => ({}));\n if (!response.ok) throw new Error(payload.error || 'Usage & Routing is unavailable.');\n return payload;\n}\n\nfunction renderUsageTrend(points) {\n const svg = el('usageTrendChart');\n const fallback = el('usageTrendFallback');\n if (!svg) return;\n const ns = 'http://www.w3.org/2000/svg';\n const desc = document.createElementNS(ns, 'desc');\n desc.textContent = 'Daily total token usage under the active filters.';\n svg.replaceChildren(desc);\n if (!Array.isArray(points) || points.length === 0) {\n svg.setAttribute('aria-label', 'No token trend data for the active filter');\n if (fallback) fallback.textContent = 'No token trend data for the active filter.';\n return;\n }\n const width = 720;\n const height = 220;\n const pad = 28;\n const max = Math.max(1, ...points.map(point => Number(point.tokens || 0)));\n for (let index = 0; index < 5; index += 1) {\n const y = pad + ((height - pad * 2) * index / 4);\n const line = document.createElementNS(ns, 'line');\n line.setAttribute('x1', String(pad)); line.setAttribute('x2', String(width - pad));\n line.setAttribute('y1', String(y)); line.setAttribute('y2', String(y)); line.setAttribute('class', 'grid');\n svg.appendChild(line);\n }\n const coordinates = points.map((point, index) => {\n const x = points.length === 1 ? width / 2 : pad + ((width - pad * 2) * index / (points.length - 1));\n const y = height - pad - ((height - pad * 2) * Number(point.tokens || 0) / max);\n return [x, y];\n });\n const linePath = coordinates.map((point, index) => (index ? 'L' : 'M') + point[0] + ' ' + point[1]).join(' ');\n const area = document.createElementNS(ns, 'path');\n area.setAttribute('d', linePath + ' L ' + coordinates.at(-1)[0] + ' ' + (height - pad) + ' L ' + coordinates[0][0] + ' ' + (height - pad) + ' Z');\n area.setAttribute('class', 'area');\n const line = document.createElementNS(ns, 'path');\n line.setAttribute('d', linePath); line.setAttribute('class', 'line');\n svg.append(area, line);\n const summary = points.map(point => point.date + ': ' + compactUsageNumber(point.tokens) + ' tokens').join('; ');\n svg.setAttribute('aria-label', summary);\n if (fallback) fallback.textContent = summary;\n}\n\nfunction renderUsageOverview(payload) {\n const summary = payload.summary || {};\n el('usageKpiRequests').textContent = compactUsageNumber(summary.requests);\n el('usageKpiTokens').textContent = compactUsageNumber(summary.totalTokens);\n el('usageKpiCache').textContent = compactUsageNumber(summary.cacheReadTokens);\n el('usageKpiCost').textContent = '$' + Number(summary.costUsd || 0).toFixed(4);\n renderUsageTrend(payload.trend || []);\n const list = el('usageProviderBreakdown');\n list.replaceChildren();\n for (const item of payload.byProvider || []) {\n const card = document.createElement('div');\n card.className = 'settings-help-row';\n const text = document.createElement('span');\n const strong = document.createElement('strong');\n strong.textContent = item.key;\n const small = document.createElement('small');\n small.textContent = compactUsageNumber(item.tokens) + ' tokens \u00B7 ' + compactUsageNumber(item.requests) + ' requests \u00B7 $' + Number(item.costUsd || 0).toFixed(4);\n text.append(strong, small); card.append(text); list.append(card);\n }\n if (!list.childElementCount) list.textContent = 'No provider-attributed usage.';\n}\n\nfunction renderUsageLedger(payload) {\n const body = el('usageLedgerBody');\n body.replaceChildren();\n for (const event of payload.events || []) {\n const row = document.createElement('tr');\n const values = [\n new Date(event.timestamp).toLocaleString(),\n event.source,\n [event.providerId, event.routeAlias || event.routeId].filter(Boolean).join(' / ') || '\u2014',\n event.resolvedModel || event.requestedModel,\n compactUsageNumber(event.usage?.inputTokens),\n compactUsageNumber(event.usage?.outputTokens),\n compactUsageNumber((event.usage?.cacheReadTokens || 0) + (event.usage?.cacheWriteTokens || 0)),\n event.usage?.costUsd === undefined ? 'Unpriced' : '$' + Number(event.usage.costUsd).toFixed(4),\n event.status,\n ];\n for (const value of values) { const cell = document.createElement('td'); cell.textContent = String(value ?? ''); row.append(cell); }\n body.append(row);\n }\n el('usageLedgerEmpty').hidden = body.childElementCount > 0;\n el('usageLedgerPage').textContent = 'Page ' + (Math.floor(usageLedgerOffset / USAGE_LEDGER_PAGE_SIZE) + 1);\n el('usageLedgerPrev').disabled = usageLedgerOffset === 0;\n el('usageLedgerNext').disabled = (payload.events || []).length < USAGE_LEDGER_PAGE_SIZE;\n}\n\nfunction usageAdminCard(title, detail, actions) {\n const card = document.createElement('div');\n card.className = 'settings-help-row usage-admin-card';\n const text = document.createElement('span');\n const strong = document.createElement('strong'); strong.textContent = title;\n const small = document.createElement('small'); small.textContent = detail;\n text.append(strong, small);\n const actionBox = document.createElement('span'); actionBox.className = 'usage-admin-actions';\n for (const action of actions) {\n const button = document.createElement('button'); button.type = 'button'; button.textContent = action.label;\n if (action.danger) button.classList.add('danger');\n button.addEventListener('click', () => {\n Promise.resolve().then(action.run).catch(error => { el('usageRoutingStatus').textContent = error.message || String(error); });\n });\n actionBox.append(button);\n }\n card.append(text, actionBox);\n return card;\n}\n\nasync function usageMutation(path, method, body) {\n const status = el('usageRoutingStatus');\n status.textContent = 'Saving...';\n await usageRoutingJson(path, {\n method,\n headers: { 'content-type': 'application/json' },\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n status.textContent = 'Saved locally.';\n await refreshUsageRouting();\n}\n\nfunction renderUsageCatalog(catalog) {\n const gateway = catalog.gateway || {};\n const gatewayStatus = el('usageGatewayStatus');\n if (gatewayStatus) gatewayStatus.textContent = gateway.running\n ? 'Running at ' + String(gateway.url || 'unknown') + ' \u00B7 ' + String(gateway.authentication || 'client-key')\n : 'Stopped. Embedded in-process routing remains available.';\n const budgets = el('usageBudgetList'); budgets.replaceChildren();\n for (const budget of catalog.budgets || []) {\n const scope = budget.scope?.kind === 'global' ? 'global' : budget.scope?.kind + ':' + budget.scope?.id;\n budgets.append(usageAdminCard(budget.id, scope + ' \u00B7 ' + budget.period + ' \u00B7 ' + budget.metric + ' ' + budget.limit + ' \u00B7 ' + budget.action + (budget.enabled ? '' : ' \u00B7 disabled'), [\n { label: 'Delete', danger: true, run: () => void usageMutation('/api/usage-routing/budgets/' + encodeURIComponent(budget.id), 'DELETE') },\n ]));\n }\n if (!budgets.childElementCount) budgets.textContent = 'No usage limits configured.';\n\n const credentials = el('usageCredentialList'); credentials.replaceChildren();\n for (const credential of catalog.credentials || []) {\n const health = credential.health?.state || (credential.secretConfigured ? 'configured' : 'missing');\n credentials.append(usageAdminCard(credential.label || credential.id, credential.providerId + ' \u00B7 priority ' + credential.priority + ' \u00B7 ' + health, [\n { label: 'Edit', run: () => { el('usageCredentialId').value = credential.id; el('usageCredentialProvider').value = credential.providerId; el('usageCredentialLabel').value = credential.label || ''; el('usageCredentialPriority').value = String(credential.priority); el('usageCredentialWeight').value = String(credential.weight); } },\n { label: 'Test', run: async () => { const result = await usageRoutingJson('/api/usage-routing/credentials/' + encodeURIComponent(credential.id) + '/test', { method: 'POST' }); el('usageRoutingStatus').textContent = credential.id + ': ' + result.state; await refreshUsageRouting(); } },\n { label: 'Delete', danger: true, run: () => void usageMutation('/api/usage-routing/credentials/' + encodeURIComponent(credential.id), 'DELETE') },\n ]));\n }\n if (!credentials.childElementCount) credentials.textContent = 'No managed API credentials. Native CLI logins appear under targets.';\n\n const targets = el('usageTargetList'); targets.replaceChildren();\n for (const target of catalog.targets || []) {\n const detail = target.kind === 'managed-api'\n ? target.providerId + ' \u00B7 ' + target.protocol + ' \u00B7 ' + target.baseUrl\n : target.runtime + ' \u00B7 native login' + (target.profileName ? ' \u00B7 ' + target.profileName : '');\n targets.append(usageAdminCard(target.id, detail, [\n { label: 'Edit', run: () => { el('usageTargetId').value = target.id; el('usageTargetKind').value = target.kind; el('usageTargetProvider').value = target.kind === 'managed-api' ? target.providerId : target.runtime; el('usageTargetProtocol').value = target.protocol || 'openai'; el('usageTargetLocation').value = target.kind === 'managed-api' ? target.baseUrl : (target.profileName || ''); } },\n { label: 'Test', run: async () => { const result = await usageRoutingJson('/api/usage-routing/targets/' + encodeURIComponent(target.id) + '/test', { method: 'POST' }); el('usageRoutingStatus').textContent = target.id + ': ' + (result.state || 'configured'); } },\n { label: 'Delete', danger: true, run: () => void usageMutation('/api/usage-routing/targets/' + encodeURIComponent(target.id), 'DELETE') },\n ]));\n }\n if (!targets.childElementCount) targets.textContent = 'No execution targets configured.';\n\n const routes = el('usageRouteList'); routes.replaceChildren();\n for (const route of catalog.routes || []) {\n const candidates = (route.candidates || []).map(candidate => candidate.targetId + ' \u2192 ' + candidate.upstreamModel + ' (p' + candidate.priority + ')').join(', ');\n routes.append(usageAdminCard(route.alias, route.mode + ' \u00B7 ' + candidates, [\n { label: 'Use in Hadamard', run: async () => { const selected = await usageRoutingJson('/api/usage-routing/routes/' + encodeURIComponent(route.alias) + '/activate', { method: 'POST' }); el('usageRoutingStatus').textContent = 'Hadamard now uses ' + selected.routeAlias + ' (' + selected.model + ').'; } },\n { label: 'Edit', run: () => { el('usageRouteId').value = route.id; el('usageRouteAlias').value = route.alias; el('usageRouteMode').value = route.mode; el('usageRouteCandidates').value = (route.candidates || []).map(candidate => candidate.targetId + ' | ' + candidate.upstreamModel + ' | ' + candidate.priority).join('\\n'); } },\n { label: 'Delete', danger: true, run: () => void usageMutation('/api/usage-routing/routes/' + encodeURIComponent(route.id), 'DELETE') },\n ]));\n }\n if (!routes.childElementCount) routes.textContent = 'No Gateway Routes configured.';\n}\n\nasync function refreshUsageRouting() {\n const status = el('usageRoutingStatus');\n if (!status) return;\n status.textContent = 'Loading local usage and routing data...';\n try {\n const query = usageFilterSearch(false);\n const tasks = [usageRoutingJson('/api/usage-routing/catalog')];\n if (usageRoutingActivePage === 'overview') tasks.push(usageRoutingJson('/api/usage-routing/overview?' + query));\n if (usageRoutingActivePage === 'ledger') tasks.push(usageRoutingJson('/api/usage-routing/ledger?' + usageFilterSearch(true)));\n const results = await Promise.all(tasks);\n renderUsageCatalog(results[0]);\n if (usageRoutingActivePage === 'overview') renderUsageOverview(results[1]);\n if (usageRoutingActivePage === 'ledger') renderUsageLedger(results[1]);\n status.textContent = 'Local data refreshed. Secrets and prompts are excluded from this view.';\n } catch (error) {\n status.textContent = error.message || String(error);\n }\n}\n\nfunction showUsageRoutingPage(page) {\n usageRoutingActivePage = ['overview', 'ledger', 'limits', 'keys', 'routes'].includes(page) ? page : 'overview';\n document.querySelectorAll('[data-usage-routing-page-tab]').forEach(button => button.classList.toggle('active', button.dataset.usageRoutingPageTab === usageRoutingActivePage));\n document.querySelectorAll('[data-usage-routing-page]').forEach(panel => { panel.hidden = panel.dataset.usageRoutingPage !== usageRoutingActivePage; });\n void refreshUsageRouting();\n}\n\nfunction showConfigurationPage(page) {\n const usage = page === 'usage';\n el('configurationModelsPage').hidden = usage;\n el('configurationUsagePage').hidden = !usage;\n el('bridgeNewConfig').hidden = usage;\n el('configurationModelsTab').classList.toggle('active', !usage);\n el('configurationUsageTab').classList.toggle('active', usage);\n el('configurationModelsTab').setAttribute('aria-selected', usage ? 'false' : 'true');\n el('configurationUsageTab').setAttribute('aria-selected', usage ? 'true' : 'false');\n if (usage) void refreshUsageRouting();\n}\n\n";
|
|
6
|
+
export declare const usageRoutingBindings = "\nconst usageRoutingPanel = document.querySelector('[data-configuration-usage-panel]');\nif (usageRoutingPanel && el('configurationUsageSlot')) el('configurationUsageSlot').appendChild(usageRoutingPanel);\nel('configurationModelsTab')?.addEventListener('click', () => showConfigurationPage('models'));\nel('configurationUsageTab')?.addEventListener('click', () => showConfigurationPage('usage'));\ndocument.querySelectorAll('[data-usage-routing-page-tab]').forEach(button => button.addEventListener('click', () => showUsageRoutingPage(button.dataset.usageRoutingPageTab)));\nel('usageRoutingRefresh')?.addEventListener('click', () => { usageLedgerOffset = 0; void refreshUsageRouting(); });\nfor (const id of ['usageRange', 'usageProviderFilter', 'usageModelFilter', 'usageStatusFilter']) {\n el(id)?.addEventListener('change', () => { usageLedgerOffset = 0; void refreshUsageRouting(); });\n}\nel('usageLedgerPrev')?.addEventListener('click', () => { usageLedgerOffset = Math.max(0, usageLedgerOffset - USAGE_LEDGER_PAGE_SIZE); void refreshUsageRouting(); });\nel('usageLedgerNext')?.addEventListener('click', () => { usageLedgerOffset += USAGE_LEDGER_PAGE_SIZE; void refreshUsageRouting(); });\nel('usageBudgetSave')?.addEventListener('click', () => {\n const scopeKind = el('usageBudgetScope').value;\n void usageMutation('/api/usage-routing/budgets', 'PUT', {\n id: el('usageBudgetId').value.trim(),\n scopeKind,\n ...(scopeKind === 'global' ? {} : { scopeId: el('usageBudgetScopeId').value.trim() }),\n period: el('usageBudgetPeriod').value,\n metric: el('usageBudgetMetric').value,\n limit: Number(el('usageBudgetLimit').value),\n action: el('usageBudgetAction').value,\n fallbackRouteId: el('usageBudgetFallback').value.trim(),\n enabled: true,\n }).catch(error => { el('usageRoutingStatus').textContent = error.message || String(error); });\n});\nel('usageCredentialSave')?.addEventListener('click', () => {\n const secretInput = el('usageCredentialSecret');\n const secret = secretInput.value;\n secretInput.value = '';\n void usageMutation('/api/usage-routing/credentials', 'PUT', {\n id: el('usageCredentialId').value.trim(),\n providerId: el('usageCredentialProvider').value.trim(),\n label: el('usageCredentialLabel').value.trim(),\n priority: Number(el('usageCredentialPriority').value),\n weight: Number(el('usageCredentialWeight').value),\n ...(secret ? { secret } : {}),\n enabled: true,\n }).catch(error => { el('usageRoutingStatus').textContent = error.message || String(error); });\n});\nel('usageBridgeMigrationPreview')?.addEventListener('click', async () => {\n try {\n const result = await usageRoutingJson('/api/usage-routing/migration/bridge');\n el('usageRoutingStatus').textContent = 'Bridge migration preview: ' + result.ready + ' ready, ' + result.blocked + ' blocked. Native OAuth/session secrets read: no.';\n } catch (error) { el('usageRoutingStatus').textContent = error.message || String(error); }\n});\nel('usageBridgeMigrationApply')?.addEventListener('click', async () => {\n try {\n const result = await usageRoutingJson('/api/usage-routing/migration/bridge', { method: 'POST' });\n await refreshUsageRouting();\n el('usageRoutingStatus').textContent = 'Bridge migration: ' + result.imported + ' imported, ' + result.skipped + ' skipped. Legacy configs remain unchanged.';\n } catch (error) { el('usageRoutingStatus').textContent = error.message || String(error); }\n});\nfor (const action of ['Preview', 'Apply']) {\n el('usagePortableMigration' + action)?.addEventListener('click', async () => {\n const filePath = el('usagePortableMigrationFile').value.trim();\n try {\n const result = await usageRoutingJson('/api/usage-routing/migration/portable/' + (action === 'Preview' ? 'preview' : 'import'), {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ filePath }),\n });\n if (action === 'Apply') await refreshUsageRouting();\n el('usageRoutingStatus').textContent = (action === 'Preview' ? 'Import preview: ' : 'Import complete: ') + JSON.stringify(result);\n } catch (error) { el('usageRoutingStatus').textContent = error.message || String(error); }\n });\n}\nel('usageGatewayStart')?.addEventListener('click', async () => {\n try {\n const result = await usageRoutingJson('/api/usage-routing/gateway/start', {\n method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ port: 0 }),\n });\n await refreshUsageRouting();\n el('usageRoutingStatus').textContent = result.clientKey\n ? 'Gateway started at ' + result.url + '. Client key (shown once): ' + result.clientKey\n : 'Gateway is already running at ' + result.url + '.';\n } catch (error) { el('usageRoutingStatus').textContent = error.message || String(error); }\n});\nel('usageGatewayStop')?.addEventListener('click', async () => {\n try {\n await usageRoutingJson('/api/usage-routing/gateway/stop', { method: 'POST' });\n await refreshUsageRouting();\n el('usageRoutingStatus').textContent = 'Loopback gateway stopped.';\n } catch (error) { el('usageRoutingStatus').textContent = error.message || String(error); }\n});\nel('usageTargetSave')?.addEventListener('click', () => {\n const kind = el('usageTargetKind').value;\n const provider = el('usageTargetProvider').value.trim();\n const location = el('usageTargetLocation').value.trim();\n const body = kind === 'managed-api'\n ? { id: el('usageTargetId').value.trim(), kind, providerId: provider, protocol: el('usageTargetProtocol').value, baseUrl: location, enabled: true }\n : { id: el('usageTargetId').value.trim(), kind, runtime: provider, ...(location ? { profileName: location } : {}), enabled: true };\n void usageMutation('/api/usage-routing/targets', 'PUT', body).catch(error => { el('usageRoutingStatus').textContent = error.message || String(error); });\n});\nel('usageRouteSave')?.addEventListener('click', () => {\n const routeId = el('usageRouteId').value.trim();\n const candidates = el('usageRouteCandidates').value.split(/\\r?\\n/u).map(line => line.trim()).filter(Boolean).map((line, index) => {\n const parts = line.split('|').map(part => part.trim());\n return { id: routeId + '.candidate.' + (index + 1), targetId: parts[0], upstreamModel: parts[1], priority: Number(parts[2] || index), weight: 1, enabled: true };\n });\n void usageMutation('/api/usage-routing/routes', 'PUT', {\n id: routeId,\n alias: el('usageRouteAlias').value.trim(),\n mode: el('usageRouteMode').value,\n candidates,\n enabled: true,\n }).catch(error => { el('usageRoutingStatus').textContent = error.message || String(error); });\n});\n";
|
|
7
|
+
//# sourceMappingURL=guiUsageRoutingAssets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiUsageRoutingAssets.d.ts","sourceRoot":"","sources":["../../../src/gui/guiUsageRoutingAssets.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mCAAmC,mvBAY/C,CAAC;AAEF,eAAO,MAAM,iCAAiC,4LAI7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,ivVA6F5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,48HA0C9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,sjcAmP9B,CAAC;AAEF,eAAO,MAAM,oBAAoB,+mNA4GhC,CAAC"}
|