agent-contracts 0.6.0 → 0.7.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.
- package/README.md +128 -0
- package/dist/cli.js +266 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.js +209 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -571,6 +571,7 @@ declare const RenderTargetSchema: z.ZodObject<{
|
|
|
571
571
|
type RenderTarget = z.infer<typeof RenderTargetSchema>;
|
|
572
572
|
declare const AgentContractsConfigSchema: z.ZodObject<{
|
|
573
573
|
dsl: z.ZodString;
|
|
574
|
+
vars: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
574
575
|
renders: z.ZodArray<z.ZodObject<{
|
|
575
576
|
template: z.ZodString;
|
|
576
577
|
context: z.ZodEnum<{
|
|
@@ -599,6 +600,7 @@ interface ResolvedRenderTarget {
|
|
|
599
600
|
}
|
|
600
601
|
interface ResolvedConfig {
|
|
601
602
|
dsl: string;
|
|
603
|
+
vars?: Record<string, string>;
|
|
602
604
|
renders: ResolvedRenderTarget[];
|
|
603
605
|
configDir: string;
|
|
604
606
|
}
|
|
@@ -640,6 +642,12 @@ interface PerArtifactContext {
|
|
|
640
642
|
artifact: Artifact & {
|
|
641
643
|
id: string;
|
|
642
644
|
};
|
|
645
|
+
relatedTools: Dsl["tools"];
|
|
646
|
+
relatedValidations: Dsl["validations"];
|
|
647
|
+
producerAgents: Dsl["agents"];
|
|
648
|
+
consumerAgents: Dsl["agents"];
|
|
649
|
+
editorAgents: Dsl["agents"];
|
|
650
|
+
createdInWorkflows: string[];
|
|
643
651
|
dsl: Dsl;
|
|
644
652
|
[key: string]: unknown;
|
|
645
653
|
}
|
|
@@ -647,6 +655,9 @@ interface PerToolContext {
|
|
|
647
655
|
tool: Tool & {
|
|
648
656
|
id: string;
|
|
649
657
|
};
|
|
658
|
+
invokableAgents: Dsl["agents"];
|
|
659
|
+
inputArtifactDetails: Dsl["artifacts"];
|
|
660
|
+
outputArtifactDetails: Dsl["artifacts"];
|
|
650
661
|
dsl: Dsl;
|
|
651
662
|
[key: string]: unknown;
|
|
652
663
|
}
|
|
@@ -671,6 +682,13 @@ interface PerWorkflowContext {
|
|
|
671
682
|
workflow: Workflow & {
|
|
672
683
|
id: string;
|
|
673
684
|
};
|
|
685
|
+
relatedAgents: Dsl["agents"];
|
|
686
|
+
relatedTasks: Array<(Task & Record<string, unknown>) & {
|
|
687
|
+
id: string;
|
|
688
|
+
}>;
|
|
689
|
+
relatedTools: Dsl["tools"];
|
|
690
|
+
relatedArtifacts: Dsl["artifacts"];
|
|
691
|
+
relatedValidations: Dsl["validations"];
|
|
674
692
|
dsl: Dsl;
|
|
675
693
|
[key: string]: unknown;
|
|
676
694
|
}
|
package/dist/index.js
CHANGED
|
@@ -60196,12 +60196,76 @@ function buildTaskContext(dsl, taskId) {
|
|
|
60196
60196
|
function buildArtifactContext(dsl, artifactId) {
|
|
60197
60197
|
const artifactDef = dsl.artifacts[artifactId];
|
|
60198
60198
|
const artifact = { ...artifactDef, id: artifactId };
|
|
60199
|
-
|
|
60199
|
+
const relatedTools = {};
|
|
60200
|
+
for (const [id, tool] of Object.entries(dsl.tools)) {
|
|
60201
|
+
if (tool.input_artifacts.includes(artifactId) || tool.output_artifacts.includes(artifactId)) {
|
|
60202
|
+
relatedTools[id] = tool;
|
|
60203
|
+
}
|
|
60204
|
+
}
|
|
60205
|
+
const relatedValidations = {};
|
|
60206
|
+
for (const [id, val] of Object.entries(dsl.validations)) {
|
|
60207
|
+
if (val.target_artifact === artifactId) {
|
|
60208
|
+
relatedValidations[id] = val;
|
|
60209
|
+
}
|
|
60210
|
+
}
|
|
60211
|
+
const pickAgents = (ids) => {
|
|
60212
|
+
const result = {};
|
|
60213
|
+
for (const id of ids) {
|
|
60214
|
+
if (dsl.agents[id]) result[id] = dsl.agents[id];
|
|
60215
|
+
}
|
|
60216
|
+
return result;
|
|
60217
|
+
};
|
|
60218
|
+
const producerAgents = pickAgents(artifactDef.producers);
|
|
60219
|
+
const consumerAgents = pickAgents(artifactDef.consumers);
|
|
60220
|
+
const editorAgents = pickAgents(artifactDef.editors);
|
|
60221
|
+
const createdInWorkflows = [];
|
|
60222
|
+
for (const [_taskId, task] of Object.entries(dsl.tasks)) {
|
|
60223
|
+
if (createdInWorkflows.includes(task.workflow)) continue;
|
|
60224
|
+
const targetAgent = dsl.agents[task.target_agent];
|
|
60225
|
+
if (targetAgent?.can_write_artifacts.includes(artifactId)) {
|
|
60226
|
+
createdInWorkflows.push(task.workflow);
|
|
60227
|
+
continue;
|
|
60228
|
+
}
|
|
60229
|
+
const steps = task.execution_steps ?? [];
|
|
60230
|
+
for (const step of steps) {
|
|
60231
|
+
if (step["produces_artifact"] === artifactId) {
|
|
60232
|
+
createdInWorkflows.push(task.workflow);
|
|
60233
|
+
break;
|
|
60234
|
+
}
|
|
60235
|
+
}
|
|
60236
|
+
}
|
|
60237
|
+
return {
|
|
60238
|
+
artifact,
|
|
60239
|
+
relatedTools,
|
|
60240
|
+
relatedValidations,
|
|
60241
|
+
producerAgents,
|
|
60242
|
+
consumerAgents,
|
|
60243
|
+
editorAgents,
|
|
60244
|
+
createdInWorkflows,
|
|
60245
|
+
dsl
|
|
60246
|
+
};
|
|
60200
60247
|
}
|
|
60201
60248
|
function buildToolContext(dsl, toolId) {
|
|
60202
60249
|
const toolDef = dsl.tools[toolId];
|
|
60203
60250
|
const tool = { ...toolDef, id: toolId };
|
|
60204
|
-
|
|
60251
|
+
const invokableAgents = {};
|
|
60252
|
+
for (const agentId of toolDef.invokable_by) {
|
|
60253
|
+
if (dsl.agents[agentId]) invokableAgents[agentId] = dsl.agents[agentId];
|
|
60254
|
+
}
|
|
60255
|
+
const pickArtifacts = (ids) => {
|
|
60256
|
+
const result = {};
|
|
60257
|
+
for (const id of ids) {
|
|
60258
|
+
if (dsl.artifacts[id]) result[id] = dsl.artifacts[id];
|
|
60259
|
+
}
|
|
60260
|
+
return result;
|
|
60261
|
+
};
|
|
60262
|
+
return {
|
|
60263
|
+
tool,
|
|
60264
|
+
invokableAgents,
|
|
60265
|
+
inputArtifactDetails: pickArtifacts(toolDef.input_artifacts),
|
|
60266
|
+
outputArtifactDetails: pickArtifacts(toolDef.output_artifacts),
|
|
60267
|
+
dsl
|
|
60268
|
+
};
|
|
60205
60269
|
}
|
|
60206
60270
|
function buildValidationContext(dsl, validationId) {
|
|
60207
60271
|
const validationDef = dsl.validations[validationId];
|
|
@@ -60219,7 +60283,76 @@ function buildHandoffTypeContext(dsl, handoffTypeId) {
|
|
|
60219
60283
|
function buildWorkflowContext(dsl, workflowId) {
|
|
60220
60284
|
const wfDef = dsl.workflow[workflowId];
|
|
60221
60285
|
const workflow = { ...wfDef, id: workflowId };
|
|
60222
|
-
|
|
60286
|
+
const relatedTasks = Object.entries(dsl.tasks).filter(([, t3]) => t3.workflow === workflowId).map(([id, t3]) => ({ ...t3, id }));
|
|
60287
|
+
const agentIds = /* @__PURE__ */ new Set();
|
|
60288
|
+
for (const task of relatedTasks) {
|
|
60289
|
+
agentIds.add(task.target_agent);
|
|
60290
|
+
for (const fromAgent of task.allowed_from_agents) {
|
|
60291
|
+
agentIds.add(fromAgent);
|
|
60292
|
+
}
|
|
60293
|
+
}
|
|
60294
|
+
for (const step of wfDef.steps) {
|
|
60295
|
+
if (step.type === "handoff" && step.from_agent) {
|
|
60296
|
+
agentIds.add(step.from_agent);
|
|
60297
|
+
}
|
|
60298
|
+
if (step.type === "validation") {
|
|
60299
|
+
const val = dsl.validations[step.validation];
|
|
60300
|
+
if (val?.executor_type === "agent" && val.executor) {
|
|
60301
|
+
agentIds.add(val.executor);
|
|
60302
|
+
}
|
|
60303
|
+
}
|
|
60304
|
+
}
|
|
60305
|
+
const relatedAgents = {};
|
|
60306
|
+
for (const id of agentIds) {
|
|
60307
|
+
if (dsl.agents[id]) relatedAgents[id] = dsl.agents[id];
|
|
60308
|
+
}
|
|
60309
|
+
const toolIds = /* @__PURE__ */ new Set();
|
|
60310
|
+
for (const id of agentIds) {
|
|
60311
|
+
const agent = dsl.agents[id];
|
|
60312
|
+
if (agent) {
|
|
60313
|
+
for (const toolId of agent.can_execute_tools) {
|
|
60314
|
+
toolIds.add(toolId);
|
|
60315
|
+
}
|
|
60316
|
+
}
|
|
60317
|
+
}
|
|
60318
|
+
const relatedTools = {};
|
|
60319
|
+
for (const id of toolIds) {
|
|
60320
|
+
if (dsl.tools[id]) relatedTools[id] = dsl.tools[id];
|
|
60321
|
+
}
|
|
60322
|
+
const artifactIds = /* @__PURE__ */ new Set();
|
|
60323
|
+
for (const task of relatedTasks) {
|
|
60324
|
+
for (const artId of task.input_artifacts) artifactIds.add(artId);
|
|
60325
|
+
}
|
|
60326
|
+
for (const id of agentIds) {
|
|
60327
|
+
const agent = dsl.agents[id];
|
|
60328
|
+
if (agent) {
|
|
60329
|
+
for (const artId of agent.can_read_artifacts) artifactIds.add(artId);
|
|
60330
|
+
for (const artId of agent.can_write_artifacts) artifactIds.add(artId);
|
|
60331
|
+
}
|
|
60332
|
+
}
|
|
60333
|
+
const relatedArtifacts = {};
|
|
60334
|
+
for (const id of artifactIds) {
|
|
60335
|
+
if (dsl.artifacts[id]) relatedArtifacts[id] = dsl.artifacts[id];
|
|
60336
|
+
}
|
|
60337
|
+
const validationIds = /* @__PURE__ */ new Set();
|
|
60338
|
+
for (const step of wfDef.steps) {
|
|
60339
|
+
if (step.type === "validation") {
|
|
60340
|
+
validationIds.add(step.validation);
|
|
60341
|
+
}
|
|
60342
|
+
}
|
|
60343
|
+
const relatedValidations = {};
|
|
60344
|
+
for (const id of validationIds) {
|
|
60345
|
+
if (dsl.validations[id]) relatedValidations[id] = dsl.validations[id];
|
|
60346
|
+
}
|
|
60347
|
+
return {
|
|
60348
|
+
workflow,
|
|
60349
|
+
relatedAgents,
|
|
60350
|
+
relatedTasks,
|
|
60351
|
+
relatedTools,
|
|
60352
|
+
relatedArtifacts,
|
|
60353
|
+
relatedValidations,
|
|
60354
|
+
dsl
|
|
60355
|
+
};
|
|
60223
60356
|
}
|
|
60224
60357
|
function buildPolicyContext(dsl, policyId) {
|
|
60225
60358
|
const policyDef = dsl.policies[policyId];
|
|
@@ -60334,6 +60467,11 @@ function buildPerAgentContext(dsl, agent) {
|
|
|
60334
60467
|
|
|
60335
60468
|
// src/renderer/renderer.ts
|
|
60336
60469
|
Handlebars.registerHelper("eq", (a3, b3) => a3 === b3);
|
|
60470
|
+
Handlebars.registerHelper("notEmpty", (obj) => {
|
|
60471
|
+
if (!obj || typeof obj !== "object") return false;
|
|
60472
|
+
return Object.keys(obj).length > 0;
|
|
60473
|
+
});
|
|
60474
|
+
Handlebars.registerHelper("inc", (val) => val + 1);
|
|
60337
60475
|
Handlebars.registerHelper(
|
|
60338
60476
|
"lookupPayloadFields",
|
|
60339
60477
|
(payload) => {
|
|
@@ -60422,6 +60560,72 @@ function toYamlLines(obj, indent) {
|
|
|
60422
60560
|
Handlebars.registerHelper("yamlBlock", (obj) => {
|
|
60423
60561
|
return toYamlLines(obj, 0).join("\n");
|
|
60424
60562
|
});
|
|
60563
|
+
Handlebars.registerHelper(
|
|
60564
|
+
"join",
|
|
60565
|
+
(arr, separator) => {
|
|
60566
|
+
if (!Array.isArray(arr)) return "";
|
|
60567
|
+
const sep = typeof separator === "string" ? separator : ", ";
|
|
60568
|
+
return arr.join(sep);
|
|
60569
|
+
}
|
|
60570
|
+
);
|
|
60571
|
+
Handlebars.registerHelper("contains", (arr, value) => {
|
|
60572
|
+
if (!Array.isArray(arr)) return false;
|
|
60573
|
+
return arr.includes(value);
|
|
60574
|
+
});
|
|
60575
|
+
Handlebars.registerHelper(
|
|
60576
|
+
"groupBy",
|
|
60577
|
+
(arr, key) => {
|
|
60578
|
+
if (!Array.isArray(arr)) return {};
|
|
60579
|
+
const result = {};
|
|
60580
|
+
for (const item of arr) {
|
|
60581
|
+
const k2 = String(
|
|
60582
|
+
item?.[key] ?? "undefined"
|
|
60583
|
+
);
|
|
60584
|
+
(result[k2] ??= []).push(item);
|
|
60585
|
+
}
|
|
60586
|
+
return result;
|
|
60587
|
+
}
|
|
60588
|
+
);
|
|
60589
|
+
Handlebars.registerHelper(
|
|
60590
|
+
"keys",
|
|
60591
|
+
(obj) => {
|
|
60592
|
+
if (!obj || typeof obj !== "object") return [];
|
|
60593
|
+
return Object.keys(obj);
|
|
60594
|
+
}
|
|
60595
|
+
);
|
|
60596
|
+
Handlebars.registerHelper(
|
|
60597
|
+
"values",
|
|
60598
|
+
(obj) => {
|
|
60599
|
+
if (!obj || typeof obj !== "object") return [];
|
|
60600
|
+
return Object.values(obj);
|
|
60601
|
+
}
|
|
60602
|
+
);
|
|
60603
|
+
Handlebars.registerHelper(
|
|
60604
|
+
"filterByField",
|
|
60605
|
+
(arr, field, value) => {
|
|
60606
|
+
if (!Array.isArray(arr)) return [];
|
|
60607
|
+
return arr.filter(
|
|
60608
|
+
(item) => item?.[field] === value
|
|
60609
|
+
);
|
|
60610
|
+
}
|
|
60611
|
+
);
|
|
60612
|
+
Handlebars.registerHelper("not", (value) => !value);
|
|
60613
|
+
Handlebars.registerHelper("or", (...args) => {
|
|
60614
|
+
const _options = args.pop();
|
|
60615
|
+
return args.some((a3) => !!a3);
|
|
60616
|
+
});
|
|
60617
|
+
Handlebars.registerHelper("and", (...args) => {
|
|
60618
|
+
const _options = args.pop();
|
|
60619
|
+
return args.every((a3) => !!a3);
|
|
60620
|
+
});
|
|
60621
|
+
Handlebars.registerHelper("gt", (a3, b3) => a3 > b3);
|
|
60622
|
+
Handlebars.registerHelper("gte", (a3, b3) => a3 >= b3);
|
|
60623
|
+
Handlebars.registerHelper("lt", (a3, b3) => a3 < b3);
|
|
60624
|
+
Handlebars.registerHelper("size", (obj) => {
|
|
60625
|
+
if (Array.isArray(obj)) return obj.length;
|
|
60626
|
+
if (obj && typeof obj === "object") return Object.keys(obj).length;
|
|
60627
|
+
return 0;
|
|
60628
|
+
});
|
|
60425
60629
|
function getDslSection(dsl, context) {
|
|
60426
60630
|
const sectionMap = {
|
|
60427
60631
|
agent: dsl.agents,
|
|
@@ -60569,6 +60773,7 @@ var RenderTargetSchema = z14.object({
|
|
|
60569
60773
|
);
|
|
60570
60774
|
var AgentContractsConfigSchema = z14.object({
|
|
60571
60775
|
dsl: z14.string(),
|
|
60776
|
+
vars: z14.record(z14.string(), z14.string()).optional(),
|
|
60572
60777
|
renders: z14.array(RenderTargetSchema).min(1)
|
|
60573
60778
|
});
|
|
60574
60779
|
|
|
@@ -60637,6 +60842,7 @@ ${issues}`,
|
|
|
60637
60842
|
const config = result.data;
|
|
60638
60843
|
return {
|
|
60639
60844
|
dsl: resolve4(configDir, config.dsl),
|
|
60845
|
+
vars: config.vars,
|
|
60640
60846
|
renders: config.renders.map((r3) => ({
|
|
60641
60847
|
...r3,
|
|
60642
60848
|
template: resolve4(configDir, r3.template),
|