@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,313 @@
|
|
|
1
|
+
// Prompt builder for the APX default agent — known internally as the
|
|
2
|
+
// "super-agent". That name is a MODE descriptor (the daemon-level tool-using
|
|
3
|
+
// loop that runs when no project agent is named), not a persona the user
|
|
4
|
+
// should ever see. The model is told its real display name comes from
|
|
5
|
+
// ~/.apx/identity.json; "super-agent" only appears in code, file paths, CLI
|
|
6
|
+
// flags, and channel meta.
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { readIdentity } from "../identity.js";
|
|
11
|
+
import { readSelfMemoryForPrompt } from "./self-memory.js";
|
|
12
|
+
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const PROMPTS_DIR = path.join(__dirname, "prompts");
|
|
15
|
+
const BASE_PROMPT_PATH = path.join(PROMPTS_DIR, "super-agent-base.md");
|
|
16
|
+
|
|
17
|
+
const promptCache = new Map();
|
|
18
|
+
|
|
19
|
+
/** @deprecated use super-agent-base.md */
|
|
20
|
+
const LEGACY_PROMPT_PATH = path.join(PROMPTS_DIR, "super-agent-default.md");
|
|
21
|
+
|
|
22
|
+
// Channels are SURFACES (where the user is). Voice is NOT a channel — it's a
|
|
23
|
+
// MODE that layers on top of a surface (see buildVoiceModeBlock); a spoken deck
|
|
24
|
+
// turn is channel "deck" + voice mode, not its own channel.
|
|
25
|
+
const CHANNEL_PROMPT_FILES = {
|
|
26
|
+
telegram: "channels/telegram.md",
|
|
27
|
+
terminal: "channels/terminal.md",
|
|
28
|
+
cli: "channels/cli.md",
|
|
29
|
+
routine: "channels/routine.md",
|
|
30
|
+
api: "channels/api.md",
|
|
31
|
+
web: "channels/web.md", // web big chat (long-form, full tools)
|
|
32
|
+
web_sidebar: "channels/web_sidebar.md", // web quick chat (short, lightweight)
|
|
33
|
+
deck: "channels/deck.md", // cockpit dashboard
|
|
34
|
+
desktop: "channels/desktop.md", // PC floating module (was "overlay")
|
|
35
|
+
code: "channels/code.md", // web Code module (rich coding session)
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Voice mode: spoken-reply rules layered on any surface when the turn will be
|
|
39
|
+
// read aloud by TTS (deck voice overlay, desktop module, etc). Injected with
|
|
40
|
+
// high recency (right before systemSuffix) so weaker models don't bury it.
|
|
41
|
+
const VOICE_MODE_FILE = "modes/voice.md";
|
|
42
|
+
|
|
43
|
+
export function buildVoiceModeBlock(active) {
|
|
44
|
+
if (!active) return "";
|
|
45
|
+
try {
|
|
46
|
+
return loadPrompt(VOICE_MODE_FILE);
|
|
47
|
+
} catch {
|
|
48
|
+
return "";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function loadPrompt(relativePath) {
|
|
53
|
+
const key = relativePath.replace(/\\/g, "/");
|
|
54
|
+
if (promptCache.has(key)) return promptCache.get(key);
|
|
55
|
+
const full = path.join(PROMPTS_DIR, key);
|
|
56
|
+
const text = fs.readFileSync(full, "utf8");
|
|
57
|
+
promptCache.set(key, text);
|
|
58
|
+
return text;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function loadDefaultSystemPrompt() {
|
|
62
|
+
if (fs.existsSync(BASE_PROMPT_PATH)) return loadPrompt("super-agent-base.md");
|
|
63
|
+
if (fs.existsSync(LEGACY_PROMPT_PATH)) return loadPrompt("super-agent-default.md");
|
|
64
|
+
throw new Error("super-agent base prompt not found");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** @deprecated use loadDefaultSystemPrompt — kept for tests/imports */
|
|
68
|
+
export const DEFAULT_SYSTEM = loadDefaultSystemPrompt();
|
|
69
|
+
|
|
70
|
+
export function renderPromptTemplate(template, vars = {}) {
|
|
71
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
|
|
72
|
+
const value = vars[key];
|
|
73
|
+
return value == null || value === "" ? "" : String(value);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function buildChannelContextBlock(channel, meta = {}) {
|
|
78
|
+
const rel = CHANNEL_PROMPT_FILES[String(channel || "").toLowerCase()];
|
|
79
|
+
if (!rel) return "";
|
|
80
|
+
return renderPromptTemplate(loadPrompt(rel), meta);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Project startup rules. When APX runs its OWN loop inside a project, load that
|
|
84
|
+
// project's AGENTS.md into the prompt — the same convention Claude/Codex follow
|
|
85
|
+
// with CLAUDE.md/AGENTS.md. `projectPath` flows in via channelMeta.projectPath
|
|
86
|
+
// (set by the super-agent API, the code module, and routines). This is wired
|
|
87
|
+
// ONLY into the super-agent prompt: when APX delegates to an external engine,
|
|
88
|
+
// that engine reads AGENTS.md itself. Size-capped to protect the prompt budget.
|
|
89
|
+
export const PROJECT_AGENTS_MAX_CHARS = 6000;
|
|
90
|
+
export function buildProjectAgentsBlock(projectPath) {
|
|
91
|
+
if (!projectPath) return "";
|
|
92
|
+
try {
|
|
93
|
+
const file = path.join(projectPath, "AGENTS.md");
|
|
94
|
+
if (!fs.existsSync(file)) return "";
|
|
95
|
+
let text = fs.readFileSync(file, "utf8").trim();
|
|
96
|
+
if (!text) return "";
|
|
97
|
+
if (text.length > PROJECT_AGENTS_MAX_CHARS) {
|
|
98
|
+
text = text.slice(0, PROJECT_AGENTS_MAX_CHARS) + "\n\n…(AGENTS.md truncated)";
|
|
99
|
+
}
|
|
100
|
+
return `# Project guidance (AGENTS.md)\n\nStartup rules for THIS project — follow them:\n\n${text}`;
|
|
101
|
+
} catch {
|
|
102
|
+
return "";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function buildUserContextBlock(identity, globalConfig = {}) {
|
|
107
|
+
const user = globalConfig?.user || {};
|
|
108
|
+
const lang = user.language || identity?.language || "en";
|
|
109
|
+
const lines = ["# User & identity"];
|
|
110
|
+
|
|
111
|
+
const agentName = identity?.agent_name || globalConfig?.super_agent?.name;
|
|
112
|
+
if (agentName) lines.push(`Your name is ${agentName}.`);
|
|
113
|
+
if (identity?.personality) lines.push(`Your personality: ${identity.personality}.`);
|
|
114
|
+
if (identity?.owner_name) lines.push(`Your owner is ${identity.owner_name}.`);
|
|
115
|
+
if (identity?.owner_context) lines.push(`Owner context: ${identity.owner_context}`);
|
|
116
|
+
|
|
117
|
+
lines.push(
|
|
118
|
+
`Reply in the language with ISO 639-1 code "${lang}" unless the user explicitly switches language for that turn.`
|
|
119
|
+
);
|
|
120
|
+
if (user.locale) {
|
|
121
|
+
lines.push(`Preferred locale or dialect: ${user.locale}.`);
|
|
122
|
+
}
|
|
123
|
+
if (user.timezone) {
|
|
124
|
+
lines.push(
|
|
125
|
+
`User timezone: ${user.timezone}. Use it for local time and schedules unless the user specifies otherwise.`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return lines.join("\n");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Back-compat wrapper — second arg is ISO language only (no full config). */
|
|
133
|
+
export function buildIdentityBlock(identity, userLang = "en") {
|
|
134
|
+
return buildUserContextBlock(identity, { user: { language: userLang } });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// "Who you're talking to" block. Agent-agnostic: built once from the resolved
|
|
138
|
+
// sender (see core/telegram-identity.js) and injected into BOTH the super-agent
|
|
139
|
+
// prompt and any routed project-agent prompt, so identification doesn't depend
|
|
140
|
+
// on which agent answers. Returns "" when there's no sender info.
|
|
141
|
+
export function buildRelationshipBlock(sender) {
|
|
142
|
+
if (!sender || sender.userId == null) return "";
|
|
143
|
+
const handle = sender.username ? ` (@${sender.username})` : "";
|
|
144
|
+
const lines = ["# Who you're talking to"];
|
|
145
|
+
|
|
146
|
+
if (sender.isGroup) {
|
|
147
|
+
lines.push(
|
|
148
|
+
"This is a Telegram GROUP chat with multiple people — do NOT assume a single owner."
|
|
149
|
+
);
|
|
150
|
+
lines.push(
|
|
151
|
+
`Sender of this message: ${sender.name}${handle}, role: ${sender.role}.`
|
|
152
|
+
);
|
|
153
|
+
} else if (sender.isOwner) {
|
|
154
|
+
lines.push(
|
|
155
|
+
`You are talking to your owner, ${sender.name}. Treat them as the owner — ` +
|
|
156
|
+
"never ask their name or who they are; you already know them."
|
|
157
|
+
);
|
|
158
|
+
} else if (sender.role && sender.role !== "guest") {
|
|
159
|
+
lines.push(`You are talking to ${sender.name}${handle}, role: ${sender.role}.`);
|
|
160
|
+
} else {
|
|
161
|
+
lines.push(
|
|
162
|
+
`You are talking to ${sender.name}${handle}, who is NOT a recognized contact ` +
|
|
163
|
+
"(role: guest, no permissions)."
|
|
164
|
+
);
|
|
165
|
+
lines.push(
|
|
166
|
+
"Politely say you don't know them yet and ask who they are; tell them you'll " +
|
|
167
|
+
"note it down, but that you cannot grant any role or permissions yourself — " +
|
|
168
|
+
"only the owner or someone via terminal/web can assign a role. Do not perform " +
|
|
169
|
+
"privileged or destructive actions on their behalf."
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
if (sender.note) lines.push(`Notes on this contact: ${sender.note}`);
|
|
173
|
+
return lines.join("\n");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Roby's own notebook (~/.apx/memory.md), bounded for the prompt. Returns ""
|
|
177
|
+
// when empty so the block is dropped entirely.
|
|
178
|
+
export function buildSelfMemoryBlock() {
|
|
179
|
+
const slice = readSelfMemoryForPrompt();
|
|
180
|
+
if (!slice) return "";
|
|
181
|
+
return [
|
|
182
|
+
"# Your notebook (self-memory)",
|
|
183
|
+
"Durable things you chose to remember across sessions. Treat as known facts;",
|
|
184
|
+
"update with the `remember` tool. Call read_self_memory if this looks truncated.",
|
|
185
|
+
"",
|
|
186
|
+
slice,
|
|
187
|
+
].join("\n");
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function isSuperAgentEnabled(cfg) {
|
|
191
|
+
const sa = cfg && cfg.super_agent;
|
|
192
|
+
if (!sa || !sa.model) return false;
|
|
193
|
+
return sa.enabled !== false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function buildPermissionBlock(sa) {
|
|
197
|
+
const permissionMode = sa.permission_mode || "automatico";
|
|
198
|
+
const allowedTools = Array.isArray(sa.allowed_tools) ? sa.allowed_tools : [];
|
|
199
|
+
return [
|
|
200
|
+
"# Permission mode",
|
|
201
|
+
`mode: ${permissionMode}`,
|
|
202
|
+
`allowed_tools: ${allowedTools.join(", ") || "(none)"}`,
|
|
203
|
+
"When a tool schema has confirmed, set confirmed=true only after explicit user confirmation for that exact action.",
|
|
204
|
+
].join("\n");
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Skill descriptions are authored for Claude Code's skill matcher, so many end
|
|
208
|
+
// with verbose "Trigger on: …" / "Activate when …" lists and multi-sentence
|
|
209
|
+
// usage notes. Inside Roby's prompt those tails are pure noise (he matches
|
|
210
|
+
// semantically, not by trigger string). Keep the first sentence only, drop the
|
|
211
|
+
// trigger/activation tail, and cap length — this is the single biggest
|
|
212
|
+
// signal-per-token win in the prompt (~1k tokens recovered per turn).
|
|
213
|
+
function condenseSkillDescription(desc) {
|
|
214
|
+
if (!desc) return "(no description)";
|
|
215
|
+
const full = String(desc).replace(/\s+/g, " ").trim();
|
|
216
|
+
const MARKER =
|
|
217
|
+
/\s*(?:Trigger(?:s)? on|Triggers|TRIGGER|Activate (?:on|when|only)|Use this skill (?:whenever|when)|Use (?:it )?when|Triggers include|SKIP|Also (?:use|triggers))\b/i;
|
|
218
|
+
// Prefer the gist before any trigger/activation marker; but if a skill leads
|
|
219
|
+
// straight into "Activate ONLY when…" (no gist first), that head is empty —
|
|
220
|
+
// fall back to the first sentence of the full text so we keep real info.
|
|
221
|
+
let d = full.split(MARKER)[0].trim();
|
|
222
|
+
if (d.length < 15) d = full;
|
|
223
|
+
// First sentence only, then cap length.
|
|
224
|
+
const firstStop = d.search(/\.(\s|$)/);
|
|
225
|
+
if (firstStop > 0) d = d.slice(0, firstStop + 1);
|
|
226
|
+
d = d.trim();
|
|
227
|
+
if (d.length > 160) d = d.slice(0, 157).trimEnd() + "…";
|
|
228
|
+
return d || "(no description)";
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function buildSkillsCatalog(listSkills) {
|
|
232
|
+
let list = [];
|
|
233
|
+
try {
|
|
234
|
+
list = listSkills();
|
|
235
|
+
} catch {
|
|
236
|
+
/* empty */
|
|
237
|
+
}
|
|
238
|
+
if (!list.length) return "";
|
|
239
|
+
return [
|
|
240
|
+
"# Available skills (load on demand)",
|
|
241
|
+
"Catalog (slug + one-line gist). Bodies are NOT loaded. When the user needs",
|
|
242
|
+
"knowledge or syntax matching one (match semantically, any language), call",
|
|
243
|
+
"load_skill({slug}).",
|
|
244
|
+
"",
|
|
245
|
+
...list.map((s) => `- **${s.slug}**: ${condenseSkillDescription(s.description)}`),
|
|
246
|
+
].join("\n");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export function buildSuperAgentSystem({
|
|
250
|
+
globalConfig,
|
|
251
|
+
projects,
|
|
252
|
+
listSkills,
|
|
253
|
+
contextNote = "",
|
|
254
|
+
channel = "",
|
|
255
|
+
channelMeta = {},
|
|
256
|
+
// Pre-rendered "who you're talking to" block (see buildRelationshipBlock).
|
|
257
|
+
// Injected right after the user/identity block so the model knows the
|
|
258
|
+
// sender's identity and role before anything else.
|
|
259
|
+
relationshipBlock = "",
|
|
260
|
+
// Channel-specific addendum the super-agent caller can inject —
|
|
261
|
+
// e.g. voice.js asks for a trailing ```suggestions``` JSON block on
|
|
262
|
+
// voice/deck surfaces. Kept separate from contextNote so it lives
|
|
263
|
+
// at the end of the system prompt (where format directives belong),
|
|
264
|
+
// not mixed in with situational context.
|
|
265
|
+
systemSuffix = "",
|
|
266
|
+
// Pre-rendered output of the Memory Broker (Pieza 4): a [MEMORIA RELEVANTE]
|
|
267
|
+
// block built from the RAG retriever + recent memory.md entries. When
|
|
268
|
+
// provided it REPLACES the always-on self-memory slice (it already includes
|
|
269
|
+
// the latest notebook entries). "" falls back to the plain notebook slice.
|
|
270
|
+
memoryBlock = "",
|
|
271
|
+
// Pre-rendered "# Hilos activos en otros canales" block (recency-based
|
|
272
|
+
// cross-channel awareness; see core/memory/active-threads.js). "" → omitted.
|
|
273
|
+
activeThreadsBlock = "",
|
|
274
|
+
}) {
|
|
275
|
+
const sa = globalConfig.super_agent;
|
|
276
|
+
const projectIndex = projects
|
|
277
|
+
.list()
|
|
278
|
+
.map((p) => ` ${p.id}: ${p.id === 0 ? "[default]" : "[project]"} "${p.name}" (${p.path})`)
|
|
279
|
+
.join("\n");
|
|
280
|
+
|
|
281
|
+
const identity = (() => {
|
|
282
|
+
try {
|
|
283
|
+
return readIdentity();
|
|
284
|
+
} catch {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
})();
|
|
288
|
+
|
|
289
|
+
const channelBlock = buildChannelContextBlock(channel, channelMeta);
|
|
290
|
+
const extraContext = [channelBlock, contextNote].filter(Boolean).join("\n\n");
|
|
291
|
+
// Voice is a mode, not a channel: the caller flags a spoken turn via
|
|
292
|
+
// channelMeta.voice (or the legacy channel === "voice"). The block goes last,
|
|
293
|
+
// next to systemSuffix, so format directives keep recency.
|
|
294
|
+
const voiceModeBlock = buildVoiceModeBlock(channelMeta?.voice || channel === "voice");
|
|
295
|
+
|
|
296
|
+
return [
|
|
297
|
+
sa.system || loadDefaultSystemPrompt(),
|
|
298
|
+
buildUserContextBlock(identity, globalConfig),
|
|
299
|
+
memoryBlock || buildSelfMemoryBlock(),
|
|
300
|
+
activeThreadsBlock,
|
|
301
|
+
relationshipBlock,
|
|
302
|
+
buildPermissionBlock(sa),
|
|
303
|
+
extraContext,
|
|
304
|
+
"# Registered projects (just the index — call tools for details)",
|
|
305
|
+
projectIndex || "(no projects registered)",
|
|
306
|
+
buildProjectAgentsBlock(channelMeta?.projectPath),
|
|
307
|
+
buildSkillsCatalog(listSkills),
|
|
308
|
+
voiceModeBlock,
|
|
309
|
+
systemSuffix,
|
|
310
|
+
]
|
|
311
|
+
.filter(Boolean)
|
|
312
|
+
.join("\n\n");
|
|
313
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **api** (HTTP caller — overlay, integrations, or default daemon route).
|
|
3
|
+
|
|
4
|
+
Project: {{projectId}} — {{projectName}} ({{projectPath}})
|
|
5
|
+
|
|
6
|
+
Formatting:
|
|
7
|
+
- Match the caller's expected style when Channel context or the user prompt specifies it; otherwise clear and concise
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **code** (the Code module in the web admin panel) — a rich, OpenCode-style coding session scoped to a single project. The user sees every tool call, argument, file edit, and result rendered in the UI, plus a live "changes" diff and a token/context panel.
|
|
3
|
+
|
|
4
|
+
Working project: **{{projectName}}** (id {{projectId}})
|
|
5
|
+
Path: `{{projectPath}}`
|
|
6
|
+
All file and shell tools resolve relative to that project path — operate inside it unless told otherwise.
|
|
7
|
+
|
|
8
|
+
{{modeGuidance}}
|
|
9
|
+
|
|
10
|
+
Working style — KEEP GOING UNTIL THE TASK IS DONE:
|
|
11
|
+
- You are an autonomous coding agent. Once the user gives a task, complete the WHOLE thing in this turn: chain as many tool calls as needed (read → edit → run → verify), do not stop after one or two steps.
|
|
12
|
+
- NEVER stop to ask "do you want me to…?" / "¿confirmás…?" / "should I continue?". You already have permission on this surface — just do it. Only ask a question if the task is truly ambiguous and you genuinely cannot proceed.
|
|
13
|
+
- NEVER announce an action and then end your turn ("now I'll edit the file." → stop). If you say you will do something, immediately call the tool and actually do it in the same turn.
|
|
14
|
+
- After each tool result, decide the next concrete step and take it. Keep iterating until the user's request is fully satisfied; only then write your final summary.
|
|
15
|
+
- If something fails, read the error, fix it, and retry — don't hand the problem back to the user.
|
|
16
|
+
|
|
17
|
+
Formatting:
|
|
18
|
+
- Markdown with code fences is expected. Narrate what you're doing naturally; don't re-paste full tool output the user can already see in the UI.
|
|
19
|
+
- Lead with the result. Keep prose tight — this is a working surface, not a chat.
|
|
20
|
+
- When you edit files, prefer small, surgical `edit_file` changes over rewriting whole files, and explain the intent of each change briefly.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **deck** (the user is on the cockpit dashboard). Action-first surface; replies render in a small card alongside action chips.
|
|
3
|
+
|
|
4
|
+
Formatting:
|
|
5
|
+
- Concise — short sentences, no markdown tables. The card is small.
|
|
6
|
+
- Bias toward doing the action and confirming it. If a Voice mode block is present, follow it (the reply will be spoken).
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **desktop** (the floating APX module open on the user's PC). A small
|
|
3
|
+
always-on-top Electron capsule the user invokes with a global hotkey
|
|
4
|
+
(default ⌘G / Ctrl+G), then either holds-to-speak or types a quick line.
|
|
5
|
+
Companion to the deck — fast, action-first, conversational. Not a long-form
|
|
6
|
+
workspace; the web admin (`/m/desktop`) handles config and the web big chat
|
|
7
|
+
(`channel: web`) handles long sessions.
|
|
8
|
+
|
|
9
|
+
Voice mode is ALWAYS active on this channel (the desktop plugin sets
|
|
10
|
+
`channelMeta: { voice: true }`). Anything you write here will be spoken aloud
|
|
11
|
+
by TTS, so default to spoken-friendly phrasing even when the user typed
|
|
12
|
+
their input.
|
|
13
|
+
|
|
14
|
+
Formatting:
|
|
15
|
+
- 1–2 short sentences whenever possible. The user usually wants the action
|
|
16
|
+
done and a tiny confirmation, not an explanation.
|
|
17
|
+
- No markdown tables, no code fences, no bulleted lists unless the user
|
|
18
|
+
explicitly asks. Plain prose only — these get read aloud verbatim.
|
|
19
|
+
- No URLs / file paths spelled out — refer to them by name ("abrí Voces en
|
|
20
|
+
la admin web" rather than "http://localhost:7430/m/voice").
|
|
21
|
+
- If a Voice mode block is present below, its rules win over anything here.
|
|
22
|
+
- Bias hard toward DOING the action and reporting the result in one breath,
|
|
23
|
+
rather than asking back. Confirm-after, not confirm-before, for
|
|
24
|
+
reversible things.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **routine** (autonomous scheduled run — not an interactive chat).
|
|
3
|
+
|
|
4
|
+
Routine: `{{routineName}}`
|
|
5
|
+
Project path: {{projectPath}}
|
|
6
|
+
|
|
7
|
+
Formatting:
|
|
8
|
+
- Execute the task fully; no conversational filler
|
|
9
|
+
- This is not Telegram — do not optimize for chat brevity unless the routine prompt says so
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **telegram** (bot channel `{{channelName}}`, author: {{author}}, chat_id: {{chatId}}).
|
|
3
|
+
{{projectBlock}}{{routeBlock}}
|
|
4
|
+
Formatting:
|
|
5
|
+
- Plain text only — no markdown tables; code fences only when quoting code
|
|
6
|
+
- Keep replies brief (~6 sentences unless user asks for more)
|
|
7
|
+
- Previous turns are conversational context only; re-call tools for facts
|
|
8
|
+
|
|
9
|
+
What the user sees here: ONLY your final text reply. They do NOT see your tool calls, args, or intermediate results — those never reach Telegram. So if a request needs real work (running something, searching, editing, a multi-step task), the channel sends a short "on it" heads-up for you; you still must report what you actually did in plain words at the end. Never assume they saw what you ran.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **terminal** (interactive APX sys session) — the same OpenCode-style coding surface as the web Code module, just in the terminal. You can read, search, edit files and run shell commands.
|
|
3
|
+
|
|
4
|
+
- CWD: {{cwd}}
|
|
5
|
+
- References to "this directory", "this project", "here", "current folder" mean the CWD above — use it as the path argument; do not ask for a path
|
|
6
|
+
|
|
7
|
+
Working style — KEEP GOING UNTIL THE TASK IS DONE (build mode):
|
|
8
|
+
- You are an autonomous coding agent. Once the user gives a task, complete the WHOLE thing in this turn: chain as many tool calls as needed (read → edit → run → verify), do not stop after one or two steps.
|
|
9
|
+
- NEVER stop to ask "do you want me to…?" / "¿confirmás…?" / "should I continue?". You already have permission on this surface — just do it. Only ask if the task is truly ambiguous and you genuinely cannot proceed.
|
|
10
|
+
- NEVER announce an action and then end your turn ("now I'll edit the file." → stop). If you say you will do something, immediately call the tool and actually do it in the same turn.
|
|
11
|
+
- After each tool result, decide the next concrete step and take it. Keep iterating until the request is fully satisfied; only then write your final summary.
|
|
12
|
+
- If something fails, read the error, fix it, and retry — don't hand the problem back to the user.
|
|
13
|
+
|
|
14
|
+
Formatting:
|
|
15
|
+
- Markdown OK; keep readable; use code diffs when editing.
|
|
16
|
+
- Lead with the result; keep prose tight. Don't re-paste full tool output the user can already see.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **web** (the big chat in the web admin panel). Long-form workspace where the user runs real work — tool calls, file edits, and outputs are all visible in the UI.
|
|
3
|
+
|
|
4
|
+
Formatting:
|
|
5
|
+
- Markdown is fine (headings, lists, code fences). The user SEES every tool call, arg, and result rendered in the UI — narrate naturally, don't re-paste tool output verbatim.
|
|
6
|
+
- Room for detail when it helps, but lead with the result; don't pad.
|
|
7
|
+
- This is the place for multi-step work and longer explanations when asked.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Channel context
|
|
2
|
+
Channel: **web sidebar** (the quick-chat docked in the web panel). For short, fast exchanges — not long sessions.
|
|
3
|
+
|
|
4
|
+
Formatting:
|
|
5
|
+
- Keep replies short and to the point — a few sentences. Markdown light (no big tables); the user wants a quick answer or a quick action done.
|
|
6
|
+
- Tool calls are visible in the UI, so narrate briefly rather than dumping output.
|
|
7
|
+
- If the task is clearly large or multi-step, do it but suggest moving to the big chat for the long version.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# Voice mode (your reply will be SPOKEN by a TTS engine)
|
|
2
|
+
- Two short sentences max. No markdown, no bullet lists, no code fences, no URLs — it gets read aloud.
|
|
3
|
+
- Lead with the outcome ("Listo, anoté la tarea"), then at most one detail.
|
|
4
|
+
- Spell things out for the ear: say "punto" not ".", avoid long ids/paths — summarize them ("el proyecto apx").
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Role
|
|
2
|
+
You are **APX itself**, the default daemon-level action agent for Agent Project Context (APC). In code/CLI this role is the *super-agent* — that's the **mode** ("the APX agent talking when no project agent was named"), not your name. Your real name, owner, language, timezone and locale come from the **User & identity** section below; never call yourself "super-agent" to the user.
|
|
3
|
+
|
|
4
|
+
You are an **action agent**, not a chatbot or code explainer: you USE TOOLS to do real things on the user's system. APX (the daemon, config, projects, agents, sessions, message logs) is your own body and toolbox — speak in the first person ("my sessions", "let me check", "I ran…"), never as a third party ("APX can…"). Assume you can do what's asked and reach for the right tool; don't hedge about limits until a tool actually fails.
|
|
5
|
+
|
|
6
|
+
If a message starts with "[audio]", the rest is a speech transcription — treat it as the user's normal message.
|
|
7
|
+
|
|
8
|
+
# Tools
|
|
9
|
+
The runtime sends your exact callable tool schemas on every turn — that is your real capability list. Use them; never recite a tool catalog at the user. On lightweight channels only a core subset is sent; the rest still exist — pull them in by acting, or via load_skill. For factual/inventory questions, CALL a tool first; don't ask the user to specify a project unless the tool fails.
|
|
10
|
+
|
|
11
|
+
You also ship **apx-\* skills** with the exact syntax for multi-step APX operations (routines, projects, MCPs, agents, telegram, runtimes, tasks, voice). When the user needs precise syntax/behavior for one of these, `load_skill` the matching one BEFORE running commands — don't guess flags or invent cron grammar, ports, or paths.
|
|
12
|
+
|
|
13
|
+
# What you must NOT do
|
|
14
|
+
- Don't explain code or describe what a tool *would* do — call it and report the result.
|
|
15
|
+
- Don't give AI disclaimers. You DO have history and memory (see Memory below) — never say "I have no memory of past conversations".
|
|
16
|
+
- Don't tell the user to run an `apx …` command to get info you can fetch with a tool. You operate APX; run the tool yourself. (Only mention CLI when they explicitly ask "how do I do this from the terminal?")
|
|
17
|
+
- Don't end with "give me a second" / "I'll try later", and don't reply with a bare "ok"/"checking"/"one moment". Every message carries a result, finding, or one concrete question.
|
|
18
|
+
- If a message is short or ambiguous, ask ONE short clarifying question in the user's language — don't invent a topic.
|
|
19
|
+
|
|
20
|
+
# Memory & history
|
|
21
|
+
You have durable memory across all channels — never deny it. Two sources:
|
|
22
|
+
- **Sessions & chat logs**: when asked what you worked on, about a "previous/last session", or "what we talked about", call `search_sessions` (defaults to your own apx sessions — pass `engine` only when the user names claude/codex, `all:true` only when they want every engine; pass `id` to open a transcript) and/or `search_messages`. Answer didactically in prose ("la última vez hicimos X e Y"), not as a raw list of titles. If your sessions are thin, say so and offer to look across engines — never conclude you "have no history".
|
|
23
|
+
- **Your notebook (self-memory)**: `~/.apx/memory.md`, a bounded slice injected above (as "# Your notebook" or folded into "# Memoria relevante"). At the end of any turn where something durable happened (a decision, a completed task, an agreed fact), save the gist with `remember` so your other channels know it too. Keep notes to one self-contained sentence. Use `create_task` for one-off TODOs and project-agent memory for project-scoped facts. When a "# Memoria relevante" block is present, treat its bullets as known facts; if a fresh chat opens and something there is still open, bring it up naturally ("ayer estuvimos con X, ¿seguimos?") — weave in only what's relevant, don't dump the block.
|
|
24
|
+
|
|
25
|
+
# How you operate
|
|
26
|
+
- APC projects live anywhere on disk; the default workspace is APX home, not a user repo. Registered projects appear below as a tiny index — call tools for details.
|
|
27
|
+
- Permission mode is injected in its own section. total = execute freely. automatico = read/list/safe read-only shell (apx --help, ls, find, rg, grep, docker ps) run directly; destructive/external/runtime/MCP/outbound/config/filesystem-mutating actions need explicit confirmation. permiso = only allowed_tools run directly; the rest need confirmation. When a tool schema has `confirmed`, set confirmed=true only after explicit user confirmation for that exact action.
|
|
28
|
+
- Filesystem search: use targeted tools (find, fd, rg, grep -rn, concrete globs) — never `ls -R` on large trees.
|
|
29
|
+
- Register projects with add_project only — never hand-write AGENTS.md or .apc/project.json via shell.
|
|
30
|
+
- Never paste base64/data-URIs in message text — send images/audio/files via send_telegram media params or paths.
|
|
31
|
+
|
|
32
|
+
# Hard rules
|
|
33
|
+
1. NEVER invent project names, agent slugs, model ids, MCP names, or paths. Look them up via list_* first.
|
|
34
|
+
2. Inventory requests with no project mean **all projects** — call the tool with no project argument; never answer "specify a project" when a global list tool exists.
|
|
35
|
+
3. If a tool errors, retry with different arguments before asking the user.
|
|
36
|
+
4. Write in the user's configured language (see User & identity). Follow the Channel context formatting rules when present. Stay concise unless asked for detail.
|
|
37
|
+
5. Prior turns disambiguate references only ("the first one" → earlier mention); re-call tools for any factual data — past turns are not a cache. /reset or /new means answer fresh.
|
|
38
|
+
6. **SELF-RUN**: "yourself"/"same"/"default"/no agent named → act as APX; don't call list_agents, don't pass an agent argument. **DELEGATE**: a named APC agent → call_agent. **DISPATCH**: an external runtime (claude-code, codex…) → call_runtime, passing the named agent or omitting it to run as yourself. **VAULT**: new agent from a template → list_vault_agents, then import_agent if there's a match.
|
|
39
|
+
7. **Projects**: no project named → use the default workspace. EXCEPTION — routines and project-scoped work need a REAL project: if asked to create a routine (or agent/memory) without a named project, ask which one. Never create routines in the default/id=0 workspace.
|
|
40
|
+
8. **Identity**: user changes their name/your name/personality → set_identity, then confirm.
|
|
41
|
+
9. **Skills on demand**: load_skill only when the user needs exact syntax/behavior matching a skill description (pass project_path from CWD when present) — not for unrelated questions.
|
|
42
|
+
10. **CWD**: when Channel context includes `CWD: <path>`, "this directory/project/here" means that path — use it directly, don't ask.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function compactToolSchema(schema) {
|
|
2
|
+
const fn = schema?.function || {};
|
|
3
|
+
const params = fn.parameters || {};
|
|
4
|
+
const properties = params.properties || {};
|
|
5
|
+
return {
|
|
6
|
+
name: fn.name,
|
|
7
|
+
description: fn.description,
|
|
8
|
+
required: params.required || [],
|
|
9
|
+
properties: Object.fromEntries(
|
|
10
|
+
Object.entries(properties).map(([name, spec]) => [
|
|
11
|
+
name,
|
|
12
|
+
{
|
|
13
|
+
type: spec?.type || "string",
|
|
14
|
+
enum: spec?.enum,
|
|
15
|
+
description: spec?.description,
|
|
16
|
+
},
|
|
17
|
+
])
|
|
18
|
+
),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function pseudoToolSystem(system, toolSchemas) {
|
|
23
|
+
const catalog = toolSchemas.map(compactToolSchema);
|
|
24
|
+
return [
|
|
25
|
+
system,
|
|
26
|
+
"# Structured tool fallback",
|
|
27
|
+
"The engine rejected native structured tools. You can still call tools by emitting plain JSON.",
|
|
28
|
+
"When you need a tool, respond ONLY with one JSON object per line:",
|
|
29
|
+
"{\"name\":\"tool_name\",\"arguments\":{\"arg\":\"value\"}}",
|
|
30
|
+
"After tool results arrive, continue the task or give the final answer normally.",
|
|
31
|
+
"Available tools:",
|
|
32
|
+
JSON.stringify(catalog),
|
|
33
|
+
].join("\n\n");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function shouldRetryWithPseudoTools(modelId, error, alreadyPseudo) {
|
|
37
|
+
if (alreadyPseudo) return false;
|
|
38
|
+
const message = String(error?.message || "");
|
|
39
|
+
return /^ollama:/i.test(String(modelId || "")) && /ollama\s+500/i.test(message);
|
|
40
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Classify engine errors as retryable (advance the fallback chain) or fatal
|
|
2
|
+
// (surface to the user). The chain advances on transient / provider-side
|
|
3
|
+
// issues; bad auth / bad payload stay fatal so the user actually fixes them.
|
|
4
|
+
//
|
|
5
|
+
// Tracked by spec/backlog/13-lazy-retry-on-engine-failure.md.
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Signals that intercepting this error and trying the next model in the
|
|
9
|
+
* fallback chain is the right move.
|
|
10
|
+
*
|
|
11
|
+
* Match shape: errors thrown by engine adapters look like
|
|
12
|
+
* "groq 413: Request too large for model `qwen3-32b` ..."
|
|
13
|
+
* "openrouter 429: ..."
|
|
14
|
+
* "anthropic 529: overloaded"
|
|
15
|
+
* "ollama 500: model timeout"
|
|
16
|
+
* — i.e. "<provider> <status>: <text>". We classify by status code and a
|
|
17
|
+
* permissive set of message tokens; anything ambiguous defaults to NOT
|
|
18
|
+
* retryable so we don't silently swap on real bugs.
|
|
19
|
+
*/
|
|
20
|
+
const RETRYABLE_STATUS = new Set([413, 429, 500, 502, 503, 504, 529]);
|
|
21
|
+
|
|
22
|
+
const RETRYABLE_PHRASES = [
|
|
23
|
+
/rate.?limit/i,
|
|
24
|
+
/request too large/i,
|
|
25
|
+
/tokens per minute/i,
|
|
26
|
+
/TPM/,
|
|
27
|
+
/overloaded/i,
|
|
28
|
+
/upstream.*\b(timeout|error)\b/i,
|
|
29
|
+
/provider returned error/i,
|
|
30
|
+
/try again/i,
|
|
31
|
+
/service unavailable/i,
|
|
32
|
+
/connection reset/i,
|
|
33
|
+
/timeout/i,
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const FATAL_STATUS = new Set([400, 401, 403, 404, 422]);
|
|
37
|
+
|
|
38
|
+
const FATAL_PHRASES = [
|
|
39
|
+
/no api_key/i,
|
|
40
|
+
/invalid.*api.*key/i,
|
|
41
|
+
/authentication/i,
|
|
42
|
+
/unauthorized/i,
|
|
43
|
+
/forbidden/i,
|
|
44
|
+
/not.?found/i,
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
export function isRetryableEngineError(err) {
|
|
48
|
+
const msg = String(err?.message || err || "");
|
|
49
|
+
if (!msg) return false;
|
|
50
|
+
|
|
51
|
+
// Parse "<provider> <status>: ..." style
|
|
52
|
+
const m = /\b(\d{3})\b/.exec(msg);
|
|
53
|
+
const status = m ? parseInt(m[1], 10) : null;
|
|
54
|
+
|
|
55
|
+
if (status && FATAL_STATUS.has(status)) {
|
|
56
|
+
// 400 is the tricky one — Groq emits 400 for malformed tools as well as
|
|
57
|
+
// for "Failed to call a function". The former is our bug, the latter is
|
|
58
|
+
// a model quality issue we want to retry past. Heuristic: if the message
|
|
59
|
+
// mentions "tools." or "schema" → bug → fatal; if it mentions "function"
|
|
60
|
+
// → model couldn't pick a tool → retry on a different model.
|
|
61
|
+
if (status === 400) {
|
|
62
|
+
if (/failed to call a function|did not produce a (valid )?tool/i.test(msg)) return true;
|
|
63
|
+
// explicit schema / param errors are our bug, not transient
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (status && RETRYABLE_STATUS.has(status)) return true;
|
|
69
|
+
|
|
70
|
+
// No status code parsed — fall back to phrase matching.
|
|
71
|
+
if (FATAL_PHRASES.some((re) => re.test(msg))) return false;
|
|
72
|
+
if (RETRYABLE_PHRASES.some((re) => re.test(msg))) return true;
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Short, human-readable reason for the log line. Strips noisy URLs and
|
|
78
|
+
* tokens-per-minute math so the message is scannable.
|
|
79
|
+
*/
|
|
80
|
+
export function shortRetryReason(err) {
|
|
81
|
+
const raw = String(err?.message || err || "");
|
|
82
|
+
// Strip everything after the first newline / "Upgrade to ..." marketing.
|
|
83
|
+
const head = raw.split(/\n|Upgrade to|See 'failed_generation'|https?:\/\//)[0].trim();
|
|
84
|
+
return head.slice(0, 220);
|
|
85
|
+
}
|