stable-harness 0.0.3 → 0.0.5
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 +189 -9
- package/dist/cli.js +1 -1
- package/dist/compat/agent-harness.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/runtime/compat/agent-harness-compat-runner.js +1 -1
- package/dist/runtime/compat/json.js +1 -1
- package/dist/runtime/compat/presentation.js +1 -1
- package/dist/runtime/compat/prompts.js +1 -1
- package/dist/runtime/model/ollama.js +1 -1
- package/dist/runtime/skills/skill-metadata.js +1 -1
- package/dist/workspace/compile.js +1 -1
- package/package.json +4 -3
- package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin-args.d.ts +4 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin-args.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +9 -4
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +29 -1
- package/packages/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/messages.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/raw-tool-call-parser.d.ts +12 -0
- package/packages/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/skill-file-policy.d.ts +10 -0
- package/packages/adapter-deepagents/dist/src/internal/skill-file-policy.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/stream-events.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +4 -0
- package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -1
- package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
- package/packages/adapter-deepagents/dist/src/memory.js +1 -1
- package/packages/adapter-deepagents/dist/src/model-providers.d.ts +4 -0
- package/packages/adapter-deepagents/dist/src/model-providers.js +1 -0
- package/packages/adapter-deepagents/dist/src/retry-policy.js +1 -1
- package/packages/adapter-deepagents/dist/src/types.d.ts +7 -1
- package/packages/adapter-deepagents/package.json +1 -0
- package/packages/adapter-langgraph/dist/src/graph.js +1 -1
- package/packages/adapter-langgraph/dist/src/runtime.js +1 -1
- package/packages/adapter-langgraph/dist/src/skill-providers.js +1 -1
- package/packages/cli/dist/src/args.d.ts +6 -3
- package/packages/cli/dist/src/args.js +1 -1
- package/packages/cli/dist/src/cli.js +1 -1
- package/packages/cli/dist/src/event-view.d.ts +9 -0
- package/packages/cli/dist/src/event-view.js +1 -0
- package/packages/cli/dist/src/index.d.ts +3 -0
- package/packages/cli/dist/src/index.js +1 -1
- package/packages/cli/dist/src/langgraph-env.d.ts +5 -0
- package/packages/cli/dist/src/langgraph-env.js +1 -0
- package/packages/cli/dist/src/langgraph-official.d.ts +2 -0
- package/packages/cli/dist/src/langgraph-official.js +1 -1
- package/packages/cli/dist/src/memory/lifecycle.d.ts +2 -0
- package/packages/cli/dist/src/memory/lifecycle.js +1 -0
- package/packages/cli/dist/src/memory/providers.d.ts +3 -0
- package/packages/cli/dist/src/memory/providers.js +1 -0
- package/packages/cli/dist/src/output.js +1 -1
- package/packages/cli/dist/src/server.d.ts +2 -0
- package/packages/cli/dist/src/server.js +1 -1
- package/packages/cli/package.json +2 -0
- package/packages/core/dist/evaluations/index.d.ts +18 -0
- package/packages/core/dist/evaluations/index.js +1 -0
- package/packages/core/dist/execution-contract.js +1 -1
- package/packages/core/dist/index.d.ts +3 -0
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/memory-plugins/maintenance.js +1 -1
- package/packages/core/dist/memory-plugins/shared.js +1 -1
- package/packages/core/dist/memory-plugins.js +1 -1
- package/packages/core/dist/recovery/tool-call.d.ts +15 -0
- package/packages/core/dist/recovery/tool-call.js +1 -1
- package/packages/core/dist/runtime/completion.js +1 -1
- package/packages/core/dist/runtime/direct-tool-call.js +1 -1
- package/packages/core/dist/runtime/events.d.ts +77 -20
- package/packages/core/dist/runtime/memory.js +1 -1
- package/packages/core/dist/runtime/persistence/artifacts.js +1 -1
- package/packages/core/dist/runtime/persistence/inspection.js +1 -1
- package/packages/core/dist/runtime/persistence/queue.js +1 -1
- package/packages/core/dist/runtime/persistence/stores.js +1 -1
- package/packages/core/dist/runtime/progress-narration.d.ts +33 -0
- package/packages/core/dist/runtime/progress-narration.js +1 -0
- package/packages/core/dist/runtime/tool-gateway.d.ts +5 -0
- package/packages/core/dist/runtime.d.ts +2 -1
- package/packages/core/dist/runtime.js +1 -1
- package/packages/core/dist/spec-driven/config.d.ts +4 -0
- package/packages/core/dist/spec-driven/config.js +1 -0
- package/packages/core/dist/spec-driven/events.d.ts +11 -0
- package/packages/core/dist/spec-driven/events.js +1 -0
- package/packages/core/dist/spec-driven/index.d.ts +4 -0
- package/packages/core/dist/spec-driven/index.js +1 -0
- package/packages/core/dist/spec-driven/lifecycle.d.ts +11 -0
- package/packages/core/dist/spec-driven/lifecycle.js +1 -0
- package/packages/core/dist/spec-driven/types.d.ts +38 -0
- package/packages/core/dist/spec-driven/types.js +1 -0
- package/packages/core/dist/trace.d.ts +1 -1
- package/packages/core/dist/trace.js +1 -1
- package/packages/core/dist/types.d.ts +15 -1
- package/packages/core/dist/workflows/index.js +1 -1
- package/packages/core/dist/workflows/runtime.js +1 -1
- package/packages/core/dist/workspace/types.d.ts +9 -0
- package/packages/governance/dist/src/skill-candidates.js +1 -1
- package/packages/memory/dist/src/langmem-service.js +1 -1
- package/packages/memory/dist/src/maintenance.js +1 -1
- package/packages/memory/dist/src/policy.js +1 -1
- package/packages/memory/dist/src/provider.js +1 -1
- package/packages/memory/dist/src/store.js +1 -1
- package/packages/protocols/dist/src/http-server.js +1 -1
- package/packages/protocols/dist/src/openai-compatible.js +1 -1
- package/packages/protocols/dist/src/openai-payload.js +1 -1
- package/packages/protocols/dist/src/openai-stream.js +1 -1
- package/packages/tool-gateway/dist/src/argument-guard.d.ts +2 -1
- package/packages/tool-gateway/dist/src/argument-guard.js +1 -1
- package/packages/tool-gateway/dist/src/in-memory.js +1 -1
- package/packages/tool-gateway/dist/src/module-loader.js +1 -1
- package/packages/tool-gateway/dist/src/schema-validation.js +1 -1
- package/packages/tool-gateway/dist/src/types.d.ts +3 -0
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/dist/discovery.js +1 -1
- package/packages/workspace-yaml/dist/documents.js +1 -1
- package/packages/workspace-yaml/dist/evaluations.d.ts +9 -0
- package/packages/workspace-yaml/dist/evaluations.js +1 -0
- package/packages/workspace-yaml/dist/loader.js +1 -1
- package/packages/workspace-yaml/dist/workflows.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as t,readFile as
|
|
1
|
+
import{readdir as t,readFile as r}from"node:fs/promises";import e from"node:path";import{parseAllDocuments as i}from"yaml";export async function listYamlFiles(r){const i=await t(r,{withFileTypes:!0});return(await Promise.all(i.map(async t=>{const i=e.join(r,t.name);return t.isDirectory()?listYamlFiles(i):t.isFile()&&/\.ya?ml$/iu.test(t.name)?[i]:[]}))).flat().sort()}export async function discoverModuleTools(i){const a=e.join(i,"resources","tools");let n;try{n=await t(a,{withFileTypes:!0})}catch{return[]}return(await Promise.all(n.filter(t=>t.isFile()&&t.name.endsWith(".mjs")&&!t.name.startsWith("_")).map(t=>async function discoverModuleToolFile(t){const i=[...(await r(t,"utf8")).matchAll(/export\s+const\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*tool\s*\(/gu)].map(t=>t[1]).filter(t=>"default"!==t);return(i.length>0?i:[e.basename(t,".mjs")]).map(r=>({id:r,sourcePath:t}))}(e.join(a,t.name))))).flat()}export async function discoverSkills(a){const n=e.join(a,"resources","skills");let o;try{o=await t(n,{withFileTypes:!0})}catch{return[]}return(await Promise.all(o.filter(t=>t.isDirectory()).map(t=>async function readSkill(t,a){const n=e.join(t,"SKILL.md");let o;try{o=await r(n,"utf8")}catch{return}const s=function readFrontMatter(t){const r=t.match(/^---\n([\s\S]*?)\n---/u);if(!r)return{};const e=i(r[1]).at(0)?.toJSON();return"object"!=typeof e||null===e||Array.isArray(e)?{}:e}(o);return{id:readOptionalString(s.name)??a,path:n,...readOptionalString(s.description)?{description:readOptionalString(s.description)}:{},allowedTools:(l=s["allowed-tools"],Array.isArray(l)?l.filter(t=>"string"==typeof t&&t.trim().length>0):[])};var l}(e.join(n,t.name),t.name)))).filter(t=>Boolean(t))}function readOptionalString(t){return"string"==typeof t&&t.trim()?t.trim():void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
import{assertSpecDrivenWorkflowPolicy as e,createSpecDrivenWorkflowPolicy as r}from"@stable-harness/core";function assertRecord(e,r){if("object"!=typeof e||null===e||Array.isArray(e))throw new Error(`${r} must be an object`);return e}function readName(e,r){const t=e.metadata?.name;if("string"==typeof t&&t.trim())return t.trim();if(r)return r;throw new Error(`Document kind ${String(e.kind)} requires metadata.name`)}function readDescription(e){const r=e.metadata?.description;return"string"==typeof r&&r.trim()?r.trim():void 0}function readOptionalString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function toStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):[]}function resolveValue(e){if("string"!=typeof e)return e;const r=e.match(/^\$\{env:([A-Za-z_][A-Za-z0-9_]*)(?::-(.*))?\}$/u);return r?process.env[r[1]]??r[2]??"":e}export function compileRuntime(e){const r=assertRecord(e.spec,"Runtime.spec"),t=assertRecord(r.routing??{},"Runtime.spec.routing");return{defaultAgentId:"string"==typeof t.defaultAgentId&&t.defaultAgentId.trim()?t.defaultAgentId.trim():"orchestra",...readOptionalString(r.workspaceId)?{workspaceId:readOptionalString(r.workspaceId)}:{},...readOptionalString(r.profile)?{profile:readOptionalString(r.profile)}:{},...void 0!==r.adapters?{adapters:readAdapters(r.adapters)}:{},..."object"==typeof r.workflowRouting&&r.workflowRouting?{workflowRouting:readWorkflowRouting(r.workflowRouting)}:{},..."object"==typeof r.specDrivenWorkflow&&r.specDrivenWorkflow?{specDrivenWorkflow:readSpecDrivenWorkflow(r.specDrivenWorkflow)}:{},..."object"==typeof r.approvals&&r.approvals?{approvals:r.approvals}:{},..."object"==typeof r.recovery&&r.recovery?{recovery:r.recovery}:{},..."object"==typeof r.retry&&r.retry?{retry:r.retry}:{},..."object"==typeof r.toolGateway&&r.toolGateway?{toolGateway:r.toolGateway}:{},..."object"==typeof r.memory&&r.memory?{memory:r.memory}:{},..."object"==typeof r.protocols&&r.protocols?{protocols:r.protocols}:{},..."object"==typeof r.progress&&r.progress?{progress:r.progress}:{},..."object"==typeof r.cli&&r.cli?{cli:r.cli}:{},..."object"==typeof r.responseLanguage&&r.responseLanguage?{responseLanguage:r.responseLanguage}:{},..."object"==typeof r.responsePresentation&&r.responsePresentation?{responsePresentation:r.responsePresentation}:{}}}function readSpecDrivenWorkflow(t){const o=assertRecord(t,"Runtime.spec.specDrivenWorkflow"),n=r({enabled:!0===o.enabled,constitution:readOptionalString(o.constitution),artifactsDir:readOptionalString(o.artifactsDir),phases:void 0===o.phases?void 0:readSpecDrivenPhases(o.phases),..."object"==typeof o.gates&&o.gates?{gates:o.gates}:{},..."object"==typeof o.config&&o.config?{config:o.config}:{}});return e(n),n}function readSpecDrivenPhases(e){if(!Array.isArray(e))throw new Error("Runtime.spec.specDrivenWorkflow.phases must be an array");return e.map(e=>{if("string"==typeof e&&e.trim())return{id:e.trim()};const r=assertRecord(e,"Runtime.spec.specDrivenWorkflow.phases[]"),t=readOptionalString(r.id);if(!t)throw new Error("Runtime.spec.specDrivenWorkflow.phases[] requires id");return{id:t,...readOptionalString(r.artifactKind)?{artifactKind:readOptionalString(r.artifactKind)}:{},..."boolean"==typeof r.required?{required:r.required}:{},...readOptionalString(r.gate)?{gate:readOptionalString(r.gate)}:{},..."object"==typeof r.config&&r.config?{config:r.config}:{}}})}export function compileAgent(e,r){const t=assertRecord(e.spec,"Agent.spec"),o=readName(e),n=readOptionalString(t.backend);if(!n)throw new Error(`Agent ${o} requires spec.backend`);const i="object"==typeof t.config&&t.config?t.config:{},a="string"==typeof t.systemPrompt?t.systemPrompt:"string"==typeof i.systemPrompt?i.systemPrompt:void 0;return{id:o,...readDescription(e)?{description:readDescription(e)}:{},sourcePath:r,backend:n,..."string"==typeof t.modelRef&&t.modelRef.trim()?{modelRef:(s=t.modelRef,s.replace(/^[^/]+\//u,""))}:{},...void 0!==a?{systemPrompt:a}:{},tools:toStringArray(t.tools),skills:toStringArray(t.skills),memory:Array.isArray(t.memory)?t.memory:[],subagents:toStringArray(t.subagents),...void 0!==t.edges?{edges:readAgentEdges(t.edges,o)}:{},config:i};var s}export function compileModel(e){return compileModelSpec(assertRecord(e.spec,"Model.spec"),readName(e))}export function compileModelSpec(e,r){const t="string"==typeof e.name&&e.name.trim()?e.name.trim():r??"default",o=resolveValue(e.provider),n=resolveValue(e.model),i="string"==typeof o&&o.trim()?o.trim():"unknown",a="string"==typeof n&&n.trim()?n.trim():t,s={...e};return delete s.name,delete s.provider,delete s.model,{id:t,provider:i,model:a,config:Object.fromEntries(Object.entries(s).map(([e,r])=>[e,resolveValue(r)]))}}export function compileTool(e){const r=assertRecord(e.spec,"Tool.spec");return{id:readName(e),..."string"==typeof r.description?{description:r.description}:{},...void 0!==r.schema?{schema:r.schema}:{},..."string"==typeof r.implementation?{implementation:r.implementation}:{}}}export function compileMemory(e){const r=assertRecord(e.spec,"Memory.spec"),t=readName(e),o={...r};return delete o.provider,delete o.profile,delete o.mode,delete o.enabled,delete o.prompts,{id:t,provider:readOptionalString(r.provider)??"langmem",...readOptionalString(r.profile)?{profile:readOptionalString(r.profile)}:{},...readOptionalString(r.mode)?{mode:readOptionalString(r.mode)}:{},enabled:!1!==r.enabled,..."object"==typeof r.prompts&&r.prompts?{prompts:readMemoryPrompts(r.prompts)}:{},...Object.keys(o).length>0?{config:o}:{}}}function readWorkflowRouting(e){const r=assertRecord(e,"Runtime.spec.workflowRouting"),t=void 0===r.routes?void 0:function readWorkflowRoutes(e){if(!Array.isArray(e))throw new Error("Runtime.spec.workflowRouting.routes must be an array");return e.map(e=>{const r=assertRecord(e,"Runtime.spec.workflowRouting.routes[]"),t=readOptionalString(r.id),o=readOptionalString(r.workflowId);if(!t||!o)throw new Error("Runtime.spec.workflowRouting.routes[] requires id and workflowId");return{id:t,workflowId:o,...readOptionalString(r.description)?{description:readOptionalString(r.description)}:{},..."object"==typeof r.metadata&&r.metadata?{metadata:r.metadata}:{}}})}(r.routes);return{...readOptionalString(r.defaultWorkflowId)?{defaultWorkflowId:readOptionalString(r.defaultWorkflowId)}:{},...t?{routes:t}:{}}}function readAdapters(e){if(!Array.isArray(e))throw new Error("Runtime.spec.adapters must be an array");return e.map(readAdapter)}function readAgentEdges(e,r){if(!Array.isArray(e))throw new Error(`Agent ${r} spec.edges must be an array`);return e.map(e=>{const t=assertRecord(e,`Agent ${r} spec.edges[]`),o=readOptionalString(t.from),n=readOptionalString(t.to);if(!o||!n)throw new Error(`Agent ${r} spec.edges[] requires from and to`);return{from:o,to:n,...readOptionalString(t.condition)?{condition:readOptionalString(t.condition)}:{}}})}function readAdapter(e){if("string"==typeof e&&e.trim())return{name:e.trim()};const r=assertRecord(e,"Runtime.spec.adapters[]"),t=readOptionalString(r.name)??readOptionalString(r.id)??readOptionalString(r.backend);if(!t)throw new Error("Runtime.spec.adapters[] requires name");return{name:t,..."boolean"==typeof r.enabled?{enabled:r.enabled}:{},..."object"==typeof r.config&&r.config?{config:r.config}:{}}}function readMemoryPrompts(e){const r=assertRecord(e,"Memory.spec.prompts");return{...readOptionalString(r.semantic)?{semantic:readOptionalString(r.semantic)}:{},...readOptionalString(r.episodic)?{episodic:readOptionalString(r.episodic)}:{},...readOptionalString(r.procedural)?{procedural:readOptionalString(r.procedural)}:{}}}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkspaceAgent, WorkspaceEvaluation, WorkspaceTool, WorkspaceWorkflow } from "@stable-harness/core";
|
|
2
|
+
import type { RawDocument } from "./documents.js";
|
|
3
|
+
export declare function compileEvaluation(document: RawDocument, sourcePath: string): WorkspaceEvaluation;
|
|
4
|
+
export declare function validateEvaluations(input: {
|
|
5
|
+
evaluations: Map<string, WorkspaceEvaluation>;
|
|
6
|
+
agents: Map<string, WorkspaceAgent>;
|
|
7
|
+
tools: Map<string, WorkspaceTool>;
|
|
8
|
+
workflows: Map<string, WorkspaceWorkflow>;
|
|
9
|
+
}): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function compileEvaluation(r,t){const e=assertRecord(r.spec,"Evaluation.spec"),o=function readName(r){const t=r.metadata?.name;if("string"==typeof t&&t.trim())return t.trim();throw new Error("Evaluation document requires metadata.name")}(r);return{id:o,...readDescription(r)?{description:readDescription(r)}:{},sourcePath:t,...readString(e.suite)?{suite:readString(e.suite)}:{},cases:readCases(e.cases,o),..."object"==typeof e.config&&e.config?{config:e.config}:{}}}export function validateEvaluations(r){for(const t of r.evaluations.values())for(const e of t.cases){if(e.agentId&&!r.agents.has(e.agentId))throw new Error(`Evaluation ${t.id} case ${e.id} references unknown agent ${e.agentId}`);if(e.workflowId&&!r.workflows.has(e.workflowId))throw new Error(`Evaluation ${t.id} case ${e.id} references unknown workflow ${e.workflowId}`);for(const o of e.tools??[])if(!r.tools.has(o))throw new Error(`Evaluation ${t.id} case ${e.id} references unknown tool ${o}`)}}function readCases(r,t){if(!Array.isArray(r)||0===r.length)throw new Error(`Evaluation ${t} spec.cases must be a non-empty array`);return r.map(r=>{const e=assertRecord(r,`Evaluation ${t} spec.cases[]`),o=readString(e.id);if(!o)throw new Error(`Evaluation ${t} spec.cases[] requires id`);return{id:o,...readString(e.description)?{description:readString(e.description)}:{},...readString(e.agentId)?{agentId:readString(e.agentId)}:{},...readString(e.workflowId)?{workflowId:readString(e.workflowId)}:{},...void 0!==e.input?{input:e.input}:{},...Array.isArray(e.tools)?{tools:e.tools.filter(r=>"string"==typeof r&&r.trim().length>0)}:{},..."object"==typeof e.assertions&&e.assertions?{assertions:e.assertions}:{},..."object"==typeof e.metadata&&e.metadata?{metadata:e.metadata}:{}}})}function assertRecord(r,t){if("object"!=typeof r||null===r||Array.isArray(r))throw new Error(`${t} must be an object`);return r}function readDescription(r){return readString(r.metadata?.description)}function readString(r){return"string"==typeof r&&r.trim()?r.trim():void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as o}from"node:fs/promises";import e from"node:path";import{parseAllDocuments as s}from"yaml";import{discoverModuleTools as
|
|
1
|
+
import{readFile as o}from"node:fs/promises";import e from"node:path";import{parseAllDocuments as s}from"yaml";import{discoverModuleTools as t,discoverSkills as a,listYamlFiles as r}from"./discovery.js";import{compileAgent as i,compileMemory as l,compileModel as n,compileModelSpec as f,compileRuntime as c,compileTool as w}from"./documents.js";import{compileWorkflow as d,validateWorkflows as m}from"./workflows.js";import{compileEvaluation as k,validateEvaluations as p}from"./evaluations.js";export async function loadWorkspaceFromYaml(u){const M=e.join(u,"config"),g=await r(M),v=[],y=new Map,b=new Map,h=new Map,W=new Map,A=new Map,R=new Map,I=new Map;for(const e of g){const t=await o(e,"utf8"),a=s(t).map(o=>o.toJSON()).filter(o=>null!==o);for(const o of a)if("string"==typeof o.kind)switch(o.kind){case"Runtime":v.push(c(o));break;case"Agent":{const s=i(o,e);y.set(s.id,s);break}case"Model":{const e=n(o);b.set(e.id,e);break}case"Models":if(Array.isArray(o.spec))for(const e of o.spec)if("object"==typeof e&&null!==e&&!Array.isArray(e)){const o=f(e);b.set(o.id,o)}break;case"Tool":{const e=w(o);h.set(e.id,e);break}case"Memory":{const e=l(o);A.set(e.id,e);break}case"Workflow":{const s=d(o,e);R.set(s.id,s);break}case"Evaluation":{const s=k(o,e);I.set(s.id,s);break}}}for(const o of await t(u))h.has(o.id)||h.set(o.id,o);for(const o of await a(u))W.set(o.id,o);const j=v.at(-1)??{defaultAgentId:"orchestra"};return m({workflows:R,agents:y,tools:h,skills:W}),p({evaluations:I,agents:y,tools:h,workflows:R}),function validateWorkflowRouting(o,e){const s=o.workflowRouting;if(s){if(s.defaultWorkflowId&&!e.has(s.defaultWorkflowId))throw new Error(`Runtime workflowRouting.defaultWorkflowId references unknown workflow ${s.defaultWorkflowId}`);for(const o of s.routes??[])if(!e.has(o.workflowId))throw new Error(`Runtime workflowRouting route ${o.id} references unknown workflow ${o.workflowId}`)}}(j,R),{root:u,runtime:j,agents:y,models:b,tools:h,skills:W,memories:A,workflows:R,evaluations:I}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function compileWorkflow(
|
|
1
|
+
export function compileWorkflow(o,r){const e=assertRecord(o.spec,"Workflow.spec"),t="object"==typeof e.config&&e.config?e.config:{};return{id:readName(o),...readDescription(o)?{description:readDescription(o)}:{},sourcePath:r,...readOptionalString(e.adapter)?{adapter:readOptionalString(e.adapter)}:{},...readOptionalString(e.entry)?{entry:readOptionalString(e.entry)}:{},..."object"==typeof e.state&&e.state?{state:readWorkflowState(e.state)}:{},nodes:readWorkflowNodes(e.nodes),edges:readWorkflowEdges(e.edges),..."object"==typeof e.policies&&e.policies?{policies:e.policies}:{},...Object.keys(t).length>0?{config:t}:{}}}export function validateWorkflows(o){for(const r of o.workflows.values()){const e=new Set(r.nodes.map(o=>o.id));validateWorkflowEntry(r,e),validateWorkflowEdges(r,e);for(const e of r.nodes)validateWorkflowUse(e.use,o)}}function readWorkflowState(o){const r=assertRecord(o,"Workflow.spec.state");return{...readOptionalString(r.schema)?{schema:readOptionalString(r.schema)}:{},..."object"==typeof r.config&&r.config?{config:r.config}:{}}}function readWorkflowNodes(o){if(!Array.isArray(o)||0===o.length)throw new Error("Workflow.spec.nodes must be a non-empty array");return o.map(o=>{const r=assertRecord(o,"Workflow.spec.nodes[]"),e=readOptionalString(r.id),t=readOptionalString(r.use);if(!e||!t)throw new Error("Workflow.spec.nodes[] requires id and use");return{id:e,use:t,...readOptionalString(r.type)?{type:readOptionalString(r.type)}:{},..."object"==typeof r.config&&r.config?{config:r.config}:{}}})}function readWorkflowEdges(o){if(!Array.isArray(o))throw new Error("Workflow.spec.edges must be an array");return o.map(o=>{const r=assertRecord(o,"Workflow.spec.edges[]"),e=readOptionalString(r.from),t=readOptionalString(r.to);if(!e||!t)throw new Error("Workflow.spec.edges[] requires from and to");return{from:e,to:t,...readOptionalString(r.condition)?{condition:readOptionalString(r.condition)}:{}}})}function validateWorkflowEntry(o,r){if(o.entry&&!r.has(o.entry))throw new Error(`Workflow ${o.id} entry references unknown node ${o.entry}`)}function validateWorkflowEdges(o,r){for(const e of o.edges)if(!r.has(e.from)||!r.has(e.to))throw new Error(`Workflow ${o.id} edge references unknown node ${e.from}->${e.to}`)}function validateWorkflowUse(o,r){const e=o.indexOf("."),t=e>0?o.slice(0,e):"",n=e>0?o.slice(e+1):"";if(!t||!n)throw new Error(`Workflow node use must reference inventory as agents.<id>, tools.<id>, skills.<id>, or workflows.<id>: ${o}`);const i="agents"===t?r.agents:"tools"===t?r.tools:"skills"===t?r.skills:"workflows"===t?r.workflows:void 0;if(!i?.has(n))throw new Error(`Workflow node references unknown ${t}.${n}`)}function assertRecord(o,r){if("object"!=typeof o||null===o||Array.isArray(o))throw new Error(`${r} must be an object`);return o}function readName(o){const r=o.metadata?.name;if("string"==typeof r&&r.trim())return r.trim();throw new Error("Workflow document requires metadata.name")}function readDescription(o){const r=o.metadata?.description;return"string"==typeof r&&r.trim()?r.trim():void 0}function readOptionalString(o){return"string"==typeof o&&o.trim()?o.trim():void 0}
|