Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0bb4f43
docs: add platform overhaul task plan and progress tracking
rogerdigital Apr 15, 2026
7b08806
feat: add llm-provider package with Claude and OpenAI support
rogerdigital Apr 15, 2026
e134895
feat: rewrite agent services with LLM reasoning (intent, planning, an…
rogerdigital Apr 15, 2026
87e2340
feat: add agent write tools for paper trade submit and live trade req…
rogerdigital Apr 15, 2026
46c6eca
feat: integrate Alpaca market data API with synthetic fallback
rogerdigital Apr 15, 2026
f3a11f9
feat: connect backtest engine to real market data
rogerdigital Apr 15, 2026
1d68169
feat: redesign AgentPage with consumer-friendly 3-step UX
rogerdigital Apr 15, 2026
03f9973
feat: add configurable risk parameters and settings panel
rogerdigital Apr 15, 2026
2b99906
feat: add results-first banner to Dashboard
rogerdigital Apr 15, 2026
682fdaa
feat(ui): migrate color palette from cyan to indigo accent
rogerdigital Apr 15, 2026
aa318cc
feat(ui): complete indigo palette migration across all style modules
rogerdigital Apr 15, 2026
75c169d
feat(ui): update chart color scheme to indigo
rogerdigital Apr 15, 2026
66b97f6
feat(ui): add Command Palette (Cmd+K / Ctrl+K)
rogerdigital Apr 15, 2026
652323c
feat(ui): add global approval drawer for pending live orders
rogerdigital Apr 15, 2026
93a6d88
feat(ui): add toast notification system
rogerdigital Apr 15, 2026
b9fedf1
fix(api): remove circular re-export shims for agent services
rogerdigital Apr 15, 2026
34f1c8c
fix(ui): update SignalBarChart grid/crosshair to indigo palette
rogerdigital Apr 15, 2026
cfcdca1
style: fix biome formatting violations
rogerdigital Apr 15, 2026
b77c458
fix(lint): resolve biome import order and a11y violations
rogerdigital Apr 15, 2026
ce9f57b
fix(agent): repair 6 failing API tests in gateway-routes
rogerdigital Apr 15, 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
9 changes: 9 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,12 @@ JWT_SECRET=your-secret-key-at-least-32-chars
BROKER_KEY_ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000
DEMO_USERNAME=admin
DEMO_PASSWORD=changeme

# LLM Provider (claude | openai)
QUANTPILOT_LLM_PROVIDER=claude
QUANTPILOT_LLM_MODEL=
ANTHROPIC_API_KEY=
OPENAI_API_KEY=

# Mock data (true = use synthetic data, false = use Alpaca)
QUANTPILOT_USE_MOCK_DATA=false
1 change: 1 addition & 0 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
},
"dependencies": {
"@hono/node-server": "^1.19.14",
"@quantpilot/llm-provider": "*",
"hono": "^4.12.12",
"jose": "^6.2.2"
}
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/app/routes/hono/execution-hono-router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
listExecutionPlans,
listExecutionRuntimeEvents,
} from '../../../domains/execution/services/query-service.js';
import { hasPermission, writeForbiddenJson } from '../../../modules/auth/service.js';
import { hasPermission } from '../../../modules/auth/service.js';

function requireApproval(c, action = '') {
if (!hasPermission('execution:approve')) {
Expand Down
11 changes: 7 additions & 4 deletions apps/api/src/app/routes/routers/agent-router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,28 +70,31 @@ export async function handleAgentRoutes({ req, reqUrl, res, readJsonBody, writeJ

if (req.method === 'POST' && reqUrl.pathname === '/api/agent/tools/execute') {
const body = await readJsonBody(req);
const result = executeAgentTool(body);
const result = await executeAgentTool(body);
writeJson(res, result.ok ? 200 : 403, result);
return true;
}

// LLM-powered intent parsing (now async)
if (req.method === 'POST' && reqUrl.pathname === '/api/agent/intent') {
const body = await readJsonBody(req);
const result = parseAgentIntent(body);
const result = await parseAgentIntent(body);
writeJson(res, result.ok ? 200 : 400, result);
return true;
}

// LLM-powered plan creation (now async)
if (req.method === 'POST' && reqUrl.pathname === '/api/agent/plans') {
const body = await readJsonBody(req);
const result = createAgentPlan(body);
const result = await createAgentPlan(body);
writeJson(res, result.ok ? 200 : 400, result);
return true;
}

// LLM-powered analysis with tool-use loop (now async)
if (req.method === 'POST' && reqUrl.pathname === '/api/agent/analysis-runs') {
const body = await readJsonBody(req);
const result = runAgentAnalysis(body);
const result = await runAgentAnalysis(body);
writeJson(res, result.ok ? 200 : 400, result);
return true;
}
Expand Down
31 changes: 31 additions & 0 deletions apps/api/src/app/routes/routers/risk-router.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
// @ts-nocheck

import { getRiskEvent, listRiskEvents } from '../../../domains/risk/services/feed-service.js';
import {
getRiskParameters,
resetRiskParameters,
updateRiskParameters,
} from '../../../domains/risk/services/parameters-service.js';
import { runRiskPolicyAction } from '../../../domains/risk/services/policy-action-service.js';
import { getRiskWorkbench } from '../../../domains/risk/services/workbench-service.js';
import { writeForbiddenJson } from '../../../modules/auth/permission-catalog.js';
Expand All @@ -10,6 +15,32 @@ export async function handleRiskRoutes({ req, reqUrl, res, readJsonBody, writeJs
const writeForbidden = (permission, action = '') =>
writeForbiddenJson(writeJson, res, permission, action);

if (req.method === 'GET' && reqUrl.pathname === '/api/risk/parameters') {
writeJson(res, 200, { ok: true, parameters: getRiskParameters() });
return true;
}

if (req.method === 'POST' && reqUrl.pathname === '/api/risk/parameters') {
if (!hasPermission('risk:review')) {
writeForbidden('risk:review', 'update risk parameters');
return true;
}
const body = await readJsonBody(req);
const updated = updateRiskParameters(body);
writeJson(res, 200, { ok: true, parameters: updated });
return true;
}

if (req.method === 'POST' && reqUrl.pathname === '/api/risk/parameters/reset') {
if (!hasPermission('risk:review')) {
writeForbidden('risk:review', 'reset risk parameters');
return true;
}
const reset = resetRiskParameters();
writeJson(res, 200, { ok: true, parameters: reset });
return true;
}

if (req.method === 'GET' && reqUrl.pathname === '/api/risk/events') {
writeJson(res, 200, { ok: true, events: listRiskEvents() });
return true;
Expand Down
1 change: 0 additions & 1 deletion apps/api/src/app/routes/routers/trading-router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import { controlPlaneRuntime } from '../../../../../../packages/control-plane-runtime/src/index.js';
import { assessExecutionCandidate } from '../../../domains/risk/services/assessment-service.js';
import { getStrategyCatalogItem } from '../../../domains/strategy/services/catalog-service.js';
import { buildStrategyExecutionCandidate } from '../../../domains/strategy/services/execution-candidate-service.js';
import { writeForbiddenJson } from '../../../modules/auth/permission-catalog.js';
import { hasPermission } from '../../../modules/auth/service.js';

Expand Down
Loading
Loading