stable-harness 0.0.37 → 0.0.39
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/docs/compatibility-matrix.md +11 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.d.ts +9 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.d.ts +4 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.d.ts +5 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.d.ts +9 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +28 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.d.ts +10 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.d.ts +2 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +11 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.d.ts +9 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.d.ts +12 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.d.ts +10 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.d.ts +2 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +4 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.d.ts +5 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.d.ts +4 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.d.ts +2 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.d.ts +12 -0
- package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.js +1 -0
- package/node_modules/@stable-harness/adapter-deepagents/package.json +26 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.d.ts +3 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.js +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.d.ts +8 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.d.ts +3 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.js +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.d.ts +29 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.js +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.d.ts +60 -0
- package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.js +1 -0
- package/node_modules/@stable-harness/adapter-langgraph/package.json +16 -0
- package/node_modules/@stable-harness/core/dist/boundary-scan.d.ts +38 -0
- package/node_modules/@stable-harness/core/dist/boundary-scan.js +1 -0
- package/node_modules/@stable-harness/core/dist/evaluations/index.d.ts +18 -0
- package/node_modules/@stable-harness/core/dist/evaluations/index.js +1 -0
- package/node_modules/@stable-harness/core/dist/execution-contract.d.ts +9 -0
- package/node_modules/@stable-harness/core/dist/execution-contract.js +1 -0
- package/node_modules/@stable-harness/core/dist/index.d.ts +22 -0
- package/node_modules/@stable-harness/core/dist/index.js +1 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.d.ts +42 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.js +1 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins/shared.d.ts +8 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins/shared.js +1 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins.d.ts +25 -0
- package/node_modules/@stable-harness/core/dist/memory-plugins.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/event-evidence.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/quality/event-evidence.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/execution-review.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/quality/execution-review.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/index.d.ts +9 -0
- package/node_modules/@stable-harness/core/dist/quality/index.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/llm-review.d.ts +7 -0
- package/node_modules/@stable-harness/core/dist/quality/llm-review.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/planning-review.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/quality/planning-review.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/profile.d.ts +3 -0
- package/node_modules/@stable-harness/core/dist/quality/profile.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/recovery-policy.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/quality/recovery-policy.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/runtime.d.ts +13 -0
- package/node_modules/@stable-harness/core/dist/quality/runtime.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.d.ts +20 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/language.d.ts +3 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/language.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.d.ts +3 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/quality/synthesis.js +1 -0
- package/node_modules/@stable-harness/core/dist/quality/types.d.ts +54 -0
- package/node_modules/@stable-harness/core/dist/quality/types.js +1 -0
- package/node_modules/@stable-harness/core/dist/recovery/tool-call.d.ts +28 -0
- package/node_modules/@stable-harness/core/dist/recovery/tool-call.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/capabilities.d.ts +48 -0
- package/node_modules/@stable-harness/core/dist/runtime/capabilities.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/completion.d.ts +18 -0
- package/node_modules/@stable-harness/core/dist/runtime/completion.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +295 -0
- package/node_modules/@stable-harness/core/dist/runtime/events.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.d.ts +8 -0
- package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.d.ts +9 -0
- package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.d.ts +15 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.d.ts +6 -0
- package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/memory.d.ts +29 -0
- package/node_modules/@stable-harness/core/dist/runtime/memory.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.d.ts +8 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.d.ts +4 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.d.ts +3 -0
- package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/policy/projection.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/runtime/policy/projection.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
- package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/progress-narration.d.ts +38 -0
- package/node_modules/@stable-harness/core/dist/runtime/progress-narration.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/selection-repair.d.ts +24 -0
- package/node_modules/@stable-harness/core/dist/runtime/selection-repair.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/tool-failure.d.ts +41 -0
- package/node_modules/@stable-harness/core/dist/runtime/tool-failure.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.d.ts +59 -0
- package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/types.d.ts +191 -0
- package/node_modules/@stable-harness/core/dist/runtime/types.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime.d.ts +21 -0
- package/node_modules/@stable-harness/core/dist/runtime.js +1 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/config.d.ts +4 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/config.js +1 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/events.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/events.js +1 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/index.d.ts +4 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/index.js +1 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.js +1 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/types.d.ts +38 -0
- package/node_modules/@stable-harness/core/dist/spec-driven/types.js +1 -0
- package/node_modules/@stable-harness/core/dist/trace.d.ts +21 -0
- package/node_modules/@stable-harness/core/dist/trace.js +1 -0
- package/node_modules/@stable-harness/core/dist/types.d.ts +145 -0
- package/node_modules/@stable-harness/core/dist/types.js +1 -0
- package/node_modules/@stable-harness/core/dist/workflows/index.d.ts +70 -0
- package/node_modules/@stable-harness/core/dist/workflows/index.js +1 -0
- package/node_modules/@stable-harness/core/dist/workflows/runtime.d.ts +12 -0
- package/node_modules/@stable-harness/core/dist/workflows/runtime.js +1 -0
- package/node_modules/@stable-harness/core/dist/workspace/tool-quality.d.ts +22 -0
- package/node_modules/@stable-harness/core/dist/workspace/tool-quality.js +1 -0
- package/node_modules/@stable-harness/core/dist/workspace/types.d.ts +134 -0
- package/node_modules/@stable-harness/core/dist/workspace/types.js +1 -0
- package/node_modules/@stable-harness/core/package.json +18 -0
- package/node_modules/@stable-harness/governance/dist/src/approval-queue.d.ts +2 -0
- package/node_modules/@stable-harness/governance/dist/src/approval-queue.js +1 -0
- package/node_modules/@stable-harness/governance/dist/src/index.d.ts +4 -0
- package/node_modules/@stable-harness/governance/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/governance/dist/src/policy-engine.d.ts +2 -0
- package/node_modules/@stable-harness/governance/dist/src/policy-engine.js +1 -0
- package/node_modules/@stable-harness/governance/dist/src/skill-candidates.d.ts +2 -0
- package/node_modules/@stable-harness/governance/dist/src/skill-candidates.js +1 -0
- package/node_modules/@stable-harness/governance/dist/src/types.d.ts +101 -0
- package/node_modules/@stable-harness/governance/dist/src/types.js +1 -0
- package/node_modules/@stable-harness/governance/package.json +12 -0
- package/node_modules/@stable-harness/memory/dist/src/index.d.ts +9 -0
- package/node_modules/@stable-harness/memory/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/langmem-service.d.ts +8 -0
- package/node_modules/@stable-harness/memory/dist/src/langmem-service.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/maintenance.d.ts +2 -0
- package/node_modules/@stable-harness/memory/dist/src/maintenance.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/persistence.d.ts +4 -0
- package/node_modules/@stable-harness/memory/dist/src/persistence.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/policy.d.ts +2 -0
- package/node_modules/@stable-harness/memory/dist/src/policy.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/provider.d.ts +50 -0
- package/node_modules/@stable-harness/memory/dist/src/provider.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/store.d.ts +5 -0
- package/node_modules/@stable-harness/memory/dist/src/store.js +1 -0
- package/node_modules/@stable-harness/memory/dist/src/types.d.ts +138 -0
- package/node_modules/@stable-harness/memory/dist/src/types.js +1 -0
- package/node_modules/@stable-harness/memory/package.json +12 -0
- package/node_modules/@stable-harness/protocols/dist/src/http-server.d.ts +3 -0
- package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/in-process-client.d.ts +2 -0
- package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/index.d.ts +4 -0
- package/node_modules/@stable-harness/protocols/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.d.ts +9 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-payload.d.ts +74 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-payload.js +1 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-stream.d.ts +39 -0
- package/node_modules/@stable-harness/protocols/dist/src/openai-stream.js +1 -0
- package/node_modules/@stable-harness/protocols/package.json +15 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.d.ts +33 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.d.ts +4 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/index.d.ts +7 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/index.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.d.ts +13 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.d.ts +3 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/types.d.ts +79 -0
- package/node_modules/@stable-harness/tool-gateway/dist/src/types.js +1 -0
- package/node_modules/@stable-harness/tool-gateway/package.json +15 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.d.ts +3 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/discovery.d.ts +4 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/discovery.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/documents.d.ts +16 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/documents.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.d.ts +9 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/index.d.ts +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/index.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/loader.d.ts +2 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/loader.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/workflows.d.ts +16 -0
- package/node_modules/@stable-harness/workspace-yaml/dist/workflows.js +1 -0
- package/node_modules/@stable-harness/workspace-yaml/package.json +16 -0
- package/package.json +33 -11
- package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +2 -13
- package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +1 -23
- package/packages/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +1 -1
- package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
- package/packages/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -16
- package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
- package/packages/adapter-deepagents/package.json +4 -6
- package/packages/adapter-langgraph/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/core/dist/index.d.ts +2 -0
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/quality/profile.js +1 -1
- package/packages/core/dist/quality/synthesis/fields.d.ts +3 -2
- package/packages/core/dist/quality/synthesis/fields.js +1 -1
- package/packages/core/dist/quality/synthesis/observed.js +1 -1
- package/packages/core/dist/quality/synthesis.js +1 -1
- package/packages/core/dist/quality/types.d.ts +2 -0
- package/packages/core/dist/runtime/capabilities.d.ts +1 -0
- package/packages/core/dist/runtime/capabilities.js +1 -1
- package/packages/core/dist/runtime/policy/projection.d.ts +11 -0
- package/packages/core/dist/runtime/policy/projection.js +1 -0
- package/packages/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
- package/packages/core/dist/runtime/policy/tool-invocation.js +1 -0
- package/packages/core/dist/runtime.js +1 -1
- package/packages/core/dist/trace.d.ts +6 -0
- package/packages/core/dist/trace.js +1 -1
- package/packages/core/dist/types.d.ts +1 -0
- package/packages/core/package.json +1 -1
- package/packages/evaluation/package.json +1 -1
- package/packages/protocols/package.json +1 -1
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/package.json +1 -1
|
@@ -137,3 +137,14 @@ A compatibility feature is acceptable only when all of these are true:
|
|
|
137
137
|
3. Move remaining CLI trace checks from compat `dataListener` to native `projectRuntimeTrace` where native runtime events exist.
|
|
138
138
|
4. Keep only the explicit `./compat/agent-harness.js` facade until downstream workspaces can use the native stable runtime API directly.
|
|
139
139
|
5. Add tests for each runtime capability boundary before broadening beyond EasyNet.
|
|
140
|
+
|
|
141
|
+
## Retirement Gates
|
|
142
|
+
|
|
143
|
+
Compatibility can shrink only when the replacement is expressed as one of the stable native boundaries below:
|
|
144
|
+
|
|
145
|
+
- upstream passthrough through a backend adapter, with no local replay of execution semantics
|
|
146
|
+
- a typed runtime capability that can be enabled, disabled, replaced, and tested independently
|
|
147
|
+
- a protocol or operator projection over existing runtime events, traces, artifacts, approvals, or run state
|
|
148
|
+
- downstream workspace config, prompt, tool, or test changes for application-owned behavior
|
|
149
|
+
|
|
150
|
+
New work must not import `runtime/compat` or `compat/agent-harness` from native packages. Static architecture tests enforce this and also guard core source from backend imports and downstream domain vocabulary.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
import type { DeepAgentFactory, DeepAgentsAdapterRunner } from "./types.js";
|
|
3
|
+
type DeepAgentsAdapterOptions = {
|
|
4
|
+
runner?: DeepAgentsAdapterRunner;
|
|
5
|
+
createDeepAgent?: DeepAgentFactory;
|
|
6
|
+
config?: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
export declare function createDeepAgentsAdapter(options?: DeepAgentsAdapterOptions): RuntimeAdapter;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{realpathSync as e}from"node:fs";import t from"node:path";import{buildRuntimeSystemPrompt as r}from"@stable-harness/core";import{createBuiltinToolPolicyMiddleware as n,createObserverMiddleware as o}from"./internal/builtin-tool-policy.js";import{resolveFilesystemPermissions as s}from"./internal/builtin/permissions.js";import{createToolRepeatState as a}from"@stable-harness/core";import{buildGatewayTools as i,stringifyDeepAgentResult as p}from"./internal/gateway-tools.js";import{resolveDeepAgentsNativeMemories as d}from"./memory.js";import{buildDeepAgentRequest as l}from"./internal/messages.js";import{createRawToolCallParserMiddleware as c}from"./internal/raw-tool-call-parser.js";import{createBackendModel as u}from"./model-providers.js";import{createDeepAgentsRetryMiddleware as m}from"./retry-policy.js";import{streamDeepAgentResult as g}from"./internal/stream-events.js";export function createDeepAgentsAdapter(e={}){return{name:"deepagents",canRun:e=>"deepagents"===e.backend,async run(t){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,subagents:t.agent.subagents}}),e.runner)return e.runner(t);const r=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)}`)}}(),n=e.createDeepAgent??function readCreateDeepAgent(e){const t=e?.createDeepAgent;if("function"==typeof t)return t;throw new Error("DeepAgents package does not export createDeepAgent.")}(r),o=n(function buildDeepAgentParams(e,t,r){const n={...readDeepAgentsConfig(t),...readDeepAgentsConfig(e.agent.config.deepagents)},o=resolveDeepAgentsSkills(e,e.agent),a=n.permissions??s(e,e.agent),p=requestScopedRepeatState(e,e.agent.id);return pruneUndefined({name:e.agent.id,model:n.model??resolveAgentModel(e,e.agent),systemPrompt:buildSystemPrompt(e,e.agent),backend:n.backend??resolveDeepAgentsBackend(e,r,o),checkpointer:n.checkpointer,store:n.store,middleware:mergeMiddleware(e,e.agent,n.middleware,p),responseFormat:n.responseFormat,contextSchema:n.contextSchema,interruptOn:n.interruptOn,generalPurposeAgent:readBoolean(n.generalPurposeAgent),taskDescription:readString(n.taskDescription),permissions:a,tools:i(e,e.agent.id,e.agent.tools,resolveAgentRepairModel(e,e.agent,n),p),subagents:e.agent.subagents.map(t=>{const r=e.workspace.agents.get(t),n=readDeepAgentsConfig(r?.config.deepagents),o=n.permissions??s(e,r),a=scopedInput(e,r),p=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(a,r,n.middleware,p),interruptOn:n.interruptOn,generalPurposeAgent:readBoolean(n.generalPurposeAgent),taskDescription:readString(n.taskDescription),permissions:o,responseFormat:n.responseFormat,tools:i(e,t,r?.tools??[],resolveAgentRepairModel(a,r,n),p),memory:resolveDeepAgentsMemory(e,r),skills:resolveDeepAgentsSkills(e,r)})}),memory:resolveDeepAgentsMemory(e,e.agent),skills:o})}(t,e.config,r)),a=l(t),d=function buildDeepAgentInvokeConfig(e){return pruneUndefined({recursionLimit:readNumber(readDeepAgentsConfig(e.config.deepagents).recursionLimit)??readNumber(e.config.recursionLimit)})}(t.agent);if(!0===t.request.metadata?.openaiStream&&o.streamEvents)return g(t,o.streamEvents(a,{version:"v2",...d}),p);const c=await o.invoke(a,d);return p(c)}}}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=d(e.workspace).map(e=>`/memories/${e.id}.md`);return n.length>0?n:void 0}function resolveDeepAgentsSkills(r,n){const o=readDeepAgentsStringArray(n?.config,"skills");if(o)return o;const s=[...new Set((n?.skills??[]).map(e=>r.workspace.skills.get(e)?.path).filter(e=>"string"==typeof e&&e.trim().length>0).map(n=>function backendSkillSourcePath(r,n){const o=t.dirname(t.dirname(n)),s=t.relative(r,o);return!s||s.startsWith("..")||t.isAbsolute(s)?""===s?"/":function canonicalPath(t){try{return e.native(t)}catch{return t}}(o):`/${s.split(t.sep).join("/")}`}(r.workspace.root,n)))];return s.length>0?s:void 0}function resolveDeepAgentsBackend(e,t,r){if(t?.FilesystemBackend&&r&&0!==r.length)return()=>new t.FilesystemBackend({rootDir:e.workspace.root})}function mergeMiddleware(e,t,r,s=a(e.workspace.runtime.toolGateway)){const i=Array.isArray(r)?r:[],p=scopedInput(e,t),d=new Set;return[o(p,{observedToolIds:d,repeatState:s}),n(p,{repeatState:s}),...m(e.workspace.runtime.retry),...i,c(p)]}function requestScopedRepeatState(e,t){const r=`deepagents.repeat.${t}`,n=e.requestState?.get(r);if(n)return n;const o=a(e.workspace.runtime.toolGateway);return e.requestState&&o&&e.requestState.set(r,o),o}function scopedInput(e,t){return t?{...e,agent:t}:e}function resolveAgentModel(e,t){const r=t.modelRef?e.workspace.models.get(t.modelRef):void 0;return r?u(r):void 0}function resolveAgentRepairModel(e,t,r){const n=r.model;if(isRepairModel(n))return n;if(!t)return;const o=resolveAgentModel(e,t);return isRepairModel(o)?o: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 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}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createDeepAgentsAdapter } from "./adapter.js";
|
|
2
|
+
export { createDeepAgentsMemoryMaintenanceTarget, resolveDeepAgentsNativeMemories } from "./memory.js";
|
|
3
|
+
export { createBackendModel } from "./model-providers.js";
|
|
4
|
+
export type { DeepAgentFactory, DeepAgentsAdapterRunner } from "./types.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{createDeepAgentsAdapter}from"./adapter.js";export{createDeepAgentsMemoryMaintenanceTarget,resolveDeepAgentsNativeMemories}from"./memory.js";export{createBackendModel}from"./model-providers.js";
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
2
|
+
import type { RuntimeAdapter, WorkspaceAgent } from "@stable-harness/core";
|
|
3
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
4
|
+
export declare const filesystemBuiltinToolIds: Set<string>;
|
|
5
|
+
export declare function validateFilesystemBuiltinCall(input: AdapterRunInput, toolId: string, request: {
|
|
6
|
+
toolCall?: {
|
|
7
|
+
id?: string;
|
|
8
|
+
};
|
|
9
|
+
}): ToolMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>> | undefined;
|
|
10
|
+
export declare function resolveFilesystemPermissions(input: AdapterRunInput, agent: WorkspaceAgent | undefined): {
|
|
11
|
+
operations: string[];
|
|
12
|
+
paths: string[];
|
|
13
|
+
mode: string;
|
|
14
|
+
}[] | undefined;
|
|
15
|
+
export declare function isFilesystemDisabled(input: AdapterRunInput): boolean;
|
|
16
|
+
export declare function isFilesystemTool(name: unknown): boolean;
|
|
17
|
+
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{realpathSync as e}from"node:fs";import{ToolMessage as t}from"@langchain/core/messages";export const filesystemBuiltinToolIds=new Set(["ls","read_file","write_file","edit_file","glob","grep"]);export function validateFilesystemBuiltinCall(e,i,o){if(isFilesystemDisabled(e)&&filesystemBuiltinToolIds.has(i))return new t({tool_call_id:o.toolCall?.id??`stable-harness-${i}-policy`,name:i,content:`Filesystem builtin tool '${i}' is disabled for this agent. Do not retry filesystem tools; use the agent's registered workspace tools and already collected evidence instead.`})}export function resolveFilesystemPermissions(e,t){const i=readConfigRecord(t?.config,"builtinTools"),o=[];if(o.push(...function skillReadPermissions(e,t){const i=[...new Set((t?.skills??[]).flatMap(t=>function skillReadPaths(e,t){return t?[...new Set([t,canonicalPath(t),backendSkillPath(e,t)])].flatMap(e=>function skillReadPathCandidates(e){const t=e.replace(/\/+$/u,""),i=t.endsWith("/SKILL.md")?t.slice(0,-9):t,o=function parentPath(e){const t=e.lastIndexOf("/");return t>0?e.slice(0,t):void 0}(i);return[t,i,`${i}/**`,...o?[o,`${o}/**`]:[]]}(e)):[]}(e.workspace.root,e.workspace.skills.get(t)?.path)).filter(e=>e.startsWith("/")))];return i.length>0?[{operations:["read"],paths:i,mode:"allow"}]:[]}(e,t)),!1!==i?.filesystem){if(deepagentsMemoryWritable(e))return o.length>0?o:void 0}else o.push({operations:["read"],paths:["/memories/**"],mode:"allow"}),o.push({operations:["read","write"],paths:["/**"],mode:"deny"});return deepagentsMemoryWritable(e)||o.push({operations:["write"],paths:["/memories/**"],mode:"deny"}),o.length>0?o:void 0}export function isFilesystemDisabled(e){const t=readConfigRecord(e.agent.config,"builtinTools");return!1===t?.filesystem}export function isFilesystemTool(e){return"string"==typeof e&&filesystemBuiltinToolIds.has(e)}function backendSkillPath(e,t){const i=function pathRelative(e,t){const i=e.split("/").filter(Boolean),o=t.split("/").filter(Boolean);if(!(o.length<i.length)){for(let e=0;e<i.length;e+=1)if(i[e]!==o[e])return;return o.slice(i.length).join("/")}}(e,t);return void 0===i?t:`/${i.split("/").filter(Boolean).join("/")}`}function canonicalPath(t){try{return e.native(t)}catch{return t}}function deepagentsMemoryWritable(e){const t=readConfigRecord(e.workspace.runtime.memory,"deepagentsMem");return!1!==t?.write}function readConfigRecord(e,t){const i=isRecord(e)?e:{};return isRecord(i[t])?i[t]:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
2
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
3
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
4
|
+
export declare function repairTaskCall<T extends {
|
|
5
|
+
toolCall?: {
|
|
6
|
+
id?: string;
|
|
7
|
+
args?: unknown;
|
|
8
|
+
};
|
|
9
|
+
}>(input: AdapterRunInput, request: T): Promise<{
|
|
10
|
+
request: T;
|
|
11
|
+
blocked?: ToolMessage;
|
|
12
|
+
}>;
|
|
13
|
+
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{repairCallSelection as e}from"@botbotgo/better-call";import{ToolMessage as t}from"@langchain/core/messages";import{normalizeArgsRecord as n}from"../builtin-args.js";export async function repairTaskCall(r,a){const o=function allowedTaskTypes(e){const t=readConfigRecord(e.agent.config,"deepagents");if(!0===t?.generalPurposeAgent)return;const n=readConfigRecord(e.agent.config,"builtinTools")?.modelExposed;return!1===n?[]:Array.isArray(n)?n.includes("task")?e.agent.subagents:[]:0===e.agent.subagents.length?[]:void 0}(r);if(void 0===o)return{request:a};const s=n(a.toolCall?.args),i=function readTaskSubagentType(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)}(s);if(i&&o.includes(i))return{request:a};const d=await e({call:{id:i,args:s},candidates:taskCallCandidates(r,o),mode:"repair"});if(d.ok){emitInventoryRepair(r,"repaired",i,d.candidateId,o);const e={...s,...d.args,subagent_type:d.candidateId};return{request:{...a,toolCall:{...a.toolCall,args:e}}}}emitInventoryRepair(r,"blocked",i,void 0,o,d.reason);const l=i?`: ${i}`:"",c=o.length>0?o.join(", "):"none";return{request:a,blocked:new t({tool_call_id:a.toolCall?.id??"stable-harness-task-policy",name:"task",status:"error",content:[`Task delegation target is not in the workspace inventory${l}. Allowed task targets: ${c}.`,"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,n,r,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:n,repairedId:r,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"},description:{type:"string"}},required:["description"],additionalProperties:!0}}))}function readConfigRecord(e,t){const n=isRecord(e)?e:{};return isRecord(n[t])?n[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)}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function normalizeArgsRecord(args: unknown): Record<string, unknown>;
|
|
2
|
+
export declare function normalizeWriteTodosArgs(args: unknown): Record<string, unknown>;
|
|
3
|
+
export declare function normalizeFilesystemArgs(toolId: string, args: unknown, workspaceRoot: string): Record<string, unknown>;
|
|
4
|
+
export declare function normalizeExecuteArgs(args: unknown, workspaceRoot: string): Record<string, unknown>;
|
|
5
|
+
export declare function shallowEqualRecord(left: Record<string, unknown>, right: Record<string, unknown>): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import t from"node:path";export function normalizeArgsRecord(t){if(isRecord(t))return t;if("string"!=typeof t||!t.trim())return{};try{const r=JSON.parse(t);return isRecord(r)?r:{}}catch{return{}}}export function normalizeWriteTodosArgs(t){if(Array.isArray(t))return{todos:t.map(normalizeTodoItem)};if("string"==typeof t&&t.trim())try{const r=JSON.parse(t);if(Array.isArray(r))return{todos:r.map(normalizeTodoItem)}}catch{return{todos:[{content:t.trim()}]}}const r=normalizeArgsRecord(t),e=readTodoList(r);return e?{...r,todos:e.map(normalizeTodoItem)}:r}export function normalizeFilesystemArgs(t,r,e){const i={...normalizeArgsRecord(r)};return copyFirstStringAlias(i,"path",function filesystemPathAliases(t){return"grep"===t?["file","filename","filepath","filePath","directory","dir"]:["file_path","file","filename","filepath","filePath","target","directory","dir"]}(t)),copyFirstStringAlias(i,"pattern",function filesystemPatternAliases(t){return"glob"!==t?[]:["query","regex","search"]}(t)),copyFirstStringAlias(i,"content","write_file"===t?["text","body"]:[]),copyFirstStringAlias(i,"old_string","edit_file"===t?["oldText","old","replace","from"]:[]),copyFirstStringAlias(i,"new_string","edit_file"===t?["newText","new","with","to"]:[]),normalizePathField(i,e,"path"),normalizePathField(i,e,"file_path"),normalizePathField(i,e,"pattern","glob"===t),i}export function normalizeExecuteArgs(t,r){const e={...normalizeArgsRecord(t)};return copyFirstStringAlias(e,"command",["cmd","shell","input"]),normalizePathField(e,r,"cwd"),e}export function shallowEqualRecord(t,r){const e=Object.keys(t),i=Object.keys(r);return e.length===i.length&&e.every(e=>t[e]===r[e])}function readTodoList(t){const r=t.todos??t.items??t.tasks??t.plan;if(Array.isArray(r))return r;if(isRecord(r))return readTodoList(r)??[r];if("string"==typeof r&&r.trim())try{const t=JSON.parse(r);return Array.isArray(t)?t:isRecord(t)?readTodoList(t):void 0}catch{return}}function normalizeTodoItem(t){if("string"==typeof t&&t.trim())return{content:t.trim()};if(!isRecord(t))return t;const r=readString(t.content)??readString(t.description)??readString(t.task)??readString(t.step)??readString(t.gap)??readString(t.evidenceGap)??readString(t.evidence_gap)??readString(t.action)??readString(t.title)??readString(t.name),e=function normalizeTodoStatus(t){if(!t)return;const r=t.toLowerCase().replaceAll("-","_").replaceAll(" ","_");return"todo"===r||"not_started"===r||"planned"===r||"blocked"===r?"pending":"doing"===r||"in_progress"===r||"partial"===r?"in_progress":"done"===r||"complete"===r||"filled"===r?"completed":r}(readString(t.status)??readString(t.state));return{...r?{content:r}:{},...e?{status:e}:{}}}function readString(t){return"string"==typeof t&&t.trim()?t.trim():void 0}function copyFirstStringAlias(t,r,e){if(!readString(t[r]))for(const i of e){const e=readString(t[i]);if(e)return void(t[r]=e)}}function normalizePathField(r,e,i,n=!0){const o=n?readString(r[i]):void 0;o&&(r[i]=function workspaceBackendPath(r,e){if(!e.startsWith("/"))return e;if(function isPathInside(r,e){const i=t.relative(r,e);return""===i||!!i&&!i.startsWith("..")&&!t.isAbsolute(i)}(r,e)){const i=t.relative(r,e).split(t.sep).filter(Boolean).join("/");return i?`/${i}`:"/"}return e}(e,o))}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{repairCallSelection as t}from"@botbotgo/better-call";import{normalizeArgsRecord as e,normalizeExecuteArgs as r,normalizeFilesystemArgs as o,normalizeWriteTodosArgs as i,shallowEqualRecord as s}from"./builtin-args.js";const a=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=n[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,n){return"write_todos"===t?i(s):"read_todos"===t||"task"===t?e(s):"execute"===t?r(s,n):a.has(t)?o(t,s,n):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 n={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.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
import { type ToolRepeatState } from "@stable-harness/core";
|
|
3
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
4
|
+
export declare function createBuiltinToolPolicyMiddleware(input: AdapterRunInput, options?: {
|
|
5
|
+
repeatState?: ToolRepeatState;
|
|
6
|
+
}): {
|
|
7
|
+
name: string;
|
|
8
|
+
wrapModelCall(request: {
|
|
9
|
+
tools?: Array<{
|
|
10
|
+
name?: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
toolChoice?: unknown;
|
|
13
|
+
}, handler: (request: unknown) => Promise<unknown>): Promise<unknown>;
|
|
14
|
+
};
|
|
15
|
+
export declare function createObserverMiddleware(input: AdapterRunInput, options?: {
|
|
16
|
+
observedToolIds?: Set<string>;
|
|
17
|
+
repeatState?: ToolRepeatState;
|
|
18
|
+
}): {
|
|
19
|
+
name: string;
|
|
20
|
+
wrapToolCall(request: {
|
|
21
|
+
toolCall?: {
|
|
22
|
+
id?: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
args?: unknown;
|
|
25
|
+
};
|
|
26
|
+
}, handler: (request: unknown) => Promise<unknown>): Promise<unknown>;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js
ADDED
|
@@ -0,0 +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{filesystemBuiltinToolIds as i,isFilesystemDisabled as n,isFilesystemTool as s,validateFilesystemBuiltinCall as a}from"./builtin/permissions.js";import{repairTaskCall as l}from"./builtin/task-inventory.js";import{repairBuiltinToolRequest as u}from"./builtin-call-repair.js";import{stringifyDeepAgentResult as c,toolControlProjection as d}from"./gateway-tools.js";import{isSuccessfulEvidenceOutput as p,observedToolEvidence as m,recordObservedToolEvidence as g}from"./gateway/tool-evidence.js";import{validateSkillFileBuiltinCall as f}from"./skill-file-policy.js";import{filterRepeatLimitedTools as v}from"./tool-repeat-visibility.js";import{traceProjectionForBuiltinTool as b}from"./trace-projection.js";const T=new Set(["write_todos","read_todos","task","execute",...i]);export function createBuiltinToolPolicyMiddleware(t,e={}){return{name:"StableHarnessBuiltinToolPolicy",async wrapModelCall(o,r){const i=Array.isArray(o.tools)?v(o.tools.filter(e=>!function hasHiddenBuiltins(t){return n(t)||!isTaskVisible(t)}(t)||isModelVisibleBuiltin(t,e.name)),e.repeatState):o.tools,s=function normalizeToolChoice(t,e,o){return"required"===e?o&&o.length>0?e:"auto":function isForcedHiddenTool(t,e){return"string"==typeof e?.function?.name&&!isModelVisibleBuiltin(t,e.function.name)}(t,e)?"auto":e}(t,o.toolChoice,i);return r({...o,tools:i,toolChoice:s})}}}export function createObserverMiddleware(i,n={}){const s=n.repeatState??r(i.workspace.runtime.toolGateway);return{name:"StableHarnessObserver",async wrapToolCall(r,d){const g=r.toolCall?.name;if(!g||!T.has(g))return d(r);const v=await u({toolId:g,request:r,workspaceRoot:i.workspace.root});emitToolEvent(i,g,"agent.tool.start",v.toolCall?.args);const b="task"===g?await l(i,v):{request:v},h=b.request,y=b.blocked;if(y)return emitToolEvent(i,g,"agent.tool.result",h.toolCall?.args,{output:y.content}),y;const k=a(i,g,h);if(k)return emitToolEvent(i,g,"agent.tool.result",h.toolCall?.args,{output:k.content}),k;const C=f(i,g,h);if(C)return emitToolEvent(i,g,"agent.tool.result",h.toolCall?.args,{output:C.content}),C;try{const a=s?o(g,h.toolCall?.args,s):void 0;if(a)return emitToolEvent(i,g,"agent.tool.result",h.toolCall?.args,{output:a.eventOutput}),builtinToolMessage(r,g,function modelOutputForRepeatedBuiltin(t,e){return"task"!==t?e:function readPreviousOutput(t){try{const e=JSON.parse(t);if(!isRecord(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}(g,a.modelOutput));const l=await d(h),u=function observedToolOutput(t,e,o){return"write_todos"===t?JSON.stringify({status:"recorded",args:e.toolCall?.args}):c(o)}(g,h,l),m=s?e({toolId:g,args:h.toolCall?.args,output:u,successful:!(l instanceof t&&"error"===l.status)&&p(u),state:s}):{};return emitToolEvent(i,g,"agent.tool.result",h.toolCall?.args,{output:m.eventOutput??u}),n.observedToolIds?.add(g),void 0===m.modelOutput?l:builtinToolMessage(r,g,m.modelOutput)}catch(e){const o=function recoverableBuiltinToolError(e,o,r,i){const n=formatError(i);if("task"===o&&/repeat limit reached for tool/iu.test(n)){const o=function formatObservedEvidence(t){const e=m(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(n)})})}if(/Received tool input did not match expected schema|Invalid input:/iu.test(n))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(n)})})}(i,g,r,e);if(o)return emitToolEvent(i,g,"agent.tool.result",v.toolCall?.args,{output:o.content}),o;throw emitToolEvent(i,g,"agent.tool.result",v.toolCall?.args,{error:formatError(e)}),e}}}}function builtinToolMessage(e,o,r){return new t({tool_call_id:e.toolCall?.id??`stable-harness-${o}-repeat-guard`,name:o,content:r})}function emitToolEvent(t,e,o,r,i={}){"string"==typeof i.output&&g(t,t.agent.id,e,i.output),t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",phase:o,toolId:e,..."agent.tool.start"===o?{args:r}:{},...i,..."string"==typeof i.output?d(i.output):{},...b(e,o,r)}})}function isTaskVisible(t){const e=function readConfigRecord(t,e){const o=isRecord(t)?t:{};return isRecord(o[e])?o[e]:void 0}(t.agent.config,"builtinTools")?.modelExposed;return!1!==e&&(!Array.isArray(e)||e.includes("task"))}function isModelVisibleBuiltin(t,e){return(!n(t)||!s(e))&&("task"!==e||isTaskVisible(t))}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}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}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
export type ObservedToolEvidence = {
|
|
3
|
+
agentId: string;
|
|
4
|
+
toolId: string;
|
|
5
|
+
output: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function observedToolEvidence(input: Parameters<RuntimeAdapter["run"]>[0]): ObservedToolEvidence[];
|
|
8
|
+
export declare function recordObservedToolEvidence(input: Parameters<RuntimeAdapter["run"]>[0], agentId: string, toolId: string, output: string): void;
|
|
9
|
+
export declare function isControlOnlyOutput(output: string): boolean;
|
|
10
|
+
export declare function isSuccessfulEvidenceOutput(output: string): boolean;
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e="deepagents.observedToolEvidence";export function observedToolEvidence(t){const r=t.requestState?.get(e);return Array.isArray(r)?r:[]}export function recordObservedToolEvidence(t,r,o,n){if(!t.requestState||!isSuccessfulEvidenceOutput(n)||isControlOnlyOutput(n))return;const s=observedToolEvidence(t);t.requestState.set(e,[...s,{agentId:r,toolId:o,output:n}].slice(-12))}export function isControlOnlyOutput(e){return/"status"\s*:\s*"(?:duplicate_tool_call|repeated_tool_call_limit|tool_argument_error|delegated_task_repeat_limit|invalid_input|blocked|failed|error|plan_required|dependency_required)"|Status:\s*(?:invalid_input|blocked|failed|error|plan_required|dependency_required)\b|Filesystem builtin tool .* is disabled/iu.test(e)}export function isSuccessfulEvidenceOutput(e){const t=function parseJsonRecord(e){try{const t=JSON.parse(e);return function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(t)?t:void 0}catch{return}}(e),r="string"==typeof t?.status?t.status:function readTextStatus(e){return String(e).match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}(e);return!r||/^(?:completed|success|ok|recorded)$/iu.test(r)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{toolCircuitOpenEvent as e,toolFailureEvent as o}from"@stable-harness/core";export function emitStructuredToolFailure(r,t,s,n){const i=o({requestId:r.requestId,sessionId:r.sessionId,agentId:t,toolId:s,error:n});r.emit(i),r.toolFailureTracker?.recordFailure(s)&&r.emit(e({requestId:r.requestId,sessionId:r.sessionId,agentId:t,toolId:s,reason:"runtime.tool.failure"===i.type?i.failure.reason:"unknown"}))}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
2
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
3
|
+
import type { RuntimeToolRepairModel } from "@stable-harness/core";
|
|
4
|
+
import { type ToolRepeatState } from "@stable-harness/core";
|
|
5
|
+
export declare function buildGatewayTools(input: Parameters<RuntimeAdapter["run"]>[0], agentId: string, toolIds: string[], repairModel?: RuntimeToolRepairModel, repeatState?: ToolRepeatState | undefined): import("@langchain/core/tools").DynamicTool<string | ToolMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>>, unknown>[];
|
|
6
|
+
export declare function stringifyDeepAgentResult(result: unknown): string;
|
|
7
|
+
export declare function toolControlProjection(output: string): {
|
|
8
|
+
controlStatus: string;
|
|
9
|
+
} | {
|
|
10
|
+
controlStatus?: undefined;
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ToolMessage as t}from"@langchain/core/messages";import{tool as e}from"@langchain/core/tools";import{afterToolInvoke as o,beforeToolInvoke as r,createToolRepeatState as n,missingRequiredPlanContent as s,missingToolDependencyContent as a,toolInvocationEvents as i}from"@stable-harness/core";import{isSuccessfulEvidenceOutput as u,observedToolEvidence as l,recordObservedToolEvidence as c}from"./gateway/tool-evidence.js";import{emitStructuredToolFailure as d}from"./gateway/tool-failure-events.js";export function buildGatewayTools(l,c,p,f,g=n(l.workspace.runtime.toolGateway)){return l.toolGateway?p.flatMap(n=>{const p=l.toolGateway?.get(n);if(!p)return[];const m=l.workspace.tools.get(n),y=m?.schema??p.schema;return[e(async e=>async function invokeGuardedGatewayTool(e){emitToolResult(e.input,e.agentId,e.toolId,void 0);const n=i({request:e.input.request,getEvents:e.input.getEvents}),l=s({agent:e.input.agent,events:n,toolId:e.toolId});if(l)return emitToolResult(e.input,e.agentId,e.toolId,l),l;const c=a({agent:e.input.agent,events:n,toolId:e.toolId});if(c)return emitToolResult(e.input,e.agentId,e.toolId,c),c;const p=e.repeatState?r(e.toolId,e.args,e.repeatState):void 0;if(p)return emitToolResult(e.input,e.agentId,e.toolId,p.eventOutput),p.modelOutput;const f=await async function invokeGatewayTool(e,o,r,n,s){try{if(e.toolFailureTracker?.isCircuitOpen(r))throw new Error(`Tool circuit is open: ${r}`);const t=await e.toolGateway.invoke({toolId:r,args:n,repairModel:s,context:{workspaceRoot:e.workspace.root,requestId:e.requestId,sessionId:e.sessionId,agentId:o,requestInput:e.request.input,observedEvidence:formatObservedEvidenceForToolContext(e),approvalIds:readApprovalIds(e.request.metadata)}});return e.toolFailureTracker?.recordSuccess(r),t}catch(n){if(d(e,o,r,n),function isToolArgumentValidationError(t){return t instanceof Error&&"ToolArgumentValidationError"===t.name&&"string"==typeof t.toolId&&Array.isArray(t.issues)}(n))return new t({tool_call_id:`stable-harness-${r}-argument-guard`,name:r,status:"error",content:formatToolArgumentError(n)});if(e.workspace.runtime.retry?.tools?.enabled)throw n;return new t({tool_call_id:`stable-harness-${r}-execution-error`,name:r,status:"error",content:JSON.stringify({error:"tool_execution_failed",toolId:r,message:formatError(n),retry:"Use the error as evidence, adjust the tool arguments if possible, or return a final answer with the blocker."})})}}(e.input,e.agentId,e.toolId,e.args,e.repairModel),g=f instanceof t?String(f.content):stringifyDeepAgentResult(f.output),m=e.repeatState?o({toolId:e.toolId,args:e.args,output:g,successful:!(f instanceof t&&"error"===f.status)&&u(g),state:e.repeatState}):{};return emitToolResult(e.input,e.agentId,e.toolId,m.eventOutput??g),void 0!==m.modelOutput?m.modelOutput:f instanceof t?f:g}({input:l,agentId:c,toolId:n,args:e,repairModel:f,repeatState:g}),{name:n,description:buildToolDescription(m?.description??p.description??n,y,l.workspace.runtime.toolGateway,n),schema:{type:"object",additionalProperties:!0}})]}):[]}function emitToolResult(t,e,o,r){void 0!==r&&c(t,e,o,r),t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:e,event:void 0===r?{adapter:"deepagents",phase:"agent.tool.start",toolId:o}:{adapter:"deepagents",phase:"agent.tool.result",toolId:o,output:previewToolOutput(r),evidenceOutput:r,...toolControlProjection(r)}})}export function stringifyDeepAgentResult(e){if(e instanceof t)return function stringifyToolMessageContent(t){return"string"==typeof t?t:JSON.stringify(t)}(e.content);if("string"==typeof e)return e;if(isRecord(e)){const t=e.structuredResponse??e.structured_response;if(void 0!==t)return"string"==typeof t?t:JSON.stringify(t);const o=(Array.isArray(e.messages)?e.messages:[]).at(-1);if(isRecord(o)&&"string"==typeof o.content)return o.content;const r=(isRecord(e.update)&&Array.isArray(e.update.messages)?e.update.messages:[]).at(-1);if(isRecord(r)&&isRecord(r.kwargs)&&"string"==typeof r.kwargs.content)return r.kwargs.content;if(isRecord(r)&&"string"==typeof r.content)return r.content}return JSON.stringify(e)}function buildToolDescription(t,e,o,r){const n=function toolRepeatPolicyDescription(t,e){const o=function repeatGuardConfig(t){return isRecord(t)&&isRecord(t.repeatGuard)?t.repeatGuard:{}}(t),r=function readPositiveIntegerMap(t){return isRecord(t)?new Map(Object.entries(t).map(([t,e])=>[t,readPositiveInteger(e)]).filter(t=>void 0!==t[1])):new Map}(o.maxSuccessfulCallsByTool).get(e)??readPositiveInteger(o.maxSuccessfulCallsPerTool);return void 0===r?"":`Stable runtime repeat policy: call this tool at most ${r} successful time(s) for this request. If more detail is needed, include the dimensions in the first call and synthesize after the result returns.`}(o,r),s=n?`${t}\n\n${n}`:t;return e?`${s}\n\nStable tool input schema:\n${previewToolOutput(JSON.stringify(e))}`:s}function readPositiveInteger(t){return"number"==typeof t&&Number.isInteger(t)&&t>0?t:void 0}function previewToolOutput(t){const e=t.replace(/\s+/gu," ").trim();return e.length>500?`${e.slice(0,497)}...`:e}export function toolControlProjection(t){const e=function parseJsonRecord(t){try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}(t);if("string"==typeof e?.status)return{controlStatus:e.status};const o=function readTextStatus(t){return String(t).match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}(t);return o?{controlStatus:o}:"string"==typeof e?.error?{controlStatus:e.error}:t.startsWith("Task delegation target is not in the workspace inventory")?{controlStatus:"task_inventory_blocked"}:{}}function readApprovalIds(t){const e=t?.approvalIds??t?.approvalId;return"string"==typeof e&&e.trim()?[e.trim()]:Array.isArray(e)?e.filter(t=>"string"==typeof t&&t.trim().length>0):void 0}function formatObservedEvidenceForToolContext(t){const e=l(t).map(t=>`Tool: ${t.toolId}\n${t.output}`).join("\n\n---\n\n");return e.length>12e3?`${e.slice(0,12e3)}\n[truncated]`:e}function formatToolArgumentError(t){return JSON.stringify({error:"tool_argument_validation_failed",toolId:t.toolId,issues:t.issues,retry:"Call the same tool again with arguments that satisfy the reported schema and semantic issues."})}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function formatError(t){return t instanceof Error?t.message:String(t)}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
type DeepAgentMessage = {
|
|
3
|
+
role: string;
|
|
4
|
+
content: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function buildDeepAgentRequest(input: Parameters<RuntimeAdapter["run"]>[0]): {
|
|
7
|
+
messages: DeepAgentMessage[];
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function buildDeepAgentRequest(e){return{messages:buildDeepAgentMessages(e)}}function buildDeepAgentMessages(e){const t=function readOpenAiMessages(e){return Array.isArray(e)?e.flatMap(e=>{const t=function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(e)?e:{},n=function readRole(e){if("system"===e||"user"===e||"assistant"===e||"tool"===e)return e}(t.role),r="string"==typeof t.content?t.content:"";return n&&r?[{role:n,content:r}]:[]}):[]}(e.request.metadata?.openaiMessages),n="tool_call"===e.request.metadata?.stableHarnessRecovery?void 0:function buildMemoryContext(e){const t=(e.pluginMemories??[]).filter(e=>e.context.trim()).map(e=>`Memory namespace: ${e.namespace}\n${e.context}`).join("\n\n");return t?`Relevant long-term memory:\n${t}`:void 0}(e);if(t.length>0){const r=function applyRecoveryPrompt(e,t){return"tool_call"!==t.request.metadata?.stableHarnessRecovery?e:[{role:"user",content:t.request.input}]}(t,e);return n?[{role:"system",content:n},...r]:r}const r={role:"user",content:e.request.input};return n?[{role:"system",content:n},r]:[r]}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
2
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
3
|
+
type ModelRequest = {
|
|
4
|
+
tools?: Array<{
|
|
5
|
+
name?: unknown;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
export declare function createRawToolCallParserMiddleware(input: AdapterRunInput): {
|
|
9
|
+
name: string;
|
|
10
|
+
wrapModelCall(request: ModelRequest, handler: (request: unknown) => Promise<unknown>): Promise<unknown>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AIMessage as e}from"@langchain/core/messages";export function createRawToolCallParserMiddleware(t){return{name:"StableHarnessRawToolCallParser",async wrapModelCall(n,r){const o=await r(n);if(!function rawToolCallParsingEnabled(e){const t=isRecord(e.workspace.runtime.recovery)?e.workspace.runtime.recovery:{};return!0===(isRecord(t.toolCall)?t.toolCall:{}).enabled}(t))return o;const a=function parseRawToolCallResponse(t,n){if(0===n.size||!function isModelResponse(e){return isRecord(e)}(t)||function hasToolCalls(e){return Array.isArray(e.tool_calls)&&e.tool_calls.length>0}(t))return;const r=function readContentText(e){return"string"==typeof e?e.trim()?e:void 0:Array.isArray(e)&&e.map(e=>isRecord(e)&&"string"==typeof e.text?e.text:"").join("\n").trim()||void 0}(t.content);if(!r)return;const o=function readRawToolCalls(e,t){const n=readXmlToolCalls(e,t);if(n.length>0)return n;const r=function stripToolMarkup(e){return e.replace(/^\s*```(?:json)?/iu,"").replace(/```\s*$/iu,"").replace(/^\s*<\s*tool_call[^>]*>\s*/iu,"").replace(/\s*<\s*\/\s*tool_call\s*>\s*$/iu,"").trim()}(e),o=readXmlToolCalls(r,t);if(o.length>0)return o;const a=function readFunctionToolCalls(e,t){const n=[];for(const r of t){const t=new RegExp(`(?:^|\\s)${escapeRegexp(r)}\\s*\\(([^)]*)\\)`,"giu");for(const o of e.matchAll(t)){const e=readFunctionArgs(o[1]??"");e&&Object.keys(e).length>0&&n.push({id:`stable-harness-${r}-${Date.now().toString(36)}`,name:r,args:e})}}return n}(r,t);return a.length>0?a:function parseJsonObjects(e){const t=[];let n=e.indexOf("{");for(;n>=0;){const r=readBalancedJsonObject(e,n);if(r){try{const e=JSON.parse(r);isRecord(e)&&t.push(e)}catch{}n=e.indexOf("{",n+r.length)}else n=e.indexOf("{",n+1)}return t}(r).flatMap(e=>function readJsonToolCall(e,t){const n=function readNestedToolCall(e,t){const n=Object.entries(e);if(1!==n.length)return;const[r,o]=n[0];return t.has(r)&&isRecord(o)?{id:`stable-harness-${r}-${Date.now().toString(36)}`,name:r,args:o}:void 0}(e,t);if(n)return n;const r=readString(e.name)??readString(e.tool_name)??readString(e.tool)??readString(e.type),o=t.has(r??"")?r:singleToolName(t),a=function readArgs(e){return isRecord(e.arguments)?e.arguments:isRecord(e.parameters)?e.parameters:isRecord(e.args)?e.args:"args"in e&&void 0!==e.args?{args:e.args}:void 0}(e)??function readInlineArgs(e){const t=Object.fromEntries(Object.entries(e).filter(([e])=>!["name","tool_name","tool","type"].includes(e)));return Object.keys(t).length>0?t:void 0}(e);return o&&t.has(o)&&a?{id:`stable-harness-${o}-${Date.now().toString(36)}`,name:o,args:a}:void 0}(e,t)??[])}(r,n);return 0!==o.length?new e({content:"",id:"string"==typeof t.id?t.id:void 0,name:"string"==typeof t.name?t.name:void 0,additional_kwargs:isRecord(t.additional_kwargs)?t.additional_kwargs:{},response_metadata:isRecord(t.response_metadata)?t.response_metadata:{},tool_calls:o.map(e=>({id:e.id,name:e.name,args:e.args,type:"tool_call"}))}):void 0}(o,function visibleToolNames(e){return new Set((e.tools??[]).map(e=>e.name).filter(e=>"string"==typeof e&&e.length>0))}(n));return a??o}}}function readXmlToolCalls(e,t){const n=[],r=/<\s*(tool_call|tool_code)\b[^>]*>(?:[\s\S]*?<\s*\/\s*\1\s*>)?/giu;for(const o of e.matchAll(r)){const e=readXmlToolCall(o[0],t);e&&n.push(e)}return n}function readXmlToolCall(e,t){const n=function readToolCallAttributes(e){const t=/<\s*(?:tool_call|tool_code)\b([^>]*)>/iu.exec(e);if(!t)return;const n=[...t[1].matchAll(/([a-zA-Z_][\w.-]*)\s*=\s*"([^"]*)"/gu)];return n.length>0?Object.fromEntries(n.map(e=>[e[1],e[2]])):void 0}(e),r=readString(n?.name)??readString(n?.tool_name)??readString(n?.tool)??readXmlTag(e,"tool_name")??readXmlTag(e,"name")??readXmlTag(e,"tool"),o=t.has(r??"")?r:singleToolName(t);if(!o||!t.has(o))return;const a=readXmlTag(e,"tool_args")??readXmlTag(e,"args")??readXmlTag(e,"arguments"),s=a?function readXmlArgs(e){const t=[...e.matchAll(/<\s*([a-zA-Z_][\w.-]*)\s*>([\s\S]*?)<\s*\/\s*\1\s*>/gu)];if(0===t.length){const t=e.trim();return t?{input:t}:void 0}return Object.fromEntries(t.map(e=>[e[1],e[2].trim()]))}(a):function readAttributeArgs(e){if(!e)return;const t=Object.fromEntries(Object.entries(e).filter(([e])=>!["name","tool_name","tool","type"].includes(e)));return Object.keys(t).length>0?t:void 0}(n);return s&&0!==Object.keys(s).length?{id:`stable-harness-${o}-${Date.now().toString(36)}`,name:o,args:s}:void 0}function readXmlTag(e,t){const n=new RegExp(`<\\s*${t}\\s*>([\\s\\S]*?)<\\s*\\/\\s*${t}\\s*>`,"iu").exec(e);return n?.[1]?.trim()||void 0}function readFunctionArgs(e){const t=[...e.matchAll(/([a-zA-Z_][\w.-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^,\s]+))/gu)];return t.length>0?Object.fromEntries(t.map(e=>[e[1],e[2]??e[3]??e[4]??""])):void 0}function readBalancedJsonObject(e,t){let n=0,r=!1,o=!1;for(let a=t;a<e.length;a+=1){const s=e[a];if(r)o="\\"===s&&!o,'"'!==s||o||(r=!1),"\\"!==s&&(o=!1);else if('"'===s&&(r=!0),"{"===s&&(n+=1),"}"===s&&(n-=1),0===n)return e.slice(t,a+1)}}function singleToolName(e){return 1===e.size?[...e][0]:void 0}function escapeRegexp(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ToolMessage } from "@langchain/core/messages";
|
|
2
|
+
import type { RuntimeAdapter } from "@stable-harness/core";
|
|
3
|
+
type AdapterRunInput = Parameters<RuntimeAdapter["run"]>[0];
|
|
4
|
+
export declare function validateSkillFileBuiltinCall(input: AdapterRunInput, toolId: string, request: {
|
|
5
|
+
toolCall?: {
|
|
6
|
+
id?: string;
|
|
7
|
+
args?: unknown;
|
|
8
|
+
};
|
|
9
|
+
}): ToolMessage<import("@langchain/core/messages").MessageStructure<import("@langchain/core/messages").MessageToolSet>> | undefined;
|
|
10
|
+
export {};
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ToolMessage as e}from"@langchain/core/messages";export function validateSkillFileBuiltinCall(t,l,r){const i=function readFilesystemTarget(e){const t=function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(e)?e:{};for(const e of["file_path","path","pattern","query"]){const l=t[e];if("string"==typeof l&&l.trim())return l.trim()}}(r.toolCall?.args);if(i&&function targetsRegisteredSkill(e,t){return[...e.workspace.skills.values()].some(l=>{const r=function virtualSkillDir(e,t){const l=function pathRelative(e,t){const l=e.split("/").filter(Boolean),r=t.split("/").filter(Boolean);if(!(r.length<l.length)){for(let e=0;e<l.length;e+=1)if(l[e]!==r[e])return;return r.slice(l.length).join("/")}}(e,t);if(void 0===l)return;const r=l.split("/").filter(Boolean),i=r.lastIndexOf("skills");return i<0?`/${r.slice(0,-1).join("/")}`:`/${r.slice(0,i+2).join("/")}`}(e.workspace.root,l.path);return!!r&&function pathMatches(e,t){const l=t.replace(/\/+$/u,"");return e===l||e.startsWith(`${l}/`)||e.includes(`${l}/`)||e.includes("SKILL.md")}(t,r)})}(t,i))return new e({tool_call_id:r.toolCall?.id??`stable-harness-${l}-skill-policy`,name:l,status:"error",content:[`Filesystem builtin tool '${l}' targeted registered skill inventory: ${i}.`,"Skills are already registered with the backend and are not evidence files for the user request.","Do not read, list, glob, or grep SKILL.md files or skill directories.","Continue with the declared agent tools, the skill behavior already loaded by the backend, and the evidence already collected."].join(" ")})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export async function streamDeepAgentResult(t,e,r){let n,o="";for await(const a of e){const e=readStreamDelta(a);e&&(o+=e,t.emit({type:"runtime.adapter.event",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,event:{adapter:"deepagents",phase:"agent.output.delta",text:e}}));const d=readStreamFinalOutput(a,r);d&&(n=d)}return n??o}function readStreamDelta(t){const e=isRecord(t)?t:{};if("on_chat_model_stream"===e.event)return function readChunkText(t){const e=t?.content;return"string"==typeof e?e:Array.isArray(e)&&e.map(readContentPartText).filter(Boolean).join("")||void 0}(readRecord(readRecord(e.data)?.chunk))}function readContentPartText(t){if("string"==typeof t)return t;const e=isRecord(t)?t:{};return"string"==typeof e.text&&e.text.trim()?e.text:void 0}function readStreamFinalOutput(t,e){const r=isRecord(t)?t:{};if("on_chain_end"!==r.event)return;const n=readRecord(r.data)?.output;return e(n)||void 0}function readRecord(t){return isRecord(t)?t:void 0}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isToolRepeatLimitReached as e}from"@stable-harness/core";export function filterRepeatLimitedTools(t,i){return t&&i?t.filter(t=>"string"!=typeof t.name||!e(t.name,i)):t}
|
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function traceProjectionForBuiltinTool(toolId: string, phase: "agent.tool.start" | "agent.tool.result", args: unknown): {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createDelegationTraceProjection as t,createPlanTraceProjection as e}from"@stable-harness/core";export function traceProjectionForBuiltinTool(r,o,n){return"task"===r?t("agent.tool.start"===o?"delegation.start":"delegation.completed",{subagentType:readTaskSubagentType(n)}):"write_todos"===r&&"agent.tool.result"===o?e("plan.updated",{todos:readTodoArgs(n)}):{}}function readTaskSubagentType(t){const e=isRecord(t)?t:{};return readString(e.subagent_type)??readString(e.subagentType)}function readTodoArgs(t){const e=isRecord(t)?t:{};return Array.isArray(e.todos)?e.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}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CompiledWorkspace, MemoryMaintenanceResult, MemoryMaintenanceTarget, MemoryMaintenanceTargetInput } from "@stable-harness/core";
|
|
2
|
+
export declare function resolveDeepAgentsNativeMemories(workspace: CompiledWorkspace): import("@stable-harness/core").WorkspaceMemory[];
|
|
3
|
+
export declare function createDeepAgentsMemoryMaintenanceTarget(input?: {
|
|
4
|
+
run?: (context: MemoryMaintenanceTargetInput) => Promise<MemoryMaintenanceResult>;
|
|
5
|
+
}): MemoryMaintenanceTarget;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{resolveEnabledMemories as e}from"@stable-harness/core";export function resolveDeepAgentsNativeMemories(r){return!1===function readMemoryFlag(e,r,n){const o=readRecord(e[r])??readRecord(e[r.toLowerCase()]);return"boolean"==typeof o?.[n]?o[n]:void 0}(r.runtime.memory??{},"deepagentsMem","read")?[]:e(r,"all")}export function createDeepAgentsMemoryMaintenanceTarget(e={}){return{name:"deepagentsMem",run:async r=>e.run?e.run(r):{operations:[],metadata:{skipped:!0,reason:"No DeepAgents memory maintainer configured"}}}}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ChatOllama } from "@langchain/ollama";
|
|
2
|
+
import { ChatOpenAI } from "@langchain/openai";
|
|
3
|
+
import type { WorkspaceModel } from "@stable-harness/core";
|
|
4
|
+
export declare function createBackendModel(model: WorkspaceModel): string | ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions> | ChatOllama;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ChatOllama as e}from"@langchain/ollama";import{ChatOpenAI as r}from"@langchain/openai";export function createBackendModel(r){return"ollama"===r.provider?function usesOpenAiCompatibleToolCalling(e){const r=readString(e.config?.toolCallingMode);return"openai-compatible"===r||"structured"===r}(r)?createOpenAiCompatibleModel({...r,config:{...r.config,baseURL:readOllamaOpenAiBaseUrl(r.config?.baseURL??r.config?.baseUrl)}}):function createOllamaModel(r){return new e(pruneUndefined({model:r.model,baseUrl:readString(r.config?.baseUrl),temperature:readNumber(r.config?.temperature),numCtx:readNumber(r.config?.numCtx),numPredict:readNumber(r.config?.numPredict),timeout:readNumber(r.config?.timeout),think:"boolean"==typeof r.config?.think?r.config.think:void 0}))}(r):"openai-compatible"===r.provider?createOpenAiCompatibleModel(r):r.model}function createOpenAiCompatibleModel(e){return new r(pruneUndefined({model:e.model,apiKey:readString(e.config?.apiKey),temperature:readNumber(e.config?.temperature),maxTokens:readNumber(e.config?.maxTokens)??readNumber(e.config?.numPredict),timeout:readNumber(e.config?.timeout),modelKwargs:readOpenAiCompatibleModelKwargs(e.config),configuration:pruneUndefined({baseURL:readString(e.config?.baseURL)??readString(e.config?.baseUrl),defaultHeaders:readStringRecord(e.config?.headers)})}))}function readOpenAiCompatibleModelKwargs(e){const r={...readRecord(e?.extraBody),...readRecord(e?.modelKwargs)},n=pruneUndefined({...r,think:r.think??("boolean"==typeof e?.think?e.think:void 0),num_ctx:r.num_ctx??readNumber(e?.numCtx),num_predict:r.num_predict??readNumber(e?.numPredict)});return Object.keys(n).length>0?n:void 0}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 readStringRecord(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const r=Object.entries(e).filter(e=>"string"==typeof e[1]);return r.length>0?Object.fromEntries(r):void 0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?{}:e}function readOllamaOpenAiBaseUrl(e){const r=readString(e);if(!r)return;const n=r.replace(/\/+$/u,"");return n.endsWith("/v1")?n:`${n}/v1`}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{modelRetryMiddleware as e,toolRetryMiddleware as t}from"langchain";export function createDeepAgentsRetryMiddleware(r){const n=[],o=readRetryOptions(r?.model);o&&n.push(e(o));const i=function readToolRetryOptions(e){const t=readRetryOptions(e);if(!t)return;const r=Array.isArray(e?.tools)?e.tools.filter(e=>"string"==typeof e&&e.trim().length>0):void 0;return pruneUndefined({...t,tools:r})}(r?.tools);return i&&n.push(t(i)),n}function readRetryOptions(e){var t;if(e?.enabled)return pruneUndefined({maxRetries:readNonNegativeNumber(e.maxRetries),backoffFactor:readNonNegativeNumber(e.backoffFactor),initialDelayMs:readNonNegativeNumber(e.initialDelayMs),maxDelayMs:readNonNegativeNumber(e.maxDelayMs),jitter:"boolean"==typeof e.jitter?e.jitter:void 0,retryOn:createRetryPredicate(e.retryOn),onFailure:(t=e.onFailure,"continue"===t||"error"===t?t:void 0)})}function readNonNegativeNumber(e){return"number"==typeof e&&Number.isFinite(e)&&e>=0?e:void 0}function createRetryPredicate(e){const t=function readRetryReasons(e){const t=new Set(["timeout","network","rateLimit","serverError"]);if(!Array.isArray(e))return[...t];const r=e.filter(e=>t.has(e));return r.length>0?r:[...t]}(e);return e=>t.some(t=>matchesRetryReason(e,t))}function matchesRetryReason(e,t){const r=isRecord(e)?e:{},n=function readStatus(e){const t=e.status??e.statusCode??e.code;return"number"==typeof t?t:Number.isInteger(Number(t))?Number(t):void 0}(r),o=`${String(r.name??"")} ${String(r.code??"")} ${String(r.message??e)}`,i=r.cause;return("timeout"===t?/timeout|timedout|etimedout|abort/i.test(o):"network"===t?/network|fetch failed|terminated|connection error|eof|econnreset|econnrefused|enotfound|eai_again/i.test(o):"rateLimit"===t?429===n||/rate.?limit|too many requests/i.test(o):"serverError"===t&&Boolean(n&&n>=500&&n<600))||isRecord(i)&&matchesRetryReason(i,t)}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function pruneUndefined(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>void 0!==e))}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RuntimeAdapterContext, RuntimeAdapterResult } from "@stable-harness/core";
|
|
2
|
+
export type DeepAgentFactory = (params?: Record<string, unknown>) => {
|
|
3
|
+
invoke(input: Record<string, unknown>, options?: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
streamEvents?(input: Record<string, unknown>, options?: Record<string, unknown>): AsyncIterable<unknown>;
|
|
5
|
+
};
|
|
6
|
+
export type DeepAgentsModule = {
|
|
7
|
+
createDeepAgent?: unknown;
|
|
8
|
+
FilesystemBackend?: new (options: {
|
|
9
|
+
rootDir: string;
|
|
10
|
+
}) => unknown;
|
|
11
|
+
};
|
|
12
|
+
export type DeepAgentsAdapterRunner = (input: RuntimeAdapterContext) => Promise<RuntimeAdapterResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stable-harness/adapter-deepagents",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist/**/*.js",
|
|
7
|
+
"dist/**/*.d.ts",
|
|
8
|
+
"package.json"
|
|
9
|
+
],
|
|
10
|
+
"main": "dist/src/index.js",
|
|
11
|
+
"types": "dist/src/index.d.ts",
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@botbotgo/better-call": "^0.1.58",
|
|
14
|
+
"@langchain/core": "^1.1.43",
|
|
15
|
+
"@langchain/ollama": "^1.2.7",
|
|
16
|
+
"@langchain/openai": "^1.4.5",
|
|
17
|
+
"@stable-harness/core": "0.0.1",
|
|
18
|
+
"deepagents": "^1.9.1",
|
|
19
|
+
"langchain": "^1.3.1"
|
|
20
|
+
},
|
|
21
|
+
"peerDependenciesMeta": {
|
|
22
|
+
"deepagents": {
|
|
23
|
+
"optional": true
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type RuntimeOutput, type RuntimeWorkflowAdapterInput } from "@stable-harness/core";
|
|
2
|
+
import type { LangGraphWorkflowAdapterOptions } from "./types.js";
|
|
3
|
+
export declare function runLangGraphWorkflow(input: RuntimeWorkflowAdapterInput, options: LangGraphWorkflowAdapterOptions, adapterName: string): Promise<RuntimeOutput>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Annotation as o,END as e,START as t,StateGraph as n}from"@langchain/langgraph";import{compileWorkflowPlan as r}from"@stable-harness/core";import{resolveSkillProvider as a}from"./skill-providers.js";export async function runLangGraphWorkflow(a,d,i){!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(a.workflow));const s=function compileLangGraph(a,d,i){let s=new n(function createStateAnnotation(){return o.Root({input:o,outputs:o({reducer:(o,e)=>({...o,...e}),default:()=>({})}),trace:o({reducer:(o,e)=>[...o,...e],default:()=>[]})})}());for(const o of a.workflow.nodes)s=s.addNode(o.id,async e=>runNode({input:a,node:o,state:e,options:d,adapterName:i}));s=s.addEdge(t,a.workflow.entry??a.workflow.nodes[0].id),s=function addStaticEdges(o,e){for(const t of e.workflow.edges)t.condition||(o=o.addEdge(t.from,t.to));return o}(s,a),s=function addConditionalEdges(o,e,t){for(const[n,r]of function conditionalEdgesBySource(o){const e=new Map;for(const t of o.workflow.edges){if(!t.condition)continue;const o=e.get(t.from)??[];o.push({condition:t.condition,to:t.to}),e.set(t.from,o)}return e}(e)){const a=t.conditionalRouters?.[n];if(!a)throw new Error(`LangGraph workflow conditional edges from ${n} require a conditional router`);o=o.addConditionalEdges(n,async o=>a({...e,from:n,edges:r,state:o}),Object.fromEntries(r.map(o=>[o.condition,o.to])))}return o}(s,a,d);for(const o of r(a.workflow).terminalNodes)s=s.addEdge(o,e);return s.compile()}(a,d,i);a.emit({adapter:i,phase:"agent.langgraph.invoke",workflowId:a.workflow.id});const u=await s.invoke({input:a.request.input,outputs:{},trace:[]});return{text:stringifyWorkflowOutput(u),metadata:{workflowId:a.workflow.id,adapter:i,outputs:u.outputs,trace:u.trace}}}async function runNode(o){const e=await function resolveNodeHandler(o,e){const t=e.nodeHandlers?.[o.id]??e.nodeHandlers?.[o.use];if(t)return t;const n=function parseNodeUse(o){const e=o.indexOf(".");if(!(e<=0||e===o.length-1))return{kind:o.slice(0,e),id:o.slice(e+1)}}(o.use);if("workflows"===n?.kind&&e.enableSubworkflows)return o=>async function runSubworkflow(o,e){const t=o.workspace.workflows.get(o.id);if(!t)throw new Error(`LangGraph subworkflow is not defined: ${o.id}`);const n=function readSubworkflowDepth(o){const e=o?.subworkflowDepth;return"number"==typeof e&&Number.isFinite(e)?e:0}(o.request.metadata),r=e.maxSubworkflowDepth??8;if(n>=r)throw new Error(`LangGraph subworkflow depth exceeded ${r}`);return(await runLangGraphWorkflow({...o,workflow:t,request:{...o.request,input:o.state,metadata:{...o.request.metadata,subworkflowDepth:n+1}}},e,e.name??"langgraph")).text}({...o,id:n.id},e);const r=n?e.nodeResolvers?.[n.kind]:void 0;if(r&&n)return o=>r({...o,kind:n.kind,id:n.id});const d="skills"===n?.kind?a(e):void 0;if(d&&n)return o=>d.resolve({...o,kind:n.kind,id:n.id});const i=e.defaultNodeHandler;if(i)return i;throw new Error(`LangGraph workflow node ${o.id} (${o.use}) has no handler or resolver`)}(o.node,o.options)({...o.input,node:o.node,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 e=o.trace.at(-1)?.output;return"string"==typeof e?e:JSON.stringify(e??o.outputs)}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RuntimeWorkflowAdapter } from "@stable-harness/core";
|
|
2
|
+
import { createLangGraphRuntimeAdapter } from "./runtime.js";
|
|
3
|
+
import { createDeepAgentsMiddlewareSkillProvider, createRegistrySkillResolverProvider } from "./skill-providers.js";
|
|
4
|
+
import type { LangGraphWorkflowAdapterOptions } from "./types.js";
|
|
5
|
+
export type { LangGraphConditionalRouter, LangGraphConditionalRouterInput, LangGraphNodeHandler, LangGraphNodeHandlerInput, LangGraphNodeResolver, LangGraphNodeResolverInput, LangGraphSkillMiddlewareProvider, LangGraphSkillMiddlewareProviderInput, LangGraphSkillResolverProvider, LangGraphWorkflowAdapterOptions, LangGraphWorkflowState, LangGraphWorkflowTraceEntry, } from "./types.js";
|
|
6
|
+
export type { LangGraphRegistrySkillOutput } from "./skill-providers.js";
|
|
7
|
+
export { createDeepAgentsMiddlewareSkillProvider, createLangGraphRuntimeAdapter, createRegistrySkillResolverProvider, };
|
|
8
|
+
export declare function createLangGraphWorkflowAdapter(options?: LangGraphWorkflowAdapterOptions): RuntimeWorkflowAdapter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{runLangGraphWorkflow as r}from"./graph.js";import{createLangGraphRuntimeAdapter as e}from"./runtime.js";import{createDeepAgentsMiddlewareSkillProvider as a,createRegistrySkillResolverProvider as t}from"./skill-providers.js";export{a as createDeepAgentsMiddlewareSkillProvider,e as createLangGraphRuntimeAdapter,t as createRegistrySkillResolverProvider};export function createLangGraphWorkflowAdapter(e={}){const a=e.name??"langgraph";return{name:a,run:t=>r(t,e,a)}}
|
|
@@ -0,0 +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:r=>async function runLangGraphAgent(n,t,r){return e({workspace:n.workspace,workflow:workflowFromAgent(n.agent,r),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,r)}(r,n,t)}}function workflowFromAgent(e,n){const t=e.edges??[],r=t.length>0?agentNodes(e):agentNodes(e).slice(0,1);return function validateAgentGraph(e,n){const t=new Set;for(const r of n){if(t.has(r.id))throw new Error(`LangGraph agent ${e.id} has duplicate graph node ${r.id}`);t.add(r.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},r),{id:e.id,...e.description?{description:e.description}:{},...e.sourcePath?{sourcePath:e.sourcePath}:{},adapter:n,entry:readAgentEntry(e,r),nodes:r,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}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { LangGraphSkillMiddlewareProvider, LangGraphSkillResolverProvider } from "./types.js";
|
|
2
|
+
type RegistrySkillResolverOptions = {
|
|
3
|
+
includeContent?: boolean;
|
|
4
|
+
maxBytes?: number;
|
|
5
|
+
};
|
|
6
|
+
type DeepAgentsSkillsModule = {
|
|
7
|
+
createSkillsMiddleware?: (options: Record<string, unknown>) => unknown;
|
|
8
|
+
FilesystemBackend?: new (options: {
|
|
9
|
+
rootDir: string;
|
|
10
|
+
}) => unknown;
|
|
11
|
+
};
|
|
12
|
+
type DeepAgentsMiddlewareProviderOptions = {
|
|
13
|
+
backend?: unknown;
|
|
14
|
+
sources?: string[];
|
|
15
|
+
importDeepAgents?: () => Promise<DeepAgentsSkillsModule>;
|
|
16
|
+
};
|
|
17
|
+
export type LangGraphRegistrySkillOutput = {
|
|
18
|
+
id: string;
|
|
19
|
+
path: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
allowedTools: string[];
|
|
22
|
+
content?: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function createRegistrySkillResolverProvider(options?: RegistrySkillResolverOptions): LangGraphSkillResolverProvider;
|
|
25
|
+
export declare function createDeepAgentsMiddlewareSkillProvider(options?: DeepAgentsMiddlewareProviderOptions): LangGraphSkillMiddlewareProvider;
|
|
26
|
+
export declare function resolveSkillProvider(options: {
|
|
27
|
+
skillProvider?: LangGraphSkillResolverProvider | false;
|
|
28
|
+
}): LangGraphSkillResolverProvider | undefined;
|
|
29
|
+
export {};
|
|
@@ -0,0 +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 i=await async function resolveWorkspaceSkill(e){const r=e.workspace.skills.get(e.id);if(r)return r;const i=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:i.ok?"repaired":"blocked",diagnostic:{layer:"skill",owner:"protocol_adapter",originalId:i.diagnostics?.originalId??e.id,repairedId:i.ok?i.id:i.diagnostics?.repairedId,candidateIds:[...e.workspace.skills.keys()],...i.ok?{}:{reason:i.reason},matchSource:i.diagnostics?.matchSource,confidence:i.diagnostics?.confidence}}),i.ok?e.workspace.skills.get(i.id):void 0}(e);if(!i)throw new Error(`LangGraph skill resolver cannot find skill ${e.id}`);return{id:i.id,path:i.path,...i.description?{description:i.description}:{},allowedTools:i.allowedTools,...!1===r.includeContent?{}:{content:await readSkillContent(i,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),i=t.createSkillsMiddleware;if("function"!=typeof i)throw new Error("deepagents does not export createSkillsMiddleware");return i({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 i=await e(r.path,"utf8");if(Buffer.byteLength(i,"utf8")>t)throw new Error(`Skill ${r.id} exceeds registry resolver size limit of ${t} bytes`);return i}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([...(i=e.agent,i?.skills??[]),...skillIdsFromWorkflow(e)]);var i;const o=new Set;for(const i of t){const t=e.workspace.skills.get(i);t&&o.add(toPosixPath(r.relative(e.workspace.root,r.dirname(r.dirname(t.path)))))}return[...o].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("/")}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { RuntimeWorkflowAdapterInput, WorkspaceAgent, WorkspaceWorkflowNode } from "@stable-harness/core";
|
|
2
|
+
export type LangGraphWorkflowState = {
|
|
3
|
+
input?: unknown;
|
|
4
|
+
outputs: Record<string, unknown>;
|
|
5
|
+
trace: LangGraphWorkflowTraceEntry[];
|
|
6
|
+
};
|
|
7
|
+
export type LangGraphWorkflowTraceEntry = {
|
|
8
|
+
nodeId: string;
|
|
9
|
+
use: string;
|
|
10
|
+
output: unknown;
|
|
11
|
+
};
|
|
12
|
+
export type LangGraphNodeHandlerInput = RuntimeWorkflowAdapterInput & {
|
|
13
|
+
node: WorkspaceWorkflowNode;
|
|
14
|
+
state: LangGraphWorkflowState;
|
|
15
|
+
};
|
|
16
|
+
export type LangGraphNodeHandler = (input: LangGraphNodeHandlerInput) => Promise<unknown> | unknown;
|
|
17
|
+
export type LangGraphNodeResolverInput = LangGraphNodeHandlerInput & {
|
|
18
|
+
kind: string;
|
|
19
|
+
id: string;
|
|
20
|
+
};
|
|
21
|
+
export type LangGraphNodeResolver = (input: LangGraphNodeResolverInput) => Promise<unknown> | unknown;
|
|
22
|
+
export type LangGraphSkillResolverProvider = {
|
|
23
|
+
name: string;
|
|
24
|
+
resolve(input: LangGraphNodeResolverInput): Promise<unknown> | unknown;
|
|
25
|
+
};
|
|
26
|
+
export type LangGraphSkillMiddlewareProviderInput = RuntimeWorkflowAdapterInput & {
|
|
27
|
+
agent?: WorkspaceAgent;
|
|
28
|
+
};
|
|
29
|
+
export type LangGraphSkillMiddlewareProvider = {
|
|
30
|
+
name: string;
|
|
31
|
+
createMiddleware(input: LangGraphSkillMiddlewareProviderInput): Promise<unknown> | unknown;
|
|
32
|
+
};
|
|
33
|
+
export type LangGraphConditionalRouterInput = RuntimeWorkflowAdapterInput & {
|
|
34
|
+
from: string;
|
|
35
|
+
edges: Array<{
|
|
36
|
+
condition: string;
|
|
37
|
+
to: string;
|
|
38
|
+
}>;
|
|
39
|
+
state: LangGraphWorkflowState;
|
|
40
|
+
};
|
|
41
|
+
export type LangGraphConditionalRouter = (input: LangGraphConditionalRouterInput) => Promise<string> | string;
|
|
42
|
+
export type LangGraphWorkflowAdapterOptions = {
|
|
43
|
+
name?: string;
|
|
44
|
+
nodeHandlers?: Record<string, LangGraphNodeHandler>;
|
|
45
|
+
nodeResolvers?: Record<string, LangGraphNodeResolver>;
|
|
46
|
+
skillProvider?: LangGraphSkillResolverProvider | false;
|
|
47
|
+
defaultNodeHandler?: LangGraphNodeHandler;
|
|
48
|
+
conditionalRouters?: Record<string, LangGraphConditionalRouter>;
|
|
49
|
+
enableSubworkflows?: boolean;
|
|
50
|
+
maxSubworkflowDepth?: number;
|
|
51
|
+
};
|
|
52
|
+
export type LangGraphCompiled = {
|
|
53
|
+
invoke(input: LangGraphWorkflowState): Promise<LangGraphWorkflowState>;
|
|
54
|
+
};
|
|
55
|
+
export type LangGraphBuilder = {
|
|
56
|
+
addNode(name: string, handler: (state: LangGraphWorkflowState) => Promise<Partial<LangGraphWorkflowState>>): LangGraphBuilder;
|
|
57
|
+
addEdge(from: string, to: string): LangGraphBuilder;
|
|
58
|
+
addConditionalEdges(from: string, router: (state: LangGraphWorkflowState) => Promise<string>, pathMap: Record<string, string>): LangGraphBuilder;
|
|
59
|
+
compile(): LangGraphCompiled;
|
|
60
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stable-harness/adapter-langgraph",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist/**/*.js",
|
|
7
|
+
"dist/**/*.d.ts",
|
|
8
|
+
"package.json"
|
|
9
|
+
],
|
|
10
|
+
"main": "dist/src/index.js",
|
|
11
|
+
"types": "dist/src/index.d.ts",
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@langchain/langgraph": "^1.3.0",
|
|
14
|
+
"@stable-harness/core": "0.0.1"
|
|
15
|
+
}
|
|
16
|
+
}
|