stable-harness 0.0.136 → 0.0.138
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/dist/workspace/compile.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.d.ts +2 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/agent-tool-visibility.d.ts +23 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/agent-tool-visibility.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +0 -8
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/package.json +2 -2
- package/node_modules/@stable-harness/adapter-langgraph/package.json +2 -2
- package/node_modules/@stable-harness/core/dist/index.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/index.js +1 -1
- package/node_modules/@stable-harness/core/dist/quality/event-evidence.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/completion.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +21 -0
- package/node_modules/@stable-harness/core/dist/runtime/output/deliverables.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/runtime/output/deliverables.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/policy/projection.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/recovery/focused-text-recovery.js +1 -1
- package/node_modules/@stable-harness/core/dist/trace-types.d.ts +26 -0
- package/node_modules/@stable-harness/core/dist/trace-types.js +1 -0
- package/node_modules/@stable-harness/core/dist/trace.d.ts +3 -26
- package/node_modules/@stable-harness/core/dist/trace.js +1 -1
- package/node_modules/@stable-harness/core/package.json +3 -3
- package/node_modules/@stable-harness/governance/package.json +1 -1
- package/node_modules/@stable-harness/memory/package.json +1 -1
- package/node_modules/@stable-harness/protocols/package.json +2 -2
- package/node_modules/@stable-harness/tool-gateway/package.json +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/discovery.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/package.json +2 -2
- package/package.json +10 -10
- package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
- package/packages/adapter-deepagents/dist/src/index.d.ts +2 -0
- package/packages/adapter-deepagents/dist/src/index.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin/agent-tool-visibility.d.ts +23 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin/agent-tool-visibility.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +0 -8
- package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +1 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/packages/adapter-deepagents/package.json +2 -2
- package/packages/adapter-langgraph/package.json +2 -2
- package/packages/cli/package.json +8 -8
- package/packages/core/dist/index.d.ts +2 -0
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/quality/event-evidence.js +1 -1
- package/packages/core/dist/runtime/completion.js +1 -1
- package/packages/core/dist/runtime/events.d.ts +21 -0
- package/packages/core/dist/runtime/output/deliverables.d.ts +2 -0
- package/packages/core/dist/runtime/output/deliverables.js +1 -0
- package/packages/core/dist/runtime/policy/projection.js +1 -1
- package/packages/core/dist/runtime/recovery/focused-text-recovery.js +1 -1
- package/packages/core/dist/trace-types.d.ts +26 -0
- package/packages/core/dist/trace-types.js +1 -0
- package/packages/core/dist/trace.d.ts +3 -26
- package/packages/core/dist/trace.js +1 -1
- package/packages/core/package.json +3 -3
- package/packages/evaluation/package.json +2 -2
- package/packages/governance/package.json +1 -1
- package/packages/memory/package.json +1 -1
- package/packages/protocols/package.json +2 -2
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/dist/discovery.js +1 -1
- package/packages/workspace-yaml/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as e,readFile as t}from"node:fs/promises";import*as s from"node:path";import{parseAllDocuments as o}from"yaml";import{validateSkillMetadata as r}from"../runtime/skills/skill-metadata.js";export async function loadWorkspace(n){const i=s.resolve(n),a=await async function readConfigDocuments(e){const s=await listYamlFiles(e),r=[];for(const e of s){const s=await t(e,"utf8");for(const e of o(s)){const t=e.toJSON();t?.kind&&r.push({...t,metadata:t.metadata??{},spec:t.spec??{}})}}return r}(s.join(i,"config")),c=function compileModels(e){const t=new Map;for(const s of e){if("Models"===s.kind&&Array.isArray(s.spec))for(const e of s.spec){const s=compileModel(e);t.set(String(s.name),s)}if("Model"===s.kind&&isRecord(s.spec)){const e=compileModel({name:s.metadata?.name,...s.spec});t.set(String(e.name),e)}}return t}(a),
|
|
1
|
+
import{readdir as e,readFile as t}from"node:fs/promises";import*as s from"node:path";import{parseAllDocuments as o}from"yaml";import{validateSkillMetadata as r}from"../runtime/skills/skill-metadata.js";export async function loadWorkspace(n){const i=s.resolve(n),a=await async function readConfigDocuments(e){const s=await listYamlFiles(e),r=[];for(const e of s){const s=await t(e,"utf8");for(const e of o(s)){const t=e.toJSON();t?.kind&&r.push({...t,metadata:t.metadata??{},spec:t.spec??{}})}}return r}(s.join(i,"config")),c=function compileModels(e){const t=new Map;for(const s of e){if("Models"===s.kind&&Array.isArray(s.spec))for(const e of s.spec){const s=compileModel(e);t.set(String(s.name),s)}if("Model"===s.kind&&isRecord(s.spec)){const e=compileModel({name:s.metadata?.name,...s.spec});t.set(String(e.name),e)}}return t}(a),l=function compileAgents(e,t){const o=new Map;for(const r of t.filter(e=>"Agent"===e.kind)){if(!isRecord(r.spec))continue;const t=String(r.metadata?.name),n=isRecord(r.spec.config)?r.spec.config:{},i=readSystemPrompt(r.spec,n);o.set(t,{id:t,name:t,description:r.metadata?.description??"",sourcePath:s.join(e,"config","agents",`${t}.yaml`),modelRef:normalizeRef(r.spec.modelRef),toolRefs:readStringList(r.spec.tools),skillPathRefs:readStringList(r.spec.skills).map(t=>s.join(e,"resources","skills",t)),subagentRefs:readStringList(r.spec.subagents),memorySources:readMemorySources(r.spec.memory),deepAgentConfig:{...n,responseFormat:normalizeResponseFormat(n.responseFormat),systemPrompt:i}})}return o}(i,a),m=await async function compileTools(e,t){const o=new Map;for(const e of t.filter(e=>"Tool"===e.kind)){const t=e.metadata?.name;t&&o.set(t,{name:t,id:t,spec:e.spec})}return await loadToolExports(s.join(e,"resources","tools"),o),o}(i,a),p=await async function compileSkills(t){const o=new Map,n=s.join(t,"resources","skills");for(const t of await e(n,{withFileTypes:!0})){if(!t.isDirectory())continue;const e=s.join(n,t.name),i=r(e);o.set(i.name,{name:i.name,path:e,description:i.description,allowedTools:i.allowedTools})}return o}(i);return function resolveAgentSkillNames(e,t){for(const o of e.values())o.skillPathRefs=o.skillPathRefs.map(e=>{const o=s.basename(e);return t.get(o)?.path??e})}(l,p),function ensureDirectAgent(e,t){e.has("direct")||e.set("direct",{id:"direct",name:"direct",description:"Direct execution agent.",sourcePath:s.join(t,"config","runtime","workspace.yaml"),toolRefs:[],skillPathRefs:[],subagentRefs:[],memorySources:[],deepAgentConfig:{}})}(l,i),{workspaceRoot:i,models:c,agents:l,tools:m,skills:p,bindings:compileBindings(l)}}async function listYamlFiles(t){const o=await e(t,{withFileTypes:!0});return(await Promise.all(o.map(async e=>{const o=s.join(t,e.name);return e.isDirectory()?listYamlFiles(o):e.isFile()&&/\.ya?ml$/iu.test(e.name)?[o]:[]}))).flat().sort()}function compileModel(e){const t=String(e.name),s={...e};return delete s.name,delete s.provider,delete s.model,{name:t,provider:String(resolveValue(e.provider)),model:String(resolveValue(e.model)),init:(o=s,Object.fromEntries(Object.entries(o).map(([e,t])=>[e,resolveValue(t)])))};var o}async function loadToolExports(o,r){const n=await e(o,{withFileTypes:!0});for(const e of n){if(e.name.startsWith("_"))continue;const n=s.join(o,e.name);if(e.isDirectory()){await loadToolExports(n,r);continue}if(!e.isFile()||!e.name.endsWith(".mjs"))continue;const i=(await t(n,"utf8")).match(/export\s+const\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*tool/u),a=i?.[1]??s.basename(e.name,".mjs");r.set(a,{name:a,id:a,sourcePath:n})}}function compileBindings(e){const t=new Map;for(const[s,o]of e){const e=o.deepAgentConfig;t.set(s,{agentId:s,deepAgentParams:{responseFormat:e.responseFormat,systemPrompt:e.systemPrompt}})}return t}function readSystemPrompt(e,t){return"string"==typeof e.systemPrompt?e.systemPrompt:"string"==typeof t.systemPrompt?t.systemPrompt:""}function normalizeResponseFormat(e){const t={type:"object",properties:{status:{type:"string",enum:["completed","blocked","failed","refused"]},summary:{type:"array",items:{type:"string"}},findings:{type:"array",items:{type:"string"}},blockers:{type:"array",items:{type:"string"}},nextActions:{type:"array",items:{type:"string"}},report:{type:"string"}},required:["status","summary","findings","blockers","nextActions","report"]};if(!isRecord(e))return t;const s=isRecord(e.properties)?e.properties:{},o=Array.isArray(e.required)?e.required:[];return{...t,...e,properties:{...t.properties,...s},required:[...new Set([...t.required,...o].filter(e=>"string"==typeof e))]}}function readMemorySources(e){return Array.isArray(e)?e.flatMap(e=>isRecord(e)&&"string"==typeof e.path?[e.path]:[]):[]}function readStringList(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):[]}function normalizeRef(e){return"string"==typeof e?e.replace(/^[^/]+\//u,""):void 0}function resolveValue(e){if("string"!=typeof e)return e;const t=e.replace(/\$\{env:([A-Za-z_][A-Za-z0-9_]*)(?::-(.*?))?\}/gu,(e,t,s)=>process.env[t]??s??"");return/^(true|false)$/iu.test(t)?"true"===t.toLowerCase():/^-?\d+$/u.test(t)?Number(t):t}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{realpathSync as e}from"node:fs";import t from"node:path";import{buildRuntimeSystemPrompt as r}from"@stable-harness/core";import{createBuiltinToolPolicyMiddleware as n,createObserverMiddleware as o}from"./internal/builtin-tool-policy.js";import{resolveFilesystemPermissions as s}from"./internal/builtin/permissions.js";import{createToolRepeatState as a}from"@stable-harness/core";import{buildGatewayTools as i,stringifyDeepAgentResult as l}from"./internal/gateway-tools.js";import{resolveDeepAgentsNativeMemories as d}from"./memory.js";import{buildDeepAgentRequest as c}from"./internal/messages.js";import{createRawToolCallParserMiddleware as p}from"./internal/raw-tool-call-parser.js";import{createBackendModel as u}from"./model-providers.js";import{createDeepAgentsRetryMiddleware as
|
|
1
|
+
import{realpathSync as e}from"node:fs";import t from"node:path";import{buildRuntimeSystemPrompt as r}from"@stable-harness/core";import{createBuiltinToolPolicyMiddleware as n,createObserverMiddleware as o}from"./internal/builtin-tool-policy.js";import{resolveFilesystemPermissions as s}from"./internal/builtin/permissions.js";import{createToolRepeatState as a}from"@stable-harness/core";import{buildGatewayTools as i,stringifyDeepAgentResult as l}from"./internal/gateway-tools.js";import{resolveDeepAgentsNativeMemories as d}from"./memory.js";import{buildDeepAgentRequest as c}from"./internal/messages.js";import{createRawToolCallParserMiddleware as p}from"./internal/raw-tool-call-parser.js";import{createBackendModel as u}from"./model-providers.js";import{createDeepAgentsRetryMiddleware as g}from"./retry-policy.js";import{streamDeepAgentResult as m}from"./internal/stream-events.js";import{cleanupDeepAgentsRuntimeSubstrate as f,resolveDeepAgentsRuntimeSubstrate as y}from"./internal/substrate/runtime.js";import{createDefaultDeepAgentsBackend as v}from"./internal/vfs-backend.js";export function createDeepAgentsAdapter(e={}){return{name:"deepagents",canRun:e=>"deepagents"===e.backend,async run(t){const r=focusedRecoveryToolIds(t),n=recoveryVisibleTools(t,t.agent.tools);if(t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",phase:"agent.handoff",modelRef:t.agent.modelRef,tools:t.agent.tools,gatewayTools:n,...r.length>0?{focusedRecoveryTools:r,recoveryMode:"required_evidence_tools"}:{},skills:t.agent.skills,subagents:t.agent.subagents}}),(r.length>0||n.length!==t.agent.tools.length)&&t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",phase:"agent.gateway.tools",tools:n,declaredTools:t.agent.tools,...r.length>0?{focusedRecoveryTools:r,recoveryMode:"required_evidence_tools"}:{}}}),e.runner)return e.runner(t);const o=e.createDeepAgent?void 0:await async function loadDeepAgentsModule(){try{return await async function importOptionalPackage(e){return import(e)}("deepagents")}catch(e){throw new Error(`DeepAgents package is required for the default adapter path: ${function formatError(e){return e instanceof Error?e.message:String(e)}(e)}`)}}(),a=e.createDeepAgent??function readCreateDeepAgent(e){const t=e?.createDeepAgent;if("function"==typeof t)return t;throw new Error("DeepAgents package does not export createDeepAgent.")}(o),d={...readDeepAgentsConfig(e.config),...readDeepAgentsConfig(t.agent.config.deepagents)},p=y(t,d),u=resolveDeepAgentsSkills(t,t.agent),g=resolveDeepAgentsMemory(t,t.agent),A=void 0===d.backend?await v({workspaceRoot:t.workspace.root,skills:u,memory:g,config:d}):{cleanup:async()=>{}};try{const e=void 0===A.backend&&void 0===d.backend,r=a(function buildDeepAgentParams(e,t,r,n,o={}){const a=o.skills??resolveDeepAgentsSkills(e,e.agent),l=o.memory??resolveDeepAgentsMemory(e,e.agent),d=t.permissions??s(e,e.agent,{enabled:!0===o.autoPathPermissions}),c=requestScopedRepeatState(e,e.agent.id);return pruneUndefined({name:e.agent.id,model:t.model??resolveAgentModel(e,e.agent),systemPrompt:buildSystemPrompt(e,e.agent),backend:t.backend??o.backend??resolveDeepAgentsBackend(e,n,a),checkpointer:r.checkpointer,store:r.store,middleware:mergeMiddleware(e,e.agent,t.middleware,c),responseFormat:t.responseFormat,contextSchema:t.contextSchema,interruptOn:t.interruptOn,generalPurposeAgent:readBoolean(t.generalPurposeAgent),taskDescription:readString(t.taskDescription),permissions:d,tools:i(e,e.agent.id,recoveryVisibleTools(e,e.agent.tools),resolveAgentRepairModel(e,e.agent,t),c),subagents:e.agent.subagents.map(t=>{const r=e.workspace.agents.get(t),n=readDeepAgentsConfig(r?.config.deepagents),a=n.permissions??s(e,r,{enabled:!0===o.autoPathPermissions}),l=scopedInput(e,r),d=requestScopedRepeatState(e,t);return pruneUndefined({name:t,description:r?.description??readString(r?.config.description)??r?.id,systemPrompt:buildSystemPrompt(e,r),model:n.model??(r?resolveAgentModel(e,r):void 0),middleware:mergeMiddleware(l,r,n.middleware,d),interruptOn:n.interruptOn,generalPurposeAgent:readBoolean(n.generalPurposeAgent),taskDescription:readString(n.taskDescription),permissions:a,responseFormat:n.responseFormat,tools:i(e,t,recoveryVisibleTools(e,r?.tools??[]),resolveAgentRepairModel(l,r,n),d),memory:resolveDeepAgentsMemory(e,r),skills:resolveDeepAgentsSkills(e,r)})}),memory:l,skills:a})}(t,d,p,o,{backend:A.backend,skills:u,memory:g,autoPathPermissions:e})),n=c(t),f=function buildDeepAgentInvokeConfig(e,t){return pruneUndefined({recursionLimit:readNumber(readDeepAgentsConfig(e.config.deepagents).recursionLimit)??readNumber(e.config.recursionLimit),configurable:{thread_id:t}})}(t.agent,p.threadId);if(!0===t.request.metadata?.openaiStream&&r.streamEvents){const e=await r.streamEvents(n,{version:"v3",...f});return await m(t,e,l)}const y=await r.invoke(n,f);return l(y)}finally{await A.cleanup(),await f(p)}}}}function recoveryVisibleTools(e,t){const r=focusedRecoveryToolIds(e);return 0===r.length?t:t.filter(e=>r.includes(e))}function focusedRecoveryToolIds(e){return readStringArray(e.request.metadata?.stableHarnessRequiredEvidenceTools)??[]}function buildSystemPrompt(e,t){const n=t?.systemPrompt??readString(t?.config.systemPrompt);return r({workspace:e.workspace,request:e.request,agent:t},n)}function resolveDeepAgentsMemory(e,t){const r=readDeepAgentsStringArray(t?.config,"memory");if(r)return r;const n=[...readAgentMemorySources(e.workspace.root,t),...d(e.workspace).map(e=>`/memories/${e.id}.md`)],o=[...new Set(n)];return o.length>0?o:void 0}function readAgentMemorySources(e,t){return(t?.memory??[]).flatMap(t=>"string"==typeof t&&t.trim()?[backendMemorySourcePath(e,t.trim())]:isRecord(t)&&"string"==typeof t.path&&t.path.trim()?[backendMemorySourcePath(e,t.path.trim())]:[])}function backendMemorySourcePath(e,r){if(r.startsWith("/"))return r;if(t.isAbsolute(r)){const n=t.relative(e,r);return n&&!n.startsWith("..")?`/${n.split(t.sep).join("/")}`:canonicalPath(r)}const n=r.split(t.sep).join("/");return n.startsWith("/")?n:`/${n}`}function resolveDeepAgentsSkills(e,r){const n=readDeepAgentsStringArray(r?.config,"skills");if(n)return n;if(!function canUseNativeSkillSources(e){const t=(isRecord(e?.config.builtinTools)?e.config.builtinTools:{}).modelExposed;return!!Array.isArray(t)&&(t.includes("read_file")||t.includes("grep"))}(r))return;const o=[...new Set((r?.skills??[]).map(t=>e.workspace.skills.get(t)?.path).filter(e=>"string"==typeof e&&e.trim().length>0).map(r=>function backendSkillSourcePath(e,r){const n=t.dirname(t.dirname(r)),o=t.relative(e,n);return!o||o.startsWith("..")||t.isAbsolute(o)?""===o?"/":canonicalPath(n):`/${o.split(t.sep).join("/")}`}(e.workspace.root,r)))];return o.length>0?o:void 0}function resolveDeepAgentsBackend(e,t,r){if(t?.FilesystemBackend&&r&&0!==r.length)return()=>new t.FilesystemBackend({rootDir:e.workspace.root})}function mergeMiddleware(e,t,r,s=a(e.workspace.runtime.toolGateway)){const i=Array.isArray(r)?r:[],l=scopedInput(e,t),d=new Set,c=readDeepAgentsConfig(t?.config.deepagents);return[o(l,{observedToolIds:d,repeatState:s,repairModel:resolveAgentRepairModel(l,t,c)}),n(l,{repeatState:s}),...g(e.workspace.runtime.retry),...i,p(l)]}function requestScopedRepeatState(e,t){const r=`deepagents.repeat.${t}`,n=e.requestState?.get(r);if(n)return n;const o=a(e.workspace.runtime.toolGateway);return e.requestState&&o&&e.requestState.set(r,o),o}function scopedInput(e,t){return t?{...e,agent:t}:e}function resolveAgentModel(e,t){const r=t.modelRef?e.workspace.models.get(t.modelRef):void 0;return r?u(r):void 0}function resolveAgentRepairModel(e,t,r){const n=r.model;if(isRepairModel(n))return n;if(!t?.modelRef)return;const o=e.workspace.models.get(t.modelRef);if(!o||"openai-compatible"!==o.provider)return;const s=u(o);return isRepairModel(s)?s:void 0}function readDeepAgentsConfig(e){return isRecord(e)?e:{}}function readDeepAgentsStringArray(e,t){const r=isRecord(e)?e:{},n=readDeepAgentsConfig(r.deepagents),o="memory"===t?["memory","memorySources"]:["skills","skillSources"];for(const e of o){const t=readStringArray(n[e]);if(t)return t}return readStringArray(r[t])}function pruneUndefined(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>void 0!==e))}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function readNumber(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function readBoolean(e){return"boolean"==typeof e?e:void 0}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e):void 0}function canonicalPath(t){try{return e.native(t)}catch{return t}}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function isRepairModel(e){return"object"==typeof e&&null!==e&&"invoke"in e&&"function"==typeof e.invoke}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { createDeepAgentsAdapter } from "./adapter.js";
|
|
2
2
|
export { createDeepAgentsMemoryMaintenanceTarget, resolveDeepAgentsNativeMemories } from "./memory.js";
|
|
3
3
|
export { createBackendModel } from "./model-providers.js";
|
|
4
|
+
export { resolveBuiltinVisibilityFromConfig, } from "./internal/builtin/agent-tool-visibility.js";
|
|
5
|
+
export type { BuiltinVisibility, BuiltinVisibilityWarning, } from "./internal/builtin/agent-tool-visibility.js";
|
|
4
6
|
export type { DeepAgentFactory, DeepAgentsAdapterRunner } from "./types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{createDeepAgentsAdapter}from"./adapter.js";export{createDeepAgentsMemoryMaintenanceTarget,resolveDeepAgentsNativeMemories}from"./memory.js";export{createBackendModel}from"./model-providers.js";
|
|
1
|
+
export{createDeepAgentsAdapter}from"./adapter.js";export{createDeepAgentsMemoryMaintenanceTarget,resolveDeepAgentsNativeMemories}from"./memory.js";export{createBackendModel}from"./model-providers.js";export{resolveBuiltinVisibilityFromConfig}from"./internal/builtin/agent-tool-visibility.js";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
3
|
+
export type BuiltinVisibilityWarning = {
|
|
4
|
+
code: "builtin_modelExposed_true_unsupported";
|
|
5
|
+
field: "builtinTools.modelExposed";
|
|
6
|
+
} | {
|
|
7
|
+
code: "builtin_modelExposed_invalid_entry";
|
|
8
|
+
field: "builtinTools.modelExposed";
|
|
9
|
+
entry: unknown;
|
|
10
|
+
} | {
|
|
11
|
+
code: "builtin_filesystem_field_deprecated";
|
|
12
|
+
field: "builtinTools.filesystem";
|
|
13
|
+
reason: "modelExposed_declared" | "true_alias";
|
|
14
|
+
};
|
|
15
|
+
export type BuiltinVisibility = {
|
|
16
|
+
exposed: Set<string>;
|
|
17
|
+
declared: boolean;
|
|
18
|
+
warnings: BuiltinVisibilityWarning[];
|
|
19
|
+
};
|
|
20
|
+
export declare function resolveBuiltinVisibility(input: AdapterRunInput): BuiltinVisibility;
|
|
21
|
+
export declare function resolveBuiltinVisibilityFromConfig(config: unknown): BuiltinVisibility;
|
|
22
|
+
export declare function builtinToolExposed(visibility: BuiltinVisibility, toolId: string): boolean;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function resolveBuiltinVisibility(e){return resolveBuiltinVisibilityFromConfig(e.agent.config)}export function resolveBuiltinVisibilityFromConfig(e){const i=readRecord(readRecord(e)?.builtinTools),o=[];if(!i)return{exposed:new Set,declared:!1,warnings:o};const n=i.modelExposed,r=i.filesystem;if(void 0===n)return!1===r||void 0===r||o.push({code:"builtin_filesystem_field_deprecated",field:"builtinTools.filesystem",reason:"true_alias"}),{exposed:new Set,declared:!1,warnings:o};if(void 0!==r&&o.push({code:"builtin_filesystem_field_deprecated",field:"builtinTools.filesystem",reason:"modelExposed_declared"}),!1===n)return{exposed:new Set,declared:!0,warnings:o};if(!0===n)return o.push({code:"builtin_modelExposed_true_unsupported",field:"builtinTools.modelExposed"}),{exposed:new Set,declared:!0,warnings:o};if(!Array.isArray(n))return{exposed:new Set,declared:!0,warnings:o};const d=new Set;for(const e of n)"string"==typeof e&&e.length>0?d.add(e):o.push({code:"builtin_modelExposed_invalid_entry",field:"builtinTools.modelExposed",entry:e});return{exposed:d,declared:!0,warnings:o}}export function builtinToolExposed(e,i){return e.exposed.has(i)}function readRecord(e){if(null!=e&&"object"==typeof e&&!Array.isArray(e))return e}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
import { ToolMessage } from "@langchain/core/messages";
|
|
2
1
|
import type { RuntimeAdapter, WorkspaceAgent } from "@stable-harness/core";
|
|
3
2
|
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
4
3
|
export declare const filesystemBuiltinToolIds: Set<string>;
|
|
5
|
-
export declare function validateFilesystemBuiltinCall(input: AdapterRunInput, toolId: string, request: {
|
|
6
|
-
toolCall?: {
|
|
7
|
-
id?: string;
|
|
8
|
-
};
|
|
9
|
-
}): ToolMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>> | undefined;
|
|
10
4
|
export declare function resolveFilesystemPermissions(input: AdapterRunInput, agent: WorkspaceAgent | undefined, options?: {
|
|
11
5
|
enabled?: boolean;
|
|
12
6
|
}): {
|
|
@@ -14,6 +8,4 @@ export declare function resolveFilesystemPermissions(input: AdapterRunInput, age
|
|
|
14
8
|
paths: string[];
|
|
15
9
|
mode: string;
|
|
16
10
|
}[] | undefined;
|
|
17
|
-
export declare function isFilesystemDisabled(input: AdapterRunInput): boolean;
|
|
18
|
-
export declare function isFilesystemTool(name: unknown): boolean;
|
|
19
11
|
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{realpathSync as e}from"node:fs";import{
|
|
1
|
+
import{realpathSync as e}from"node:fs";import{resolveBuiltinVisibilityFromConfig as t}from"./agent-tool-visibility.js";export const filesystemBuiltinToolIds=new Set(["ls","read_file","write_file","edit_file","glob","grep"]);export function resolveFilesystemPermissions(e,n,i={}){if(!0!==i.enabled)return;if(!function hasAnyFilesystemBuiltinExposed(e){const n=t(e?.config);for(const e of filesystemBuiltinToolIds)if(n.exposed.has(e))return!0;return!1}(n))return;const o=[];return o.push(...function skillReadPermissions(e,t){const n=[...new Set((t?.skills??[]).flatMap(t=>function skillReadPaths(e,t){return t?[...new Set([t,canonicalPath(t),backendSkillPath(e,t)])].flatMap(e=>function skillReadPathCandidates(e){const t=e.replace(/\/+$/u,""),n=t.endsWith("/SKILL.md")?t.slice(0,-9):t,i=function parentPath(e){const t=e.lastIndexOf("/");return t>0?e.slice(0,t):void 0}(n);return[t,n,`${n}/**`,...i?[i,`${i}/**`]:[]]}(e)):[]}(e.workspace.root,e.workspace.skills.get(t)?.path)).filter(e=>e.startsWith("/")))];return n.length>0?[{operations:["read"],paths:n,mode:"allow"}]:[]}(e,n)),deepagentsMemoryWritable(e)||deepagentsMemoryWritable(e)||o.push({operations:["write"],paths:["/memories/**"],mode:"deny"}),o.length>0?o:void 0}function backendSkillPath(e,t){const n=function pathRelative(e,t){const n=e.split("/").filter(Boolean),i=t.split("/").filter(Boolean);if(!(i.length<n.length)){for(let e=0;e<n.length;e+=1)if(n[e]!==i[e])return;return i.slice(n.length).join("/")}}(e,t);return void 0===n?t:`/${n.split("/").filter(Boolean).join("/")}`}function canonicalPath(t){try{return e.native(t)}catch{return t}}function deepagentsMemoryWritable(e){const t=function readConfigRecord(e,t){const n=isRecord(e)?e:{};return isRecord(n[t])?n[t]:void 0}(e.workspace.runtime.memory,"deepagentsMem");return!1!==t?.write}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{repairCallSelection as e}from"@easynet/better-call";import{ToolMessage as t}from"@langchain/core/messages";import{normalizeArgsRecord as r}from"../builtin-args.js";export async function repairTaskCall(n,a,s={}){const o=function allowedTaskTypes(e){const t=readConfigRecord(e.agent.config,"deepagents");if(!0===t?.generalPurposeAgent)return;const r=readConfigRecord(e.agent.config,"builtinTools")?.modelExposed;return
|
|
1
|
+
import{repairCallSelection as e}from"@easynet/better-call";import{ToolMessage as t}from"@langchain/core/messages";import{normalizeArgsRecord as r}from"../builtin-args.js";export async function repairTaskCall(n,a,s={}){const o=function allowedTaskTypes(e){const t=readConfigRecord(e.agent.config,"deepagents");if(!0===t?.generalPurposeAgent)return;const r=readConfigRecord(e.agent.config,"builtinTools")?.modelExposed;return Array.isArray(r)&&r.includes("task")?e.agent.subagents:[]}(n);if(void 0===o)return{request:a};const i=function normalizeTaskArgs(e){const t=r(e),n=function readNestedTaskRecord(e){return readJsonRecord(e.input)??readJsonRecord(e.task)??readJsonRecord(e.arguments)??readJsonRecord(e.parameters)}(t);if(!n)return t;const a={...t};for(const[e,t]of Object.entries(n))void 0===a[e]&&(a[e]=t);if(readJsonRecord(t.input)&&delete a.input,readJsonRecord(t.task)&&delete a.task,!hasCanonicalTaskTarget(a)&&!readString(a.description)){const e=readString(a.task)??readString(a.instruction);e&&(a.description=e)}return a}(a.toolCall?.args),d=function readTaskSubagentType(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)??readString(t.target)??readString(t.role)}(i),c=d;if(c&&o.includes(c)){const e=hasCanonicalTaskTarget(i)&&d===c?i:{...i,subagent_type:c};return{request:{...a,toolCall:{...a.toolCall,args:e}}}}const l=await e({userInput:n.request.input,call:{id:d??readString(i.role)??n.request.input,args:i},candidates:taskCallCandidates(n,o),mode:"repair",repairModel:s.repairModel});if(l.ok){emitInventoryRepair(n,"repaired",d,l.candidateId,o);const e={...i,...l.args,subagent_type:l.candidateId};return{request:{...a,toolCall:{...a.toolCall,args:e}}}}emitInventoryRepair(n,"blocked",d,void 0,o,l.reason);const u=d?`: ${d}`:"",g=o.length>0?o.join(", "):"none";return{request:a,blocked:new t({tool_call_id:a.toolCall?.id??"stable-harness-task-policy",name:"task",status:"error",content:[`Task delegation target is not in the workspace inventory${u}. Allowed task targets: ${g}.`,"Retry with an allowed target only when that target semantically owns the original user request.","Do not substitute another specialist just to continue the same evidence need; synthesize from already collected evidence when no allowed target is a semantic match."].join(" ")})}}function emitInventoryRepair(e,t,r,n,a,s){e.emit({type:"runtime.adapter.event",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,event:{adapter:"deepagents",phase:"inventory.repair",status:t,diagnostic:{layer:"task",owner:"stable_runtime_policy",originalId:r,repairedId:n,candidateIds:a,reason:s}}})}function taskCallCandidates(e,t){return t.map(t=>({id:t,description:e.workspace.agents.get(t)?.description,schema:{type:"object",properties:{subagent_type:{type:"string"},subagentType:{type:"string"},target:{type:"string"},role:{type:"string"},description:{type:"string"},task:{type:"string"},instruction:{type:"string"},input:{type:"string"}},required:["description"],additionalProperties:!0}}))}function hasCanonicalTaskTarget(e){return Boolean(readString(e.subagent_type)??readString(e.subagentType))}function readJsonRecord(e){if(isRecord(e))return e;if("string"==typeof e&&e.trim())try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}function readConfigRecord(e,t){const r=isRecord(e)?e:{};return isRecord(r[t])?r[t]:void 0}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { RuntimeAdapter } from "@stable-harness/core";
|
|
|
2
2
|
import { type ToolRepeatState } from "@stable-harness/core";
|
|
3
3
|
import type { RuntimeToolRepairModel } from "@stable-harness/core";
|
|
4
4
|
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
5
|
+
export declare function isDeepAgentsBuiltinTool(name: unknown): boolean;
|
|
5
6
|
export declare function createBuiltinToolPolicyMiddleware(input: AdapterRunInput, options?: {
|
|
6
7
|
repeatState?: ToolRepeatState;
|
|
7
8
|
}): {
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ToolMessage as t}from"@langchain/core/messages";import{afterToolInvoke as e,beforeToolInvoke as o,createToolRepeatState as r}from"@stable-harness/core";import{
|
|
1
|
+
import{ToolMessage as t}from"@langchain/core/messages";import{afterToolInvoke as e,beforeToolInvoke as o,createToolRepeatState as r}from"@stable-harness/core";import{resolveBuiltinVisibility as n}from"./builtin/agent-tool-visibility.js";import{filesystemBuiltinToolIds as i}from"./builtin/permissions.js";import{repairTaskCall as s}from"./builtin/task-inventory.js";import{repairBuiltinToolRequest as a}from"./builtin-call-repair.js";import{stringifyDeepAgentResult as l,toolControlProjection as u}from"./gateway-tools.js";import{isSuccessfulEvidenceOutput as d,observedToolEvidence as c,recordObservedToolEvidence as p}from"./gateway/tool-evidence.js";import{filterRepeatLimitedTools as g}from"./tool-repeat-visibility.js";import{traceProjectionForBuiltinTool as f}from"./trace-projection.js";const m=new Set(["write_todos","read_todos","task","execute",...i]);export function isDeepAgentsBuiltinTool(t){return"string"==typeof t&&m.has(t)}export function createBuiltinToolPolicyMiddleware(t,e={}){const o=n(t),r=new Set;return{name:"StableHarnessBuiltinToolPolicy",async wrapModelCall(n,i){!function emitVisibilityWarningsOnce(t,e,o){for(const r of e.warnings){const e=warningKey(r);o.has(e)||(o.add(e),t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",phase:"agent.builtin.visibility.warning",warning:r}}))}}(t,o,r);const s=Array.isArray(n.tools)?n.tools.filter(t=>isToolModelVisible(t.name,o)):n.tools,a=Array.isArray(s)?g(s,e.repeatState):s,l=function normalizeToolChoice(t,e,o,r){if(function focusedEvidenceRecovery(t){const e=t.request.metadata?.stableHarnessRequiredEvidenceTools;return Array.isArray(e)&&e.some(t=>"string"==typeof t&&t.length>0)}(t)){const e=function focusedSingleToolName(t,e){const o=t.request.metadata?.stableHarnessRequiredEvidenceTools,r=Array.isArray(o)?o.filter(t=>"string"==typeof t&&t.length>0):[],n=(e??[]).map(t=>t.name).filter(t=>"string"==typeof t&&t.length>0);return 1===r.length&&n.includes(r[0])?r[0]:void 0}(t,o);return e?{type:"function",function:{name:e}}:o&&o.length>0?"required":"auto"}return"required"===e?o&&o.length>0?e:"auto":function isForcedHiddenTool(t,e){const o=t?.function?.name;return"string"==typeof o&&!!m.has(o)&&!e.exposed.has(o)}(e,r)?"auto":e}(t,n.toolChoice,a,o);return i({...n,tools:a,toolChoice:l})}}}export function createObserverMiddleware(i,u={}){const p=u.repeatState??r(i.workspace.runtime.toolGateway),g=n(i);return{name:"StableHarnessObserver",async wrapToolCall(r,n){const f=r.toolCall?.name;if(!f||!m.has(f))return n(r);if("task"!==f&&g.declared&&!isToolModelVisible(f,g)){const t=JSON.stringify({status:"hidden_builtin_tool",toolId:f,instruction:"This DeepAgents builtin is not exposed by config.builtinTools.modelExposed for the current agent. Do not call it again. Use only declared tools, exposed builtins, or delegate to an allowed subagent."});return emitToolEvent(i,f,"agent.tool.start",r.toolCall?.args),emitToolEvent(i,f,"agent.tool.result",r.toolCall?.args,{output:t}),builtinToolMessage(r,f,t)}const v=await a({toolId:f,request:r,workspaceRoot:i.workspace.root}),y="task"===f?await s(i,v,{repairModel:u.repairModel}):{request:v},h=y.request,b=y.blocked;if(b)return emitToolEvent(i,f,"agent.tool.result",h.toolCall?.args,{output:b.content}),b;if(emitToolEvent(i,f,"agent.tool.start",h.toolCall?.args),"task"===f){const t=p?o(f,h.toolCall?.args,p):void 0;if(t)return emitToolEvent(i,f,"agent.tool.result",h.toolCall?.args,{output:t.eventOutput}),builtinToolMessage(r,f,modelOutputForRepeatedBuiltin(f,t.modelOutput))}try{const s="task"===f?void 0:p?o(f,h.toolCall?.args,p):void 0;if(s)return emitToolEvent(i,f,"agent.tool.result",h.toolCall?.args,{output:s.eventOutput}),builtinToolMessage(r,f,modelOutputForRepeatedBuiltin(f,s.modelOutput));const a=await n(h),c=function observedToolOutput(t,e,o){return"write_todos"===t?JSON.stringify({status:"recorded",args:e.toolCall?.args}):l(o)}(f,h,a),g=p?e({toolId:f,args:h.toolCall?.args,output:c,successful:!(a instanceof t&&"error"===a.status)&&d(c),state:p}):{};return emitToolEvent(i,f,"agent.tool.result",h.toolCall?.args,{output:g.eventOutput??c}),u.observedToolIds?.add(f),void 0===g.modelOutput?a:builtinToolMessage(r,f,g.modelOutput)}catch(e){const o=function recoverableBuiltinToolError(e,o,r,n){const i=formatError(n);if("task"===o&&/repeat limit reached for tool/iu.test(i)){const o=function formatObservedEvidence(t){const e=c(t);if(0===e.length)return"";const o=e.map(t=>[`Agent: ${t.agentId}`,`Tool: ${t.toolId}`,t.output].join("\n")).join("\n\n---\n\n");return o.length>12e3?`${o.slice(0,12e3)}\n[truncated]`:o}(e);return new t({tool_call_id:r.toolCall?.id??"stable-harness-task-repeat-limit",name:"task",content:JSON.stringify({status:"delegated_task_repeat_limit",finalizationRequired:!0,instruction:"The delegated agent reached a configured tool repeat limit. Stop delegating this evidence need and do not send a synthesis task to another subagent for the same need. Finalize only from observedEvidence and other evidence that is already visible in this run. If the visible evidence is insufficient for a requested claim, report an explicit blocker or evidence gap instead of estimating, inventing, or using generic knowledge.",...o?{observedEvidence:o}:{},error:previewError(i)})})}if(/Received tool input did not match expected schema|Invalid input:/iu.test(i))return new t({tool_call_id:r.toolCall?.id??`stable-harness-${o}-argument-error`,name:o,status:"error",content:JSON.stringify({status:"tool_argument_error",toolId:o,instruction:"The upstream builtin tool rejected these arguments. Fix the tool arguments according to the tool schema, or choose a more appropriate available tool.",error:previewError(i)})})}(i,f,r,e);if(o)return emitToolEvent(i,f,"agent.tool.result",v.toolCall?.args,{output:o.content}),o;throw emitToolEvent(i,f,"agent.tool.result",v.toolCall?.args,{error:formatError(e)}),e}}}}function isToolModelVisible(t,e){return"string"!=typeof t||!m.has(t)||e.exposed.has(t)}function warningKey(t){return"entry"in t?`${t.code}:${String(t.entry)}`:t.code}function builtinToolMessage(e,o,r){return new t({tool_call_id:e.toolCall?.id??`stable-harness-${o}-repeat-guard`,name:o,content:r})}function modelOutputForRepeatedBuiltin(t,e){return"task"!==t?e:function readPreviousOutput(t){try{const e=JSON.parse(t);if(!function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}(e)||"repeated_tool_call_limit"!==e.status||"string"!=typeof e.previousOutput)return;const o=e.previousOutput.trim();return o.length>0?o:void 0}catch{return}}(e)??e}function emitToolEvent(t,e,o,r,n={}){"string"==typeof n.output&&p(t,t.agent.id,e,n.output),t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",eventGroup:"tool_execution",eventType:"agent.tool.start"===o?"deepagents.tool_execution.start":"deepagents.tool_execution.result",phase:o,toolId:e,..."agent.tool.start"===o?{args:r}:{},...n,..."string"==typeof n.output?u(n.output):{},...f(e,o,r)}})}function formatError(t){return t instanceof Error?t.message:String(t)}function previewError(t){const e=t.replace(/\s+/gu," ").trim();return e.length>800?`${e.slice(0,797)}...`:e}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-deepagents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.138",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@langchain/node-vfs": "^0.1.4",
|
|
17
17
|
"@langchain/ollama": "^1.2.7",
|
|
18
18
|
"@langchain/openai": "^1.4.5",
|
|
19
|
-
"@stable-harness/core": "0.0.
|
|
19
|
+
"@stable-harness/core": "0.0.138",
|
|
20
20
|
"deepagents": "^1.10.1",
|
|
21
21
|
"langchain": "^1.4.0"
|
|
22
22
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-langgraph",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.138",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
"types": "dist/src/index.d.ts",
|
|
13
13
|
"peerDependencies": {
|
|
14
14
|
"@langchain/langgraph": "^1.3.0",
|
|
15
|
-
"@stable-harness/core": "0.0.
|
|
15
|
+
"@stable-harness/core": "0.0.138"
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -9,6 +9,7 @@ export { createWorkspaceSandboxPolicy } from "./runtime/governance/sandbox.js";
|
|
|
9
9
|
export * from "./memory-plugins.js";
|
|
10
10
|
export { resolveEnabledMemories } from "./memory-plugins/shared.js";
|
|
11
11
|
export * from "./runtime/persistence/queue.js";
|
|
12
|
+
export * from "./runtime/output/deliverables.js";
|
|
12
13
|
export * from "./runtime/policy/projection.js";
|
|
13
14
|
export * from "./runtime.js";
|
|
14
15
|
export * from "./runtime/selection-repair.js";
|
|
@@ -18,6 +19,7 @@ export * from "./runtime/policy/tool-invocation.js";
|
|
|
18
19
|
export * from "./runtime/persistence/stores.js";
|
|
19
20
|
export * from "./runtime/improvement/store.js";
|
|
20
21
|
export * from "./trace.js";
|
|
22
|
+
export * from "./trace-types.js";
|
|
21
23
|
export * from "./types.js";
|
|
22
24
|
export * from "./workspace/tool-quality.js";
|
|
23
25
|
export * from "./evaluations/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export*from"./runtime/metrics/prometheus.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export{resolveEnabledMemories}from"./memory-plugins/shared.js";export*from"./runtime/persistence/queue.js";export*from"./runtime/policy/projection.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/tracing/langsmith.js";export*from"./runtime/policy/tool-invocation.js";export*from"./runtime/persistence/stores.js";export*from"./runtime/improvement/store.js";export*from"./trace.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
|
|
1
|
+
export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export*from"./runtime/metrics/prometheus.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export{resolveEnabledMemories}from"./memory-plugins/shared.js";export*from"./runtime/persistence/queue.js";export*from"./runtime/output/deliverables.js";export*from"./runtime/policy/projection.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/tracing/langsmith.js";export*from"./runtime/policy/tool-invocation.js";export*from"./runtime/persistence/stores.js";export*from"./runtime/improvement/store.js";export*from"./trace.js";export*from"./trace-types.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{looksLikeUnexecutedToolIntent as e}from"./evidence/tool-intent.js";export function hasPlanningEvidence(e){return e.some(e=>{const t=readAdapterEvent(e);return!!t&&("plan"===t.traceType||String(t.traceLabel??"").startsWith("plan.")||"write_todos"===t.toolId&&String(t.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(e){const t=e.flatMap(e=>{if("runtime.tool.direct.completed"===e.type)return[e.toolId];const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n&&isSuccessfulEvidenceEvent(t)?[n]:[]});return[...new Set(t)]}export function successfulEvidenceOutputs(e){return successfulEvidenceItems(e).map(e=>e.output)}export function successfulEvidenceItems(e){return e.flatMap(e=>{if("runtime.tool.direct.completed"===e.type)return stringifyEvidence(e.output).map(t=>({source:e.toolId,output:t}));const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n?!isSuccessfulEvidenceEvent(t)||isPlanningTool(n)?[]:stringifyEvidence(t.evidenceOutput??t.output).filter(e=>isUsableEvidenceOutput(n,e)).map(e=>({source:n,output:e})):[]})}export function controlBlockers(e){const t=successfulEventIndexesBySource(e);return e.flatMap((n,o)=>{const r=readAdapterEvent(n),s=readControlStatus(r),u=readControlSource(r)??"tool";return s&&isBlockerStatus(s)?isResolvedByLaterCompletion(s)&&completedAfter(t,u,o)||
|
|
1
|
+
import{looksLikeUnexecutedToolIntent as e}from"./evidence/tool-intent.js";export function hasPlanningEvidence(e){return e.some(e=>{const t=readAdapterEvent(e);return!!t&&("plan"===t.traceType||String(t.traceLabel??"").startsWith("plan.")||"write_todos"===t.toolId&&String(t.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(e){const t=e.flatMap(e=>{if("runtime.tool.direct.completed"===e.type)return[e.toolId];const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n&&isSuccessfulEvidenceEvent(t)?[n]:[]});return[...new Set(t)]}export function successfulEvidenceOutputs(e){return successfulEvidenceItems(e).map(e=>e.output)}export function successfulEvidenceItems(e){return e.flatMap(e=>{if("runtime.tool.direct.completed"===e.type)return stringifyEvidence(e.output).map(t=>({source:e.toolId,output:t}));const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n?!isSuccessfulEvidenceEvent(t)||isPlanningTool(n)?[]:stringifyEvidence(t.evidenceOutput??t.output).filter(e=>isUsableEvidenceOutput(n,e)).map(e=>({source:n,output:e})):[]})}export function controlBlockers(e){const t=successfulEventIndexesBySource(e);return e.flatMap((n,o)=>{const r=readAdapterEvent(n),s=readControlStatus(r),u=readControlSource(r)??"tool";return s&&isBlockerStatus(s)?isResolvedByLaterCompletion(s)&&completedAfter(t,u,o)||isResolvedByLaterEvidenceCompletion(s)&&successfulEvidenceAfter(e,o)||isResolvedByLaterAnyCompletion(s)&&completedAfterAny(t,o)?[]:[`${u}:${s}`]:[]})}export function controlGaps(e){const t=new Set(successfulEvidenceItems(e).map(e=>e.source));return e.flatMap(e=>{const n=readAdapterEvent(e),o=readControlStatus(n),r=readControlSource(n)??"tool";return o&&isGapStatus(o)?t.has(r)&&isResolvedByLaterCompletion(o)?[]:[`${r}:${o}`]:[]})}export function omittedControlGaps(e,t){const n=successfulEventIndexesBySource(e),o=successfulEvidenceItems(e),r=function outputHasUnsupportedEvidenceClaims(e,t,n){const o=function evidenceCorpus(e,t){return[...t.map(e=>e.output),...e.flatMap(e=>"runtime.request.started"===e.type?[e.input??""]:[]),...e.flatMap(e=>"runtime.memory.recall.completed"===e.type?[e.context]:[])].join("\n")}(t,n).toLowerCase();return unsupportedTokens(e,o,/\b[A-Z][A-Z0-9]{1,12}-\d+\b/gu).length>0||unsupportedTokens(e,o,/\b[A-Za-z_$][A-Za-z0-9_$]*[A-Z][A-Za-z0-9_$]*\b/gu).filter(isCodeLikeIdentifier).length>=2}(t,e,o);return e.flatMap((s,u)=>{const i=readAdapterEvent(s),c=readControlStatus(i),a=readControlSource(i)??"tool";return c&&function isOmittedControlStatus(e){return isGapStatus(e)||isBlockerStatus(e)}(c)?isResolvedByLaterCompletion(c)&&completedAfter(n,a,u)||isResolvedByLaterAnyCompletion(c)&&completedAfterAny(n,u)||isPlanningTool(a)&&isResolvedByLaterEvidenceCompletion(c)&&successfulEvidenceAfter(e,u)||!r&&outputUsesPriorEvidence(t,a,o)?[]:[`${a}:${c}`]:[]})}function stringifyEvidence(e){return"string"==typeof e?e.trim()?[e]:[]:null==e?[]:[JSON.stringify(e)]}function isPlanningTool(e){return"write_todos"===e||"read_todos"===e}function isUsableEvidenceOutput(t,n){return"task"!==t||!e(n)}function readAdapterEvent(e){if("runtime.adapter.event"===e.type&&isRecord(e.event))return e.event;const t=e;return isRecord(t)&&isToolResultEvent(t)?t:void 0}function isSuccessfulEvidenceEvent(e){const t=readEventStatus(e);return!t||/^(?:completed|success|ok|recorded)$/iu.test(t)}function isBlockerStatus(e){return/^(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked)$/iu.test(e)}function isGapStatus(e){return/^(?:dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)$/iu.test(e)}function isResolvedByLaterCompletion(e){return isGapStatus(e)||isBlockerStatus(e)}function isResolvedByLaterAnyCompletion(e){return"task_inventory_blocked"===e}function isResolvedByLaterEvidenceCompletion(e){return"tool_argument_error"===e||"duplicate_tool_call"===e||"repeated_tool_call_limit"===e}function successfulEventIndexesBySource(e){const t=new Map;return e.forEach((e,n)=>{const o=function successfulEventSource(e){if("runtime.tool.direct.completed"===e.type)return e.toolId;const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n&&isSuccessfulEvidenceEvent(t)?n:void 0}(e);o&&t.set(o,[...t.get(o)??[],n])}),t}function successfulEvidenceAfter(e,t){return e.some((e,n)=>n>t&&Boolean(function successfulEvidenceEventSource(e){if("runtime.tool.direct.completed"===e.type)return e.toolId;const t=readAdapterEvent(e),n=readToolSource(t);return isToolResultEvent(t)&&n&&isSuccessfulEvidenceEvent(t)&&!isPlanningTool(n)&&stringifyEvidence(t.evidenceOutput??t.output).some(e=>isUsableEvidenceOutput(n,e))?n:void 0}(e)))}function isToolResultEvent(e){return"deepagents.tool_execution.result"===e?.eventType||"agent.tool.result"===e?.phase||"agent.tool.result"===e?.type||"deepagents.tool_execution.result"===e?.type}function completedAfter(e,t,n){return(e.get(t)??[]).some(e=>e>n)}function completedAfterAny(e,t){return[...e.values()].some(e=>e.some(e=>e>t))}export function outputUsesPriorEvidence(e,t,n){const o=e.toLowerCase();return n.filter(e=>e.source===t).some(e=>{const t=e.output.trim();return!!t&&(!!o.includes(t.slice(0,500).toLowerCase())||function matchingEvidenceTokens(e,t){const n=new Set(["status","completed","success","recorded"]);return[...new Set(t.toLowerCase().match(/[a-z0-9][a-z0-9_.-]{1,}/gu)??[])].filter(e=>!n.has(e)).filter(t=>e.includes(t)).length}(o,t)>=2)})}function unsupportedTokens(e,t,n){return[...new Set(e.match(n)??[])].filter(e=>!t.includes(e.toLowerCase()))}function isCodeLikeIdentifier(e){return!(e.length<8)&&(/(?:Service|Controller|Repository|Manager|Client|Resolver|Agent|Tool|Async)$/u.test(e)||/[a-z][A-Z]/u.test(e))}function readOutputStatus(e){if(isRecord(e)&&"string"==typeof e.status)return e.status;if("string"==typeof e){const t=parseJsonRecord(e);return"string"==typeof t?.status?t.status:e.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}}function parseJsonRecord(e){try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function readEventStatus(e){return readString(e?.controlStatus)??readString(e?.status)??readOutputStatus(e?.output)}function readToolSource(e){return readString(e?.toolId)??readString(e?.toolName)??readString(e?.name)}function readControlStatus(e){const t=function readInventoryRepairControlStatus(e){if("inventory.repair"===e?.phase&&"blocked"===e.status)return"task"===readInventoryRepairSource(e)?"task_inventory_blocked":"blocked"}(e);if(t)return t;const n=readEventStatus(e);return n&&isControlStatus(n)?n:findNestedControlStatus(e)}function readControlSource(e){return readToolSource(e)??readInventoryRepairSource(e)??findNestedToolSource(e)}function isControlStatus(e){return isGapStatus(e)||isBlockerStatus(e)}function findNestedControlStatus(e,t=0){if(t>5||null==e)return;if("string"==typeof e)return function readNestedStringStatus(e,t){const n=parseJsonRecord(e);return n?findNestedControlStatus(n,t+1):findFirstNested(jsonRecordsInText(e),e=>findNestedControlStatus(e,t+1))}(e,t);if(Array.isArray(e))return findFirstNested(e,e=>findNestedControlStatus(e,t+1));if(!isRecord(e))return;const n=readString(e.controlStatus)??readString(e.status);if(n&&isControlStatus(n))return n;const o=readOutputStatus(e.output);return o&&isControlStatus(o)?o:findFirstNested(Object.values(e),e=>findNestedControlStatus(e,t+1))}function findNestedToolSource(e,t=0){if(!(t>5||null==e)){if("string"==typeof e)return function readToolSourceFromText(e){const t=parseJsonRecord(e);return t?findNestedToolSource(t):findFirstNested(jsonRecordsInText(e),e=>findNestedToolSource(e))}(e);if(Array.isArray(e))return findFirstNested(e,e=>findNestedToolSource(e,t+1));if(isRecord(e))return(readString(e.toolId)??readString(e.toolName)??readString(e.name))||findFirstNested(Object.values(e),e=>findNestedToolSource(e,t+1))}}function findFirstNested(e,t){for(const n of e){const e=t(n);if(void 0!==e)return e}}function jsonRecordsInText(e){const t=[];for(let n=0;n<e.length;n+=1){if("{"!==e[n])continue;const o=findJsonObjectEnd(e,n);if(void 0===o)continue;const r=parseJsonRecord(e.slice(n,o+1));r&&(t.push(r),n=o)}return t}function findJsonObjectEnd(e,t){let n=0,o=!1,r=!1;for(let s=t;s<e.length;s+=1){const t=e[s];if(o)r?r=!1:"\\"===t?r=!0:'"'===t&&(o=!1);else if('"'===t)o=!0;else if("{"===t)n+=1;else if("}"===t&&(n-=1,0===n))return s}}function readInventoryRepairSource(e){const t=isRecord(e?.diagnostic)?e.diagnostic:void 0;return readString(t?.layer)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{omittedControlGaps as
|
|
1
|
+
import{omittedControlGaps as e}from"../quality/event-evidence.js";import{collectRuntimeDeliverables as t}from"./output/deliverables.js";export function completeRun(r){const s=r.store.getRun(r.requestId);if("cancelled"===s?.state)return response(r,"cancelled",s.artifacts);!function assertDeliverableOutput(t,r){if(!t.text.trim())throw new Error("runtime_empty_output: Runtime request produced no user-facing output.");!function assertNoOmittedControlGaps(t,r){const s=e(r,t.text).filter(e=>!function mentionsGap(e,t){const[r,s]=t.split(":"),n=e.toLowerCase(),o=function statusPhrases(e){if(!e)return[];const t=e.toLowerCase().replaceAll("_"," ");return"task_inventory_blocked"===e?[t,"workspace inventory","not in the workspace inventory"]:"repeated_tool_call_limit"===e?[t,"repeat limit"]:[t]}(s);return n.includes(t.toLowerCase())||Boolean(s&&n.includes(s.toLowerCase()))||o.some(e=>n.includes(e))||Boolean(r&&s&&n.includes(r.toLowerCase())&&n.includes(s.toLowerCase()))}(t.text,e));if(0!==s.length)throw new Error(`runtime_unresolved_control_gap: Runtime request produced unresolved control gap(s): ${s.slice(0,8).join(", ")}`)}(t,r)}(r.result,s?.events??[]);const n=(r.result.artifacts??[]).map(toPublicArtifact);s&&r.store.updateRun(r.requestId,{state:"completed",output:r.result.text,metadata:{...s.metadata,...r.result.metadata},artifacts:mergeArtifacts(s.artifacts,n),completedAt:(new Date).toISOString()});for(const e of r.result.artifacts??[])r.artifacts?.createArtifact({...e,requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id});for(const e of n)r.emit({type:"runtime.artifact.created",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,artifact:e});for(const e of t(s?.events??[]))r.emit({type:"runtime.deliverable.created",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,deliverable:e});return r.emit({type:"runtime.request.completed",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,output:r.result.text}),response(r,"completed",r.store.getRun(r.requestId)?.artifacts)}export function failRun(e){const t=e.error instanceof Error?e.error.message:String(e.error);return e.store.getRun(e.requestId)&&e.store.updateRun(e.requestId,{state:"failed",error:t,completedAt:(new Date).toISOString()}),e.emit({type:"runtime.request.failed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,error:t}),{requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,state:"failed",output:t}}function response(e,t,r){return{requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,state:t,output:e.result.text,metadata:e.result.metadata,artifacts:r??e.result.artifacts}}function mergeArtifacts(e,t){const r=new Map;for(const s of[...e??[],...t??[]])r.set(s.id,s);return[...r.values()]}function toPublicArtifact(e){return{id:e.id,kind:e.kind,...e.uri?{uri:e.uri}:{},...e.metadata?{metadata:e.metadata}:{}}}
|
|
@@ -40,6 +40,21 @@ export type RuntimeEventMetadata = {
|
|
|
40
40
|
eventId?: string;
|
|
41
41
|
emittedAt?: string;
|
|
42
42
|
};
|
|
43
|
+
export type RuntimeDeliverable = {
|
|
44
|
+
id: string;
|
|
45
|
+
kind: string;
|
|
46
|
+
status: "complete" | "partial" | "blocked";
|
|
47
|
+
content: string;
|
|
48
|
+
title?: string;
|
|
49
|
+
source: {
|
|
50
|
+
eventId?: string;
|
|
51
|
+
agentId?: string;
|
|
52
|
+
toolId?: string;
|
|
53
|
+
toolCallId?: string;
|
|
54
|
+
phase?: string;
|
|
55
|
+
};
|
|
56
|
+
metadata?: Record<string, unknown>;
|
|
57
|
+
};
|
|
43
58
|
export type RuntimeEvent = RuntimeEventMetadata & ({
|
|
44
59
|
type: "runtime.request.started";
|
|
45
60
|
requestId: string;
|
|
@@ -127,6 +142,12 @@ export type RuntimeEvent = RuntimeEventMetadata & ({
|
|
|
127
142
|
sessionId: string;
|
|
128
143
|
agentId: string;
|
|
129
144
|
artifact: RuntimeArtifact;
|
|
145
|
+
} | {
|
|
146
|
+
type: "runtime.deliverable.created";
|
|
147
|
+
requestId: string;
|
|
148
|
+
sessionId: string;
|
|
149
|
+
agentId: string;
|
|
150
|
+
deliverable: RuntimeDeliverable;
|
|
130
151
|
} | {
|
|
131
152
|
type: "runtime.execution.contract.failed";
|
|
132
153
|
requestId: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function collectRuntimeDeliverables(e){const r=e.map(projectDeliverable).filter(e=>Boolean(e)),t=new Map;for(const e of r)t.set(e.id,e);return[...t.values()]}function projectDeliverable(e){if("runtime.adapter.event"!==e.type)return;const r=readRecord(e.event);if(!r||"agent.tool.result"!==r.phase)return;const t=function readStructuredToolOutput(e){return parseObject(e.evidenceOutput)??parseObject(e.output)??parseObject(readRecord(e.upstream)?.evidenceOutput)??parseObject(readRecord(e.upstream)?.output)}(r);if(!t)return;const n=readString(t.report)??readString(readRecord(t.result)?.report)??firstReport(t.reports)??firstReport(readRecord(t.result)?.reports);if(!n)return;const o=readString(t.requestedArtifact)??readString(readRecord(t.result)?.requestedArtifact)??readString(t.artifactKind)??"report",a=readString(r.toolId),i=readString(r.toolCallId);return{id:stableDeliverableId(e,a,i,o),kind:o,status:"complete",content:n,source:{eventId:e.eventId,agentId:readString(r.sourceAgentId)??e.agentId,toolId:a,toolCallId:i,phase:"agent.tool.result"},metadata:{...readString(t.evidenceStatus)?{evidenceStatus:readString(t.evidenceStatus)}:{},...readString(t.scenario)?{scenario:readString(t.scenario)}:{},...readArray(t.reports)?{reportCount:readArray(t.reports)?.length}:{}}}}function parseObject(e){if(isRecord(e))return e;if("string"==typeof e&&e.trim())try{const r=JSON.parse(e);return isRecord(r)?r:void 0}catch{return}}function firstReport(e){const r=readArray(e);if(r)return r.find(e=>"string"==typeof e&&e.trim().length>0)?.trim()}function stableDeliverableId(e,r,t,n){return`deliverable:${[e.requestId,e.eventId,r,t,n].filter(Boolean).join(":")}`}function readRecord(e){return isRecord(e)?e:void 0}function readArray(e){return Array.isArray(e)?e:void 0}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function projectRuntimePolicies(e){return{systemPromptSections:[skillInventoryPolicy(e),responseLanguagePolicy(e),responsePresentationPolicy(e)].filter(e=>Boolean(e))}}export function buildRuntimeSystemPrompt(e,t){const n=[t,...projectRuntimePolicies(e).systemPromptSections].filter(e=>Boolean(e));return n.length>0?n.join("\n\n"):void 0}function skillInventoryPolicy(e){const t=(e.agent?.skills??[]).map(t=>e.workspace.skills.get(t)).filter(e=>Boolean(e));if(0!==t.length)return["## Stable Harness Skill Inventory","Use only the skills listed in this workspace inventory. Do not infer or invent skill names, skill directories, or SKILL.md paths from generic examples.","When a listed skill matches the task, use DeepAgents progressive disclosure: read that registered SKILL.md path through builtin filesystem tools before applying the detailed workflow.","If none of these skills match the task, continue with the configured tools and collected evidence instead of reading an unlisted skill path.",t.map(e=>{const t=e.allowedTools.length>0?`; allowed tools: ${e.allowedTools.join(", ")}`:"",n=e.description?`: ${e.description}${t}`:t;return`- ${e.id}${n}`}).join("\n")].join("\n")}function responseLanguagePolicy(e){const t=readRecord(e.workspace.runtime.responseLanguage);if("matchUser"!==(readString(t.mode)??readString(t.strategy)))return;const n=function detectRequestLanguage(e){return/\p{Script=Han}/u.test(e)?"Chinese":/[\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)?"Japanese":/\p{Script=Hangul}/u.test(e)?"Korean":/\p{Script=Arabic}/u.test(e)?"Arabic":/\p{Script=Hebrew}/u.test(e)?"Hebrew":/\p{Script=Thai}/u.test(e)?"Thai":/\p{Script=Cyrillic}/u.test(e)?"Cyrillic-script language":void 0}(e.request.input);return["Stable runtime response language policy:",...n?[`- Detected request language: ${n}.`]:[],"- Match the final answer language to the original user request unless the user explicitly asks for another language.","- If tool or subagent evidence is in a different language, translate the final user-facing answer into the detected request language.","- When delegating to subagents, include the same response-language requirement in delegated instructions.","- Do not call another tool or subagent only to translate, rewrite, format, or synthesize a completed answer.",`Original user request:\n${e.request.input}`].join("\n")}function responsePresentationPolicy(e){const t=readRecord(e.workspace.runtime.responsePresentation);if(!0===t.enabled&&!function hasStructuredResponseFormat(e){return void 0!==e?.config.responseFormat||isRecord(e?.config.deepagents)&&void 0!==e.config.deepagents.responseFormat}(e.agent))return"markdown"===(readString(t.style)??"markdown")?["Stable runtime final-answer presentation policy:","- For user-facing natural-language final answers, use GitHub-flavored Markdown.","- Prefer clear section headings, short paragraphs, and concise bullets over dense prose.","- Use tables only when they make comparison or planning details easier to scan.","- For detailed investigations, plans, or reports, include assumptions, findings, recommendations, and concrete next steps.","- Preserve exact plain text, JSON, code, or other structured output when the user or response format asks for it.","- Do not end with generic follow-up offers; deliver the requested answer directly."].join("\n"):void 0}function readRecord(e){return isRecord(e)?e:{}}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
1
|
+
export function projectRuntimePolicies(e){return{systemPromptSections:[skillInventoryPolicy(e),responseLanguagePolicy(e),responsePresentationPolicy(e)].filter(e=>Boolean(e))}}export function buildRuntimeSystemPrompt(e,t){const n=[t,...projectRuntimePolicies(e).systemPromptSections].filter(e=>Boolean(e));return n.length>0?n.join("\n\n"):void 0}function skillInventoryPolicy(e){const t=(e.agent?.skills??[]).map(t=>e.workspace.skills.get(t)).filter(e=>Boolean(e));if(0!==t.length)return["## Stable Harness Skill Inventory","Use only the skills listed in this workspace inventory. Do not infer or invent skill names, skill directories, or SKILL.md paths from generic examples.",isBuiltinModelExposed(e.agent,"read_file")||isBuiltinModelExposed(e.agent,"grep")?"When a listed skill matches the task, use DeepAgents progressive disclosure: read that registered SKILL.md path through exposed builtin filesystem tools before applying the detailed workflow.":"When a listed skill matches the task, apply it as registered SOP from the workspace skill inventory. Do not call filesystem tools or try to read SKILL.md unless those builtin tools are explicitly exposed to this agent.","If none of these skills match the task, continue with the configured tools and collected evidence instead of reading an unlisted skill path.",t.map(e=>{const t=e.allowedTools.length>0?`; allowed tools: ${e.allowedTools.join(", ")}`:"",n=e.description?`: ${e.description}${t}`:t;return`- ${e.id}${n}`}).join("\n")].join("\n")}function isBuiltinModelExposed(e,t){const n=readRecord(e?.config.builtinTools).modelExposed;return!!Array.isArray(n)&&n.some(e=>e===t)}function responseLanguagePolicy(e){const t=readRecord(e.workspace.runtime.responseLanguage);if("matchUser"!==(readString(t.mode)??readString(t.strategy)))return;const n=function detectRequestLanguage(e){return/\p{Script=Han}/u.test(e)?"Chinese":/[\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)?"Japanese":/\p{Script=Hangul}/u.test(e)?"Korean":/\p{Script=Arabic}/u.test(e)?"Arabic":/\p{Script=Hebrew}/u.test(e)?"Hebrew":/\p{Script=Thai}/u.test(e)?"Thai":/\p{Script=Cyrillic}/u.test(e)?"Cyrillic-script language":void 0}(e.request.input);return["Stable runtime response language policy:",...n?[`- Detected request language: ${n}.`]:[],"- Match the final answer language to the original user request unless the user explicitly asks for another language.","- If tool or subagent evidence is in a different language, translate the final user-facing answer into the detected request language.","- When delegating to subagents, include the same response-language requirement in delegated instructions.","- Do not call another tool or subagent only to translate, rewrite, format, or synthesize a completed answer.",`Original user request:\n${e.request.input}`].join("\n")}function responsePresentationPolicy(e){const t=readRecord(e.workspace.runtime.responsePresentation);if(!0===t.enabled&&!function hasStructuredResponseFormat(e){return void 0!==e?.config.responseFormat||isRecord(e?.config.deepagents)&&void 0!==e.config.deepagents.responseFormat}(e.agent))return"markdown"===(readString(t.style)??"markdown")?["Stable runtime final-answer presentation policy:","- For user-facing natural-language final answers, use GitHub-flavored Markdown.","- Prefer clear section headings, short paragraphs, and concise bullets over dense prose.","- Use tables only when they make comparison or planning details easier to scan.","- For detailed investigations, plans, or reports, include assumptions, findings, recommendations, and concrete next steps.","- Preserve exact plain text, JSON, code, or other structured output when the user or response format asks for it.","- Do not end with generic follow-up offers; deliver the requested answer directly."].join("\n"):void 0}function readRecord(e){return isRecord(e)?e:{}}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function buildFocusedTextToolEvidenceRecoveryRequest(e){return{...e.request,input:[e.request.input,"","Stable runtime recovery: the focused recovery turn produced text instead of the required structured tool call.",`Focused tool executed through the governed gateway: ${e.match.toolId}`,"Continue from the executed evidence below.","If another declared tool is needed, call it through the backend's normal structured tool-calling mechanism.","Do not repeat the same focused tool call unless new required input is materially different.","","Executed focused tool arguments:",JSON.stringify(e.match.args),"","Executed focused tool output:",e.toolOutput].join("\n"),metadata:{...e.request.metadata,stableHarnessRecovery:"tool_call"}}}export function focusedTextArgumentName(e,t){const r=e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema,o=function
|
|
1
|
+
export function buildFocusedTextToolEvidenceRecoveryRequest(e){return{...e.request,input:[e.request.input,"","Stable runtime recovery: the focused recovery turn produced text instead of the required structured tool call.",`Focused tool executed through the governed gateway: ${e.match.toolId}`,"Continue from the executed evidence below.","If another declared tool is needed, call it through the backend's normal structured tool-calling mechanism.","Do not repeat the same focused tool call unless new required input is materially different.","","Executed focused tool arguments:",JSON.stringify(e.match.args),"","Executed focused tool output:",e.toolOutput].join("\n"),metadata:{...e.request.metadata,stableHarnessRecovery:"tool_call"}}}export function focusedTextArgumentName(e,t){const r=e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema,o=function readZodObjectShape(e){const t=isRecord(e)?e.def:void 0,r=isRecord(t)?t.shape:void 0;return isRecord(r)?r:void 0}(r);if(o){const e=Object.entries(o);if(1!==e.length)return;const t=e.filter(([,e])=>"string"===readSchemaType(e));return 1===t.length?t[0][0]:void 0}const n=isRecord(r)?r:{},c=function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}(n.required),i=isRecord(n.properties)?n.properties:{},s=Object.entries(i);if(1!==s.length)return;const d=s.filter(([e,t])=>(0===c.length||c.includes(e))&&"string"===readSchemaType(t)).map(([e])=>e);return 1===d.length?d[0]:void 0}function readSchemaType(e){const t=isRecord(e)?e:{},r=isRecord(t.def)?t.def:void 0;return"string"==typeof t.type?t.type:"string"==typeof r?.type?r.type:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RuntimeEvent } from "./types.js";
|
|
2
|
+
export type RuntimeTraceSpanKind = "run" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "deliverable" | "progress" | "plan" | "delegation" | "approval" | "quality";
|
|
3
|
+
export type RuntimeTraceSpanStatus = "running" | "completed" | "failed" | "blocked" | "event";
|
|
4
|
+
export type RuntimeTraceSpanEventRef = {
|
|
5
|
+
index: number;
|
|
6
|
+
eventId: string;
|
|
7
|
+
type: RuntimeEvent["type"];
|
|
8
|
+
emittedAt?: string;
|
|
9
|
+
};
|
|
10
|
+
export type RuntimeTraceSpan = {
|
|
11
|
+
spanId: string;
|
|
12
|
+
parentSpanId?: string;
|
|
13
|
+
requestId: string;
|
|
14
|
+
sessionId: string;
|
|
15
|
+
agentId: string;
|
|
16
|
+
kind: RuntimeTraceSpanKind;
|
|
17
|
+
name: string;
|
|
18
|
+
status: RuntimeTraceSpanStatus;
|
|
19
|
+
startedAt?: string;
|
|
20
|
+
completedAt?: string;
|
|
21
|
+
startEventIndex: number;
|
|
22
|
+
endEventIndex?: number;
|
|
23
|
+
durationMs?: number;
|
|
24
|
+
attributes?: Record<string, unknown>;
|
|
25
|
+
events: RuntimeTraceSpanEventRef[];
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { RuntimeEvent, RuntimeRunRecord } from "./types.js";
|
|
2
|
+
import type { RuntimeTraceSpan } from "./trace-types.js";
|
|
3
|
+
export type { RuntimeTraceSpan, RuntimeTraceSpanEventRef, RuntimeTraceSpanKind, RuntimeTraceSpanStatus } from "./trace-types.js";
|
|
2
4
|
export type PlanTodoItem = {
|
|
3
5
|
content: string;
|
|
4
6
|
status: string;
|
|
5
7
|
};
|
|
6
8
|
export type RuntimeTraceEntry = {
|
|
7
|
-
type: "request" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation" | "quality";
|
|
9
|
+
type: "request" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "deliverable" | "progress" | "plan" | "delegation" | "quality";
|
|
8
10
|
label: string;
|
|
9
11
|
agentId: string;
|
|
10
12
|
requestId: string;
|
|
@@ -14,31 +16,6 @@ export type RuntimeAdapterTraceProjection = {
|
|
|
14
16
|
traceType: RuntimeTraceEntry["type"];
|
|
15
17
|
traceLabel: string;
|
|
16
18
|
} & Record<string, unknown>;
|
|
17
|
-
export type RuntimeTraceSpanKind = "run" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation" | "approval" | "quality";
|
|
18
|
-
export type RuntimeTraceSpanStatus = "running" | "completed" | "failed" | "blocked" | "event";
|
|
19
|
-
export type RuntimeTraceSpanEventRef = {
|
|
20
|
-
index: number;
|
|
21
|
-
eventId: string;
|
|
22
|
-
type: RuntimeEvent["type"];
|
|
23
|
-
emittedAt?: string;
|
|
24
|
-
};
|
|
25
|
-
export type RuntimeTraceSpan = {
|
|
26
|
-
spanId: string;
|
|
27
|
-
parentSpanId?: string;
|
|
28
|
-
requestId: string;
|
|
29
|
-
sessionId: string;
|
|
30
|
-
agentId: string;
|
|
31
|
-
kind: RuntimeTraceSpanKind;
|
|
32
|
-
name: string;
|
|
33
|
-
status: RuntimeTraceSpanStatus;
|
|
34
|
-
startedAt?: string;
|
|
35
|
-
completedAt?: string;
|
|
36
|
-
startEventIndex: number;
|
|
37
|
-
endEventIndex?: number;
|
|
38
|
-
durationMs?: number;
|
|
39
|
-
attributes?: Record<string, unknown>;
|
|
40
|
-
events: RuntimeTraceSpanEventRef[];
|
|
41
|
-
};
|
|
42
19
|
export declare function createDelegationTraceProjection(label: "delegation.start" | "delegation.completed", detail?: Record<string, unknown>): RuntimeAdapterTraceProjection;
|
|
43
20
|
export declare function createPlanTraceProjection(label: "plan.updated", detail?: Record<string, unknown>): RuntimeAdapterTraceProjection;
|
|
44
21
|
export declare function projectRuntimeTrace(run: RuntimeRunRecord): RuntimeTraceEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function createDelegationTraceProjection(t,e={}){return{traceType:"delegation",traceLabel:t,...e}}export function createPlanTraceProjection(t,e={}){return{traceType:"plan",traceLabel:t,...e}}export function projectRuntimeTrace(t){return t.events.map(projectEvent).filter(isTraceEntry)}export function projectRuntimeTraceSpans(t){const e=function createSpanBuilder(t){const e=`run:${t.requestId}`,r=[],n=new Map;return{ensureRoot(){if(n.has(e))return;const o={spanId:e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,kind:"run",name:t.agentId,status:(a=t.state,"completed"===a?"completed":"failed"===a?"failed":"cancelled"===a?"blocked":"running"),startedAt:t.startedAt,completedAt:t.completedAt,startEventIndex:0,...t.parentRunId?{parentSpanId:`run:${t.parentRunId}`}:{},events:[]};var a;r.push(o),n.set(e,o)},markRoot(t,r,o,a){const i=n.get(e);i&&(addEvent(i,t,r),i.status=o,i.attributes=merge(i.attributes,a),"running"!==o&&close(i,t,r))},start(t,o,a,i,s,p){const d=createSpan(`${e}/${t}:${s}`,e,o,a,i,s,p);r.push(d),n.set(t,d)},complete(t,o,a,i){const s=n.get(t)??createSpan(`${e}/${t}:${a}`,e,"adapter",t,o,a);return n.has(t)||r.push(s),addEvent(s,o,a),s.attributes=merge(s.attributes,i),close(s,o,a),n.delete(t),s},fail(t,e,r,n){this.complete(t,e,r,n).status="failed"},event(t,n,o,a,i){const s=createSpan(`${e}/event:${a}`,e,t,n,o,a,i);s.status=function readBlockedStatus(t){return t.type.endsWith(".blocked")||t.type.includes(".approval.")?"blocked":void 0}(o)??"event",close(s,o,a),r.push(s)},closeRoot(){const r=n.get(e);r&&t.completedAt&&(r.completedAt=t.completedAt)},spans:()=>r}}(t);return e.ensureRoot(),t.events.forEach((t,r)=>function projectSpanEvent(t,e,r){return e.type.startsWith("runtime.request.")?function projectRequestSpanEvent(t,e,r){return"runtime.request.started"===e.type?t.markRoot(e,r,"running",{input:e.input}):"runtime.request.completed"===e.type?t.markRoot(e,r,"completed",{output:e.output}):"runtime.request.failed"===e.type?t.markRoot(e,r,"failed",{error:e.error}):"runtime.request.cancelled"===e.type?t.markRoot(e,r,"blocked",{reason:e.reason}):"runtime.execution.contract.failed"===e.type?projectSingleSpan(t,e,r,"quality",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):void 0}(t,e,r):"runtime.tool.direct.started"===e.type?t.start(`tool:${e.toolId}`,"tool",e.toolId,e,r,{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?t.complete(`tool:${e.toolId}`,e,r,{toolId:e.toolId,output:e.output}):"runtime.workflow.started"===e.type?t.start(`workflow:${e.workflowId}`,"workflow",e.workflowId,e,r,{workflowId:e.workflowId,adapter:e.adapter}):"runtime.workflow.completed"===e.type?t.complete(`workflow:${e.workflowId}`,e,r,{workflowId:e.workflowId,adapter:e.adapter}):e.type.startsWith("runtime.approval.")||e.type.startsWith("runtime.memory.approval.")?projectSingleSpan(t,e,r,"approval",e.type):e.type.startsWith("runtime.specDriven.phase.")?projectSingleSpan(t,e,r,"spec",function readPhaseName(t,e){return"phaseId"in t&&"string"==typeof t.phaseId?t.phaseId:e}(e,"phase")):e.type.startsWith("runtime.memory.")?projectSingleSpan(t,e,r,"memory",e.type):e.type.startsWith("runtime.quality.")?projectSingleSpan(t,e,r,"quality",e.type):"runtime.failure.classified"===e.type?projectSingleSpan(t,e,r,"quality",e.type,e.classification):e.type.startsWith("runtime.improvement.")||e.type.startsWith("runtime.verification.")?projectSingleSpan(t,e,r,"quality",e.type):e.type.startsWith("runtime.context.")?projectSingleSpan(t,e,r,"artifact",e.type):e.type.startsWith("runtime.repair.")?projectSingleSpan(t,e,r,"adapter",e.type):"runtime.artifact.created"===e.type?projectSingleSpan(t,e,r,"artifact",e.artifact.id,{artifact:e.artifact}):"runtime.progress.narration"===e.type?projectSingleSpan(t,e,r,"progress",e.message,{provider:e.provider}):"runtime.adapter.event"===e.type?function projectAdapterSpanEvent(t,e,r){const n=isRecord(e.event)?e.event:void 0,o=readString(n?.phase)??"runtime.adapter.event",a=readTraceType(n?.traceType),i=readString(n?.traceLabel);return"delegation"===a&&i?.endsWith(".start")?t.start(delegationKey(n),"delegation",readString(n?.subagentType)??i,e,r,n):"delegation"===a&&i?.endsWith(".completed")?t.complete(delegationKey(n),e,r,n):"plan"===a&&i?projectSingleSpan(t,e,r,"plan",i,n):function isToolStartEvent(t){return"deepagents.tool_execution.start"===t?.eventType||"agent.tool.start"===t?.phase}(n)?t.start(`agent-tool:${readString(n?.toolId)??"unknown"}`,"tool",readString(n?.toolId)??o,e,r,n):function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase}(n)?t.complete(`agent-tool:${readString(n?.toolId)??"unknown"}`,e,r,n):projectSingleSpan(t,e,r,"adapter",o,n)}(t,e,r):"runtime.inventory.repair"===e.type?projectSingleSpan(t,e,r,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.sandbox.decision"===e.type?projectSingleSpan(t,e,r,"tool",`sandbox:${e.toolId}`,{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?t.fail(`tool:${e.toolId}`,e,r,{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?projectSingleSpan(t,e,r,"tool",`circuit:${e.toolId}`,{toolId:e.toolId,reason:e.reason}):void 0}(e,t,r)),e.closeRoot(),e.spans()}export function projectEvent(t){return"runtime.request.started"===t.type||"runtime.request.completed"===t.type||"runtime.request.failed"===t.type?base(t,"request",t.type):"runtime.request.cancelled"===t.type?base(t,"request",t.type,{reason:t.reason}):"runtime.failure.classified"===t.type?base(t,"quality",t.type,t.classification):"runtime.execution.contract.failed"===t.type?base(t,"request",t.type,{reason:t.reason,missingEvidenceTools:t.missingEvidenceTools}):"runtime.inventory.repair"===t.type?base(t,"adapter","runtime.inventory.repair",{status:t.status,...t.diagnostic}):"runtime.repair.started"===t.type||"runtime.repair.completed"===t.type?base(t,"adapter",t.type,{layer:t.layer,..."outcome"in t?{outcome:t.outcome}:{},..."attempt"in t?{attempt:t.attempt}:{},..."reason"in t?{reason:t.reason}:{},...t.diagnostics?{diagnostics:t.diagnostics}:{}}):"runtime.tool.direct.started"===t.type?base(t,"tool","runtime.tool.direct.started",{toolId:t.toolId}):"runtime.tool.direct.completed"===t.type?base(t,"tool","runtime.tool.direct.completed",{toolId:t.toolId,...outputTraceDetail(t.output)}):"runtime.sandbox.decision"===t.type?base(t,"tool","runtime.sandbox.decision",{toolId:t.toolId,...t.decision}):"runtime.tool.failure"===t.type?base(t,"tool","runtime.tool.failure",{toolId:t.toolId,...t.failure}):"runtime.tool.circuit.opened"===t.type?base(t,"tool","runtime.tool.circuit.opened",{toolId:t.toolId,reason:t.reason}):"runtime.workflow.started"===t.type||"runtime.workflow.completed"===t.type?base(t,"workflow",t.type,{workflowId:t.workflowId,adapter:t.adapter}):function isSpecDrivenPhaseEvent(t){return t.type.startsWith("runtime.specDriven.phase.")}(t)?base(t,"spec",t.type,{phaseId:t.phaseId,..."workflowId"in t&&t.workflowId?{workflowId:t.workflowId}:{},..."reason"in t?{reason:t.reason}:{},..."artifact"in t&&t.artifact?{artifact:t.artifact}:{}}):"runtime.adapter.event"===t.type?function adapterTrace(t){const e=t.event;if(isRecord(e)&&"string"==typeof e.phase){const r=function semanticAdapterTrace(t,e){if("inventory.repair"===e.phase)return base(t,"adapter","runtime.inventory.repair",{status:e.status,...isRecord(e.diagnostic)?e.diagnostic:{}});const r=readTraceType(e.traceType),n=readString(e.traceLabel);return r&&n?base(t,r,n,e):void 0}(t,e);return r||base(t,"adapter",e.phase.startsWith("agent.")?e.phase:`adapter.${e.phase}`,e)}return base(t,"adapter","runtime.adapter.event",{event:e})}(t):"runtime.artifact.created"===t.type?base(t,"artifact","runtime.artifact.created",{artifact:t.artifact}):t.type.startsWith("runtime.memory.")?base(t,"memory",t.type):t.type.startsWith("runtime.improvement.")||t.type.startsWith("runtime.verification.")?base(t,"quality",t.type):t.type.startsWith("runtime.context.")?base(t,"artifact",t.type):"runtime.progress.narration"===t.type?base(t,"progress",t.type,{message:t.message,provider:t.provider,sourceEventTypes:t.sourceEventTypes}):void 0}export function readPlanTodos(t){const e=function readPlanRecord(t){if(isRecord(t))return t;if("string"==typeof t)try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}(t),r=function readTodosArray(t){const e=isRecord(t?.args)?t.args:void 0;return Array.isArray(t?.todos)?t.todos:Array.isArray(e?.todos)?e.todos:[]}(e);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(t){if(isRecord(t)&&"string"==typeof t.content)return{content:t.content,status:"string"==typeof t.status?t.status:"pending"}}function isPlanTodoItem(t){return void 0!==t}function base(t,e,r,n){return{type:e,label:r,agentId:t.agentId,requestId:t.requestId,detail:n}}function isTraceEntry(t){return void 0!==t}function outputTraceDetail(t){const e="string"==typeof t?t:function serializeOutput(t){try{return void 0===t?"":JSON.stringify(t)}catch{return String(t)}}(t),r=e.slice(0,1200);return{outputType:Array.isArray(t)?"array":null===t?"null":typeof t,outputLength:e.length,outputPreview:r,...e.length>r.length?{outputTail:e.slice(-1200)}:{}}}function projectSingleSpan(t,e,r,n,o,a){return t.event(n,o,e,r,a)}function delegationKey(t){return`delegation:${readString(t?.subagentType)??readString(t?.toolId)??"task"}`}function createSpan(t,e,r,n,o,a,i){const s={spanId:t,parentSpanId:e,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agentId,kind:r,name:n,status:"running",startedAt:o.emittedAt,startEventIndex:a,attributes:i,events:[]};return addEvent(s,o,a),s}function addEvent(t,e,r){t.events.push({index:r,eventId:e.eventId??`${e.requestId}:${r}`,type:e.type,emittedAt:e.emittedAt})}function close(t,e,r){t.status="failed"===t.status||"blocked"===t.status?t.status:"completed",t.completedAt=e.emittedAt,t.endEventIndex=r,t.durationMs=function durationMs(t,e){if(!t||!e)return;const r=Date.parse(e)-Date.parse(t);return Number.isFinite(r)&&r>=0?r:void 0}(t.startedAt,t.completedAt)}function merge(t,e){return e?{...t,...e}:t}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readTraceType(t){const e=readString(t);return"request"===e||"tool"===e||"workflow"===e||"spec"===e||"adapter"===e||"memory"===e||"artifact"===e||"progress"===e||"plan"===e||"delegation"===e?e:void 0}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
|
|
1
|
+
export function createDelegationTraceProjection(e,t={}){return{traceType:"delegation",traceLabel:e,...t}}export function createPlanTraceProjection(e,t={}){return{traceType:"plan",traceLabel:e,...t}}export function projectRuntimeTrace(e){return e.events.map(projectEvent).filter(isTraceEntry)}export function projectRuntimeTraceSpans(e){const t=function createSpanBuilder(e){const t=`run:${e.requestId}`,r=[],n=new Map;return{ensureRoot(){if(n.has(t))return;const o={spanId:t,requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,kind:"run",name:e.agentId,status:(a=e.state,"completed"===a?"completed":"failed"===a?"failed":"cancelled"===a?"blocked":"running"),startedAt:e.startedAt,completedAt:e.completedAt,startEventIndex:0,...e.parentRunId?{parentSpanId:`run:${e.parentRunId}`}:{},events:[]};var a;r.push(o),n.set(t,o)},markRoot(e,r,o,a){const i=n.get(t);i&&(addEvent(i,e,r),i.status=o,i.attributes=merge(i.attributes,a),"running"!==o&&close(i,e,r))},start(e,o,a,i,s,d){const p=createSpan(`${t}/${e}:${s}`,t,o,a,i,s,d);r.push(p),n.set(e,p)},complete(e,o,a,i){const s=n.get(e)??createSpan(`${t}/${e}:${a}`,t,"adapter",e,o,a);return n.has(e)||r.push(s),addEvent(s,o,a),s.attributes=merge(s.attributes,i),close(s,o,a),n.delete(e),s},fail(e,t,r,n){this.complete(e,t,r,n).status="failed"},event(e,n,o,a,i){const s=createSpan(`${t}/event:${a}`,t,e,n,o,a,i);s.status=function readBlockedStatus(e){return e.type.endsWith(".blocked")||e.type.includes(".approval.")?"blocked":void 0}(o)??"event",close(s,o,a),r.push(s)},closeRoot(){const r=n.get(t);r&&e.completedAt&&(r.completedAt=e.completedAt)},spans:()=>r}}(e);return t.ensureRoot(),e.events.forEach((e,r)=>function projectSpanEvent(e,t,r){return t.type.startsWith("runtime.request.")?function projectRequestSpanEvent(e,t,r){return"runtime.request.started"===t.type?e.markRoot(t,r,"running",{input:t.input}):"runtime.request.completed"===t.type?e.markRoot(t,r,"completed",{output:t.output}):"runtime.request.failed"===t.type?e.markRoot(t,r,"failed",{error:t.error}):"runtime.request.cancelled"===t.type?e.markRoot(t,r,"blocked",{reason:t.reason}):"runtime.execution.contract.failed"===t.type?projectSingleSpan(e,t,r,"quality",t.type,{reason:t.reason,missingEvidenceTools:t.missingEvidenceTools}):void 0}(e,t,r):"runtime.tool.direct.started"===t.type?e.start(`tool:${t.toolId}`,"tool",t.toolId,t,r,{toolId:t.toolId}):"runtime.tool.direct.completed"===t.type?e.complete(`tool:${t.toolId}`,t,r,{toolId:t.toolId,output:t.output}):"runtime.workflow.started"===t.type?e.start(`workflow:${t.workflowId}`,"workflow",t.workflowId,t,r,{workflowId:t.workflowId,adapter:t.adapter}):"runtime.workflow.completed"===t.type?e.complete(`workflow:${t.workflowId}`,t,r,{workflowId:t.workflowId,adapter:t.adapter}):t.type.startsWith("runtime.approval.")||t.type.startsWith("runtime.memory.approval.")?projectSingleSpan(e,t,r,"approval",t.type):t.type.startsWith("runtime.specDriven.phase.")?projectSingleSpan(e,t,r,"spec",function readPhaseName(e,t){return"phaseId"in e&&"string"==typeof e.phaseId?e.phaseId:t}(t,"phase")):t.type.startsWith("runtime.memory.")?projectSingleSpan(e,t,r,"memory",t.type):t.type.startsWith("runtime.quality.")?projectSingleSpan(e,t,r,"quality",t.type):"runtime.failure.classified"===t.type?projectSingleSpan(e,t,r,"quality",t.type,t.classification):t.type.startsWith("runtime.improvement.")||t.type.startsWith("runtime.verification.")?projectSingleSpan(e,t,r,"quality",t.type):t.type.startsWith("runtime.context.")?projectSingleSpan(e,t,r,"artifact",t.type):t.type.startsWith("runtime.repair.")?projectSingleSpan(e,t,r,"adapter",t.type):"runtime.artifact.created"===t.type?projectSingleSpan(e,t,r,"artifact",t.artifact.id,{artifact:t.artifact}):"runtime.deliverable.created"===t.type?projectSingleSpan(e,t,r,"deliverable",t.deliverable.id,{deliverable:t.deliverable,kind:t.deliverable.kind,status:t.deliverable.status,source:t.deliverable.source}):"runtime.progress.narration"===t.type?projectSingleSpan(e,t,r,"progress",t.message,{provider:t.provider}):"runtime.adapter.event"===t.type?function projectAdapterSpanEvent(e,t,r){const n=isRecord(t.event)?t.event:void 0,o=readString(n?.phase)??"runtime.adapter.event",a=readTraceType(n?.traceType),i=readString(n?.traceLabel);return"delegation"===a&&i?.endsWith(".start")?e.start(delegationKey(n),"delegation",readString(n?.subagentType)??i,t,r,n):"delegation"===a&&i?.endsWith(".completed")?e.complete(delegationKey(n),t,r,n):"plan"===a&&i?projectSingleSpan(e,t,r,"plan",i,n):function isToolStartEvent(e){return"deepagents.tool_execution.start"===e?.eventType||"agent.tool.start"===e?.phase}(n)?e.start(`agent-tool:${readString(n?.toolId)??"unknown"}`,"tool",readString(n?.toolId)??o,t,r,n):function isToolResultEvent(e){return"deepagents.tool_execution.result"===e?.eventType||"agent.tool.result"===e?.phase}(n)?e.complete(`agent-tool:${readString(n?.toolId)??"unknown"}`,t,r,n):projectSingleSpan(e,t,r,"adapter",o,n)}(e,t,r):"runtime.inventory.repair"===t.type?projectSingleSpan(e,t,r,"adapter","runtime.inventory.repair",{status:t.status,...t.diagnostic}):"runtime.sandbox.decision"===t.type?projectSingleSpan(e,t,r,"tool",`sandbox:${t.toolId}`,{toolId:t.toolId,...t.decision}):"runtime.tool.failure"===t.type?e.fail(`tool:${t.toolId}`,t,r,{toolId:t.toolId,...t.failure}):"runtime.tool.circuit.opened"===t.type?projectSingleSpan(e,t,r,"tool",`circuit:${t.toolId}`,{toolId:t.toolId,reason:t.reason}):void 0}(t,e,r)),t.closeRoot(),t.spans()}export function projectEvent(e){return"runtime.request.started"===e.type||"runtime.request.completed"===e.type||"runtime.request.failed"===e.type?base(e,"request",e.type):"runtime.request.cancelled"===e.type?base(e,"request",e.type,{reason:e.reason}):"runtime.failure.classified"===e.type?base(e,"quality",e.type,e.classification):"runtime.execution.contract.failed"===e.type?base(e,"request",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):"runtime.inventory.repair"===e.type?base(e,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.repair.started"===e.type||"runtime.repair.completed"===e.type?base(e,"adapter",e.type,{layer:e.layer,..."outcome"in e?{outcome:e.outcome}:{},..."attempt"in e?{attempt:e.attempt}:{},..."reason"in e?{reason:e.reason}:{},...e.diagnostics?{diagnostics:e.diagnostics}:{}}):"runtime.tool.direct.started"===e.type?base(e,"tool","runtime.tool.direct.started",{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?base(e,"tool","runtime.tool.direct.completed",{toolId:e.toolId,...outputTraceDetail(e.output)}):"runtime.sandbox.decision"===e.type?base(e,"tool","runtime.sandbox.decision",{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?base(e,"tool","runtime.tool.failure",{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?base(e,"tool","runtime.tool.circuit.opened",{toolId:e.toolId,reason:e.reason}):"runtime.workflow.started"===e.type||"runtime.workflow.completed"===e.type?base(e,"workflow",e.type,{workflowId:e.workflowId,adapter:e.adapter}):function isSpecDrivenPhaseEvent(e){return e.type.startsWith("runtime.specDriven.phase.")}(e)?base(e,"spec",e.type,{phaseId:e.phaseId,..."workflowId"in e&&e.workflowId?{workflowId:e.workflowId}:{},..."reason"in e?{reason:e.reason}:{},..."artifact"in e&&e.artifact?{artifact:e.artifact}:{}}):"runtime.adapter.event"===e.type?function adapterTrace(e){const t=e.event;if(isRecord(t)&&"string"==typeof t.phase){const r=function semanticAdapterTrace(e,t){if("inventory.repair"===t.phase)return base(e,"adapter","runtime.inventory.repair",{status:t.status,...isRecord(t.diagnostic)?t.diagnostic:{}});const r=readTraceType(t.traceType),n=readString(t.traceLabel);return r&&n?base(e,r,n,t):void 0}(e,t);return r||base(e,"adapter",t.phase.startsWith("agent.")?t.phase:`adapter.${t.phase}`,t)}return base(e,"adapter","runtime.adapter.event",{event:t})}(e):"runtime.artifact.created"===e.type?base(e,"artifact","runtime.artifact.created",{artifact:e.artifact}):"runtime.deliverable.created"===e.type?base(e,"deliverable","runtime.deliverable.created",{deliverable:e.deliverable,kind:e.deliverable.kind,status:e.deliverable.status,source:e.deliverable.source}):e.type.startsWith("runtime.memory.")?base(e,"memory",e.type):e.type.startsWith("runtime.improvement.")||e.type.startsWith("runtime.verification.")?base(e,"quality",e.type):e.type.startsWith("runtime.context.")?base(e,"artifact",e.type):"runtime.progress.narration"===e.type?base(e,"progress",e.type,{message:e.message,provider:e.provider,sourceEventTypes:e.sourceEventTypes}):void 0}export function readPlanTodos(e){const t=function readPlanRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e),r=function readTodosArray(e){const t=isRecord(e?.args)?e.args:void 0;return Array.isArray(e?.todos)?e.todos:Array.isArray(t?.todos)?t.todos:[]}(t);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(e){if(isRecord(e)&&"string"==typeof e.content)return{content:e.content,status:"string"==typeof e.status?e.status:"pending"}}function isPlanTodoItem(e){return void 0!==e}function base(e,t,r,n){return{type:t,label:r,agentId:e.agentId,requestId:e.requestId,detail:n}}function isTraceEntry(e){return void 0!==e}function outputTraceDetail(e){const t="string"==typeof e?e:function serializeOutput(e){try{return void 0===e?"":JSON.stringify(e)}catch{return String(e)}}(e),r=t.slice(0,1200);return{outputType:Array.isArray(e)?"array":null===e?"null":typeof e,outputLength:t.length,outputPreview:r,...t.length>r.length?{outputTail:t.slice(-1200)}:{}}}function projectSingleSpan(e,t,r,n,o,a){return e.event(n,o,t,r,a)}function delegationKey(e){return`delegation:${readString(e?.subagentType)??readString(e?.toolId)??"task"}`}function createSpan(e,t,r,n,o,a,i){const s={spanId:e,parentSpanId:t,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agentId,kind:r,name:n,status:"running",startedAt:o.emittedAt,startEventIndex:a,attributes:i,events:[]};return addEvent(s,o,a),s}function addEvent(e,t,r){e.events.push({index:r,eventId:t.eventId??`${t.requestId}:${r}`,type:t.type,emittedAt:t.emittedAt})}function close(e,t,r){e.status="failed"===e.status||"blocked"===e.status?e.status:"completed",e.completedAt=t.emittedAt,e.endEventIndex=r,e.durationMs=function durationMs(e,t){if(!e||!t)return;const r=Date.parse(t)-Date.parse(e);return Number.isFinite(r)&&r>=0?r:void 0}(e.startedAt,e.completedAt)}function merge(e,t){return t?{...e,...t}:e}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readTraceType(e){const t=readString(e);return"request"===t||"tool"===t||"workflow"===t||"spec"===t||"adapter"===t||"memory"===t||"artifact"===t||"deliverable"===t||"progress"===t||"plan"===t||"delegation"===t?t:void 0}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}
|