@agentprojectcontext/apx 1.24.0 → 1.27.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/package.json +42 -12
- package/skills/apx/SKILL.md +50 -119
- package/skills/apx-agency-agents/SKILL.md +141 -0
- package/skills/apx-agent/SKILL.md +100 -0
- package/skills/apx-mcp/SKILL.md +114 -0
- package/skills/apx-mcp-builder/SKILL.md +186 -0
- package/skills/apx-project/SKILL.md +100 -0
- package/skills/apx-routine/SKILL.md +138 -0
- package/skills/apx-runtime/SKILL.md +115 -0
- package/skills/apx-sessions/SKILL.md +281 -0
- package/skills/apx-skill-builder/SKILL.md +149 -0
- package/skills/apx-task/SKILL.md +95 -0
- package/skills/apx-telegram/SKILL.md +115 -0
- package/skills/apx-voice/SKILL.md +135 -0
- package/src/core/agent/constants.js +3 -0
- package/src/core/agent/ghost-guard.js +24 -0
- package/src/core/agent/index.js +35 -0
- package/src/core/agent/model-router.js +257 -0
- package/src/core/agent/prompt-builder.js +313 -0
- package/src/core/agent/prompts/channels/api.md +7 -0
- package/src/core/agent/prompts/channels/cli.md +6 -0
- package/src/core/agent/prompts/channels/code.md +20 -0
- package/src/core/agent/prompts/channels/deck.md +6 -0
- package/src/core/agent/prompts/channels/desktop.md +24 -0
- package/src/core/agent/prompts/channels/routine.md +9 -0
- package/src/core/agent/prompts/channels/telegram.md +9 -0
- package/src/core/agent/prompts/channels/terminal.md +16 -0
- package/src/core/agent/prompts/channels/web.md +7 -0
- package/src/core/agent/prompts/channels/web_sidebar.md +7 -0
- package/src/core/agent/prompts/modes/voice.md +4 -0
- package/src/core/agent/prompts/super-agent-base.md +42 -0
- package/src/core/agent/pseudo-tools.js +40 -0
- package/src/core/agent/retry.js +85 -0
- package/src/core/agent/run-agent.js +423 -0
- package/src/core/agent/self-memory.js +155 -0
- package/src/{daemon → core/agent}/tool-call-parser.js +83 -10
- package/src/core/agent/tools-overlap.js +66 -0
- package/src/core/apc-skill-sync.js +97 -0
- package/src/core/code-sessions-store.js +150 -0
- package/src/core/config.js +473 -11
- package/src/core/desktop/autostart.js +162 -0
- package/src/core/engines/_health.js +63 -0
- package/src/{daemon → core}/engines/anthropic.js +16 -0
- package/src/core/engines/gemini.js +168 -0
- package/src/core/engines/groq.js +8 -0
- package/src/{daemon → core}/engines/index.js +3 -1
- package/src/{daemon → core}/engines/mock.js +22 -0
- package/src/{daemon → core}/engines/ollama.js +35 -0
- package/src/core/engines/openai-compatible.js +145 -0
- package/src/core/engines/openai.js +8 -0
- package/src/core/engines/openrouter.js +8 -0
- package/src/core/git-baseline.js +147 -0
- package/src/core/identity.js +21 -0
- package/src/core/logging.js +1 -1
- package/src/core/mcp/index.js +14 -0
- package/src/{daemon/mcp-runner.js → core/mcp/runner.js} +18 -6
- package/src/core/mcp/sources.js +246 -0
- package/src/core/memory/active-threads.js +124 -0
- package/src/core/memory/broker.js +144 -0
- package/src/core/memory/compactor.js +186 -0
- package/src/core/memory/embed-engines/gemini.js +62 -0
- package/src/core/memory/embed-engines/index.js +148 -0
- package/src/core/memory/embed-engines/ollama.js +55 -0
- package/src/core/memory/embed-engines/openai.js +64 -0
- package/src/core/memory/embed-engines/tf.js +20 -0
- package/src/core/memory/embeddings.js +132 -0
- package/src/core/memory/index.js +161 -0
- package/src/core/memory/indexer.js +257 -0
- package/src/core/memory/store.js +231 -0
- package/src/core/messages-store.js +143 -25
- package/src/core/parser.js +78 -16
- package/src/core/scaffold.js +175 -79
- package/src/core/tasks-store.js +264 -0
- package/src/core/telegram-identity.js +126 -0
- package/src/core/tools/index.js +6 -0
- package/src/core/voice/engines/elevenlabs.js +96 -0
- package/src/core/voice/engines/gemini.js +148 -0
- package/src/core/voice/engines/index.js +144 -0
- package/src/core/voice/engines/mock.js +59 -0
- package/src/core/voice/engines/openai.js +82 -0
- package/src/core/voice/engines/piper.js +93 -0
- package/src/core/voice/index.js +3 -0
- package/src/core/voice/tts.js +89 -0
- package/src/{daemon → host/daemon}/apc-runtime-context.js +1 -1
- package/src/host/daemon/api/admin-config.js +159 -0
- package/src/host/daemon/api/admin.js +72 -0
- package/src/host/daemon/api/agents.js +284 -0
- package/src/host/daemon/api/artifacts.js +52 -0
- package/src/host/daemon/api/code.js +351 -0
- package/src/host/daemon/api/config.js +104 -0
- package/src/host/daemon/api/connections.js +42 -0
- package/src/host/daemon/api/conversations.js +161 -0
- package/src/host/daemon/api/deck.js +511 -0
- package/src/host/daemon/api/desktop.js +71 -0
- package/src/host/daemon/api/embeddings.js +65 -0
- package/src/host/daemon/api/engines.js +80 -0
- package/src/host/daemon/api/exec.js +193 -0
- package/src/host/daemon/api/health.js +10 -0
- package/src/host/daemon/api/identity.js +36 -0
- package/src/host/daemon/api/mcps.js +205 -0
- package/src/host/daemon/api/messages.js +83 -0
- package/src/host/daemon/api/pairing.js +194 -0
- package/src/host/daemon/api/plugins.js +19 -0
- package/src/host/daemon/api/projects.js +35 -0
- package/src/host/daemon/api/routines.js +84 -0
- package/src/host/daemon/api/run.js +55 -0
- package/src/host/daemon/api/runtimes.js +219 -0
- package/src/host/daemon/api/sessions-search.js +177 -0
- package/src/host/daemon/api/sessions.js +115 -0
- package/src/host/daemon/api/shared.js +217 -0
- package/src/host/daemon/api/super-agent.js +208 -0
- package/src/host/daemon/api/tasks.js +118 -0
- package/src/host/daemon/api/telegram.js +325 -0
- package/src/host/daemon/api/tools.js +21 -0
- package/src/host/daemon/api/top-level.js +131 -0
- package/src/host/daemon/api/transcribe.js +35 -0
- package/src/host/daemon/api/tts.js +44 -0
- package/src/host/daemon/api/voice.js +519 -0
- package/src/host/daemon/api/web.js +123 -0
- package/src/host/daemon/api.js +152 -0
- package/src/{daemon → host/daemon}/compact.js +1 -1
- package/src/{daemon → host/daemon}/db.js +19 -5
- package/src/{daemon/overlay-ws.js → host/daemon/desktop-ws.js} +7 -7
- package/src/host/daemon/engine-sessions.js +245 -0
- package/src/{daemon → host/daemon}/index.js +27 -10
- package/src/{daemon/plugins/overlay.js → host/daemon/plugins/desktop.js} +36 -28
- package/src/{daemon → host/daemon}/plugins/index.js +2 -2
- package/src/{daemon → host/daemon}/plugins/telegram.js +165 -33
- package/src/{daemon → host/daemon}/project-config.js +31 -7
- package/src/{daemon → host/daemon}/routines.js +27 -8
- package/src/{daemon → host/daemon}/skills-loader.js +4 -2
- package/src/{daemon → host/daemon}/smoke.js +9 -5
- package/src/{daemon → host/daemon}/super-agent-tools/helpers.js +1 -1
- package/src/host/daemon/super-agent-tools/index.js +157 -0
- package/src/{daemon → host/daemon}/super-agent-tools/registry-bridge.js +1 -1
- package/src/{daemon → host/daemon}/super-agent-tools/tools/add-project.js +2 -2
- package/src/{daemon → host/daemon}/super-agent-tools/tools/ask-questions.js +4 -0
- package/src/{daemon → host/daemon}/super-agent-tools/tools/call-agent.js +5 -2
- package/src/{daemon → host/daemon}/super-agent-tools/tools/call-runtime.js +117 -8
- package/src/host/daemon/super-agent-tools/tools/create-task.js +52 -0
- package/src/{daemon → host/daemon}/super-agent-tools/tools/import-agent.js +2 -3
- package/src/{daemon → host/daemon}/super-agent-tools/tools/list-agents.js +1 -1
- package/src/host/daemon/super-agent-tools/tools/list-tasks.js +52 -0
- package/src/{daemon → host/daemon}/super-agent-tools/tools/list-vault-agents.js +1 -1
- package/src/host/daemon/super-agent-tools/tools/read-self-memory.js +21 -0
- package/src/host/daemon/super-agent-tools/tools/remember.js +40 -0
- package/src/{daemon → host/daemon}/super-agent-tools/tools/search-messages.js +1 -1
- package/src/host/daemon/super-agent-tools/tools/search-sessions.js +134 -0
- package/src/{daemon → host/daemon}/super-agent-tools/tools/send-telegram.js +2 -2
- package/src/{daemon → host/daemon}/super-agent-tools/tools/set-identity.js +1 -1
- package/src/{daemon → host/daemon}/super-agent-tools/tools/set-permission-mode.js +1 -1
- package/src/{daemon → host/daemon}/super-agent-tools/tools/tail-messages.js +1 -1
- package/src/host/daemon/super-agent.js +129 -0
- package/src/host/daemon/token-store.js +118 -0
- package/src/host/daemon/tool-call-parser.js +2 -0
- package/src/{daemon → host/daemon}/transcription.js +1 -1
- package/src/{daemon → host/daemon}/wakeup.js +2 -2
- package/src/interfaces/cli/claude-permissions.js +33 -0
- package/src/{cli → interfaces/cli}/commands/agent.js +43 -8
- package/src/{cli → interfaces/cli}/commands/command.js +1 -1
- package/src/{cli → interfaces/cli}/commands/config.js +1 -1
- package/src/{cli → interfaces/cli}/commands/daemon.js +67 -0
- package/src/interfaces/cli/commands/desktop.js +335 -0
- package/src/interfaces/cli/commands/exec.js +92 -0
- package/src/{cli → interfaces/cli}/commands/identity.js +6 -63
- package/src/{cli → interfaces/cli}/commands/init.js +1 -1
- package/src/{cli → interfaces/cli}/commands/mcp.js +69 -10
- package/src/{cli → interfaces/cli}/commands/memory.js +2 -2
- package/src/interfaces/cli/commands/model.js +136 -0
- package/src/interfaces/cli/commands/pair.js +170 -0
- package/src/interfaces/cli/commands/project-config.js +131 -0
- package/src/{cli → interfaces/cli}/commands/project.js +1 -1
- package/src/{cli → interfaces/cli}/commands/search.js +1 -1
- package/src/interfaces/cli/commands/session.js +892 -0
- package/src/interfaces/cli/commands/sessions.js +997 -0
- package/src/{cli → interfaces/cli}/commands/setup.js +98 -4
- package/src/{cli → interfaces/cli}/commands/skills.js +117 -9
- package/src/{cli → interfaces/cli}/commands/status.js +9 -1
- package/src/{cli → interfaces/cli}/commands/sys.js +96 -17
- package/src/interfaces/cli/commands/task.js +179 -0
- package/src/interfaces/cli/commands/telegram.js +366 -0
- package/src/{cli → interfaces/cli}/commands/update.js +1 -1
- package/src/interfaces/cli/commands/voice.js +258 -0
- package/src/{cli → interfaces/cli}/http.js +6 -2
- package/src/{cli → interfaces/cli}/index.js +955 -63
- package/src/interfaces/cli/postinstall.js +34 -0
- package/src/interfaces/desktop/assets/app-icon-180.png +0 -0
- package/src/interfaces/desktop/assets/app-icon-32.png +0 -0
- package/src/interfaces/desktop/assets/app-icon.png +0 -0
- package/src/interfaces/desktop/assets/apx-logo.png +0 -0
- package/src/interfaces/desktop/assets/superagent.png +0 -0
- package/src/interfaces/desktop/assets/tray-icon.png +0 -0
- package/src/interfaces/desktop/index.html +18 -0
- package/src/interfaces/desktop/main.js +652 -0
- package/src/interfaces/desktop/preload.js +48 -0
- package/src/interfaces/desktop/renderer.js +1006 -0
- package/src/interfaces/desktop/style.css +400 -0
- package/src/{mcp → interfaces/mcp-server}/index.js +2 -2
- package/src/interfaces/tui/_shims/util-which.ts +53 -0
- package/src/{tui → interfaces/tui}/app.tsx +2 -2
- package/src/{tui → interfaces/tui}/component/prompt/index.tsx +4 -1
- package/src/{tui → interfaces/tui}/context/sdk-apx.tsx +84 -16
- package/src/interfaces/tui/context/sync-apx.tsx +398 -0
- package/src/interfaces/tui/routes/session/index.tsx +368 -0
- package/src/interfaces/tui/routes/session/message-actions.tsx +58 -0
- package/src/interfaces/tui/routes/session/sidebar-apx.tsx +114 -0
- package/src/{tui → interfaces/tui}/tsconfig.json +1 -0
- package/src/{tui → interfaces/tui}/util/clipboard.ts +1 -1
- package/src/interfaces/web/README.md +102 -0
- package/src/interfaces/web/coming-soon.html +65 -0
- package/src/interfaces/web/components.json +25 -0
- package/src/interfaces/web/dist/assets/index-BDUsA6L6.css +1 -0
- package/src/interfaces/web/dist/assets/index-CfWyjPBa.js +548 -0
- package/src/interfaces/web/dist/assets/index-CfWyjPBa.js.map +1 -0
- package/src/interfaces/web/dist/favicon/dark/android-chrome-192x192.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/android-chrome-512x512.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/apple-touch-icon.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/favicon-16x16.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/favicon-32x32.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/favicon-48x48.png +0 -0
- package/src/interfaces/web/dist/favicon/dark/favicon.ico +0 -0
- package/src/interfaces/web/dist/favicon/dark/favicon.webp +0 -0
- package/src/interfaces/web/dist/favicon/dark/site.webmanifest +18 -0
- package/src/interfaces/web/dist/favicon/white/android-chrome-192x192.png +0 -0
- package/src/interfaces/web/dist/favicon/white/android-chrome-512x512.png +0 -0
- package/src/interfaces/web/dist/favicon/white/apple-touch-icon.png +0 -0
- package/src/interfaces/web/dist/favicon/white/favicon-16x16.png +0 -0
- package/src/interfaces/web/dist/favicon/white/favicon-32x32.png +0 -0
- package/src/interfaces/web/dist/favicon/white/favicon-48x48.png +0 -0
- package/src/interfaces/web/dist/favicon/white/favicon.ico +0 -0
- package/src/interfaces/web/dist/favicon/white/favicon.webp +0 -0
- package/src/interfaces/web/dist/favicon/white/site.webmanifest +18 -0
- package/src/interfaces/web/dist/index.html +27 -0
- package/src/interfaces/web/dist/logo/logo_dark.webp +0 -0
- package/src/interfaces/web/dist/logo/logo_only_dark.webp +0 -0
- package/src/interfaces/web/dist/logo/logo_only_white.webp +0 -0
- package/src/interfaces/web/dist/logo/logo_vertical_dark.webp +0 -0
- package/src/interfaces/web/dist/logo/logo_vertical_white.webp +0 -0
- package/src/interfaces/web/dist/logo/logo_white.webp +0 -0
- package/src/interfaces/web/dist/modules/superagent.png +0 -0
- package/src/interfaces/web/index.html +26 -0
- package/src/interfaces/web/package-lock.json +4253 -0
- package/src/interfaces/web/package.json +55 -0
- package/src/interfaces/web/playwright.config.ts +45 -0
- package/src/interfaces/web/pnpm-lock.yaml +2946 -0
- package/src/interfaces/web/public/favicon/dark/android-chrome-192x192.png +0 -0
- package/src/interfaces/web/public/favicon/dark/android-chrome-512x512.png +0 -0
- package/src/interfaces/web/public/favicon/dark/apple-touch-icon.png +0 -0
- package/src/interfaces/web/public/favicon/dark/favicon-16x16.png +0 -0
- package/src/interfaces/web/public/favicon/dark/favicon-32x32.png +0 -0
- package/src/interfaces/web/public/favicon/dark/favicon-48x48.png +0 -0
- package/src/interfaces/web/public/favicon/dark/favicon.ico +0 -0
- package/src/interfaces/web/public/favicon/dark/favicon.webp +0 -0
- package/src/interfaces/web/public/favicon/dark/site.webmanifest +18 -0
- package/src/interfaces/web/public/favicon/white/android-chrome-192x192.png +0 -0
- package/src/interfaces/web/public/favicon/white/android-chrome-512x512.png +0 -0
- package/src/interfaces/web/public/favicon/white/apple-touch-icon.png +0 -0
- package/src/interfaces/web/public/favicon/white/favicon-16x16.png +0 -0
- package/src/interfaces/web/public/favicon/white/favicon-32x32.png +0 -0
- package/src/interfaces/web/public/favicon/white/favicon-48x48.png +0 -0
- package/src/interfaces/web/public/favicon/white/favicon.ico +0 -0
- package/src/interfaces/web/public/favicon/white/favicon.webp +0 -0
- package/src/interfaces/web/public/favicon/white/site.webmanifest +18 -0
- package/src/interfaces/web/public/logo/logo_dark.webp +0 -0
- package/src/interfaces/web/public/logo/logo_only_dark.webp +0 -0
- package/src/interfaces/web/public/logo/logo_only_white.webp +0 -0
- package/src/interfaces/web/public/logo/logo_vertical_dark.webp +0 -0
- package/src/interfaces/web/public/logo/logo_vertical_white.webp +0 -0
- package/src/interfaces/web/public/logo/logo_white.webp +0 -0
- package/src/interfaces/web/public/modules/superagent.png +0 -0
- package/src/interfaces/web/src/App.tsx +199 -0
- package/src/interfaces/web/src/components/AddProjectDialog.tsx +121 -0
- package/src/interfaces/web/src/components/ModelCombobox.tsx +96 -0
- package/src/interfaces/web/src/components/RobyBubble.tsx +213 -0
- package/src/interfaces/web/src/components/Section.tsx +44 -0
- package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +97 -0
- package/src/interfaces/web/src/components/TelegramSendDialog.tsx +48 -0
- package/src/interfaces/web/src/components/Toast.tsx +84 -0
- package/src/interfaces/web/src/components/UiSelect.tsx +74 -0
- package/src/interfaces/web/src/components/chat/Composer.tsx +43 -0
- package/src/interfaces/web/src/components/chat/ContextBar.tsx +111 -0
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +95 -0
- package/src/interfaces/web/src/components/chat/MessageList.tsx +35 -0
- package/src/interfaces/web/src/components/chat/ModelPicker.tsx +145 -0
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +141 -0
- package/src/interfaces/web/src/components/code/CodeChangesTab.tsx +87 -0
- package/src/interfaces/web/src/components/code/CodeComposer.tsx +87 -0
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +83 -0
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +39 -0
- package/src/interfaces/web/src/components/code/CodeSessionList.tsx +97 -0
- package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +44 -0
- package/src/interfaces/web/src/components/code/CodeToolTrail.tsx +29 -0
- package/src/interfaces/web/src/components/code/DiffView.tsx +67 -0
- package/src/interfaces/web/src/components/common/Qr.tsx +27 -0
- package/src/interfaces/web/src/components/common/TabLayout.tsx +46 -0
- package/src/interfaces/web/src/components/common/TabNav.tsx +113 -0
- package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +202 -0
- package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +42 -0
- package/src/interfaces/web/src/components/config/global-config-sections.ts +60 -0
- package/src/interfaces/web/src/components/config/project-config-sections.ts +58 -0
- package/src/interfaces/web/src/components/deck/DaemonCard.tsx +58 -0
- package/src/interfaces/web/src/components/deck/DesktopGroup.tsx +33 -0
- package/src/interfaces/web/src/components/deck/WidgetRow.tsx +100 -0
- package/src/interfaces/web/src/components/layout/Logo.tsx +59 -0
- package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +116 -0
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +151 -0
- package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +45 -0
- package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +72 -0
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +232 -0
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +60 -0
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +127 -0
- package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +69 -0
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +226 -0
- package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +175 -0
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +93 -0
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +90 -0
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +101 -0
- package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +100 -0
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +108 -0
- package/src/interfaces/web/src/components/settings/TelegramSettingsTabs.tsx +55 -0
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +95 -0
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +405 -0
- package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +155 -0
- package/src/interfaces/web/src/components/settings/providers/types.ts +26 -0
- package/src/interfaces/web/src/components/ui/accordion.tsx +72 -0
- package/src/interfaces/web/src/components/ui/alert-dialog.tsx +187 -0
- package/src/interfaces/web/src/components/ui/alert.tsx +76 -0
- package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +22 -0
- package/src/interfaces/web/src/components/ui/avatar.tsx +107 -0
- package/src/interfaces/web/src/components/ui/badge.tsx +52 -0
- package/src/interfaces/web/src/components/ui/breadcrumb.tsx +125 -0
- package/src/interfaces/web/src/components/ui/button-group.tsx +87 -0
- package/src/interfaces/web/src/components/ui/button.tsx +58 -0
- package/src/interfaces/web/src/components/ui/calendar.tsx +221 -0
- package/src/interfaces/web/src/components/ui/card.tsx +103 -0
- package/src/interfaces/web/src/components/ui/carousel.tsx +242 -0
- package/src/interfaces/web/src/components/ui/chart.tsx +371 -0
- package/src/interfaces/web/src/components/ui/chat-input.tsx +122 -0
- package/src/interfaces/web/src/components/ui/checkbox.tsx +29 -0
- package/src/interfaces/web/src/components/ui/collapsible.tsx +19 -0
- package/src/interfaces/web/src/components/ui/combobox.tsx +295 -0
- package/src/interfaces/web/src/components/ui/command.tsx +196 -0
- package/src/interfaces/web/src/components/ui/context-menu.tsx +271 -0
- package/src/interfaces/web/src/components/ui/dialog.tsx +158 -0
- package/src/interfaces/web/src/components/ui/direction.tsx +4 -0
- package/src/interfaces/web/src/components/ui/drawer.tsx +134 -0
- package/src/interfaces/web/src/components/ui/dropdown-menu.tsx +266 -0
- package/src/interfaces/web/src/components/ui/empty.tsx +104 -0
- package/src/interfaces/web/src/components/ui/field.tsx +236 -0
- package/src/interfaces/web/src/components/ui/hover-card.tsx +51 -0
- package/src/interfaces/web/src/components/ui/input-group.tsx +158 -0
- package/src/interfaces/web/src/components/ui/input-otp.tsx +85 -0
- package/src/interfaces/web/src/components/ui/input.tsx +20 -0
- package/src/interfaces/web/src/components/ui/item.tsx +201 -0
- package/src/interfaces/web/src/components/ui/kbd.tsx +26 -0
- package/src/interfaces/web/src/components/ui/label.tsx +20 -0
- package/src/interfaces/web/src/components/ui/menubar.tsx +280 -0
- package/src/interfaces/web/src/components/ui/native-select.tsx +61 -0
- package/src/interfaces/web/src/components/ui/navigation-menu.tsx +168 -0
- package/src/interfaces/web/src/components/ui/pagination.tsx +130 -0
- package/src/interfaces/web/src/components/ui/popover.tsx +88 -0
- package/src/interfaces/web/src/components/ui/progress.tsx +83 -0
- package/src/interfaces/web/src/components/ui/radio-group.tsx +36 -0
- package/src/interfaces/web/src/components/ui/resizable.tsx +50 -0
- package/src/interfaces/web/src/components/ui/scroll-area.tsx +53 -0
- package/src/interfaces/web/src/components/ui/select.tsx +201 -0
- package/src/interfaces/web/src/components/ui/separator.tsx +23 -0
- package/src/interfaces/web/src/components/ui/sheet.tsx +138 -0
- package/src/interfaces/web/src/components/ui/sidebar.tsx +723 -0
- package/src/interfaces/web/src/components/ui/skeleton.tsx +13 -0
- package/src/interfaces/web/src/components/ui/slider.tsx +52 -0
- package/src/interfaces/web/src/components/ui/sonner.tsx +49 -0
- package/src/interfaces/web/src/components/ui/spinner.tsx +10 -0
- package/src/interfaces/web/src/components/ui/switch.tsx +30 -0
- package/src/interfaces/web/src/components/ui/table.tsx +116 -0
- package/src/interfaces/web/src/components/ui/tabs.tsx +72 -0
- package/src/interfaces/web/src/components/ui/textarea.tsx +18 -0
- package/src/interfaces/web/src/components/ui/tip.tsx +21 -0
- package/src/interfaces/web/src/components/ui/toggle-group.tsx +87 -0
- package/src/interfaces/web/src/components/ui/toggle.tsx +45 -0
- package/src/interfaces/web/src/components/ui/tooltip.tsx +64 -0
- package/src/interfaces/web/src/components/ui.tsx +211 -0
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +197 -0
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +213 -0
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +72 -0
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +112 -0
- package/src/interfaces/web/src/components/voice/useTtsPlayer.ts +59 -0
- package/src/interfaces/web/src/constants/index.ts +91 -0
- package/src/interfaces/web/src/hooks/use-mobile.ts +19 -0
- package/src/interfaces/web/src/hooks/useChat.ts +276 -0
- package/src/interfaces/web/src/hooks/useDaemonStatus.ts +12 -0
- package/src/interfaces/web/src/hooks/useDevices.ts +12 -0
- package/src/interfaces/web/src/hooks/useEngines.ts +10 -0
- package/src/interfaces/web/src/hooks/useGlobalConfig.ts +24 -0
- package/src/interfaces/web/src/hooks/useIdentity.ts +16 -0
- package/src/interfaces/web/src/hooks/useProjects.ts +27 -0
- package/src/interfaces/web/src/hooks/useTelegram.ts +35 -0
- package/src/interfaces/web/src/hooks/useTheme.tsx +57 -0
- package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +122 -0
- package/src/interfaces/web/src/i18n/en.ts +767 -0
- package/src/interfaces/web/src/i18n/es.ts +770 -0
- package/src/interfaces/web/src/i18n/index.ts +86 -0
- package/src/interfaces/web/src/lib/api/admin.ts +30 -0
- package/src/interfaces/web/src/lib/api/agents.ts +46 -0
- package/src/interfaces/web/src/lib/api/code.ts +122 -0
- package/src/interfaces/web/src/lib/api/conversations.ts +16 -0
- package/src/interfaces/web/src/lib/api/deck.ts +106 -0
- package/src/interfaces/web/src/lib/api/desktop.ts +54 -0
- package/src/interfaces/web/src/lib/api/embeddings.ts +44 -0
- package/src/interfaces/web/src/lib/api/engines.ts +17 -0
- package/src/interfaces/web/src/lib/api/filesystem.ts +12 -0
- package/src/interfaces/web/src/lib/api/health.ts +6 -0
- package/src/interfaces/web/src/lib/api/identity.ts +7 -0
- package/src/interfaces/web/src/lib/api/mcps.ts +29 -0
- package/src/interfaces/web/src/lib/api/messages.ts +24 -0
- package/src/interfaces/web/src/lib/api/projects.ts +29 -0
- package/src/interfaces/web/src/lib/api/routines.ts +14 -0
- package/src/interfaces/web/src/lib/api/sessions.ts +16 -0
- package/src/interfaces/web/src/lib/api/super_agent.ts +29 -0
- package/src/interfaces/web/src/lib/api/tasks.ts +19 -0
- package/src/interfaces/web/src/lib/api/telegram.ts +57 -0
- package/src/interfaces/web/src/lib/api/tools.ts +13 -0
- package/src/interfaces/web/src/lib/api/voice.ts +169 -0
- package/src/interfaces/web/src/lib/api.ts +48 -0
- package/src/interfaces/web/src/lib/cn.ts +6 -0
- package/src/interfaces/web/src/lib/code-context.ts +83 -0
- package/src/interfaces/web/src/lib/config-values.ts +29 -0
- package/src/interfaces/web/src/lib/device.ts +10 -0
- package/src/interfaces/web/src/lib/http.ts +104 -0
- package/src/interfaces/web/src/lib/secrets.ts +15 -0
- package/src/interfaces/web/src/lib/utils.ts +6 -0
- package/src/interfaces/web/src/main.tsx +16 -0
- package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +174 -0
- package/src/interfaces/web/src/screens/PairingScreen.tsx +105 -0
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +178 -0
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +111 -0
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +274 -0
- package/src/interfaces/web/src/screens/base/ComingSoon.tsx +16 -0
- package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +53 -0
- package/src/interfaces/web/src/screens/base/LogsTab.tsx +188 -0
- package/src/interfaces/web/src/screens/base/ModelsTab.tsx +13 -0
- package/src/interfaces/web/src/screens/base/SessionsTab.tsx +58 -0
- package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +49 -0
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +295 -0
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +173 -0
- package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +304 -0
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +174 -0
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +152 -0
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +455 -0
- package/src/interfaces/web/src/screens/project/AgentsTab.tsx +364 -0
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +198 -0
- package/src/interfaces/web/src/screens/project/ConfigTab.tsx +94 -0
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +149 -0
- package/src/interfaces/web/src/screens/project/MemoriesTab.tsx +134 -0
- package/src/interfaces/web/src/screens/project/Overview.tsx +37 -0
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +386 -0
- package/src/interfaces/web/src/screens/project/TasksTab.tsx +116 -0
- package/src/interfaces/web/src/screens/project/TelegramTab.tsx +126 -0
- package/src/interfaces/web/src/screens/project/ThreadsTab.tsx +100 -0
- package/src/interfaces/web/src/styles.css +128 -0
- package/src/interfaces/web/src/types/daemon.ts +289 -0
- package/src/interfaces/web/tailwind.config.js +53 -0
- package/src/interfaces/web/tsconfig.json +24 -0
- package/src/interfaces/web/vite.config.ts +50 -0
- package/src/cli/commands/exec.js +0 -56
- package/src/cli/commands/overlay.js +0 -253
- package/src/cli/commands/session.js +0 -395
- package/src/cli/commands/sessions.js +0 -517
- package/src/cli/commands/telegram.js +0 -77
- package/src/cli/postinstall.js +0 -75
- package/src/cli-ts/commands/agent.ts +0 -173
- package/src/cli-ts/commands/chat.ts +0 -119
- package/src/cli-ts/commands/daemon.ts +0 -112
- package/src/cli-ts/commands/exec.ts +0 -109
- package/src/cli-ts/commands/mcp.ts +0 -235
- package/src/cli-ts/commands/session.ts +0 -224
- package/src/cli-ts/commands/status.ts +0 -61
- package/src/cli-ts/http.ts +0 -36
- package/src/cli-ts/index.ts +0 -73
- package/src/cli-ts/ui.ts +0 -107
- package/src/daemon/api.js +0 -1558
- package/src/daemon/engines/gemini.js +0 -56
- package/src/daemon/engines/openai.js +0 -79
- package/src/daemon/mcp-sources.js +0 -114
- package/src/daemon/super-agent-tools/index.js +0 -84
- package/src/daemon/super-agent-tools.js +0 -1
- package/src/daemon/super-agent.js +0 -541
- package/src/overlay/index.html +0 -44
- package/src/overlay/main.js +0 -480
- package/src/overlay/preload.js +0 -34
- package/src/overlay/renderer.js +0 -371
- package/src/overlay/style.css +0 -250
- package/src/tui/context/sync-apx.tsx +0 -284
- package/src/tui/routes/session/index.tsx +0 -274
- package/src/tui/routes/session/sidebar-apx.tsx +0 -90
- /package/src/{daemon → core}/tools/browser.js +0 -0
- /package/src/{daemon → core}/tools/fetch.js +0 -0
- /package/src/{daemon → core}/tools/glob.js +0 -0
- /package/src/{daemon → core}/tools/grep.js +0 -0
- /package/src/{daemon → core}/tools/registry.js +0 -0
- /package/src/{daemon → core}/tools/search.js +0 -0
- /package/src/{daemon → host/daemon}/conversations.js +0 -0
- /package/src/{daemon → host/daemon}/env-detect.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/_spawn.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/aider.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/claude-code.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/codex.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/cursor-agent.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/gemini-cli.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/index.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/opencode.js +0 -0
- /package/src/{daemon → host/daemon}/runtimes/qwen-code.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/call-mcp.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/edit-file.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-files.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-mcps.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-projects.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/list-skills.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/load-skill.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-agent-memory.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/read-file.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/run-shell.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/search-files.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/transcribe-audio.js +0 -0
- /package/src/{daemon → host/daemon}/super-agent-tools/tools/write-file.js +0 -0
- /package/src/{daemon → host/daemon}/thinking.js +0 -0
- /package/src/{daemon → host/daemon}/whisper-server.py +0 -0
- /package/src/{daemon → host/daemon}/whisper-transcribe.py +0 -0
- /package/src/{cli → interfaces/cli}/commands/a2a.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/artifact.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/chat.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/log.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/messages.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/plugins.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/routine.js +0 -0
- /package/src/{cli → interfaces/cli}/commands/runtime.js +0 -0
- /package/src/{cli → interfaces/cli}/terminal-chat/renderer.js +0 -0
- /package/src/{overlay → interfaces/desktop}/package.json +0 -0
- /package/src/{tui → interfaces/tui}/_shims/cli-error.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/cli-logo.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/cli-ui.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/config-console-state.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/core-any.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/core-binary.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/core-flag.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/core-log.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/lsp-language.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/opencode-any.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/opencode-sdk-v2.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/plugin-tui.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/prompt-display.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/provider-provider.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/session-retry.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/session-schema.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/session-session.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/snapshot.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/tool-any.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-error.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-filesystem.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-format.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-iife.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-locale.ts +0 -0
- /package/src/{tui → interfaces/tui}/_shims/util-process.ts +0 -0
- /package/src/{tui → interfaces/tui}/asset/charge.wav +0 -0
- /package/src/{tui → interfaces/tui}/asset/pulse-a.wav +0 -0
- /package/src/{tui → interfaces/tui}/asset/pulse-b.wav +0 -0
- /package/src/{tui → interfaces/tui}/asset/pulse-c.wav +0 -0
- /package/src/{tui → interfaces/tui}/attach.ts +0 -0
- /package/src/{tui → interfaces/tui}/component/bg-pulse-render.ts +0 -0
- /package/src/{tui → interfaces/tui}/component/bg-pulse.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/border.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-agent.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-console-org.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-mcp.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-model.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-provider.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-retry-action.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-session-delete-failed.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-session-list.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-session-rename.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-skill.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-stash.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-status.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-tag.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-theme-list.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-variant.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-workspace-create.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-workspace-file-changes.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/dialog-workspace-unavailable.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/error-component.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/logo.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/plugin-route-missing.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/autocomplete.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/cwd.ts +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/frecency.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/history.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/part.ts +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/stash.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/prompt/traits.ts +0 -0
- /package/src/{tui → interfaces/tui}/component/spinner.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/startup-loading.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/todo-item.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/use-connected.tsx +0 -0
- /package/src/{tui → interfaces/tui}/component/workspace-label.tsx +0 -0
- /package/src/{tui → interfaces/tui}/config/cwd.ts +0 -0
- /package/src/{tui → interfaces/tui}/config/keybind.ts +0 -0
- /package/src/{tui → interfaces/tui}/config/tui-migrate.ts +0 -0
- /package/src/{tui → interfaces/tui}/config/tui-schema.ts +0 -0
- /package/src/{tui → interfaces/tui}/config/tui.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/aggregate-failures.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/args.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/command-palette.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/directory.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/editor-zed.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/editor.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/event-apx.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/event.ts +0 -0
- /package/src/{tui → interfaces/tui}/context/exit.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/helper.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/kv.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/local.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/path-format.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/project-apx.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/project.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/prompt.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/route.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/sdk.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/sync-v2.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/sync.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/aura.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/ayu.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/carbonfox.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/catppuccin-frappe.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/catppuccin-macchiato.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/catppuccin.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/cobalt2.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/cursor.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/dracula.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/everforest.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/flexoki.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/github.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/gruvbox.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/kanagawa.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/lucent-orng.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/material.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/matrix.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/mercury.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/monokai.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/nightowl.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/nord.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/one-dark.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/opencode.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/orng.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/osaka-jade.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/palenight.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/rosepine.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/solarized.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/synthwave84.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/tokyonight.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/vercel.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/vesper.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme/zenburn.json +0 -0
- /package/src/{tui → interfaces/tui}/context/theme.tsx +0 -0
- /package/src/{tui → interfaces/tui}/context/tui-config.tsx +0 -0
- /package/src/{tui → interfaces/tui}/event.ts +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/home/footer.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/home/tips-view.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/home/tips.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/context.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/files.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/footer.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/lsp.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/mcp.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/sidebar/todo.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/system/plugins.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/system/session-v2.tsx +0 -0
- /package/src/{tui → interfaces/tui}/feature-plugins/system/which-key.tsx +0 -0
- /package/src/{tui → interfaces/tui}/keymap.tsx +0 -0
- /package/src/{tui → interfaces/tui}/layer.ts +0 -0
- /package/src/{tui → interfaces/tui}/plugin/api.tsx +0 -0
- /package/src/{tui → interfaces/tui}/plugin/command-shim.ts +0 -0
- /package/src/{tui → interfaces/tui}/plugin/internal.ts +0 -0
- /package/src/{tui → interfaces/tui}/plugin/runtime.ts +0 -0
- /package/src/{tui → interfaces/tui}/plugin/slots.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/home.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/dialog-fork-from-timeline.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/dialog-message.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/dialog-subagent.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/dialog-timeline.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/footer.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/permission.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/question.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/sidebar.tsx +0 -0
- /package/src/{tui → interfaces/tui}/routes/session/subagent-footer.tsx +0 -0
- /package/src/{tui → interfaces/tui}/run.ts +0 -0
- /package/src/{tui → interfaces/tui}/thread.ts +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-alert.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-confirm.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-export-options.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-help.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-prompt.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog-select.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/dialog.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/link.tsx +0 -0
- /package/src/{tui → interfaces/tui}/ui/spinner.ts +0 -0
- /package/src/{tui → interfaces/tui}/ui/toast.tsx +0 -0
- /package/src/{tui → interfaces/tui}/util/editor.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/model.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/provider-origin.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/revert-diff.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/scroll.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/selection.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/signal.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/sound.ts +0 -0
- /package/src/{tui → interfaces/tui}/util/transcript.ts +0 -0
- /package/src/{tui → interfaces/tui}/validate-session.ts +0 -0
- /package/src/{tui → interfaces/tui}/win32.ts +0 -0
- /package/src/{tui → interfaces/tui}/worker.ts +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createOpenAiCompatibleEngine } from "./openai-compatible.js";
|
|
2
|
+
|
|
3
|
+
export default createOpenAiCompatibleEngine({
|
|
4
|
+
id: "openrouter",
|
|
5
|
+
defaultBaseUrl: "https://openrouter.ai/api/v1",
|
|
6
|
+
apiKeyEnv: "OPENROUTER_API_KEY",
|
|
7
|
+
defaultFallbackModel: "openrouter:meta-llama/llama-3.3-70b-instruct",
|
|
8
|
+
});
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Git baseline helper for the Code module's "changes" view.
|
|
2
|
+
//
|
|
3
|
+
// A code session records a snapshot of the project's working tree when it
|
|
4
|
+
// starts (the "baseline"). The changes tab later diffs the CURRENT working
|
|
5
|
+
// tree against that baseline, so it shows ONLY what the session touched — not
|
|
6
|
+
// every pre-existing uncommitted change.
|
|
7
|
+
//
|
|
8
|
+
// Both snapshots are taken into a TEMPORARY git index (GIT_INDEX_FILE), so we
|
|
9
|
+
// never touch the user's real index or working tree. `git add -A` honours
|
|
10
|
+
// .gitignore, so ignored paths (node_modules, dist, …) stay out of the diff.
|
|
11
|
+
import { execFileSync } from "node:child_process";
|
|
12
|
+
import os from "node:os";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import { randomUUID } from "node:crypto";
|
|
16
|
+
|
|
17
|
+
function git(cwd, args, extraEnv = {}) {
|
|
18
|
+
return execFileSync("git", args, {
|
|
19
|
+
cwd,
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
22
|
+
env: { ...process.env, ...extraEnv },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function gitSafe(cwd, args, extraEnv = {}) {
|
|
27
|
+
try {
|
|
28
|
+
return git(cwd, args, extraEnv);
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isGitRepo(cwd) {
|
|
35
|
+
if (!cwd) return false;
|
|
36
|
+
const out = gitSafe(cwd, ["rev-parse", "--is-inside-work-tree"]);
|
|
37
|
+
return (out || "").trim() === "true";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Best-effort `git init` so the Code "changes" diff has something to compare
|
|
41
|
+
// against. Non-destructive: it only creates an empty .git (no commit, no index
|
|
42
|
+
// changes). Returns true if the directory is a git repo afterwards. Callers
|
|
43
|
+
// must guard against initializing dirs that shouldn't be repos (e.g. the apx
|
|
44
|
+
// home / default project).
|
|
45
|
+
export function initGitRepo(cwd) {
|
|
46
|
+
if (!cwd) return false;
|
|
47
|
+
if (isGitRepo(cwd)) return true;
|
|
48
|
+
gitSafe(cwd, ["init"]);
|
|
49
|
+
return isGitRepo(cwd);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function headSha(cwd) {
|
|
53
|
+
const out = gitSafe(cwd, ["rev-parse", "HEAD"]);
|
|
54
|
+
return out ? out.trim() : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Write the CURRENT working-tree state (tracked + untracked, minus .gitignore)
|
|
58
|
+
// to a fresh tree object using a throwaway index. Returns the tree sha.
|
|
59
|
+
function snapshotTree(cwd) {
|
|
60
|
+
const tmpIndex = path.join(os.tmpdir(), `apx-code-idx-${randomUUID()}`);
|
|
61
|
+
const env = { GIT_INDEX_FILE: tmpIndex };
|
|
62
|
+
try {
|
|
63
|
+
// Seed the temp index from HEAD when there is one (empty repos have none).
|
|
64
|
+
if (headSha(cwd)) gitSafe(cwd, ["read-tree", "HEAD"], env);
|
|
65
|
+
git(cwd, ["add", "-A"], env);
|
|
66
|
+
return git(cwd, ["write-tree"], env).trim();
|
|
67
|
+
} finally {
|
|
68
|
+
try {
|
|
69
|
+
fs.rmSync(tmpIndex, { force: true });
|
|
70
|
+
} catch {
|
|
71
|
+
/* ignore */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Capture a baseline of the project's working tree. Non-mutating.
|
|
78
|
+
* Returns { baselineCommit, baselineTree } or null when cwd isn't a git repo.
|
|
79
|
+
*/
|
|
80
|
+
export function captureBaseline(cwd) {
|
|
81
|
+
if (!isGitRepo(cwd)) return null;
|
|
82
|
+
let baselineTree;
|
|
83
|
+
try {
|
|
84
|
+
baselineTree = snapshotTree(cwd);
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// The commit object is best-effort (handy for debugging); the tree alone is
|
|
89
|
+
// enough to diff against. Force an identity so commit-tree never fails on a
|
|
90
|
+
// machine without user.name/email configured.
|
|
91
|
+
const idEnv = {
|
|
92
|
+
GIT_AUTHOR_NAME: "apx",
|
|
93
|
+
GIT_AUTHOR_EMAIL: "apx@local",
|
|
94
|
+
GIT_COMMITTER_NAME: "apx",
|
|
95
|
+
GIT_COMMITTER_EMAIL: "apx@local",
|
|
96
|
+
};
|
|
97
|
+
const parent = headSha(cwd);
|
|
98
|
+
const args = ["commit-tree", baselineTree, "-m", "apx code session baseline"];
|
|
99
|
+
if (parent) args.push("-p", parent);
|
|
100
|
+
const commit = gitSafe(cwd, args, idEnv);
|
|
101
|
+
return { baselineCommit: commit ? commit.trim() : null, baselineTree };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const STATUS_MAP = { A: "added", M: "modified", D: "deleted", T: "modified" };
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Diff the current working tree against a recorded baseline tree.
|
|
108
|
+
* Returns an array of { path, status, additions, deletions, patch }.
|
|
109
|
+
* Renames are split into add+delete (--no-renames) so the UI stays simple.
|
|
110
|
+
*/
|
|
111
|
+
export function diffAgainstBaseline(cwd, baselineTree) {
|
|
112
|
+
if (!baselineTree || !isGitRepo(cwd)) return [];
|
|
113
|
+
let currentTree;
|
|
114
|
+
try {
|
|
115
|
+
currentTree = snapshotTree(cwd);
|
|
116
|
+
} catch {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
if (currentTree === baselineTree) return [];
|
|
120
|
+
|
|
121
|
+
const base = ["diff", "--no-color", "--no-renames", baselineTree, currentTree];
|
|
122
|
+
|
|
123
|
+
// numstat: "<add>\t<del>\t<path>" (counts are "-" for binary files).
|
|
124
|
+
const counts = new Map();
|
|
125
|
+
const numstat = gitSafe(cwd, [...base, "--numstat"]) || "";
|
|
126
|
+
for (const line of numstat.split("\n")) {
|
|
127
|
+
if (!line.trim()) continue;
|
|
128
|
+
const [add, del, ...rest] = line.split("\t");
|
|
129
|
+
const p = rest.join("\t");
|
|
130
|
+
if (p) counts.set(p, { additions: add === "-" ? null : Number(add), deletions: del === "-" ? null : Number(del) });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// name-status drives the file list + status; patch is fetched per file.
|
|
134
|
+
const nameStatus = gitSafe(cwd, [...base, "--name-status"]) || "";
|
|
135
|
+
const files = [];
|
|
136
|
+
for (const line of nameStatus.split("\n")) {
|
|
137
|
+
if (!line.trim()) continue;
|
|
138
|
+
const [code, ...rest] = line.split("\t");
|
|
139
|
+
const p = rest.join("\t");
|
|
140
|
+
if (!p) continue;
|
|
141
|
+
const status = STATUS_MAP[code[0]] || "modified";
|
|
142
|
+
const patch = gitSafe(cwd, [...base, "--", p]) || "";
|
|
143
|
+
const c = counts.get(p) || { additions: null, deletions: null };
|
|
144
|
+
files.push({ path: p, status, additions: c.additions, deletions: c.deletions, patch });
|
|
145
|
+
}
|
|
146
|
+
return files;
|
|
147
|
+
}
|
package/src/core/identity.js
CHANGED
|
@@ -4,6 +4,14 @@ import os from "node:os";
|
|
|
4
4
|
|
|
5
5
|
export const IDENTITY_PATH = path.join(os.homedir(), ".apx", "identity.json");
|
|
6
6
|
|
|
7
|
+
// Stable machine id for the daemon-level "super-agent" mode. Never tied to the
|
|
8
|
+
// persona name, so renaming the persona (identity.json) doesn't break message
|
|
9
|
+
// attribution / history queries.
|
|
10
|
+
export const SUPERAGENT_ACTOR_ID = "super_agent";
|
|
11
|
+
|
|
12
|
+
// Shown when no persona is configured yet. Brand of the app, not a persona.
|
|
13
|
+
export const SUPERAGENT_DISPLAY_FALLBACK = "APX";
|
|
14
|
+
|
|
7
15
|
export function readIdentity() {
|
|
8
16
|
try {
|
|
9
17
|
return JSON.parse(fs.readFileSync(IDENTITY_PATH, "utf8"));
|
|
@@ -12,6 +20,19 @@ export function readIdentity() {
|
|
|
12
20
|
}
|
|
13
21
|
}
|
|
14
22
|
|
|
23
|
+
// Resolve the super-agent's DISPLAY name (the persona shown to users). Order:
|
|
24
|
+
// identity.json persona → legacy super_agent.name → "APX". This is the single
|
|
25
|
+
// source of truth for "what is the super-agent called"; callers must not read
|
|
26
|
+
// super_agent.name directly. The stable id for storage is SUPERAGENT_ACTOR_ID.
|
|
27
|
+
export function resolveAgentName(globalConfig = {}) {
|
|
28
|
+
const identity = readIdentity();
|
|
29
|
+
return (
|
|
30
|
+
identity?.agent_name ||
|
|
31
|
+
globalConfig?.super_agent?.name ||
|
|
32
|
+
SUPERAGENT_DISPLAY_FALLBACK
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
15
36
|
export function writeIdentity(fields) {
|
|
16
37
|
const existing = readIdentity() || {};
|
|
17
38
|
const now = new Date().toISOString();
|
package/src/core/logging.js
CHANGED
|
@@ -5,7 +5,7 @@ import { APX_HOME } from "./config.js";
|
|
|
5
5
|
export const LOG_DIR = path.join(APX_HOME, "logs");
|
|
6
6
|
export const ERROR_TRACE_PATH = path.join(LOG_DIR, "errors.jsonl");
|
|
7
7
|
// Unified daemon log. Every module (daemon, telegram, whisper, super-agent,
|
|
8
|
-
// tools,
|
|
8
|
+
// tools, desktop) writes here with one consistent format so the user can
|
|
9
9
|
// follow the whole system from a single tail.
|
|
10
10
|
export const APX_LOG_PATH = path.join(LOG_DIR, "apx.log");
|
|
11
11
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export {
|
|
2
|
+
loadAll,
|
|
3
|
+
readApfMcps,
|
|
4
|
+
writeApfMcps,
|
|
5
|
+
readRuntimeMcps,
|
|
6
|
+
writeRuntimeMcps,
|
|
7
|
+
readGlobalMcps,
|
|
8
|
+
writeGlobalMcps,
|
|
9
|
+
runtimeMcpsPath,
|
|
10
|
+
globalMcpsPath,
|
|
11
|
+
SOURCES,
|
|
12
|
+
PROJECT_SOURCES,
|
|
13
|
+
} from "./sources.js";
|
|
14
|
+
export { McpRegistry } from "./runner.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// MCP runner: spawn child MCP processes and proxy JSON-RPC tools/call.
|
|
2
2
|
// Speaks the stdio transport: newline-delimited JSON-RPC 2.0 messages.
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
|
-
import { loadAll } from "./
|
|
4
|
+
import { loadAll } from "./sources.js";
|
|
5
5
|
|
|
6
6
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
7
7
|
|
|
@@ -158,17 +158,29 @@ function entryToMeta(e) {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
export class McpRegistry {
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
// Accepts either the project path string (back-compat) or an object
|
|
162
|
+
// { projectPath, storagePath } so the runtime scope can be aggregated.
|
|
163
|
+
constructor(arg) {
|
|
164
|
+
if (typeof arg === "string" || arg == null) {
|
|
165
|
+
this.projectPath = arg || null;
|
|
166
|
+
this.storagePath = null;
|
|
167
|
+
} else {
|
|
168
|
+
this.projectPath = arg.projectPath || null;
|
|
169
|
+
this.storagePath = arg.storagePath || null;
|
|
170
|
+
}
|
|
163
171
|
this.processes = new Map(); // mcp name -> McpProcess
|
|
164
172
|
}
|
|
165
173
|
|
|
174
|
+
_load() {
|
|
175
|
+
return loadAll(this.projectPath, { storagePath: this.storagePath });
|
|
176
|
+
}
|
|
177
|
+
|
|
166
178
|
list() {
|
|
167
|
-
return
|
|
179
|
+
return this._load().entries.map(entryToMeta);
|
|
168
180
|
}
|
|
169
181
|
|
|
170
182
|
conflicts() {
|
|
171
|
-
return
|
|
183
|
+
return this._load().conflicts;
|
|
172
184
|
}
|
|
173
185
|
|
|
174
186
|
evict(name) {
|
|
@@ -180,7 +192,7 @@ export class McpRegistry {
|
|
|
180
192
|
}
|
|
181
193
|
|
|
182
194
|
getByName(name) {
|
|
183
|
-
const e =
|
|
195
|
+
const e = this._load().entries.find((x) => x.name === name);
|
|
184
196
|
return e ? entryToMeta(e) : null;
|
|
185
197
|
}
|
|
186
198
|
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// Multi-source MCP discovery: read MCPs from three primary APX scopes plus
|
|
2
|
+
// configs from coexisting AI tools (Cursor, Claude Code, VS Code, Roo, etc.).
|
|
3
|
+
// All discoverable files are read-only; APX-owned writes target apc / runtime /
|
|
4
|
+
// global only.
|
|
5
|
+
//
|
|
6
|
+
// APX scopes (writable by APX):
|
|
7
|
+
// 1. runtime — <storagePath>/mcps.json (a.k.a. ~/.apx/projects/<apxId>/mcps.json)
|
|
8
|
+
// Per-project, machine-local, NEVER committed. Holds tokens and
|
|
9
|
+
// user-specific endpoints. File is chmod 0600.
|
|
10
|
+
// 2. apc — .apc/mcps.json in the repo. Project-shared, committable.
|
|
11
|
+
// 3. global — ~/.apx/mcps.json (machine-wide). Shared across projects on
|
|
12
|
+
// this machine, not committed.
|
|
13
|
+
//
|
|
14
|
+
// Foreign-IDE scopes (read-only, never written by APX):
|
|
15
|
+
// claude — .mcp.json key: mcpServers
|
|
16
|
+
// cursor — .cursor/mcp.json key: mcpServers
|
|
17
|
+
// vscode — .vscode/mcp.json key: servers (different!)
|
|
18
|
+
// roo — .roo/mcp.json key: mcpServers
|
|
19
|
+
// gemini — .gemini/settings.json key: mcpServers
|
|
20
|
+
//
|
|
21
|
+
// Priority (first wins by name; conflicts are reported):
|
|
22
|
+
// 1. runtime (highest — per-project secrets win)
|
|
23
|
+
// 2. apc (project-shared)
|
|
24
|
+
// 3. claude
|
|
25
|
+
// 4. cursor
|
|
26
|
+
// 5. vscode
|
|
27
|
+
// 6. roo
|
|
28
|
+
// 7. gemini
|
|
29
|
+
// 8. global (lowest — machine-wide fallback)
|
|
30
|
+
//
|
|
31
|
+
// Each entry returns:
|
|
32
|
+
// { name, source, command?, args?, env?, url?, headers?, enabled, raw }
|
|
33
|
+
// `enabled` is APC's extension. Falls back to !disabled if the source uses that
|
|
34
|
+
// instead, then to true.
|
|
35
|
+
|
|
36
|
+
import fs from "node:fs";
|
|
37
|
+
import os from "node:os";
|
|
38
|
+
import path from "node:path";
|
|
39
|
+
|
|
40
|
+
const APX_HOME = path.join(os.homedir(), ".apx");
|
|
41
|
+
const GLOBAL_MCPS_FILE = path.join(APX_HOME, "mcps.json");
|
|
42
|
+
const RUNTIME_MCPS_FILENAME = "mcps.json";
|
|
43
|
+
|
|
44
|
+
// Project-relative sources (file path resolved against projectRoot).
|
|
45
|
+
// `id: 'apc'` is APX's primary project-shared store. The rest are read-only
|
|
46
|
+
// foreign IDE configs included so APC sees what the user already configured.
|
|
47
|
+
export const PROJECT_SOURCES = [
|
|
48
|
+
{ id: "apc", file: ".apc/mcps.json", key: "mcpServers" },
|
|
49
|
+
{ id: "claude", file: ".mcp.json", key: "mcpServers" },
|
|
50
|
+
{ id: "cursor", file: ".cursor/mcp.json", key: "mcpServers" },
|
|
51
|
+
{ id: "vscode", file: ".vscode/mcp.json", key: "servers" },
|
|
52
|
+
{ id: "roo", file: ".roo/mcp.json", key: "mcpServers" },
|
|
53
|
+
{ id: "gemini", file: ".gemini/settings.json", key: "mcpServers" },
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// SOURCES is the full ordered list (for discovery/check). Runtime path depends
|
|
57
|
+
// on the storagePath of the project; we expose a placeholder entry whose
|
|
58
|
+
// `file` is left as a hint, but the actual read path is computed in loadAll.
|
|
59
|
+
export const SOURCES = [
|
|
60
|
+
{ id: "runtime", file: "~/.apx/projects/<apxId>/mcps.json", key: "mcpServers", scope: "runtime" },
|
|
61
|
+
...PROJECT_SOURCES.map((s) => ({ ...s, scope: "project" })),
|
|
62
|
+
{ id: "global", file: "~/.apx/mcps.json", key: "mcpServers", scope: "global" },
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
function readJsonSafe(absPath) {
|
|
66
|
+
if (!absPath) return null;
|
|
67
|
+
if (!fs.existsSync(absPath)) return null;
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(fs.readFileSync(absPath, "utf8"));
|
|
70
|
+
} catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Resolve the runtime mcps.json path for a given project. `storagePath` is the
|
|
76
|
+
// project's ~/.apx/projects/<apxId>/ directory.
|
|
77
|
+
export function runtimeMcpsPath(storagePath) {
|
|
78
|
+
if (!storagePath) return null;
|
|
79
|
+
return path.join(storagePath, RUNTIME_MCPS_FILENAME);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function globalMcpsPath() {
|
|
83
|
+
return GLOBAL_MCPS_FILE;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Aggregate all MCP sources for a project, in priority order.
|
|
87
|
+
// Backwards-compatible call signature: loadAll(projectRoot) still works.
|
|
88
|
+
// loadAll(projectRoot) // no runtime
|
|
89
|
+
// loadAll(projectRoot, { storagePath }) // include runtime if file exists
|
|
90
|
+
export function loadAll(projectRoot, opts = {}) {
|
|
91
|
+
const storagePath = opts.storagePath || null;
|
|
92
|
+
const merged = new Map(); // name -> entry (first writer wins)
|
|
93
|
+
const conflicts = []; // [{name, winner, loser}]
|
|
94
|
+
const sourceMap = {}; // sourceId -> count
|
|
95
|
+
|
|
96
|
+
const pipeline = [];
|
|
97
|
+
|
|
98
|
+
// 1. runtime (highest)
|
|
99
|
+
if (storagePath) {
|
|
100
|
+
pipeline.push({
|
|
101
|
+
id: "runtime",
|
|
102
|
+
abs: runtimeMcpsPath(storagePath),
|
|
103
|
+
key: "mcpServers",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 2..N. project-relative sources (apc + IDE configs)
|
|
108
|
+
if (projectRoot) {
|
|
109
|
+
for (const src of PROJECT_SOURCES) {
|
|
110
|
+
pipeline.push({
|
|
111
|
+
id: src.id,
|
|
112
|
+
abs: path.join(projectRoot, src.file),
|
|
113
|
+
key: src.key,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// last. global
|
|
119
|
+
pipeline.push({
|
|
120
|
+
id: "global",
|
|
121
|
+
abs: GLOBAL_MCPS_FILE,
|
|
122
|
+
key: "mcpServers",
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
for (const src of pipeline) {
|
|
126
|
+
const raw = readJsonSafe(src.abs);
|
|
127
|
+
if (!raw) continue;
|
|
128
|
+
const dict = raw[src.key] || {};
|
|
129
|
+
sourceMap[src.id] = 0;
|
|
130
|
+
for (const [name, server] of Object.entries(dict)) {
|
|
131
|
+
sourceMap[src.id]++;
|
|
132
|
+
const entry = normalize(name, server, src.id);
|
|
133
|
+
if (merged.has(name)) {
|
|
134
|
+
const winner = merged.get(name);
|
|
135
|
+
conflicts.push({
|
|
136
|
+
name,
|
|
137
|
+
winner: winner.source,
|
|
138
|
+
loser: src.id,
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
merged.set(name, entry);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
entries: Array.from(merged.values()),
|
|
147
|
+
conflicts,
|
|
148
|
+
sourceCounts: sourceMap,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function normalize(name, server, sourceId) {
|
|
153
|
+
const enabled =
|
|
154
|
+
server.enabled === false
|
|
155
|
+
? false
|
|
156
|
+
: server.disabled === true
|
|
157
|
+
? false
|
|
158
|
+
: true;
|
|
159
|
+
return {
|
|
160
|
+
name,
|
|
161
|
+
source: sourceId,
|
|
162
|
+
command: server.command || null,
|
|
163
|
+
args: server.args || [],
|
|
164
|
+
env: server.env || {},
|
|
165
|
+
url: server.url || null,
|
|
166
|
+
headers: server.headers || null,
|
|
167
|
+
transport: server.url ? "http" : "stdio",
|
|
168
|
+
enabled,
|
|
169
|
+
raw: server,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
// apc scope (project-shared, .apc/mcps.json)
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
|
|
177
|
+
export function readApfMcps(projectRoot) {
|
|
178
|
+
const p = path.join(projectRoot, ".apc", "mcps.json");
|
|
179
|
+
if (!fs.existsSync(p)) return { mcpServers: {} };
|
|
180
|
+
try {
|
|
181
|
+
const json = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
182
|
+
if (!json.mcpServers) json.mcpServers = {};
|
|
183
|
+
return json;
|
|
184
|
+
} catch {
|
|
185
|
+
return { mcpServers: {} };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function writeApfMcps(projectRoot, json) {
|
|
190
|
+
const p = path.join(projectRoot, ".apc", "mcps.json");
|
|
191
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
192
|
+
fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// runtime scope (per-project, ~/.apx/projects/<apxId>/mcps.json)
|
|
197
|
+
// File is chmod 0600 — may contain tokens.
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
|
|
200
|
+
export function readRuntimeMcps(storagePath) {
|
|
201
|
+
if (!storagePath) return { mcpServers: {} };
|
|
202
|
+
const p = runtimeMcpsPath(storagePath);
|
|
203
|
+
if (!fs.existsSync(p)) return { mcpServers: {} };
|
|
204
|
+
try {
|
|
205
|
+
const json = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
206
|
+
if (!json.mcpServers) json.mcpServers = {};
|
|
207
|
+
return json;
|
|
208
|
+
} catch {
|
|
209
|
+
return { mcpServers: {} };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function writeRuntimeMcps(storagePath, json) {
|
|
214
|
+
if (!storagePath) throw new Error("writeRuntimeMcps: storagePath required");
|
|
215
|
+
const p = runtimeMcpsPath(storagePath);
|
|
216
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
217
|
+
fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
|
|
218
|
+
// Tokens may live in this file — protect it.
|
|
219
|
+
try {
|
|
220
|
+
fs.chmodSync(p, 0o600);
|
|
221
|
+
} catch {
|
|
222
|
+
// chmod is a best-effort on non-POSIX FS (Windows). Ignore errors.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// global scope (machine-wide, ~/.apx/mcps.json)
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
export function readGlobalMcps() {
|
|
231
|
+
const p = GLOBAL_MCPS_FILE;
|
|
232
|
+
if (!fs.existsSync(p)) return { mcpServers: {} };
|
|
233
|
+
try {
|
|
234
|
+
const json = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
235
|
+
if (!json.mcpServers) json.mcpServers = {};
|
|
236
|
+
return json;
|
|
237
|
+
} catch {
|
|
238
|
+
return { mcpServers: {} };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function writeGlobalMcps(json) {
|
|
243
|
+
const p = GLOBAL_MCPS_FILE;
|
|
244
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
245
|
+
fs.writeFileSync(p, JSON.stringify(json, null, 2) + "\n");
|
|
246
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// "Hilos activos en otros canales" — a tiny, recency-based awareness block.
|
|
2
|
+
//
|
|
3
|
+
// Unlike the Memory Broker (semantic RAG + remembered notes), this reads the
|
|
4
|
+
// raw cross-channel message log and surfaces the most recent turn from every
|
|
5
|
+
// channel OTHER than the one the user is on right now, within a short window.
|
|
6
|
+
// It fills the gap where a vague "seguimos?" on the web wouldn't semantically
|
|
7
|
+
// match the deploy thread you had on Telegram 12 minutes ago.
|
|
8
|
+
//
|
|
9
|
+
// Bounded + best-effort: only appears when there's recent cross-channel
|
|
10
|
+
// activity, capped at max_lines bullets. Never throws into the request path.
|
|
11
|
+
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import { GLOBAL_MESSAGES_DIR } from "../config.js";
|
|
15
|
+
import { parseDayJsonl } from "../messages-store.js";
|
|
16
|
+
|
|
17
|
+
const BODY_CAP = 70;
|
|
18
|
+
|
|
19
|
+
function ago(ts) {
|
|
20
|
+
const then = Date.parse(ts);
|
|
21
|
+
if (!Number.isFinite(then)) return "";
|
|
22
|
+
const mins = Math.max(0, Math.round((Date.now() - then) / 60000));
|
|
23
|
+
if (mins < 60) return `hace ${mins} min`;
|
|
24
|
+
const hrs = Math.round(mins / 60);
|
|
25
|
+
return `hace ${hrs} h`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Prefer the last USER turn (most recognizable for "lo de antes"); fall back to
|
|
29
|
+
// the last agent turn. Skip tool/system/compact noise and tiny bodies.
|
|
30
|
+
function lastMeaningfulTurn(records) {
|
|
31
|
+
const pick = (pred) => {
|
|
32
|
+
for (let i = records.length - 1; i >= 0; i--) {
|
|
33
|
+
const r = records[i];
|
|
34
|
+
if (!r || r.type === "tool" || r.type === "system" || r.type === "compact") continue;
|
|
35
|
+
if (!pred(r)) continue;
|
|
36
|
+
const body = String(r.body || "").trim();
|
|
37
|
+
if (body.length >= 4) return r;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
};
|
|
41
|
+
return (
|
|
42
|
+
pick((r) => r.type === "user" || r.direction === "in") ||
|
|
43
|
+
pick(() => true)
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function readChannelRecentTurn(baseDir, channel, sinceMs) {
|
|
48
|
+
const dir = path.join(baseDir, channel);
|
|
49
|
+
let files;
|
|
50
|
+
try {
|
|
51
|
+
files = fs.readdirSync(dir).filter((f) => f.endsWith(".jsonl")).sort();
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (!files.length) return null;
|
|
56
|
+
// Last 2 day files cover a window that crosses midnight without reading all.
|
|
57
|
+
let records = [];
|
|
58
|
+
for (const f of files.slice(-2)) {
|
|
59
|
+
try {
|
|
60
|
+
records = records.concat(parseDayJsonl(fs.readFileSync(path.join(dir, f), "utf8")));
|
|
61
|
+
} catch {
|
|
62
|
+
/* skip bad file */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const turn = lastMeaningfulTurn(records);
|
|
66
|
+
if (!turn) return null;
|
|
67
|
+
const t = Date.parse(turn.ts);
|
|
68
|
+
if (!Number.isFinite(t) || t < sinceMs) return null;
|
|
69
|
+
return turn;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Build the "# Hilos activos en otros canales" block. Returns "" when there's
|
|
73
|
+
// nothing recent on another channel (or the feature is disabled).
|
|
74
|
+
export function buildActiveThreadsBlock(currentChannel, { config, messagesDir } = {}) {
|
|
75
|
+
try {
|
|
76
|
+
const cfg = config?.memory?.active_threads || {};
|
|
77
|
+
if (cfg.enabled === false) return "";
|
|
78
|
+
const windowHours = cfg.window_hours || 6;
|
|
79
|
+
const maxLines = cfg.max_lines || 3;
|
|
80
|
+
const sinceMs = Date.now() - windowHours * 3600_000;
|
|
81
|
+
const baseDir = messagesDir || GLOBAL_MESSAGES_DIR;
|
|
82
|
+
|
|
83
|
+
let channels;
|
|
84
|
+
try {
|
|
85
|
+
channels = fs
|
|
86
|
+
.readdirSync(baseDir, { withFileTypes: true })
|
|
87
|
+
.filter((d) => d.isDirectory())
|
|
88
|
+
.map((d) => d.name);
|
|
89
|
+
} catch {
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const cur = String(currentChannel || "");
|
|
94
|
+
const rows = [];
|
|
95
|
+
for (const ch of channels) {
|
|
96
|
+
if (ch === cur) continue;
|
|
97
|
+
const turn = readChannelRecentTurn(baseDir, ch, sinceMs);
|
|
98
|
+
if (!turn) continue;
|
|
99
|
+
rows.push({
|
|
100
|
+
channel: ch,
|
|
101
|
+
ts: turn.ts,
|
|
102
|
+
body: String(turn.body || "").replace(/\s+/g, " ").trim(),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (!rows.length) return "";
|
|
106
|
+
rows.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));
|
|
107
|
+
|
|
108
|
+
const lines = rows.slice(0, maxLines).map((r) => {
|
|
109
|
+
const body = r.body.length > BODY_CAP ? r.body.slice(0, BODY_CAP - 1).trimEnd() + "…" : r.body;
|
|
110
|
+
return `• ${r.channel} — ${ago(r.ts)}: "${body}"`;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return [
|
|
114
|
+
"# Hilos activos en otros canales",
|
|
115
|
+
'Charlas recientes en otras superficies (NO es este chat). Si el usuario dice',
|
|
116
|
+
'"seguimos" / "lo de antes" / "lo de telegram", probablemente sea uno de estos —',
|
|
117
|
+
"retomalo naturalmente; usá search_messages para el detalle exacto.",
|
|
118
|
+
"",
|
|
119
|
+
...lines,
|
|
120
|
+
].join("\n");
|
|
121
|
+
} catch {
|
|
122
|
+
return "";
|
|
123
|
+
}
|
|
124
|
+
}
|