stable-harness 0.0.140 → 0.0.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -17
- package/dist/index.js +1 -1
- package/dist/runtime/skills/skill-metadata.js +1 -1
- package/dist/workspace/compile.js +1 -1
- package/docs/0.1.0-tool-guard-benchmark.zh.md +5 -5
- package/docs/architecture/system-architecture.zh.md +3 -3
- package/docs/evaluation/0.1.0-bfcl-targeted-model-matrix.zh.md +306 -306
- package/docs/evaluation/0.1.0-bfcl-targeted-review-matrix.zh.md +1 -1
- package/docs/evaluation/0.1.0-bfcl-tool-guard.zh.md +1 -1
- package/docs/granite-tool-calling-comparison.zh.md +8 -8
- package/docs/guides/getting-started.md +14 -6
- package/docs/guides/index.md +5 -3
- package/docs/guides/integration-guide.md +44 -43
- package/docs/guides/operator-runbook.md +51 -3
- package/docs/guides/runtime-governance-proof.md +4 -4
- package/docs/guides/workspace-authoring.md +2 -2
- package/docs/guides/workspace-docker-build.md +3 -3
- package/docs/memory/0.1.0-memory-design.zh.md +20 -0
- package/docs/memory/0.1.0-step-09-deepagents-native-memory.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-langmem-shaped-provider.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-memory-adapter-projection.zh.md +3 -3
- package/docs/memory/0.1.0-step-09-memory-contract.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-memory-governance-approval.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-memory-lifecycle-hooks.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-memory-maintenance-boundary.zh.md +1 -1
- package/docs/memory/0.1.0-step-09-memory-persistence-boundary.zh.md +1 -1
- package/docs/protocols/coverage-matrix.md +114 -0
- package/docs/protocols/http-runtime.md +31 -8
- package/docs/protocols/langgraph-compatible.md +75 -17
- package/docs/protocols/openai-compatible.md +25 -7
- package/docs/protocols/{agent-protocols.md → protocol-facades.md} +76 -18
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.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-call-repair.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/substrate/checkpoint.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/vfs-backend.js +1 -1
- package/node_modules/@stable-harness/adapter-deepagents/package.json +2 -2
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.js +1 -1
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.js +1 -1
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.js +1 -1
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.js +1 -1
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.d.ts +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/package.json +2 -2
- package/node_modules/@stable-harness/core/dist/boundary-scan.js +1 -1
- package/node_modules/@stable-harness/core/dist/index.d.ts +1 -0
- package/node_modules/@stable-harness/core/dist/index.js +1 -1
- package/node_modules/@stable-harness/core/dist/memory-plugins/shared.js +1 -1
- package/node_modules/@stable-harness/core/dist/memory-plugins.js +1 -1
- package/node_modules/@stable-harness/core/dist/quality/event-evidence.js +1 -1
- package/node_modules/@stable-harness/core/dist/quality/execution-review.js +1 -1
- package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.js +1 -1
- package/node_modules/@stable-harness/core/dist/recovery/execution-contract.js +1 -1
- package/node_modules/@stable-harness/core/dist/recovery/tool-call-structure.js +1 -1
- package/node_modules/@stable-harness/core/dist/recovery/tool-call.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.d.ts +4 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.d.ts +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.d.ts +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/persistence/system-data.d.ts +34 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/system-data.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/recovery/adapter-result.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/recovery/non-focused-recovery.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime.js +1 -1
- package/node_modules/@stable-harness/core/dist/workflows/index.d.ts +20 -0
- package/node_modules/@stable-harness/core/dist/workflows/index.js +1 -1
- package/node_modules/@stable-harness/core/package.json +3 -3
- package/node_modules/@stable-harness/governance/dist/src/approval-queue.d.ts +1 -0
- package/node_modules/@stable-harness/governance/dist/src/approval-queue.js +1 -1
- package/node_modules/@stable-harness/governance/dist/src/index.d.ts +1 -1
- package/node_modules/@stable-harness/governance/dist/src/index.js +1 -1
- 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/dist/src/http-events.d.ts +2 -0
- package/node_modules/@stable-harness/protocols/dist/src/http-events.js +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/http-server.d.ts +5 -1
- package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/index.d.ts +3 -3
- package/node_modules/@stable-harness/protocols/dist/src/index.js +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.js +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/openai-payload.d.ts +89 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-payload.js +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/{agent-protocols.d.ts → protocol-facades.d.ts} +4 -10
- package/node_modules/@stable-harness/protocols/dist/src/protocol-facades.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/protocol-utils.d.ts +505 -0
- package/node_modules/@stable-harness/protocols/dist/src/protocol-utils.js +1 -0
- package/node_modules/@stable-harness/protocols/package.json +2 -2
- package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.js +1 -1
- package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.js +1 -1
- package/node_modules/@stable-harness/tool-gateway/package.json +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/discovery.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/documents.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/loader.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/dist/workflows.js +1 -1
- package/node_modules/@stable-harness/workspace-yaml/package.json +2 -2
- package/package.json +12 -11
- package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin-call-repair.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/stream-events.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/substrate/checkpoint.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/vfs-backend.js +1 -1
- package/packages/adapter-deepagents/package.json +2 -2
- package/packages/adapter-langgraph/dist/src/graph.js +1 -1
- package/packages/adapter-langgraph/dist/src/index.js +1 -1
- package/packages/adapter-langgraph/dist/src/runtime.js +1 -1
- package/packages/adapter-langgraph/dist/src/skill-providers.js +1 -1
- package/packages/adapter-langgraph/dist/src/types.d.ts +1 -0
- package/packages/adapter-langgraph/package.json +2 -2
- package/packages/cli/dist/src/args.d.ts +3 -2
- package/packages/cli/dist/src/args.js +1 -1
- package/packages/cli/dist/src/build.js +1 -1
- package/packages/cli/dist/src/cli.js +1 -1
- package/packages/cli/dist/src/console/session.js +1 -1
- package/packages/cli/dist/src/daemon/client.d.ts +4 -3
- package/packages/cli/dist/src/daemon/client.js +1 -1
- package/packages/cli/dist/src/init.js +1 -1
- package/packages/cli/dist/src/langgraph/agent-server-compat.d.ts +8 -0
- package/packages/cli/dist/src/langgraph/agent-server-compat.js +1 -0
- package/packages/cli/dist/src/langgraph/store-projection.d.ts +1 -0
- package/packages/cli/dist/src/langgraph/store-projection.js +1 -0
- package/packages/cli/dist/src/langgraph-official.js +1 -1
- package/packages/cli/dist/src/memory/providers.js +1 -1
- package/packages/cli/dist/src/server/gateway.d.ts +12 -0
- package/packages/cli/dist/src/server/gateway.js +1 -0
- package/packages/cli/dist/src/server/protocol-defaults.d.ts +7 -0
- package/packages/cli/dist/src/server/protocol-defaults.js +1 -0
- package/packages/cli/dist/src/server/studio.d.ts +1 -0
- package/packages/cli/dist/src/server/studio.js +1 -0
- package/packages/cli/dist/src/server.js +1 -1
- package/packages/cli/package.json +8 -8
- package/packages/core/dist/boundary-scan.js +1 -1
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/memory-plugins/shared.js +1 -1
- package/packages/core/dist/memory-plugins.js +1 -1
- package/packages/core/dist/quality/event-evidence.js +1 -1
- package/packages/core/dist/quality/execution-review.js +1 -1
- package/packages/core/dist/quality/synthesis/fields.js +1 -1
- package/packages/core/dist/recovery/execution-contract.js +1 -1
- package/packages/core/dist/recovery/tool-call-structure.js +1 -1
- package/packages/core/dist/recovery/tool-call.js +1 -1
- package/packages/core/dist/runtime/direct-tool-call.js +1 -1
- package/packages/core/dist/runtime/inspection/methods.js +1 -1
- package/packages/core/dist/runtime/inspection/replay.js +1 -1
- package/packages/core/dist/runtime/persistence/artifacts.d.ts +4 -0
- package/packages/core/dist/runtime/persistence/artifacts.js +1 -1
- package/packages/core/dist/runtime/persistence/queue.d.ts +1 -0
- package/packages/core/dist/runtime/persistence/queue.js +1 -1
- package/packages/core/dist/runtime/persistence/stores.d.ts +1 -0
- package/packages/core/dist/runtime/persistence/stores.js +1 -1
- package/packages/core/dist/runtime/persistence/system-data.d.ts +34 -0
- package/packages/core/dist/runtime/persistence/system-data.js +1 -0
- package/packages/core/dist/runtime/recovery/adapter-result.js +1 -1
- package/packages/core/dist/runtime/recovery/non-focused-recovery.js +1 -1
- package/packages/core/dist/runtime.js +1 -1
- package/packages/core/dist/workflows/index.d.ts +20 -0
- package/packages/core/dist/workflows/index.js +1 -1
- package/packages/core/package.json +3 -3
- package/packages/evaluation/dist/src/benchmark.js +1 -1
- package/packages/evaluation/dist/src/run-record.js +1 -1
- package/packages/evaluation/dist/src/tool-call-metrics.js +1 -1
- package/packages/evaluation/package.json +2 -2
- package/packages/governance/dist/src/approval-queue.d.ts +1 -0
- package/packages/governance/dist/src/approval-queue.js +1 -1
- package/packages/governance/dist/src/index.d.ts +1 -1
- package/packages/governance/dist/src/index.js +1 -1
- package/packages/governance/package.json +1 -1
- package/packages/memory/package.json +1 -1
- package/packages/protocols/dist/src/http-events.d.ts +2 -0
- package/packages/protocols/dist/src/http-events.js +1 -1
- package/packages/protocols/dist/src/http-server.d.ts +5 -1
- package/packages/protocols/dist/src/http-server.js +1 -1
- package/packages/protocols/dist/src/index.d.ts +3 -3
- package/packages/protocols/dist/src/index.js +1 -1
- package/packages/protocols/dist/src/openai-compatible.js +1 -1
- package/packages/protocols/dist/src/openai-payload.d.ts +89 -0
- package/packages/protocols/dist/src/openai-payload.js +1 -1
- package/packages/protocols/dist/src/{agent-protocols.d.ts → protocol-facades.d.ts} +4 -10
- package/packages/protocols/dist/src/protocol-facades.js +1 -0
- package/packages/protocols/dist/src/protocol-utils.d.ts +505 -0
- package/packages/protocols/dist/src/protocol-utils.js +1 -0
- package/packages/protocols/package.json +2 -2
- package/packages/tool-gateway/dist/src/argument-guard.js +1 -1
- package/packages/tool-gateway/dist/src/schema-validation.js +1 -1
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/dist/boundary-scan.js +1 -1
- package/packages/workspace-yaml/dist/discovery.js +1 -1
- package/packages/workspace-yaml/dist/documents.js +1 -1
- package/packages/workspace-yaml/dist/loader.js +1 -1
- package/packages/workspace-yaml/dist/workflows.js +1 -1
- package/packages/workspace-yaml/package.json +2 -2
- package/node_modules/@stable-harness/protocols/dist/src/agent-protocols.js +0 -1
- package/packages/protocols/dist/src/agent-protocols.js +0 -1
|
@@ -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
|
|
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 i}from"@stable-harness/core";import{buildGatewayTools as a,stringifyDeepAgentResult as d}from"./internal/gateway-tools.js";import{resolveDeepAgentsNativeMemories as c}from"./memory.js";import{buildDeepAgentRequest as l}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)}`)}}(),i=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),c={...readDeepAgentsConfig(e.config),...readDeepAgentsConfig(t.agent.config.deepagents)},p=y(t,c),u=resolveDeepAgentsSkills(t,t.agent),g=resolveDeepAgentsMemory(t,t.agent),k=void 0===c.backend?await v({workspaceRoot:t.workspace.root,skills:u,memory:g,config:c}):{cleanup:async()=>{}};try{const e=void 0===k.backend&&void 0===c.backend,r=i(function buildDeepAgentParams(e,t,r,n,o={}){const i=o.skills??resolveDeepAgentsSkills(e,e.agent),d=o.memory??resolveDeepAgentsMemory(e,e.agent),c=t.permissions??s(e,e.agent,{enabled:!0===o.autoPathPermissions}),l=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,i),checkpointer:r.checkpointer,store:r.store,middleware:mergeMiddleware(e,e.agent,t.middleware,l),responseFormat:t.responseFormat,contextSchema:t.contextSchema,interruptOn:t.interruptOn,generalPurposeAgent:readBoolean(t.generalPurposeAgent),taskDescription:readString(t.taskDescription),permissions:c,tools:a(e,e.agent.id,recoveryVisibleTools(e,e.agent.tools),resolveAgentRepairModel(e,e.agent,t),l),subagents:e.agent.subagents.map(t=>{const r=e.workspace.agents.get(t),n=readDeepAgentsConfig(r?.config.deepagents),i=n.permissions??s(e,r,{enabled:!0===o.autoPathPermissions}),d=scopedInput(e,r),c=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(d,r,n.middleware,c),interruptOn:n.interruptOn,generalPurposeAgent:readBoolean(n.generalPurposeAgent),taskDescription:readString(n.taskDescription),permissions:i,responseFormat:n.responseFormat,tools:a(e,t,recoveryVisibleTools(e,r?.tools??[]),resolveAgentRepairModel(d,r,n),c),memory:resolveDeepAgentsMemory(e,r),skills:resolveDeepAgentsSkills(e,r)})}),memory:d,skills:i})}(t,c,p,o,{backend:k.backend,skills:u,memory:g,autoPathPermissions:e})),n=l(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,d)}const y=await r.invoke(n,f);return d(y)}finally{await k.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),...c(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=i(e.workspace.runtime.toolGateway)){const a=Array.isArray(r)?r:[],d=scopedInput(e,t),c=new Set,l=readDeepAgentsConfig(t?.config.deepagents);return[o(d,{observedToolIds:c,repeatState:s,repairModel:resolveAgentRepairModel(d,t,l)}),n(d,{repeatState:s}),...g(e.workspace.runtime.retry),...a,p(d)]}function requestScopedRepeatState(e,t){const r=`deepagents.repeat.${t}`,n=e.requestState?.get(r);if(n)return n;const o=i(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}
|
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
|
|
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(t,n,a={}){const o=function allowedTaskTypes(e){const t=readConfigRecord(e.agent.config,"deepagents");if(!0===t?.generalPurposeAgent)return;const r=readConfigRecord(e.agent.config,"builtinTools");if(!r)return;const n=r.modelExposed;return Array.isArray(n)&&n.includes("task")?e.agent.subagents:[]}(t);if(void 0===o)return{request:n};const s=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}(n.toolCall?.args),i=function readTaskSubagentType(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)??readString(t.target)??readString(t.role)}(s),d=i;if(d&&o.includes(d)){const e=hasCanonicalTaskTarget(s)&&i===d?s:{...s,subagent_type:d};return{request:{...n,toolCall:{...n.toolCall,args:e}}}}const c=hasCanonicalTaskTarget(s)&&i?o.find(e=>e.toLowerCase()===i.toLowerCase()):void 0;if(c)return emitInventoryRepair(t,"repaired",i,c,o),{request:{...n,toolCall:{...n.toolCall,args:{...s,subagent_type:c}}}};if(hasCanonicalTaskTarget(s)&&i)return emitInventoryRepair(t,"blocked",i,void 0,o,"explicit_task_target_outside_inventory"),{request:n,blocked:blockedTaskMessage(n,i,o)};const l=await e({userInput:t.request.input,call:{id:i??readString(s.role)??t.request.input,args:s},candidates:taskCallCandidates(t,o),mode:"repair",repairModel:a.repairModel});if(l.ok){emitInventoryRepair(t,"repaired",i,l.candidateId,o);const e={...s,...l.args,subagent_type:l.candidateId};return{request:{...n,toolCall:{...n.toolCall,args:e}}}}return emitInventoryRepair(t,"blocked",i,void 0,o,l.reason),{request:n,blocked:blockedTaskMessage(n,i,o)}}function blockedTaskMessage(e,r,n){const a=r?`: ${r}`:"",o=n.length>0?n.join(", "):"none";return new t({tool_call_id:e.toolCall?.id??"stable-harness-task-policy",name:"task",status:"error",content:[`Task delegation target is not in the workspace inventory${a}. Allowed task targets: ${o}.`,"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,o){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:o}}})}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-call-repair.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{repairCallSelection as t}from"@easynet/better-call";import{normalizeArgsRecord as e,normalizeExecuteArgs as r,normalizeFilesystemArgs as o,normalizeWriteTodosArgs as i,shallowEqualRecord as s}from"./builtin-args.js";const
|
|
1
|
+
import{repairCallSelection as t}from"@easynet/better-call";import{normalizeArgsRecord as e,normalizeExecuteArgs as r,normalizeFilesystemArgs as o,normalizeWriteTodosArgs as i,shallowEqualRecord as s}from"./builtin-args.js";const n=new Set(["ls","read_file","write_file","edit_file","glob","grep"]);export async function repairBuiltinToolRequest(e){const r=normalizeBuiltinArgs(e.toolId,e.request.toolCall?.args,e.workspaceRoot),o=function builtinCandidate(t){const e=a[t];return e?{id:t,description:`DeepAgents builtin tool ${t}`,schema:e}:void 0}(e.toolId);if(!o)return updateRequestArgs(e.request,e.request.toolCall?.args,r);const i=await t({call:{id:e.toolId,args:r},candidates:[o],mode:"repair"}),s=i.ok?normalizeBuiltinArgs(e.toolId,i.args,e.workspaceRoot):r;return updateRequestArgs(e.request,e.request.toolCall?.args,s)}function normalizeBuiltinArgs(t,s,a){return"write_todos"===t?i(s):"read_todos"===t||"task"===t?e(s):"execute"===t?r(s,a):n.has(t)?o(t,s,a):e(s)}function updateRequestArgs(t,e,r){return function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}(e)&&s(e,r)?t:{...t,toolCall:{...t.toolCall,args:r}}}const a={write_todos:objectSchema({todos:{type:"array",items:{type:"object",additionalProperties:!0}}}),read_todos:objectSchema({}),task:objectSchema({subagent_type:{type:"string"},subagentType:{type:"string"},description:{type:"string"},task:{type:"string"}}),execute:objectSchema({command:{type:"string"},cwd:{type:"string"},timeoutMs:{type:"number"}}),ls:objectSchema({path:{type:"string"}}),read_file:objectSchema({path:{type:"string"},file_path:{type:"string"}}),write_file:objectSchema({path:{type:"string"},file_path:{type:"string"},content:{type:"string"}}),edit_file:objectSchema({path:{type:"string"},file_path:{type:"string"},old_string:{type:"string"},new_string:{type:"string"}}),glob:objectSchema({path:{type:"string"},pattern:{type:"string"}}),grep:objectSchema({path:{type:"string"},pattern:{type:"string"}})};function objectSchema(t){return{type:"object",properties:t,additionalProperties:!0}}
|
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{resolveBuiltinVisibility as n}from"./builtin/agent-tool-visibility.js";import{filesystemBuiltinToolIds as i}from"./builtin/permissions.js";import{repairTaskCall as
|
|
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 a}from"./builtin/task-inventory.js";import{repairBuiltinToolRequest as s}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 m}from"./trace-projection.js";const f=new Set(["write_todos","read_todos","task","execute",...i]);export function isDeepAgentsBuiltinTool(t){return"string"==typeof t&&f.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 a=Array.isArray(n.tools)?n.tools.filter(t=>isToolModelVisible(t.name,o)):n.tools,s=Array.isArray(a)?g(a,e.repeatState):a,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&&(!!f.has(o)&&!e.exposed.has(o))}(e,r)?"auto":e}(t,n.toolChoice,s,o);return i({...n,tools:s,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 m=r.toolCall?.name;if(!m||!f.has(m))return n(r);if("task"!==m&&g.declared&&!isToolModelVisible(m,g)){const t=JSON.stringify({status:"hidden_builtin_tool",toolId:m,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,m,"agent.tool.start",r.toolCall?.args),emitToolEvent(i,m,"agent.tool.result",r.toolCall?.args,{output:t}),builtinToolMessage(r,m,t)}const v=await s({toolId:m,request:r,workspaceRoot:i.workspace.root}),h="task"===m?await a(i,v,{repairModel:u.repairModel}):{request:v},y=h.request,b=h.blocked;if(b)return emitToolEvent(i,m,"agent.tool.result",y.toolCall?.args,{output:b.content}),b;if(emitToolEvent(i,m,"agent.tool.start",y.toolCall?.args),"task"===m){const t=p?o(m,y.toolCall?.args,p):void 0;if(t)return emitToolEvent(i,m,"agent.tool.result",y.toolCall?.args,{output:t.eventOutput}),builtinToolMessage(r,m,modelOutputForRepeatedBuiltin(m,t.modelOutput))}try{const a="task"===m?void 0:p?o(m,y.toolCall?.args,p):void 0;if(a)return emitToolEvent(i,m,"agent.tool.result",y.toolCall?.args,{output:a.eventOutput}),builtinToolMessage(r,m,modelOutputForRepeatedBuiltin(m,a.modelOutput));const s=await n(y),c=function observedToolOutput(t,e,o){return"write_todos"===t?JSON.stringify({status:"recorded",args:e.toolCall?.args}):l(o)}(m,y,s),g=p?e({toolId:m,args:y.toolCall?.args,output:c,successful:!(s instanceof t&&"error"===s.status)&&d(c),state:p}):{};return emitToolEvent(i,m,"agent.tool.result",y.toolCall?.args,{output:g.eventOutput??c}),u.observedToolIds?.add(m),void 0===g.modelOutput?s:builtinToolMessage(r,m,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,m,r,e);if(o)return emitToolEvent(i,m,"agent.tool.result",v.toolCall?.args,{output:o.content}),o;throw emitToolEvent(i,m,"agent.tool.result",v.toolCall?.args,{error:formatError(e)}),e}}}}function isToolModelVisible(t,e){return"string"!=typeof t||!f.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):{},...m(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 +1 @@
|
|
|
1
|
-
import{toolCircuitOpenEvent as e,toolFailureEvent as
|
|
1
|
+
import{toolCircuitOpenEvent as e,toolFailureEvent as r}from"@stable-harness/core";export function emitStructuredToolFailure(o,s,t,n){const i=r({requestId:o.requestId,sessionId:o.sessionId,agentId:s,toolId:t,error:n});o.emit(i),o.toolFailureTracker?.recordFailure(t)&&o.emit(e({requestId:o.requestId,sessionId:o.sessionId,agentId:s,toolId:t,reason:"runtime.tool.failure"===i.type?i.failure.reason:"unknown"}))}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";export function createRawToolCallParserMiddleware(e){return{name:"StableHarnessRawToolCallParser",async wrapModelCall(o,n){const r=await n(o);if(!function rawToolCallParsingEnabled(t){const e=isRecord(t.workspace.runtime.recovery)?t.workspace.runtime.recovery:{};return!0===(isRecord(e.toolCall)?e.toolCall:{}).enabled}(e))return r;const s=await async function parseRawToolCallResponse(e,o){if(0===o.length||!function isModelResponse(t){return isRecord(t)}(e)||function hasToolCalls(t){return Array.isArray(t.tool_calls)&&t.tool_calls.length>0}(e))return;const n=function readContentText(t){
|
|
1
|
+
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";export function createRawToolCallParserMiddleware(e){return{name:"StableHarnessRawToolCallParser",async wrapModelCall(o,n){const r=await n(o);if(!function rawToolCallParsingEnabled(t){const e=isRecord(t.workspace.runtime.recovery)?t.workspace.runtime.recovery:{};return!0===(isRecord(e.toolCall)?e.toolCall:{}).enabled}(e))return r;const s=await async function parseRawToolCallResponse(e,o){if(0===o.length||!function isModelResponse(t){return isRecord(t)}(e)||function hasToolCalls(t){return Array.isArray(t.tool_calls)&&t.tool_calls.length>0}(e))return;const n=function readContentText(t){if("string"==typeof t)return t.trim()?t:void 0;if(!Array.isArray(t))return;return t.map(t=>isRecord(t)&&"string"==typeof t.text?t.text:"").join("\n").trim()||void 0}(e.content);if(!n)return;const r=await async function readRawToolCalls(t,e){const o=[],n=new Set,r=new Set(e.map(t=>t.id));for(const s of function rawToolIntentCandidates(t,e){const o=[t.trim()];for(const e of t.matchAll(/```[a-zA-Z0-9_-]*\s*\n([\s\S]*?)\n```/gu))o.push(e[1].trim());for(const e of t.matchAll(/<\s*(?:tool_call|tool_code)\b[^>]*>(?:[\s\S]*?<\s*\/\s*(?:tool_call|tool_code)\s*>)?/giu))o.push(e[0]);for(const e of t.matchAll(/<\s*call_tool\b[^>]*>[\s\S]*?<\s*\/\s*call_tool\s*>/giu)){o.push(e[0]);const t=parseCallToolTags(e[0]);t&&o.push(t)}for(const n of e){const e=new RegExp(`(?:^|[\\s<])${escapeRegexp(n)}\\s*\\([^)]*\\)\\s*>?`,"giu");for(const n of t.matchAll(e))o.push(n[0].trim())}return o.push(...function parseJsonObjects(t){const e=[];let o=t.indexOf("{");for(;o>=0;){const n=readBalancedJsonObject(t,o);if(n){try{const t=JSON.parse(n);isRecord(t)&&e.push(t)}catch{}o=t.indexOf("{",o+n.length)}else o=t.indexOf("{",o+1)}return e}(t)),o}(t,r)){const t=await parseCandidate(s,e);if(!t||!r.has(t.tool))continue;const a=normalizeToolArgs(t.args),i=`${t.tool}:${JSON.stringify(a)}`;n.has(i)||(n.add(i),o.push({id:`stable-harness-${t.tool}-${Date.now().toString(36)}`,name:t.tool,args:a}))}return o}(n,o);return 0!==r.length?new t({content:"",id:"string"==typeof e.id?e.id:void 0,name:"string"==typeof e.name?e.name:void 0,additional_kwargs:isRecord(e.additional_kwargs)?e.additional_kwargs:{},response_metadata:isRecord(e.response_metadata)?e.response_metadata:{},tool_calls:r.map(t=>({id:t.id,name:t.name,args:t.args,type:"tool_call"}))}):void 0}(r,function visibleToolCandidates(t,e){return(e.tools??[]).flatMap(readToolName).map(e=>{const o=t.workspace.tools.get(e),n=t.toolGateway?.get(e);return{id:e,description:o?.description??n?.description,schema:o?.schema??n?.schema}})}(e,o));return s??r}}}async function parseCandidate(t,n){const r=new Set(n.map(t=>t.id));if("string"==typeof t){if(function isBareToolMarkup(t,e){const o=t.trim().replace(/^<\s*tool_code\b[^>]*>/iu,"").replace(/<\s*\/\s*tool_code\s*>$/iu,"").replace(/^```\w*\s*/u,"").replace(/```$/u,"").trim();return e.has(o)}(t,r))return;const e=function parseExecuteToolWrapper(t,e){const o=t.trim().match(/^<?\s*execute\s*\(([\s\S]*)\)\s*>?$/iu);if(!o)return;const n=function parseFunctionKwargs(t){const e={};for(const o of function splitTopLevelCommas(t){const e=[];let o,n=0,r=0,s=!1;for(let a=0;a<t.length;a+=1){const i=t[a];o?(s="\\"===i&&!s,i!==o||s||(o=void 0),"\\"!==i&&(s=!1)):'"'!==i&&"'"!==i?("("!==i&&"["!==i&&"{"!==i||(r+=1),")"!==i&&"]"!==i&&"}"!==i||(r-=1),","===i&&0===r&&(e.push(t.slice(n,a).trim()),n=a+1)):o=i}const a=t.slice(n).trim();return a&&e.push(a),e}(t)){const t=o.indexOf("=");if(t<=0)continue;const n=o.slice(0,t).trim();/^[a-zA-Z_][a-zA-Z0-9_]*$/u.test(n)&&(e[n]=parseFunctionValue(o.slice(t+1).trim()))}return e}(o[1]??""),r=n.tool??n.tool_name??n.name;if("string"!=typeof r||!e.has(r))return;const s={...n};return delete s.tool,delete s.tool_name,delete s.name,isRecord(s.args)&&1===Object.keys(s).length?{tool:r,args:s.args}:{tool:r,args:s}}(t,r);if(e)return e}const s=e(t);if(s)return s;const a=n.filter(hasSchema),i=isRecord(t)&&a.length>0?await o({call:{name:"__stable_harness_raw_args__",args:t},candidates:a,mode:"repair"}):void 0;if(i?.ok)return{tool:i.candidateId,args:i.args};const c=isRecord(t)?await async function selectUniqueToolByArgs(t,e){const n=[];for(const r of e){const s=await o({call:{name:r.id,args:t},candidates:e,mode:"guard"});s.ok&&s.candidateId===r.id&&n.push({tool:s.candidateId,args:s.args})}return 1===n.length?n[0]:void 0}(t,a):void 0;return c||void 0}function hasSchema(t){return void 0!==t.schema}function parseFunctionValue(t){if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1).replace(/\\(["'\\])/gu,"$1");if(/^-?\d+(?:\.\d+)?$/u.test(t))return Number(t);if("true"===t)return!0;if("false"===t)return!1;if("null"===t)return null;try{return JSON.parse(t)}catch{return t}}function normalizeToolArgs(t){return isRecord(t)?t:{}}function parseCallToolTags(t){const e=t.match(/<\s*tool\s*>([\s\S]*?)<\s*\/\s*tool\s*>/iu)?.[1]?.trim(),o=t.match(/<\s*tool_args\s*>([\s\S]*?)<\s*\/\s*tool_args\s*>/iu)?.[1]?.trim();if(e&&o)try{const t=JSON.parse(o);return isRecord(t)?{tool:e,args:t}:{tool:e,args:{}}}catch{return{tool:e,args:{}}}}function readBalancedJsonObject(t,e){let o=0,n=!1,r=!1;for(let s=e;s<t.length;s+=1){const a=t[s];if(n)r="\\"===a&&!r,'"'!==a||r||(n=!1),"\\"!==a&&(r=!1);else if('"'===a&&(n=!0),"{"===a&&(o+=1),"}"===a&&(o-=1),0===o)return t.slice(e,s+1)}}function escapeRegexp(t){return t.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function readToolName(t){const e="string"==typeof t.name&&t.name.length>0?t.name:void 0;if(e)return[e];const o=t,n=isRecord(o.function)&&"string"==typeof o.function.name?o.function.name:void 0;return n&&n.length>0?[n]:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function streamDeepAgentResult(e,t,a){const s=function readRunProjection(e){const t=readRecord(e);if(!t)return;const a={messages:readAsyncIterable(t.messages),toolCalls:readAsyncIterable(t.toolCalls??t.tool_calls),subagents:readAsyncIterable(t.subagents),values:readAsyncIterable(t.values),extensions:readExtensions(t.extensions),output:t.output};return a.messages||a.toolCalls||a.subagents||a.values||a.extensions||a.output?a:void 0}(t);if(!s)throw new Error("DeepAgents streamEvents(version: v3) did not expose v3 projections.");let n,o="";return await Promise.all([consumeMessages(e,s.messages,e.agent.id,e=>{o+=e}),consumeToolCalls(e,s.toolCalls,e.agent.id),consumeSubagents(e,s.subagents),consumeValues(e,s.values,e.agent.id),consumeExtensions(e,s.extensions,e.agent.id),readFinalOutput(s.output,a).then(e=>{n=e})]),n??o}async function consumeMessages(e,t,a,s){if(t)for await(const n of t)await consumeMessage(e,n,a,s)}async function consumeMessage(e,t,a,s){const n=readRecord(t);n?await Promise.all([consumeTextProjection(e,n.text??n.content,a,s),consumeReasoning(e,n.reasoning,a),consumeModelToolCalls(e,readAsyncIterable(n.toolCalls??n.tool_calls),a),emitMessageOutput(e,n,a),emitMessageUsage(e,n,a)]):await emitTextValue(e,t,a,s)}async function consumeTextProjection(e,t,a,s){if(isAsyncIterable(t))for await(const n of t)await emitTextValue(e,n,a,s);else await emitTextValue(e,await resolveValue(t),a,s)}async function emitTextValue(e,t,a,s){const n=readContentText(await resolveValue(t));n&&(emitAdapterEvent(e,"message","delta",{phase:"agent.message.delta",sourceAgentId:a,text:n}),a===e.agent.id&&(s?.(n),emitAdapterEvent(e,"message","coordinator_delta",{phase:"agent.output.delta",text:n})))}async function consumeReasoning(e,t,a){if(isAsyncIterable(t))for await(const s of t)emitReasoning(e,s,a);else emitReasoning(e,await resolveValue(t),a)}function emitReasoning(e,t,a){const s=readContentText(t);s&&emitAdapterEvent(e,"reasoning","delta",{phase:"agent.reasoning.delta",sourceAgentId:a,text:s})}async function consumeModelToolCalls(e,t,a){if(t)for await(const s of t){const t=readRecord(s)??{};emitAdapterEvent(e,"tool_call","delta",{phase:"agent.tool.call.delta",sourceAgentId:a,toolId:readString(t.name)??readString(t.toolId),toolCallId:readString(t.callId)??readString(t.id),args:await resolveValue(t.input??t.args),delta:await resolveValue(t.delta??t.argsDelta??t.arguments)})}}async function consumeToolCalls(e,t,a){if(!t)return;let s=0;for await(const n of t){s+=1;const t=readRecord(n)??{},o=readString(t.name)??readString(t.toolId)??`tool-${s}`,r=readString(t.callId)??readString(t.id)??`${a}:${o}:${s}`;emitAdapterEvent(e,"tool_execution","start",{phase:"agent.tool.start",sourceAgentId:a,toolId:o,toolCallId:r,args:await resolveValue(t.input??t.args),upstream:passthroughRecord(t)}),await consumeToolOutputDeltas(e,t,a,o,r),await emitToolResult(e,t,a,o,r)}}async function consumeToolOutputDeltas(e,t,a,s,n){const o=readAsyncIterable(t.outputDeltas??t.output_delta??t.outputChunks);if(o)for await(const t of o)emitAdapterEvent(e,"tool_execution","output_delta",{phase:"agent.tool.output.delta",sourceAgentId:a,toolId:s,toolCallId:n,delta:t})}async function consumeSubagents(e,t){if(!t)return;const a=[];let s=0;for await(const n of t)s+=1,a.push(consumeSubagent(e,n,s));await Promise.all(a)}async function consumeSubagent(e,t,a){const s=readRecord(t)??{},n=readString(s.name)??`subagent-${a}`,o=readString(s.callId)??readString(s.id)??`${n}:${a}`;emitAdapterEvent(e,"subagent","start",{phase:"agent.subagent.start",subagentId:n,callId:o,taskInput:await resolveValue(s.taskInput),namespace:s.namespace,upstream:passthroughRecord(s)});try{await Promise.all([consumeMessages(e,readAsyncIterable(s.messages),n),consumeToolCalls(e,readAsyncIterable(s.toolCalls??s.tool_calls),n),consumeSubagents(e,readAsyncIterable(s.subagents)),consumeValues(e,readAsyncIterable(s.values),n),consumeExtensions(e,readExtensions(s.extensions),n),resolveValue(s.output)]),emitAdapterEvent(e,"subagent","result",{phase:"agent.subagent.result",subagentId:n,callId:o,status:"completed"})}catch(t){emitAdapterEvent(e,"subagent","result",{phase:"agent.subagent.result",subagentId:n,callId:o,status:"failed",error:formatError(t)})}}async function consumeValues(e,t,a){if(t)for await(const s of t)emitAdapterEvent(e,"state","snapshot",{phase:"agent.state.snapshot",sourceAgentId:a,snapshot:s})}async function consumeExtensions(e,t,a){t&&await Promise.all(Object.entries(t).map(async([t,s])=>{for await(const n of s)emitAdapterEvent(e,"extension","event",{phase:"agent.extension",sourceAgentId:a,name:t,value:n})}))}async function emitToolResult(e,t,a,s,n){try{emitAdapterEvent(e,"tool_execution","result",{phase:"agent.tool.result",sourceAgentId:a,toolId:s,toolCallId:n,status:
|
|
1
|
+
export async function streamDeepAgentResult(e,t,a){const s=function readRunProjection(e){const t=readRecord(e);if(!t)return;const a={messages:readAsyncIterable(t.messages),toolCalls:readAsyncIterable(t.toolCalls??t.tool_calls),subagents:readAsyncIterable(t.subagents),values:readAsyncIterable(t.values),extensions:readExtensions(t.extensions),output:t.output};return a.messages||a.toolCalls||a.subagents||a.values||a.extensions||a.output?a:void 0}(t);if(!s)throw new Error("DeepAgents streamEvents(version: v3) did not expose v3 projections.");let n,o="";return await Promise.all([consumeMessages(e,s.messages,e.agent.id,e=>{o+=e}),consumeToolCalls(e,s.toolCalls,e.agent.id),consumeSubagents(e,s.subagents),consumeValues(e,s.values,e.agent.id),consumeExtensions(e,s.extensions,e.agent.id),readFinalOutput(s.output,a).then(e=>{n=e})]),n??o}async function consumeMessages(e,t,a,s){if(t)for await(const n of t)await consumeMessage(e,n,a,s)}async function consumeMessage(e,t,a,s){const n=readRecord(t);n?await Promise.all([consumeTextProjection(e,n.text??n.content,a,s),consumeReasoning(e,n.reasoning,a),consumeModelToolCalls(e,readAsyncIterable(n.toolCalls??n.tool_calls),a),emitMessageOutput(e,n,a),emitMessageUsage(e,n,a)]):await emitTextValue(e,t,a,s)}async function consumeTextProjection(e,t,a,s){if(isAsyncIterable(t))for await(const n of t)await emitTextValue(e,n,a,s);else await emitTextValue(e,await resolveValue(t),a,s)}async function emitTextValue(e,t,a,s){const n=readContentText(await resolveValue(t));n&&(emitAdapterEvent(e,"message","delta",{phase:"agent.message.delta",sourceAgentId:a,text:n}),a===e.agent.id&&(s?.(n),emitAdapterEvent(e,"message","coordinator_delta",{phase:"agent.output.delta",text:n})))}async function consumeReasoning(e,t,a){if(isAsyncIterable(t))for await(const s of t)emitReasoning(e,s,a);else emitReasoning(e,await resolveValue(t),a)}function emitReasoning(e,t,a){const s=readContentText(t);s&&emitAdapterEvent(e,"reasoning","delta",{phase:"agent.reasoning.delta",sourceAgentId:a,text:s})}async function consumeModelToolCalls(e,t,a){if(t)for await(const s of t){const t=readRecord(s)??{};emitAdapterEvent(e,"tool_call","delta",{phase:"agent.tool.call.delta",sourceAgentId:a,toolId:readString(t.name)??readString(t.toolId),toolCallId:readString(t.callId)??readString(t.id),args:await resolveValue(t.input??t.args),delta:await resolveValue(t.delta??t.argsDelta??t.arguments)})}}async function consumeToolCalls(e,t,a){if(!t)return;let s=0;for await(const n of t){s+=1;const t=readRecord(n)??{},o=readString(t.name)??readString(t.toolId)??`tool-${s}`,r=readString(t.callId)??readString(t.id)??`${a}:${o}:${s}`;emitAdapterEvent(e,"tool_execution","start",{phase:"agent.tool.start",sourceAgentId:a,toolId:o,toolCallId:r,args:await resolveValue(t.input??t.args),upstream:passthroughRecord(t)}),await consumeToolOutputDeltas(e,t,a,o,r),await emitToolResult(e,t,a,o,r)}}async function consumeToolOutputDeltas(e,t,a,s,n){const o=readAsyncIterable(t.outputDeltas??t.output_delta??t.outputChunks);if(o)for await(const t of o)emitAdapterEvent(e,"tool_execution","output_delta",{phase:"agent.tool.output.delta",sourceAgentId:a,toolId:s,toolCallId:n,delta:t})}async function consumeSubagents(e,t){if(!t)return;const a=[];let s=0;for await(const n of t)s+=1,a.push(consumeSubagent(e,n,s));await Promise.all(a)}async function consumeSubagent(e,t,a){const s=readRecord(t)??{},n=readString(s.name)??`subagent-${a}`,o=readString(s.callId)??readString(s.id)??`${n}:${a}`;emitAdapterEvent(e,"subagent","start",{phase:"agent.subagent.start",subagentId:n,callId:o,taskInput:await resolveValue(s.taskInput),namespace:s.namespace,upstream:passthroughRecord(s)});try{await Promise.all([consumeMessages(e,readAsyncIterable(s.messages),n),consumeToolCalls(e,readAsyncIterable(s.toolCalls??s.tool_calls),n),consumeSubagents(e,readAsyncIterable(s.subagents)),consumeValues(e,readAsyncIterable(s.values),n),consumeExtensions(e,readExtensions(s.extensions),n),resolveValue(s.output)]),emitAdapterEvent(e,"subagent","result",{phase:"agent.subagent.result",subagentId:n,callId:o,status:"completed"})}catch(t){emitAdapterEvent(e,"subagent","result",{phase:"agent.subagent.result",subagentId:n,callId:o,status:"failed",error:formatError(t)})}}async function consumeValues(e,t,a){if(t)for await(const s of t)emitAdapterEvent(e,"state","snapshot",{phase:"agent.state.snapshot",sourceAgentId:a,snapshot:s})}async function consumeExtensions(e,t,a){t&&await Promise.all(Object.entries(t).map(async([t,s])=>{for await(const n of s)emitAdapterEvent(e,"extension","event",{phase:"agent.extension",sourceAgentId:a,name:t,value:n})}))}async function emitToolResult(e,t,a,s,n){try{const o=await resolveValue(t.status);emitAdapterEvent(e,"tool_execution","result",{phase:"agent.tool.result",sourceAgentId:a,toolId:s,toolCallId:n,status:o,output:await resolveValue(t.output),error:await resolveValue(t.error),upstream:passthroughRecord(t)})}catch(t){emitAdapterEvent(e,"tool_execution","result",{phase:"agent.tool.result",sourceAgentId:a,toolId:s,toolCallId:n,status:"failed",error:formatError(t)})}}async function readFinalOutput(e,t){const a=await resolveValue(e);if(void 0!==a)return t(a)||void 0}async function emitMessageOutput(e,t,a){"output"in t&&emitAdapterEvent(e,"message","output",{phase:"agent.message.output",sourceAgentId:a,output:await resolveValue(t.output),upstream:passthroughRecord(t)})}async function emitMessageUsage(e,t,a){if(!("usage"in t))return;const s=await resolveValue(t.usage);s&&emitAdapterEvent(e,"message","usage",{phase:"agent.message.usage",sourceAgentId:a,usage:s})}function readContentText(e){return"string"==typeof e?e||void 0:Array.isArray(e)&&e.map(e=>readString(readRecord(e)?.text)??("string"==typeof e?e:"")).join("")||void 0}function emitAdapterEvent(e,t,a,s){e.emit({type:"runtime.adapter.event",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,event:{adapter:"deepagents",eventGroup:t,eventType:`deepagents.${t}.${a}`,...s}})}async function resolveValue(e){return await e}function readAsyncIterable(e){return isAsyncIterable(e)?e:void 0}function readExtensions(e){const t=readRecord(e);if(!t)return;const a=Object.entries(t).filter(e=>isAsyncIterable(e[1]));return a.length>0?Object.fromEntries(a):void 0}function passthroughRecord(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>!isAsyncIterable(e)&&!function isPromiseLike(e){return isRecord(e)&&"function"==typeof e.then}(e)))}function readRecord(e){return isRecord(e)?e:void 0}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function formatError(e){return e instanceof Error?e.message:String(e)}function isAsyncIterable(e){return isRecord(e)&&"function"==typeof e[Symbol.asyncIterator]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/substrate/checkpoint.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as e,mkdirSync as t,readFileSync as i,writeFileSync as
|
|
1
|
+
import{existsSync as e,mkdirSync as t,readFileSync as i,writeFileSync as n}from"node:fs";import c from"node:path";import{DatabaseSync as a}from"node:sqlite";import{BaseCheckpointSaver as r,WRITES_IDX_MAP as s,copyCheckpoint as d,getCheckpointId as o}from"@langchain/langgraph-checkpoint";export function createDeepAgentsCheckpointer(e){return"file"===e.provider?new JsonFileCheckpointSaver(e.path):new SqliteCheckpointSaver(e)}class JsonFileCheckpointSaver extends r{filePath;constructor(e){super(),this.filePath=e}async getTuple(e){return tupleFromState(this.state(),e,this)}async*list(e,t){for(const i of listCheckpoints(this.state(),e,t))yield hydrateTuple(i,this.state().writes,this)}async put(e,t,i){const n=requiredThreadId(e,"put checkpoint"),c=checkpointNamespace(e),a=checkpointConfig(n,c,t.id),r=this.state(),s={threadId:n,namespace:c,checkpointId:t.id,checkpoint:await dump(this,d(t)),metadata:await dump(this,i),parentCheckpointId:o(e)||void 0};return r.checkpoints=r.checkpoints.filter(e=>!function sameCheckpoint(e,t){return e.threadId===t.threadId&&e.namespace===t.namespace&&e.checkpointId===t.checkpointId}(e,s)),r.checkpoints.push(s),this.write(r),a}async putWrites(e,t,i){const n=requiredThreadId(e,"put writes"),c=requiredCheckpointId(e),a=checkpointNamespace(e),r=this.state();for(let e=0;e<t.length;e+=1){const[d,o]=t[e],h=s[d]??e,p=r.writes.some(e=>sameWrite(e,{threadId:n,namespace:a,checkpointId:c,taskId:i,idx:h}));h>=0&&p||(r.writes=r.writes.filter(e=>!sameWrite(e,{threadId:n,namespace:a,checkpointId:c,taskId:i,idx:h})),r.writes.push({threadId:n,namespace:a,checkpointId:c,taskId:i,idx:h,channel:d,value:await dump(this,o)}))}this.write(r)}async deleteThread(e){const t=this.state();this.write({checkpoints:t.checkpoints.filter(t=>t.threadId!==e),writes:t.writes.filter(t=>t.threadId!==e)})}state(){if(!e(this.filePath))return{checkpoints:[],writes:[]};const t=JSON.parse(i(this.filePath,"utf8"));return{checkpoints:t.checkpoints??[],writes:t.writes??[]}}write(e){t(c.dirname(this.filePath),{recursive:!0}),n(this.filePath,`${JSON.stringify(e,null,2)}\n`)}}class SqliteCheckpointSaver extends r{db;constructor(e){super(),t(c.dirname(e.path),{recursive:!0}),this.db=new a(e.path),this.db.exec(`PRAGMA busy_timeout = ${e.busyTimeoutMs??5e3}`),!1!==e.wal&&this.db.exec("PRAGMA journal_mode = WAL"),this.db.exec(`PRAGMA synchronous = ${e.synchronous?.toUpperCase()??"NORMAL"}`),this.db.exec(["CREATE TABLE IF NOT EXISTS checkpoints (thread_id TEXT NOT NULL, namespace TEXT NOT NULL, checkpoint_id TEXT NOT NULL, checkpoint TEXT NOT NULL, metadata TEXT NOT NULL, parent_checkpoint_id TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(thread_id, namespace, checkpoint_id))","CREATE TABLE IF NOT EXISTS writes (thread_id TEXT NOT NULL, namespace TEXT NOT NULL, checkpoint_id TEXT NOT NULL, task_id TEXT NOT NULL, idx INTEGER NOT NULL, channel TEXT NOT NULL, value TEXT NOT NULL, PRIMARY KEY(thread_id, namespace, checkpoint_id, task_id, idx))","CREATE INDEX IF NOT EXISTS idx_checkpoints_thread ON checkpoints(thread_id, namespace, checkpoint_id DESC)"].join(";"))}async getTuple(e){return tupleFromState(this.state(),e,this)}async*list(e,t){const i=this.state();for(const n of listCheckpoints(i,e,t))yield hydrateTuple(n,i.writes,this)}async put(e,t,i){const n=requiredThreadId(e,"put checkpoint"),c=checkpointNamespace(e);return this.db.prepare("INSERT OR REPLACE INTO checkpoints(thread_id, namespace, checkpoint_id, checkpoint, metadata, parent_checkpoint_id) VALUES (?, ?, ?, ?, ?, ?)").run(n,c,t.id,await dump(this,d(t)),await dump(this,i),o(e)||null),checkpointConfig(n,c,t.id)}async putWrites(e,t,i){const n=requiredThreadId(e,"put writes"),c=checkpointNamespace(e),a=requiredCheckpointId(e),r=this.db.prepare("INSERT OR REPLACE INTO writes(thread_id, namespace, checkpoint_id, task_id, idx, channel, value) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let e=0;e<t.length;e+=1){const[d,o]=t[e],h=s[d]??e;r.run(n,c,a,i,h,d,await dump(this,o))}}async deleteThread(e){this.db.prepare("DELETE FROM writes WHERE thread_id = ?").run(e),this.db.prepare("DELETE FROM checkpoints WHERE thread_id = ?").run(e)}state(){return{checkpoints:this.db.prepare("SELECT thread_id AS threadId, namespace, checkpoint_id AS checkpointId, checkpoint, metadata, parent_checkpoint_id AS parentCheckpointId FROM checkpoints").all(),writes:this.db.prepare("SELECT thread_id AS threadId, namespace, checkpoint_id AS checkpointId, task_id AS taskId, idx, channel, value FROM writes").all()}}}async function tupleFromState(e,t,i){const n=t.configurable?.thread_id;if(!n)return;const c=checkpointNamespace(t),a=o(t),r=e.checkpoints.filter(e=>e.threadId===n&&e.namespace===c),s=a?r.find(e=>e.checkpointId===a):r.sort((e,t)=>t.checkpointId.localeCompare(e.checkpointId))[0];return s?hydrateTuple(s,e.writes,i):void 0}function listCheckpoints(e,t,i){const n=t.configurable?.thread_id,c=t.configurable?.checkpoint_ns,a=o(t);let r=e.checkpoints.filter(e=>!(n&&e.threadId!==n||void 0!==c&&e.namespace!==c));return r=r.filter(e=>!a||e.checkpointId===a),r=r.filter(e=>!i?.before?.configurable?.checkpoint_id||e.checkpointId<String(i.before.configurable.checkpoint_id)),r=r.sort((e,t)=>t.checkpointId.localeCompare(e.checkpointId)),i?.filter&&(r=r.filter(e=>function metadataMatches(e,t){const i=JSON.parse(Buffer.from(e,"base64").toString("utf8"));return Object.entries(t).every(([e,t])=>i[e]===t)}(e.metadata,i.filter??{}))),"number"==typeof i?.limit?r.slice(0,i.limit):r}async function hydrateTuple(e,t,i){const n=await Promise.all(t.filter(t=>t.threadId===e.threadId&&t.namespace===e.namespace&&t.checkpointId===e.checkpointId).sort((e,t)=>e.idx-t.idx).map(async e=>[e.taskId,e.channel,await load(i,e.value)]));return{config:checkpointConfig(e.threadId,e.namespace,e.checkpointId),checkpoint:await load(i,e.checkpoint),metadata:await load(i,e.metadata),pendingWrites:n,...e.parentCheckpointId?{parentConfig:checkpointConfig(e.threadId,e.namespace,e.parentCheckpointId)}:{}}}async function dump(e,t){const[,i]=await e.serde.dumpsTyped(t);return Buffer.from(i).toString("base64")}async function load(e,t){return e.serde.loadsTyped("json",Buffer.from(t,"base64"))}function requiredThreadId(e,t){const i=e.configurable?.thread_id;if("string"!=typeof i||!i)throw new Error(`Failed to ${t}: missing configurable.thread_id.`);return i}function requiredCheckpointId(e){const t=o(e);if(!t)throw new Error("Failed to put writes: missing configurable.checkpoint_id.");return t}function checkpointNamespace(e){return String(e.configurable?.checkpoint_ns??"")}function checkpointConfig(e,t,i){return{configurable:{thread_id:e,checkpoint_ns:t,checkpoint_id:i}}}function sameWrite(e,t){return e.threadId===t.threadId&&e.namespace===t.namespace&&e.checkpointId===t.checkpointId&&e.taskId===t.taskId&&e.idx===t.idx}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isToolRepeatLimitReached as e}from"@stable-harness/core";export function filterRepeatLimitedTools(t,
|
|
1
|
+
import{isToolRepeatLimitReached as e}from"@stable-harness/core";export function filterRepeatLimitedTools(t,r){return t&&r?t.filter(t=>"string"!=typeof t.name||!e(t.name,r)):t}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createDelegationTraceProjection as t,createPlanTraceProjection as
|
|
1
|
+
import{createDelegationTraceProjection as t,createPlanTraceProjection as r}from"@stable-harness/core";export function traceProjectionForBuiltinTool(e,o,n){return"task"===e?t("agent.tool.start"===o?"delegation.start":"delegation.completed",{subagentType:readTaskSubagentType(n)}):"write_todos"===e&&"agent.tool.result"===o?r("plan.updated",{todos:readTodoArgs(n)}):{}}function readTaskSubagentType(t){const r=isRecord(t)?t:{};return readString(r.subagent_type)??readString(r.subagentType)}function readTodoArgs(t){const r=isRecord(t)?t:{};return Array.isArray(r.todos)?r.todos:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as t,readFile as e,stat as n}from"node:fs/promises";import o from"node:path";export async function createDefaultDeepAgentsBackend(t){const e=function readNodeVfsConfig(t){return readRecord(t.nodeVfs??t.nodeVFS)??{}}(t.config);if(!1===e.enabled)return{cleanup:async()=>{}};const n=await async function importNodeVfs(){return import("@langchain/node-vfs")}(),o=n.VfsSandbox?.create;if(!o)throw new Error("@langchain/node-vfs does not export VfsSandbox.create.");const a=await async function collectInitialFiles(t){const e={...t.configured};for(const n of t.sources){const o=backendPathToWorkspacePath(t.workspaceRoot,n);o&&await addPath(e,t.workspaceRoot,o)}return e}({workspaceRoot:t.workspaceRoot,sources:[...t.memory??[],...t.skills??[]],configured:readInitialFiles(e.initialFiles)}),
|
|
1
|
+
import{readdir as t,readFile as e,stat as n}from"node:fs/promises";import o from"node:path";export async function createDefaultDeepAgentsBackend(t){const e=function readNodeVfsConfig(t){return readRecord(t.nodeVfs??t.nodeVFS)??{}}(t.config);if(!1===e.enabled)return{cleanup:async()=>{}};const n=await async function importNodeVfs(){return import("@langchain/node-vfs")}(),o=n.VfsSandbox?.create;if(!o)throw new Error("@langchain/node-vfs does not export VfsSandbox.create.");const a=await async function collectInitialFiles(t){const e={...t.configured};for(const n of t.sources){const o=backendPathToWorkspacePath(t.workspaceRoot,n);o&&await addPath(e,t.workspaceRoot,o)}return e}({workspaceRoot:t.workspaceRoot,sources:[...t.memory??[],...t.skills??[]],configured:readInitialFiles(e.initialFiles)}),i=await o({...Object.keys(a).length>0?{initialFiles:a}:{},..."string"==typeof e.mountPath?{mountPath:e.mountPath}:{},..."number"==typeof e.timeout?{timeout:e.timeout}:{}});return{backend:i,cleanup:async()=>{await(i.stop?.())}}}async function addPath(a,i,r){const s=await n(r).catch(()=>{});if(!s)return;if(s.isFile())return void(a[function workspaceBackendPath(t,e){return`/${o.relative(t,e).split(o.sep).join("/")}`}(i,r)]=await e(r));if(!s.isDirectory())return;const c=await t(r,{withFileTypes:!0});for(const t of c)"node_modules"!==t.name&&".git"!==t.name&&"dist"!==t.name&&await addPath(a,i,o.join(r,t.name))}function backendPathToWorkspacePath(t,e){if(!e.trim()||e.includes("\0"))return;const n=e.startsWith("/")?e.slice(1):e,a=o.resolve(t,n),i=o.relative(t,a);return!i||i.startsWith("..")||o.isAbsolute(i)?void 0:a}function readInitialFiles(t){const e=readRecord(t);return e?Object.fromEntries(Object.entries(e).filter(t=>"string"==typeof t[1]||t[1]instanceof Uint8Array)):{}}function readRecord(t){return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-deepagents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.144",
|
|
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.144",
|
|
20
20
|
"deepagents": "^1.10.1",
|
|
21
21
|
"langchain": "^1.4.0"
|
|
22
22
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Annotation as o,END as
|
|
1
|
+
import{Annotation as o,END as t,START as e,StateGraph as n}from"@langchain/langgraph";import{compileWorkflowPlan as r}from"@stable-harness/core";import{resolveSkillProvider as i}from"./skill-providers.js";export async function runLangGraphWorkflow(i,d,a){!function assertSupportedPlan(o){if(o.cycles.length>0)throw new Error(`LangGraph workflow adapter does not enable cyclic graphs by default: ${o.workflowId}`);if(o.unreachableNodes.length>0)throw new Error(`LangGraph workflow has unreachable nodes: ${o.unreachableNodes.join(", ")}`)}(r(i.workflow));const u=function compileLangGraph(i,d,a){let u=new n(function createStateAnnotation(){return o.Root({input:o,outputs:o({reducer:(o,t)=>({...o,...t}),default:()=>({})}),trace:o({reducer:(o,t)=>[...o,...t],default:()=>[]})})}());for(const o of i.workflow.nodes)u=u.addNode(o.id,async t=>runNode({input:i,node:o,state:t,options:d,adapterName:a}));u=u.addEdge(e,i.workflow.entry??i.workflow.nodes[0].id),u=function addStaticEdges(o,t){for(const e of t.workflow.edges)e.condition||(o=o.addEdge(e.from,e.to));return o}(u,i),u=function addConditionalEdges(o,t,e){for(const[n,r]of function conditionalEdgesBySource(o){const t=new Map;for(const e of o.workflow.edges){if(!e.condition)continue;const o=t.get(e.from)??[];o.push({condition:e.condition,to:e.to}),t.set(e.from,o)}return t}(t)){const i=e.conditionalRouters?.[n];if(!i)throw new Error(`LangGraph workflow conditional edges from ${n} require a conditional router`);o=o.addConditionalEdges(n,async o=>i({...t,from:n,edges:r,state:o}),Object.fromEntries(r.map(o=>[o.condition,o.to])))}return o}(u,i,d);for(const o of r(i.workflow).terminalNodes)u=u.addEdge(o,t);return u.compile()}(i,d,a);i.emit({adapter:a,phase:"agent.langgraph.invoke",workflowId:i.workflow.id});const s=await u.invoke({input:i.request.input,outputs:{},trace:[]});return{text:stringifyWorkflowOutput(s),metadata:{workflowId:i.workflow.id,adapter:a,outputs:s.outputs,trace:s.trace}}}async function runNode(o){const t=function resolveNodeInput(o){const t=o.node.input;if(!t)return o.input.request.input;if("value"in t)return t.value;const e="request"===t.from?o.input.request.input:"previous"===t.from?function readPreviousOutput(o){const t=o.input.workflow.edges.filter(t=>t.to===o.node.id).map(o=>o.from).filter(t=>t in o.state.outputs);if(1!==t.length)throw new Error(`Workflow node ${o.node.id} input.from previous requires exactly one upstream output`);return o.state.outputs[t[0]]}(o):"node"===t.from?o.state.outputs[t.nodeId]:"outputs"===t.from?o.state.outputs:o.state;return t.path?function readPath(o,t){return t.split(".").reduce((o,t)=>{if("object"==typeof o&&null!==o)return o[t]},o)}(e,t.path):e}(o),e=await function resolveNodeHandler(o,t){const e=t.nodeHandlers?.[o.id]??t.nodeHandlers?.[o.use];if(e)return e;const n=function parseNodeUse(o){const t=o.indexOf(".");if(!(t<=0||t===o.length-1))return{kind:o.slice(0,t),id:o.slice(t+1)}}(o.use);if("workflows"===n?.kind&&t.enableSubworkflows)return o=>async function runSubworkflow(o,t){const e=o.workspace.workflows.get(o.id);if(!e)throw new Error(`LangGraph subworkflow is not defined: ${o.id}`);const n=function readSubworkflowDepth(o){const t=o?.subworkflowDepth;return"number"==typeof t&&Number.isFinite(t)?t:0}(o.request.metadata),r=t.maxSubworkflowDepth??8;if(n>=r)throw new Error(`LangGraph subworkflow depth exceeded ${r}`);return(await runLangGraphWorkflow({...o,workflow:e,request:{...o.request,input:o.nodeInput,metadata:{...o.request.metadata,subworkflowDepth:n+1}}},t,t.name??"langgraph")).text}({...o,id:n.id},t);const r=n?t.nodeResolvers?.[n.kind]:void 0;if(r&&n)return o=>r({...o,kind:n.kind,id:n.id});const d="skills"===n?.kind?i(t):void 0;if(d&&n)return o=>d.resolve({...o,kind:n.kind,id:n.id});const a=t.defaultNodeHandler;if(a)return a;throw new Error(`LangGraph workflow node ${o.id} (${o.use}) has no handler or resolver`)}(o.node,o.options)({...o.input,node:o.node,nodeInput:t,state:o.state});return o.input.emit({adapter:o.adapterName,phase:"agent.node.completed",workflowId:o.input.workflow.id,nodeId:o.node.id}),{outputs:{[o.node.id]:e},trace:[{nodeId:o.node.id,use:o.node.use,output:e}]}}function stringifyWorkflowOutput(o){const t=o.trace.at(-1)?.output;return"string"==typeof t?t:JSON.stringify(t??o.outputs)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{runLangGraphWorkflow as r}from"./graph.js";import{createLangGraphRuntimeAdapter as
|
|
1
|
+
import{runLangGraphWorkflow as r}from"./graph.js";import{createLangGraphRuntimeAdapter as o}from"./runtime.js";import{createDeepAgentsMiddlewareSkillProvider as t,createRegistrySkillResolverProvider as e}from"./skill-providers.js";export{t as createDeepAgentsMiddlewareSkillProvider,o as createLangGraphRuntimeAdapter,e as createRegistrySkillResolverProvider};export function createLangGraphWorkflowAdapter(o={}){const t=o.name??"langgraph";return{name:t,run:e=>r(e,o,t)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{runLangGraphWorkflow as e}from"./graph.js";export function createLangGraphRuntimeAdapter(n={}){const t=n.name??"langgraph";return{name:t,canRun:e=>e.backend===t,run:
|
|
1
|
+
import{runLangGraphWorkflow as e}from"./graph.js";export function createLangGraphRuntimeAdapter(n={}){const t=n.name??"langgraph";return{name:t,canRun:e=>e.backend===t,run:o=>async function runLangGraphAgent(n,t,o){return e({workspace:n.workspace,workflow:workflowFromAgent(n.agent,o),request:{input:n.request.input,metadata:n.request.metadata},requestId:n.requestId,sessionId:n.sessionId,toolGateway:n.toolGateway,emit:e=>n.emit({type:"runtime.adapter.event",requestId:n.requestId,sessionId:n.sessionId,agentId:n.agent.id,event:e})},t,o)}(o,n,t)}}function workflowFromAgent(e,n){const t=e.edges??[],o=t.length>0?agentNodes(e):agentNodes(e).slice(0,1);return function validateAgentGraph(e,n){const t=new Set;for(const o of n){if(t.has(o.id))throw new Error(`LangGraph agent ${e.id} has duplicate graph node ${o.id}`);t.add(o.id)}for(const n of e.edges??[])if(!t.has(n.from)||!t.has(n.to))throw new Error(`LangGraph agent ${e.id} edge references unknown node ${n.from}->${n.to}`)}({...e,edges:t},o),{id:e.id,...e.description?{description:e.description}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},adapter:n,entry:readAgentEntry(e,o),nodes:o,edges:t,...Object.keys(e.config).length>0?{config:e.config}:{}}}function agentNodes(e){return[...e.subagents.map(e=>inventoryNode("agents",e)),...(e.skills??[]).map(e=>inventoryNode("skills",e)),...e.tools.map(e=>inventoryNode("tools",e))]}function inventoryNode(e,n){return{id:n,use:`${e}.${n}`}}function readAgentEntry(e,n){return e.edges?.[0]?.from??n[0]?.id}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as e}from"node:fs/promises";import r from"node:path";import{repairRuntimeSelection as t}from"@stable-harness/core";export function createRegistrySkillResolverProvider(e={}){return{name:"registry-resolver",resolve:r=>async function resolveRegistrySkill(e,r){const
|
|
1
|
+
import{readFile as e}from"node:fs/promises";import r from"node:path";import{repairRuntimeSelection as t}from"@stable-harness/core";export function createRegistrySkillResolverProvider(e={}){return{name:"registry-resolver",resolve:r=>async function resolveRegistrySkill(e,r){const o=await async function resolveWorkspaceSkill(e){const r=e.workspace.skills.get(e.id);if(r)return r;const o=await t({id:e.id,candidates:[...e.workspace.skills.values()].map(e=>({id:e.id,description:e.description}))});return e.emit({phase:"inventory.repair",status:o.ok?"repaired":"blocked",diagnostic:{layer:"skill",owner:"protocol_adapter",originalId:o.diagnostics?.originalId??e.id,repairedId:o.ok?o.id:o.diagnostics?.repairedId,candidateIds:[...e.workspace.skills.keys()],...o.ok?{}:{reason:o.reason},matchSource:o.diagnostics?.matchSource,confidence:o.diagnostics?.confidence}}),o.ok?e.workspace.skills.get(o.id):void 0}(e);if(!o)throw new Error(`LangGraph skill resolver cannot find skill ${e.id}`);return{id:o.id,path:o.path,...o.description?{description:o.description}:{},allowedTools:o.allowedTools,...!1===r.includeContent?{}:{content:await readSkillContent(o,r.maxBytes)}}}(r,e)}}export function createDeepAgentsMiddlewareSkillProvider(e={}){return{name:"deepagents-middleware",async createMiddleware(r){const t=await async function loadDeepAgentsSkillsModule(e){return e.importDeepAgents?e.importDeepAgents():import("deepagents")}(e),o=t.createSkillsMiddleware;if("function"!=typeof o)throw new Error("deepagents does not export createSkillsMiddleware");return o({backend:e.backend??createDeepAgentsFilesystemBackend(t,r.workspace.root),sources:e.sources??deriveDeepAgentsSkillSources(r)})}}}export function resolveSkillProvider(e){if(!1!==e.skillProvider)return e.skillProvider??createRegistrySkillResolverProvider()}async function readSkillContent(r,t=1048576){const o=await e(r.path,"utf8");if(Buffer.byteLength(o,"utf8")>t)throw new Error(`Skill ${r.id} exceeds registry resolver size limit of ${t} bytes`);return o}function createDeepAgentsFilesystemBackend(e,r){if("function"!=typeof e.FilesystemBackend)throw new Error("deepagents does not export FilesystemBackend");return new e.FilesystemBackend({rootDir:r})}function deriveDeepAgentsSkillSources(e){const t=new Set([...(o=e.agent,o?.skills??[]),...skillIdsFromWorkflow(e)]);var o;const i=new Set;for(const o of t){const t=e.workspace.skills.get(o);t&&i.add(toPosixPath(r.relative(e.workspace.root,r.dirname(r.dirname(t.path)))))}return[...i].filter(e=>e&&!e.startsWith(".."))}function skillIdsFromWorkflow(e){return e.workflow.nodes.map(e=>e.use.match(/^skills\.([^./][^.]*)$/u)?.[1]).filter(e=>Boolean(e))}function toPosixPath(e){return e.split(r.sep).join("/")}
|
|
@@ -11,6 +11,7 @@ export type LangGraphWorkflowTraceEntry = {
|
|
|
11
11
|
};
|
|
12
12
|
export type LangGraphNodeHandlerInput = RuntimeWorkflowAdapterInput & {
|
|
13
13
|
node: WorkspaceWorkflowNode;
|
|
14
|
+
nodeInput: unknown;
|
|
14
15
|
state: LangGraphWorkflowState;
|
|
15
16
|
};
|
|
16
17
|
export type LangGraphNodeHandler = (input: LangGraphNodeHandlerInput) => Promise<unknown> | unknown;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-langgraph",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.144",
|
|
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.144"
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function scanAgentBoundary(e){const n=scanLayer("tool",e.tools??[]),i=scanLayer("skill",e.skills??[]),o=scanLayer("subagent",e.subagents??[]);return{tools:n,skills:i,subagents:o,findings:[...n.findings,...i.findings,...o.findings]}}export function checkBoundaryScanPolicy(e,n){return e.findings.map(e=>({code:e.code,layer:e.layer,resources:e.resources,severity:!0===n?.failOn?.[e.code]?"error":"warning",message:e.message,locations:e.locations,details:e.details}))}export function assertBoundaryPolicyDiagnostics(e){if(0!==e.filter(e=>"error"===e.severity).length)throw new Error(`Workspace boundary scan failed:\n${e.map(formatBoundaryDiagnostic).join("\n")}`)}export function formatBoundaryDiagnostic(e){const n=e.locations.length>0?` (${e.locations.join(", ")})`:"";return`- ${e.severity} ${e.code} [${e.layer}] ${e.resources.join(", ")}: ${e.message}${n}`}function scanLayer(e,n){const i=n.flatMap(i=>[...scanSingleResource(e,i),...scanHardcodedSiblingRouting(e,i,n)]);for(let o=0;o<n.length;o+=1)for(let t=o+1;t<n.length;t+=1)i.push(...scanResourcePair(e,n[o],n[t]));return{resources:n,findings:i}}function scanSingleResource(e,n){const i=[],o=resourceText(n);return(0===(n.description??"").trim().length||meaningfulTokens(o).length<3)&&i.push(createFinding("weak-positive-boundary",e,[n],`${e} ${n.id} does not declare a clear positive responsibility boundary.`)),function hasBroadFallbackLanguage(e){return positiveSentences(e).some(e=>/\b(any|anything|all|everything|general|generic|fallback|catch[-\s]?all)\b/iu.test(e))}(o)&&!function hasLocalScopeLanguage(e){return/\b(only|specific|scope|focused|owned|responsible|specialized|local|bounded)\b/iu.test(e)}(o)&&i.push(createFinding("broad-fallback-scope",e,[n],`${e} ${n.id} uses broad fallback language without declaring local scope.`)),function hasOnlyExclusionLanguage(e){return/\b(do not|don't|except|exclude|avoid|not for|never)\b/iu.test(e)&&!/\b(handle|provide|manage|analyze|create|run|execute|inspect|summarize|search|own|owns)\b/iu.test(e)}(o)&&i.push(createFinding("weak-positive-boundary",e,[n],`${e} ${n.id} relies on exclusions without a positive capability boundary.`)),i}function scanHardcodedSiblingRouting(e,n,i){return i.filter(e=>e.id!==n.id).filter(e=>function mentionsSiblingRouting(e,n){const i=n.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),o=new RegExp(`\\b(route|delegate|send|handoff|assign|use)\\b[^.!?\\n]{0,80}(?:^|[^\\p{L}\\p{N}_-])${i}(?:$|[^\\p{L}\\p{N}_-])`,"iu");return positiveSentences(e).some(e=>o.test(e))}(resourceText(n),e.id)).map(i=>createFinding("hardcoded-sibling-routing",e,[n,i],`${e} ${n.id} hardcodes routing to sibling ${i.id}; use loaded metadata or explicit runtime policy instead.`,{sibling:i.id}))}function scanResourcePair(e,n,i){const o=normalizeScope(n.description??""),t=normalizeScope(i.description??"");if(o&&o===t)return[createFinding("duplicate-scope",e,[n,i],`${e} resources ${n.id} and ${i.id} declare the same responsibility scope.`)];const s=function lexicalSimilarity(e,n){const i=new Set(meaningfulTokens(e)),o=new Set(meaningfulTokens(n));
|
|
1
|
+
export function scanAgentBoundary(e){const n=scanLayer("tool",e.tools??[]),i=scanLayer("skill",e.skills??[]),o=scanLayer("subagent",e.subagents??[]);return{tools:n,skills:i,subagents:o,findings:[...n.findings,...i.findings,...o.findings]}}export function checkBoundaryScanPolicy(e,n){return e.findings.map(e=>({code:e.code,layer:e.layer,resources:e.resources,severity:!0===n?.failOn?.[e.code]?"error":"warning",message:e.message,locations:e.locations,details:e.details}))}export function assertBoundaryPolicyDiagnostics(e){if(0!==e.filter(e=>"error"===e.severity).length)throw new Error(`Workspace boundary scan failed:\n${e.map(formatBoundaryDiagnostic).join("\n")}`)}export function formatBoundaryDiagnostic(e){const n=e.locations.length>0?` (${e.locations.join(", ")})`:"";return`- ${e.severity} ${e.code} [${e.layer}] ${e.resources.join(", ")}: ${e.message}${n}`}function scanLayer(e,n){const i=n.flatMap(i=>[...scanSingleResource(e,i),...scanHardcodedSiblingRouting(e,i,n)]);for(let o=0;o<n.length;o+=1)for(let t=o+1;t<n.length;t+=1)i.push(...scanResourcePair(e,n[o],n[t]));return{resources:n,findings:i}}function scanSingleResource(e,n){const i=[],o=resourceText(n);return(0===(n.description??"").trim().length||meaningfulTokens(o).length<3)&&i.push(createFinding("weak-positive-boundary",e,[n],`${e} ${n.id} does not declare a clear positive responsibility boundary.`)),function hasBroadFallbackLanguage(e){return positiveSentences(e).some(e=>/\b(any|anything|all|everything|general|generic|fallback|catch[-\s]?all)\b/iu.test(e))}(o)&&!function hasLocalScopeLanguage(e){return/\b(only|specific|scope|focused|owned|responsible|specialized|local|bounded)\b/iu.test(e)}(o)&&i.push(createFinding("broad-fallback-scope",e,[n],`${e} ${n.id} uses broad fallback language without declaring local scope.`)),function hasOnlyExclusionLanguage(e){return/\b(do not|don't|except|exclude|avoid|not for|never)\b/iu.test(e)&&!/\b(handle|provide|manage|analyze|create|run|execute|inspect|summarize|search|own|owns)\b/iu.test(e)}(o)&&i.push(createFinding("weak-positive-boundary",e,[n],`${e} ${n.id} relies on exclusions without a positive capability boundary.`)),i}function scanHardcodedSiblingRouting(e,n,i){return i.filter(e=>e.id!==n.id).filter(e=>function mentionsSiblingRouting(e,n){const i=n.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),o=new RegExp(`\\b(route|delegate|send|handoff|assign|use)\\b[^.!?\\n]{0,80}(?:^|[^\\p{L}\\p{N}_-])${i}(?:$|[^\\p{L}\\p{N}_-])`,"iu");return positiveSentences(e).some(e=>o.test(e))}(resourceText(n),e.id)).map(i=>createFinding("hardcoded-sibling-routing",e,[n,i],`${e} ${n.id} hardcodes routing to sibling ${i.id}; use loaded metadata or explicit runtime policy instead.`,{sibling:i.id}))}function scanResourcePair(e,n,i){const o=normalizeScope(n.description??""),t=normalizeScope(i.description??"");if(o&&o===t)return[createFinding("duplicate-scope",e,[n,i],`${e} resources ${n.id} and ${i.id} declare the same responsibility scope.`)];const s=function lexicalSimilarity(e,n){const i=new Set(meaningfulTokens(e)),o=new Set(meaningfulTokens(n));if(0===i.size||0===o.size)return 0;return[...i].filter(e=>o.has(e)).length/new Set([...i,...o]).size}(resourceText(n),resourceText(i));return s>=.72?[createFinding("possible-sibling-overlap",e,[n,i],`${e} resources ${n.id} and ${i.id} have likely overlapping model-visible boundaries.`,{similarity:s})]:[]}function createFinding(e,n,i,o,t={}){return{code:e,layer:n,resources:i.map(e=>e.id),message:o,locations:[...new Set(i.flatMap(e=>e.locations??[]))],details:{...t,resourceCount:i.length}}}function resourceText(e){return[e.description,e.text,e.tools?.join(" "),e.skills?.join(" "),e.subagents?.join(" ")].filter(Boolean).join("\n")}function normalizeScope(e){return meaningfulTokens(e).join(" ")}function meaningfulTokens(n){return[...n.toLowerCase().matchAll(/[a-z0-9][a-z0-9_-]{2,}/gu)].map(e=>e[0]).filter(n=>!e.has(n))}function positiveSentences(e){return e.split(/[.!?\n]+/u).map(e=>e.trim()).filter(e=>e.length>0).filter(e=>!/\b(do not|does not|don't|not for|never|exclude|avoid)\b/iu.test(e))}const e=new Set(["and","are","for","from","into","that","the","this","with","when","workspace","agent","subagent","skill","tool"]);
|
|
@@ -4,6 +4,7 @@ export * from "./boundary-scan.js";
|
|
|
4
4
|
export * from "./execution-contract.js";
|
|
5
5
|
export * from "./recovery/tool-call.js";
|
|
6
6
|
export * from "./runtime/persistence/inspection.js";
|
|
7
|
+
export * from "./runtime/persistence/system-data.js";
|
|
7
8
|
export * from "./runtime/metrics/prometheus.js";
|
|
8
9
|
export { createWorkspaceSandboxPolicy } from "./runtime/governance/sandbox.js";
|
|
9
10
|
export * from "./memory-plugins.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/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
|
+
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/persistence/system-data.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
|
-
export function resolveEnabledMemories(e,r="all"){const o=e.runtime.memory??{};if(!function isMemoryPhaseEnabled(e,r){return!1!==e.enabled&&("recall"!==r||!1!==e.recall&&!1!==e.read&&!1!==readMemoryFlag(e,"LangMem","read"))&&("write"!==r||!1!==e.write&&!1!==readMemoryFlag(e,"LangMem","write"))}(o,r))return[];const n=Array.isArray(o.refs)?o.refs.filter(e=>"string"==typeof e):[];return(n.length>0?n:[...e.memories.keys()]).map(r=>e.memories.get(r)).filter(e=>Boolean(e?.enabled))}export function resolvePluginNamespace(e,r,o,n){const t=readWorkspaceId(e),a=n.profile??n.id;return"agent"===a?`${t}:agent:${r.id}:${n.id}`:"user"===a?`${t}:user:${function readUserId(e){return e.metadata?.userId??"local"}(o)}:${n.id}`:"session"===a?`${t}:session:${o.sessionId??"default"}:${n.id}`:`${t}:${a}:${n.id}`}export function resolveMemoryProvider(e,r){return e.find(e=>e.name===r||e.name===`${r}-service`)}export function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}export function readWorkspaceId(e){return e.runtime.workspaceId??e.runtime.profile??e.root}export function formatError(e){return e instanceof Error?e.message:String(e)}function readMemoryFlag(e,r,o){const n=readRecord(e[r])??readRecord(e[r.toLowerCase()]);return"boolean"==typeof n?.[o]?n[o]:void 0}
|
|
1
|
+
export function resolveEnabledMemories(e,r="all"){const o=e.runtime.memory??{};if(!function isMemoryPhaseEnabled(e,r){return!1!==e.enabled&&(("recall"!==r||!1!==e.recall&&!1!==e.read&&!1!==readMemoryFlag(e,"LangMem","read"))&&("write"!==r||!1!==e.write&&!1!==readMemoryFlag(e,"LangMem","write")))}(o,r))return[];const n=Array.isArray(o.refs)?o.refs.filter(e=>"string"==typeof e):[];return(n.length>0?n:[...e.memories.keys()]).map(r=>e.memories.get(r)).filter(e=>Boolean(e?.enabled))}export function resolvePluginNamespace(e,r,o,n){const t=readWorkspaceId(e),a=n.profile??n.id;return"agent"===a?`${t}:agent:${r.id}:${n.id}`:"user"===a?`${t}:user:${function readUserId(e){return e.metadata?.userId??"local"}(o)}:${n.id}`:"session"===a?`${t}:session:${o.sessionId??"default"}:${n.id}`:`${t}:${a}:${n.id}`}export function resolveMemoryProvider(e,r){return e.find(e=>e.name===r||e.name===`${r}-service`)}export function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}export function readWorkspaceId(e){return e.runtime.workspaceId??e.runtime.profile??e.root}export function formatError(e){return e instanceof Error?e.message:String(e)}function readMemoryFlag(e,r,o){const n=readRecord(e[r])??readRecord(e[r.toLowerCase()]);return"boolean"==typeof n?.[o]?n[o]:void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{formatError as e,readRecord as
|
|
1
|
+
import{formatError as e,readRecord as t,readWorkspaceId as r,resolveEnabledMemories as n,resolveMemoryProvider as o,resolvePluginNamespace as a}from"./memory-plugins/shared.js";export{resolveEnabledMemories,resolvePluginNamespace}from"./memory-plugins/shared.js";export{createLangMemMaintenanceTarget,createMemoryMaintenanceDaemon,createSkillCandidateMinerTarget}from"./memory-plugins/maintenance.js";export async function runMemoryPlugins(e){const t=n(e.workspace,"write");if(e.providers?.length&&0!==t.length&&!1!==e.request.metadata?.memoryWrite)for(const r of t)await runMemoryPlugin(e,r)}export async function recallMemoryPlugins(e){const t=n(e.workspace,"recall");if(!e.providers?.length||0===t.length)return[];const r=await Promise.all(t.map(async t=>{try{return await async function recallMemoryPlugin(e,t){const r=o(e.providers??[],t.provider);if(!r)return;const n=a(e.workspace,e.agent,e.request,t),s=await r.search({namespace:n,query:buildRecallQuery(e),limit:readRecallLimit(e.workspace)});return e.emit&&e.requestId&&e.sessionId&&e.emit({type:"runtime.memory.recall.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,namespace:n,recordIds:s.map(e=>e.id),context:formatRecallContext(e.workspace,s)}),{namespace:n,records:s,context:formatRecallContext(e.workspace,s)}}(e,t)}catch{return}}));return r.filter(e=>Boolean(e?.context))}async function runMemoryPlugin(t,r){const n=o(t.providers??[],r.provider);if(!n)return;const s=a(t.workspace,t.agent,t.request,r);t.emit({type:"runtime.memory.plugin.started",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,memoryId:r.id,provider:n.name,namespace:s});try{const e=await n.propose(function createPluginProposeInput(e,t,r){return{namespace:r,content:[`User input:\n${e.request.input}`,`Agent output:\n${e.result.text}`].join("\n\n"),sourceType:"runtime-run",sourceRef:e.requestId,metadata:{memoryId:t.id,provider:t.provider,profile:t.profile,mode:t.mode,prompts:t.prompts,workspaceRoot:e.workspace.root,agentId:e.agent.id,sessionId:e.sessionId,requestMetadata:e.request.metadata}}}(t,r,s));t.emit({type:"runtime.memory.plugin.completed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,memoryId:r.id,provider:n.name,namespace:s,candidateCount:e.length})}catch(o){t.emit({type:"runtime.memory.plugin.failed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,memoryId:r.id,provider:n.name,namespace:s,error:e(o)})}}function buildRecallQuery(e){const t=[`task: ${e.request.input}`,`workspace: ${r(e.workspace)}`,`agent: ${e.agent.id}`,"memory_needed: durable preferences, workspace facts, reusable procedures, prior corrections"],n=function readRecentContext(e){return"string"==typeof e?.recentContext?e.recentContext.slice(0,3e3):Array.isArray(e?.recentTurns)?e.recentTurns.filter(e=>"string"==typeof e).slice(-6).join("\n").slice(0,3e3):void 0}(e.request.metadata);return n?[...t,`recent_context: ${n}`].join("\n"):t.join("\n")}function readRecallLimit(e){const r=t(e.runtime.memory?.LangMem),n=t(r?.recall),o=n?.topK??n?.limit;return"number"==typeof o&&Number.isFinite(o)?o:10}function formatRecallContext(e,r){const n=function readRecallContextLimits(e){const r=t(e.runtime.memory?.LangMem),n=t(r?.recall);return{maxContextChars:readPositiveNumber(n?.maxContextChars)??4e3,maxRecordChars:readPositiveNumber(n?.maxRecordChars)??1e3}}(e),o=[];let a=n.maxContextChars;for(const e of r){if(a<=0)break;const t=truncateText(formatRecallRecord(e),Math.min(n.maxRecordChars,a));t.trim()&&(o.push(t),a-=t.length+1)}return o.join("\n")}function formatRecallRecord(e){return`- ${e.summary??e.content}\n ${e.content}`}function readPositiveNumber(e){return"number"==typeof e&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function truncateText(e,t){return e.length>t?`${e.slice(0,Math.max(0,t-13))}\n [truncated]`:e}
|
|
@@ -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)||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(
|
|
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)return;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;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{controlBlockers as e,controlGaps as t,successfulEvidenceOutputs as n,successfulEvidenceToolIds as
|
|
1
|
+
import{controlBlockers as e,controlGaps as t,successfulEvidenceOutputs as n,successfulEvidenceToolIds as r}from"./event-evidence.js";const o=/(?<![\w.])(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?[%kKmMbBtTxX]?(?!\w)/gu;export const defaultExecutionEvaluatorRules=[function blockerIssues(t,n){return n.executionReview.stopOnBlocker?e(t.events).map(e=>({code:"control_blocker",message:`Execution produced a control blocker: ${e}`,recoverable:!1})):[]},function controlGapIssues(e,n){if(!n.executionReview.stopOnBlocker||!e.output?.text.trim())return[];const r=t(e.events).filter(t=>!function mentionsGap(e,t){const[n,r]=t.split(":"),o=e.toLowerCase();return o.includes(t.toLowerCase())||function statusPhrases(e){if(!e)return[];const t=e.toLowerCase().replaceAll("_"," ");return"task_inventory_blocked"===e?[t,"workspace inventory","not in the workspace inventory"]:[t]}(r).some(e=>o.includes(e))||Boolean(n&&r&&o.includes(n.toLowerCase())&&o.includes(r.toLowerCase()))}(e.output?.text??"",t));return 0===r.length?[]:[{code:"unresolved_control_gap",message:`Final answer omitted unresolved runtime evidence gap(s): ${r.slice(0,8).join(", ")}`,recoverable:!0}]},function emptyFinalIssues(e,t){return!t.executionReview.rejectEmptyFinal||e.output?.text.trim()?[]:[{code:"empty_final_answer",message:"The final answer is empty.",recoverable:!0}]},function toolEvidenceIssues(e,t){return!t.executionReview.requireToolEvidence||r(e.events).length>0?[]:[{code:"missing_tool_evidence",message:"No successful tool or delegated-task evidence was observed.",recoverable:!0}]},function ungroundedNumberIssues(e,t){if(!t.executionReview.rejectUngroundedNumbers||!e.output?.text.trim())return[];const r=numberSet(n(e.events).join("\n"));if(0===r.size)return[];const o=[...numberSet(e.output.text)].filter(e=>!function isSupportedNumber(e,t){if(t.has(e))return!0;const n=Number.parseFloat(e);if(!Number.isFinite(n))return!1;for(const e of t){const t=Number.parseFloat(e);if(Number.isFinite(t)&&Math.abs(t-n)<=roundingTolerance(n))return!0}return!1}(e,r));return 0===o.length?[]:[{code:"ungrounded_numeric_claim",message:`Final answer contains numeric claims not found in successful tool evidence: ${o.slice(0,12).join(", ")}`,recoverable:!1}]}];export function reviewExecutionEvidence(e,t,n=defaultExecutionEvaluatorRules){if(!t.enabled||!t.executionReview.enabled)return{verdict:"pass",issues:[]};const r=evaluateExecutionRules(e,t,n);return 0===r.length?{verdict:"pass",issues:[]}:{verdict:r.some(e=>!e.recoverable)?"blocked":"continue_react",issues:r}}export function evaluateExecutionRules(e,t,n=defaultExecutionEvaluatorRules){return n.flatMap(n=>n(e,t))}function numberSet(e){const t=new Set;for(const n of e.matchAll(o)){const e=normalizeNumber(n[0]);e&&t.add(e)}return t}function normalizeNumber(e){const t=e.replace(/,/gu,"").replace(/^\+/u,"").replace(/[%kKmMbBtTxX]$/u,"").trim();if(t){if(/^\d+$/u.test(t)){const e=Number.parseInt(t,10);if(e>=1&&e<=20)return;return String(e)}return/^\d+\.\d+$/u.test(t)?t.replace(/0+$/u,"").replace(/\.$/u,""):void 0}}function roundingTolerance(e){return Math.abs(e)>=1e3?1:Math.abs(e)>=100?.1:Math.abs(e)>=10?.05:.005}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function evidenceFields(e,t={}){const l=new Set,i=[];for(const n of e)for(const e of parseEvidenceFields(n,t)){const t=`${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`;l.has(t)||(l.add(t),i.push(e))}return i}export function selectSectionFields(e,t,l){return function withSourceCoverage(e,t){const l=[...e].sort((e,t)=>scoreField(t)-scoreField(e)),i=new Map;for(const e of[...new Set(l.map(e=>e.source))]){const t=l.find(t=>t.source===e);t&&i.set(fieldKey(t),t)}for(const e of l)if(i.set(fieldKey(e),e),i.size>=t)break;return[...i.values()].slice(0,t)}(e.filter(e=>e.kind===t),l).sort((e,t)=>scoreField(t)-scoreField(e)||e.label.localeCompare(t.label))}export function fieldTableLines(e,t){return 0===e.length?[]:[..."zh"===t?["| 项目 | 数值 | 来源 |","|---|---:|---|"]:["| Field | Value | Source |","|---|---:|---|"],...e.map(e=>`| ${escapeTableCell(e.label)} | ${escapeTableCell(e.value)} | ${escapeTableCell(function humanSourceLabel(e){const t=e.replace(/([a-z])([A-Z])/gu,"$1 $2").split(/[_:.\-\s]+/u).map(e=>e.trim()).filter(Boolean);return 0===t.length?e:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}(e.source))} |`)]}export function hasExtractableFields(e){return extractKeyValueFields(e).some(e=>!isBoilerplateField(e.label)&&e.value.length>0)}export function classifyFact(e,t={}){const l=function classifyByHints(e,t){const l=normalizeFieldLabel(e);for(const e of["limit","timeBound","data","context","other"])if((t[e]??[]).some(e=>l.includes(normalizeFieldLabel(e))))return e}(e,t);return l||(/(?:gap|blocked|missing|unavailable|unsupported|缺口|阻塞|缺失|不支持|无法|未提供)/iu.test(e)?"limit":/(?:date|time|published|updated|timestamp|deadline|日期|时间|发布|更新|\b20\d{2}[-/年])/iu.test(e)?"timeBound":/(?:[$€£¥%]|\b\d[\d,]*(?:\.\d+)?\b)/u.test(e)?"data":/(?:name|title|identifier|entity|subject|query|名称|标题|标识|识别)/iu.test(e)?"context":"other")}function parseEvidenceFields(e,t){return extractKeyValueFields(e.text,t).filter(e=>e.value.length>0&&!isBoilerplateField(e.label)).filter(e=>!function isLowValueField(e,t){return!!/(?:snapshot for|source type|loaded sources)/iu.test(e)
|
|
1
|
+
export function evidenceFields(e,t={}){const l=new Set,i=[];for(const n of e)for(const e of parseEvidenceFields(n,t)){const t=`${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`;l.has(t)||(l.add(t),i.push(e))}return i}export function selectSectionFields(e,t,l){return function withSourceCoverage(e,t){const l=[...e].sort((e,t)=>scoreField(t)-scoreField(e)),i=new Map;for(const e of[...new Set(l.map(e=>e.source))]){const t=l.find(t=>t.source===e);t&&i.set(fieldKey(t),t)}for(const e of l)if(i.set(fieldKey(e),e),i.size>=t)break;return[...i.values()].slice(0,t)}(e.filter(e=>e.kind===t),l).sort((e,t)=>scoreField(t)-scoreField(e)||e.label.localeCompare(t.label))}export function fieldTableLines(e,t){return 0===e.length?[]:[..."zh"===t?["| 项目 | 数值 | 来源 |","|---|---:|---|"]:["| Field | Value | Source |","|---|---:|---|"],...e.map(e=>`| ${escapeTableCell(e.label)} | ${escapeTableCell(e.value)} | ${escapeTableCell(function humanSourceLabel(e){const t=e.replace(/([a-z])([A-Z])/gu,"$1 $2").split(/[_:.\-\s]+/u).map(e=>e.trim()).filter(Boolean);return 0===t.length?e:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}(e.source))} |`)]}export function hasExtractableFields(e){return extractKeyValueFields(e).some(e=>!isBoilerplateField(e.label)&&e.value.length>0)}export function classifyFact(e,t={}){const l=function classifyByHints(e,t){const l=normalizeFieldLabel(e);for(const e of["limit","timeBound","data","context","other"])if((t[e]??[]).some(e=>l.includes(normalizeFieldLabel(e))))return e}(e,t);return l||(/(?:gap|blocked|missing|unavailable|unsupported|缺口|阻塞|缺失|不支持|无法|未提供)/iu.test(e)?"limit":/(?:date|time|published|updated|timestamp|deadline|日期|时间|发布|更新|\b20\d{2}[-/年])/iu.test(e)?"timeBound":/(?:[$€£¥%]|\b\d[\d,]*(?:\.\d+)?\b)/u.test(e)?"data":/(?:name|title|identifier|entity|subject|query|名称|标题|标识|识别)/iu.test(e)?"context":"other")}function parseEvidenceFields(e,t){return extractKeyValueFields(e.text,t).filter(e=>e.value.length>0&&!isBoilerplateField(e.label)).filter(e=>!function isLowValueField(e,t){return!!/(?:snapshot for|source type|loaded sources)/iu.test(e)||(!!/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||scoreField({source:"",label:e,value:t,kind:"other"})<0)}(e.label,e.value)).map(l=>{const i=classifyFact(`${l.label}: ${l.value}`,t);return{source:e.source,label:titleCaseLabel(l.label),value:formatEvidence(l.value),kind:"other"===i?e.kind:i}})}function scoreField(e){const t=normalizeFieldLabel(e.label);let l=e.value.length>0?10:0;return/(?:value|amount|total|ratio|rate|range|estimate|date|status|count|metric|数量|日期|范围|比率)/iu.test(t)&&(l+=8),/(?:name|title|summary|identifier|entity|subject|名称|标题|摘要|标识)/iu.test(t)&&(l+=6),/(?:unix|epoch|timestamp|raw|html|url|href|source|id|identifier|internal|debug)/iu.test(t)&&(l-=20),/^(?:date|time)$/iu.test(t)&&(l-=12),(/^https?:\/\//iu.test(e.value)||"/"===e.value)&&(l-=12),e.value.length>240&&(l-=5),l}function extractKeyValueFields(e,t={}){const l=[...e.matchAll(/(^|[\s;|])([\p{L}\p{N}][\p{L}\p{N} _./()%&+\-]{0,48})[::](?!\/\/)\s*/gu)].filter(e=>void 0!==e.index).map((e,l,i)=>{const n=i[l-1]?.[2]??"",a=function cleanFieldLabel(e,t="",l={}){const i=e.replace(/^(?:[-*]\s*)+/u,"").replace(/\s+/gu," ").trim(),n=i.split(" ").filter(Boolean);return n.length>1&&/^\d{4}$/u.test(n[0]??"")||n.length>1&&/^\d+(?:\.\d+)?$/u.test(n[0]??"")&&/^\d+(?:\.\d+)?$/u.test(n[1]??"")||n.length>1&&/^[A-Z]$/u.test(n[0]??"")?n.slice(1).join(" "):function trailingKnownLabel(e,t){const l=function trailingHintedLabel(e,t){const l=normalizeFieldLabel(e);return Object.values(t).flat().filter(e=>e.trim().length>0).sort((e,t)=>t.length-e.length).find(e=>l.endsWith(normalizeFieldLabel(e)))}(e,t);if(l)return l;const i=e.match(/\b(?:Published|Updated|Date|Time|Summary|Title|Identifier|Entity|Subject)$/iu);return i&&/(?:filed|\b20\d{2}|10-k|10-q|\bfy\b|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b|\s{3,}|[a-z].{8,}\s)/iu.test(e.slice(0,i.index))?i?.[0]??e:e}(i,l)}(e[2]??"",n,t),r=function droppedLabelPrefix(e,t){const l=e.trim();if(l===t)return"";const i=l.toLowerCase().lastIndexOf(t.toLowerCase());return i>0?l.slice(0,i):""}(e[2]??"",a);return{index:(e.index??0)+String(e[1]??"").length+r.length,start:(e.index??0)+e[0].length,label:a,rawLabel:e[2]??""}}).filter(e=>!isBoundaryNoiseLabel(e.label)&&!isBoundaryNoiseLabel(e.rawLabel));return l.map((t,i)=>{const n=l[i+1]?.index??e.length;return{label:t.label,value:cleanFieldValue(e.slice(t.start,n),t.label)}}).filter(e=>e.label.length>0)}function cleanFieldValue(e,t){const l=e.replace(/^[\s,;|.-]+/u,"").replace(/[\s,;|.-]+$/u,"").replace(/\s+/gu," ").trim(),i=normalizeFieldLabel(t);if(/\brange\b/iu.test(i))return l.replace(/\s+Beta\b.*$/iu,"").trim();if(/^(?:identifier|entity identifier|标识)$/iu.test(i)){const e=l.match(/^([A-Z0-9._-]{1,24})(?:\s+\d+[.)]\s+|$)/u);if(e?.[1])return e[1]}return l}function isBoilerplateField(e){return/^(?:status|control status|evidence tool|tool|source|来源)$/iu.test(e.trim())}function isBoundaryNoiseLabel(e){return/^\d{1,2}\s+(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/iu.test(e)||/^(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,4}(?:\s+\d{1,2})?$/iu.test(e)||/^\d{4}\s+\d{1,2}$/u.test(e)}export function normalizeFieldLabel(e){return e.toLowerCase().replace(/[^a-z0-9\p{L}\p{N}]+/giu," ").trim()}function titleCaseLabel(e){if(/\p{Script=Han}/u.test(e))return e;const t=e.split(/[^A-Za-z0-9]+/u).filter(Boolean);return normalizeFieldLabel(e).split(" ").filter(Boolean).map((e,l)=>{const i=t[l]??e;return/^[A-Z0-9]{2,}$/u.test(i)?i:e.charAt(0).toUpperCase()+e.slice(1)}).join(" ")}function formatEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1200?`${t.slice(0,1197)}...`:t}function escapeTableCell(e){return e.replace(/\|/gu,"\\|").replace(/\r?\n/gu," ")}function fieldKey(e){return`${e.source}\0${normalizeFieldLabel(e.label)}\0${e.value.toLowerCase()}`}
|