auramaxx 0.0.1
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/LICENSE +26 -0
- package/README.md +77 -0
- package/apps/desktop-electron/main.js +428 -0
- package/bin/auramaxx.js +1063 -0
- package/docs/ADAPTERS.md +466 -0
- package/docs/AGENT_SETUP.md +159 -0
- package/docs/API.md +127 -0
- package/docs/APPS.md +199 -0
- package/docs/ARCHITECTURE.md +235 -0
- package/docs/AUTH.md +318 -0
- package/docs/BEST-PRACTICES.md +82 -0
- package/docs/CLI.md +141 -0
- package/docs/DESKTOP_ELECTRON.md +26 -0
- package/docs/DEVELOPING-APPS.md +453 -0
- package/docs/MCP.md +122 -0
- package/docs/PACKAGING_POLICY.md +19 -0
- package/docs/PERMISSION.md +137 -0
- package/docs/PROTOCOL.md +142 -0
- package/docs/README.md +50 -0
- package/docs/SKILLS.md +132 -0
- package/docs/TROUBLESHOOTING.md +376 -0
- package/docs/WORKSPACE.md +673 -0
- package/docs/agent-auth.md +14 -0
- package/docs/api/authentication.md +79 -0
- package/docs/api/secrets/api-keys.md +28 -0
- package/docs/api/secrets/credentials.md +80 -0
- package/docs/api/secrets/sharing.md +48 -0
- package/docs/api/system.md +41 -0
- package/docs/api/wallets/apps-strategies.md +66 -0
- package/docs/api/wallets/core.md +46 -0
- package/docs/api/wallets/data-portfolio.md +42 -0
- package/docs/aura-file.md +48 -0
- package/docs/core-concepts/FEATURES.md +114 -0
- package/docs/credentials.md +120 -0
- package/docs/external/HOW_TO_AURAMAXX/GETTING_SECRETS.md +33 -0
- package/docs/external/HOW_TO_AURAMAXX/README.md +45 -0
- package/docs/external/getting-started.md +10 -0
- package/docs/external/overview.md +19 -0
- package/docs/external/persona-paths.md +7 -0
- package/docs/external/share-secret.md +76 -0
- package/docs/external/why-aura.md +7 -0
- package/docs/security.md +227 -0
- package/docs/templates/RELEASE_NOTES_TEMPLATE.md +22 -0
- package/docs/wallet/AI.md +508 -0
- package/docs/wallet/DEVELOPING-STRATEGIES.md +713 -0
- package/docs/wallet/README.md +47 -0
- package/docs/wallet/STRATEGY.md +89 -0
- package/next.config.ts +28 -0
- package/package.json +167 -0
- package/postcss.config.mjs +8 -0
- package/prisma/migrations/20260214170000_baseline/migration.sql +511 -0
- package/prisma/migrations/20260216214537_add_passkey_model/migration.sql +18 -0
- package/prisma/migrations/20260217150500_add_credential_access_audit/migration.sql +31 -0
- package/prisma/migrations/20260222090000_update_admin_ttl_default/migration.sql +10 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +447 -0
- package/public/logo.webp +0 -0
- package/scripts/add-app.js +245 -0
- package/server/abi/SwapHelper.json +438 -0
- package/server/cli/approval.ts +447 -0
- package/server/cli/commands/actions.ts +474 -0
- package/server/cli/commands/api.ts +220 -0
- package/server/cli/commands/apikey.ts +277 -0
- package/server/cli/commands/app.ts +204 -0
- package/server/cli/commands/auth.ts +464 -0
- package/server/cli/commands/cron.ts +24 -0
- package/server/cli/commands/diary.ts +274 -0
- package/server/cli/commands/doctor.ts +1247 -0
- package/server/cli/commands/env.ts +476 -0
- package/server/cli/commands/experimental.ts +69 -0
- package/server/cli/commands/init.ts +798 -0
- package/server/cli/commands/lock.ts +157 -0
- package/server/cli/commands/mcp.ts +285 -0
- package/server/cli/commands/quickhack.ts +86 -0
- package/server/cli/commands/release-check.ts +231 -0
- package/server/cli/commands/restore.ts +314 -0
- package/server/cli/commands/service.ts +320 -0
- package/server/cli/commands/shell-hook.ts +512 -0
- package/server/cli/commands/skill.ts +216 -0
- package/server/cli/commands/start.ts +139 -0
- package/server/cli/commands/status.ts +59 -0
- package/server/cli/commands/stop.ts +36 -0
- package/server/cli/commands/token.ts +180 -0
- package/server/cli/commands/unlock.ts +50 -0
- package/server/cli/commands/vault.ts +1323 -0
- package/server/cli/commands/wallet.ts +209 -0
- package/server/cli/index.ts +280 -0
- package/server/cli/lib/approval-poll.ts +94 -0
- package/server/cli/lib/aura-parser.ts +64 -0
- package/server/cli/lib/credential-create.ts +74 -0
- package/server/cli/lib/credential-resolve.ts +280 -0
- package/server/cli/lib/dotenv-migrate.ts +116 -0
- package/server/cli/lib/dotenv-parser.ts +146 -0
- package/server/cli/lib/escalation.ts +57 -0
- package/server/cli/lib/http.ts +91 -0
- package/server/cli/lib/init-steps.ts +76 -0
- package/server/cli/lib/local-agent-trust.ts +45 -0
- package/server/cli/lib/lock-unlock-helper.ts +71 -0
- package/server/cli/lib/process.ts +162 -0
- package/server/cli/lib/prompt.ts +294 -0
- package/server/cli/lib/theme.ts +240 -0
- package/server/cli/socket.ts +579 -0
- package/server/cli/transport-client.ts +50 -0
- package/server/cron/index.ts +137 -0
- package/server/cron/job.ts +31 -0
- package/server/cron/jobs/balance-sync.ts +436 -0
- package/server/cron/jobs/incoming-scan.ts +506 -0
- package/server/cron/jobs/native-price.ts +70 -0
- package/server/cron/jobs/orphan-cleanup.ts +40 -0
- package/server/cron/jobs/strategy-runner.ts +175 -0
- package/server/cron/scheduler.ts +125 -0
- package/server/index.ts +420 -0
- package/server/lib/adapters/factory.ts +119 -0
- package/server/lib/adapters/index.ts +19 -0
- package/server/lib/adapters/router.ts +297 -0
- package/server/lib/adapters/telegram.ts +645 -0
- package/server/lib/adapters/types.ts +89 -0
- package/server/lib/adapters/webhook.ts +95 -0
- package/server/lib/address.ts +49 -0
- package/server/lib/agent-auth/contracts.ts +1194 -0
- package/server/lib/agent-profiles.ts +419 -0
- package/server/lib/ai.ts +285 -0
- package/server/lib/api-registry/contracts.ts +86 -0
- package/server/lib/api-registry/validation.ts +172 -0
- package/server/lib/apikey-migration.ts +258 -0
- package/server/lib/app-installer.ts +505 -0
- package/server/lib/app-tokens.ts +247 -0
- package/server/lib/approval-link.ts +27 -0
- package/server/lib/auth.ts +314 -0
- package/server/lib/auto-execute.ts +160 -0
- package/server/lib/batch.ts +242 -0
- package/server/lib/cold.ts +1048 -0
- package/server/lib/config.ts +408 -0
- package/server/lib/credential-access-audit.ts +85 -0
- package/server/lib/credential-access-policy.ts +111 -0
- package/server/lib/credential-health.ts +343 -0
- package/server/lib/credential-import.ts +608 -0
- package/server/lib/credential-scope.ts +102 -0
- package/server/lib/credential-shares.ts +190 -0
- package/server/lib/credential-transport.ts +533 -0
- package/server/lib/credential-vault.ts +77 -0
- package/server/lib/credentials.ts +422 -0
- package/server/lib/crypto.ts +8 -0
- package/server/lib/db.ts +58 -0
- package/server/lib/defaults.ts +386 -0
- package/server/lib/dex/index.ts +80 -0
- package/server/lib/dex/relay.ts +235 -0
- package/server/lib/dex/types.ts +59 -0
- package/server/lib/dex/uniswap.ts +370 -0
- package/server/lib/diary.ts +34 -0
- package/server/lib/dont-ask-again-policy.ts +41 -0
- package/server/lib/e2e-agent/artifacts.ts +36 -0
- package/server/lib/e2e-agent/contracts.ts +112 -0
- package/server/lib/e2e-agent/validation.ts +135 -0
- package/server/lib/encrypt.ts +114 -0
- package/server/lib/error.ts +20 -0
- package/server/lib/events.ts +217 -0
- package/server/lib/feature-flags.ts +93 -0
- package/server/lib/hot.ts +357 -0
- package/server/lib/human-action-summary.ts +80 -0
- package/server/lib/key-fingerprint.ts +28 -0
- package/server/lib/logger.ts +340 -0
- package/server/lib/network.ts +137 -0
- package/server/lib/notifications.ts +230 -0
- package/server/lib/oauth2-refresh.ts +241 -0
- package/server/lib/oursecret.ts +71 -0
- package/server/lib/passkey-credential.ts +360 -0
- package/server/lib/passkey.ts +68 -0
- package/server/lib/permissions.ts +299 -0
- package/server/lib/pino.ts +24 -0
- package/server/lib/policy-preview.ts +138 -0
- package/server/lib/price.ts +338 -0
- package/server/lib/prices.ts +34 -0
- package/server/lib/project-scope.ts +297 -0
- package/server/lib/resolve-action.ts +328 -0
- package/server/lib/resolve.ts +36 -0
- package/server/lib/secret-gist-share.ts +296 -0
- package/server/lib/sessions.ts +634 -0
- package/server/lib/socket-path.ts +56 -0
- package/server/lib/solana/connection.ts +26 -0
- package/server/lib/solana/jupiter.ts +128 -0
- package/server/lib/solana/transfer.ts +108 -0
- package/server/lib/solana/wallet.ts +136 -0
- package/server/lib/strategy/emits.ts +21 -0
- package/server/lib/strategy/engine.ts +1305 -0
- package/server/lib/strategy/executor.ts +115 -0
- package/server/lib/strategy/hook-context.ts +159 -0
- package/server/lib/strategy/hooks.ts +990 -0
- package/server/lib/strategy/index.ts +28 -0
- package/server/lib/strategy/installer.ts +305 -0
- package/server/lib/strategy/loader.ts +256 -0
- package/server/lib/strategy/message.ts +237 -0
- package/server/lib/strategy/repository.ts +218 -0
- package/server/lib/strategy/session-logger.ts +693 -0
- package/server/lib/strategy/sources.ts +288 -0
- package/server/lib/strategy/state.ts +189 -0
- package/server/lib/strategy/templates.ts +403 -0
- package/server/lib/strategy/tick.ts +404 -0
- package/server/lib/strategy/types.ts +230 -0
- package/server/lib/swap.ts +3 -0
- package/server/lib/temp.ts +86 -0
- package/server/lib/token-metadata.ts +86 -0
- package/server/lib/token-safety.ts +200 -0
- package/server/lib/token-search.ts +444 -0
- package/server/lib/totp.ts +194 -0
- package/server/lib/transactions.ts +123 -0
- package/server/lib/transport.ts +84 -0
- package/server/lib/txhistory/decoder.ts +262 -0
- package/server/lib/txhistory/enricher.ts +652 -0
- package/server/lib/txhistory/index.ts +391 -0
- package/server/lib/txhistory/signatures.ts +59 -0
- package/server/lib/update-check.ts +35 -0
- package/server/lib/verified-summary.ts +414 -0
- package/server/lib/view-registry.ts +80 -0
- package/server/mcp/profile-policy.ts +30 -0
- package/server/mcp/server.ts +1589 -0
- package/server/mcp/tools.ts +276 -0
- package/server/middleware/auth.ts +119 -0
- package/server/middleware/requestLogger.ts +84 -0
- package/server/routes/actions.ts +539 -0
- package/server/routes/adapters.ts +711 -0
- package/server/routes/addressbook.ts +113 -0
- package/server/routes/ai.ts +34 -0
- package/server/routes/apikeys.ts +343 -0
- package/server/routes/apps.ts +601 -0
- package/server/routes/auth.ts +406 -0
- package/server/routes/backup.ts +404 -0
- package/server/routes/batch.ts +270 -0
- package/server/routes/bookmarks.ts +162 -0
- package/server/routes/credential-shares.ts +380 -0
- package/server/routes/credential-vaults.ts +159 -0
- package/server/routes/credentials.ts +1782 -0
- package/server/routes/dashboard.ts +97 -0
- package/server/routes/defaults.ts +124 -0
- package/server/routes/flags.ts +11 -0
- package/server/routes/fund.ts +225 -0
- package/server/routes/heartbeat.ts +375 -0
- package/server/routes/import.ts +364 -0
- package/server/routes/launch.ts +665 -0
- package/server/routes/lock.ts +54 -0
- package/server/routes/logs.ts +68 -0
- package/server/routes/nuke.ts +111 -0
- package/server/routes/passkey-credentials.ts +99 -0
- package/server/routes/passkey.ts +366 -0
- package/server/routes/portfolio.ts +217 -0
- package/server/routes/price.ts +63 -0
- package/server/routes/resolve.ts +31 -0
- package/server/routes/security.ts +45 -0
- package/server/routes/send-evm.ts +241 -0
- package/server/routes/send-solana.ts +281 -0
- package/server/routes/send.ts +178 -0
- package/server/routes/setup.ts +210 -0
- package/server/routes/strategy.ts +894 -0
- package/server/routes/swap-evm.ts +352 -0
- package/server/routes/swap-solana.ts +176 -0
- package/server/routes/swap.ts +356 -0
- package/server/routes/token.ts +247 -0
- package/server/routes/unlock.ts +467 -0
- package/server/routes/views.ts +41 -0
- package/server/routes/wallet-assets.ts +361 -0
- package/server/routes/wallet-transactions.ts +515 -0
- package/server/routes/wallet.ts +709 -0
- package/server/types.ts +146 -0
- package/shared/credential-field-schema.ts +248 -0
- package/skills/auramaxx/HEARTBEAT.md +78 -0
- package/skills/auramaxx/SKILL.md +745 -0
- package/skills/auramaxx/docs/AGENT_SETUP.md +155 -0
- package/skills/auramaxx/docs/API.md +127 -0
- package/skills/auramaxx/docs/AUTH.md +318 -0
- package/skills/auramaxx/docs/CLI.md +130 -0
- package/skills/auramaxx/docs/MCP.md +122 -0
- package/skills/auramaxx/docs/TROUBLESHOOTING.md +357 -0
- package/skills/auramaxx/docs/WORKSPACE.md +673 -0
- package/skills/auramaxx/docs/security.md +227 -0
- package/skills/task-lifecycle/SKILL.md +378 -0
- package/src/app/api/[...doc]/page.tsx +36 -0
- package/src/app/api/agent-requests/route.ts +30 -0
- package/src/app/api/apps/install/route.ts +132 -0
- package/src/app/api/apps/manifests/route.ts +16 -0
- package/src/app/api/apps/static/[...path]/route.ts +57 -0
- package/src/app/api/docs/plain/route.ts +74 -0
- package/src/app/api/events/route.ts +92 -0
- package/src/app/api/page.tsx +290 -0
- package/src/app/api/workspace/[id]/apps/[wid]/route.ts +119 -0
- package/src/app/api/workspace/[id]/apps/route.ts +81 -0
- package/src/app/api/workspace/[id]/export/route.ts +67 -0
- package/src/app/api/workspace/[id]/route.ts +168 -0
- package/src/app/api/workspace/auth.ts +40 -0
- package/src/app/api/workspace/config/route.ts +121 -0
- package/src/app/api/workspace/import/route.ts +127 -0
- package/src/app/api/workspace/route.ts +116 -0
- package/src/app/app-legacy-do-not-use/page.tsx +2245 -0
- package/src/app/apple-icon.png +0 -0
- package/src/app/approve/[actionId]/page.tsx +409 -0
- package/src/app/docs/DocsPageContent.tsx +269 -0
- package/src/app/docs/[...doc]/page.tsx +41 -0
- package/src/app/docs/page.tsx +38 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +819 -0
- package/src/app/health/page.tsx +5 -0
- package/src/app/hello/page.tsx +102 -0
- package/src/app/icon.png +0 -0
- package/src/app/layout.tsx +39 -0
- package/src/app/page.tsx +1964 -0
- package/src/app/privacy/page.tsx +63 -0
- package/src/app/providers.tsx +87 -0
- package/src/app/share/[token]/page.tsx +295 -0
- package/src/app/terms/page.tsx +80 -0
- package/src/components/ChainSelector.tsx +44 -0
- package/src/components/HumanActionBar.tsx +697 -0
- package/src/components/NotificationDrawer.tsx +387 -0
- package/src/components/PasskeyEnrollmentPrompt.tsx +235 -0
- package/src/components/apps/AgentKeysApp.tsx +490 -0
- package/src/components/apps/App.tsx +153 -0
- package/src/components/apps/AppGrid.tsx +15 -0
- package/src/components/apps/DetailedAddressDrawer.tsx +325 -0
- package/src/components/apps/DraggableApp.tsx +562 -0
- package/src/components/apps/IFrameApp.tsx +73 -0
- package/src/components/apps/LogsApp.tsx +360 -0
- package/src/components/apps/SendApp.tsx +394 -0
- package/src/components/apps/SetupWizardApp.tsx +1004 -0
- package/src/components/apps/SystemDefaultsApp.tsx +845 -0
- package/src/components/apps/ThirdPartyApp.tsx +428 -0
- package/src/components/apps/TokenApp.tsx +319 -0
- package/src/components/apps/TransactionsApp.tsx +438 -0
- package/src/components/apps/WalletDetailApp.tsx +1505 -0
- package/src/components/apps/index.ts +13 -0
- package/src/components/design-system/Button.tsx +88 -0
- package/src/components/design-system/ChainIndicator.tsx +65 -0
- package/src/components/design-system/ChainSelector.tsx +147 -0
- package/src/components/design-system/ConfirmationModal.tsx +107 -0
- package/src/components/design-system/ConfirmationPopover.tsx +81 -0
- package/src/components/design-system/DownloadButton.tsx +149 -0
- package/src/components/design-system/Drawer.tsx +133 -0
- package/src/components/design-system/FilterDropdown.tsx +183 -0
- package/src/components/design-system/ItemPicker.tsx +157 -0
- package/src/components/design-system/Modal.tsx +296 -0
- package/src/components/design-system/Popover.tsx +142 -0
- package/src/components/design-system/TextInput.tsx +85 -0
- package/src/components/design-system/Toggle.tsx +65 -0
- package/src/components/design-system/TyvekCollapsibleSection.tsx +55 -0
- package/src/components/design-system/index.ts +14 -0
- package/src/components/docs/ClientSideMarkdown.tsx +51 -0
- package/src/components/docs/DocsSearchBar.tsx +118 -0
- package/src/components/docs/DocsThemeToggle.tsx +38 -0
- package/src/components/docs/PersistentDocGroup.tsx +91 -0
- package/src/components/docs/ShareUrlButton.tsx +33 -0
- package/src/components/docs/SidebarScrollMemory.tsx +56 -0
- package/src/components/health/CredentialHealthDashboard.tsx +214 -0
- package/src/components/icons/ChainIcons.tsx +72 -0
- package/src/components/layout/AppStoreDrawer.tsx +369 -0
- package/src/components/layout/ContentArea.tsx +21 -0
- package/src/components/layout/CreateViewModal.tsx +88 -0
- package/src/components/layout/LeftRail.tsx +114 -0
- package/src/components/layout/TabBar.tsx +284 -0
- package/src/components/layout/WalletSidebar.tsx +1030 -0
- package/src/components/layout/index.ts +6 -0
- package/src/components/marketing/AuraMaxxSpecOverlay.tsx +653 -0
- package/src/components/marketing/DeviceMorphExperience.tsx +216 -0
- package/src/components/vault/ApiKeysConsole.tsx +1272 -0
- package/src/components/vault/AuditConsole.tsx +600 -0
- package/src/components/vault/CredentialDetail.tsx +625 -0
- package/src/components/vault/CredentialEmpty.tsx +55 -0
- package/src/components/vault/CredentialField.tsx +583 -0
- package/src/components/vault/CredentialForm.tsx +1484 -0
- package/src/components/vault/CredentialList.tsx +265 -0
- package/src/components/vault/CredentialRow.tsx +130 -0
- package/src/components/vault/CredentialShareModal.tsx +273 -0
- package/src/components/vault/CredentialVault.tsx +1662 -0
- package/src/components/vault/CredentialWalletWidget.tsx +103 -0
- package/src/components/vault/DocsConsole.tsx +113 -0
- package/src/components/vault/ImportCredentialsModal.tsx +578 -0
- package/src/components/vault/LargeTypeModal.tsx +88 -0
- package/src/components/vault/PasswordGenerator.tsx +232 -0
- package/src/components/vault/TOTPDisplay.tsx +108 -0
- package/src/components/vault/TotpSetupPanel.tsx +198 -0
- package/src/components/vault/VaultSidebar.tsx +881 -0
- package/src/components/vault/credentialFormName.ts +91 -0
- package/src/components/vault/hooks/useVaultKeyboardShortcuts.ts +69 -0
- package/src/components/vault/types.ts +56 -0
- package/src/context/AuthContext.tsx +365 -0
- package/src/context/PriceContext.tsx +113 -0
- package/src/context/ThemeContext.tsx +164 -0
- package/src/context/WebSocketContext.tsx +269 -0
- package/src/context/WorkspaceContext.tsx +668 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useAgentActions.ts +552 -0
- package/src/hooks/useBalance.ts +103 -0
- package/src/hooks/useBalances.ts +129 -0
- package/src/hooks/useTheme.ts +156 -0
- package/src/instrumentation.ts +12 -0
- package/src/lib/api-docs.ts +154 -0
- package/src/lib/api.ts +474 -0
- package/src/lib/app-loader.ts +148 -0
- package/src/lib/app-registry.ts +178 -0
- package/src/lib/app-sdk.ts +157 -0
- package/src/lib/audit-console-adapter.ts +151 -0
- package/src/lib/auth-client.ts +75 -0
- package/src/lib/config.ts +74 -0
- package/src/lib/credential-field-schema.ts +11 -0
- package/src/lib/crypto.ts +112 -0
- package/src/lib/db.ts +21 -0
- package/src/lib/docs.ts +544 -0
- package/src/lib/events.ts +363 -0
- package/src/lib/pino.ts +24 -0
- package/src/lib/theme-handlers.ts +168 -0
- package/src/lib/theme.ts +351 -0
- package/src/lib/tokenData.ts +378 -0
- package/src/lib/totp-import.ts +57 -0
- package/src/lib/vault-crypto.ts +129 -0
- package/src/lib/view-registry.ts +57 -0
- package/src/lib/websocket-server.ts +302 -0
- package/src/lib/websocket-setup.ts +79 -0
- package/src/lib/wordlist.ts +2050 -0
- package/src/lib/workspace-handlers.ts +285 -0
- package/start.sh +170 -0
- package/tailwind.config.ts +99 -0
- package/tsconfig.json +42 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Aura Industry
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
The name "AuraMaxx" and the AuraMaxx logo are trademarks of Aura Industry
|
|
26
|
+
and may not be used in derivative works without prior written permission.
|
package/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# AuraMaxx
|
|
2
|
+
|
|
3
|
+
**Securely share passwords, cards, and API keys with AI agents like OpenClaw, Claude Code, Codex, Cursor, and more.**
|
|
4
|
+
|
|
5
|
+
**FAST.** Your keys never leave your machine. Everything is stored and runs locally.
|
|
6
|
+
|
|
7
|
+
**SECURE.** Model providers never see your secrets in plain text. Agents get scoped tokens, not raw credentials.
|
|
8
|
+
|
|
9
|
+
**CONTROL.** Fine-grained control over what each agent can do. Permission scopes, per-token limits, and human approval for every sensitive action.
|
|
10
|
+
|
|
11
|
+
**Set up once, use everywhere.** One vault works across Claude Code, Cursor, Codex, OpenClaw, and any MCP-compatible agent.
|
|
12
|
+
|
|
13
|
+
## Quickstart
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g auramaxx
|
|
17
|
+
auramaxx
|
|
18
|
+
auramaxx status
|
|
19
|
+
|
|
20
|
+
# or quickstart
|
|
21
|
+
npx auramaxx
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- Open `http://localhost:4747`, create/unlock your vault, then add your first credential.
|
|
25
|
+
|
|
26
|
+
## Get Your First Secret
|
|
27
|
+
|
|
28
|
+
Make sure you set up your vault first.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
auramaxx get OURSECRET
|
|
32
|
+
|
|
33
|
+
# if auramaxx command is not found, open a new terminal or run:
|
|
34
|
+
source ~/.zshrc # or source ~/.bashrc
|
|
35
|
+
|
|
36
|
+
# or use npx directly
|
|
37
|
+
npx auramaxx get OURSECRET
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Agent verify prompt:
|
|
41
|
+
|
|
42
|
+
`Use auramaxx to get the secret OURSECRET.`
|
|
43
|
+
|
|
44
|
+
## Agent Setup
|
|
45
|
+
|
|
46
|
+
**Skills** (OpenClaw, Claude Code, Codex CLI):
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# set up globally for common agents
|
|
50
|
+
npx -y auramaxx skill
|
|
51
|
+
|
|
52
|
+
cd <your-codebase-or-workspace>
|
|
53
|
+
npx -y skills add Aura-Industry/auramaxx
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**MCP** (Codex, Claude Desktop, Cursor IDE) — add to your client's MCP config:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"auramaxx": {
|
|
62
|
+
"command": "npx",
|
|
63
|
+
"args": ["auramaxx", "mcp"]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Further Reading
|
|
70
|
+
|
|
71
|
+
- [Agent Setup](./docs/AGENT_SETUP.md) — per-client setup details
|
|
72
|
+
- [Security](./docs/security.md) — how keys and tokens work
|
|
73
|
+
- [Troubleshooting](./docs/TROUBLESHOOTING.md)
|
|
74
|
+
|
|
75
|
+
## Questions / Support
|
|
76
|
+
|
|
77
|
+
https://x.com/hi_im_nico
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
const { app, BrowserWindow, Menu, Tray, shell, ipcMain, nativeImage } = require('electron');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
|
|
5
|
+
const WEB_PORT = process.env.AURA_WEB_PORT || '4747';
|
|
6
|
+
const API_PORT = process.env.AURA_API_PORT || '4242';
|
|
7
|
+
const WEB_URL = process.env.AURA_WEB_URL || `http://localhost:${WEB_PORT}`;
|
|
8
|
+
const API_URL = process.env.AURA_API_URL || `http://localhost:${API_PORT}`;
|
|
9
|
+
const INSTALL_CMD = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
10
|
+
const CLI_CANDIDATES = ['aura', 'auramaxx'];
|
|
11
|
+
const STARTUP_HTML = path.join(__dirname, 'startup.html');
|
|
12
|
+
const APP_ICON = path.join(__dirname, 'icon.png');
|
|
13
|
+
|
|
14
|
+
let auraProcess = null;
|
|
15
|
+
let mainWindow = null;
|
|
16
|
+
let tray = null;
|
|
17
|
+
|
|
18
|
+
// ── Logging ──────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
function log(...args) {
|
|
21
|
+
console.log('[desktop-electron]', ...args);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ── Shell helpers ────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
function runCommand(command, args = [], opts = {}) {
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
const child = spawn(command, args, {
|
|
29
|
+
shell: false,
|
|
30
|
+
env: process.env,
|
|
31
|
+
...opts,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
let stdout = '';
|
|
35
|
+
let stderr = '';
|
|
36
|
+
child.stdout?.on('data', (chunk) => {
|
|
37
|
+
stdout += String(chunk);
|
|
38
|
+
});
|
|
39
|
+
child.stderr?.on('data', (chunk) => {
|
|
40
|
+
stderr += String(chunk);
|
|
41
|
+
});
|
|
42
|
+
child.on('error', (error) => {
|
|
43
|
+
resolve({ ok: false, code: -1, stdout, stderr: `${stderr}\n${error.message}`.trim() });
|
|
44
|
+
});
|
|
45
|
+
child.on('close', (code) => {
|
|
46
|
+
resolve({ ok: code === 0, code: code ?? 1, stdout, stderr });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function commandExists(bin) {
|
|
52
|
+
const check = process.platform === 'win32'
|
|
53
|
+
? await runCommand('where', [bin])
|
|
54
|
+
: await runCommand('which', [bin]);
|
|
55
|
+
return check.ok;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function resolveAuraCli() {
|
|
59
|
+
for (const candidate of CLI_CANDIDATES) {
|
|
60
|
+
if (await commandExists(candidate)) return candidate;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── Health checks ────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
async function isWebReady() {
|
|
68
|
+
try {
|
|
69
|
+
const res = await fetch(WEB_URL, { method: 'GET' });
|
|
70
|
+
return res.ok || res.status < 500;
|
|
71
|
+
} catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function isApiReady() {
|
|
77
|
+
try {
|
|
78
|
+
const res = await fetch(`${API_URL}/health`, { method: 'GET' });
|
|
79
|
+
return res.ok;
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function waitForWeb(timeoutMs = 45000) {
|
|
86
|
+
const started = Date.now();
|
|
87
|
+
while (Date.now() - started < timeoutMs) {
|
|
88
|
+
if (await isWebReady()) return;
|
|
89
|
+
await new Promise((r) => setTimeout(r, 700));
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Timed out waiting for dashboard at ${WEB_URL}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ── IPC: service lifecycle ───────────────────────────────────
|
|
95
|
+
|
|
96
|
+
function sendStatus(phase, message) {
|
|
97
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
98
|
+
mainWindow.webContents.send('aura:start-status', { phase, message });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function registerIpcHandlers() {
|
|
103
|
+
ipcMain.handle('app:version', () => app.getVersion());
|
|
104
|
+
ipcMain.handle('shell:openExternal', async (_event, url) => {
|
|
105
|
+
if (typeof url !== 'string' || !/^https?:\/\//i.test(url)) return false;
|
|
106
|
+
await shell.openExternal(url);
|
|
107
|
+
return true;
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Quick health check — is the dashboard reachable right now?
|
|
111
|
+
ipcMain.handle('aura:check-ready', async () => {
|
|
112
|
+
return isWebReady();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Full start sequence: find CLI → install if needed → start service → wait
|
|
116
|
+
ipcMain.handle('aura:start-service', async () => {
|
|
117
|
+
try {
|
|
118
|
+
// Already running?
|
|
119
|
+
if (await isWebReady()) {
|
|
120
|
+
sendStatus('ready', 'Dashboard is running');
|
|
121
|
+
return { ok: true };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Resolve CLI
|
|
125
|
+
sendStatus('checking', 'Looking for AuraMaxx CLI\u2026');
|
|
126
|
+
let cli = await resolveAuraCli();
|
|
127
|
+
|
|
128
|
+
if (!cli) {
|
|
129
|
+
sendStatus('installing', 'Installing AuraMaxx (npm install -g auramaxx)\u2026');
|
|
130
|
+
log('CLI not found. Running npm install -g auramaxx ...');
|
|
131
|
+
const install = await runCommand(INSTALL_CMD, ['install', '-g', 'auramaxx'], { stdio: 'pipe' });
|
|
132
|
+
if (!install.ok) {
|
|
133
|
+
const detail = (install.stderr || install.stdout || '').slice(0, 300);
|
|
134
|
+
return { ok: false, error: `npm install failed: ${detail}`.trim() };
|
|
135
|
+
}
|
|
136
|
+
cli = await resolveAuraCli();
|
|
137
|
+
if (!cli) {
|
|
138
|
+
return { ok: false, error: 'AuraMaxx CLI still not found after installation. Check your PATH.' };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Start service
|
|
143
|
+
sendStatus('starting', 'Starting AuraMaxx service\u2026');
|
|
144
|
+
log(`Starting service with: ${cli} start`);
|
|
145
|
+
auraProcess = spawn(cli, ['start'], {
|
|
146
|
+
env: process.env,
|
|
147
|
+
cwd: path.resolve(__dirname, '..', '..'),
|
|
148
|
+
stdio: 'pipe',
|
|
149
|
+
});
|
|
150
|
+
auraProcess.stdout?.on('data', (chunk) => log(String(chunk).trim()));
|
|
151
|
+
auraProcess.stderr?.on('data', (chunk) => console.error('[desktop-electron:aura]', String(chunk).trim()));
|
|
152
|
+
|
|
153
|
+
// Wait for dashboard
|
|
154
|
+
sendStatus('waiting', 'Waiting for dashboard\u2026');
|
|
155
|
+
await waitForWeb(60000);
|
|
156
|
+
|
|
157
|
+
sendStatus('ready', 'Dashboard is ready');
|
|
158
|
+
startStatusPolling();
|
|
159
|
+
return { ok: true };
|
|
160
|
+
} catch (err) {
|
|
161
|
+
log('Start service failed:', err?.message || err);
|
|
162
|
+
return { ok: false, error: err?.message || 'Failed to start AuraMaxx' };
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Navigate main window to the live dashboard
|
|
167
|
+
ipcMain.handle('aura:navigate-dashboard', () => {
|
|
168
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
169
|
+
mainWindow.loadURL(WEB_URL);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ── Tray icon ────────────────────────────────────────────────
|
|
175
|
+
|
|
176
|
+
function createTrayIcon() {
|
|
177
|
+
const icon = nativeImage.createFromPath(APP_ICON);
|
|
178
|
+
|
|
179
|
+
if (process.platform === 'darwin') {
|
|
180
|
+
// macOS menubar: 16pt (32px at 2x retina)
|
|
181
|
+
return icon.resize({ width: 16, height: 16 });
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Windows/Linux: 24x24
|
|
185
|
+
return icon.resize({ width: 24, height: 24 });
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function buildTrayMenu() {
|
|
189
|
+
const windowVisible = mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible();
|
|
190
|
+
return Menu.buildFromTemplate([
|
|
191
|
+
{
|
|
192
|
+
label: 'AuraMaxx',
|
|
193
|
+
enabled: false,
|
|
194
|
+
},
|
|
195
|
+
{ type: 'separator' },
|
|
196
|
+
{
|
|
197
|
+
label: windowVisible ? 'Hide Window' : 'Show Window',
|
|
198
|
+
click: () => {
|
|
199
|
+
if (!mainWindow || mainWindow.isDestroyed()) {
|
|
200
|
+
createWindow();
|
|
201
|
+
} else if (mainWindow.isVisible()) {
|
|
202
|
+
mainWindow.hide();
|
|
203
|
+
} else {
|
|
204
|
+
mainWindow.show();
|
|
205
|
+
mainWindow.focus();
|
|
206
|
+
}
|
|
207
|
+
if (tray) tray.setContextMenu(buildTrayMenu());
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
label: 'Open in Browser',
|
|
212
|
+
click: () => shell.openExternal(WEB_URL),
|
|
213
|
+
},
|
|
214
|
+
{ type: 'separator' },
|
|
215
|
+
{
|
|
216
|
+
label: 'Quit',
|
|
217
|
+
click: () => {
|
|
218
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
219
|
+
mainWindow.destroy();
|
|
220
|
+
}
|
|
221
|
+
app.quit();
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
]);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function createTray() {
|
|
228
|
+
const icon = createTrayIcon();
|
|
229
|
+
tray = new Tray(icon);
|
|
230
|
+
tray.setToolTip('AuraMaxx');
|
|
231
|
+
tray.setContextMenu(buildTrayMenu());
|
|
232
|
+
|
|
233
|
+
tray.on('click', () => {
|
|
234
|
+
if (!mainWindow || mainWindow.isDestroyed()) {
|
|
235
|
+
createWindow();
|
|
236
|
+
} else if (mainWindow.isVisible()) {
|
|
237
|
+
mainWindow.hide();
|
|
238
|
+
} else {
|
|
239
|
+
mainWindow.show();
|
|
240
|
+
mainWindow.focus();
|
|
241
|
+
}
|
|
242
|
+
if (tray) tray.setContextMenu(buildTrayMenu());
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ── Status polling ───────────────────────────────────────────
|
|
247
|
+
|
|
248
|
+
let statusInterval = null;
|
|
249
|
+
|
|
250
|
+
function startStatusPolling() {
|
|
251
|
+
if (statusInterval) return;
|
|
252
|
+
statusInterval = setInterval(async () => {
|
|
253
|
+
const apiUp = await isApiReady();
|
|
254
|
+
const tooltip = apiUp ? 'AuraMaxx — Running' : 'AuraMaxx — Offline';
|
|
255
|
+
if (tray && !tray.isDestroyed()) {
|
|
256
|
+
tray.setToolTip(tooltip);
|
|
257
|
+
}
|
|
258
|
+
}, 15_000);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function stopStatusPolling() {
|
|
262
|
+
if (statusInterval) {
|
|
263
|
+
clearInterval(statusInterval);
|
|
264
|
+
statusInterval = null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ── Menu bar ─────────────────────────────────────────────────
|
|
269
|
+
|
|
270
|
+
function createMenu() {
|
|
271
|
+
const template = [
|
|
272
|
+
{
|
|
273
|
+
label: 'Aura',
|
|
274
|
+
submenu: [
|
|
275
|
+
{ role: 'about' },
|
|
276
|
+
{ type: 'separator' },
|
|
277
|
+
{ role: 'hide' },
|
|
278
|
+
{ role: 'hideOthers' },
|
|
279
|
+
{ role: 'unhide' },
|
|
280
|
+
{ type: 'separator' },
|
|
281
|
+
{ role: 'quit' },
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
label: 'Edit',
|
|
286
|
+
submenu: [
|
|
287
|
+
{ role: 'undo' },
|
|
288
|
+
{ role: 'redo' },
|
|
289
|
+
{ type: 'separator' },
|
|
290
|
+
{ role: 'cut' },
|
|
291
|
+
{ role: 'copy' },
|
|
292
|
+
{ role: 'paste' },
|
|
293
|
+
{ role: 'selectAll' },
|
|
294
|
+
],
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
label: 'View',
|
|
298
|
+
submenu: [
|
|
299
|
+
{ role: 'reload' },
|
|
300
|
+
{ role: 'forceReload' },
|
|
301
|
+
{ role: 'toggleDevTools' },
|
|
302
|
+
{ type: 'separator' },
|
|
303
|
+
{ role: 'resetZoom' },
|
|
304
|
+
{ role: 'zoomIn' },
|
|
305
|
+
{ role: 'zoomOut' },
|
|
306
|
+
{ type: 'separator' },
|
|
307
|
+
{ role: 'togglefullscreen' },
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
label: 'Window',
|
|
312
|
+
submenu: [
|
|
313
|
+
{ role: 'minimize' },
|
|
314
|
+
{ role: 'zoom' },
|
|
315
|
+
{ type: 'separator' },
|
|
316
|
+
{ role: 'front' },
|
|
317
|
+
],
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
label: 'Help',
|
|
321
|
+
submenu: [
|
|
322
|
+
{
|
|
323
|
+
label: 'Open Aura Docs',
|
|
324
|
+
click: () => shell.openExternal(`${WEB_URL}/docs`),
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
},
|
|
328
|
+
];
|
|
329
|
+
Menu.setApplicationMenu(Menu.buildFromTemplate(template));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ── Windows ──────────────────────────────────────────────────
|
|
333
|
+
|
|
334
|
+
function createWindow() {
|
|
335
|
+
mainWindow = new BrowserWindow({
|
|
336
|
+
width: 1280,
|
|
337
|
+
height: 860,
|
|
338
|
+
minWidth: 1024,
|
|
339
|
+
minHeight: 700,
|
|
340
|
+
title: 'Aura',
|
|
341
|
+
icon: APP_ICON,
|
|
342
|
+
titleBarStyle: process.platform === 'darwin' ? 'hiddenInset' : 'default',
|
|
343
|
+
webPreferences: {
|
|
344
|
+
preload: path.join(__dirname, 'preload.js'),
|
|
345
|
+
contextIsolation: true,
|
|
346
|
+
nodeIntegration: false,
|
|
347
|
+
sandbox: true,
|
|
348
|
+
devTools: true,
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// On any navigation failure (ERR_CONNECTION_REFUSED, etc.) show the startup page.
|
|
353
|
+
// Only redirect if we were trying to load the dashboard, not the local startup file.
|
|
354
|
+
mainWindow.webContents.on('did-fail-load', (_event, errorCode, _errorDesc, validatedURL) => {
|
|
355
|
+
const isRemoteURL = validatedURL && validatedURL.startsWith('http');
|
|
356
|
+
if (isRemoteURL) {
|
|
357
|
+
log(`Dashboard load failed (code ${errorCode}): ${validatedURL}. Showing startup page.`);
|
|
358
|
+
mainWindow.loadFile(STARTUP_HTML);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Start by loading the local startup page — it auto-checks and redirects if dashboard is up.
|
|
363
|
+
mainWindow.loadFile(STARTUP_HTML);
|
|
364
|
+
|
|
365
|
+
// Close window → hide to tray instead of quitting (macOS behavior)
|
|
366
|
+
mainWindow.on('close', (e) => {
|
|
367
|
+
if (!app.isQuitting) {
|
|
368
|
+
e.preventDefault();
|
|
369
|
+
mainWindow.hide();
|
|
370
|
+
if (tray) tray.setContextMenu(buildTrayMenu());
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
mainWindow.on('show', () => {
|
|
375
|
+
if (tray) tray.setContextMenu(buildTrayMenu());
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
return mainWindow;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// ── App lifecycle ────────────────────────────────────────────
|
|
382
|
+
|
|
383
|
+
app.isQuitting = false;
|
|
384
|
+
|
|
385
|
+
app.on('before-quit', () => {
|
|
386
|
+
app.isQuitting = true;
|
|
387
|
+
stopStatusPolling();
|
|
388
|
+
if (auraProcess && !auraProcess.killed) {
|
|
389
|
+
auraProcess.kill('SIGTERM');
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
app.whenReady().then(async () => {
|
|
394
|
+
registerIpcHandlers();
|
|
395
|
+
createMenu();
|
|
396
|
+
createTray();
|
|
397
|
+
|
|
398
|
+
// Set dock icon on macOS (dev mode uses default Electron icon otherwise)
|
|
399
|
+
if (process.platform === 'darwin' && app.dock) {
|
|
400
|
+
app.dock.setIcon(APP_ICON);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Show window immediately with the startup page.
|
|
404
|
+
// The startup page auto-checks if the dashboard is running and redirects if so.
|
|
405
|
+
createWindow();
|
|
406
|
+
|
|
407
|
+
// If the dashboard is already up, start polling right away
|
|
408
|
+
if (await isWebReady()) {
|
|
409
|
+
startStatusPolling();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
app.on('activate', () => {
|
|
413
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
414
|
+
mainWindow.show();
|
|
415
|
+
mainWindow.focus();
|
|
416
|
+
} else if (BrowserWindow.getAllWindows().length === 0) {
|
|
417
|
+
createWindow();
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
app.on('window-all-closed', () => {
|
|
423
|
+
if (process.platform !== 'darwin') {
|
|
424
|
+
if (!tray || tray.isDestroyed()) {
|
|
425
|
+
app.quit();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
});
|