@migor/agentia 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +171 -0
  2. package/dist/container/container.d.ts +40 -0
  3. package/dist/container/container.js +66 -0
  4. package/dist/container/container.js.map +1 -0
  5. package/dist/core/schema.d.ts +14 -0
  6. package/dist/core/schema.js +116 -0
  7. package/dist/core/schema.js.map +1 -0
  8. package/dist/core/tool.d.ts +60 -0
  9. package/dist/core/tool.js +2 -0
  10. package/dist/core/tool.js.map +1 -0
  11. package/dist/core/trace.d.ts +52 -0
  12. package/dist/core/trace.js +6 -0
  13. package/dist/core/trace.js.map +1 -0
  14. package/dist/engine/context.d.ts +47 -0
  15. package/dist/engine/context.js +146 -0
  16. package/dist/engine/context.js.map +1 -0
  17. package/dist/engine/errors.d.ts +3 -0
  18. package/dist/engine/errors.js +22 -0
  19. package/dist/engine/errors.js.map +1 -0
  20. package/dist/engine/loop.d.ts +33 -0
  21. package/dist/engine/loop.js +227 -0
  22. package/dist/engine/loop.js.map +1 -0
  23. package/dist/engine/policy.d.ts +30 -0
  24. package/dist/engine/policy.js +35 -0
  25. package/dist/engine/policy.js.map +1 -0
  26. package/dist/engine/tracer.d.ts +27 -0
  27. package/dist/engine/tracer.js +93 -0
  28. package/dist/engine/tracer.js.map +1 -0
  29. package/dist/engine/types.d.ts +58 -0
  30. package/dist/engine/types.js +2 -0
  31. package/dist/engine/types.js.map +1 -0
  32. package/dist/engine/usage.d.ts +5 -0
  33. package/dist/engine/usage.js +30 -0
  34. package/dist/engine/usage.js.map +1 -0
  35. package/dist/index.d.ts +42 -0
  36. package/dist/index.js +31 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/run/async.d.ts +64 -0
  39. package/dist/run/async.js +135 -0
  40. package/dist/run/async.js.map +1 -0
  41. package/dist/run/context.d.ts +16 -0
  42. package/dist/run/context.js +48 -0
  43. package/dist/run/context.js.map +1 -0
  44. package/dist/run/fsStore.d.ts +29 -0
  45. package/dist/run/fsStore.js +79 -0
  46. package/dist/run/fsStore.js.map +1 -0
  47. package/dist/run/run.d.ts +50 -0
  48. package/dist/run/run.js +98 -0
  49. package/dist/run/run.js.map +1 -0
  50. package/dist/run/scheduler.d.ts +27 -0
  51. package/dist/run/scheduler.js +85 -0
  52. package/dist/run/scheduler.js.map +1 -0
  53. package/dist/run/spec.d.ts +40 -0
  54. package/dist/run/spec.js +25 -0
  55. package/dist/run/spec.js.map +1 -0
  56. package/dist/run/store.d.ts +40 -0
  57. package/dist/run/store.js +28 -0
  58. package/dist/run/store.js.map +1 -0
  59. package/dist/run/systemPrompt.d.ts +25 -0
  60. package/dist/run/systemPrompt.js +41 -0
  61. package/dist/run/systemPrompt.js.map +1 -0
  62. package/dist/run/transport.d.ts +12 -0
  63. package/dist/run/transport.js +16 -0
  64. package/dist/run/transport.js.map +1 -0
  65. package/dist/run/types.d.ts +12 -0
  66. package/dist/run/types.js +2 -0
  67. package/dist/run/types.js.map +1 -0
  68. package/dist/toolkit/asset.d.ts +22 -0
  69. package/dist/toolkit/asset.js +26 -0
  70. package/dist/toolkit/asset.js.map +1 -0
  71. package/dist/toolkit/discover.d.ts +2 -0
  72. package/dist/toolkit/discover.js +61 -0
  73. package/dist/toolkit/discover.js.map +1 -0
  74. package/dist/toolkit/module.d.ts +74 -0
  75. package/dist/toolkit/module.js +114 -0
  76. package/dist/toolkit/module.js.map +1 -0
  77. package/dist/toolkit/prompt.d.ts +32 -0
  78. package/dist/toolkit/prompt.js +70 -0
  79. package/dist/toolkit/prompt.js.map +1 -0
  80. package/dist/toolkit/skill.d.ts +74 -0
  81. package/dist/toolkit/skill.js +125 -0
  82. package/dist/toolkit/skill.js.map +1 -0
  83. package/dist/toolkit/subagent.d.ts +54 -0
  84. package/dist/toolkit/subagent.js +120 -0
  85. package/dist/toolkit/subagent.js.map +1 -0
  86. package/dist/toolkit/tool.d.ts +36 -0
  87. package/dist/toolkit/tool.js +54 -0
  88. package/dist/toolkit/tool.js.map +1 -0
  89. package/package.json +39 -0
