@onco-foundry/agent-template 0.7.0 → 0.8.0

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.
@@ -6,6 +6,11 @@ import type { Tracer } from '@onco-foundry/trace-port';
6
6
  import type { AgentTemplateCard, TemplateToolDefinition } from './agent_template.ts';
7
7
  import type { ResolvedSkillPackage, SkillPackageReference, SkillPackageSummary } from './skill_packages.ts';
8
8
  export declare const agentResourceVersionSchema: z.ZodString;
9
+ declare const resourceReferenceSchema: z.ZodObject<{
10
+ name: z.ZodString;
11
+ resource: z.ZodString;
12
+ version: z.ZodString;
13
+ }, z.core.$strict>;
9
14
  export declare const agentVersionSchema: z.ZodObject<{
10
15
  schemaVersion: z.ZodEnum<{
11
16
  "agent-config-v1": "agent-config-v1";
@@ -48,6 +53,11 @@ export declare const agentVersionSchema: z.ZodObject<{
48
53
  id: z.ZodString;
49
54
  version: z.ZodString;
50
55
  }, z.core.$strict>>;
56
+ resources: z.ZodOptional<z.ZodArray<z.ZodObject<{
57
+ name: z.ZodString;
58
+ resource: z.ZodString;
59
+ version: z.ZodString;
60
+ }, z.core.$strict>>>;
51
61
  skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
52
62
  id: z.ZodString;
53
63
  version: z.ZodString;
@@ -65,6 +75,15 @@ export type AgentVersionPromptReference = AgentVersion['prompt'];
65
75
  export type AgentVersionCommonPromptReference = AgentVersion['commonPrompts'][number];
66
76
  export type AgentVersionToolReference = AgentVersion['tools'][number];
67
77
  export type AgentVersionMemberReference = AgentVersion['members'][number];
78
+ export type AgentVersionResourceReference = z.infer<typeof resourceReferenceSchema>;
79
+ export type ResolvedAgentResource = AgentVersionResourceReference & {
80
+ checksum: string;
81
+ files: ReadonlyMap<string, string>;
82
+ };
83
+ export type AgentResourceSnapshot = AgentVersionResourceReference & {
84
+ checksum: string;
85
+ files: Record<string, string>;
86
+ };
68
87
  export type ResolvedAgentModel = AgentVersionModel & {
69
88
  apiKey?: string;
70
89
  };
@@ -82,6 +101,7 @@ export type ResolvedAgentVersion = {
82
101
  }>;
83
102
  tools: AgentVersionToolReference[];
84
103
  members: AgentVersionMemberReference[];
104
+ resources?: AgentResourceSnapshot[];
85
105
  skills?: SkillPackageSummary[];
86
106
  limits?: AgentVersion['limits'];
87
107
  };
@@ -111,6 +131,7 @@ export type ResolvedAgent = {
111
131
  version: string;
112
132
  };
113
133
  readSnapshot(): ResolvedAgentSnapshot;
134
+ readResources(): ResolvedAgentResource[];
114
135
  readSkills(): ResolvedSkillPackage[];
115
136
  };
