@agentprojectcontext/apx 1.25.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,231 @@
|
|
|
1
|
+
// Vector store for the cross-channel memory RAG (Pieza 2).
|
|
2
|
+
//
|
|
3
|
+
// Dual backend, chosen at open() time:
|
|
4
|
+
// 1. SqliteVecStore — better-sqlite3 + the sqlite-vec extension, persisted to
|
|
5
|
+
// ~/.apx/memory.db. Uses vec_distance_cosine() for scoring. Preferred.
|
|
6
|
+
// 2. JsonStore — a dependency-free JSONL file with brute-force cosine in JS.
|
|
7
|
+
// Used when better-sqlite3 / sqlite-vec can't load (no native binary).
|
|
8
|
+
//
|
|
9
|
+
// Both expose the same interface:
|
|
10
|
+
// upsert(rows) rows: {id, source, channel, ts, tag, text, embedder, dim, vector}
|
|
11
|
+
// search(vector, {embedder, k, channel}) -> [{...row, score}]
|
|
12
|
+
// hasId(id) / count()
|
|
13
|
+
// close()
|
|
14
|
+
//
|
|
15
|
+
// Cosine is only meaningful within one embedder space, so search() filters to
|
|
16
|
+
// rows whose `embedder` matches the query's embedder. Everything here is
|
|
17
|
+
// best-effort: open() never throws — on any failure it returns a JsonStore.
|
|
18
|
+
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
import { cosineSim } from "./embeddings.js";
|
|
22
|
+
|
|
23
|
+
function vecToBlob(vec) {
|
|
24
|
+
const f = new Float32Array(vec);
|
|
25
|
+
return Buffer.from(f.buffer, f.byteOffset, f.byteLength);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// JSON fallback store
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
export class JsonStore {
|
|
32
|
+
constructor(jsonPath) {
|
|
33
|
+
this.jsonPath = jsonPath;
|
|
34
|
+
this.rows = new Map(); // id -> row {id, source, channel, ts, tag, text, embedder, dim, vector}
|
|
35
|
+
this.backend = "json";
|
|
36
|
+
this._load();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_load() {
|
|
40
|
+
try {
|
|
41
|
+
const text = fs.readFileSync(this.jsonPath, "utf8");
|
|
42
|
+
for (const line of text.split("\n")) {
|
|
43
|
+
const t = line.trim();
|
|
44
|
+
if (!t) continue;
|
|
45
|
+
try {
|
|
46
|
+
const row = JSON.parse(t);
|
|
47
|
+
if (row && row.id) this.rows.set(row.id, row);
|
|
48
|
+
} catch {
|
|
49
|
+
/* skip bad line */
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
/* no file yet */
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
_flush() {
|
|
58
|
+
fs.mkdirSync(path.dirname(this.jsonPath), { recursive: true });
|
|
59
|
+
const lines = [];
|
|
60
|
+
for (const row of this.rows.values()) lines.push(JSON.stringify(row));
|
|
61
|
+
const tmp = `${this.jsonPath}.tmp`;
|
|
62
|
+
fs.writeFileSync(tmp, lines.join("\n") + (lines.length ? "\n" : ""));
|
|
63
|
+
fs.renameSync(tmp, this.jsonPath);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
upsert(rows) {
|
|
67
|
+
let n = 0;
|
|
68
|
+
for (const r of rows) {
|
|
69
|
+
if (!r || !r.id) continue;
|
|
70
|
+
this.rows.set(r.id, r);
|
|
71
|
+
n++;
|
|
72
|
+
}
|
|
73
|
+
if (n) this._flush();
|
|
74
|
+
return n;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
hasId(id) {
|
|
78
|
+
return this.rows.has(id);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
count() {
|
|
82
|
+
return this.rows.size;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
clear() {
|
|
86
|
+
this.rows.clear();
|
|
87
|
+
this._flush();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
search(vector, { embedder, k = 5, channel } = {}) {
|
|
91
|
+
const scored = [];
|
|
92
|
+
for (const row of this.rows.values()) {
|
|
93
|
+
if (embedder && row.embedder !== embedder) continue;
|
|
94
|
+
if (channel && row.channel !== channel) continue;
|
|
95
|
+
if (!Array.isArray(row.vector) || row.vector.length !== vector.length) continue;
|
|
96
|
+
scored.push({ ...row, score: cosineSim(vector, row.vector) });
|
|
97
|
+
}
|
|
98
|
+
scored.sort((a, b) => b.score - a.score);
|
|
99
|
+
return scored.slice(0, k);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
close() {
|
|
103
|
+
/* nothing to release */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// sqlite-vec store
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
class SqliteVecStore {
|
|
111
|
+
constructor(db) {
|
|
112
|
+
this.db = db;
|
|
113
|
+
this.backend = "sqlite-vec";
|
|
114
|
+
db.exec(`
|
|
115
|
+
CREATE TABLE IF NOT EXISTS chunks (
|
|
116
|
+
id TEXT PRIMARY KEY,
|
|
117
|
+
source TEXT,
|
|
118
|
+
channel TEXT,
|
|
119
|
+
ts TEXT,
|
|
120
|
+
tag TEXT,
|
|
121
|
+
text TEXT,
|
|
122
|
+
embedder TEXT,
|
|
123
|
+
dim INTEGER,
|
|
124
|
+
vec BLOB
|
|
125
|
+
);
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_chunks_embedder ON chunks(embedder);
|
|
127
|
+
`);
|
|
128
|
+
this._insert = db.prepare(
|
|
129
|
+
`INSERT INTO chunks (id, source, channel, ts, tag, text, embedder, dim, vec)
|
|
130
|
+
VALUES (@id, @source, @channel, @ts, @tag, @text, @embedder, @dim, @vec)
|
|
131
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
132
|
+
source=@source, channel=@channel, ts=@ts, tag=@tag, text=@text,
|
|
133
|
+
embedder=@embedder, dim=@dim, vec=@vec`
|
|
134
|
+
);
|
|
135
|
+
this._has = db.prepare("SELECT 1 FROM chunks WHERE id = ?");
|
|
136
|
+
this._count = db.prepare("SELECT COUNT(*) AS n FROM chunks");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
upsert(rows) {
|
|
140
|
+
const tx = this.db.transaction((items) => {
|
|
141
|
+
let n = 0;
|
|
142
|
+
for (const r of items) {
|
|
143
|
+
if (!r || !r.id) continue;
|
|
144
|
+
this._insert.run({
|
|
145
|
+
id: r.id,
|
|
146
|
+
source: r.source || null,
|
|
147
|
+
channel: r.channel || null,
|
|
148
|
+
ts: r.ts || null,
|
|
149
|
+
tag: r.tag || null,
|
|
150
|
+
text: r.text || "",
|
|
151
|
+
embedder: r.embedder || null,
|
|
152
|
+
dim: r.dim || (r.vector ? r.vector.length : 0),
|
|
153
|
+
vec: vecToBlob(r.vector),
|
|
154
|
+
});
|
|
155
|
+
n++;
|
|
156
|
+
}
|
|
157
|
+
return n;
|
|
158
|
+
});
|
|
159
|
+
return tx(rows);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
hasId(id) {
|
|
163
|
+
return !!this._has.get(id);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
count() {
|
|
167
|
+
return this._count.get().n;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
clear() {
|
|
171
|
+
this.db.prepare("DELETE FROM chunks").run();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
search(vector, { embedder, k = 5, channel } = {}) {
|
|
175
|
+
const blob = vecToBlob(vector);
|
|
176
|
+
const where = ["embedder = ?", "dim = ?"];
|
|
177
|
+
const params = [embedder, vector.length];
|
|
178
|
+
if (channel) {
|
|
179
|
+
where.push("channel = ?");
|
|
180
|
+
params.push(channel);
|
|
181
|
+
}
|
|
182
|
+
const rows = this.db
|
|
183
|
+
.prepare(
|
|
184
|
+
`SELECT id, source, channel, ts, tag, text, embedder, dim,
|
|
185
|
+
vec_distance_cosine(vec, ?) AS dist
|
|
186
|
+
FROM chunks
|
|
187
|
+
WHERE ${where.join(" AND ")}
|
|
188
|
+
ORDER BY dist ASC
|
|
189
|
+
LIMIT ?`
|
|
190
|
+
)
|
|
191
|
+
.all(blob, ...params, k);
|
|
192
|
+
// cosine distance → similarity score in [0,1] (sqlite-vec returns 1 - cos).
|
|
193
|
+
return rows.map((r) => ({ ...r, score: 1 - r.dist }));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
close() {
|
|
197
|
+
try {
|
|
198
|
+
this.db.close();
|
|
199
|
+
} catch {
|
|
200
|
+
/* ignore */
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Open the vector store. Async because the native modules are dynamically
|
|
206
|
+
// imported. Tries the sqlite-vec backend first; on ANY failure (module missing,
|
|
207
|
+
// extension load error, broken build) it returns a JsonStore. Never throws.
|
|
208
|
+
export async function openMemoryStore({ dbPath, jsonPath, log } = {}) {
|
|
209
|
+
const note = typeof log === "function" ? log : () => {};
|
|
210
|
+
if (!process.env.APX_MEMORY_FORCE_JSON) {
|
|
211
|
+
try {
|
|
212
|
+
const [{ default: Database }, sqliteVec] = await Promise.all([
|
|
213
|
+
import("better-sqlite3"),
|
|
214
|
+
import("sqlite-vec"),
|
|
215
|
+
]);
|
|
216
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
217
|
+
const db = new Database(dbPath);
|
|
218
|
+
sqliteVec.load(db);
|
|
219
|
+
// Smoke-test the extension so a broken build falls back cleanly.
|
|
220
|
+
db.prepare("SELECT vec_distance_cosine(?, ?) AS d").get(
|
|
221
|
+
vecToBlob([1, 0]),
|
|
222
|
+
vecToBlob([1, 0])
|
|
223
|
+
);
|
|
224
|
+
note("memory: sqlite-vec backend active (" + dbPath + ")");
|
|
225
|
+
return new SqliteVecStore(db);
|
|
226
|
+
} catch (e) {
|
|
227
|
+
note("memory: sqlite-vec unavailable (" + (e?.message || e) + ") — JSON fallback");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return new JsonStore(jsonPath);
|
|
231
|
+
}
|
|
@@ -32,12 +32,41 @@ function dayPathMd(projectRoot, ts) {
|
|
|
32
32
|
return path.join(projectRoot, "messages", `${day}.md`);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
// `compact` is a progressive-compaction summary record (Pieza 3): a dense
|
|
36
|
+
// recap of older turns, stored inline in the channel JSONL so the reader can
|
|
37
|
+
// prepend it as a [RESUMEN COMPACTADO] system turn instead of replaying the
|
|
38
|
+
// raw history it covers.
|
|
39
|
+
const VALID_MESSAGE_TYPES = new Set(["user", "agent", "tool", "system", "compact"]);
|
|
40
|
+
|
|
41
|
+
// Render class (`type`) stays a 4-value enum the UI branches on. `actor_kind`
|
|
42
|
+
// is a finer discriminator stored in meta: who/what actually produced the turn.
|
|
43
|
+
// superagent — the APX daemon-level agent (persona from identity.json)
|
|
44
|
+
// agent — a project agent (its own slug/persona, may run on any engine)
|
|
45
|
+
// engine — a raw external engine reply with no project-agent persona
|
|
46
|
+
// user / tool / system — mirror the render class
|
|
47
|
+
const VALID_ACTOR_KINDS = new Set(["superagent", "agent", "engine", "user", "tool", "system", "compact"]);
|
|
36
48
|
|
|
37
49
|
function normalizeMessageType(type) {
|
|
38
50
|
return typeof type === "string" && VALID_MESSAGE_TYPES.has(type) ? type : null;
|
|
39
51
|
}
|
|
40
52
|
|
|
53
|
+
function normalizeActorKind(kind) {
|
|
54
|
+
return typeof kind === "string" && VALID_ACTOR_KINDS.has(kind) ? kind : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Best-effort classification of the actor when not given explicitly. Legacy
|
|
58
|
+
// records (and most call sites) don't set actor_kind, so this keeps history
|
|
59
|
+
// queryable: a `type:"agent"` turn whose actor_id is the stable super-agent id
|
|
60
|
+
// is a "superagent"; any other agent turn is a project "agent".
|
|
61
|
+
function inferActorKind({ actor_kind, type, actor_id, meta = {} } = {}) {
|
|
62
|
+
const explicit = normalizeActorKind(actor_kind) || normalizeActorKind(meta.actor_kind);
|
|
63
|
+
if (explicit) return explicit;
|
|
64
|
+
if (type === "compact") return "compact";
|
|
65
|
+
if (type === "user" || type === "tool" || type === "system") return type;
|
|
66
|
+
if (type === "agent") return actor_id === "super_agent" ? "superagent" : "agent";
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
41
70
|
export function inferMessageType({ type, channel, direction, author, agent_slug, meta = {} } = {}) {
|
|
42
71
|
const explicit = normalizeMessageType(type) || normalizeMessageType(meta.type) || normalizeMessageType(meta.actor_type);
|
|
43
72
|
if (explicit) return explicit;
|
|
@@ -57,28 +86,31 @@ function inferActorId({ type, actor_id, author, agent_slug, meta = {} } = {}) {
|
|
|
57
86
|
if (type === "agent") return agent_slug || author || "agent";
|
|
58
87
|
if (type === "tool") return meta.tool || meta.tool_name || author || "tool";
|
|
59
88
|
if (type === "system") return author || "system";
|
|
89
|
+
if (type === "compact") return "compact";
|
|
60
90
|
return author || null;
|
|
61
91
|
}
|
|
62
92
|
|
|
63
|
-
function messageMeta({ type, actor_id, agent_slug, session_id, external_id, meta = {} }) {
|
|
93
|
+
function messageMeta({ type, actor_id, actor_kind, agent_slug, session_id, external_id, meta = {} }) {
|
|
64
94
|
return {
|
|
65
95
|
...meta,
|
|
66
96
|
type,
|
|
67
97
|
...(actor_id ? { actor_id } : {}),
|
|
98
|
+
...(actor_kind ? { actor_kind } : {}),
|
|
68
99
|
...(agent_slug ? { agent: agent_slug } : {}),
|
|
69
100
|
...(session_id ? { session_id } : {}),
|
|
70
101
|
...(external_id ? { external_id } : {}),
|
|
71
102
|
};
|
|
72
103
|
}
|
|
73
104
|
|
|
74
|
-
export function appendMessageToFs({ projectRoot, channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
|
|
105
|
+
export function appendMessageToFs({ projectRoot, channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
|
|
75
106
|
ts = ts || nowIso();
|
|
76
107
|
const file = dayPathJsonl(projectRoot, ts);
|
|
77
108
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
78
109
|
|
|
79
110
|
const msgType = inferMessageType({ type, channel, direction, author, agent_slug, meta });
|
|
80
111
|
const msgActorId = inferActorId({ type: msgType, actor_id, author, agent_slug, meta });
|
|
81
|
-
const
|
|
112
|
+
const msgActorKind = inferActorKind({ actor_kind, type: msgType, actor_id: msgActorId, meta });
|
|
113
|
+
const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, actor_kind: msgActorKind, agent_slug, session_id, external_id, meta });
|
|
82
114
|
|
|
83
115
|
const record = {
|
|
84
116
|
ts,
|
|
@@ -104,9 +136,11 @@ export function insertMessageRow(db, m) {
|
|
|
104
136
|
}
|
|
105
137
|
const type = inferMessageType(m);
|
|
106
138
|
const actor_id = inferActorId({ ...m, type });
|
|
139
|
+
const actor_kind = inferActorKind({ actor_kind: m.actor_kind, type, actor_id, meta: m.meta || {} });
|
|
107
140
|
const meta = messageMeta({
|
|
108
141
|
type,
|
|
109
142
|
actor_id,
|
|
143
|
+
actor_kind,
|
|
110
144
|
agent_slug: m.agent_slug,
|
|
111
145
|
session_id: m.session_id,
|
|
112
146
|
external_id: m.external_id,
|
|
@@ -131,13 +165,14 @@ export function insertMessageRow(db, m) {
|
|
|
131
165
|
}
|
|
132
166
|
|
|
133
167
|
// Single entry point used by everywhere the daemon writes a message.
|
|
134
|
-
export function appendMessage({ projectRoot, db, channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
|
|
168
|
+
export function appendMessage({ projectRoot, db, channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, session_id, external_id }) {
|
|
135
169
|
const written = appendMessageToFs({
|
|
136
170
|
projectRoot,
|
|
137
171
|
channel,
|
|
138
172
|
direction,
|
|
139
173
|
type,
|
|
140
174
|
actor_id,
|
|
175
|
+
actor_kind,
|
|
141
176
|
author,
|
|
142
177
|
body,
|
|
143
178
|
meta,
|
|
@@ -151,6 +186,7 @@ export function appendMessage({ projectRoot, db, channel, direction, type, actor
|
|
|
151
186
|
direction,
|
|
152
187
|
type,
|
|
153
188
|
actor_id,
|
|
189
|
+
actor_kind,
|
|
154
190
|
author,
|
|
155
191
|
body,
|
|
156
192
|
meta,
|
|
@@ -188,6 +224,7 @@ export function parseDayJsonl(text) {
|
|
|
188
224
|
agent_slug,
|
|
189
225
|
meta,
|
|
190
226
|
});
|
|
227
|
+
const actor_kind = inferActorKind({ actor_kind: obj.actor_kind, type, actor_id, meta });
|
|
191
228
|
out.push({
|
|
192
229
|
ts: obj.ts,
|
|
193
230
|
channel: obj.channel,
|
|
@@ -195,6 +232,7 @@ export function parseDayJsonl(text) {
|
|
|
195
232
|
type,
|
|
196
233
|
author: obj.author,
|
|
197
234
|
actor_id,
|
|
235
|
+
actor_kind,
|
|
198
236
|
body: obj.body || "",
|
|
199
237
|
meta,
|
|
200
238
|
agent_slug,
|
|
@@ -228,10 +266,12 @@ export function parseDayFile(text) {
|
|
|
228
266
|
const agent_slug = meta.agent;
|
|
229
267
|
const type = inferMessageType({ channel, direction, author, agent_slug, meta });
|
|
230
268
|
const actor_id = inferActorId({ type, author, agent_slug, meta });
|
|
269
|
+
const actor_kind = inferActorKind({ type, actor_id, meta });
|
|
231
270
|
out.push({
|
|
232
271
|
ts, channel, direction, author, body, meta,
|
|
233
272
|
type,
|
|
234
273
|
actor_id,
|
|
274
|
+
actor_kind,
|
|
235
275
|
agent_slug,
|
|
236
276
|
session_id: meta.session_id ?? (typeof meta.apc_session_id === "number" ? meta.apc_session_id : null),
|
|
237
277
|
external_id: meta.external_id,
|
|
@@ -376,20 +416,59 @@ export function searchProjectMessages(projectRoot, query, limit = 50) {
|
|
|
376
416
|
return all.slice(0, Math.min(limit, 500));
|
|
377
417
|
}
|
|
378
418
|
|
|
379
|
-
//
|
|
419
|
+
const TOOL_CONTEXT_CAP = 400; // chars of a tool result kept in model context
|
|
420
|
+
|
|
421
|
+
// Truncated, prefixed rendering of a tool result for model context (Pieza 3).
|
|
422
|
+
function renderToolResult(m) {
|
|
423
|
+
const name = m.meta?.tool_name || m.meta?.tool || m.actor_id || "tool";
|
|
424
|
+
const body = String(m.body || "").replace(/\s+/g, " ").trim();
|
|
425
|
+
return `[tool result: ${name}] ${body}`.slice(0, TOOL_CONTEXT_CAP);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// Collapse consecutive same-role entries into one message. Keeps the model
|
|
429
|
+
// context clean and side-steps engines (Anthropic) that dislike consecutive
|
|
430
|
+
// same-role turns once tool results land on the assistant side.
|
|
431
|
+
function coalesceTurns(turns) {
|
|
432
|
+
const out = [];
|
|
433
|
+
for (const t of turns) {
|
|
434
|
+
const prev = out[out.length - 1];
|
|
435
|
+
if (prev && prev.role === t.role) {
|
|
436
|
+
prev.content = `${prev.content}\n${t.content}`.trim();
|
|
437
|
+
} else {
|
|
438
|
+
out.push({ role: t.role, content: t.content });
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return out;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// File-based channel turn history (Pieza 3). Reads ~/.apx/messages/<channel>/
|
|
445
|
+
// JSONL and shapes it for use as `previousMessages`:
|
|
446
|
+
// - the latest `compact` record (if any) is prepended as a role:"system"
|
|
447
|
+
// turn "[RESUMEN COMPACTADO turnos a-b]: …"; the raw turns it covers are
|
|
448
|
+
// dropped (they live in the summary now)
|
|
449
|
+
// - tool results are INCLUDED, truncated to 400 chars, prefixed
|
|
450
|
+
// "[tool result: <tool>]" (kept on the assistant side)
|
|
451
|
+
// - the most recent `keepRecent` conversational turns are kept verbatim
|
|
452
|
+
// - consecutive same-role turns are coalesced
|
|
453
|
+
//
|
|
380
454
|
// Pass _globalMessagesDir to override the default dir (useful in tests).
|
|
381
|
-
export function
|
|
455
|
+
export function getRecentChannelTurnsFromFs({
|
|
456
|
+
channel = "telegram",
|
|
382
457
|
chat_id,
|
|
383
|
-
limit
|
|
458
|
+
// Back-compat: `limit` (if given) is treated as the verbatim-turn budget.
|
|
459
|
+
limit,
|
|
460
|
+
keepRecent = 40,
|
|
384
461
|
max_age_hours = 24,
|
|
462
|
+
includeTools = true,
|
|
385
463
|
_globalMessagesDir,
|
|
386
464
|
} = {}) {
|
|
387
465
|
if (!chat_id) return [];
|
|
466
|
+
const keep = Number.isFinite(limit) ? limit : keepRecent;
|
|
388
467
|
const cutoff = new Date(Date.now() - max_age_hours * 3600_000)
|
|
389
468
|
.toISOString()
|
|
390
469
|
.replace(/\.\d{3}Z$/, "Z");
|
|
391
470
|
const base = _globalMessagesDir || GLOBAL_MESSAGES_DIR;
|
|
392
|
-
const dir = path.join(base,
|
|
471
|
+
const dir = path.join(base, channel);
|
|
393
472
|
if (!fs.existsSync(dir)) return [];
|
|
394
473
|
const all = [];
|
|
395
474
|
for (const f of fs.readdirSync(dir).sort()) {
|
|
@@ -401,20 +480,58 @@ export function getRecentTelegramTurnsFromFs({
|
|
|
401
480
|
}
|
|
402
481
|
}
|
|
403
482
|
all.sort((a, b) => (a.ts || "").localeCompare(b.ts || ""));
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
483
|
+
const mine = all.filter((m) => String(m.meta?.chat_id ?? "") === String(chat_id));
|
|
484
|
+
|
|
485
|
+
// Latest compact record wins; everything it covers is replaced by its summary.
|
|
486
|
+
let compact = null;
|
|
487
|
+
for (const m of mine) if (m.type === "compact") compact = m;
|
|
488
|
+
const coverUntil = compact ? compact.meta?.covers_until_ts || compact.ts : "";
|
|
489
|
+
|
|
490
|
+
const eligible = mine.filter(
|
|
491
|
+
(m) =>
|
|
492
|
+
(m.type === "user" || m.type === "agent" || (includeTools && m.type === "tool")) &&
|
|
493
|
+
(!coverUntil || m.ts > coverUntil)
|
|
494
|
+
);
|
|
495
|
+
|
|
496
|
+
// Keep the last `keep` conversational (user/agent) turns plus any tool
|
|
497
|
+
// results interleaved among them.
|
|
498
|
+
const kept = [];
|
|
499
|
+
let realCount = 0;
|
|
500
|
+
for (let i = eligible.length - 1; i >= 0; i--) {
|
|
501
|
+
const m = eligible[i];
|
|
502
|
+
kept.push(m);
|
|
503
|
+
if (m.type === "user" || m.type === "agent") realCount++;
|
|
504
|
+
if (realCount >= keep) break;
|
|
505
|
+
}
|
|
506
|
+
kept.reverse();
|
|
507
|
+
|
|
508
|
+
const turns = [];
|
|
509
|
+
if (compact && String(compact.body || "").trim()) {
|
|
510
|
+
const range = compact.meta?.range;
|
|
511
|
+
const label = Array.isArray(range)
|
|
512
|
+
? `turnos ${range[0]}-${range[1]}`
|
|
513
|
+
: `${compact.meta?.count || ""} turnos previos`.trim();
|
|
514
|
+
turns.push({
|
|
515
|
+
role: "system",
|
|
516
|
+
content: `[RESUMEN COMPACTADO ${label}]:\n${String(compact.body).trim()}`,
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
for (const m of kept) {
|
|
520
|
+
if (m.type === "tool") {
|
|
521
|
+
turns.push({ role: "assistant", content: renderToolResult(m) });
|
|
522
|
+
} else {
|
|
523
|
+
const role = m.type === "user" ? "user" : "assistant";
|
|
524
|
+
let content = m.body;
|
|
525
|
+
if (role === "assistant") content = sanitizeAssistantForContext(content);
|
|
526
|
+
turns.push({ role, content });
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return coalesceTurns(turns);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Telegram-specific wrapper kept for back-compat with existing call sites.
|
|
533
|
+
export function getRecentTelegramTurnsFromFs(opts = {}) {
|
|
534
|
+
return getRecentChannelTurnsFromFs({ ...opts, channel: "telegram" });
|
|
418
535
|
}
|
|
419
536
|
|
|
420
537
|
// ---------------------------------------------------------------------------
|
|
@@ -422,14 +539,15 @@ export function getRecentTelegramTurnsFromFs({
|
|
|
422
539
|
// ---------------------------------------------------------------------------
|
|
423
540
|
|
|
424
541
|
// Write a message to the global channel store. No SQL cache — JSONL only.
|
|
425
|
-
export function appendGlobalMessage({ channel, direction, type, actor_id, author, body, meta = {}, ts, agent_slug, external_id }) {
|
|
542
|
+
export function appendGlobalMessage({ channel, direction, type, actor_id, actor_kind, author, body, meta = {}, ts, agent_slug, external_id }) {
|
|
426
543
|
ts = ts || nowIso();
|
|
427
544
|
const dir = path.join(GLOBAL_MESSAGES_DIR, channel);
|
|
428
545
|
fs.mkdirSync(dir, { recursive: true });
|
|
429
546
|
const file = path.join(dir, `${ts.slice(0, 10)}.jsonl`);
|
|
430
547
|
const msgType = inferMessageType({ type, channel, direction, author, agent_slug, meta });
|
|
431
548
|
const msgActorId = inferActorId({ type: msgType, actor_id, author, agent_slug, meta });
|
|
432
|
-
const
|
|
549
|
+
const msgActorKind = inferActorKind({ actor_kind, type: msgType, actor_id: msgActorId, meta });
|
|
550
|
+
const fullMeta = messageMeta({ type: msgType, actor_id: msgActorId, actor_kind: msgActorKind, agent_slug, external_id, meta });
|
|
433
551
|
const record = {
|
|
434
552
|
ts,
|
|
435
553
|
channel,
|
package/src/core/parser.js
CHANGED
|
@@ -104,41 +104,103 @@ export function readAgentsFromDir(root) {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
// ---------------------------------------------------------------------------
|
|
107
|
-
// Vault —
|
|
107
|
+
// Vault — global, project-agnostic agent templates.
|
|
108
|
+
// Two-layer model:
|
|
109
|
+
// - BUNDLED → assets/agent-vault-defaults/<slug>.md, shipped with APX,
|
|
110
|
+
// always visible. Read-only on the user's machine.
|
|
111
|
+
// - USER → ~/.apx/agents/<slug>.md, the user's own additions and
|
|
112
|
+
// overrides on top of the bundle. User layer wins per-slug.
|
|
113
|
+
// - REMOVED → ~/.apx/agents/.removed.json, tombstones (slugs the user
|
|
114
|
+
// explicitly deleted). Hidden from listings until restored.
|
|
115
|
+
// Reading: BUNDLED ∪ USER, dedup by slug (user wins), filter tombstones.
|
|
116
|
+
// Writing: always to the USER layer (copy-on-write). Removing: tombstones
|
|
117
|
+
// if it's a bundled slug, deletes the user file otherwise.
|
|
108
118
|
// ---------------------------------------------------------------------------
|
|
109
119
|
|
|
110
120
|
import os from "node:os";
|
|
121
|
+
import { fileURLToPath } from "node:url";
|
|
122
|
+
|
|
123
|
+
const __parserDir = path.dirname(fileURLToPath(import.meta.url));
|
|
111
124
|
|
|
112
125
|
export const VAULT_DIR = path.join(os.homedir(), ".apx", "agents");
|
|
126
|
+
export const BUNDLED_VAULT_DIR = path.resolve(__parserDir, "../../assets/agent-vault-defaults");
|
|
127
|
+
export const VAULT_TOMBSTONE_PATH = path.join(VAULT_DIR, ".removed.json");
|
|
113
128
|
|
|
114
|
-
|
|
115
|
-
if (!fs.existsSync(
|
|
129
|
+
function readVaultDirRaw(dir) {
|
|
130
|
+
if (!fs.existsSync(dir)) return [];
|
|
116
131
|
return fs
|
|
117
|
-
.readdirSync(
|
|
132
|
+
.readdirSync(dir)
|
|
118
133
|
.filter((f) => f.endsWith(".md") && SLUG_RE.test(f.slice(0, -3)))
|
|
119
134
|
.sort()
|
|
120
|
-
.map((f) => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
135
|
+
.map((f) => ({ slug: f.slice(0, -3), file: path.join(dir, f) }));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function readVaultTombstones() {
|
|
139
|
+
if (!fs.existsSync(VAULT_TOMBSTONE_PATH)) return new Set();
|
|
140
|
+
try {
|
|
141
|
+
const raw = JSON.parse(fs.readFileSync(VAULT_TOMBSTONE_PATH, "utf8"));
|
|
142
|
+
return new Set(Array.isArray(raw.slugs) ? raw.slugs : []);
|
|
143
|
+
} catch { return new Set(); }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function writeVaultTombstones(slugs) {
|
|
147
|
+
fs.mkdirSync(VAULT_DIR, { recursive: true });
|
|
148
|
+
fs.writeFileSync(
|
|
149
|
+
VAULT_TOMBSTONE_PATH,
|
|
150
|
+
JSON.stringify({ slugs: [...slugs].sort() }, null, 2) + "\n",
|
|
151
|
+
);
|
|
125
152
|
}
|
|
126
153
|
|
|
127
|
-
|
|
154
|
+
export function readVaultAgents({ includeRemoved = false } = {}) {
|
|
155
|
+
const tombstones = readVaultTombstones();
|
|
156
|
+
// Build a map slug → { agent, source }. User layer overrides bundled.
|
|
157
|
+
const bySlug = new Map();
|
|
158
|
+
for (const { slug, file } of readVaultDirRaw(BUNDLED_VAULT_DIR)) {
|
|
159
|
+
if (!includeRemoved && tombstones.has(slug)) continue;
|
|
160
|
+
const agent = parseAgentFile(slug, fs.readFileSync(file, "utf8"));
|
|
161
|
+
bySlug.set(slug, { ...agent, source: "bundled" });
|
|
162
|
+
}
|
|
163
|
+
for (const { slug, file } of readVaultDirRaw(VAULT_DIR)) {
|
|
164
|
+
if (!includeRemoved && tombstones.has(slug)) continue;
|
|
165
|
+
const agent = parseAgentFile(slug, fs.readFileSync(file, "utf8"));
|
|
166
|
+
const overrides = bySlug.has(slug);
|
|
167
|
+
bySlug.set(slug, { ...agent, source: overrides ? "user-override" : "user" });
|
|
168
|
+
}
|
|
169
|
+
return [...bySlug.values()].sort((a, b) => a.slug.localeCompare(b.slug));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Resolve a single vault agent honoring the layered model. Returns null when
|
|
173
|
+
// the slug is missing or tombstoned (unless includeRemoved is true).
|
|
174
|
+
function readVaultAgent(slug, { includeRemoved = false } = {}) {
|
|
175
|
+
if (!includeRemoved && readVaultTombstones().has(slug)) return null;
|
|
176
|
+
const userPath = path.join(VAULT_DIR, `${slug}.md`);
|
|
177
|
+
if (fs.existsSync(userPath)) {
|
|
178
|
+
const agent = parseAgentFile(slug, fs.readFileSync(userPath, "utf8"));
|
|
179
|
+
const overrides = fs.existsSync(path.join(BUNDLED_VAULT_DIR, `${slug}.md`));
|
|
180
|
+
return { ...agent, source: overrides ? "user-override" : "user" };
|
|
181
|
+
}
|
|
182
|
+
const bundledPath = path.join(BUNDLED_VAULT_DIR, `${slug}.md`);
|
|
183
|
+
if (fs.existsSync(bundledPath)) {
|
|
184
|
+
const agent = parseAgentFile(slug, fs.readFileSync(bundledPath, "utf8"));
|
|
185
|
+
return { ...agent, source: "bundled" };
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Resolve a single agent for a project: local file → vault (layered) → null.
|
|
128
191
|
export function resolveAgent(root, slug) {
|
|
129
192
|
const localPath = path.join(root, ".apc", "agents", `${slug}.md`);
|
|
130
193
|
if (fs.existsSync(localPath)) {
|
|
131
194
|
const agent = parseAgentFile(slug, fs.readFileSync(localPath, "utf8"));
|
|
132
195
|
return { ...agent, source: "local" };
|
|
133
196
|
}
|
|
134
|
-
|
|
135
|
-
if (fs.existsSync(vaultPath)) {
|
|
136
|
-
const agent = parseAgentFile(slug, fs.readFileSync(vaultPath, "utf8"));
|
|
137
|
-
return { ...agent, source: "vault" };
|
|
138
|
-
}
|
|
139
|
-
return null;
|
|
197
|
+
return readVaultAgent(slug);
|
|
140
198
|
}
|
|
141
199
|
|
|
200
|
+
// Exported for callers (CLI rm/edit, API DELETE/PATCH) that need to know
|
|
201
|
+
// whether a slug is user-layer, bundled, or absent before acting.
|
|
202
|
+
export { readVaultAgent };
|
|
203
|
+
|
|
142
204
|
// Return slugs imported from vault in this project (from project.json)
|
|
143
205
|
export function importedVaultSlugs(root) {
|
|
144
206
|
const p = path.join(root, ".apc", "project.json");
|