@@ -0,0 +1,120 @@
1
+ import { runAgentScoped } from '../engine/loop.js';
2
+ import { classifyError } from '../engine/errors.js';
3
+ import { SystemPrompt } from '../run/systemPrompt.js';
4
+ /** 方法函数 → spec(与 @Tool 同款 WeakMap 注册表,零反射) */
5
+ const subAgentSpecs = new WeakMap();
6
+ /** 方法装饰器:登记子 agent spec。被装饰方法体不执行 —— 运行时拉起独立循环。 */
7
+ export function SubAgent(spec) {
8
+ return function (value, context) {
9
+ if (context.kind !== 'method') {
10
+ throw new Error(`@SubAgent 只能修饰类方法,收到 kind=${String(context.kind)}`);
11
+ }
12
+ subAgentSpecs.set(value, spec);
13
+ };
14
+ }
15
+ /** 把容器实例上所有 @SubAgent 方法收集成 SubAgentUnit[](沿原型链)。 */
16
+ export function collectSubAgents(instance) {
17
+ const units = [];
18
+ const seen = new Set();
19
+ let proto = Object.getPrototypeOf(instance);
20
+ while (proto && proto !== Object.prototype) {
21
+ for (const key of Object.getOwnPropertyNames(proto)) {
22
+ if (seen.has(key))
23
+ continue;
24
+ const desc = Object.getOwnPropertyDescriptor(proto, key);
25
+ if (!desc || typeof desc.value !== 'function')
26
+ continue;
27
+ const spec = subAgentSpecs.get(desc.value);
28
+ if (!spec)
29
+ continue; // 未装饰的 override 不标 seen,父类 spec 继续生效
30
+ seen.add(key);
31
+ if (typeof spec.name !== 'string' && typeof key !== 'string') {
32
+ throw new Error(`@SubAgent 需要显式 name(方法名为私有符号 ${String(key)})`);
33
+ }
34
+ units.push({
35
+ name: spec.name ?? key,
36
+ description: spec.description,
37
+ inputSchema: spec.schema,
38
+ spec,
39
+ });
40
+ }
41
+ proto = Object.getPrototypeOf(proto);
42
+ }
43
+ return units;
44
+ }
45
+ const REPORT_HINT = '(运行提示:你运行在独立上下文,全部中间过程不外传;你的最终回复将作为报告原样交回主 agent。)';
46
+ /** 按 spec.system 解析本轮子 agent 的 system。 */
47
+ async function resolveSubSystem(spec, task) {
48
+ if (typeof spec === 'function')
49
+ return spec(task);
50
+ if (spec instanceof SystemPrompt) {
51
+ const blocks = spec.build({ cache: true });
52
+ return [...blocks, { type: 'text', text: REPORT_HINT }];
53
+ }
54
+ return `${spec}\n\n${REPORT_HINT}`;
55
+ }
56
+ /**
57
+ * 把 SubAgentUnit 变成主 agent 菜单里的 AgentTool。
58
+ * run(input, ctx) 需要 ToolRunContext(engine 调用时必有);手动直调会抛错提示。
59
+ * tools token 列表 → resolveTools() 由装配层给出(该 token 的 @Tool 菜单)。
60
+ */
61
+ export function subagentToTool(unit, resolveTools) {
62
+ const { name, spec } = unit;
63
+ return {
64
+ name: unit.name,
65
+ description: unit.description,
66
+ inputSchema: unit.inputSchema,
67
+ run: async (input, ctx) => {
68
+ if (!ctx) {
69
+ throw new Error(`subagent "${name}" 只能在主 agent 运行中被调用(engine 会注入 ToolRunContext)`);
70
+ }
71
+ const recorder = ctx.recorder;
72
+ const unitId = recorder.begin('unit', name, ctx.parentSpanId);
73
+ recorder.setAttribute(unitId, 'subagent', name);
74
+ let closed = false;
75
+ const close = (patch) => {
76
+ if (closed)
77
+ return;
78
+ closed = true;
79
+ recorder.end(unitId, patch);
80
+ };
81
+ try {
82
+ const raw = input ?? {};
83
+ const task = typeof raw === 'string' ? { task: raw } : raw;
84
+ const system = await resolveSubSystem(spec.system, task);
85
+ const tools = spec.tools?.length ? resolveTools() : [];
86
+ const loop = await runAgentScoped({
87
+ client: ctx.client,
88
+ model: spec.model,
89
+ maxTokens: spec.maxTokens,
90
+ maxIterations: spec.maxIterations,
91
+ system,
92
+ messages: [{ role: 'user', content: JSON.stringify(task) }],
93
+ tools,
94
+ recorder,
95
+ parentSpanId: unitId,
96
+ });
97
+ recorder.setAttribute(unitId, 'stop_reason', loop.stopReason);
98
+ if (loop.stopReason === 'end_turn') {
99
+ close({ status: 'ok' });
100
+ return loop.finalText; // 隔离报告:只回最终文本
101
+ }
102
+ // 子 agent 没正常收尾 → 作为可重试语义的失败回主 agent(is_error)
103
+ const report = `subagent(${name}) ${loop.stopReason}: ${(loop.finalText || loop.error?.message || '').slice(0, 2000)}`;
104
+ const error = loop.error ?? {
105
+ type: 'agent_error',
106
+ message: report,
107
+ retryable: true,
108
+ };
109
+ close({ status: 'error', error });
110
+ throw new Error(report);
111
+ }
112
+ catch (e) {
113
+ // runAgentScoped 抛出的请求级异常(此前 unit 未关)在此兜底标记
114
+ close({ status: 'error', error: classifyError(e) });
115
+ throw e;
116
+ }
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/toolkit/subagent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { AgentTool, JsonSchema } from '../core/tool.js';
2
+ /**
3
+ * Agentia —— 声明式工具层(spec §4:标准装饰器 + 显式 DI,无 param 反射)。
4
+ *
5
+ * Turn 2:`@Tool({ description, schema })` 方法装饰器 —— 把类方法变成
6
+ * 主 agent 可调的 AgentTool。方法签名固定为单参数:模型按 input_schema
7
+ * 解析出的结构化入参(JSON Schema 由开发者在 spec 里显式给出,不靠反射猜)。
8
+ * 装饰器只把「方法 → spec」登记到 WeakMap;真正的 AgentTool 由
9
+ * `collectTools(instance)` 对已解析的容器实例扫描生成(此时才拿到 this)。
10
+ *
11
+ * 装饰器不含副作用、不依赖 TS 编译产物细节,用标准 (value, context) 语义,
12
+ * 与 tsgo/esbuild 均兼容。当前 run 作用域经 AsyncLocalStorage 传播,
13
+ * 方法体内可随时 `RunContext.current()` 读 blackboard/runId。
14
+ */
15
+ export interface ToolSpec {
16
+ /** 模型可见工具名;缺省取被装饰方法名 */
17
+ name?: string;
18
+ description: string;
19
+ /** input_schema:v1 用裸 JSON Schema(对应 engine/core 的 JsonSchema) */
20
+ schema: JsonSchema;
21
+ /** strict 参数校验:需 additionalProperties:false + required 齐全 */
22
+ strict?: boolean;
23
+ }
24
+ /**
25
+ * 方法装饰器:登记 spec。被装饰方法入参即结构化 tool input,
26
+ * 返回值(或 Promise)即 tool_result。抛错由 engine 包成 is_error,不中断 run。
27
+ *
28
+ * 泛型 <I, O> 可把方法签名与编译期类型绑定(`@Tool<{city:string}, string>({...})`),
29
+ * 挡住签名笔误;缺省 any 保持宽松。schema 与 I 的一致性仍由开发者保证(已知边界)。
30
+ */
31
+ export declare function Tool<I = any, O = any>(spec: ToolSpec): (value: (input: I) => O | Promise<O>, context: {
32
+ kind: string;
33
+ name: string | symbol;
34
+ }) => void;
35
+ /** 把容器实例上所有 @Tool 方法收集成 AgentTool[](沿原型链,含继承的父类工具)。 */
36
+ export declare function collectTools(instance: object): AgentTool[];
@@ -0,0 +1,54 @@
1
+ /** 方法函数 → spec。WeakMap 不阻碍 GC,也不要求 globalThis 注册表。 */
2
+ const toolSpecs = new WeakMap();
3
+ /**
4
+ * 方法装饰器:登记 spec。被装饰方法入参即结构化 tool input,
5
+ * 返回值(或 Promise)即 tool_result。抛错由 engine 包成 is_error,不中断 run。
6
+ *
7
+ * 泛型 <I, O> 可把方法签名与编译期类型绑定(`@Tool<{city:string}, string>({...})`),
8
+ * 挡住签名笔误;缺省 any 保持宽松。schema 与 I 的一致性仍由开发者保证(已知边界)。
9
+ */
10
+ export function Tool(spec) {
11
+ return function (value, context) {
12
+ if (context.kind !== 'method') {
13
+ throw new Error(`@Tool 只能修饰类方法,收到 kind=${String(context.kind)}`);
14
+ }
15
+ toolSpecs.set(value, spec);
16
+ };
17
+ }
18
+ /** 把容器实例上所有 @Tool 方法收集成 AgentTool[](沿原型链,含继承的父类工具)。 */
19
+ export function collectTools(instance) {
20
+ const tools = [];
21
+ const seen = new Set();
22
+ let proto = Object.getPrototypeOf(instance);
23
+ while (proto && proto !== Object.prototype) {
24
+ for (const key of Object.getOwnPropertyNames(proto)) {
25
+ if (seen.has(key))
26
+ continue;
27
+ const desc = Object.getOwnPropertyDescriptor(proto, key);
28
+ if (!desc || typeof desc.value !== 'function')
29
+ continue;
30
+ const spec = toolSpecs.get(desc.value);
31
+ // 子类未装饰的 override 不标 seen:让父类的 spec 沿原型链继续生效
32
+ // (Reflect.apply(instance[key]) 仍调到子类实现,override 生效、菜单不丢)
33
+ if (!spec)
34
+ continue;
35
+ seen.add(key);
36
+ tools.push(buildTool(instance, key, spec));
37
+ }
38
+ proto = Object.getPrototypeOf(proto);
39
+ }
40
+ return tools;
41
+ }
42
+ function buildTool(instance, key, spec) {
43
+ if (typeof spec.name !== 'string' && typeof key !== 'string') {
44
+ throw new Error(`@Tool 需要显式 name(方法名为私有符号 ${String(key)})`);
45
+ }
46
+ return {
47
+ name: spec.name ?? key,
48
+ description: spec.description,
49
+ inputSchema: spec.schema,
50
+ ...(spec.strict ? { strict: true } : {}),
51
+ run: (input) => Reflect.apply(instance[key], instance, [input]),
52
+ };
53
+ }
54
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/toolkit/tool.ts"],"names":[],"mappings":"AAyBA,sDAAsD;AACtD,MAAM,SAAS,GAAG,IAAI,OAAO,EAAsB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAmB,IAAc;IACnD,OAAO,UACL,KAAmC,EACnC,OAAgD;QAEhD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,IAAI,KAAK,GAAkB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU;gBAAE,SAAS;YACxD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAiB,CAAC,CAAC;YACnD,6CAA6C;YAC7C,0DAA0D;YAC1D,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,GAAoB,EAAE,IAAc;IACvE,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAK,GAAc;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CACV,QAAqE,CAAC,GAAG,CAAC,EAC3E,QAAQ,EACR,CAAC,KAAK,CAAC,CACR;KACJ,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@migor/agentia",
3
+ "version": "0.0.1",
4
+ "description": "面向应用开发者的声明式 agent 服务开发框架 —— NestJS 模式:主 agent 调度 tool/skill/subagent/prompt,自研运行时,最终形态为流水线(pipeline)服务。",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": ["dist"],
9
+ "repository": "retrychx/agentia",
10
+ "keywords": ["agent", "llm", "anthropic", "claude", "framework", "di", "decorators"],
11
+ "engines": { "node": ">=18" },
12
+ "publishConfig": { "access": "public" },
13
+ "workspaces": ["packages/*"],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "build:cli": "tsc -p packages/cli/tsconfig.json",
17
+ "prepublishOnly": "npm run build",
18
+ "dev": "tsx watch src/index.ts",
19
+ "typecheck": "tsc --noEmit -p tsconfig.json",
20
+ "smoke": "npm run build && node scripts/smoke.mjs",
21
+ "smoke:run": "npm run build && node scripts/smoke-run.mjs",
22
+ "smoke:turn2": "tsx scripts/smoke-turn2.ts",
23
+ "smoke:turn3": "tsx scripts/smoke-turn3.ts",
24
+ "smoke:turn4": "tsx scripts/smoke-turn4.ts",
25
+ "smoke:turn5": "tsx scripts/smoke-turn5.ts",
26
+ "smoke:turn6": "tsx scripts/smoke-turn6.ts",
27
+ "smoke:turn7": "npm run build && npm run build:cli && tsx scripts/smoke-turn7.ts",
28
+ "live": "npm run build && node examples/live.mjs",
29
+ "live:skill": "tsx examples/live-skill.ts"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.0.0",
33
+ "tsx": "^4.19.0",
34
+ "typescript": "^7.0.2"
35
+ },
36
+ "dependencies": {
37
+ "@anthropic-ai/sdk": "^0.124.0"
38
+ }
39
+ }