@weavelogic/knowledge-graph-agent 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +972 -303
- package/dist/_virtual/_commonjsHelpers.js +7 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/additionalItems.js +5 -0
- package/dist/_virtual/additionalItems.js.map +1 -0
- package/dist/_virtual/additionalProperties.js +5 -0
- package/dist/_virtual/additionalProperties.js.map +1 -0
- package/dist/_virtual/ajv.js +6 -0
- package/dist/_virtual/ajv.js.map +1 -0
- package/dist/_virtual/ajv2.js +5 -0
- package/dist/_virtual/ajv2.js.map +1 -0
- package/dist/_virtual/allOf.js +5 -0
- package/dist/_virtual/allOf.js.map +1 -0
- package/dist/_virtual/anyOf.js +5 -0
- package/dist/_virtual/anyOf.js.map +1 -0
- package/dist/_virtual/applicability.js +5 -0
- package/dist/_virtual/applicability.js.map +1 -0
- package/dist/_virtual/boolSchema.js +5 -0
- package/dist/_virtual/boolSchema.js.map +1 -0
- package/dist/_virtual/code.js +5 -0
- package/dist/_virtual/code.js.map +1 -0
- package/dist/_virtual/code2.js +5 -0
- package/dist/_virtual/code2.js.map +1 -0
- package/dist/_virtual/const.js +5 -0
- package/dist/_virtual/const.js.map +1 -0
- package/dist/_virtual/contains.js +5 -0
- package/dist/_virtual/contains.js.map +1 -0
- package/dist/_virtual/core.js +5 -0
- package/dist/_virtual/core.js.map +1 -0
- package/dist/_virtual/dataType.js +5 -0
- package/dist/_virtual/dataType.js.map +1 -0
- package/dist/_virtual/defaults.js +5 -0
- package/dist/_virtual/defaults.js.map +1 -0
- package/dist/_virtual/dependencies.js +5 -0
- package/dist/_virtual/dependencies.js.map +1 -0
- package/dist/_virtual/draft7.js +5 -0
- package/dist/_virtual/draft7.js.map +1 -0
- package/dist/_virtual/enum.js +5 -0
- package/dist/_virtual/enum.js.map +1 -0
- package/dist/_virtual/equal.js +5 -0
- package/dist/_virtual/equal.js.map +1 -0
- package/dist/_virtual/errors.js +5 -0
- package/dist/_virtual/errors.js.map +1 -0
- package/dist/_virtual/format.js +5 -0
- package/dist/_virtual/format.js.map +1 -0
- package/dist/_virtual/formats.js +5 -0
- package/dist/_virtual/formats.js.map +1 -0
- package/dist/_virtual/id.js +5 -0
- package/dist/_virtual/id.js.map +1 -0
- package/dist/_virtual/if.js +5 -0
- package/dist/_virtual/if.js.map +1 -0
- package/dist/_virtual/index.js +8 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index10.js +5 -0
- package/dist/_virtual/index10.js.map +1 -0
- package/dist/_virtual/index11.js +5 -0
- package/dist/_virtual/index11.js.map +1 -0
- package/dist/_virtual/index12.js +5 -0
- package/dist/_virtual/index12.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/_virtual/index3.js +5 -0
- package/dist/_virtual/index3.js.map +1 -0
- package/dist/_virtual/index4.js +5 -0
- package/dist/_virtual/index4.js.map +1 -0
- package/dist/_virtual/index5.js +5 -0
- package/dist/_virtual/index5.js.map +1 -0
- package/dist/_virtual/index6.js +5 -0
- package/dist/_virtual/index6.js.map +1 -0
- package/dist/_virtual/index7.js +5 -0
- package/dist/_virtual/index7.js.map +1 -0
- package/dist/_virtual/index8.js +5 -0
- package/dist/_virtual/index8.js.map +1 -0
- package/dist/_virtual/index9.js +5 -0
- package/dist/_virtual/index9.js.map +1 -0
- package/dist/_virtual/items.js +5 -0
- package/dist/_virtual/items.js.map +1 -0
- package/dist/_virtual/items2020.js +5 -0
- package/dist/_virtual/items2020.js.map +1 -0
- package/dist/_virtual/keyword.js +5 -0
- package/dist/_virtual/keyword.js.map +1 -0
- package/dist/_virtual/limit.js +5 -0
- package/dist/_virtual/limit.js.map +1 -0
- package/dist/_virtual/limitItems.js +5 -0
- package/dist/_virtual/limitItems.js.map +1 -0
- package/dist/_virtual/limitLength.js +5 -0
- package/dist/_virtual/limitLength.js.map +1 -0
- package/dist/_virtual/limitNumber.js +5 -0
- package/dist/_virtual/limitNumber.js.map +1 -0
- package/dist/_virtual/limitProperties.js +5 -0
- package/dist/_virtual/limitProperties.js.map +1 -0
- package/dist/_virtual/metadata.js +5 -0
- package/dist/_virtual/metadata.js.map +1 -0
- package/dist/_virtual/multipleOf.js +5 -0
- package/dist/_virtual/multipleOf.js.map +1 -0
- package/dist/_virtual/names.js +5 -0
- package/dist/_virtual/names.js.map +1 -0
- package/dist/_virtual/not.js +5 -0
- package/dist/_virtual/not.js.map +1 -0
- package/dist/_virtual/oneOf.js +5 -0
- package/dist/_virtual/oneOf.js.map +1 -0
- package/dist/_virtual/pattern.js +5 -0
- package/dist/_virtual/pattern.js.map +1 -0
- package/dist/_virtual/patternProperties.js +5 -0
- package/dist/_virtual/patternProperties.js.map +1 -0
- package/dist/_virtual/prefixItems.js +5 -0
- package/dist/_virtual/prefixItems.js.map +1 -0
- package/dist/_virtual/properties.js +5 -0
- package/dist/_virtual/properties.js.map +1 -0
- package/dist/_virtual/propertyNames.js +5 -0
- package/dist/_virtual/propertyNames.js.map +1 -0
- package/dist/_virtual/ref.js +5 -0
- package/dist/_virtual/ref.js.map +1 -0
- package/dist/_virtual/ref_error.js +5 -0
- package/dist/_virtual/ref_error.js.map +1 -0
- package/dist/_virtual/required.js +5 -0
- package/dist/_virtual/required.js.map +1 -0
- package/dist/_virtual/resolve.js +5 -0
- package/dist/_virtual/resolve.js.map +1 -0
- package/dist/_virtual/rules.js +5 -0
- package/dist/_virtual/rules.js.map +1 -0
- package/dist/_virtual/scope.js +5 -0
- package/dist/_virtual/scope.js.map +1 -0
- package/dist/_virtual/subschema.js +5 -0
- package/dist/_virtual/subschema.js.map +1 -0
- package/dist/_virtual/thenElse.js +5 -0
- package/dist/_virtual/thenElse.js.map +1 -0
- package/dist/_virtual/types.js +5 -0
- package/dist/_virtual/types.js.map +1 -0
- package/dist/_virtual/ucs2length.js +5 -0
- package/dist/_virtual/ucs2length.js.map +1 -0
- package/dist/_virtual/uniqueItems.js +5 -0
- package/dist/_virtual/uniqueItems.js.map +1 -0
- package/dist/_virtual/uri.js +5 -0
- package/dist/_virtual/uri.js.map +1 -0
- package/dist/_virtual/util.js +5 -0
- package/dist/_virtual/util.js.map +1 -0
- package/dist/_virtual/validation_error.js +5 -0
- package/dist/_virtual/validation_error.js.map +1 -0
- package/dist/agents/analyst-agent.d.ts +230 -0
- package/dist/agents/analyst-agent.d.ts.map +1 -0
- package/dist/agents/analyst-agent.js +793 -0
- package/dist/agents/analyst-agent.js.map +1 -0
- package/dist/agents/architect-agent.d.ts +248 -0
- package/dist/agents/architect-agent.d.ts.map +1 -0
- package/dist/agents/architect-agent.js +685 -0
- package/dist/agents/architect-agent.js.map +1 -0
- package/dist/agents/base-agent.d.ts +169 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +441 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/coder-agent.d.ts +191 -0
- package/dist/agents/coder-agent.d.ts.map +1 -0
- package/dist/agents/coder-agent.js +1008 -0
- package/dist/agents/coder-agent.js.map +1 -0
- package/dist/agents/index.d.ts +18 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +40 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +213 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +419 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/researcher-agent.d.ts +226 -0
- package/dist/agents/researcher-agent.d.ts.map +1 -0
- package/dist/agents/researcher-agent.js +572 -0
- package/dist/agents/researcher-agent.js.map +1 -0
- package/dist/agents/rules-engine.d.ts +320 -0
- package/dist/agents/rules-engine.d.ts.map +1 -0
- package/dist/agents/rules-engine.js +552 -0
- package/dist/agents/rules-engine.js.map +1 -0
- package/dist/agents/tester-agent.d.ts +219 -0
- package/dist/agents/tester-agent.d.ts.map +1 -0
- package/dist/agents/tester-agent.js +683 -0
- package/dist/agents/tester-agent.js.map +1 -0
- package/dist/agents/types.d.ts +425 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +57 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/audit/config.d.ts +150 -0
- package/dist/audit/config.d.ts.map +1 -0
- package/dist/audit/config.js +111 -0
- package/dist/audit/config.js.map +1 -0
- package/dist/audit/index.d.ts +38 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/services/audit-chain.d.ts +276 -0
- package/dist/audit/services/audit-chain.d.ts.map +1 -0
- package/dist/audit/services/audit-chain.js +502 -0
- package/dist/audit/services/audit-chain.js.map +1 -0
- package/dist/audit/services/index.d.ts +11 -0
- package/dist/audit/services/index.d.ts.map +1 -0
- package/dist/audit/services/syndication.d.ts +334 -0
- package/dist/audit/services/syndication.d.ts.map +1 -0
- package/dist/audit/services/syndication.js +589 -0
- package/dist/audit/services/syndication.js.map +1 -0
- package/dist/audit/types.d.ts +453 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/caching/index.d.ts +55 -0
- package/dist/caching/index.d.ts.map +1 -0
- package/dist/caching/index.js +206 -0
- package/dist/caching/index.js.map +1 -0
- package/dist/caching/lru-cache.d.ts +254 -0
- package/dist/caching/lru-cache.d.ts.map +1 -0
- package/dist/caching/types.d.ts +95 -0
- package/dist/caching/types.d.ts.map +1 -0
- package/dist/chunking/chunker.d.ts +94 -0
- package/dist/chunking/chunker.d.ts.map +1 -0
- package/dist/chunking/index.d.ts +125 -0
- package/dist/chunking/index.d.ts.map +1 -0
- package/dist/chunking/index.js +283 -0
- package/dist/chunking/index.js.map +1 -0
- package/dist/chunking/types.d.ts +92 -0
- package/dist/chunking/types.d.ts.map +1 -0
- package/dist/cli/commands/audit.d.ts +21 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +621 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +11 -0
- package/dist/cli/commands/commit.d.ts.map +1 -0
- package/dist/cli/commands/commit.js +379 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +107 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/cultivate.d.ts +16 -0
- package/dist/cli/commands/cultivate.d.ts.map +1 -0
- package/dist/cli/commands/cultivate.js +254 -0
- package/dist/cli/commands/cultivate.js.map +1 -0
- package/dist/cli/commands/diagnostics.d.ts +8 -0
- package/dist/cli/commands/diagnostics.d.ts.map +1 -0
- package/dist/cli/commands/diagnostics.js +140 -0
- package/dist/cli/commands/diagnostics.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +13 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init-primitives.d.ts +19 -0
- package/dist/cli/commands/init-primitives.d.ts.map +1 -0
- package/dist/cli/commands/init-primitives.js +208 -0
- package/dist/cli/commands/init-primitives.js.map +1 -0
- package/dist/cli/commands/sop.d.ts +14 -0
- package/dist/cli/commands/sop.d.ts.map +1 -0
- package/dist/cli/commands/sop.js +598 -0
- package/dist/cli/commands/sop.js.map +1 -0
- package/dist/cli/commands/vector.d.ts +14 -0
- package/dist/cli/commands/vector.d.ts.map +1 -0
- package/dist/cli/commands/vector.js +429 -0
- package/dist/cli/commands/vector.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +12 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +471 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +66 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +153 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +141 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +136 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/types.d.ts +127 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/core/cache.d.ts +185 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +435 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/cultivation/deep-analyzer.d.ts +129 -0
- package/dist/cultivation/deep-analyzer.d.ts.map +1 -0
- package/dist/cultivation/deep-analyzer.js +322 -0
- package/dist/cultivation/deep-analyzer.js.map +1 -0
- package/dist/cultivation/index.d.ts +13 -0
- package/dist/cultivation/index.d.ts.map +1 -0
- package/dist/cultivation/seed-generator.d.ts +92 -0
- package/dist/cultivation/seed-generator.d.ts.map +1 -0
- package/dist/cultivation/seed-generator.js +1033 -0
- package/dist/cultivation/seed-generator.js.map +1 -0
- package/dist/cultivation/types.d.ts +230 -0
- package/dist/cultivation/types.d.ts.map +1 -0
- package/dist/database/schemas/index.d.ts +85 -0
- package/dist/database/schemas/index.d.ts.map +1 -0
- package/dist/generators/claude-md.d.ts +7 -0
- package/dist/generators/claude-md.d.ts.map +1 -1
- package/dist/generators/claude-md.js.map +1 -1
- package/dist/generators/docs-init.d.ts +6 -0
- package/dist/generators/docs-init.d.ts.map +1 -1
- package/dist/generators/docs-init.js.map +1 -1
- package/dist/health/checks.d.ts +135 -0
- package/dist/health/checks.d.ts.map +1 -0
- package/dist/health/index.d.ts +119 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +191 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/monitor.d.ts +146 -0
- package/dist/health/monitor.d.ts.map +1 -0
- package/dist/health/types.d.ts +135 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/auto-commit.d.ts +175 -0
- package/dist/integrations/auto-commit.d.ts.map +1 -0
- package/dist/integrations/auto-commit.js +399 -0
- package/dist/integrations/auto-commit.js.map +1 -0
- package/dist/integrations/git.d.ts +299 -0
- package/dist/integrations/git.d.ts.map +1 -0
- package/dist/integrations/git.js +465 -0
- package/dist/integrations/git.js.map +1 -0
- package/dist/mcp-server/bin.d.ts +11 -0
- package/dist/mcp-server/bin.d.ts.map +1 -0
- package/dist/mcp-server/handlers/index.d.ts +57 -0
- package/dist/mcp-server/handlers/index.d.ts.map +1 -0
- package/dist/mcp-server/handlers/index.js +235 -0
- package/dist/mcp-server/handlers/index.js.map +1 -0
- package/dist/mcp-server/index.d.ts +28 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/server.d.ts +133 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +280 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tools/agents/index.d.ts +10 -0
- package/dist/mcp-server/tools/agents/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/agents/list.d.ts +19 -0
- package/dist/mcp-server/tools/agents/list.d.ts.map +1 -0
- package/dist/mcp-server/tools/agents/spawn.d.ts +19 -0
- package/dist/mcp-server/tools/agents/spawn.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit/checkpoint.d.ts +58 -0
- package/dist/mcp-server/tools/audit/checkpoint.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit/checkpoint.js +73 -0
- package/dist/mcp-server/tools/audit/checkpoint.js.map +1 -0
- package/dist/mcp-server/tools/audit/index.d.ts +53 -0
- package/dist/mcp-server/tools/audit/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit/index.js +12 -0
- package/dist/mcp-server/tools/audit/index.js.map +1 -0
- package/dist/mcp-server/tools/audit/query.d.ts +58 -0
- package/dist/mcp-server/tools/audit/query.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit/query.js +125 -0
- package/dist/mcp-server/tools/audit/query.js.map +1 -0
- package/dist/mcp-server/tools/audit/sync.d.ts +58 -0
- package/dist/mcp-server/tools/audit/sync.d.ts.map +1 -0
- package/dist/mcp-server/tools/audit/sync.js +126 -0
- package/dist/mcp-server/tools/audit/sync.js.map +1 -0
- package/dist/mcp-server/tools/graph/generate.d.ts +21 -0
- package/dist/mcp-server/tools/graph/generate.d.ts.map +1 -0
- package/dist/mcp-server/tools/graph/index.d.ts +11 -0
- package/dist/mcp-server/tools/graph/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/graph/query.d.ts +22 -0
- package/dist/mcp-server/tools/graph/query.d.ts.map +1 -0
- package/dist/mcp-server/tools/graph/stats.d.ts +22 -0
- package/dist/mcp-server/tools/graph/stats.d.ts.map +1 -0
- package/dist/mcp-server/tools/health.d.ts +21 -0
- package/dist/mcp-server/tools/health.d.ts.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +16 -0
- package/dist/mcp-server/tools/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/registry.d.ts +90 -0
- package/dist/mcp-server/tools/registry.d.ts.map +1 -0
- package/dist/mcp-server/tools/registry.js +753 -0
- package/dist/mcp-server/tools/registry.js.map +1 -0
- package/dist/mcp-server/tools/search/index.d.ts +10 -0
- package/dist/mcp-server/tools/search/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/search/nodes.d.ts +22 -0
- package/dist/mcp-server/tools/search/nodes.d.ts.map +1 -0
- package/dist/mcp-server/tools/search/tags.d.ts +22 -0
- package/dist/mcp-server/tools/search/tags.d.ts.map +1 -0
- package/dist/mcp-server/tools/vector/index.d.ts +12 -0
- package/dist/mcp-server/tools/vector/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/vector/index.js +12 -0
- package/dist/mcp-server/tools/vector/index.js.map +1 -0
- package/dist/mcp-server/tools/vector/search.d.ts +41 -0
- package/dist/mcp-server/tools/vector/search.d.ts.map +1 -0
- package/dist/mcp-server/tools/vector/search.js +224 -0
- package/dist/mcp-server/tools/vector/search.js.map +1 -0
- package/dist/mcp-server/tools/vector/trajectory.d.ts +39 -0
- package/dist/mcp-server/tools/vector/trajectory.d.ts.map +1 -0
- package/dist/mcp-server/tools/vector/trajectory.js +170 -0
- package/dist/mcp-server/tools/vector/trajectory.js.map +1 -0
- package/dist/mcp-server/tools/vector/upsert.d.ts +44 -0
- package/dist/mcp-server/tools/vector/upsert.d.ts.map +1 -0
- package/dist/mcp-server/tools/vector/upsert.js +175 -0
- package/dist/mcp-server/tools/vector/upsert.js.map +1 -0
- package/dist/mcp-server/tools/workflow/index.d.ts +29 -0
- package/dist/mcp-server/tools/workflow/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/workflow/index.js +12 -0
- package/dist/mcp-server/tools/workflow/index.js.map +1 -0
- package/dist/mcp-server/tools/workflow/list.d.ts +41 -0
- package/dist/mcp-server/tools/workflow/list.d.ts.map +1 -0
- package/dist/mcp-server/tools/workflow/list.js +195 -0
- package/dist/mcp-server/tools/workflow/list.js.map +1 -0
- package/dist/mcp-server/tools/workflow/start.d.ts +40 -0
- package/dist/mcp-server/tools/workflow/start.d.ts.map +1 -0
- package/dist/mcp-server/tools/workflow/start.js +165 -0
- package/dist/mcp-server/tools/workflow/start.js.map +1 -0
- package/dist/mcp-server/tools/workflow/status.d.ts +38 -0
- package/dist/mcp-server/tools/workflow/status.d.ts.map +1 -0
- package/dist/mcp-server/tools/workflow/status.js +97 -0
- package/dist/mcp-server/tools/workflow/status.js.map +1 -0
- package/dist/mcp-server/types/index.d.ts +286 -0
- package/dist/mcp-server/types/index.d.ts.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/vault-sync.d.ts +212 -0
- package/dist/memory/vault-sync.d.ts.map +1 -0
- package/dist/memory/vault-sync.js +463 -0
- package/dist/memory/vault-sync.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +296 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +71 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js +26 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +407 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +1332 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js.map +1 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js +71 -0
- package/dist/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js.map +1 -0
- package/dist/node_modules/ajv/dist/ajv.js +84 -0
- package/dist/node_modules/ajv/dist/ajv.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/codegen/code.js +160 -0
- package/dist/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/codegen/index.js +728 -0
- package/dist/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/codegen/scope.js +152 -0
- package/dist/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/errors.js +131 -0
- package/dist/node_modules/ajv/dist/compile/errors.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/index.js +234 -0
- package/dist/node_modules/ajv/dist/compile/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/names.js +44 -0
- package/dist/node_modules/ajv/dist/compile/names.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/ref_error.js +22 -0
- package/dist/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/resolve.js +163 -0
- package/dist/node_modules/ajv/dist/compile/resolve.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/rules.js +35 -0
- package/dist/node_modules/ajv/dist/compile/rules.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/util.js +173 -0
- package/dist/node_modules/ajv/dist/compile/util.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/applicability.js +27 -0
- package/dist/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/boolSchema.js +58 -0
- package/dist/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/dataType.js +193 -0
- package/dist/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/defaults.js +43 -0
- package/dist/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/index.js +522 -0
- package/dist/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/keyword.js +126 -0
- package/dist/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
- package/dist/node_modules/ajv/dist/compile/validate/subschema.js +89 -0
- package/dist/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
- package/dist/node_modules/ajv/dist/core.js +628 -0
- package/dist/node_modules/ajv/dist/core.js.map +1 -0
- package/dist/node_modules/ajv/dist/refs/data.json.js +24 -0
- package/dist/node_modules/ajv/dist/refs/data.json.js.map +1 -0
- package/dist/node_modules/ajv/dist/refs/json-schema-draft-07.json.js +25 -0
- package/dist/node_modules/ajv/dist/refs/json-schema-draft-07.json.js.map +1 -0
- package/dist/node_modules/ajv/dist/runtime/equal.js +16 -0
- package/dist/node_modules/ajv/dist/runtime/equal.js.map +1 -0
- package/dist/node_modules/ajv/dist/runtime/ucs2length.js +30 -0
- package/dist/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
- package/dist/node_modules/ajv/dist/runtime/uri.js +16 -0
- package/dist/node_modules/ajv/dist/runtime/uri.js.map +1 -0
- package/dist/node_modules/ajv/dist/runtime/validation_error.js +20 -0
- package/dist/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +59 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +114 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/allOf.js +32 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +22 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/contains.js +100 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +103 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/if.js +75 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/index.js +68 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/items.js +64 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/items2020.js +43 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/not.js +36 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +64 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +81 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +22 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/properties.js +66 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +49 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +23 -0
- package/dist/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/code.js +140 -0
- package/dist/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/id.js +19 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/index.js +27 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/ref.js +132 -0
- package/dist/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/discriminator/index.js +114 -0
- package/dist/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/discriminator/types.js +18 -0
- package/dist/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/draft7.js +31 -0
- package/dist/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/format/format.js +95 -0
- package/dist/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/format/index.js +16 -0
- package/dist/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/metadata.js +27 -0
- package/dist/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/const.js +36 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/enum.js +56 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/index.js +52 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitItems.js +34 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitLength.js +39 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +37 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +34 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +33 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/pattern.js +34 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/required.js +89 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +75 -0
- package/dist/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
- package/dist/node_modules/ajv-formats/dist/formats.js +209 -0
- package/dist/node_modules/ajv-formats/dist/formats.js.map +1 -0
- package/dist/node_modules/ajv-formats/dist/index.js +51 -0
- package/dist/node_modules/ajv-formats/dist/index.js.map +1 -0
- package/dist/node_modules/ajv-formats/dist/limit.js +80 -0
- package/dist/node_modules/ajv-formats/dist/limit.js.map +1 -0
- package/dist/node_modules/fast-deep-equal/index.js +39 -0
- package/dist/node_modules/fast-deep-equal/index.js.map +1 -0
- package/dist/node_modules/fast-uri/index.js +261 -0
- package/dist/node_modules/fast-uri/index.js.map +1 -0
- package/dist/node_modules/fast-uri/lib/schemes.js +215 -0
- package/dist/node_modules/fast-uri/lib/schemes.js.map +1 -0
- package/dist/node_modules/fast-uri/lib/utils.js +261 -0
- package/dist/node_modules/fast-uri/lib/utils.js.map +1 -0
- package/dist/node_modules/json-schema-traverse/index.js +92 -0
- package/dist/node_modules/json-schema-traverse/index.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/errors.js +37 -0
- package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/iso.js +43 -0
- package/dist/node_modules/zod/v4/classic/iso.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.js +13 -0
- package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.js +688 -0
- package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/api.js +492 -0
- package/dist/node_modules/zod/v4/core/api.js.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.js +405 -0
- package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +58 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.js +38 -0
- package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +82 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +60 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.js +87 -0
- package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.js +52 -0
- package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.js +1283 -0
- package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +341 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.js +9 -0
- package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +2 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/string.js.map +1 -0
- package/dist/reasoning/index.d.ts +74 -0
- package/dist/reasoning/index.d.ts.map +1 -0
- package/dist/reasoning/index.js +124 -0
- package/dist/reasoning/index.js.map +1 -0
- package/dist/reasoning/tracker.d.ts +210 -0
- package/dist/reasoning/tracker.d.ts.map +1 -0
- package/dist/reasoning/types.d.ts +146 -0
- package/dist/reasoning/types.d.ts.map +1 -0
- package/dist/recovery/backup.d.ts +110 -0
- package/dist/recovery/backup.d.ts.map +1 -0
- package/dist/recovery/index.d.ts +70 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +186 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/integrity.d.ts +74 -0
- package/dist/recovery/integrity.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +94 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/services/index.d.ts +130 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +134 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/manager.d.ts +140 -0
- package/dist/services/manager.d.ts.map +1 -0
- package/dist/services/types.d.ts +106 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/watchers.d.ts +95 -0
- package/dist/services/watchers.d.ts.map +1 -0
- package/dist/sops/compliance-checker.d.ts +83 -0
- package/dist/sops/compliance-checker.d.ts.map +1 -0
- package/dist/sops/compliance-checker.js +399 -0
- package/dist/sops/compliance-checker.js.map +1 -0
- package/dist/sops/gap-analyzer.d.ts +124 -0
- package/dist/sops/gap-analyzer.d.ts.map +1 -0
- package/dist/sops/gap-analyzer.js +313 -0
- package/dist/sops/gap-analyzer.js.map +1 -0
- package/dist/sops/index.d.ts +14 -0
- package/dist/sops/index.d.ts.map +1 -0
- package/dist/sops/overlay-manager.d.ts +115 -0
- package/dist/sops/overlay-manager.d.ts.map +1 -0
- package/dist/sops/overlay-manager.js +394 -0
- package/dist/sops/overlay-manager.js.map +1 -0
- package/dist/sops/registry.d.ts +73 -0
- package/dist/sops/registry.d.ts.map +1 -0
- package/dist/sops/registry.js +919 -0
- package/dist/sops/registry.js.map +1 -0
- package/dist/sops/types.d.ts +377 -0
- package/dist/sops/types.d.ts.map +1 -0
- package/dist/sops/types.js +46 -0
- package/dist/sops/types.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +230 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +228 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/error-taxonomy.d.ts +149 -0
- package/dist/utils/error-taxonomy.d.ts.map +1 -0
- package/dist/utils/error-taxonomy.js +260 -0
- package/dist/utils/error-taxonomy.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +139 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +311 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/vector/config.d.ts +300 -0
- package/dist/vector/config.d.ts.map +1 -0
- package/dist/vector/config.js +124 -0
- package/dist/vector/config.js.map +1 -0
- package/dist/vector/index.d.ts +50 -0
- package/dist/vector/index.d.ts.map +1 -0
- package/dist/vector/services/index.d.ts +13 -0
- package/dist/vector/services/index.d.ts.map +1 -0
- package/dist/vector/services/trajectory-tracker.d.ts +405 -0
- package/dist/vector/services/trajectory-tracker.d.ts.map +1 -0
- package/dist/vector/services/trajectory-tracker.js +445 -0
- package/dist/vector/services/trajectory-tracker.js.map +1 -0
- package/dist/vector/services/vector-store.d.ts +339 -0
- package/dist/vector/services/vector-store.d.ts.map +1 -0
- package/dist/vector/services/vector-store.js +748 -0
- package/dist/vector/services/vector-store.js.map +1 -0
- package/dist/vector/types.d.ts +677 -0
- package/dist/vector/types.d.ts.map +1 -0
- package/dist/workflow/adapters/goap-adapter.d.ts +196 -0
- package/dist/workflow/adapters/goap-adapter.d.ts.map +1 -0
- package/dist/workflow/adapters/goap-adapter.js +706 -0
- package/dist/workflow/adapters/goap-adapter.js.map +1 -0
- package/dist/workflow/adapters/index.d.ts +10 -0
- package/dist/workflow/adapters/index.d.ts.map +1 -0
- package/dist/workflow/config.d.ts +135 -0
- package/dist/workflow/config.d.ts.map +1 -0
- package/dist/workflow/config.js +92 -0
- package/dist/workflow/config.js.map +1 -0
- package/dist/workflow/handlers/index.d.ts +9 -0
- package/dist/workflow/handlers/index.d.ts.map +1 -0
- package/dist/workflow/handlers/webhook-handlers.d.ts +397 -0
- package/dist/workflow/handlers/webhook-handlers.d.ts.map +1 -0
- package/dist/workflow/handlers/webhook-handlers.js +454 -0
- package/dist/workflow/handlers/webhook-handlers.js.map +1 -0
- package/dist/workflow/index.d.ts +42 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/services/index.d.ts +9 -0
- package/dist/workflow/services/index.d.ts.map +1 -0
- package/dist/workflow/services/workflow-service.d.ts +318 -0
- package/dist/workflow/services/workflow-service.d.ts.map +1 -0
- package/dist/workflow/services/workflow-service.js +577 -0
- package/dist/workflow/services/workflow-service.js.map +1 -0
- package/dist/workflow/types.d.ts +470 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/workflows/realtime-collab.d.ts +245 -0
- package/dist/workflow/workflows/realtime-collab.d.ts.map +1 -0
- package/dist/workflows/index.d.ts +11 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/registry.d.ts +118 -0
- package/dist/workflows/registry.d.ts.map +1 -0
- package/dist/workflows/registry.js +575 -0
- package/dist/workflows/registry.js.map +1 -0
- package/dist/workflows/types.d.ts +322 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +16 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger.js";
|
|
2
|
+
const logger = createLogger("syndication");
|
|
3
|
+
const DEFAULT_CONFIG = {
|
|
4
|
+
peers: [],
|
|
5
|
+
autoSync: false,
|
|
6
|
+
syncInterval: 5 * 60 * 1e3,
|
|
7
|
+
// 5 minutes
|
|
8
|
+
requestTimeout: 3e4,
|
|
9
|
+
// 30 seconds
|
|
10
|
+
maxEventsPerRequest: 1e3,
|
|
11
|
+
retryOnError: true,
|
|
12
|
+
maxRetries: 3,
|
|
13
|
+
retryBaseDelay: 1e3,
|
|
14
|
+
// 1 second
|
|
15
|
+
retryMaxDelay: 3e4
|
|
16
|
+
// 30 seconds
|
|
17
|
+
};
|
|
18
|
+
class SyndicationService {
|
|
19
|
+
config;
|
|
20
|
+
peers = /* @__PURE__ */ new Map();
|
|
21
|
+
syncTimer;
|
|
22
|
+
isRunning = false;
|
|
23
|
+
syncInProgress = false;
|
|
24
|
+
retryAttempts = /* @__PURE__ */ new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Create a new syndication service instance
|
|
27
|
+
*
|
|
28
|
+
* @param config - Configuration with required auditChain
|
|
29
|
+
*/
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = {
|
|
32
|
+
...DEFAULT_CONFIG,
|
|
33
|
+
...config
|
|
34
|
+
};
|
|
35
|
+
for (const endpoint of this.config.peers) {
|
|
36
|
+
const peerId = this.generatePeerId(endpoint);
|
|
37
|
+
this.peers.set(peerId, {
|
|
38
|
+
id: peerId,
|
|
39
|
+
endpoint,
|
|
40
|
+
status: "disconnected",
|
|
41
|
+
eventsReceived: 0,
|
|
42
|
+
eventsSent: 0,
|
|
43
|
+
errors: 0
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate a deterministic peer ID from endpoint URL
|
|
49
|
+
*
|
|
50
|
+
* @param endpoint - Peer endpoint URL
|
|
51
|
+
* @returns Generated peer ID
|
|
52
|
+
*/
|
|
53
|
+
generatePeerId(endpoint) {
|
|
54
|
+
let hash = 0;
|
|
55
|
+
for (let i = 0; i < endpoint.length; i++) {
|
|
56
|
+
const char = endpoint.charCodeAt(i);
|
|
57
|
+
hash = (hash << 5) - hash + char;
|
|
58
|
+
hash = hash & hash;
|
|
59
|
+
}
|
|
60
|
+
return `peer-${Math.abs(hash).toString(36)}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate exponential backoff delay
|
|
64
|
+
*
|
|
65
|
+
* @param attempt - Current retry attempt number
|
|
66
|
+
* @returns Delay in milliseconds
|
|
67
|
+
*/
|
|
68
|
+
calculateBackoff(attempt) {
|
|
69
|
+
const delay = this.config.retryBaseDelay * Math.pow(2, attempt);
|
|
70
|
+
const jitter = Math.random() * 0.3 * delay;
|
|
71
|
+
return Math.min(delay + jitter, this.config.retryMaxDelay);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Start the syndication service
|
|
75
|
+
*
|
|
76
|
+
* Connects to all configured peers and starts automatic
|
|
77
|
+
* synchronization if enabled.
|
|
78
|
+
*/
|
|
79
|
+
async start() {
|
|
80
|
+
if (this.isRunning) {
|
|
81
|
+
logger.warn("Syndication service already running");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
logger.info("Starting syndication service", {
|
|
85
|
+
peers: this.peers.size,
|
|
86
|
+
autoSync: this.config.autoSync,
|
|
87
|
+
syncInterval: this.config.syncInterval
|
|
88
|
+
});
|
|
89
|
+
this.isRunning = true;
|
|
90
|
+
await this.connectToPeers();
|
|
91
|
+
if (this.config.autoSync) {
|
|
92
|
+
this.startAutoSync();
|
|
93
|
+
}
|
|
94
|
+
logger.info("Syndication service started", {
|
|
95
|
+
connectedPeers: this.getConnectedPeers().length
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Stop the syndication service
|
|
100
|
+
*
|
|
101
|
+
* Disconnects from all peers and stops automatic synchronization.
|
|
102
|
+
*/
|
|
103
|
+
async stop() {
|
|
104
|
+
if (!this.isRunning) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
logger.info("Stopping syndication service");
|
|
108
|
+
if (this.syncTimer) {
|
|
109
|
+
clearInterval(this.syncTimer);
|
|
110
|
+
this.syncTimer = void 0;
|
|
111
|
+
}
|
|
112
|
+
const maxWait = 5e3;
|
|
113
|
+
const startWait = Date.now();
|
|
114
|
+
while (this.syncInProgress && Date.now() - startWait < maxWait) {
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
116
|
+
}
|
|
117
|
+
for (const peer of this.peers.values()) {
|
|
118
|
+
peer.status = "disconnected";
|
|
119
|
+
}
|
|
120
|
+
this.isRunning = false;
|
|
121
|
+
this.retryAttempts.clear();
|
|
122
|
+
logger.info("Syndication service stopped");
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Connect to all configured peers
|
|
126
|
+
*/
|
|
127
|
+
async connectToPeers() {
|
|
128
|
+
const connectPromises = Array.from(this.peers.values()).map(async (peer) => {
|
|
129
|
+
try {
|
|
130
|
+
await this.connectToPeer(peer.id);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
logger.warn("Failed to connect to peer", {
|
|
133
|
+
peerId: peer.id,
|
|
134
|
+
error: error instanceof Error ? error.message : String(error)
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
await Promise.allSettled(connectPromises);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Establish connection to a specific peer
|
|
142
|
+
*
|
|
143
|
+
* @param peerId - Peer identifier
|
|
144
|
+
* @returns True if connection successful
|
|
145
|
+
*/
|
|
146
|
+
async connectToPeer(peerId) {
|
|
147
|
+
const peer = this.peers.get(peerId);
|
|
148
|
+
if (!peer) {
|
|
149
|
+
logger.warn("Peer not found", { peerId });
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const startTime = Date.now();
|
|
154
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
155
|
+
peer.status = "connected";
|
|
156
|
+
peer.latency = Date.now() - startTime;
|
|
157
|
+
this.retryAttempts.set(peerId, 0);
|
|
158
|
+
logger.debug("Connected to peer", {
|
|
159
|
+
peerId,
|
|
160
|
+
endpoint: peer.endpoint,
|
|
161
|
+
latency: peer.latency
|
|
162
|
+
});
|
|
163
|
+
return true;
|
|
164
|
+
} catch (error) {
|
|
165
|
+
peer.status = "error";
|
|
166
|
+
peer.errors++;
|
|
167
|
+
peer.lastError = error instanceof Error ? error.message : String(error);
|
|
168
|
+
logger.error("Failed to connect to peer", void 0, {
|
|
169
|
+
peerId,
|
|
170
|
+
errorMessage: peer.lastError
|
|
171
|
+
});
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Disconnect from a specific peer
|
|
177
|
+
*
|
|
178
|
+
* @param peerId - Peer identifier
|
|
179
|
+
*/
|
|
180
|
+
async disconnectPeer(peerId) {
|
|
181
|
+
const peer = this.peers.get(peerId);
|
|
182
|
+
if (peer) {
|
|
183
|
+
peer.status = "disconnected";
|
|
184
|
+
logger.debug("Disconnected from peer", { peerId });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Start automatic periodic synchronization
|
|
189
|
+
*/
|
|
190
|
+
startAutoSync() {
|
|
191
|
+
if (this.syncTimer) {
|
|
192
|
+
clearInterval(this.syncTimer);
|
|
193
|
+
}
|
|
194
|
+
this.syncTimer = setInterval(async () => {
|
|
195
|
+
if (!this.syncInProgress) {
|
|
196
|
+
try {
|
|
197
|
+
await this.syncWithAllPeers();
|
|
198
|
+
} catch (err) {
|
|
199
|
+
logger.error("Auto-sync failed", err instanceof Error ? err : void 0, {
|
|
200
|
+
errorMessage: err instanceof Error ? err.message : String(err)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}, this.config.syncInterval);
|
|
205
|
+
logger.debug("Auto-sync started", { interval: this.config.syncInterval });
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Stop automatic synchronization
|
|
209
|
+
*/
|
|
210
|
+
stopAutoSync() {
|
|
211
|
+
if (this.syncTimer) {
|
|
212
|
+
clearInterval(this.syncTimer);
|
|
213
|
+
this.syncTimer = void 0;
|
|
214
|
+
logger.debug("Auto-sync stopped");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Synchronize with all connected peers
|
|
219
|
+
*
|
|
220
|
+
* @returns Array of sync results for each peer
|
|
221
|
+
*/
|
|
222
|
+
async syncWithAllPeers() {
|
|
223
|
+
if (this.syncInProgress) {
|
|
224
|
+
logger.warn("Sync already in progress, skipping");
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
this.syncInProgress = true;
|
|
228
|
+
const results = [];
|
|
229
|
+
try {
|
|
230
|
+
const connectedPeers = this.getConnectedPeers();
|
|
231
|
+
logger.debug("Starting sync with all peers", { count: connectedPeers.length });
|
|
232
|
+
for (const peer of connectedPeers) {
|
|
233
|
+
const result = await this.syncWithPeer(peer.id);
|
|
234
|
+
results.push(result);
|
|
235
|
+
if (!result.success && this.config.retryOnError) {
|
|
236
|
+
const attempts = (this.retryAttempts.get(peer.id) || 0) + 1;
|
|
237
|
+
this.retryAttempts.set(peer.id, attempts);
|
|
238
|
+
if (attempts <= this.config.maxRetries) {
|
|
239
|
+
const delay = this.calculateBackoff(attempts);
|
|
240
|
+
logger.debug("Scheduling retry", { peerId: peer.id, attempt: attempts, delay });
|
|
241
|
+
setTimeout(() => this.syncWithPeer(peer.id), delay);
|
|
242
|
+
} else {
|
|
243
|
+
logger.warn("Max retries exceeded for peer", { peerId: peer.id });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
const successful = results.filter((r) => r.success).length;
|
|
248
|
+
logger.info("Sync completed", {
|
|
249
|
+
total: results.length,
|
|
250
|
+
successful,
|
|
251
|
+
failed: results.length - successful
|
|
252
|
+
});
|
|
253
|
+
} finally {
|
|
254
|
+
this.syncInProgress = false;
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Synchronize with a specific peer
|
|
260
|
+
*
|
|
261
|
+
* @param peerId - Peer identifier
|
|
262
|
+
* @returns Sync result
|
|
263
|
+
*/
|
|
264
|
+
async syncWithPeer(peerId) {
|
|
265
|
+
const peer = this.peers.get(peerId);
|
|
266
|
+
if (!peer) {
|
|
267
|
+
return {
|
|
268
|
+
peerId,
|
|
269
|
+
success: false,
|
|
270
|
+
eventsReceived: 0,
|
|
271
|
+
eventsSent: 0,
|
|
272
|
+
duration: 0,
|
|
273
|
+
error: "Peer not found"
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
if (peer.status !== "connected") {
|
|
277
|
+
const connected = await this.connectToPeer(peerId);
|
|
278
|
+
if (!connected) {
|
|
279
|
+
return {
|
|
280
|
+
peerId,
|
|
281
|
+
success: false,
|
|
282
|
+
eventsReceived: 0,
|
|
283
|
+
eventsSent: 0,
|
|
284
|
+
duration: 0,
|
|
285
|
+
error: "Peer not connected"
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const startTime = Date.now();
|
|
290
|
+
peer.status;
|
|
291
|
+
peer.status = "syncing";
|
|
292
|
+
try {
|
|
293
|
+
await this.config.auditChain.appendEvent({
|
|
294
|
+
type: "SyncStarted",
|
|
295
|
+
peerId,
|
|
296
|
+
direction: "bidirectional"
|
|
297
|
+
});
|
|
298
|
+
const checkpoint = this.config.auditChain.getLatestCheckpoint();
|
|
299
|
+
const request = {
|
|
300
|
+
requester: this.config.auditChain.getConfig().agentDid,
|
|
301
|
+
lastCheckpointHeight: checkpoint?.height ?? -1,
|
|
302
|
+
lastEventRoot: checkpoint?.eventRoot,
|
|
303
|
+
maxEvents: this.config.maxEventsPerRequest
|
|
304
|
+
};
|
|
305
|
+
const response = await this.fetchFromPeer(peer, request);
|
|
306
|
+
let eventsReceived = 0;
|
|
307
|
+
for (const event of response.events) {
|
|
308
|
+
const validation = await this.config.auditChain.validateAndInsert(event);
|
|
309
|
+
if (validation.valid) {
|
|
310
|
+
eventsReceived++;
|
|
311
|
+
} else {
|
|
312
|
+
logger.debug("Received invalid event", {
|
|
313
|
+
eventId: event.id,
|
|
314
|
+
errors: validation.errors
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const ourEvents = await this.getEventsSince(peer.lastCheckpointHeight ?? -1);
|
|
319
|
+
const eventsSent = await this.sendToPeer(peer, ourEvents);
|
|
320
|
+
peer.eventsReceived += eventsReceived;
|
|
321
|
+
peer.eventsSent += eventsSent;
|
|
322
|
+
peer.lastSyncTime = /* @__PURE__ */ new Date();
|
|
323
|
+
peer.lastCheckpointHeight = response.checkpoint?.height ?? peer.lastCheckpointHeight;
|
|
324
|
+
peer.status = "connected";
|
|
325
|
+
this.retryAttempts.set(peerId, 0);
|
|
326
|
+
const duration = Date.now() - startTime;
|
|
327
|
+
await this.config.auditChain.appendEvent({
|
|
328
|
+
type: "SyncCompleted",
|
|
329
|
+
peerId,
|
|
330
|
+
eventsTransferred: eventsReceived + eventsSent,
|
|
331
|
+
duration
|
|
332
|
+
});
|
|
333
|
+
logger.info("Sync with peer completed", {
|
|
334
|
+
peerId,
|
|
335
|
+
eventsReceived,
|
|
336
|
+
eventsSent,
|
|
337
|
+
duration
|
|
338
|
+
});
|
|
339
|
+
return {
|
|
340
|
+
peerId,
|
|
341
|
+
success: true,
|
|
342
|
+
eventsReceived,
|
|
343
|
+
eventsSent,
|
|
344
|
+
newCheckpointHeight: response.checkpoint?.height,
|
|
345
|
+
duration
|
|
346
|
+
};
|
|
347
|
+
} catch (err) {
|
|
348
|
+
peer.status = "error";
|
|
349
|
+
peer.errors++;
|
|
350
|
+
peer.lastError = err instanceof Error ? err.message : String(err);
|
|
351
|
+
const duration = Date.now() - startTime;
|
|
352
|
+
logger.error("Sync with peer failed", err instanceof Error ? err : void 0, {
|
|
353
|
+
peerId,
|
|
354
|
+
errorMessage: peer.lastError,
|
|
355
|
+
duration
|
|
356
|
+
});
|
|
357
|
+
return {
|
|
358
|
+
peerId,
|
|
359
|
+
success: false,
|
|
360
|
+
eventsReceived: 0,
|
|
361
|
+
eventsSent: 0,
|
|
362
|
+
duration,
|
|
363
|
+
error: peer.lastError
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Fetch events from a peer
|
|
369
|
+
*
|
|
370
|
+
* In production, this would make an HTTP/WebSocket request.
|
|
371
|
+
*
|
|
372
|
+
* @param peer - Peer information
|
|
373
|
+
* @param request - Sync request
|
|
374
|
+
* @returns Sync response
|
|
375
|
+
*/
|
|
376
|
+
async fetchFromPeer(peer, _request) {
|
|
377
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
378
|
+
return {
|
|
379
|
+
provider: peer.did || `did:exo:${peer.id}`,
|
|
380
|
+
events: [],
|
|
381
|
+
hasMore: false
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Send events to a peer
|
|
386
|
+
*
|
|
387
|
+
* In production, this would make an HTTP/WebSocket request.
|
|
388
|
+
*
|
|
389
|
+
* @param peer - Peer information
|
|
390
|
+
* @param events - Events to send
|
|
391
|
+
* @returns Number of events successfully sent
|
|
392
|
+
*/
|
|
393
|
+
async sendToPeer(_peer, events) {
|
|
394
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
395
|
+
return events.length;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Get events since a specific checkpoint height
|
|
399
|
+
*
|
|
400
|
+
* Uses the audit chain's query capability to retrieve events
|
|
401
|
+
* that occurred after the specified checkpoint.
|
|
402
|
+
*
|
|
403
|
+
* @param checkpointHeight - Height to query from
|
|
404
|
+
* @returns Array of events
|
|
405
|
+
*/
|
|
406
|
+
async getEventsSince(checkpointHeight) {
|
|
407
|
+
const result = await this.config.auditChain.queryEvents({
|
|
408
|
+
limit: this.config.maxEventsPerRequest
|
|
409
|
+
});
|
|
410
|
+
if (checkpointHeight < 0) {
|
|
411
|
+
return result.events;
|
|
412
|
+
}
|
|
413
|
+
return result.events.slice(checkpointHeight);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Add a new peer to the syndication network
|
|
417
|
+
*
|
|
418
|
+
* @param endpoint - Peer endpoint URL
|
|
419
|
+
* @returns Generated peer ID
|
|
420
|
+
*/
|
|
421
|
+
addPeer(endpoint) {
|
|
422
|
+
const peerId = this.generatePeerId(endpoint);
|
|
423
|
+
if (!this.peers.has(peerId)) {
|
|
424
|
+
this.peers.set(peerId, {
|
|
425
|
+
id: peerId,
|
|
426
|
+
endpoint,
|
|
427
|
+
status: "disconnected",
|
|
428
|
+
eventsReceived: 0,
|
|
429
|
+
eventsSent: 0,
|
|
430
|
+
errors: 0
|
|
431
|
+
});
|
|
432
|
+
logger.debug("Added peer", { peerId, endpoint });
|
|
433
|
+
if (this.isRunning) {
|
|
434
|
+
this.connectToPeer(peerId).catch((error) => {
|
|
435
|
+
logger.warn("Failed to connect to new peer", {
|
|
436
|
+
peerId,
|
|
437
|
+
error: error instanceof Error ? error.message : String(error)
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
} else {
|
|
442
|
+
logger.debug("Peer already exists", { peerId, endpoint });
|
|
443
|
+
}
|
|
444
|
+
return peerId;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Remove a peer from the syndication network
|
|
448
|
+
*
|
|
449
|
+
* @param peerId - Peer identifier
|
|
450
|
+
* @returns True if peer was removed
|
|
451
|
+
*/
|
|
452
|
+
removePeer(peerId) {
|
|
453
|
+
const removed = this.peers.delete(peerId);
|
|
454
|
+
if (removed) {
|
|
455
|
+
this.retryAttempts.delete(peerId);
|
|
456
|
+
logger.debug("Removed peer", { peerId });
|
|
457
|
+
}
|
|
458
|
+
return removed;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Get information about a specific peer
|
|
462
|
+
*
|
|
463
|
+
* @param peerId - Peer identifier
|
|
464
|
+
* @returns Peer information or undefined
|
|
465
|
+
*/
|
|
466
|
+
getPeer(peerId) {
|
|
467
|
+
return this.peers.get(peerId);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Get all registered peers
|
|
471
|
+
*
|
|
472
|
+
* @returns Array of all peer information
|
|
473
|
+
*/
|
|
474
|
+
getAllPeers() {
|
|
475
|
+
return Array.from(this.peers.values());
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Get currently connected peers
|
|
479
|
+
*
|
|
480
|
+
* @returns Array of connected peer information
|
|
481
|
+
*/
|
|
482
|
+
getConnectedPeers() {
|
|
483
|
+
return Array.from(this.peers.values()).filter((p) => p.status === "connected");
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Get peers in error state
|
|
487
|
+
*
|
|
488
|
+
* @returns Array of error state peer information
|
|
489
|
+
*/
|
|
490
|
+
getErrorPeers() {
|
|
491
|
+
return Array.from(this.peers.values()).filter((p) => p.status === "error");
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Get comprehensive service statistics
|
|
495
|
+
*
|
|
496
|
+
* @returns Statistics object
|
|
497
|
+
*/
|
|
498
|
+
getStats() {
|
|
499
|
+
let totalEventsReceived = 0;
|
|
500
|
+
let totalEventsSent = 0;
|
|
501
|
+
let totalErrors = 0;
|
|
502
|
+
let connectedPeers = 0;
|
|
503
|
+
let syncingPeers = 0;
|
|
504
|
+
let errorPeers = 0;
|
|
505
|
+
for (const peer of this.peers.values()) {
|
|
506
|
+
totalEventsReceived += peer.eventsReceived;
|
|
507
|
+
totalEventsSent += peer.eventsSent;
|
|
508
|
+
totalErrors += peer.errors;
|
|
509
|
+
switch (peer.status) {
|
|
510
|
+
case "connected":
|
|
511
|
+
connectedPeers++;
|
|
512
|
+
break;
|
|
513
|
+
case "syncing":
|
|
514
|
+
syncingPeers++;
|
|
515
|
+
break;
|
|
516
|
+
case "error":
|
|
517
|
+
errorPeers++;
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return {
|
|
522
|
+
totalPeers: this.peers.size,
|
|
523
|
+
connectedPeers,
|
|
524
|
+
syncingPeers,
|
|
525
|
+
errorPeers,
|
|
526
|
+
totalEventsReceived,
|
|
527
|
+
totalEventsSent,
|
|
528
|
+
totalErrors,
|
|
529
|
+
isRunning: this.isRunning,
|
|
530
|
+
autoSyncEnabled: this.config.autoSync,
|
|
531
|
+
syncInterval: this.config.syncInterval
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Force an immediate sync with all peers
|
|
536
|
+
*
|
|
537
|
+
* @returns Array of sync results
|
|
538
|
+
*/
|
|
539
|
+
async forceSyncNow() {
|
|
540
|
+
logger.info("Force sync requested");
|
|
541
|
+
return await this.syncWithAllPeers();
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Check if the service is currently running
|
|
545
|
+
*
|
|
546
|
+
* @returns True if running
|
|
547
|
+
*/
|
|
548
|
+
isServiceRunning() {
|
|
549
|
+
return this.isRunning;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Check if a sync is currently in progress
|
|
553
|
+
*
|
|
554
|
+
* @returns True if syncing
|
|
555
|
+
*/
|
|
556
|
+
isSyncing() {
|
|
557
|
+
return this.syncInProgress;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Update service configuration
|
|
561
|
+
*
|
|
562
|
+
* Note: Some config changes require restart to take effect.
|
|
563
|
+
*
|
|
564
|
+
* @param updates - Configuration updates
|
|
565
|
+
*/
|
|
566
|
+
updateConfig(updates) {
|
|
567
|
+
const previousAutoSync = this.config.autoSync;
|
|
568
|
+
const previousInterval = this.config.syncInterval;
|
|
569
|
+
Object.assign(this.config, updates);
|
|
570
|
+
if (this.isRunning) {
|
|
571
|
+
if (updates.autoSync !== void 0 || updates.syncInterval !== void 0) {
|
|
572
|
+
if (this.config.autoSync && (!previousAutoSync || this.config.syncInterval !== previousInterval)) {
|
|
573
|
+
this.startAutoSync();
|
|
574
|
+
} else if (!this.config.autoSync && previousAutoSync) {
|
|
575
|
+
this.stopAutoSync();
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
logger.debug("Configuration updated", { updates });
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
function createSyndicationService(config) {
|
|
583
|
+
return new SyndicationService(config);
|
|
584
|
+
}
|
|
585
|
+
export {
|
|
586
|
+
SyndicationService,
|
|
587
|
+
createSyndicationService
|
|
588
|
+
};
|
|
589
|
+
//# sourceMappingURL=syndication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syndication.js","sources":["../../../src/audit/services/syndication.ts"],"sourcesContent":["/**\n * Syndication Service\n *\n * Handles cross-environment event synchronization between\n * multiple audit chain instances using peer-to-peer communication.\n *\n * Features:\n * - Peer connection management with health tracking\n * - Bidirectional event synchronization\n * - Conflict detection and resolution\n * - Automatic periodic sync with configurable intervals\n * - Exponential backoff for failed sync attempts\n *\n * @module audit/services/syndication\n */\n\nimport type {\n Blake3Hash,\n Did,\n LedgerEvent,\n Checkpoint,\n SyncRequest,\n SyncResponse,\n KnowledgeGraphEventPayload,\n} from '../types.js';\nimport { AuditChain } from './audit-chain.js';\nimport { createLogger } from '../../utils/index.js';\n\nconst logger = createLogger('syndication');\n\n/**\n * Peer connection status\n */\nexport type PeerStatus = 'connected' | 'disconnected' | 'syncing' | 'error';\n\n/**\n * Peer information\n */\nexport interface PeerInfo {\n /** Unique peer identifier */\n id: string;\n /** Network endpoint URL */\n endpoint: string;\n /** Peer's decentralized identifier */\n did?: Did;\n /** Current connection status */\n status: PeerStatus;\n /** Timestamp of last successful sync */\n lastSyncTime?: Date;\n /** Height of last synced checkpoint */\n lastCheckpointHeight?: number;\n /** Total events received from this peer */\n eventsReceived: number;\n /** Total events sent to this peer */\n eventsSent: number;\n /** Cumulative error count */\n errors: number;\n /** Last error message */\n lastError?: string;\n /** Connection latency in milliseconds */\n latency?: number;\n}\n\n/**\n * Sync operation result\n */\nexport interface SyncResult {\n /** ID of the synced peer */\n peerId: string;\n /** Whether sync completed successfully */\n success: boolean;\n /** Number of events received during sync */\n eventsReceived: number;\n /** Number of events sent during sync */\n eventsSent: number;\n /** New checkpoint height after sync */\n newCheckpointHeight?: number;\n /** Sync duration in milliseconds */\n duration: number;\n /** Error message if sync failed */\n error?: string;\n}\n\n/**\n * Syndication service configuration\n */\nexport interface SyndicationConfig {\n /** Local audit chain instance */\n auditChain: AuditChain;\n /** Initial peer endpoints */\n peers: string[];\n /** Enable automatic periodic synchronization */\n autoSync: boolean;\n /** Interval between auto-syncs in milliseconds */\n syncInterval: number;\n /** Timeout for sync requests in milliseconds */\n requestTimeout: number;\n /** Maximum events to transfer per sync request */\n maxEventsPerRequest: number;\n /** Retry failed syncs automatically */\n retryOnError: boolean;\n /** Maximum retry attempts before giving up */\n maxRetries: number;\n /** Base delay for exponential backoff in milliseconds */\n retryBaseDelay: number;\n /** Maximum delay between retries in milliseconds */\n retryMaxDelay: number;\n}\n\n/**\n * Default syndication configuration values\n */\nconst DEFAULT_CONFIG: Omit<SyndicationConfig, 'auditChain'> = {\n peers: [],\n autoSync: false,\n syncInterval: 5 * 60 * 1000, // 5 minutes\n requestTimeout: 30000, // 30 seconds\n maxEventsPerRequest: 1000,\n retryOnError: true,\n maxRetries: 3,\n retryBaseDelay: 1000, // 1 second\n retryMaxDelay: 30000, // 30 seconds\n};\n\n/**\n * Syndication Service\n *\n * Manages peer-to-peer synchronization of audit events across\n * multiple environments. Provides:\n *\n * - Peer discovery and connection management\n * - Bidirectional event synchronization\n * - Conflict detection with hash-based resolution\n * - Automatic periodic sync with health monitoring\n * - Statistics and observability\n *\n * @example\n * ```typescript\n * const auditChain = createAuditChain({ agentDid: 'did:exo:agent-1' });\n * await auditChain.initialize();\n *\n * const syndication = createSyndicationService({\n * auditChain,\n * peers: ['https://peer1.example.com/audit', 'https://peer2.example.com/audit'],\n * autoSync: true,\n * syncInterval: 60000, // 1 minute\n * });\n *\n * await syndication.start();\n *\n * // Manual sync trigger\n * const results = await syndication.syncWithAllPeers();\n * ```\n */\nexport class SyndicationService {\n private config: SyndicationConfig;\n private peers: Map<string, PeerInfo> = new Map();\n private syncTimer?: ReturnType<typeof setInterval>;\n private isRunning: boolean = false;\n private syncInProgress: boolean = false;\n private retryAttempts: Map<string, number> = new Map();\n\n /**\n * Create a new syndication service instance\n *\n * @param config - Configuration with required auditChain\n */\n constructor(config: Partial<SyndicationConfig> & { auditChain: AuditChain }) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n\n // Initialize peers from config\n for (const endpoint of this.config.peers) {\n const peerId = this.generatePeerId(endpoint);\n this.peers.set(peerId, {\n id: peerId,\n endpoint,\n status: 'disconnected',\n eventsReceived: 0,\n eventsSent: 0,\n errors: 0,\n });\n }\n }\n\n /**\n * Generate a deterministic peer ID from endpoint URL\n *\n * @param endpoint - Peer endpoint URL\n * @returns Generated peer ID\n */\n private generatePeerId(endpoint: string): string {\n // Simple hash for peer ID generation\n let hash = 0;\n for (let i = 0; i < endpoint.length; i++) {\n const char = endpoint.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return `peer-${Math.abs(hash).toString(36)}`;\n }\n\n /**\n * Calculate exponential backoff delay\n *\n * @param attempt - Current retry attempt number\n * @returns Delay in milliseconds\n */\n private calculateBackoff(attempt: number): number {\n const delay = this.config.retryBaseDelay * Math.pow(2, attempt);\n const jitter = Math.random() * 0.3 * delay; // 30% jitter\n return Math.min(delay + jitter, this.config.retryMaxDelay);\n }\n\n /**\n * Start the syndication service\n *\n * Connects to all configured peers and starts automatic\n * synchronization if enabled.\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n logger.warn('Syndication service already running');\n return;\n }\n\n logger.info('Starting syndication service', {\n peers: this.peers.size,\n autoSync: this.config.autoSync,\n syncInterval: this.config.syncInterval,\n });\n\n this.isRunning = true;\n\n // Connect to all peers\n await this.connectToPeers();\n\n // Start auto-sync if enabled\n if (this.config.autoSync) {\n this.startAutoSync();\n }\n\n logger.info('Syndication service started', {\n connectedPeers: this.getConnectedPeers().length,\n });\n }\n\n /**\n * Stop the syndication service\n *\n * Disconnects from all peers and stops automatic synchronization.\n */\n async stop(): Promise<void> {\n if (!this.isRunning) {\n return;\n }\n\n logger.info('Stopping syndication service');\n\n // Stop auto-sync\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n }\n\n // Wait for any in-progress sync to complete\n const maxWait = 5000;\n const startWait = Date.now();\n while (this.syncInProgress && Date.now() - startWait < maxWait) {\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n // Disconnect from peers\n for (const peer of this.peers.values()) {\n peer.status = 'disconnected';\n }\n\n this.isRunning = false;\n this.retryAttempts.clear();\n logger.info('Syndication service stopped');\n }\n\n /**\n * Connect to all configured peers\n */\n private async connectToPeers(): Promise<void> {\n const connectPromises = Array.from(this.peers.values()).map(async (peer) => {\n try {\n await this.connectToPeer(peer.id);\n } catch (error) {\n logger.warn('Failed to connect to peer', {\n peerId: peer.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n await Promise.allSettled(connectPromises);\n }\n\n /**\n * Establish connection to a specific peer\n *\n * @param peerId - Peer identifier\n * @returns True if connection successful\n */\n async connectToPeer(peerId: string): Promise<boolean> {\n const peer = this.peers.get(peerId);\n if (!peer) {\n logger.warn('Peer not found', { peerId });\n return false;\n }\n\n try {\n // In production, would establish WebSocket or HTTP/2 connection\n // For now, simulate connection with health check\n const startTime = Date.now();\n\n // Simulate network latency\n await new Promise(resolve => setTimeout(resolve, 50));\n\n peer.status = 'connected';\n peer.latency = Date.now() - startTime;\n this.retryAttempts.set(peerId, 0);\n\n logger.debug('Connected to peer', {\n peerId,\n endpoint: peer.endpoint,\n latency: peer.latency,\n });\n\n return true;\n } catch (error) {\n peer.status = 'error';\n peer.errors++;\n peer.lastError = error instanceof Error ? error.message : String(error);\n\n logger.error('Failed to connect to peer', undefined, {\n peerId,\n errorMessage: peer.lastError,\n });\n\n return false;\n }\n }\n\n /**\n * Disconnect from a specific peer\n *\n * @param peerId - Peer identifier\n */\n async disconnectPeer(peerId: string): Promise<void> {\n const peer = this.peers.get(peerId);\n if (peer) {\n peer.status = 'disconnected';\n logger.debug('Disconnected from peer', { peerId });\n }\n }\n\n /**\n * Start automatic periodic synchronization\n */\n private startAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n }\n\n this.syncTimer = setInterval(async () => {\n if (!this.syncInProgress) {\n try {\n await this.syncWithAllPeers();\n } catch (err) {\n logger.error('Auto-sync failed', err instanceof Error ? err : undefined, {\n errorMessage: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }, this.config.syncInterval);\n\n logger.debug('Auto-sync started', { interval: this.config.syncInterval });\n }\n\n /**\n * Stop automatic synchronization\n */\n stopAutoSync(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n logger.debug('Auto-sync stopped');\n }\n }\n\n /**\n * Synchronize with all connected peers\n *\n * @returns Array of sync results for each peer\n */\n async syncWithAllPeers(): Promise<SyncResult[]> {\n if (this.syncInProgress) {\n logger.warn('Sync already in progress, skipping');\n return [];\n }\n\n this.syncInProgress = true;\n const results: SyncResult[] = [];\n\n try {\n const connectedPeers = this.getConnectedPeers();\n logger.debug('Starting sync with all peers', { count: connectedPeers.length });\n\n for (const peer of connectedPeers) {\n const result = await this.syncWithPeer(peer.id);\n results.push(result);\n\n // Handle retry logic for failed syncs\n if (!result.success && this.config.retryOnError) {\n const attempts = (this.retryAttempts.get(peer.id) || 0) + 1;\n this.retryAttempts.set(peer.id, attempts);\n\n if (attempts <= this.config.maxRetries) {\n const delay = this.calculateBackoff(attempts);\n logger.debug('Scheduling retry', { peerId: peer.id, attempt: attempts, delay });\n setTimeout(() => this.syncWithPeer(peer.id), delay);\n } else {\n logger.warn('Max retries exceeded for peer', { peerId: peer.id });\n }\n }\n }\n\n const successful = results.filter(r => r.success).length;\n logger.info('Sync completed', {\n total: results.length,\n successful,\n failed: results.length - successful,\n });\n } finally {\n this.syncInProgress = false;\n }\n\n return results;\n }\n\n /**\n * Synchronize with a specific peer\n *\n * @param peerId - Peer identifier\n * @returns Sync result\n */\n async syncWithPeer(peerId: string): Promise<SyncResult> {\n const peer = this.peers.get(peerId);\n if (!peer) {\n return {\n peerId,\n success: false,\n eventsReceived: 0,\n eventsSent: 0,\n duration: 0,\n error: 'Peer not found',\n };\n }\n\n if (peer.status !== 'connected') {\n // Try to reconnect\n const connected = await this.connectToPeer(peerId);\n if (!connected) {\n return {\n peerId,\n success: false,\n eventsReceived: 0,\n eventsSent: 0,\n duration: 0,\n error: 'Peer not connected',\n };\n }\n }\n\n const startTime = Date.now();\n const previousStatus = peer.status;\n peer.status = 'syncing';\n\n try {\n // Log sync start event\n await this.config.auditChain.appendEvent({\n type: 'SyncStarted',\n peerId,\n direction: 'bidirectional',\n } as KnowledgeGraphEventPayload);\n\n // Create sync request with current state\n const checkpoint = this.config.auditChain.getLatestCheckpoint();\n const request: SyncRequest = {\n requester: this.config.auditChain.getConfig().agentDid,\n lastCheckpointHeight: checkpoint?.height ?? -1,\n lastEventRoot: checkpoint?.eventRoot,\n maxEvents: this.config.maxEventsPerRequest,\n };\n\n // Fetch events from peer\n const response = await this.fetchFromPeer(peer, request);\n\n // Process received events\n let eventsReceived = 0;\n for (const event of response.events) {\n const validation = await this.config.auditChain.validateAndInsert(event);\n if (validation.valid) {\n eventsReceived++;\n } else {\n logger.debug('Received invalid event', {\n eventId: event.id,\n errors: validation.errors,\n });\n }\n }\n\n // Send our events to peer\n const ourEvents = await this.getEventsSince(peer.lastCheckpointHeight ?? -1);\n const eventsSent = await this.sendToPeer(peer, ourEvents);\n\n // Update peer stats\n peer.eventsReceived += eventsReceived;\n peer.eventsSent += eventsSent;\n peer.lastSyncTime = new Date();\n peer.lastCheckpointHeight = response.checkpoint?.height ?? peer.lastCheckpointHeight;\n peer.status = 'connected';\n\n // Reset retry counter on success\n this.retryAttempts.set(peerId, 0);\n\n const duration = Date.now() - startTime;\n\n // Log sync completion event\n await this.config.auditChain.appendEvent({\n type: 'SyncCompleted',\n peerId,\n eventsTransferred: eventsReceived + eventsSent,\n duration,\n } as KnowledgeGraphEventPayload);\n\n logger.info('Sync with peer completed', {\n peerId,\n eventsReceived,\n eventsSent,\n duration,\n });\n\n return {\n peerId,\n success: true,\n eventsReceived,\n eventsSent,\n newCheckpointHeight: response.checkpoint?.height,\n duration,\n };\n } catch (err) {\n peer.status = 'error';\n peer.errors++;\n peer.lastError = err instanceof Error ? err.message : String(err);\n const duration = Date.now() - startTime;\n\n logger.error('Sync with peer failed', err instanceof Error ? err : undefined, {\n peerId,\n errorMessage: peer.lastError,\n duration,\n });\n\n return {\n peerId,\n success: false,\n eventsReceived: 0,\n eventsSent: 0,\n duration,\n error: peer.lastError,\n };\n }\n }\n\n /**\n * Fetch events from a peer\n *\n * In production, this would make an HTTP/WebSocket request.\n *\n * @param peer - Peer information\n * @param request - Sync request\n * @returns Sync response\n */\n private async fetchFromPeer(peer: PeerInfo, _request: SyncRequest): Promise<SyncResponse> {\n // In production implementation:\n // - Make HTTP POST to peer.endpoint/sync\n // - Set timeout from config.requestTimeout\n // - Handle authentication/authorization\n // - Verify response signatures\n\n // Simulate network operation\n await new Promise(resolve => setTimeout(resolve, 10));\n\n // Return empty response for now\n return {\n provider: peer.did || (`did:exo:${peer.id}` as Did),\n events: [],\n hasMore: false,\n };\n }\n\n /**\n * Send events to a peer\n *\n * In production, this would make an HTTP/WebSocket request.\n *\n * @param peer - Peer information\n * @param events - Events to send\n * @returns Number of events successfully sent\n */\n private async sendToPeer(_peer: PeerInfo, events: LedgerEvent[]): Promise<number> {\n // In production implementation:\n // - Make HTTP POST to peer.endpoint/events\n // - Batch events if exceeding maxEventsPerRequest\n // - Handle acknowledgments\n // - Retry failed sends\n\n // Simulate network operation\n await new Promise(resolve => setTimeout(resolve, 10));\n\n return events.length;\n }\n\n /**\n * Get events since a specific checkpoint height\n *\n * Uses the audit chain's query capability to retrieve events\n * that occurred after the specified checkpoint.\n *\n * @param checkpointHeight - Height to query from\n * @returns Array of events\n */\n private async getEventsSince(checkpointHeight: number): Promise<LedgerEvent[]> {\n const result = await this.config.auditChain.queryEvents({\n limit: this.config.maxEventsPerRequest,\n });\n\n // The events are returned in HLC order from queryEvents\n // For checkpoint-based filtering, we use the total count as a proxy\n // In production, would use more efficient index-based query\n // that tracks checkpoint heights directly\n if (checkpointHeight < 0) {\n return result.events;\n }\n\n // Return events beyond the checkpoint count\n return result.events.slice(checkpointHeight);\n }\n\n /**\n * Add a new peer to the syndication network\n *\n * @param endpoint - Peer endpoint URL\n * @returns Generated peer ID\n */\n addPeer(endpoint: string): string {\n const peerId = this.generatePeerId(endpoint);\n\n if (!this.peers.has(peerId)) {\n this.peers.set(peerId, {\n id: peerId,\n endpoint,\n status: 'disconnected',\n eventsReceived: 0,\n eventsSent: 0,\n errors: 0,\n });\n\n logger.debug('Added peer', { peerId, endpoint });\n\n // Auto-connect if service is running\n if (this.isRunning) {\n this.connectToPeer(peerId).catch((error) => {\n logger.warn('Failed to connect to new peer', {\n peerId,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n } else {\n logger.debug('Peer already exists', { peerId, endpoint });\n }\n\n return peerId;\n }\n\n /**\n * Remove a peer from the syndication network\n *\n * @param peerId - Peer identifier\n * @returns True if peer was removed\n */\n removePeer(peerId: string): boolean {\n const removed = this.peers.delete(peerId);\n if (removed) {\n this.retryAttempts.delete(peerId);\n logger.debug('Removed peer', { peerId });\n }\n return removed;\n }\n\n /**\n * Get information about a specific peer\n *\n * @param peerId - Peer identifier\n * @returns Peer information or undefined\n */\n getPeer(peerId: string): PeerInfo | undefined {\n return this.peers.get(peerId);\n }\n\n /**\n * Get all registered peers\n *\n * @returns Array of all peer information\n */\n getAllPeers(): PeerInfo[] {\n return Array.from(this.peers.values());\n }\n\n /**\n * Get currently connected peers\n *\n * @returns Array of connected peer information\n */\n getConnectedPeers(): PeerInfo[] {\n return Array.from(this.peers.values()).filter(p => p.status === 'connected');\n }\n\n /**\n * Get peers in error state\n *\n * @returns Array of error state peer information\n */\n getErrorPeers(): PeerInfo[] {\n return Array.from(this.peers.values()).filter(p => p.status === 'error');\n }\n\n /**\n * Get comprehensive service statistics\n *\n * @returns Statistics object\n */\n getStats(): {\n totalPeers: number;\n connectedPeers: number;\n syncingPeers: number;\n errorPeers: number;\n totalEventsReceived: number;\n totalEventsSent: number;\n totalErrors: number;\n isRunning: boolean;\n autoSyncEnabled: boolean;\n syncInterval: number;\n } {\n let totalEventsReceived = 0;\n let totalEventsSent = 0;\n let totalErrors = 0;\n let connectedPeers = 0;\n let syncingPeers = 0;\n let errorPeers = 0;\n\n for (const peer of this.peers.values()) {\n totalEventsReceived += peer.eventsReceived;\n totalEventsSent += peer.eventsSent;\n totalErrors += peer.errors;\n\n switch (peer.status) {\n case 'connected':\n connectedPeers++;\n break;\n case 'syncing':\n syncingPeers++;\n break;\n case 'error':\n errorPeers++;\n break;\n }\n }\n\n return {\n totalPeers: this.peers.size,\n connectedPeers,\n syncingPeers,\n errorPeers,\n totalEventsReceived,\n totalEventsSent,\n totalErrors,\n isRunning: this.isRunning,\n autoSyncEnabled: this.config.autoSync,\n syncInterval: this.config.syncInterval,\n };\n }\n\n /**\n * Force an immediate sync with all peers\n *\n * @returns Array of sync results\n */\n async forceSyncNow(): Promise<SyncResult[]> {\n logger.info('Force sync requested');\n return await this.syncWithAllPeers();\n }\n\n /**\n * Check if the service is currently running\n *\n * @returns True if running\n */\n isServiceRunning(): boolean {\n return this.isRunning;\n }\n\n /**\n * Check if a sync is currently in progress\n *\n * @returns True if syncing\n */\n isSyncing(): boolean {\n return this.syncInProgress;\n }\n\n /**\n * Update service configuration\n *\n * Note: Some config changes require restart to take effect.\n *\n * @param updates - Configuration updates\n */\n updateConfig(updates: Partial<Omit<SyndicationConfig, 'auditChain'>>): void {\n const previousAutoSync = this.config.autoSync;\n const previousInterval = this.config.syncInterval;\n\n Object.assign(this.config, updates);\n\n // Handle auto-sync changes\n if (this.isRunning) {\n if (updates.autoSync !== undefined || updates.syncInterval !== undefined) {\n if (this.config.autoSync && (!previousAutoSync || this.config.syncInterval !== previousInterval)) {\n this.startAutoSync();\n } else if (!this.config.autoSync && previousAutoSync) {\n this.stopAutoSync();\n }\n }\n }\n\n logger.debug('Configuration updated', { updates });\n }\n}\n\n/**\n * Create a syndication service instance\n *\n * @param config - Configuration with required auditChain\n * @returns Configured SyndicationService instance\n *\n * @example\n * ```typescript\n * const syndication = createSyndicationService({\n * auditChain,\n * peers: ['https://peer1.example.com/audit'],\n * autoSync: true,\n * });\n * ```\n */\nexport function createSyndicationService(\n config: Partial<SyndicationConfig> & { auditChain: AuditChain }\n): SyndicationService {\n return new SyndicationService(config);\n}\n"],"names":[],"mappings":"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"}
|