@eggjs/controller-decorator
Version:
tegg controller decorator
145 lines • 12.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AgentController = AgentController;
const core_decorator_1 = require("@eggjs/core-decorator");
const tegg_common_util_1 = require("@eggjs/tegg-common-util");
const tegg_types_1 = require("@eggjs/tegg-types");
const AgentInfoUtil_1 = require("../../util/AgentInfoUtil");
const ControllerInfoUtil_1 = __importDefault(require("../../util/ControllerInfoUtil"));
const HTTPInfoUtil_1 = __importDefault(require("../../util/HTTPInfoUtil"));
const MethodInfoUtil_1 = __importDefault(require("../../util/MethodInfoUtil"));
// Default implementations for unimplemented methods.
// function.length must match the param count for framework param validation.
// Stubs are marked with Symbol.for('AGENT_NOT_IMPLEMENTED') so agent-runtime
// can distinguish them from user-defined methods at enhancement time.
function createNotImplemented(methodName, paramCount) {
let fn;
if (paramCount >= 2) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
fn = async function (_a, _b) {
throw new Error(`${methodName} not implemented`);
};
}
else if (paramCount === 1) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
fn = async function (_arg) {
throw new Error(`${methodName} not implemented`);
};
}
else {
fn = async function () {
throw new Error(`${methodName} not implemented`);
};
}
AgentInfoUtil_1.AgentInfoUtil.setNotImplemented(fn);
return fn;
}
const AGENT_ROUTES = [
{
methodName: 'createThread',
httpMethod: tegg_types_1.HTTPMethodEnum.POST,
path: '/threads',
params: [],
},
{
methodName: 'getThread',
httpMethod: tegg_types_1.HTTPMethodEnum.GET,
path: '/threads/:id',
params: [{ index: 0, type: 'pathParam', name: 'id' }],
},
{
methodName: 'getLatestRunId',
httpMethod: tegg_types_1.HTTPMethodEnum.GET,
path: '/threads/:id/latest-run',
params: [{ index: 0, type: 'pathParam', name: 'id' }],
},
{
methodName: 'asyncRun',
httpMethod: tegg_types_1.HTTPMethodEnum.POST,
path: '/runs',
params: [{ index: 0, type: 'body' }],
},
{
methodName: 'streamRun',
httpMethod: tegg_types_1.HTTPMethodEnum.POST,
path: '/runs/stream',
params: [{ index: 0, type: 'body' }],
},
{
methodName: 'getRunStream',
httpMethod: tegg_types_1.HTTPMethodEnum.GET,
path: '/runs/:id/stream',
params: [
{ index: 0, type: 'pathParam', name: 'id' },
{ index: 1, type: 'query', name: 'lastSeq' },
],
},
{
methodName: 'syncRun',
httpMethod: tegg_types_1.HTTPMethodEnum.POST,
path: '/runs/wait',
params: [{ index: 0, type: 'body' }],
},
{
methodName: 'getRun',
httpMethod: tegg_types_1.HTTPMethodEnum.GET,
path: '/runs/:id',
params: [{ index: 0, type: 'pathParam', name: 'id' }],
},
{
methodName: 'cancelRun',
httpMethod: tegg_types_1.HTTPMethodEnum.POST,
path: '/runs/:id/cancel',
params: [{ index: 0, type: 'pathParam', name: 'id' }],
},
];
function AgentController() {
return function (constructor) {
// Set controller type as HTTP so existing infrastructure handles it
ControllerInfoUtil_1.default.setControllerType(constructor, tegg_types_1.ControllerType.HTTP);
// Set the fixed base HTTP path
HTTPInfoUtil_1.default.setHTTPPath('/api/v1', constructor);
// Apply SingletonProto with custom proto impl type
const func = (0, core_decorator_1.SingletonProto)({
accessLevel: tegg_types_1.AccessLevel.PUBLIC,
protoImplType: tegg_types_1.AGENT_CONTROLLER_PROTO_IMPL_TYPE,
});
func(constructor);
// Set file path for prototype
// Stack depth 5: [0] getCalleeFromStack → [1] decorator fn → [2-4] reflect/oxc runtime → [5] user source
core_decorator_1.PrototypeUtil.setFilePath(constructor, tegg_common_util_1.StackUtil.getCalleeFromStack(false, 5));
// Register each agent route
for (const route of AGENT_ROUTES) {
// Inject default implementation if method not defined
if (!constructor.prototype[route.methodName]) {
constructor.prototype[route.methodName] = createNotImplemented(route.methodName, route.params.length);
}
// Set method controller type
MethodInfoUtil_1.default.setMethodControllerType(constructor, route.methodName, tegg_types_1.ControllerType.HTTP);
// Set HTTP method (GET/POST)
HTTPInfoUtil_1.default.setHTTPMethodMethod(route.httpMethod, constructor, route.methodName);
// Set HTTP path
HTTPInfoUtil_1.default.setHTTPMethodPath(route.path, constructor, route.methodName);
// Set parameter metadata
for (const param of route.params) {
if (param.type === 'body') {
HTTPInfoUtil_1.default.setHTTPMethodParamType(tegg_types_1.HTTPParamType.BODY, param.index, constructor, route.methodName);
}
else if (param.type === 'pathParam') {
HTTPInfoUtil_1.default.setHTTPMethodParamType(tegg_types_1.HTTPParamType.PARAM, param.index, constructor, route.methodName);
HTTPInfoUtil_1.default.setHTTPMethodParamName(param.name, param.index, constructor, route.methodName);
}
else if (param.type === 'query') {
HTTPInfoUtil_1.default.setHTTPMethodParamType(tegg_types_1.HTTPParamType.QUERY, param.index, constructor, route.methodName);
HTTPInfoUtil_1.default.setHTTPMethodParamName(param.name, param.index, constructor, route.methodName);
}
}
}
// Mark the class as an AgentController for precise detection
AgentInfoUtil_1.AgentInfoUtil.setAgentController(constructor);
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvci9hZ2VudC9BZ2VudENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFrSEEsMENBb0RDO0FBdEtELDBEQUFzRTtBQUN0RSw4REFBb0Q7QUFFcEQsa0RBTTJCO0FBRTNCLDREQUF5RDtBQUN6RCx1RkFBK0Q7QUFDL0QsMkVBQW1EO0FBQ25ELCtFQUF1RDtBQWV2RCxxREFBcUQ7QUFDckQsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSxzRUFBc0U7QUFDdEUsU0FBUyxvQkFBb0IsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO0lBQ2xFLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEIsNkRBQTZEO1FBQzdELEVBQUUsR0FBRyxLQUFLLFdBQVUsRUFBVyxFQUFFLEVBQVc7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDNUIsNkRBQTZEO1FBQzdELEVBQUUsR0FBRyxLQUFLLFdBQVUsSUFBYTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sRUFBRSxHQUFHLEtBQUs7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRCw2QkFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELE1BQU0sWUFBWSxHQUEyQjtJQUMz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