116
137
  export type ResolvedAgentMember = {
@@ -124,6 +145,7 @@ export type AgentExecutorSpecInput<C> = {
124
145
  model: ResolvedAgentModel;
125
146
  systemPrompt: string;
126
147
  tools: TemplateToolDefinition[];
148
+ resources: ResolvedAgentResource[];
127
149
  members: ResolvedAgentMember[];
128
150
  context: C;
129
151
  skills?: ResolvedSkillPackage[];
@@ -151,6 +173,9 @@ export type AgentVersionPorts<C = unknown> = {
151
173
  readCommonPrompt(reference: AgentVersionCommonPromptReference, agentId: string): Promise<{
152
174
  content: string;
153
175
  }>;
176
+ readResource?(reference: AgentVersionResourceReference): Promise<{
177
+ files: ReadonlyMap<string, string>;
178
+ }>;
154
179
  createTool(reference: AgentVersionToolReference, context: C): TemplateToolDefinition | Promise<TemplateToolDefinition>;
155
180
  resolveExecutor(reference: AgentVersionExecutorReference): AgentVersionExecutor<C>;
156
181
  readSkill?(reference: SkillPackageReference): Promise<ResolvedSkillPackage>;
@@ -162,3 +187,4 @@ export type ResolveAgentVersionInput<C = unknown> = {
162
187
  promptVersion?: string;
163
188
  memberPromptVersions?: Record<string, string>;
164
189
  };
190
+ export {};
@@ -26,6 +26,11 @@ const memberReferenceSchema = z.object({
26
26
  id: z.string().min(1),
27
27
  version: agentResourceVersionSchema,
28
28
  }).strict();
29
+ const resourceReferenceSchema = z.object({
30
+ name: z.string().min(1),
31
+ resource: z.string().min(1),
32
+ version: agentResourceVersionSchema,
33
+ }).strict();
29
34
  export const agentVersionSchema = z.object({
30
35
  schemaVersion: z.enum(['agent-config-v1', 'agent-config-v2']),
31
36
  executor: executorReferenceSchema,
@@ -41,6 +46,7 @@ export const agentVersionSchema = z.object({
41
46
  commonPrompts: z.array(commonPromptReferenceSchema),
42
47
  tools: z.array(localToolReferenceSchema),
43
48
  members: z.array(memberReferenceSchema),
49
+ resources: z.array(resourceReferenceSchema).refine(items => new Set(items.map(item => item.name)).size === items.length, '业务资源名称不能重复').optional(),
44
50
  skills: z.array(z.object({ id: z.string().regex(/^[a-z][a-z0-9-]{0,79}$/), version: agentResourceVersionSchema }).strict()).max(32).optional(),
45
51
  limits: z.object({
46
52
  maxTurns: z.number().int().positive().optional(),
@@ -39,6 +39,9 @@ export const createAgentVersionResolver = (ports) => {
39
39
  prompt: { ...record.prompt },
40
40
  systemPromptChecksum: record.systemPromptChecksum,
41
41
  commonPrompts: record.commonPrompts.map(({ content: _content, ...part }) => ({ ...part })),
42
+ ...(record.resources.length ? { resources: record.resources.map(({ files, ...reference }) => ({
43
+ ...reference, files: Object.fromEntries([...files].map(([name, content]) => [name, checksum(content)])),
44
+ })) } : {}),
42
45
  tools: record.config.tools.map(tool => ({ ...tool })),
43
46
  members: record.config.members.map(member => ({ ...member })),
44
47
  ...(record.skills === undefined ? {} : { skills: record.skills.map(({ id, version, name, description, checksum }) => ({ id, version, name, description, checksum })) }),
@@ -118,6 +121,15 @@ export const createAgentVersionResolver = (ports) => {
118
121
  const { content } = await ports.readCommonPrompt(reference, agentId);
119
122
  return { ...reference, content, checksum: checksum(content) };
120
123
  }));
124
+ const resources = await Promise.all((loaded.config.resources ?? []).map(async (reference) => {
125
+ if (!ports.readResource)
126
+ throw new AppError(`未配置业务资源读取端口:${reference.name}`);
127
+ const resource = await ports.readResource(reference);
128
+ const files = new Map([...resource.files].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0));
129
+ if (!files.size)
130
+ throw new AppError(`业务资源没有文件:${reference.resource}@${reference.version}`);
131
+ return { ...reference, files, checksum: checksum(JSON.stringify([...files])) };
132
+ }));
121
133
  const ordered = [...commonPrompts].sort((a, b) => a.placement === b.placement
122
134
  ? a.order - b.order || a.id.localeCompare(b.id)
123
135
  : a.placement === 'before' ? -1 : 1);
@@ -137,6 +149,7 @@ export const createAgentVersionResolver = (ports) => {
137
149
  model: { ...loaded.config.model, ...modelCredential },
138
150
  prompt: { ...promptReference, checksum: checksum(prompt.content) },
139
151
  commonPrompts,
152
+ resources,
140
153
  systemPrompt,
141
154
  systemPromptChecksum: checksum(systemPrompt),
142
155
  ...(skills === undefined ? {} : { skills }),
@@ -156,6 +169,7 @@ export const createAgentVersionResolver = (ports) => {
156
169
  systemPrompt: record.systemPrompt,
157
170
  ...(record.skills === undefined ? {} : { skills: structuredClone(record.skills) }),
158
171
  tools,
172
+ resources: structuredClone(record.resources),
159
173
  members: await Promise.all(record.config.members.map(async (member) => ({
160
174
  id: member.id,
161
175
  version: member.version,
@@ -192,6 +206,7 @@ export const createAgentVersionResolver = (ports) => {
192
206
  },
193
207
  readSystemPrompt: () => ({ content: record.systemPrompt, version: record.prompt.version }),
194
208
  readSnapshot: () => structuredClone(snapshotFor(agentId)),
209
+ readResources: () => structuredClone(record.resources),
195
210
  readSkills: () => structuredClone(record.skills ?? []),
196
211
  };
197
212
  record.agent = agent;
@@ -1,6 +1,6 @@
1
1
  import type { TemplateToolDefinition } from './agent_template.ts';
2
2
  import { type SkillPackageFiles, type SkillPackageReference } from './skill_packages.ts';
3
- import type { AgentVersion, AgentVersionCommonPromptReference, AgentVersionExecutor, AgentVersionPorts, AgentVersionPromptReference } from './agent_version.ts';
3
+ import type { AgentVersion, AgentVersionCommonPromptReference, AgentVersionExecutor, AgentVersionPorts, AgentVersionPromptReference, AgentVersionResourceReference } from './agent_version.ts';
4
4
  export declare const createFakeAgentVersionPorts: <C>(options: {
5
5
  executors: Record<string, AgentVersionExecutor<C>>;
6
6
  modelApiKey?: string;
@@ -8,6 +8,7 @@ export declare const createFakeAgentVersionPorts: <C>(options: {
8
8
  }) => AgentVersionPorts<C> & {
9
9
  writeAgentVersion(agentId: string, version: string, config: AgentVersion, activate?: boolean): Promise<void>;
10
10
  activateAgentVersion(agentId: string, version: string): Promise<void>;
11
+ setResource(reference: AgentVersionResourceReference, files: Record<string, string>): void;
11
12
  setPrompt(reference: AgentVersionPromptReference, content: string): void;
12
13
  setCommonPrompt(reference: AgentVersionCommonPromptReference, content: string): void;
13
14
  writeSkill(reference: SkillPackageReference, files: SkillPackageFiles): Promise<void>;
@@ -9,6 +9,7 @@ export const createFakeAgentVersionPorts = (options) => {
9
9
  const stores = new Map();
10
10
  const prompts = new Map();
11
11
  const commonPrompts = new Map();
12
+ const resources = new Map();
12
13
  const skillStores = new Map();
13
14
  const skills = createSkillPackages({ storeFor: id => {
14
15
  if (!skillStores.has(id))
@@ -39,6 +40,13 @@ export const createFakeAgentVersionPorts = (options) => {
39
40
  throw new AppError(`fake 共同 prompt 不存在:${commonPromptKey(reference)}`);
40
41
  return { content };
41
42
  },
43
+ readResource: async (reference) => {
44
+ const files = resources.get(promptKey(reference));
45
+ if (!files)
46
+ throw new AppError(`fake 业务资源不存在:${promptKey(reference)}`);
47
+ return { files: new Map(Object.entries(files)) };
48
+ },
49
+ setResource(reference, files) { resources.set(promptKey(reference), { ...files }); },
42
50
  createTool(reference, context) {
43
51
  const create = options.tools?.[toolKey(reference)];
44
52
  if (create === undefined)
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { clampThinkingBudgetTokens, defineAgentTemplate, promptManifestSchema, type AgentTemplate, type AgentTemplateCard, type AgentTemplateDeclaration, type CreateTemplateAgentOptions, type PromptManifestAdapter, type TemplateToolDefinition, } from './agent_template.ts';
2
2
  export type { CapabilityDelegation } from '@onco-foundry/agent-runtime';
3
3
  export { createAgentSpecExecutor, type AgentSpecExecutorDeclaration } from './agent_spec_executor.ts';
4
- export { agentResourceVersionSchema, agentVersionSchema, type AgentVersion, type AgentVersionCommonPromptReference, type AgentVersionExecutor, type AgentVersionExecutorReference, type AgentVersionMemberReference, type AgentVersionModel, type AgentVersionPorts, type AgentVersionPromptReference, type AgentVersionToolReference, type CreateResolvedAgentSpecOptions, type ResolveAgentVersionInput, type ResolvedAgent, type ResolvedAgentMember, type ResolvedAgentModel, type ResolvedAgentSnapshot, type ResolvedAgentVersion, } from './agent_version.ts';
4
+ export { agentResourceVersionSchema, agentVersionSchema, type AgentVersion, type AgentVersionResourceReference, type AgentResourceSnapshot, type ResolvedAgentResource, type AgentVersionCommonPromptReference, type AgentVersionExecutor, type AgentVersionExecutorReference, type AgentVersionMemberReference, type AgentVersionModel, type AgentVersionPorts, type AgentVersionPromptReference, type AgentVersionToolReference, type CreateResolvedAgentSpecOptions, type ResolveAgentVersionInput, type ResolvedAgent, type ResolvedAgentMember, type ResolvedAgentModel, type ResolvedAgentSnapshot, type ResolvedAgentVersion, } from './agent_version.ts';
5
5
  export { createAgentVersionResolver } from './agent_version_resolver.ts';
6
6
  export { createFakeAgentVersionPorts } from './fake_agent_version_ports.ts';
7
7
  export { createSkillPackages, type SkillPackageFiles, type SkillPackageReference, type SkillPackageSummary, type ResolvedSkillPackage } from './skill_packages.ts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onco-foundry/agent-template",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -16,10 +16,10 @@
16
16
  "yaml": "^2.9.1",
17
17
  "zod": "^4.4.3",
18
18
  "@onco-foundry/agent-runtime": "0.3.0",
19
- "@onco-foundry/errors": "0.1.1",
20
- "@onco-foundry/capability-registry": "0.1.1",
19
+ "@onco-foundry/trace-port": "0.3.3",
21
20
  "@onco-foundry/resource-versioning": "0.3.0",
22
- "@onco-foundry/trace-port": "0.3.3"
21
+ "@onco-foundry/errors": "0.1.1",
22
+ "@onco-foundry/capability-registry": "0.1.1"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"