Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
3800280
Add Supabase key validation and simplify frontend state management
Wirasm Aug 15, 2025
4004090
Fix critical issues from code review
Wirasm Aug 15, 2025
120eae0
Remove unnecessary startup delay script from frontend Dockerfile
Wirasm Aug 18, 2025
d890180
Fix document deletion persistence issue (#278)
Wirasm Aug 18, 2025
4c02dfc
Add comprehensive test coverage for document CRUD operations
Wirasm Aug 18, 2025
3359085
MCP server consolidation and simplification
Wirasm Aug 18, 2025
6273615
Improve MCP tool usability and documentation
Wirasm Aug 18, 2025
1f03b40
Refactor MCP server structure and add separate project tools
Wirasm Aug 18, 2025
dab5c6b
Update bug_report.yml
coleam00 Aug 18, 2025
3d368c9
Update README.md
coleam00 Aug 18, 2025
868ebe1
Fix project cards horizontal scrollbar visibility (#295)
ericfisherdev Aug 18, 2025
5293687
Fix missing feature field in project tasks API response
ericfisherdev Aug 18, 2025
961cde2
Remove consolidated project module in favor of separated tools
Wirasm Aug 18, 2025
b2cab81
Remove feature flags from Docker configuration
Wirasm Aug 18, 2025
4f317d9
Add document and version management tools
Wirasm Aug 18, 2025
f786a80
Add task management tools with smart routing
Wirasm Aug 18, 2025
47d2200
Add feature management tool for project capabilities
Wirasm Aug 18, 2025
89f53d3
Update project tools to use simplified approach
Wirasm Aug 18, 2025
52f5469
Register all separated tools in MCP server
Wirasm Aug 18, 2025
d01e27a
Update MCP Dockerfile to support new module structure
Wirasm Aug 18, 2025
d5bfaba
Clean up unused imports in RAG module
Wirasm Aug 18, 2025
e8cffde
Fix type errors and remove trailing whitespace
Wirasm Aug 18, 2025
307e0e3
Add comprehensive unit tests for MCP server features
Wirasm Aug 18, 2025
667cae2
Merge pull request #232 from coleam00/fix/supabase-key-validation-and…
Wirasm Aug 18, 2025
a29b541
Merge pull request #289 from coleam00/fix/document-deletion-persistence
Wirasm Aug 18, 2025
46e8358
Updating the Logo for Archon
coleam00 Aug 18, 2025
92b3c04
Merge pull request #301 from ericfisherdev/fix/feature-field-not-upda…
Wirasm Aug 19, 2025
d647459
Add Stage 1 workflow for external PR info collection
Wirasm Aug 19, 2025
fc97b4f
Add Stage 2 secure review workflow for external PRs
Wirasm Aug 19, 2025
0bb97d8
Add documentation for external PR review workflows
Wirasm Aug 19, 2025
c79040a
Fix base branch checkout in Stage 2 workflow
Wirasm Aug 19, 2025
00a8157
Merge pull request #325 from coleam00/feature/external-pr-claude-review
Wirasm Aug 19, 2025
8f96ea9
Fix external PR workflow permissions and error handling
Wirasm Aug 19, 2025
e46c5f7
Simplify authorization for external PR workflows
Wirasm Aug 19, 2025
e554f7b
Fix exec declaration error in Stage 2 workflow
Wirasm Aug 19, 2025
933d2de
Fix Claude Code Action authentication and context issues
Wirasm Aug 19, 2025
ea42f7a
Remove invalid mode parameter and improve event context
Wirasm Aug 19, 2025
506cbc1
Simplify fork PR review to single workflow with pull_request_target
Wirasm Aug 19, 2025
a00883a
Fix Claude checkout issue for forked PRs
Wirasm Aug 19, 2025
6a23a57
Override event context to prevent PR checkout
Wirasm Aug 19, 2025
db14228
fix: Restructure fork review workflow to avoid PR branch checkout
Wirasm Aug 19, 2025
b5e5cdd
Remove claude-review-fork.yml workflow
Wirasm Aug 19, 2025
913cdcd
Fix: Allow HTTP for local Supabase connections (#323)
thilanga Aug 19, 2025
cd22089
Update README.md (#332)
sanathusk Aug 19, 2025
cf3d7b1
feat(mcp): Add robust error handling and timeout configuration
Wirasm Aug 19, 2025
ed6479b
refactor(mcp): Apply consistent error handling to all MCP tools
Wirasm Aug 19, 2025
d7e1025
fix(mcp): Address all priority actions from PR review
Wirasm Aug 19, 2025
5bdf9d9
style: Apply linting fixes and formatting
Wirasm Aug 19, 2025
b5e18b9
Merge pull request #306 from coleam00/feature/mcp-server-consolidatio…
Wirasm Aug 20, 2025
8b29d20
Update docker-compose.yml
coleam00 Aug 20, 2025
16bde51
Update README.md (#410)
armand0e Aug 21, 2025
6f7c08e
Important updates to CONTRIBUTING.md and README
coleam00 Aug 21, 2025
eb526af
fix: Allow HTTP for all private network ranges in Supabase URLs (#417)
tazmon95 Aug 21, 2025
3608842
Fix business document categorization bug
Aug 18, 2025
45750c3
feat: Add Gemini CLI support to MCPPage and IDEGlobalRules
najibbom Aug 19, 2025
28eede3
fix(mcp): Fix update_task signature and MCP instructions
Wirasm Aug 21, 2025
5fef77d
test(mcp): Update tests for new update_task signature
Wirasm Aug 21, 2025
26a9332
style(mcp): Clean up whitespace in MCP instructions
Wirasm Aug 21, 2025
8792a1b
Fix crawler timeout for JavaScript-heavy documentation sites
Wirasm Aug 20, 2025
573e5c1
chore: Remove unused imports and fix exception chaining
Wirasm Aug 20, 2025
cb4dba1
fix: Apply URL transformation before crawling in recursive strategy
Wirasm Aug 21, 2025
86dd1b0
Improve development environment with Docker Compose profiles (#435)
Wirasm Aug 22, 2025
c436da2
fixed the creation and saving of docs in the project management area
siparker Aug 19, 2025
f6d61c0
Fix logging error in threading service
Wirasm Aug 20, 2025
43d83a0
Apply linting fixes for better code formatting
Wirasm Aug 20, 2025
4684639
Complete logging fixes for all statements in threading service
Wirasm Aug 20, 2025
85f5f2a
Remove deprecated PRP testing scripts and dead code
Wirasm Aug 25, 2025
51a8c74
Remove original_archon folder from main branch
Wirasm Aug 25, 2025
e1d3c6e
Fix proxy when specifying PROD=true
michaelphines Aug 25, 2025
3567458
Add a test
michaelphines Aug 25, 2025
ba66540
Parse before passing to vite
michaelphines Aug 25, 2025
27fd562
PR Feedback
michaelphines Aug 25, 2025
8cfdd91
Add titles to action buttons in DocumentCard, DraggableTaskCard, and …
djankies Aug 22, 2025
1e3689c
feat(ui): add accessibility attributes to action buttons
djankies Aug 23, 2025
a137e52
Fix Docker Compose default profile and error documentation
leex279 Aug 22, 2025
713ae53
Use generic YOUR_PROFILE placeholder instead of hardcoded 'full' profile
leex279 Aug 22, 2025
2b2fd6c
Remove profiles from all services to enable default startup
leex279 Aug 22, 2025
b0aba5f
Update error modal to use 'full' profile with helpful note
leex279 Aug 22, 2025
6a1b030
Merge UX improvements from PR #443
leex279 Aug 22, 2025
f9d245b
Fix critical token consumption issue in list endpoints (#488)
Wirasm Aug 26, 2025
c19e85f
fix: include_archived flag now works correctly in task listing
Wirasm Aug 27, 2025
ccdd1ec
Merge pull request #502 from coleam00/fix/token-optimization-list-end…
Wirasm Aug 27, 2025
45df79d
feat: disable agents service by default using Docker profiles
Wirasm Aug 27, 2025
ab56dd4
fix: address PR review feedback for agents service disabling
Wirasm Aug 27, 2025
4a66f38
Merge pull request #506 from coleam00/disable-agents-service
Wirasm Aug 27, 2025
bb57459
Add PRP story task template and reorganize PRP commands (#508)
Wirasm Aug 27, 2025
02e72d9
fix: resolve container startup race condition in agents service (#451…
UranymusDev Aug 29, 2025
3e204b0
Fix race condition in concurrent crawling with unique source IDs (#472)
Wirasm Aug 29, 2025
96c84b5
Hotfix - crawls hanging after embedding rate limiting
coleam00 Aug 30, 2025
9f22659
Moving Dockerfiles to uv for package installation (#533)
coleam00 Aug 30, 2025
811d0a7
Reduced the size of sentence-transformers by making it CPU only, incl…
coleam00 Aug 30, 2025
763e5b8
CI fails now when unit tests for backend fail (#536)
coleam00 Aug 30, 2025
69ec47b
Documentation improvements for MCP and README (#540)
coleam00 Aug 30, 2025
f938a3d
Spacing updates for Make installation in README
coleam00 Aug 30, 2025
0e9d11a
add PRPs/completed/ to gitignore
Wirasm Sep 1, 2025
9ce4cb6
add archon-coderabbit-helper slash command
Wirasm Sep 1, 2025
230f825
Merge pull request #553 from coleam00/coderabbit-slash-command
Wirasm Sep 1, 2025
277bfda
refactor: Remove Socket.IO and implement HTTP polling architecture (#…
Wirasm Sep 2, 2025
e74d613
POC: TanStack Query POC implementation (#567)
Wirasm Sep 5, 2025
cadda22
feat: Document Browser with Domain Filtering (Updated Architecture) (…
leex279 Sep 6, 2025
1a78a8e
feat: TanStack Query Migration Phase 2 - Cleanup and Test Reorganizat…
Wirasm Sep 6, 2025
9417156
Update .gitignore | excluded Temp folders
leex279 Sep 6, 2025
52ee5e2
mcp: fix Gemini register_version schema + optional types (#562)
leoric-crown Sep 6, 2025
8172067
Fix/(llms.txt) not crawling links inside of file (#437)
Chillbruhhh Sep 6, 2025
01903e5
Update CONTRIBUTING.md
coleam00 Sep 6, 2025
012d2c5
Removing references to Archon "Alpha"
coleam00 Sep 6, 2025
9edd6bc
fix(api): replace direct logfire usage in projects_api with unified l…
mionemedia Aug 18, 2025
7c2be83
chore: auto-commit Archon stack updates and tests\n\n- docker-compose…
mionemedia Sep 8, 2025
1787be6
feat(mcp): add minimal /api/mcp/clients, /sessions, /health endpoints…
mionemedia Sep 24, 2025
a93b087
fix: resolve double /api prefix in projects health check URL
mionemedia Jan 16, 2026
8b7614b
fix: resolve double /api prefix in credentialsService
mionemedia Jan 16, 2026
062cb99
feat(mcp): dynamic status bar and streamable-http transport
mionemedia Jan 16, 2026
183da5f
feat(credentials): add retry logic with exponential backoff for Supabase
mionemedia Jan 16, 2026
321abd7
chore: change default MCP port from 8051 to 9051
mionemedia Jan 16, 2026
9640bf2
Merge main into feature branch - keep our fixes
mionemedia Jan 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions archon-ui-main/src/components/settings/FeaturesSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const FeaturesSection = () => {
const [logfireResponse, projectsResponse, projectsHealthResponse, disconnectScreenRes] = await Promise.all([
credentialsService.getCredential('LOGFIRE_ENABLED').catch(() => ({ value: undefined })),
credentialsService.getCredential('PROJECTS_ENABLED').catch(() => ({ value: undefined })),
fetch(`${credentialsService['baseUrl']}/api/projects/health`).catch(() => null),
fetch(`/api/projects/health`).catch(() => null),
credentialsService.getCredential('DISCONNECT_SCREEN_ENABLED').catch(() => ({ value: 'true' }))
]);

Expand All @@ -58,7 +58,7 @@ export const FeaturesSection = () => {
response: projectsHealthResponse,
ok: projectsHealthResponse?.ok,
status: projectsHealthResponse?.status,
url: `${credentialsService['baseUrl']}/api/projects/health`
url: '/api/projects/health'
});

if (projectsHealthResponse && projectsHealthResponse.ok) {
Expand Down
6 changes: 3 additions & 3 deletions archon-ui-main/src/features/mcp/components/McpStatusBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export const McpStatusBar: React.FC<McpStatusBarProps> = ({
<div className="flex items-center gap-2">
<Server className="w-4 h-4 text-cyan-500" />
<span className="text-zinc-400">MCP</span>
<span className="text-white">8051</span>
<span className="text-white">{config?.port ?? 8051}</span>
</div>

{/* Active Sessions */}
Expand All @@ -87,7 +87,7 @@ export const McpStatusBar: React.FC<McpStatusBarProps> = ({
<div className="flex items-center gap-2">
<Users className="w-4 h-4 text-pink-500" />
<span className="text-zinc-400">SESSIONS</span>
<span className="text-cyan-400 text-sm">Coming Soon</span>
<span className="text-white">{sessionInfo.active_sessions ?? 0}</span>
</div>
</>
)}
Expand All @@ -99,7 +99,7 @@ export const McpStatusBar: React.FC<McpStatusBarProps> = ({
<span className="text-cyan-400">
{config?.transport === 'streamable-http' ? 'HTTP' :
config?.transport === 'sse' ? 'SSE' :
config?.transport || 'HTTP'}
(config?.transport || 'HTTP')}
</span>
</div>
</div>
Expand Down
15 changes: 6 additions & 9 deletions archon-ui-main/src/services/credentialsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@ export interface CodeExtractionSettings {
ENABLE_CODE_SUMMARIES: boolean;
}

import { getApiUrl } from "../config/api";

class CredentialsService {
private baseUrl = getApiUrl();

private handleCredentialError(error: any, context: string): Error {
const errorMessage = error instanceof Error ? error.message : String(error);
Expand All @@ -78,7 +75,7 @@ class CredentialsService {
}

async getAllCredentials(): Promise<Credential[]> {
const response = await fetch(`${this.baseUrl}/api/credentials`);
const response = await fetch(`/api/credentials`);
if (!response.ok) {
throw new Error("Failed to fetch credentials");
}
Expand All @@ -87,7 +84,7 @@ class CredentialsService {

async getCredentialsByCategory(category: string): Promise<Credential[]> {
const response = await fetch(
`${this.baseUrl}/api/credentials/categories/${category}`,
`/api/credentials/categories/${category}`,
);
if (!response.ok) {
throw new Error(`Failed to fetch credentials for category: ${category}`);
Expand Down Expand Up @@ -128,7 +125,7 @@ class CredentialsService {
async getCredential(
key: string,
): Promise<{ key: string; value?: string; is_encrypted?: boolean }> {
const response = await fetch(`${this.baseUrl}/api/credentials/${key}`);
const response = await fetch(`/api/credentials/${key}`);
if (!response.ok) {
if (response.status === 404) {
// Return empty object if credential not found
Expand Down Expand Up @@ -222,7 +219,7 @@ class CredentialsService {
async updateCredential(credential: Credential): Promise<Credential> {
try {
const response = await fetch(
`${this.baseUrl}/api/credentials/${credential.key}`,
`/api/credentials/${credential.key}`,
{
method: "PUT",
headers: {
Expand All @@ -248,7 +245,7 @@ class CredentialsService {

async createCredential(credential: Credential): Promise<Credential> {
try {
const response = await fetch(`${this.baseUrl}/api/credentials`, {
const response = await fetch(`/api/credentials`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Expand All @@ -272,7 +269,7 @@ class CredentialsService {

async deleteCredential(key: string): Promise<void> {
try {
const response = await fetch(`${this.baseUrl}/api/credentials/${key}`, {
const response = await fetch(`/api/credentials/${key}`, {
method: "DELETE",
});

Expand Down
8 changes: 4 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ services:
- SERVICE_DISCOVERY_MODE=docker_compose
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- ARCHON_SERVER_PORT=${ARCHON_SERVER_PORT:-8181}
- ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-8051}
- ARCHON_MCP_PORT=${ARCHON_MCP_PORT:-9051}
- ARCHON_AGENTS_PORT=${ARCHON_AGENTS_PORT:-8052}
# Enable optional SSE/JSON-RPC handshake after REST probe fails
- MCP_HANDSHAKE_ENABLED=${MCP_HANDSHAKE_ENABLED:-false}
Expand All @@ -44,11 +44,11 @@ services:
dockerfile: Dockerfile.mcp
args:
BUILDKIT_INLINE_CACHE: 1
ARCHON_MCP_PORT: ${ARCHON_MCP_PORT:-8051}
ARCHON_MCP_PORT: ${ARCHON_MCP_PORT:-9051}
container_name: Archon-MCP
restart: unless-stopped
ports:
- "${ARCHON_MCP_PORT:-8051}:${ARCHON_MCP_PORT:-8051}"
- "${ARCHON_MCP_PORT:-9051}:${ARCHON_MCP_PORT:-9051}"
environment:
- SUPABASE_URL=${SUPABASE_URL:-}
- SUPABASE_SERVICE_KEY=${SUPABASE_SERVICE_KEY:-}
Expand All @@ -68,7 +68,7 @@ services:
- archon-server
- archon-agents
healthcheck:
test: ["CMD", "sh", "-c", "python -c \"import socket; s=socket.socket(); s.connect(('localhost', ${ARCHON_MCP_PORT:-8051})); s.close()\""]
test: ["CMD", "sh", "-c", "python -c \"import socket; s=socket.socket(); s.connect(('localhost', ${ARCHON_MCP_PORT:-9051})); s.close()\""]
interval: 30s
timeout: 10s
retries: 3
Expand Down
8 changes: 4 additions & 4 deletions python/src/server/api_routes/mcp_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -767,11 +767,11 @@ async def get_mcp_config(request: Request):

mcp_port = int(os.getenv("ARCHON_MCP_PORT", "8051"))

# Configuration for SSE-only mode with actual port
# Configuration for streamable-http (HTTP) mode with actual port
config = {
"host": "localhost",
"port": mcp_port,
"transport": "sse",
"transport": "streamable-http",
}

# Get only model choice from database
Expand Down Expand Up @@ -802,10 +802,10 @@ async def get_mcp_config(request: Request):
config["use_agentic_rag"] = False
config["use_reranking"] = False

api_logger.info("MCP configuration (SSE-only mode)")
api_logger.info("MCP configuration (streamable-http mode)")
safe_set_attribute(span, "host", config["host"])
safe_set_attribute(span, "port", config["port"])
safe_set_attribute(span, "transport", "sse")
safe_set_attribute(span, "transport", "streamable-http")
safe_set_attribute(span, "model_choice", config.get("model_choice", "gpt-4o-mini"))

return config
Expand Down
89 changes: 58 additions & 31 deletions python/src/server/services/credential_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
Credentials include API keys, service credentials, and application configuration.
"""

import asyncio
import base64
import os
import re
Expand Down Expand Up @@ -121,39 +122,65 @@ def _decrypt_value(self, encrypted_value: str) -> str:
logger.error(f"Error decrypting value: {e}")
raise

async def load_all_credentials(self) -> dict[str, Any]:
"""Load all credentials from database and cache them."""
try:
supabase = self._get_supabase_client()

# Fetch all credentials
result = supabase.table("archon_settings").select("*").execute()
async def load_all_credentials(
self, max_retries: int = 10, initial_delay: float = 2.0
) -> dict[str, Any]:
"""Load all credentials from database and cache them.

Implements retry logic with exponential backoff to handle
Supabase unavailability (e.g., after pause/restore).

Args:
max_retries: Maximum number of retry attempts (default: 10)
initial_delay: Initial delay in seconds between retries (default: 2.0)
"""
last_error = None
delay = initial_delay

for attempt in range(1, max_retries + 1):
try:
supabase = self._get_supabase_client()

# Fetch all credentials
result = supabase.table("archon_settings").select("*").execute()

credentials = {}
for item in result.data:
key = item["key"]
if item["is_encrypted"] and item["encrypted_value"]:
# For encrypted values, we store the encrypted version
# Decryption happens when the value is actually needed
credentials[key] = {
"encrypted_value": item["encrypted_value"],
"is_encrypted": True,
"category": item["category"],
"description": item["description"],
}
else:
# Plain text values
credentials[key] = item["value"]

self._cache = credentials
self._cache_initialized = True
logger.info(f"Loaded {len(credentials)} credentials from database")

return credentials

credentials = {}
for item in result.data:
key = item["key"]
if item["is_encrypted"] and item["encrypted_value"]:
# For encrypted values, we store the encrypted version
# Decryption happens when the value is actually needed
credentials[key] = {
"encrypted_value": item["encrypted_value"],
"is_encrypted": True,
"category": item["category"],
"description": item["description"],
}
except Exception as e:
last_error = e
if attempt < max_retries:
logger.warning(
f"Supabase connection attempt {attempt}/{max_retries} failed: {e}. "
f"Retrying in {delay:.1f}s..."
)
await asyncio.sleep(delay)
delay = min(delay * 2, 60.0) # Exponential backoff, max 60s
else:
# Plain text values
credentials[key] = item["value"]

self._cache = credentials
self._cache_initialized = True
logger.info(f"Loaded {len(credentials)} credentials from database")

return credentials

except Exception as e:
logger.error(f"Error loading credentials: {e}")
raise
logger.error(
f"Failed to connect to Supabase after {max_retries} attempts: {e}"
)

raise last_error

async def get_credential(self, key: str, default: Any = None, decrypt: bool = True) -> Any:
"""Get a credential value by key."""
Expand Down