Set app version to 0.7.0 and update roadmap
Browse files- ROADMAP.md +58 -50
- VERSION +1 -0
- backend/main.py +4 -2
- frontend/package-lock.json +2 -2
- frontend/package.json +1 -1
- frontend/src/App.tsx +5 -0
- frontend/src/components/SettingsView.tsx +4 -2
- frontend/src/services/runtimeConfig.ts +3 -0
ROADMAP.md
CHANGED
|
@@ -1,53 +1,61 @@
|
|
| 1 |
-
#
|
| 2 |
-
|
| 3 |
-
This document outlines the strategic evolution of Aubm, moving from a robust orchestration core to an enterprise
|
| 4 |
-
|
| 5 |
-
##
|
| 6 |
-
- [x]
|
| 7 |
-
- [x]
|
| 8 |
-
- [x]
|
| 9 |
-
- [x]
|
| 10 |
-
- [x]
|
| 11 |
-
- [x]
|
| 12 |
-
|
| 13 |
-
##
|
| 14 |
-
- [x]
|
| 15 |
-
- [x]
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
- [x]
|
| 20 |
-
- [x]
|
| 21 |
-
|
| 22 |
-
##
|
| 23 |
-
- [x]
|
| 24 |
-
- [x]
|
| 25 |
-
- [x]
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
- [x]
|
| 30 |
-
|
| 31 |
-
##
|
| 32 |
-
- [x]
|
| 33 |
-
- [x]
|
| 34 |
-
- [x]
|
| 35 |
-
|
| 36 |
-
##
|
| 37 |
-
- [x]
|
| 38 |
-
- [x]
|
| 39 |
-
- [x]
|
| 40 |
-
- [x]
|
| 41 |
-
|
| 42 |
-
##
|
| 43 |
-
- [x]
|
| 44 |
-
- [x]
|
| 45 |
-
- [x]
|
| 46 |
-
- [x]
|
| 47 |
-
- [
|
| 48 |
-
- [ ]
|
| 49 |
-
- [ ]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
---
|
| 52 |
|
| 53 |
-
*Last updated: May 2026*
|
|
|
|
| 1 |
+
# Aubm Roadmap
|
| 2 |
+
|
| 3 |
+
This document outlines the strategic evolution of Aubm, moving from a robust orchestration core to an enterprise-ready multi-agent operating layer.
|
| 4 |
+
|
| 5 |
+
## Phase 1: Core Foundation (Completed)
|
| 6 |
+
- [x] Autonomous Agent Execution: Multi-provider support (OpenAI, Groq, Gemini, etc.).
|
| 7 |
+
- [x] Project Orchestration: Intelligent task scheduling and dependency management (DAG).
|
| 8 |
+
- [x] Human-in-the-Loop: Approval and rejection workflows for agent outputs.
|
| 9 |
+
- [x] Semantic RAG: Contextual memory injection across project tasks.
|
| 10 |
+
- [x] Real-time Logs: Streaming agent thoughts and actions via SSE.
|
| 11 |
+
- [x] Cost Control: Token-based budgeting and execution blocking.
|
| 12 |
+
|
| 13 |
+
## Phase 2: Advanced Collaboration and Tools (Completed)
|
| 14 |
+
- [x] Multi-Agent Debates: Allow agents to cross-verify each other's outputs before human review.
|
| 15 |
+
- [x] Extended Toolbelt:
|
| 16 |
+
- [x] Web Browser Tool (via Playwright) for live data fetching.
|
| 17 |
+
- [x] Code Sandbox for executing and testing generated snippets.
|
| 18 |
+
- [x] File Generation (Excel, Word, and advanced PDF layouts).
|
| 19 |
+
- [x] Collaborative Editing: Real-time collaborative output refining for humans.
|
| 20 |
+
- [x] Mobile Experience: Capacitor-based mobile app for project monitoring (initialized).
|
| 21 |
+
|
| 22 |
+
## Phase 3: Intelligence and Scale (Completed)
|
| 23 |
+
- [x] Fine-tuning Loop: Feedback loop (Like/Dislike) implemented for data collection.
|
| 24 |
+
- [x] Recursive Project Decomposition: Agents that can spawn sub-tasks and manage them.
|
| 25 |
+
- [x] Enterprise Security:
|
| 26 |
+
- [x] SSO Integration (Google, GitHub via Supabase).
|
| 27 |
+
- [x] Advanced RLS for granular team permissions.
|
| 28 |
+
- [x] Audit logs for every LLM interaction.
|
| 29 |
+
- [x] Agent Marketplace: Community-driven agent templates and specialized skill sets.
|
| 30 |
+
|
| 31 |
+
## Phase 4: Autonomy and Beyond (Completed)
|
| 32 |
+
- [x] Self-Healing Infrastructure: Agents that can monitor health and apply safe patches.
|
| 33 |
+
- [x] Voice Interaction: Control navigation and hear project/task status updates via browser voice APIs.
|
| 34 |
+
- [x] VR/AR Dashboard: Spatial DAG viewer scaffold for layered project/task visualization.
|
| 35 |
+
|
| 36 |
+
## Phase 5: Production Operations (Completed)
|
| 37 |
+
- [x] Operations Monitoring: Backend health summary endpoint and frontend monitoring dashboard with Supabase fallback.
|
| 38 |
+
- [x] Deployment Hardening: Dockerized backend/runtime profile and production CORS configuration.
|
| 39 |
+
- [x] Error Tracking: Sentry-compatible error reporting hooks for backend and frontend.
|
| 40 |
+
- [x] Performance Budgeting: Frontend code splitting and bundle-size targets.
|
| 41 |
+
|
| 42 |
+
## Phase 6: Distributed Scale and Intelligence (In Progress)
|
| 43 |
+
- [x] Recursive Project Decomposition: Agents that can automatically break down goals.
|
| 44 |
+
- [x] Numerical Consistency (Semantic Backprop): Enforce absolute figures across tasks.
|
| 45 |
+
- [x] Visual Tooling: Integrated support for charts and AI illustrations.
|
| 46 |
+
- [x] Vercel Deployment: Monorepo serverless configuration.
|
| 47 |
+
- [x] Heuristic Output Guardrails: Prompt hardening, reviewer checks, and final-report filtering for placeholders, unsupported claims, and low-quality sections.
|
| 48 |
+
- [ ] Asynchronous Task Queue: Dedicated background workers (`worker.py`).
|
| 49 |
+
- [ ] Vectorized Long-term Memory: Cross-project semantic retrieval.
|
| 50 |
+
- [ ] Self-Optimizing Agents: Meta-prompting loops based on human feedback.
|
| 51 |
+
|
| 52 |
+
## Phase 7: Structured Evidence and Entity Integrity (Next)
|
| 53 |
+
- [ ] Strict JSON Task Schemas: Enforce structured outputs per task type instead of free-form text.
|
| 54 |
+
- [ ] Mandatory `source_url` per Claim: Require evidence links for competitor, pricing, release, benchmark, and market claims.
|
| 55 |
+
- [ ] Entity Normalization Layer: Canonicalize entity names, merge aliases, and separate direct competitors from adjacent tools before final reporting.
|
| 56 |
+
- [ ] Semantic Deduplication: Collapse equivalent claims written differently across tasks.
|
| 57 |
+
- [ ] Evidence-Aware Final Report: Build the final report from normalized entities and validated claims only.
|
| 58 |
|
| 59 |
---
|
| 60 |
|
| 61 |
+
*Last updated: May 6, 2026*
|
VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
0.7.0
|
backend/main.py
CHANGED
|
@@ -10,6 +10,7 @@ import sentry_sdk
|
|
| 10 |
# Load environment variables
|
| 11 |
load_dotenv()
|
| 12 |
FRONTEND_DIST = Path(__file__).resolve().parent.parent / "frontend" / "dist"
|
|
|
|
| 13 |
|
| 14 |
# Sentry Initialization
|
| 15 |
SENTRY_DSN = os.getenv("SENTRY_DSN")
|
|
@@ -23,7 +24,7 @@ if SENTRY_DSN:
|
|
| 23 |
app = FastAPI(
|
| 24 |
title="Aubm API",
|
| 25 |
description="Enterprise-Grade AI Agent Orchestration & Collaboration Platform",
|
| 26 |
-
version=
|
| 27 |
)
|
| 28 |
|
| 29 |
# CORS Configuration
|
|
@@ -46,7 +47,7 @@ async def root():
|
|
| 46 |
return {
|
| 47 |
"status": "online",
|
| 48 |
"message": "Aubm API is operational",
|
| 49 |
-
"version":
|
| 50 |
}
|
| 51 |
|
| 52 |
# Placeholder for routers
|
|
@@ -63,6 +64,7 @@ async def runtime_config():
|
|
| 63 |
"supabaseUrl": os.getenv("VITE_SUPABASE_URL", os.getenv("SUPABASE_URL", "")),
|
| 64 |
"supabaseAnonKey": os.getenv("VITE_SUPABASE_ANON_KEY", os.getenv("SUPABASE_ANON_KEY", "")),
|
| 65 |
"sentryDsn": os.getenv("VITE_SENTRY_DSN", os.getenv("SENTRY_DSN", "")),
|
|
|
|
| 66 |
}
|
| 67 |
return Response(
|
| 68 |
content=f"window.__AUBM_CONFIG__ = {json.dumps(config)};",
|
|
|
|
| 10 |
# Load environment variables
|
| 11 |
load_dotenv()
|
| 12 |
FRONTEND_DIST = Path(__file__).resolve().parent.parent / "frontend" / "dist"
|
| 13 |
+
APP_VERSION = (Path(__file__).resolve().parent.parent / "VERSION").read_text(encoding="utf-8").strip()
|
| 14 |
|
| 15 |
# Sentry Initialization
|
| 16 |
SENTRY_DSN = os.getenv("SENTRY_DSN")
|
|
|
|
| 24 |
app = FastAPI(
|
| 25 |
title="Aubm API",
|
| 26 |
description="Enterprise-Grade AI Agent Orchestration & Collaboration Platform",
|
| 27 |
+
version=APP_VERSION
|
| 28 |
)
|
| 29 |
|
| 30 |
# CORS Configuration
|
|
|
|
| 47 |
return {
|
| 48 |
"status": "online",
|
| 49 |
"message": "Aubm API is operational",
|
| 50 |
+
"version": APP_VERSION
|
| 51 |
}
|
| 52 |
|
| 53 |
# Placeholder for routers
|
|
|
|
| 64 |
"supabaseUrl": os.getenv("VITE_SUPABASE_URL", os.getenv("SUPABASE_URL", "")),
|
| 65 |
"supabaseAnonKey": os.getenv("VITE_SUPABASE_ANON_KEY", os.getenv("SUPABASE_ANON_KEY", "")),
|
| 66 |
"sentryDsn": os.getenv("VITE_SENTRY_DSN", os.getenv("SENTRY_DSN", "")),
|
| 67 |
+
"appVersion": APP_VERSION,
|
| 68 |
}
|
| 69 |
return Response(
|
| 70 |
content=f"window.__AUBM_CONFIG__ = {json.dumps(config)};",
|
frontend/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
{
|
| 2 |
"name": "frontend",
|
| 3 |
-
"version": "0.
|
| 4 |
"lockfileVersion": 3,
|
| 5 |
"requires": true,
|
| 6 |
"packages": {
|
| 7 |
"": {
|
| 8 |
"name": "frontend",
|
| 9 |
-
"version": "0.
|
| 10 |
"dependencies": {
|
| 11 |
"@capacitor/android": "^8.3.1",
|
| 12 |
"@capacitor/cli": "^7.6.2",
|
|
|
|
| 1 |
{
|
| 2 |
"name": "frontend",
|
| 3 |
+
"version": "0.7.0",
|
| 4 |
"lockfileVersion": 3,
|
| 5 |
"requires": true,
|
| 6 |
"packages": {
|
| 7 |
"": {
|
| 8 |
"name": "frontend",
|
| 9 |
+
"version": "0.7.0",
|
| 10 |
"dependencies": {
|
| 11 |
"@capacitor/android": "^8.3.1",
|
| 12 |
"@capacitor/cli": "^7.6.2",
|
frontend/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"name": "frontend",
|
| 3 |
"private": true,
|
| 4 |
-
"version": "0.
|
| 5 |
"type": "module",
|
| 6 |
"scripts": {
|
| 7 |
"dev": "vite",
|
|
|
|
| 1 |
{
|
| 2 |
"name": "frontend",
|
| 3 |
"private": true,
|
| 4 |
+
"version": "0.7.0",
|
| 5 |
"type": "module",
|
| 6 |
"scripts": {
|
| 7 |
"dev": "vite",
|
frontend/src/App.tsx
CHANGED
|
@@ -31,11 +31,13 @@ import SplashScreen from './components/SplashScreen';
|
|
| 31 |
import { useEffect } from 'react';
|
| 32 |
import { getUiMode, saveUiMode } from './services/uiMode';
|
| 33 |
import type { UiMode } from './services/uiMode';
|
|
|
|
| 34 |
|
| 35 |
type AppTab = 'dashboard' | 'project-detail' | 'agents' | 'marketplace' | 'debate' | 'voice' | 'spatial' | 'monitoring' | 'new-project' | 'settings';
|
| 36 |
|
| 37 |
const App: React.FC = () => {
|
| 38 |
const { session, loading, signOut, profile, user } = useAuth();
|
|
|
|
| 39 |
const [activeTab, setActiveTab] = useState<AppTab>('dashboard');
|
| 40 |
const [selectedProjectId, setSelectedProjectId] = useState<string | null>(null);
|
| 41 |
const [initialTaskId, setInitialTaskId] = useState<string | null>(null);
|
|
@@ -178,6 +180,9 @@ const App: React.FC = () => {
|
|
| 178 |
<div style={{ fontSize: '0.8rem', color: 'var(--text-dim)' }}>{profile?.role || 'user'}</div>
|
| 179 |
</div>
|
| 180 |
</div>
|
|
|
|
|
|
|
|
|
|
| 181 |
</div>
|
| 182 |
</motion.aside>
|
| 183 |
)}
|
|
|
|
| 31 |
import { useEffect } from 'react';
|
| 32 |
import { getUiMode, saveUiMode } from './services/uiMode';
|
| 33 |
import type { UiMode } from './services/uiMode';
|
| 34 |
+
import { getAppVersion } from './services/runtimeConfig';
|
| 35 |
|
| 36 |
type AppTab = 'dashboard' | 'project-detail' | 'agents' | 'marketplace' | 'debate' | 'voice' | 'spatial' | 'monitoring' | 'new-project' | 'settings';
|
| 37 |
|
| 38 |
const App: React.FC = () => {
|
| 39 |
const { session, loading, signOut, profile, user } = useAuth();
|
| 40 |
+
const appVersion = getAppVersion();
|
| 41 |
const [activeTab, setActiveTab] = useState<AppTab>('dashboard');
|
| 42 |
const [selectedProjectId, setSelectedProjectId] = useState<string | null>(null);
|
| 43 |
const [initialTaskId, setInitialTaskId] = useState<string | null>(null);
|
|
|
|
| 180 |
<div style={{ fontSize: '0.8rem', color: 'var(--text-dim)' }}>{profile?.role || 'user'}</div>
|
| 181 |
</div>
|
| 182 |
</div>
|
| 183 |
+
<div style={{ marginTop: 'var(--space-sm)', fontSize: '0.75rem', color: 'var(--text-dim)' }}>
|
| 184 |
+
Version {appVersion}
|
| 185 |
+
</div>
|
| 186 |
</div>
|
| 187 |
</motion.aside>
|
| 188 |
)}
|
frontend/src/components/SettingsView.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import { motion } from 'framer-motion';
|
|
| 4 |
import { useAuth } from '../context/useAuth';
|
| 5 |
import { getDefaultModel, getDefaultProvider, providerOptions, saveProviderDefaults } from '../services/llmConfig';
|
| 6 |
import type { SupportedProvider } from '../services/llmConfig';
|
| 7 |
-
import { getApiUrl, getSupabaseUrl } from '../services/runtimeConfig';
|
| 8 |
import type { UiMode } from '../services/uiMode';
|
| 9 |
import { supabase } from '../services/supabase';
|
| 10 |
|
|
@@ -32,7 +32,8 @@ const SettingsView: React.FC<{ uiMode: UiMode; onUiModeChange: (mode: UiMode) =>
|
|
| 32 |
const config = useMemo(() => {
|
| 33 |
const apiUrl = getApiUrl() || 'Same origin';
|
| 34 |
const supabaseUrl = getSupabaseUrl() || 'Not configured';
|
| 35 |
-
|
|
|
|
| 36 |
}, []);
|
| 37 |
|
| 38 |
const providerModels = providerOptions.find((option) => option.id === provider)?.models ?? [];
|
|
@@ -169,6 +170,7 @@ const SettingsView: React.FC<{ uiMode: UiMode; onUiModeChange: (mode: UiMode) =>
|
|
| 169 |
<SettingRow label="API URL" value={config.apiUrl} />
|
| 170 |
<SettingRow label="Supabase URL" value={config.supabaseUrl} />
|
| 171 |
<SettingRow label="Frontend Mode" value={import.meta.env.MODE} />
|
|
|
|
| 172 |
</section>
|
| 173 |
|
| 174 |
<section className="glass-panel settings-section">
|
|
|
|
| 4 |
import { useAuth } from '../context/useAuth';
|
| 5 |
import { getDefaultModel, getDefaultProvider, providerOptions, saveProviderDefaults } from '../services/llmConfig';
|
| 6 |
import type { SupportedProvider } from '../services/llmConfig';
|
| 7 |
+
import { getApiUrl, getAppVersion, getSupabaseUrl } from '../services/runtimeConfig';
|
| 8 |
import type { UiMode } from '../services/uiMode';
|
| 9 |
import { supabase } from '../services/supabase';
|
| 10 |
|
|
|
|
| 32 |
const config = useMemo(() => {
|
| 33 |
const apiUrl = getApiUrl() || 'Same origin';
|
| 34 |
const supabaseUrl = getSupabaseUrl() || 'Not configured';
|
| 35 |
+
const appVersion = getAppVersion();
|
| 36 |
+
return { apiUrl, supabaseUrl, appVersion };
|
| 37 |
}, []);
|
| 38 |
|
| 39 |
const providerModels = providerOptions.find((option) => option.id === provider)?.models ?? [];
|
|
|
|
| 170 |
<SettingRow label="API URL" value={config.apiUrl} />
|
| 171 |
<SettingRow label="Supabase URL" value={config.supabaseUrl} />
|
| 172 |
<SettingRow label="Frontend Mode" value={import.meta.env.MODE} />
|
| 173 |
+
<SettingRow label="App Version" value={config.appVersion} />
|
| 174 |
</section>
|
| 175 |
|
| 176 |
<section className="glass-panel settings-section">
|
frontend/src/services/runtimeConfig.ts
CHANGED
|
@@ -3,6 +3,7 @@ interface RuntimeConfig {
|
|
| 3 |
supabaseUrl?: string;
|
| 4 |
supabaseAnonKey?: string;
|
| 5 |
sentryDsn?: string;
|
|
|
|
| 6 |
}
|
| 7 |
|
| 8 |
declare global {
|
|
@@ -26,3 +27,5 @@ export const getSupabaseAnonKey = () => (
|
|
| 26 |
export const getSentryDsn = () => (
|
| 27 |
import.meta.env.VITE_SENTRY_DSN || runtimeConfig.sentryDsn || ''
|
| 28 |
);
|
|
|
|
|
|
|
|
|
| 3 |
supabaseUrl?: string;
|
| 4 |
supabaseAnonKey?: string;
|
| 5 |
sentryDsn?: string;
|
| 6 |
+
appVersion?: string;
|
| 7 |
}
|
| 8 |
|
| 9 |
declare global {
|
|
|
|
| 27 |
export const getSentryDsn = () => (
|
| 28 |
import.meta.env.VITE_SENTRY_DSN || runtimeConfig.sentryDsn || ''
|
| 29 |
);
|
| 30 |
+
|
| 31 |
+
export const getAppVersion = () => runtimeConfig.appVersion || import.meta.env.VITE_APP_VERSION || '0.7.0';
|