feat: MVP v0.5 complete - All P0 features implemented and frontend verified. Backend API structure ready, pending final ES module configuration for deployment.
This commit is contained in:
96
dist-server/server/execution-api.js
Normal file
96
dist-server/server/execution-api.js
Normal file
@@ -0,0 +1,96 @@
|
||||
"use strict";
|
||||
/**
|
||||
* 执行记录 REST API
|
||||
* Hono路由:Agent执行日志的CRUD接口
|
||||
*
|
||||
* 接口列表:
|
||||
* GET /api/projects/:id/executions - 获取项目执行记录
|
||||
* GET /api/projects/:id/executions/:eid - 获取单条执行记录
|
||||
* POST /api/projects/:id/executions - 创建执行记录
|
||||
* GET /api/projects/:id/decisions - 获取决策记录
|
||||
* GET /api/projects/:id/knowledge - 获取知识库摘要
|
||||
*/
|
||||
var __assign = (this && this.__assign) || function () {
|
||||
__assign = Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
return __assign.apply(this, arguments);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.executionApiHandlers = void 0;
|
||||
// In-memory store (replace with PostgreSQL later)
|
||||
var executionStore = new Map();
|
||||
var decisionStore = new Map();
|
||||
/**
|
||||
* 路由定义(Hono风格)
|
||||
* 使用时:app.route('/api', executionRoutes)
|
||||
*/
|
||||
exports.executionApiHandlers = {
|
||||
// GET /api/projects/:id/executions
|
||||
getExecutions: function (projectId, filters) {
|
||||
var records = executionStore.get(projectId) || [];
|
||||
if (filters === null || filters === void 0 ? void 0 : filters.agentId) {
|
||||
records = records.filter(function (r) { return r.agentId === filters.agentId; });
|
||||
}
|
||||
if (filters === null || filters === void 0 ? void 0 : filters.taskId) {
|
||||
records = records.filter(function (r) { return r.taskId === filters.taskId; });
|
||||
}
|
||||
var offset = (filters === null || filters === void 0 ? void 0 : filters.offset) || 0;
|
||||
var limit = (filters === null || filters === void 0 ? void 0 : filters.limit) || 50;
|
||||
return records.slice(offset, offset + limit);
|
||||
},
|
||||
// GET /api/projects/:id/executions/:eid
|
||||
getExecution: function (projectId, executionId) {
|
||||
var records = executionStore.get(projectId) || [];
|
||||
return records.find(function (r) { return r.id === executionId; }) || null;
|
||||
},
|
||||
// POST /api/projects/:id/executions
|
||||
createExecution: function (projectId, log) {
|
||||
var record = __assign(__assign({}, log), { id: "exec-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2, 8)), createdAt: new Date().toISOString() });
|
||||
var existing = executionStore.get(projectId) || [];
|
||||
existing.push(record);
|
||||
executionStore.set(projectId, existing);
|
||||
return record;
|
||||
},
|
||||
// GET /api/projects/:id/decisions
|
||||
getDecisions: function (projectId) {
|
||||
return decisionStore.get(projectId) || [];
|
||||
},
|
||||
// POST /api/projects/:id/decisions
|
||||
createDecision: function (projectId, decision) {
|
||||
var record = __assign(__assign({}, decision), { id: "dec-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2, 8)), createdAt: new Date().toISOString() });
|
||||
var existing = decisionStore.get(projectId) || [];
|
||||
existing.push(record);
|
||||
decisionStore.set(projectId, existing);
|
||||
return record;
|
||||
},
|
||||
// GET /api/projects/:id/stats
|
||||
getStats: function (projectId) {
|
||||
var records = executionStore.get(projectId) || [];
|
||||
var byModel = {};
|
||||
var byType = {};
|
||||
var totalScore = 0;
|
||||
var totalTokens = 0;
|
||||
var totalDuration = 0;
|
||||
for (var _i = 0, records_1 = records; _i < records_1.length; _i++) {
|
||||
var r = records_1[_i];
|
||||
byModel[r.model] = (byModel[r.model] || 0) + 1;
|
||||
totalScore += r.score;
|
||||
totalTokens += r.tokensUsed;
|
||||
totalDuration += r.durationMs;
|
||||
}
|
||||
return {
|
||||
totalExecutions: records.length,
|
||||
avgScore: records.length > 0 ? Math.round((totalScore / records.length) * 10) / 10 : 0,
|
||||
totalTokens: totalTokens,
|
||||
avgDurationMs: records.length > 0 ? Math.round(totalDuration / records.length) : 0,
|
||||
byModel: byModel,
|
||||
byType: byType,
|
||||
};
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user