@debian777/kairos-mcp 3.0.1-beta.14
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/LICENSE +22 -0
- package/README.md +108 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/cli/api-client.d.ts +31 -0
- package/dist/cli/api-client.d.ts.map +1 -0
- package/dist/cli/api-client.js +110 -0
- package/dist/cli/api-client.js.map +1 -0
- package/dist/cli/commands/attest.d.ts +6 -0
- package/dist/cli/commands/attest.d.ts.map +1 -0
- package/dist/cli/commands/attest.js +52 -0
- package/dist/cli/commands/attest.js.map +1 -0
- package/dist/cli/commands/begin.d.ts +6 -0
- package/dist/cli/commands/begin.d.ts.map +1 -0
- package/dist/cli/commands/begin.js +32 -0
- package/dist/cli/commands/begin.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +6 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +32 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/mint.d.ts +6 -0
- package/dist/cli/commands/mint.d.ts.map +1 -0
- package/dist/cli/commands/mint.js +48 -0
- package/dist/cli/commands/mint.js.map +1 -0
- package/dist/cli/commands/next.d.ts +6 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +89 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +32 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/update.d.ts +6 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +72 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/config.d.ts +9 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +14 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +10 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +20 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +165 -0
- package/dist/config.js.map +1 -0
- package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002001.md +324 -0
- package/dist/embed-docs/mem/00000000-0000-0000-0000-000000002002.md +48 -0
- package/dist/http/bearer-validate.d.ts +14 -0
- package/dist/http/bearer-validate.d.ts.map +1 -0
- package/dist/http/bearer-validate.js +111 -0
- package/dist/http/bearer-validate.js.map +1 -0
- package/dist/http/http-api-attest.d.ts +7 -0
- package/dist/http/http-api-attest.d.ts.map +1 -0
- package/dist/http/http-api-attest.js +103 -0
- package/dist/http/http-api-attest.js.map +1 -0
- package/dist/http/http-api-begin-step.d.ts +8 -0
- package/dist/http/http-api-begin-step.d.ts.map +1 -0
- package/dist/http/http-api-begin-step.js +108 -0
- package/dist/http/http-api-begin-step.js.map +1 -0
- package/dist/http/http-api-begin.d.ts +8 -0
- package/dist/http/http-api-begin.d.ts.map +1 -0
- package/dist/http/http-api-begin.js +167 -0
- package/dist/http/http-api-begin.js.map +1 -0
- package/dist/http/http-api-delete.d.ts +9 -0
- package/dist/http/http-api-delete.d.ts.map +1 -0
- package/dist/http/http-api-delete.js +67 -0
- package/dist/http/http-api-delete.js.map +1 -0
- package/dist/http/http-api-dump.d.ts +8 -0
- package/dist/http/http-api-dump.d.ts.map +1 -0
- package/dist/http/http-api-dump.js +34 -0
- package/dist/http/http-api-dump.js.map +1 -0
- package/dist/http/http-api-mint.d.ts +9 -0
- package/dist/http/http-api-mint.d.ts.map +1 -0
- package/dist/http/http-api-mint.js +100 -0
- package/dist/http/http-api-mint.js.map +1 -0
- package/dist/http/http-api-next.d.ts +9 -0
- package/dist/http/http-api-next.d.ts.map +1 -0
- package/dist/http/http-api-next.js +237 -0
- package/dist/http/http-api-next.js.map +1 -0
- package/dist/http/http-api-routes.d.ts +13 -0
- package/dist/http/http-api-routes.d.ts.map +1 -0
- package/dist/http/http-api-routes.js +28 -0
- package/dist/http/http-api-routes.js.map +1 -0
- package/dist/http/http-api-snapshot.d.ts +4 -0
- package/dist/http/http-api-snapshot.d.ts.map +1 -0
- package/dist/http/http-api-snapshot.js +36 -0
- package/dist/http/http-api-snapshot.js.map +1 -0
- package/dist/http/http-api-update.d.ts +9 -0
- package/dist/http/http-api-update.d.ts.map +1 -0
- package/dist/http/http-api-update.js +105 -0
- package/dist/http/http-api-update.js.map +1 -0
- package/dist/http/http-auth-callback.d.ts +6 -0
- package/dist/http/http-auth-callback.d.ts.map +1 -0
- package/dist/http/http-auth-callback.js +183 -0
- package/dist/http/http-auth-callback.js.map +1 -0
- package/dist/http/http-auth-middleware.d.ts +30 -0
- package/dist/http/http-auth-middleware.d.ts.map +1 -0
- package/dist/http/http-auth-middleware.js +224 -0
- package/dist/http/http-auth-middleware.js.map +1 -0
- package/dist/http/http-error-handlers.d.ts +7 -0
- package/dist/http/http-error-handlers.d.ts.map +1 -0
- package/dist/http/http-error-handlers.js +35 -0
- package/dist/http/http-error-handlers.js.map +1 -0
- package/dist/http/http-health-routes.d.ts +9 -0
- package/dist/http/http-health-routes.d.ts.map +1 -0
- package/dist/http/http-health-routes.js +117 -0
- package/dist/http/http-health-routes.js.map +1 -0
- package/dist/http/http-mcp-handler.d.ts +8 -0
- package/dist/http/http-mcp-handler.d.ts.map +1 -0
- package/dist/http/http-mcp-handler.js +136 -0
- package/dist/http/http-mcp-handler.js.map +1 -0
- package/dist/http/http-metrics-middleware.d.ts +7 -0
- package/dist/http/http-metrics-middleware.d.ts.map +1 -0
- package/dist/http/http-metrics-middleware.js +56 -0
- package/dist/http/http-metrics-middleware.js.map +1 -0
- package/dist/http/http-server-config.d.ts +11 -0
- package/dist/http/http-server-config.d.ts.map +1 -0
- package/dist/http/http-server-config.js +15 -0
- package/dist/http/http-server-config.js.map +1 -0
- package/dist/http/http-server-startup.d.ts +9 -0
- package/dist/http/http-server-startup.d.ts.map +1 -0
- package/dist/http/http-server-startup.js +26 -0
- package/dist/http/http-server-startup.js.map +1 -0
- package/dist/http/http-server.d.ts +4 -0
- package/dist/http/http-server.d.ts.map +1 -0
- package/dist/http/http-server.js +39 -0
- package/dist/http/http-server.js.map +1 -0
- package/dist/http/http-well-known.d.ts +13 -0
- package/dist/http/http-well-known.d.ts.map +1 -0
- package/dist/http/http-well-known.js +32 -0
- package/dist/http/http-well-known.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics-server.d.ts +14 -0
- package/dist/metrics-server.d.ts.map +1 -0
- package/dist/metrics-server.js +41 -0
- package/dist/metrics-server.js.map +1 -0
- package/dist/resources/docs-resources.d.ts +2 -0
- package/dist/resources/docs-resources.d.ts.map +1 -0
- package/dist/resources/docs-resources.js +47 -0
- package/dist/resources/docs-resources.js.map +1 -0
- package/dist/resources/embedded-mcp-resources.d.ts +73 -0
- package/dist/resources/embedded-mcp-resources.d.ts.map +1 -0
- package/dist/resources/embedded-mcp-resources.js +132 -0
- package/dist/resources/embedded-mcp-resources.js.map +1 -0
- package/dist/resources/mem-resources-boot.d.ts +10 -0
- package/dist/resources/mem-resources-boot.d.ts.map +1 -0
- package/dist/resources/mem-resources-boot.js +164 -0
- package/dist/resources/mem-resources-boot.js.map +1 -0
- package/dist/resources/prompt-resources.d.ts +5 -0
- package/dist/resources/prompt-resources.d.ts.map +1 -0
- package/dist/resources/prompt-resources.js +42 -0
- package/dist/resources/prompt-resources.js.map +1 -0
- package/dist/resources/resource-bootstrap.d.ts +7 -0
- package/dist/resources/resource-bootstrap.d.ts.map +1 -0
- package/dist/resources/resource-bootstrap.js +33 -0
- package/dist/resources/resource-bootstrap.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +79 -0
- package/dist/server.js.map +1 -0
- package/dist/services/chain-utils.d.ts +22 -0
- package/dist/services/chain-utils.d.ts.map +1 -0
- package/dist/services/chain-utils.js +95 -0
- package/dist/services/chain-utils.js.map +1 -0
- package/dist/services/code-block-processor.d.ts +40 -0
- package/dist/services/code-block-processor.d.ts.map +1 -0
- package/dist/services/code-block-processor.js +169 -0
- package/dist/services/code-block-processor.js.map +1 -0
- package/dist/services/embedding/config.d.ts +5 -0
- package/dist/services/embedding/config.d.ts.map +1 -0
- package/dist/services/embedding/config.js +13 -0
- package/dist/services/embedding/config.js.map +1 -0
- package/dist/services/embedding/providers.d.ts +5 -0
- package/dist/services/embedding/providers.d.ts.map +1 -0
- package/dist/services/embedding/providers.js +141 -0
- package/dist/services/embedding/providers.js.map +1 -0
- package/dist/services/embedding/service.d.ts +39 -0
- package/dist/services/embedding/service.d.ts.map +1 -0
- package/dist/services/embedding/service.js +302 -0
- package/dist/services/embedding/service.js.map +1 -0
- package/dist/services/embedding/types.d.ts +17 -0
- package/dist/services/embedding/types.d.ts.map +1 -0
- package/dist/services/embedding/types.js +2 -0
- package/dist/services/embedding/types.js.map +1 -0
- package/dist/services/id-generator.d.ts +63 -0
- package/dist/services/id-generator.d.ts.map +1 -0
- package/dist/services/id-generator.js +101 -0
- package/dist/services/id-generator.js.map +1 -0
- package/dist/services/key-value-store-factory.d.ts +7 -0
- package/dist/services/key-value-store-factory.d.ts.map +1 -0
- package/dist/services/key-value-store-factory.js +15 -0
- package/dist/services/key-value-store-factory.js.map +1 -0
- package/dist/services/key-value-store.d.ts +24 -0
- package/dist/services/key-value-store.d.ts.map +1 -0
- package/dist/services/key-value-store.js +6 -0
- package/dist/services/key-value-store.js.map +1 -0
- package/dist/services/memory/chain-builder-proof.d.ts +18 -0
- package/dist/services/memory/chain-builder-proof.d.ts.map +1 -0
- package/dist/services/memory/chain-builder-proof.js +78 -0
- package/dist/services/memory/chain-builder-proof.js.map +1 -0
- package/dist/services/memory/chain-builder.d.ts +4 -0
- package/dist/services/memory/chain-builder.d.ts.map +1 -0
- package/dist/services/memory/chain-builder.js +185 -0
- package/dist/services/memory/chain-builder.js.map +1 -0
- package/dist/services/memory/store-chain-default-handler.d.ts +9 -0
- package/dist/services/memory/store-chain-default-handler.d.ts.map +1 -0
- package/dist/services/memory/store-chain-default-handler.js +118 -0
- package/dist/services/memory/store-chain-default-handler.js.map +1 -0
- package/dist/services/memory/store-chain-header-handler.d.ts +8 -0
- package/dist/services/memory/store-chain-header-handler.d.ts.map +1 -0
- package/dist/services/memory/store-chain-header-handler.js +98 -0
- package/dist/services/memory/store-chain-header-handler.js.map +1 -0
- package/dist/services/memory/store-chain-helpers.d.ts +27 -0
- package/dist/services/memory/store-chain-helpers.d.ts.map +1 -0
- package/dist/services/memory/store-chain-helpers.js +102 -0
- package/dist/services/memory/store-chain-helpers.js.map +1 -0
- package/dist/services/memory/store-chain.d.ts +15 -0
- package/dist/services/memory/store-chain.d.ts.map +1 -0
- package/dist/services/memory/store-chain.js +56 -0
- package/dist/services/memory/store-chain.js.map +1 -0
- package/dist/services/memory/store-init.d.ts +3 -0
- package/dist/services/memory/store-init.d.ts.map +1 -0
- package/dist/services/memory/store-init.js +127 -0
- package/dist/services/memory/store-init.js.map +1 -0
- package/dist/services/memory/store-methods.d.ts +35 -0
- package/dist/services/memory/store-methods.d.ts.map +1 -0
- package/dist/services/memory/store-methods.js +308 -0
- package/dist/services/memory/store-methods.js.map +1 -0
- package/dist/services/memory/store.d.ts +36 -0
- package/dist/services/memory/store.d.ts.map +1 -0
- package/dist/services/memory/store.js +119 -0
- package/dist/services/memory/store.js.map +1 -0
- package/dist/services/memory-store.d.ts +33 -0
- package/dist/services/memory-store.d.ts.map +1 -0
- package/dist/services/memory-store.js +158 -0
- package/dist/services/memory-store.js.map +1 -0
- package/dist/services/metrics/agent-metrics.d.ts +12 -0
- package/dist/services/metrics/agent-metrics.d.ts.map +1 -0
- package/dist/services/metrics/agent-metrics.js +34 -0
- package/dist/services/metrics/agent-metrics.js.map +1 -0
- package/dist/services/metrics/embedding-metrics.d.ts +12 -0
- package/dist/services/metrics/embedding-metrics.d.ts.map +1 -0
- package/dist/services/metrics/embedding-metrics.js +41 -0
- package/dist/services/metrics/embedding-metrics.js.map +1 -0
- package/dist/services/metrics/http-metrics.d.ts +12 -0
- package/dist/services/metrics/http-metrics.d.ts.map +1 -0
- package/dist/services/metrics/http-metrics.js +41 -0
- package/dist/services/metrics/http-metrics.js.map +1 -0
- package/dist/services/metrics/mcp-metrics.d.ts +16 -0
- package/dist/services/metrics/mcp-metrics.d.ts.map +1 -0
- package/dist/services/metrics/mcp-metrics.js +55 -0
- package/dist/services/metrics/mcp-metrics.js.map +1 -0
- package/dist/services/metrics/memory-metrics.d.ts +10 -0
- package/dist/services/metrics/memory-metrics.d.ts.map +1 -0
- package/dist/services/metrics/memory-metrics.js +28 -0
- package/dist/services/metrics/memory-metrics.js.map +1 -0
- package/dist/services/metrics/qdrant-metrics.d.ts +11 -0
- package/dist/services/metrics/qdrant-metrics.d.ts.map +1 -0
- package/dist/services/metrics/qdrant-metrics.js +35 -0
- package/dist/services/metrics/qdrant-metrics.js.map +1 -0
- package/dist/services/metrics/registry.d.ts +9 -0
- package/dist/services/metrics/registry.d.ts.map +1 -0
- package/dist/services/metrics/registry.js +19 -0
- package/dist/services/metrics/registry.js.map +1 -0
- package/dist/services/metrics/system-metrics.d.ts +10 -0
- package/dist/services/metrics/system-metrics.d.ts.map +1 -0
- package/dist/services/metrics/system-metrics.js +35 -0
- package/dist/services/metrics/system-metrics.js.map +1 -0
- package/dist/services/proof-of-work-store.d.ts +66 -0
- package/dist/services/proof-of-work-store.d.ts.map +1 -0
- package/dist/services/proof-of-work-store.js +141 -0
- package/dist/services/proof-of-work-store.js.map +1 -0
- package/dist/services/qdrant/connection.d.ts +24 -0
- package/dist/services/qdrant/connection.d.ts.map +1 -0
- package/dist/services/qdrant/connection.js +126 -0
- package/dist/services/qdrant/connection.js.map +1 -0
- package/dist/services/qdrant/index.d.ts +3 -0
- package/dist/services/qdrant/index.d.ts.map +1 -0
- package/dist/services/qdrant/index.js +4 -0
- package/dist/services/qdrant/index.js.map +1 -0
- package/dist/services/qdrant/initialization.d.ts +25 -0
- package/dist/services/qdrant/initialization.d.ts.map +1 -0
- package/dist/services/qdrant/initialization.js +170 -0
- package/dist/services/qdrant/initialization.js.map +1 -0
- package/dist/services/qdrant/listing.d.ts +26 -0
- package/dist/services/qdrant/listing.d.ts.map +1 -0
- package/dist/services/qdrant/listing.js +88 -0
- package/dist/services/qdrant/listing.js.map +1 -0
- package/dist/services/qdrant/memory-retrieval.d.ts +14 -0
- package/dist/services/qdrant/memory-retrieval.d.ts.map +1 -0
- package/dist/services/qdrant/memory-retrieval.js +110 -0
- package/dist/services/qdrant/memory-retrieval.js.map +1 -0
- package/dist/services/qdrant/memory-store.d.ts +16 -0
- package/dist/services/qdrant/memory-store.d.ts.map +1 -0
- package/dist/services/qdrant/memory-store.js +108 -0
- package/dist/services/qdrant/memory-store.js.map +1 -0
- package/dist/services/qdrant/memory-updates.d.ts +8 -0
- package/dist/services/qdrant/memory-updates.d.ts.map +1 -0
- package/dist/services/qdrant/memory-updates.js +206 -0
- package/dist/services/qdrant/memory-updates.js.map +1 -0
- package/dist/services/qdrant/protocol.d.ts +16 -0
- package/dist/services/qdrant/protocol.d.ts.map +1 -0
- package/dist/services/qdrant/protocol.js +48 -0
- package/dist/services/qdrant/protocol.js.map +1 -0
- package/dist/services/qdrant/quality.d.ts +14 -0
- package/dist/services/qdrant/quality.d.ts.map +1 -0
- package/dist/services/qdrant/quality.js +101 -0
- package/dist/services/qdrant/quality.js.map +1 -0
- package/dist/services/qdrant/resources.d.ts +7 -0
- package/dist/services/qdrant/resources.d.ts.map +1 -0
- package/dist/services/qdrant/resources.js +108 -0
- package/dist/services/qdrant/resources.js.map +1 -0
- package/dist/services/qdrant/search.d.ts +22 -0
- package/dist/services/qdrant/search.d.ts.map +1 -0
- package/dist/services/qdrant/search.js +75 -0
- package/dist/services/qdrant/search.js.map +1 -0
- package/dist/services/qdrant/service.d.ts +90 -0
- package/dist/services/qdrant/service.d.ts.map +1 -0
- package/dist/services/qdrant/service.js +95 -0
- package/dist/services/qdrant/service.js.map +1 -0
- package/dist/services/qdrant/snapshots.d.ts +19 -0
- package/dist/services/qdrant/snapshots.d.ts.map +1 -0
- package/dist/services/qdrant/snapshots.js +130 -0
- package/dist/services/qdrant/snapshots.js.map +1 -0
- package/dist/services/qdrant/types.d.ts +39 -0
- package/dist/services/qdrant/types.d.ts.map +1 -0
- package/dist/services/qdrant/types.js +2 -0
- package/dist/services/qdrant/types.js.map +1 -0
- package/dist/services/qdrant/utils.d.ts +20 -0
- package/dist/services/qdrant/utils.d.ts.map +1 -0
- package/dist/services/qdrant/utils.js +121 -0
- package/dist/services/qdrant/utils.js.map +1 -0
- package/dist/services/redis-cache.d.ts +43 -0
- package/dist/services/redis-cache.d.ts.map +1 -0
- package/dist/services/redis-cache.js +214 -0
- package/dist/services/redis-cache.js.map +1 -0
- package/dist/services/redis.d.ts +43 -0
- package/dist/services/redis.d.ts.map +1 -0
- package/dist/services/redis.js +234 -0
- package/dist/services/redis.js.map +1 -0
- package/dist/services/stats/bonuses.d.ts +28 -0
- package/dist/services/stats/bonuses.d.ts.map +1 -0
- package/dist/services/stats/bonuses.js +96 -0
- package/dist/services/stats/bonuses.js.map +1 -0
- package/dist/services/stats/healer.d.ts +6 -0
- package/dist/services/stats/healer.d.ts.map +1 -0
- package/dist/services/stats/healer.js +24 -0
- package/dist/services/stats/healer.js.map +1 -0
- package/dist/services/stats/model-stats.d.ts +53 -0
- package/dist/services/stats/model-stats.d.ts.map +1 -0
- package/dist/services/stats/model-stats.js +238 -0
- package/dist/services/stats/model-stats.js.map +1 -0
- package/dist/services/stats/protocol.d.ts +11 -0
- package/dist/services/stats/protocol.d.ts.map +1 -0
- package/dist/services/stats/protocol.js +55 -0
- package/dist/services/stats/protocol.js.map +1 -0
- package/dist/services/stats/scoring.d.ts +19 -0
- package/dist/services/stats/scoring.d.ts.map +1 -0
- package/dist/services/stats/scoring.js +102 -0
- package/dist/services/stats/scoring.js.map +1 -0
- package/dist/services/stats/types.d.ts +39 -0
- package/dist/services/stats/types.d.ts.map +1 -0
- package/dist/services/stats/types.js +8 -0
- package/dist/services/stats/types.js.map +1 -0
- package/dist/tools/kairos_attest.d.ts +7 -0
- package/dist/tools/kairos_attest.d.ts.map +1 -0
- package/dist/tools/kairos_attest.js +179 -0
- package/dist/tools/kairos_attest.js.map +1 -0
- package/dist/tools/kairos_begin.d.ts +9 -0
- package/dist/tools/kairos_begin.d.ts.map +1 -0
- package/dist/tools/kairos_begin.js +149 -0
- package/dist/tools/kairos_begin.js.map +1 -0
- package/dist/tools/kairos_begin_schema.d.ts +48 -0
- package/dist/tools/kairos_begin_schema.d.ts.map +1 -0
- package/dist/tools/kairos_begin_schema.js +48 -0
- package/dist/tools/kairos_begin_schema.js.map +1 -0
- package/dist/tools/kairos_delete.d.ts +2 -0
- package/dist/tools/kairos_delete.d.ts.map +1 -0
- package/dist/tools/kairos_delete.js +113 -0
- package/dist/tools/kairos_delete.js.map +1 -0
- package/dist/tools/kairos_dump.d.ts +14 -0
- package/dist/tools/kairos_dump.d.ts.map +1 -0
- package/dist/tools/kairos_dump.js +148 -0
- package/dist/tools/kairos_dump.js.map +1 -0
- package/dist/tools/kairos_mint.d.ts +7 -0
- package/dist/tools/kairos_mint.d.ts.map +1 -0
- package/dist/tools/kairos_mint.js +233 -0
- package/dist/tools/kairos_mint.js.map +1 -0
- package/dist/tools/kairos_next-missing-proof-payload.d.ts +24 -0
- package/dist/tools/kairos_next-missing-proof-payload.d.ts.map +1 -0
- package/dist/tools/kairos_next-missing-proof-payload.js +32 -0
- package/dist/tools/kairos_next-missing-proof-payload.js.map +1 -0
- package/dist/tools/kairos_next-pow-helpers.d.ts +57 -0
- package/dist/tools/kairos_next-pow-helpers.d.ts.map +1 -0
- package/dist/tools/kairos_next-pow-helpers.js +271 -0
- package/dist/tools/kairos_next-pow-helpers.js.map +1 -0
- package/dist/tools/kairos_next-previous-step.d.ts +36 -0
- package/dist/tools/kairos_next-previous-step.d.ts.map +1 -0
- package/dist/tools/kairos_next-previous-step.js +121 -0
- package/dist/tools/kairos_next-previous-step.js.map +1 -0
- package/dist/tools/kairos_next.d.ts +12 -0
- package/dist/tools/kairos_next.d.ts.map +1 -0
- package/dist/tools/kairos_next.js +285 -0
- package/dist/tools/kairos_next.js.map +1 -0
- package/dist/tools/kairos_next_schema.d.ts +80 -0
- package/dist/tools/kairos_next_schema.d.ts.map +1 -0
- package/dist/tools/kairos_next_schema.js +82 -0
- package/dist/tools/kairos_next_schema.js.map +1 -0
- package/dist/tools/kairos_search.d.ts +15 -0
- package/dist/tools/kairos_search.d.ts.map +1 -0
- package/dist/tools/kairos_search.js +262 -0
- package/dist/tools/kairos_search.js.map +1 -0
- package/dist/tools/kairos_spaces.d.ts +10 -0
- package/dist/tools/kairos_spaces.d.ts.map +1 -0
- package/dist/tools/kairos_spaces.js +129 -0
- package/dist/tools/kairos_spaces.js.map +1 -0
- package/dist/tools/kairos_update.d.ts +2 -0
- package/dist/tools/kairos_update.d.ts.map +1 -0
- package/dist/tools/kairos_update.js +158 -0
- package/dist/tools/kairos_update.js.map +1 -0
- package/dist/types/index.d.ts +60 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +38 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/utils/build-version.d.ts +15 -0
- package/dist/utils/build-version.d.ts.map +1 -0
- package/dist/utils/build-version.js +46 -0
- package/dist/utils/build-version.js.map +1 -0
- package/dist/utils/global-error-handlers.d.ts +7 -0
- package/dist/utils/global-error-handlers.d.ts.map +1 -0
- package/dist/utils/global-error-handlers.js +61 -0
- package/dist/utils/global-error-handlers.js.map +1 -0
- package/dist/utils/log-core.d.ts +11 -0
- package/dist/utils/log-core.d.ts.map +1 -0
- package/dist/utils/log-core.js +78 -0
- package/dist/utils/log-core.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory-body.d.ts +6 -0
- package/dist/utils/memory-body.d.ts.map +1 -0
- package/dist/utils/memory-body.js +21 -0
- package/dist/utils/memory-body.js.map +1 -0
- package/dist/utils/memory-store-utils.d.ts +14 -0
- package/dist/utils/memory-store-utils.d.ts.map +1 -0
- package/dist/utils/memory-store-utils.js +83 -0
- package/dist/utils/memory-store-utils.js.map +1 -0
- package/dist/utils/qdrant-collection-utils.d.ts +11 -0
- package/dist/utils/qdrant-collection-utils.d.ts.map +1 -0
- package/dist/utils/qdrant-collection-utils.js +62 -0
- package/dist/utils/qdrant-collection-utils.js.map +1 -0
- package/dist/utils/qdrant-query-utils.d.ts +6 -0
- package/dist/utils/qdrant-query-utils.d.ts.map +1 -0
- package/dist/utils/qdrant-query-utils.js +23 -0
- package/dist/utils/qdrant-query-utils.js.map +1 -0
- package/dist/utils/qdrant-utils.d.ts +5 -0
- package/dist/utils/qdrant-utils.d.ts.map +1 -0
- package/dist/utils/qdrant-utils.js +5 -0
- package/dist/utils/qdrant-utils.js.map +1 -0
- package/dist/utils/qdrant-vector-management.d.ts +25 -0
- package/dist/utils/qdrant-vector-management.d.ts.map +1 -0
- package/dist/utils/qdrant-vector-management.js +284 -0
- package/dist/utils/qdrant-vector-management.js.map +1 -0
- package/dist/utils/qdrant-vector-types.d.ts +35 -0
- package/dist/utils/qdrant-vector-types.d.ts.map +1 -0
- package/dist/utils/qdrant-vector-types.js +42 -0
- package/dist/utils/qdrant-vector-types.js.map +1 -0
- package/dist/utils/space-display.d.ts +11 -0
- package/dist/utils/space-display.d.ts.map +1 -0
- package/dist/utils/space-display.js +25 -0
- package/dist/utils/space-display.js.map +1 -0
- package/dist/utils/space-filter.d.ts +15 -0
- package/dist/utils/space-filter.d.ts.map +1 -0
- package/dist/utils/space-filter.js +18 -0
- package/dist/utils/space-filter.js.map +1 -0
- package/dist/utils/structured-logger.d.ts +41 -0
- package/dist/utils/structured-logger.d.ts.map +1 -0
- package/dist/utils/structured-logger.js +133 -0
- package/dist/utils/structured-logger.js.map +1 -0
- package/dist/utils/tenant-context.d.ts +67 -0
- package/dist/utils/tenant-context.d.ts.map +1 -0
- package/dist/utils/tenant-context.js +154 -0
- package/dist/utils/tenant-context.js.map +1 -0
- package/dist/utils/uri-builder.d.ts +37 -0
- package/dist/utils/uri-builder.d.ts.map +1 -0
- package/dist/utils/uri-builder.js +60 -0
- package/dist/utils/uri-builder.js.map +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
import { keyValueStore } from './key-value-store-factory.js';
|
|
3
|
+
import { KAIROS_REDIS_PREFIX } from '../config.js';
|
|
4
|
+
import { getSpaceIdFromStorage } from '../utils/tenant-context.js';
|
|
5
|
+
export class RedisCacheService {
|
|
6
|
+
cachePrefix = 'search:';
|
|
7
|
+
invalidationChannel = 'cache:invalidation';
|
|
8
|
+
statsPrefix = 'stats:';
|
|
9
|
+
memoryPrefix = 'mem:';
|
|
10
|
+
constructor() {
|
|
11
|
+
logger.info('[RedisCacheService] Initialized with RedisService');
|
|
12
|
+
}
|
|
13
|
+
getCacheKey(query, limit, opts) {
|
|
14
|
+
const mode = opts && typeof opts.collapse === 'boolean' ? (opts.collapse ? 'collapsed' : 'natural') : 'collapsed';
|
|
15
|
+
return `${this.cachePrefix}${mode}:${query}:${limit}`;
|
|
16
|
+
}
|
|
17
|
+
async getSearchResult(query, limit, opts) {
|
|
18
|
+
try {
|
|
19
|
+
const key = this.getCacheKey(query, limit, opts);
|
|
20
|
+
const cached = await keyValueStore.getJson(key);
|
|
21
|
+
if (cached) {
|
|
22
|
+
logger.debug(`[RedisCacheService] Cache hit for query "${query}" limit ${limit}`);
|
|
23
|
+
await this.incrementHits();
|
|
24
|
+
return cached;
|
|
25
|
+
}
|
|
26
|
+
logger.debug(`[RedisCacheService] Cache miss for query "${query}" limit ${limit}`);
|
|
27
|
+
await this.incrementMisses();
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
logger.error('[RedisCacheService] Failed to get search result from cache:', error);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async setSearchResult(query, limit, result, opts) {
|
|
36
|
+
try {
|
|
37
|
+
const key = this.getCacheKey(query, limit, opts);
|
|
38
|
+
const ttl = 300; // 5 minutes
|
|
39
|
+
const cachedResult = {
|
|
40
|
+
results: result.memories.map((memory, index) => ({
|
|
41
|
+
uri: `kairos://mem/${memory.memory_uuid}`,
|
|
42
|
+
label: memory.label,
|
|
43
|
+
score: result.scores[index] ?? 0
|
|
44
|
+
}))
|
|
45
|
+
};
|
|
46
|
+
await keyValueStore.setJson(key, cachedResult, ttl);
|
|
47
|
+
logger.debug(`[RedisCacheService] Cached search result for query "${query}" limit ${limit}`);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.error('[RedisCacheService] Failed to set search result in cache:', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async invalidateSearchCache() {
|
|
54
|
+
try {
|
|
55
|
+
logger.info(`[RedisCacheService] Search cache invalidation requested`);
|
|
56
|
+
// Delete keys matching search cache pattern (all collapse modes)
|
|
57
|
+
const keys = await keyValueStore.keys(`${this.cachePrefix}*`);
|
|
58
|
+
if (!keys || keys.length === 0) {
|
|
59
|
+
logger.debug('[RedisCacheService] No search cache keys to delete');
|
|
60
|
+
// Still publish invalidation event even if no keys to delete
|
|
61
|
+
await this.publishInvalidation('search');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Keys returned are full Redis keys (prefix + spaceId + logicalKey); strip to get logicalKey for del()
|
|
65
|
+
const keyPrefix = `${KAIROS_REDIS_PREFIX}${getSpaceIdFromStorage()}:`;
|
|
66
|
+
const stripped = keys.map(k => k.startsWith(keyPrefix) ? k.slice(keyPrefix.length) : k);
|
|
67
|
+
await Promise.all(stripped.map(k => keyValueStore.del(k)));
|
|
68
|
+
logger.info(`[RedisCacheService] Invalidated ${stripped.length} search cache keys`);
|
|
69
|
+
// Publish invalidation event
|
|
70
|
+
await this.publishInvalidation('search');
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error('[RedisCacheService] Failed to invalidate search cache:', error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Remove cached memory by UUID (kb:<prefix>mem:{uuid})
|
|
77
|
+
async invalidateMemoryCache(uuid) {
|
|
78
|
+
try {
|
|
79
|
+
if (!uuid || typeof uuid !== 'string') {
|
|
80
|
+
logger.warn('[RedisCacheService] invalidateMemoryCache called with invalid uuid');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const key = `${this.memoryPrefix}${uuid}`;
|
|
84
|
+
await keyValueStore.del(key);
|
|
85
|
+
logger.debug(`[RedisCacheService] Invalidated memory cache for UUID ${uuid}`);
|
|
86
|
+
// Publish invalidation event
|
|
87
|
+
await this.publishInvalidation('memory');
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error('[RedisCacheService] Failed to invalidate memory cache:', error);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async publishInvalidation(type) {
|
|
94
|
+
try {
|
|
95
|
+
const message = JSON.stringify({
|
|
96
|
+
type,
|
|
97
|
+
timestamp: Date.now()
|
|
98
|
+
});
|
|
99
|
+
const subscribers = await keyValueStore.publish(this.invalidationChannel, message);
|
|
100
|
+
logger.debug(`[RedisCacheService] Published invalidation event: ${type} to ${this.invalidationChannel} (${subscribers} subscribers notified)`);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
logger.error('[RedisCacheService] Failed to publish invalidation:', error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async incrementHits() {
|
|
107
|
+
try {
|
|
108
|
+
await keyValueStore.incr(`${this.statsPrefix}hits`);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
logger.error('[RedisCacheService] Failed to increment hits:', error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async incrementMisses() {
|
|
115
|
+
try {
|
|
116
|
+
await keyValueStore.incr(`${this.statsPrefix}misses`);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger.error('[RedisCacheService] Failed to increment misses:', error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async getCacheStats() {
|
|
123
|
+
try {
|
|
124
|
+
const [hits, misses] = await Promise.all([
|
|
125
|
+
keyValueStore.get(`${this.statsPrefix}hits`),
|
|
126
|
+
keyValueStore.get(`${this.statsPrefix}misses`)
|
|
127
|
+
]);
|
|
128
|
+
return {
|
|
129
|
+
hits: parseInt(hits || '0', 10),
|
|
130
|
+
misses: parseInt(misses || '0', 10)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
logger.error('[RedisCacheService] Failed to get cache stats:', error);
|
|
135
|
+
return { hits: 0, misses: 0 };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Memory resource caching methods
|
|
139
|
+
async getMemoryResource(uuid) {
|
|
140
|
+
try {
|
|
141
|
+
const key = `${this.memoryPrefix}${uuid}`;
|
|
142
|
+
const cached = await keyValueStore.getJson(key);
|
|
143
|
+
if (cached) {
|
|
144
|
+
logger.debug(`[RedisCacheService] Memory cache hit for UUID ${uuid}`);
|
|
145
|
+
return cached;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger.error('[RedisCacheService] Failed to get memory from cache:', error);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async setMemoryResource(memory) {
|
|
155
|
+
try {
|
|
156
|
+
const key = `${this.memoryPrefix}${memory.memory_uuid}`;
|
|
157
|
+
// Store memories without TTL (permanent storage)
|
|
158
|
+
await keyValueStore.setJson(key, memory);
|
|
159
|
+
logger.debug(`[RedisCacheService] Cached memory resource for UUID ${memory.memory_uuid} (no TTL)`);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
logger.error('[RedisCacheService] Failed to cache memory resource:', error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Invalidate begin cache (kairos_begin tool results)
|
|
166
|
+
async invalidateBeginCache() {
|
|
167
|
+
try {
|
|
168
|
+
logger.info(`[RedisCacheService] Begin cache invalidation requested`);
|
|
169
|
+
// Delete keys matching begin cache pattern
|
|
170
|
+
const keys = await keyValueStore.keys('begin:*');
|
|
171
|
+
if (!keys || keys.length === 0) {
|
|
172
|
+
logger.debug('[RedisCacheService] No begin cache keys to delete');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Keys returned are full Redis keys (prefix + spaceId + logicalKey); strip to get logicalKey for del()
|
|
176
|
+
const keyPrefix = `${KAIROS_REDIS_PREFIX}${getSpaceIdFromStorage()}:`;
|
|
177
|
+
const stripped = keys.map(k => k.startsWith(keyPrefix) ? k.slice(keyPrefix.length) : k);
|
|
178
|
+
await Promise.all(stripped.map(k => keyValueStore.del(k)));
|
|
179
|
+
logger.info(`[RedisCacheService] Invalidated ${stripped.length} begin cache keys`);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
logger.error('[RedisCacheService] Failed to invalidate begin cache:', error);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// For atomic operations as per plan
|
|
186
|
+
// System is mostly read-heavy, so invalidate aggressively on writes
|
|
187
|
+
async invalidateAfterUpdate() {
|
|
188
|
+
logger.info('[RedisCacheService] Cache invalidation after Qdrant update - clearing all search and begin caches');
|
|
189
|
+
await Promise.all([
|
|
190
|
+
this.invalidateSearchCache(),
|
|
191
|
+
this.invalidateBeginCache()
|
|
192
|
+
]);
|
|
193
|
+
}
|
|
194
|
+
// Generic get and set methods for arbitrary caching
|
|
195
|
+
async get(key) {
|
|
196
|
+
try {
|
|
197
|
+
return await keyValueStore.get(key);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
logger.error('[RedisCacheService] Failed to get from cache:', error);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async set(key, value, ttl) {
|
|
205
|
+
try {
|
|
206
|
+
await keyValueStore.set(key, value, ttl);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
logger.error('[RedisCacheService] Failed to set in cache:', error);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export const redisCacheService = new RedisCacheService();
|
|
214
|
+
//# sourceMappingURL=redis-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-cache.js","sourceRoot":"","sources":["../../src/services/redis-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Service for KAIROS persistence
|
|
3
|
+
*
|
|
4
|
+
* Provides Redis-based persistence for game data and other shared state.
|
|
5
|
+
* Uses configurable key prefix (default: 'kb:') via KAIROS_REDIS_PREFIX env var for isolation.
|
|
6
|
+
* Use keyValueStore from key-value-store-factory.js unless you need Redis-specific behavior.
|
|
7
|
+
*/
|
|
8
|
+
import type { IKeyValueStore } from './key-value-store.js';
|
|
9
|
+
export declare class RedisService implements IKeyValueStore {
|
|
10
|
+
private client;
|
|
11
|
+
private readonly prefix;
|
|
12
|
+
private connected;
|
|
13
|
+
private readonly redisUrl;
|
|
14
|
+
constructor();
|
|
15
|
+
connect(): Promise<void>;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
/** Key is namespaced by current space (AsyncLocalStorage) so cache and proof-of-work do not collide across spaces. */
|
|
18
|
+
private getKey;
|
|
19
|
+
get(key: string): Promise<string | null>;
|
|
20
|
+
set(key: string, value: string, ttl?: number): Promise<void>;
|
|
21
|
+
del(key: string): Promise<void>;
|
|
22
|
+
hget(hash: string, field: string): Promise<string | null>;
|
|
23
|
+
hset(hash: string, field: string, value: string): Promise<void>;
|
|
24
|
+
hgetall(hash: string): Promise<Record<string, string> | null>;
|
|
25
|
+
hsetall(hash: string, data: Record<string, string>): Promise<void>;
|
|
26
|
+
incr(key: string): Promise<number>;
|
|
27
|
+
exists(key: string): Promise<boolean>;
|
|
28
|
+
keys(pattern: string): Promise<string[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Publish a message to a Redis channel (pub/sub)
|
|
31
|
+
* Note: Channel names are NOT prefixed to allow cross-instance communication
|
|
32
|
+
* @param channel Channel name to publish to
|
|
33
|
+
* @param message Message to publish
|
|
34
|
+
* @returns Number of subscribers that received the message
|
|
35
|
+
*/
|
|
36
|
+
publish(channel: string, message: string): Promise<number>;
|
|
37
|
+
getJson<T>(key: string): Promise<T | null>;
|
|
38
|
+
setJson<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
39
|
+
hgetJson<T>(hash: string, field: string): Promise<T | null>;
|
|
40
|
+
hsetJson<T>(hash: string, field: string, value: T): Promise<void>;
|
|
41
|
+
isConnected(): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;;IAuD5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,sHAAsH;IACtH,OAAO,CAAC,MAAM;IAKR,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAS7D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9C;;;;;;OAMG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAW1C,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9D,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAW3D,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE,WAAW,IAAI,OAAO;CAGzB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Service for KAIROS persistence
|
|
3
|
+
*
|
|
4
|
+
* Provides Redis-based persistence for game data and other shared state.
|
|
5
|
+
* Uses configurable key prefix (default: 'kb:') via KAIROS_REDIS_PREFIX env var for isolation.
|
|
6
|
+
* Use keyValueStore from key-value-store-factory.js unless you need Redis-specific behavior.
|
|
7
|
+
*/
|
|
8
|
+
import { createClient } from 'redis';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
import { REDIS_URL, KAIROS_REDIS_PREFIX } from '../config.js';
|
|
11
|
+
import { getSpaceIdFromStorage } from '../utils/tenant-context.js';
|
|
12
|
+
export class RedisService {
|
|
13
|
+
client;
|
|
14
|
+
prefix;
|
|
15
|
+
connected = false;
|
|
16
|
+
redisUrl;
|
|
17
|
+
constructor() {
|
|
18
|
+
const redisUrl = REDIS_URL;
|
|
19
|
+
this.redisUrl = redisUrl;
|
|
20
|
+
this.prefix = KAIROS_REDIS_PREFIX;
|
|
21
|
+
logger.debug(`[RedisService] Initializing with REDIS_URL="${redisUrl}" and KAIROS_REDIS_PREFIX="${this.prefix}"`);
|
|
22
|
+
this.client = createClient({
|
|
23
|
+
url: redisUrl
|
|
24
|
+
});
|
|
25
|
+
this.client.on('error', (err) => {
|
|
26
|
+
logger.error('Redis Client Error', err);
|
|
27
|
+
logger.debug(`[RedisService] Error details: ${err?.message || err} | code=${(err && err.code) || 'n/a'} ` +
|
|
28
|
+
`errno=${(err && err.errno) || 'n/a'} address=${(err && err.address) || 'n/a'} ` +
|
|
29
|
+
`port=${(err && err.port) || 'n/a'} target="${this.redisUrl}"`);
|
|
30
|
+
// If this is an AggregateError, log each inner error for deep diagnostics
|
|
31
|
+
const innerErrors = err && typeof err === 'object' && 'errors' in err ? err.errors : undefined;
|
|
32
|
+
if (Array.isArray(innerErrors) && innerErrors.length > 0) {
|
|
33
|
+
innerErrors.forEach((inner, index) => {
|
|
34
|
+
logger.debug(`[RedisService] Inner error[${index}] code=${inner?.code || 'n/a'} ` +
|
|
35
|
+
`errno=${inner?.errno || 'n/a'} address=${inner?.address || 'n/a'} ` +
|
|
36
|
+
`port=${inner?.port || 'n/a'} message=${inner?.message || inner}`);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
this.client.on('connect', () => {
|
|
41
|
+
logger.info('Connecting to Redis...');
|
|
42
|
+
logger.debug(`[RedisService] Attempting connection to ${redisUrl}`);
|
|
43
|
+
});
|
|
44
|
+
this.client.on('ready', () => {
|
|
45
|
+
logger.info('Redis client ready');
|
|
46
|
+
logger.debug('[RedisService] Redis client is ready and operational');
|
|
47
|
+
this.connected = true;
|
|
48
|
+
});
|
|
49
|
+
this.client.on('end', () => {
|
|
50
|
+
logger.info('Redis connection closed');
|
|
51
|
+
logger.debug('[RedisService] Redis connection ended');
|
|
52
|
+
this.connected = false;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async connect() {
|
|
56
|
+
if (!this.connected) {
|
|
57
|
+
logger.info(`[RedisService] connect() called, attempting connection to "${this.redisUrl}"`);
|
|
58
|
+
try {
|
|
59
|
+
await this.client.connect();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.error(`[RedisService] connect() failed for "${this.redisUrl}"`, error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async disconnect() {
|
|
68
|
+
if (this.connected) {
|
|
69
|
+
await this.client.quit();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Key is namespaced by current space (AsyncLocalStorage) so cache and proof-of-work do not collide across spaces. */
|
|
73
|
+
getKey(key) {
|
|
74
|
+
const spaceId = getSpaceIdFromStorage();
|
|
75
|
+
return `${this.prefix}${spaceId}:${key}`;
|
|
76
|
+
}
|
|
77
|
+
async get(key) {
|
|
78
|
+
try {
|
|
79
|
+
return await this.client.get(this.getKey(key));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.error(`Redis GET error for key ${key}:`, error);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async set(key, value, ttl) {
|
|
87
|
+
try {
|
|
88
|
+
if (ttl) {
|
|
89
|
+
await this.client.setEx(this.getKey(key), ttl, value);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
await this.client.set(this.getKey(key), value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logger.error(`Redis SET error for key ${key}:`, error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async del(key) {
|
|
100
|
+
try {
|
|
101
|
+
await this.client.del(this.getKey(key));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger.error(`Redis DEL error for key ${key}:`, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async hget(hash, field) {
|
|
108
|
+
try {
|
|
109
|
+
return await this.client.hGet(this.getKey(hash), field);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
logger.error(`Redis HGET error for hash ${hash} field ${field}:`, error);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async hset(hash, field, value) {
|
|
117
|
+
try {
|
|
118
|
+
await this.client.hSet(this.getKey(hash), field, value);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.error(`Redis HSET error for hash ${hash} field ${field}:`, error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async hgetall(hash) {
|
|
125
|
+
try {
|
|
126
|
+
return await this.client.hGetAll(this.getKey(hash));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error(`Redis HGETALL error for hash ${hash}:`, error);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async hsetall(hash, data) {
|
|
134
|
+
try {
|
|
135
|
+
await this.client.hSet(this.getKey(hash), data);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
logger.error(`Redis HSETALL error for hash ${hash}:`, error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async incr(key) {
|
|
142
|
+
try {
|
|
143
|
+
return await this.client.incr(this.getKey(key));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
logger.error(`Redis INCR error for key ${key}:`, error);
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async exists(key) {
|
|
151
|
+
try {
|
|
152
|
+
const result = await this.client.exists(this.getKey(key));
|
|
153
|
+
return result === 1;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
logger.error(`Redis EXISTS error for key ${key}:`, error);
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async keys(pattern) {
|
|
161
|
+
try {
|
|
162
|
+
return await this.client.keys(this.getKey(pattern));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
logger.error(`Redis KEYS error for pattern ${pattern}:`, error);
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Publish a message to a Redis channel (pub/sub)
|
|
171
|
+
* Note: Channel names are NOT prefixed to allow cross-instance communication
|
|
172
|
+
* @param channel Channel name to publish to
|
|
173
|
+
* @param message Message to publish
|
|
174
|
+
* @returns Number of subscribers that received the message
|
|
175
|
+
*/
|
|
176
|
+
async publish(channel, message) {
|
|
177
|
+
try {
|
|
178
|
+
const result = await this.client.publish(channel, message);
|
|
179
|
+
logger.debug(`[RedisService] Published message to channel "${channel}", ${result} subscribers notified`);
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
logger.error(`Redis PUBLISH error for channel ${channel}:`, error);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Utility methods for JSON objects
|
|
188
|
+
async getJson(key) {
|
|
189
|
+
const value = await this.get(key);
|
|
190
|
+
if (!value)
|
|
191
|
+
return null;
|
|
192
|
+
try {
|
|
193
|
+
return JSON.parse(value);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
logger.error(`JSON parse error for key ${key}:`, error);
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async setJson(key, value, ttl) {
|
|
201
|
+
try {
|
|
202
|
+
const jsonValue = JSON.stringify(value);
|
|
203
|
+
await this.set(key, jsonValue, ttl);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
logger.error(`JSON stringify error for key ${key}:`, error);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async hgetJson(hash, field) {
|
|
210
|
+
const value = await this.hget(hash, field);
|
|
211
|
+
if (!value)
|
|
212
|
+
return null;
|
|
213
|
+
try {
|
|
214
|
+
return JSON.parse(value);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger.error(`JSON parse error for hash ${hash} field ${field}:`, error);
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async hsetJson(hash, field, value) {
|
|
222
|
+
try {
|
|
223
|
+
const jsonValue = JSON.stringify(value);
|
|
224
|
+
await this.hset(hash, field, jsonValue);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
logger.error(`JSON stringify error for hash ${hash} field ${field}:`, error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
isConnected() {
|
|
231
|
+
return this.connected;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=redis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implementation bonus core algorithms (statistical adjustments, rarity/comparative)
|
|
3
|
+
* These functions are pure/near-pure and operate on supplied data structures so the
|
|
4
|
+
* orchestrator can handle persistence and state mutation.
|
|
5
|
+
*/
|
|
6
|
+
import type { ModelImplementationData } from '../../types/index.js';
|
|
7
|
+
export declare function calculateWilsonAdjustment(modelData: ModelImplementationData): number;
|
|
8
|
+
/**
|
|
9
|
+
* Compute implementation bonus given a qualityMetrics object.
|
|
10
|
+
*
|
|
11
|
+
* This function mutates qualityMetrics to record attempts/successes for the specific model.
|
|
12
|
+
* It returns an object describing the awarded bonus and whether a "rare success" occurred.
|
|
13
|
+
*
|
|
14
|
+
* Parameters:
|
|
15
|
+
* - qualityMetrics: the QualityMetrics object from memory payload (may be created by caller)
|
|
16
|
+
* - llm_model_id: model identifier
|
|
17
|
+
* - outcome: 'success' | 'partial' | 'failure'
|
|
18
|
+
*
|
|
19
|
+
* Returns:
|
|
20
|
+
* { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess }
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeImplementationBonus(qualityMetrics: any, llm_model_id: string, outcome: 'success' | 'partial' | 'failure'): {
|
|
23
|
+
finalBonus: number;
|
|
24
|
+
comparativeBonus: number;
|
|
25
|
+
rarityMultiplier: number;
|
|
26
|
+
rareSuccess: boolean;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=bonuses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bonuses.d.ts","sourceRoot":"","sources":["../../../src/services/stats/bonuses.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,uBAAuB,GAAG,MAAM,CAWpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACtC,cAAc,EAAE,GAAG,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAC3C;IACC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;CACxB,CA0EA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implementation bonus core algorithms (statistical adjustments, rarity/comparative)
|
|
3
|
+
* These functions are pure/near-pure and operate on supplied data structures so the
|
|
4
|
+
* orchestrator can handle persistence and state mutation.
|
|
5
|
+
*/
|
|
6
|
+
export function calculateWilsonAdjustment(modelData) {
|
|
7
|
+
const { successes, attempts } = modelData;
|
|
8
|
+
if (attempts === 0)
|
|
9
|
+
return 0.5;
|
|
10
|
+
const z = 1.96;
|
|
11
|
+
const p = successes / attempts;
|
|
12
|
+
const n = attempts;
|
|
13
|
+
const denominator = 1 + z * z / n;
|
|
14
|
+
const numerator = p + z * z / (2 * n);
|
|
15
|
+
const adjustment = z * Math.sqrt(p * (1 - p) / n + z * z / (4 * n * n));
|
|
16
|
+
const lowerBound = Math.max(0, (numerator - adjustment) / denominator);
|
|
17
|
+
return 0.5 + (lowerBound * 1.0);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compute implementation bonus given a qualityMetrics object.
|
|
21
|
+
*
|
|
22
|
+
* This function mutates qualityMetrics to record attempts/successes for the specific model.
|
|
23
|
+
* It returns an object describing the awarded bonus and whether a "rare success" occurred.
|
|
24
|
+
*
|
|
25
|
+
* Parameters:
|
|
26
|
+
* - qualityMetrics: the QualityMetrics object from memory payload (may be created by caller)
|
|
27
|
+
* - llm_model_id: model identifier
|
|
28
|
+
* - outcome: 'success' | 'partial' | 'failure'
|
|
29
|
+
*
|
|
30
|
+
* Returns:
|
|
31
|
+
* { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess }
|
|
32
|
+
*/
|
|
33
|
+
export function computeImplementationBonus(qualityMetrics, llm_model_id, outcome) {
|
|
34
|
+
if (!qualityMetrics.implementation_stats) {
|
|
35
|
+
qualityMetrics.implementation_stats = {
|
|
36
|
+
total_attempts: 0,
|
|
37
|
+
success_attempts: 0,
|
|
38
|
+
model_success_rates: {},
|
|
39
|
+
confidence_level: 0,
|
|
40
|
+
last_implementation_attempt: null
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const stats = qualityMetrics.implementation_stats;
|
|
44
|
+
if (!stats.model_success_rates[llm_model_id]) {
|
|
45
|
+
stats.model_success_rates[llm_model_id] = {
|
|
46
|
+
attempts: 0,
|
|
47
|
+
successes: 0,
|
|
48
|
+
success_rate: 0,
|
|
49
|
+
wilson_lower: 0,
|
|
50
|
+
wilson_upper: 0,
|
|
51
|
+
last_attempt: null
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const modelData = stats.model_success_rates[llm_model_id];
|
|
55
|
+
// Update attempts
|
|
56
|
+
stats.total_attempts = (stats.total_attempts || 0) + 1;
|
|
57
|
+
modelData.attempts = (modelData.attempts || 0) + 1;
|
|
58
|
+
// Determine base bonus
|
|
59
|
+
let bonus = 0;
|
|
60
|
+
if (outcome === 'success') {
|
|
61
|
+
bonus = 5;
|
|
62
|
+
stats.success_attempts = (stats.success_attempts || 0) + 1;
|
|
63
|
+
modelData.successes = (modelData.successes || 0) + 1;
|
|
64
|
+
}
|
|
65
|
+
else if (outcome === 'partial') {
|
|
66
|
+
bonus = 2;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// failure: record and return 0
|
|
70
|
+
modelData.success_rate = modelData.attempts > 0 ? (modelData.successes || 0) / modelData.attempts : 0;
|
|
71
|
+
return { finalBonus: 0, comparativeBonus: 0, rarityMultiplier: 1, rareSuccess: false };
|
|
72
|
+
}
|
|
73
|
+
modelData.success_rate = modelData.attempts > 0 ? (modelData.successes || 0) / modelData.attempts : 0;
|
|
74
|
+
const overallSuccessRate = stats.total_attempts > 0 ? (stats.success_attempts || 0) / stats.total_attempts : 0;
|
|
75
|
+
const rarityMultiplier = Math.max(1, 1 / Math.max(0.1, overallSuccessRate));
|
|
76
|
+
// Comparative bonus when model outperforms others
|
|
77
|
+
let comparativeBonus = 0;
|
|
78
|
+
const otherModels = Object.entries(stats.model_success_rates).filter(([modelId]) => modelId !== llm_model_id);
|
|
79
|
+
if (otherModels.length > 0) {
|
|
80
|
+
const otherSuccessRates = otherModels.map(([, data]) => data.attempts > 0 ? (data.successes || 0) / data.attempts : 0);
|
|
81
|
+
const avgOtherSuccessRate = otherSuccessRates.reduce((s, r) => s + r, 0) / otherSuccessRates.length;
|
|
82
|
+
if (avgOtherSuccessRate < 0.5 && modelData.success_rate > avgOtherSuccessRate) {
|
|
83
|
+
comparativeBonus = Math.min(10, (modelData.success_rate - avgOtherSuccessRate) * 20);
|
|
84
|
+
bonus += comparativeBonus;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Wilson adjustment
|
|
88
|
+
const wilsonAdj = calculateWilsonAdjustment(modelData);
|
|
89
|
+
bonus *= wilsonAdj;
|
|
90
|
+
// Apply rarity multiplier (capped at 3x)
|
|
91
|
+
bonus *= Math.min(3, rarityMultiplier);
|
|
92
|
+
const finalBonus = Math.min(25, Math.round(bonus));
|
|
93
|
+
const rareSuccess = comparativeBonus > 0 && outcome === 'success';
|
|
94
|
+
return { finalBonus, comparativeBonus, rarityMultiplier, rareSuccess };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=bonuses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bonuses.js","sourceRoot":"","sources":["../../../src/services/stats/bonuses.ts"],"names":[],"mappings":"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"}
|