@agentprojectcontext/apx 1.25.0 → 1.27.2
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
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Desktop plugin — voice/floating-window channel for the APX daemon.
|
|
2
2
|
//
|
|
3
3
|
// This plugin:
|
|
4
|
-
// 1. Registers as a super-agent channel (type "
|
|
5
|
-
// 2. Routes inbound messages (POST /
|
|
6
|
-
// 3. Streams tokens + tool events back to
|
|
4
|
+
// 1. Registers as a super-agent channel (type "desktop")
|
|
5
|
+
// 2. Routes inbound messages (POST /desktop/message) to the super-agent
|
|
6
|
+
// 3. Streams tokens + tool events back to desktop clients via WebSocket
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
// Each new
|
|
8
|
+
// Desktop history is kept in-memory per session (not persisted to disk).
|
|
9
|
+
// Each new desktop window starts a fresh session.
|
|
10
10
|
//
|
|
11
11
|
// Config (in ~/.apx/config.json):
|
|
12
|
-
// "
|
|
12
|
+
// "desktop": {
|
|
13
13
|
// "enabled": true,
|
|
14
14
|
// "route_to_agent": "", // leave empty = use super-agent
|
|
15
15
|
// "model": "", // override model; leave empty = super-agent.model
|
|
16
16
|
// "max_history": 20 // turns to keep in context
|
|
17
17
|
// }
|
|
18
|
+
// (legacy "overlay" block is still read as a fallback)
|
|
18
19
|
|
|
19
20
|
import {
|
|
20
|
-
|
|
21
|
+
broadcastDesktop,
|
|
21
22
|
sendToClient,
|
|
22
|
-
|
|
23
|
-
} from "../
|
|
23
|
+
setDesktopMessageHandler,
|
|
24
|
+
} from "../desktop-ws.js";
|
|
24
25
|
import { runSuperAgent, isSuperAgentEnabled } from "../super-agent.js";
|
|
25
|
-
import { appendGlobalMessage } from "
|
|
26
|
+
import { appendGlobalMessage } from "../../../core/messages-store.js";
|
|
26
27
|
|
|
27
|
-
const CHANNEL = "
|
|
28
|
+
const CHANNEL = "desktop";
|
|
28
29
|
|
|
29
30
|
export default {
|
|
30
|
-
id: "
|
|
31
|
+
id: "desktop",
|
|
31
32
|
|
|
32
33
|
init({ projects, config, log, plugins }) {
|
|
33
|
-
const cfg = config.overlay || {};
|
|
34
|
+
const cfg = config.desktop || config.overlay || {};
|
|
34
35
|
const enabled = cfg.enabled !== false; // enabled by default
|
|
35
36
|
|
|
36
37
|
// In-memory conversation history per connected client.
|
|
@@ -42,13 +43,13 @@ export default {
|
|
|
42
43
|
return histories.get(ws);
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
// Handle messages sent from the
|
|
46
|
-
|
|
46
|
+
// Handle messages sent from the desktop renderer via WebSocket
|
|
47
|
+
setDesktopMessageHandler(async (ws, data) => {
|
|
47
48
|
if (data.type === "message") {
|
|
48
49
|
await _handleMessage({ ws, text: data.text, previousMessages: getHistory(ws) }, { projects, config, log, plugins, cfg, histories });
|
|
49
50
|
} else if (data.type === "cancel") {
|
|
50
51
|
// Signal to abort current generation (handled via AbortController below)
|
|
51
|
-
ws.
|
|
52
|
+
ws._desktopAbort?.abort();
|
|
52
53
|
} else if (data.type === "ping") {
|
|
53
54
|
sendToClient(ws, { type: "pong" });
|
|
54
55
|
}
|
|
@@ -56,15 +57,15 @@ export default {
|
|
|
56
57
|
|
|
57
58
|
const instance = {
|
|
58
59
|
start() {
|
|
59
|
-
if (enabled) log("
|
|
60
|
+
if (enabled) log("desktop: plugin started");
|
|
60
61
|
},
|
|
61
62
|
stop() {},
|
|
62
63
|
status() { return { enabled }; },
|
|
63
64
|
|
|
64
|
-
// Called by the /
|
|
65
|
+
// Called by the /desktop/message REST endpoint
|
|
65
66
|
async handleMessage({ text, previousMessages = [] }) {
|
|
66
|
-
if (!enabled) throw new Error("
|
|
67
|
-
|
|
67
|
+
if (!enabled) throw new Error("desktop plugin not enabled");
|
|
68
|
+
broadcastDesktop({ type: "user_message", text });
|
|
68
69
|
await _handleMessage({ ws: null, text, previousMessages }, { projects, config, log, plugins, cfg, histories });
|
|
69
70
|
},
|
|
70
71
|
};
|
|
@@ -89,14 +90,14 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
89
90
|
|
|
90
91
|
// AbortController for cancel support
|
|
91
92
|
const controller = new AbortController();
|
|
92
|
-
if (ws) ws.
|
|
93
|
+
if (ws) ws._desktopAbort = controller;
|
|
93
94
|
|
|
94
95
|
// Emit "thinking" indicator
|
|
95
96
|
_send(ws, { type: "thinking" });
|
|
96
97
|
|
|
97
|
-
// Persist to
|
|
98
|
+
// Persist to desktop message log
|
|
98
99
|
try {
|
|
99
|
-
await appendGlobalMessage(CHANNEL,
|
|
100
|
+
await appendGlobalMessage({ channel: CHANNEL, direction: "in", type: "user", author: "user", body: text });
|
|
100
101
|
} catch {}
|
|
101
102
|
|
|
102
103
|
let fullResponse = "";
|
|
@@ -107,12 +108,15 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
107
108
|
throw new Error("super-agent not enabled — set super_agent.enabled + super_agent.model in ~/.apx/config.json");
|
|
108
109
|
}
|
|
109
110
|
|
|
111
|
+
log(`desktop: super-agent turn start — model=${cfg.model || config?.super_agent?.model || "(default)"} text="${text.slice(0, 60)}"`);
|
|
112
|
+
const t0 = Date.now();
|
|
110
113
|
const result = await runSuperAgent({
|
|
111
114
|
globalConfig: config,
|
|
112
115
|
projects,
|
|
113
116
|
plugins,
|
|
114
117
|
prompt: text,
|
|
115
|
-
|
|
118
|
+
channel: "desktop",
|
|
119
|
+
channelMeta: { voice: true }, // desktop module is voice-first → spoken mode
|
|
116
120
|
previousMessages: history.slice(0, -1),
|
|
117
121
|
overrideModel: cfg.model || null,
|
|
118
122
|
signal: controller.signal,
|
|
@@ -134,6 +138,7 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
134
138
|
},
|
|
135
139
|
});
|
|
136
140
|
const finalText = fullResponse || result.text || "";
|
|
141
|
+
log(`desktop: super-agent turn done in ${Date.now() - t0}ms text_len=${finalText.length}`);
|
|
137
142
|
|
|
138
143
|
// Emit done with full text
|
|
139
144
|
_send(ws, { type: "done", text: finalText });
|
|
@@ -150,14 +155,17 @@ async function _handleMessage({ ws, text, previousMessages }, { projects, config
|
|
|
150
155
|
|
|
151
156
|
// Persist assistant response
|
|
152
157
|
try {
|
|
153
|
-
await appendGlobalMessage(CHANNEL,
|
|
158
|
+
await appendGlobalMessage({ channel: CHANNEL, direction: "out", type: "agent", body: finalText });
|
|
154
159
|
} catch {}
|
|
155
160
|
|
|
156
161
|
} catch (e) {
|
|
157
162
|
if (e.name === "AbortError") {
|
|
158
163
|
_send(ws, { type: "cancelled" });
|
|
159
164
|
} else {
|
|
160
|
-
|
|
165
|
+
// Verbose stack — the previous one-liner hid root causes when the
|
|
166
|
+
// model adapter threw inside runSuperAgent's promise chain.
|
|
167
|
+
log(`desktop: error — ${e.message}`);
|
|
168
|
+
console.error("desktop plugin: super-agent threw:", e.stack || e);
|
|
161
169
|
_send(ws, { type: "error", message: e.message });
|
|
162
170
|
}
|
|
163
171
|
}
|
|
@@ -167,7 +175,7 @@ function _send(ws, msg) {
|
|
|
167
175
|
if (ws) {
|
|
168
176
|
sendToClient(ws, msg);
|
|
169
177
|
} else {
|
|
170
|
-
|
|
178
|
+
broadcastDesktop(msg);
|
|
171
179
|
}
|
|
172
180
|
}
|
|
173
181
|
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
// Plugins are discovered by static import here. Adding a new plugin = importing
|
|
14
14
|
// it and pushing into PLUGINS.
|
|
15
15
|
import telegramPlugin from "./telegram.js";
|
|
16
|
-
import
|
|
16
|
+
import desktopPlugin from "./desktop.js";
|
|
17
17
|
|
|
18
|
-
export const PLUGINS = [telegramPlugin,
|
|
18
|
+
export const PLUGINS = [telegramPlugin, desktopPlugin];
|
|
19
19
|
|
|
20
20
|
export class PluginManager {
|
|
21
21
|
constructor({ projects, config, log, registries }) {
|
|
@@ -29,18 +29,59 @@
|
|
|
29
29
|
|
|
30
30
|
import fs from "node:fs";
|
|
31
31
|
import path from "node:path";
|
|
32
|
-
import { TELEGRAM_STATE_PATH, APX_HOME } from "
|
|
33
|
-
import { callEngine } from "
|
|
32
|
+
import { TELEGRAM_STATE_PATH, APX_HOME } from "../../../core/config.js";
|
|
33
|
+
import { callEngine } from "../../../core/engines/index.js";
|
|
34
34
|
import { runSuperAgent, isSuperAgentEnabled } from "../super-agent.js";
|
|
35
35
|
import { stripThinking } from "../thinking.js";
|
|
36
|
-
import { getRecentTelegramTurnsFromFs, appendGlobalMessage } from "
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
36
|
+
import { getRecentTelegramTurnsFromFs, appendGlobalMessage } from "../../../core/messages-store.js";
|
|
37
|
+
import { compactChannelIfNeeded } from "../../../core/memory/index.js";
|
|
38
|
+
import { readAgents } from "../../../core/parser.js";
|
|
39
|
+
import { buildAgentSystem } from "../../../core/agent-system.js";
|
|
39
40
|
import { transcribe as transcribeAudioFile } from "../transcription.js";
|
|
41
|
+
import { resolveAgentName, SUPERAGENT_ACTOR_ID } from "../../../core/identity.js";
|
|
42
|
+
import { registerSender, resolveAllowedTools } from "../../../core/telegram-identity.js";
|
|
43
|
+
import { buildRelationshipBlock } from "../../../core/agent/index.js";
|
|
40
44
|
|
|
41
45
|
const API_BASE = "https://api.telegram.org";
|
|
42
46
|
const nowIso = () => new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
43
47
|
|
|
48
|
+
// Build the channelMeta passed to the super-agent loop. The prompt template at
|
|
49
|
+
// src/core/agent/prompts/channels/telegram.md interpolates {{projectBlock}}
|
|
50
|
+
// and {{routeBlock}} verbatim, so we pre-render them as plain text here
|
|
51
|
+
// (the template engine doesn't do conditionals).
|
|
52
|
+
function buildTelegramMeta({ channelName, author, chatId, target, routeToAgent }) {
|
|
53
|
+
const projectBlock = target
|
|
54
|
+
? `\nProject pin: **${target.name || "(unnamed)"}** (\`${target.path || "?"}\`).\n` +
|
|
55
|
+
"This Telegram channel belongs to that project. Default any " +
|
|
56
|
+
"project-scoped tool call (list_agents, list_tasks, list_mcps, " +
|
|
57
|
+
"list_skills, create_task, list_routines, …) to " +
|
|
58
|
+
`\`${target.name || target.path}\` without asking the user "which ` +
|
|
59
|
+
'project?". Only ask when they explicitly reference another project ' +
|
|
60
|
+
"by name."
|
|
61
|
+
: "";
|
|
62
|
+
const routeBlock = routeToAgent
|
|
63
|
+
? `\nMaster agent for this channel: **${routeToAgent}**. Prefer ` +
|
|
64
|
+
`delegating substantive work to that agent via call_agent({ project: ` +
|
|
65
|
+
`"${target?.name || target?.path || ""}", agent: "${routeToAgent}", ` +
|
|
66
|
+
"prompt: <user message> }) rather than answering yourself, unless " +
|
|
67
|
+
"the message is small-talk or a quick factual reply."
|
|
68
|
+
: "";
|
|
69
|
+
return {
|
|
70
|
+
channelName,
|
|
71
|
+
author,
|
|
72
|
+
chatId,
|
|
73
|
+
projectBlock,
|
|
74
|
+
routeBlock,
|
|
75
|
+
// Also expose raw fields for any future surface / log that wants them.
|
|
76
|
+
...(target ? {
|
|
77
|
+
projectId: String(target.id),
|
|
78
|
+
projectName: target.name || "",
|
|
79
|
+
projectPath: target.path || "",
|
|
80
|
+
} : {}),
|
|
81
|
+
...(routeToAgent ? { routeToAgent } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
44
85
|
// ---------- media sending helpers -------------------------------------------
|
|
45
86
|
|
|
46
87
|
/**
|
|
@@ -394,6 +435,22 @@ class ChannelPoller {
|
|
|
394
435
|
: `${msg.from?.first_name || ""} ${msg.from?.last_name || ""}`.trim() || "unknown";
|
|
395
436
|
const chat_id = msg.chat?.id;
|
|
396
437
|
|
|
438
|
+
// Resolve WHO is writing (owner / known contact / guest), keyed by the
|
|
439
|
+
// stable Telegram user_id. Records unknown senders and, on a fresh private
|
|
440
|
+
// channel with no owner yet, claims this sender as the owner. Mutates the
|
|
441
|
+
// in-memory globalConfig in place so later messages in this daemon session
|
|
442
|
+
// see the update. The resulting block is injected into whichever agent
|
|
443
|
+
// answers (super-agent OR a routed project agent).
|
|
444
|
+
const { sender } = registerSender({
|
|
445
|
+
cfg: this.globalConfig,
|
|
446
|
+
channelName: this.channel.name,
|
|
447
|
+
from: msg.from,
|
|
448
|
+
chatType: msg.chat?.type,
|
|
449
|
+
});
|
|
450
|
+
const relationshipBlock = buildRelationshipBlock(sender);
|
|
451
|
+
// Role-based tool gating for the super-agent path (guests → no tools).
|
|
452
|
+
const allowedTools = resolveAllowedTools(this.globalConfig, sender);
|
|
453
|
+
|
|
397
454
|
// Default Interrupt: abort any running request for this chat_id
|
|
398
455
|
if (chat_id) {
|
|
399
456
|
const prev = this.activeRequests.get(chat_id);
|
|
@@ -519,9 +576,19 @@ class ChannelPoller {
|
|
|
519
576
|
if (chat_id && !isReset) {
|
|
520
577
|
previousMessages = getRecentTelegramTurnsFromFs({
|
|
521
578
|
chat_id,
|
|
522
|
-
|
|
579
|
+
keepRecent: 40,
|
|
523
580
|
max_age_hours: 24,
|
|
524
581
|
});
|
|
582
|
+
// Progressive compaction (Pieza 3) runs OUT of the reply path: if this
|
|
583
|
+
// chat is over threshold, summarize the oldest turns in the background so
|
|
584
|
+
// the next turn reads a [RESUMEN COMPACTADO] instead of raw history. Never
|
|
585
|
+
// awaited — adds zero latency to this reply, degrades gracefully.
|
|
586
|
+
compactChannelIfNeeded({
|
|
587
|
+
channel: "telegram",
|
|
588
|
+
chat_id,
|
|
589
|
+
config: this.globalConfig,
|
|
590
|
+
log: this.log,
|
|
591
|
+
}).catch(() => {});
|
|
525
592
|
// Honour a /reset marker: drop everything up to and including it.
|
|
526
593
|
const lastResetIdx = (() => {
|
|
527
594
|
for (let i = previousMessages.length - 1; i >= 0; i--) {
|
|
@@ -576,8 +643,10 @@ class ChannelPoller {
|
|
|
576
643
|
channel: "telegram",
|
|
577
644
|
direction: "out",
|
|
578
645
|
type: "agent",
|
|
579
|
-
actor_id:
|
|
580
|
-
|
|
646
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
647
|
+
actor_kind: "superagent",
|
|
648
|
+
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
649
|
+
author: resolveAgentName(this.globalConfig),
|
|
581
650
|
body: ack,
|
|
582
651
|
meta: { chat_id, tg_channel: this.channel.name, in_reply_to: u.update_id, reset: true },
|
|
583
652
|
});
|
|
@@ -592,7 +661,11 @@ class ChannelPoller {
|
|
|
592
661
|
|
|
593
662
|
let replyText;
|
|
594
663
|
let replyAuthor;
|
|
664
|
+
let replyActorId; // stable id: super_agent | agent slug
|
|
665
|
+
let replyKind; // actor_kind: superagent | agent
|
|
595
666
|
const projectCfg = target.config || this.globalConfig;
|
|
667
|
+
// Display name for the super-agent persona on this channel (Roby / APX).
|
|
668
|
+
const agentDisplay = resolveAgentName(this.globalConfig);
|
|
596
669
|
|
|
597
670
|
// Try the project's chosen agent first (skipped if the legacy
|
|
598
671
|
// respond_with_engine === false hint asked to bypass routed agents).
|
|
@@ -605,6 +678,7 @@ class ChannelPoller {
|
|
|
605
678
|
invocation: "telegram",
|
|
606
679
|
channel: this.channel.name,
|
|
607
680
|
caller: author,
|
|
681
|
+
extraParts: [relationshipBlock],
|
|
608
682
|
});
|
|
609
683
|
const result = await callEngine({
|
|
610
684
|
modelId: agent.fields.Model,
|
|
@@ -614,10 +688,14 @@ class ChannelPoller {
|
|
|
614
688
|
});
|
|
615
689
|
replyText = result.text;
|
|
616
690
|
replyAuthor = agent.slug;
|
|
691
|
+
replyActorId = agent.slug;
|
|
692
|
+
replyKind = "agent";
|
|
617
693
|
} catch (e) {
|
|
618
694
|
this.log(`telegram[${this.channel.name}] agent reply failed: ${e.message}`);
|
|
619
695
|
replyText = `[apx error] ${e.message.slice(0, 200)}`;
|
|
620
|
-
replyAuthor =
|
|
696
|
+
replyAuthor = agentDisplay;
|
|
697
|
+
replyActorId = SUPERAGENT_ACTOR_ID;
|
|
698
|
+
replyKind = "superagent";
|
|
621
699
|
}
|
|
622
700
|
} else {
|
|
623
701
|
this.log(
|
|
@@ -637,9 +715,41 @@ class ChannelPoller {
|
|
|
637
715
|
let saUsage = null;
|
|
638
716
|
let streamedCount = 0;
|
|
639
717
|
let lastStreamedText = "";
|
|
718
|
+
// Telegram shows the user ONLY prose — never the tool calls. On an action
|
|
719
|
+
// request the model often jumps straight to a tool with no preamble text,
|
|
720
|
+
// so the user would stare at a silent chat until the final reply. Send one
|
|
721
|
+
// short localized heads-up the moment real work starts (first tool_start),
|
|
722
|
+
// but only if the agent didn't already write its own "on it" line.
|
|
723
|
+
let sentHeadsUp = false;
|
|
724
|
+
const headsUpPhrase = () => {
|
|
725
|
+
const lang = (this.globalConfig?.user?.language || "es").slice(0, 2);
|
|
726
|
+
const byLang = {
|
|
727
|
+
es: "Dale, estoy con eso… 🛠️",
|
|
728
|
+
en: "On it — working on that… 🛠️",
|
|
729
|
+
pt: "Já estou nisso… 🛠️",
|
|
730
|
+
};
|
|
731
|
+
return byLang[lang] || byLang.es;
|
|
732
|
+
};
|
|
640
733
|
if (!replyText && isSuperAgentEnabled(this.globalConfig)) {
|
|
641
734
|
const onEvent = async (ev) => {
|
|
642
735
|
try {
|
|
736
|
+
if (ev.type === "tool_start" && !sentHeadsUp && streamedCount === 0) {
|
|
737
|
+
sentHeadsUp = true;
|
|
738
|
+
const heads = headsUpPhrase();
|
|
739
|
+
await this._send({ chat_id, text: heads });
|
|
740
|
+
appendGlobalMessage({
|
|
741
|
+
channel: "telegram",
|
|
742
|
+
direction: "out",
|
|
743
|
+
type: "agent",
|
|
744
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
745
|
+
actor_kind: "superagent",
|
|
746
|
+
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
747
|
+
author: agentDisplay,
|
|
748
|
+
body: heads,
|
|
749
|
+
meta: { chat_id, tg_channel: this.channel.name, in_reply_to: u.update_id, heads_up: true },
|
|
750
|
+
});
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
643
753
|
if (ev.type === "assistant_text" && ev.text) {
|
|
644
754
|
const piece = stripThinking(ev.text).trim();
|
|
645
755
|
if (!piece) return;
|
|
@@ -650,9 +760,10 @@ class ChannelPoller {
|
|
|
650
760
|
channel: "telegram",
|
|
651
761
|
direction: "out",
|
|
652
762
|
type: "agent",
|
|
653
|
-
actor_id:
|
|
654
|
-
|
|
655
|
-
|
|
763
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
764
|
+
actor_kind: "superagent",
|
|
765
|
+
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
766
|
+
author: agentDisplay,
|
|
656
767
|
body: piece,
|
|
657
768
|
meta: {
|
|
658
769
|
chat_id,
|
|
@@ -670,7 +781,8 @@ class ChannelPoller {
|
|
|
670
781
|
direction: "out",
|
|
671
782
|
type: "tool",
|
|
672
783
|
actor_id: t.tool,
|
|
673
|
-
|
|
784
|
+
actor_kind: "tool",
|
|
785
|
+
author: agentDisplay,
|
|
674
786
|
body: `${t.tool}(${JSON.stringify(t.args || {}).slice(0, 200)})`,
|
|
675
787
|
meta: {
|
|
676
788
|
chat_id,
|
|
@@ -697,12 +809,23 @@ class ChannelPoller {
|
|
|
697
809
|
registries: this.registries,
|
|
698
810
|
prompt: text,
|
|
699
811
|
previousMessages,
|
|
700
|
-
|
|
812
|
+
channel: "telegram",
|
|
813
|
+
relationshipBlock,
|
|
814
|
+
allowedTools,
|
|
815
|
+
channelMeta: buildTelegramMeta({
|
|
816
|
+
channelName: this.channel.name,
|
|
817
|
+
author,
|
|
818
|
+
chatId: chat_id,
|
|
819
|
+
target,
|
|
820
|
+
routeToAgent: this.channel.route_to_agent,
|
|
821
|
+
}),
|
|
701
822
|
signal: abortCtrl.signal,
|
|
702
823
|
onEvent,
|
|
703
824
|
});
|
|
704
825
|
replyText = sa.text;
|
|
705
|
-
replyAuthor = sa.name;
|
|
826
|
+
replyAuthor = sa.name || agentDisplay;
|
|
827
|
+
replyActorId = SUPERAGENT_ACTOR_ID;
|
|
828
|
+
replyKind = "superagent";
|
|
706
829
|
saUsage = sa.usage;
|
|
707
830
|
} catch (e) {
|
|
708
831
|
if (abortCtrl.signal.aborted) {
|
|
@@ -719,7 +842,9 @@ class ChannelPoller {
|
|
|
719
842
|
// turn — otherwise from the chat side it looks like the bot ignored
|
|
720
843
|
// the message. Keep the message short and non-leaking.
|
|
721
844
|
replyText = `⚠️ Could not generate a reply right now (${e.message || "internal error"}).`;
|
|
722
|
-
replyAuthor =
|
|
845
|
+
replyAuthor = agentDisplay;
|
|
846
|
+
replyActorId = SUPERAGENT_ACTOR_ID;
|
|
847
|
+
replyKind = "superagent";
|
|
723
848
|
}
|
|
724
849
|
}
|
|
725
850
|
|
|
@@ -752,9 +877,10 @@ class ChannelPoller {
|
|
|
752
877
|
channel: "telegram",
|
|
753
878
|
direction: "out",
|
|
754
879
|
type: "agent",
|
|
755
|
-
actor_id:
|
|
756
|
-
|
|
757
|
-
|
|
880
|
+
actor_id: replyActorId || SUPERAGENT_ACTOR_ID,
|
|
881
|
+
actor_kind: replyKind || "superagent",
|
|
882
|
+
agent_slug: replyActorId || SUPERAGENT_ACTOR_ID,
|
|
883
|
+
author: replyAuthor || agentDisplay,
|
|
758
884
|
body: toSend,
|
|
759
885
|
meta,
|
|
760
886
|
});
|
|
@@ -764,9 +890,10 @@ class ChannelPoller {
|
|
|
764
890
|
channel: "telegram",
|
|
765
891
|
direction: "out",
|
|
766
892
|
type: "agent",
|
|
767
|
-
actor_id:
|
|
768
|
-
|
|
769
|
-
|
|
893
|
+
actor_id: replyActorId || SUPERAGENT_ACTOR_ID,
|
|
894
|
+
actor_kind: replyKind || "superagent",
|
|
895
|
+
agent_slug: replyActorId || SUPERAGENT_ACTOR_ID,
|
|
896
|
+
author: replyAuthor || agentDisplay,
|
|
770
897
|
body: `[send_failed] ${toSend}`,
|
|
771
898
|
meta: {
|
|
772
899
|
chat_id,
|
|
@@ -905,7 +1032,7 @@ export default {
|
|
|
905
1032
|
// that bot; otherwise first available bot-tokened channel. Always logs
|
|
906
1033
|
// the outbound on `messages` of the channel's target project so audit
|
|
907
1034
|
// trails are complete.
|
|
908
|
-
async send({ channel: channelName, chat_id, text, author =
|
|
1035
|
+
async send({ channel: channelName, chat_id, text, author = resolveAgentName(config), project }) {
|
|
909
1036
|
const p =
|
|
910
1037
|
(channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
|
|
911
1038
|
pollers.find((pp) => resolveBotToken(pp.channel)) ||
|
|
@@ -916,8 +1043,9 @@ export default {
|
|
|
916
1043
|
channel: "telegram",
|
|
917
1044
|
direction: "out",
|
|
918
1045
|
type: "agent",
|
|
919
|
-
actor_id:
|
|
920
|
-
|
|
1046
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
1047
|
+
actor_kind: "superagent",
|
|
1048
|
+
agent_slug: SUPERAGENT_ACTOR_ID,
|
|
921
1049
|
author,
|
|
922
1050
|
body: text,
|
|
923
1051
|
meta: {
|
|
@@ -934,7 +1062,7 @@ export default {
|
|
|
934
1062
|
* photo: local file path, Buffer, or public URL
|
|
935
1063
|
* opts: { caption, parse_mode, channel, author }
|
|
936
1064
|
*/
|
|
937
|
-
async sendPhoto({ channel: channelName, chat_id, photo, caption, parse_mode, author =
|
|
1065
|
+
async sendPhoto({ channel: channelName, chat_id, photo, caption, parse_mode, author = resolveAgentName(config) }) {
|
|
938
1066
|
const p =
|
|
939
1067
|
(channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
|
|
940
1068
|
pollers.find((pp) => resolveBotToken(pp.channel)) ||
|
|
@@ -945,7 +1073,8 @@ export default {
|
|
|
945
1073
|
channel: "telegram",
|
|
946
1074
|
direction: "out",
|
|
947
1075
|
type: "photo",
|
|
948
|
-
actor_id:
|
|
1076
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
1077
|
+
actor_kind: "superagent",
|
|
949
1078
|
author,
|
|
950
1079
|
body: caption || "[photo]",
|
|
951
1080
|
meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
|
|
@@ -957,7 +1086,7 @@ export default {
|
|
|
957
1086
|
* Send a voice message (OGG/Opus preferred).
|
|
958
1087
|
* audio: local file path or Buffer
|
|
959
1088
|
*/
|
|
960
|
-
async sendVoice({ channel: channelName, chat_id, audio, caption, duration, author =
|
|
1089
|
+
async sendVoice({ channel: channelName, chat_id, audio, caption, duration, author = resolveAgentName(config) }) {
|
|
961
1090
|
const p =
|
|
962
1091
|
(channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
|
|
963
1092
|
pollers.find((pp) => resolveBotToken(pp.channel)) ||
|
|
@@ -968,7 +1097,8 @@ export default {
|
|
|
968
1097
|
channel: "telegram",
|
|
969
1098
|
direction: "out",
|
|
970
1099
|
type: "voice",
|
|
971
|
-
actor_id:
|
|
1100
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
1101
|
+
actor_kind: "superagent",
|
|
972
1102
|
author,
|
|
973
1103
|
body: caption || "[voice]",
|
|
974
1104
|
meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
|
|
@@ -980,7 +1110,7 @@ export default {
|
|
|
980
1110
|
* Send a document (PDF, zip, txt, generated reports, etc).
|
|
981
1111
|
* document: local file path, Buffer, or public https URL.
|
|
982
1112
|
*/
|
|
983
|
-
async sendDocument({ channel: channelName, chat_id, document, caption, filename, mime_type, author =
|
|
1113
|
+
async sendDocument({ channel: channelName, chat_id, document, caption, filename, mime_type, author = resolveAgentName(config) }) {
|
|
984
1114
|
const p =
|
|
985
1115
|
(channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
|
|
986
1116
|
pollers.find((pp) => resolveBotToken(pp.channel)) ||
|
|
@@ -991,7 +1121,8 @@ export default {
|
|
|
991
1121
|
channel: "telegram",
|
|
992
1122
|
direction: "out",
|
|
993
1123
|
type: "document",
|
|
994
|
-
actor_id:
|
|
1124
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
1125
|
+
actor_kind: "superagent",
|
|
995
1126
|
author,
|
|
996
1127
|
body: caption || `[document${filename ? " " + filename : ""}]`,
|
|
997
1128
|
meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name, filename, mime_type },
|
|
@@ -1003,7 +1134,7 @@ export default {
|
|
|
1003
1134
|
* Send an audio file (MP3/M4A — shown in music player).
|
|
1004
1135
|
* audio: local file path or Buffer
|
|
1005
1136
|
*/
|
|
1006
|
-
async sendAudio({ channel: channelName, chat_id, audio, caption, title, performer, author =
|
|
1137
|
+
async sendAudio({ channel: channelName, chat_id, audio, caption, title, performer, author = resolveAgentName(config) }) {
|
|
1007
1138
|
const p =
|
|
1008
1139
|
(channelName && pollers.find((pp) => pp.channel.name === channelName)) ||
|
|
1009
1140
|
pollers.find((pp) => resolveBotToken(pp.channel)) ||
|
|
@@ -1014,7 +1145,8 @@ export default {
|
|
|
1014
1145
|
channel: "telegram",
|
|
1015
1146
|
direction: "out",
|
|
1016
1147
|
type: "audio",
|
|
1017
|
-
actor_id:
|
|
1148
|
+
actor_id: SUPERAGENT_ACTOR_ID,
|
|
1149
|
+
actor_kind: "superagent",
|
|
1018
1150
|
author,
|
|
1019
1151
|
body: caption || title || "[audio]",
|
|
1020
1152
|
meta: { chat_id: chat_id || resolveChatId(p.channel), tg_channel: p.channel.name },
|
|
@@ -74,12 +74,28 @@ export function setDottedKey(obj, dottedKey, value) {
|
|
|
74
74
|
let cur = obj;
|
|
75
75
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
76
76
|
const k = parts[i];
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
const nextKey = parts[i + 1];
|
|
78
|
+
if (Array.isArray(cur)) {
|
|
79
|
+
const idx = Number(k);
|
|
80
|
+
if (!Number.isInteger(idx) || idx < 0) return obj;
|
|
81
|
+
if (typeof cur[idx] !== "object" || cur[idx] === null) {
|
|
82
|
+
cur[idx] = /^\d+$/.test(nextKey) ? [] : {};
|
|
83
|
+
}
|
|
84
|
+
cur = cur[idx];
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (typeof cur[k] !== "object" || cur[k] === null) {
|
|
88
|
+
cur[k] = /^\d+$/.test(nextKey) ? [] : {};
|
|
79
89
|
}
|
|
80
90
|
cur = cur[k];
|
|
81
91
|
}
|
|
82
|
-
|
|
92
|
+
const last = parts[parts.length - 1];
|
|
93
|
+
if (Array.isArray(cur)) {
|
|
94
|
+
const idx = Number(last);
|
|
95
|
+
if (Number.isInteger(idx) && idx >= 0) cur[idx] = value;
|
|
96
|
+
} else {
|
|
97
|
+
cur[last] = value;
|
|
98
|
+
}
|
|
83
99
|
return obj;
|
|
84
100
|
}
|
|
85
101
|
|
|
@@ -87,11 +103,19 @@ export function unsetDottedKey(obj, dottedKey) {
|
|
|
87
103
|
const parts = dottedKey.split(".");
|
|
88
104
|
let cur = obj;
|
|
89
105
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
90
|
-
|
|
91
|
-
cur
|
|
106
|
+
const key = parts[i];
|
|
107
|
+
if (Array.isArray(cur)) {
|
|
108
|
+
const idx = Number(key);
|
|
109
|
+
if (!Number.isInteger(idx) || typeof cur[idx] !== "object") return false;
|
|
110
|
+
cur = cur[idx];
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (typeof cur[key] !== "object") return false;
|
|
114
|
+
cur = cur[key];
|
|
92
115
|
}
|
|
93
|
-
|
|
94
|
-
|
|
116
|
+
const last = parts[parts.length - 1];
|
|
117
|
+
if (last in cur) {
|
|
118
|
+
delete cur[last];
|
|
95
119
|
return true;
|
|
96
120
|
}
|
|
97
121
|
return false;
|