@namzu/sdk 0.4.2 → 0.4.4
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/CHANGELOG.md +46 -0
- package/dist/advisory/context.test.d.ts +16 -0
- package/dist/advisory/context.test.d.ts.map +1 -0
- package/dist/advisory/context.test.js +92 -0
- package/dist/advisory/context.test.js.map +1 -0
- package/dist/advisory/evaluator.test.d.ts +34 -0
- package/dist/advisory/evaluator.test.d.ts.map +1 -0
- package/dist/advisory/evaluator.test.js +172 -0
- package/dist/advisory/evaluator.test.js.map +1 -0
- package/dist/advisory/executor.test.d.ts +35 -0
- package/dist/advisory/executor.test.d.ts.map +1 -0
- package/dist/advisory/executor.test.js +233 -0
- package/dist/advisory/executor.test.js.map +1 -0
- package/dist/advisory/registry.test.d.ts +16 -0
- package/dist/advisory/registry.test.d.ts.map +1 -0
- package/dist/advisory/registry.test.js +62 -0
- package/dist/advisory/registry.test.js.map +1 -0
- package/dist/bridge/a2a/agent-card.test.d.ts +24 -0
- package/dist/bridge/a2a/agent-card.test.d.ts.map +1 -0
- package/dist/bridge/a2a/agent-card.test.js +118 -0
- package/dist/bridge/a2a/agent-card.test.js.map +1 -0
- package/dist/bridge/a2a/mapper.test.d.ts +29 -0
- package/dist/bridge/a2a/mapper.test.d.ts.map +1 -0
- package/dist/bridge/a2a/mapper.test.js +265 -0
- package/dist/bridge/a2a/mapper.test.js.map +1 -0
- package/dist/bridge/a2a/message.test.d.ts +20 -0
- package/dist/bridge/a2a/message.test.d.ts.map +1 -0
- package/dist/bridge/a2a/message.test.js +116 -0
- package/dist/bridge/a2a/message.test.js.map +1 -0
- package/dist/bridge/a2a/task.test.d.ts +29 -0
- package/dist/bridge/a2a/task.test.d.ts.map +1 -0
- package/dist/bridge/a2a/task.test.js +198 -0
- package/dist/bridge/a2a/task.test.js.map +1 -0
- package/dist/bridge/mcp/connector/adapter.test.d.ts +27 -0
- package/dist/bridge/mcp/connector/adapter.test.d.ts.map +1 -0
- package/dist/bridge/mcp/connector/adapter.test.js +203 -0
- package/dist/bridge/mcp/connector/adapter.test.js.map +1 -0
- package/dist/bridge/sse/mapper.test.d.ts +27 -0
- package/dist/bridge/sse/mapper.test.d.ts.map +1 -0
- package/dist/bridge/sse/mapper.test.js +271 -0
- package/dist/bridge/sse/mapper.test.js.map +1 -0
- package/dist/bridge/tools/connector/adapter.d.ts +2 -2
- package/dist/bridge/tools/connector/adapter.test.d.ts +28 -0
- package/dist/bridge/tools/connector/adapter.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/adapter.test.js +182 -0
- package/dist/bridge/tools/connector/adapter.test.js.map +1 -0
- package/dist/bridge/tools/connector/definitions.test.d.ts +23 -0
- package/dist/bridge/tools/connector/definitions.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/definitions.test.js +158 -0
- package/dist/bridge/tools/connector/definitions.test.js.map +1 -0
- package/dist/bridge/tools/connector/router.test.d.ts +21 -0
- package/dist/bridge/tools/connector/router.test.d.ts.map +1 -0
- package/dist/bridge/tools/connector/router.test.js +139 -0
- package/dist/bridge/tools/connector/router.test.js.map +1 -0
- package/dist/bus/breaker.test.d.ts +41 -0
- package/dist/bus/breaker.test.d.ts.map +1 -0
- package/dist/bus/breaker.test.js +242 -0
- package/dist/bus/breaker.test.js.map +1 -0
- package/dist/bus/index.d.ts +3 -1
- package/dist/bus/index.d.ts.map +1 -1
- package/dist/bus/index.js +18 -11
- package/dist/bus/index.js.map +1 -1
- package/dist/bus/index.test.d.ts +25 -0
- package/dist/bus/index.test.d.ts.map +1 -0
- package/dist/bus/index.test.js +151 -0
- package/dist/bus/index.test.js.map +1 -0
- package/dist/bus/lock.test.d.ts +44 -0
- package/dist/bus/lock.test.d.ts.map +1 -0
- package/dist/bus/lock.test.js +226 -0
- package/dist/bus/lock.test.js.map +1 -0
- package/dist/bus/ownership.test.d.ts +26 -0
- package/dist/bus/ownership.test.d.ts.map +1 -0
- package/dist/bus/ownership.test.js +205 -0
- package/dist/bus/ownership.test.js.map +1 -0
- package/dist/config/runtime.d.ts +28 -28
- package/dist/connector/BaseConnector.test.d.ts +21 -0
- package/dist/connector/BaseConnector.test.d.ts.map +1 -0
- package/dist/connector/BaseConnector.test.js +108 -0
- package/dist/connector/BaseConnector.test.js.map +1 -0
- package/dist/connector/builtins/http.test.d.ts +30 -0
- package/dist/connector/builtins/http.test.d.ts.map +1 -0
- package/dist/connector/builtins/http.test.js +232 -0
- package/dist/connector/builtins/http.test.js.map +1 -0
- package/dist/connector/builtins/webhook.test.d.ts +20 -0
- package/dist/connector/builtins/webhook.test.d.ts.map +1 -0
- package/dist/connector/builtins/webhook.test.js +113 -0
- package/dist/connector/builtins/webhook.test.js.map +1 -0
- package/dist/connector/execution/factory.test.d.ts +16 -0
- package/dist/connector/execution/factory.test.d.ts.map +1 -0
- package/dist/connector/execution/factory.test.js +64 -0
- package/dist/connector/execution/factory.test.js.map +1 -0
- package/dist/connector/execution/remote.test.d.ts +16 -0
- package/dist/connector/execution/remote.test.d.ts.map +1 -0
- package/dist/connector/execution/remote.test.js +53 -0
- package/dist/connector/execution/remote.test.js.map +1 -0
- package/dist/connector/mcp/adapter.test.d.ts +34 -0
- package/dist/connector/mcp/adapter.test.d.ts.map +1 -0
- package/dist/connector/mcp/adapter.test.js +199 -0
- package/dist/connector/mcp/adapter.test.js.map +1 -0
- package/dist/probe/context.d.ts +8 -0
- package/dist/probe/context.d.ts.map +1 -0
- package/dist/probe/context.js +7 -0
- package/dist/probe/context.js.map +1 -0
- package/dist/probe/errors.d.ts +12 -0
- package/dist/probe/errors.d.ts.map +1 -0
- package/dist/probe/errors.js +21 -0
- package/dist/probe/errors.js.map +1 -0
- package/dist/probe/index.d.ts +5 -0
- package/dist/probe/index.d.ts.map +1 -0
- package/dist/probe/index.js +4 -0
- package/dist/probe/index.js.map +1 -0
- package/dist/probe/registry.d.ts +24 -0
- package/dist/probe/registry.d.ts.map +1 -0
- package/dist/probe/registry.js +228 -0
- package/dist/probe/registry.js.map +1 -0
- package/dist/probe/registry.test.d.ts +7 -0
- package/dist/probe/registry.test.d.ts.map +1 -0
- package/dist/probe/registry.test.js +310 -0
- package/dist/probe/registry.test.js.map +1 -0
- package/dist/provider/instrumentation.d.ts +9 -0
- package/dist/provider/instrumentation.d.ts.map +1 -0
- package/dist/provider/instrumentation.js +104 -0
- package/dist/provider/instrumentation.js.map +1 -0
- package/dist/provider/instrumentation.test.d.ts +2 -0
- package/dist/provider/instrumentation.test.d.ts.map +1 -0
- package/dist/provider/instrumentation.test.js +152 -0
- package/dist/provider/instrumentation.test.js.map +1 -0
- package/dist/public-runtime.d.ts +5 -0
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +4 -0
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-types.d.ts +3 -0
- package/dist/public-types.d.ts.map +1 -1
- package/dist/rag/chunking.test.d.ts +20 -0
- package/dist/rag/chunking.test.d.ts.map +1 -0
- package/dist/rag/chunking.test.js +92 -0
- package/dist/rag/chunking.test.js.map +1 -0
- package/dist/rag/context-assembler.test.d.ts +19 -0
- package/dist/rag/context-assembler.test.d.ts.map +1 -0
- package/dist/rag/context-assembler.test.js +98 -0
- package/dist/rag/context-assembler.test.js.map +1 -0
- package/dist/rag/embedding.test.d.ts +19 -0
- package/dist/rag/embedding.test.d.ts.map +1 -0
- package/dist/rag/embedding.test.js +115 -0
- package/dist/rag/embedding.test.js.map +1 -0
- package/dist/rag/ingestion.test.d.ts +22 -0
- package/dist/rag/ingestion.test.d.ts.map +1 -0
- package/dist/rag/ingestion.test.js +99 -0
- package/dist/rag/ingestion.test.js.map +1 -0
- package/dist/rag/knowledge-base.test.d.ts +17 -0
- package/dist/rag/knowledge-base.test.d.ts.map +1 -0
- package/dist/rag/knowledge-base.test.js +77 -0
- package/dist/rag/knowledge-base.test.js.map +1 -0
- package/dist/rag/rag-tool.test.d.ts +21 -0
- package/dist/rag/rag-tool.test.d.ts.map +1 -0
- package/dist/rag/rag-tool.test.js +149 -0
- package/dist/rag/rag-tool.test.js.map +1 -0
- package/dist/rag/retriever.test.d.ts +26 -0
- package/dist/rag/retriever.test.d.ts.map +1 -0
- package/dist/rag/retriever.test.js +180 -0
- package/dist/rag/retriever.test.js.map +1 -0
- package/dist/rag/vector-store.test.d.ts +38 -0
- package/dist/rag/vector-store.test.d.ts.map +1 -0
- package/dist/rag/vector-store.test.js +175 -0
- package/dist/rag/vector-store.test.js.map +1 -0
- package/dist/registry/ManagedRegistry.test.d.ts +21 -0
- package/dist/registry/ManagedRegistry.test.d.ts.map +1 -0
- package/dist/registry/ManagedRegistry.test.js +98 -0
- package/dist/registry/ManagedRegistry.test.js.map +1 -0
- package/dist/registry/Registry.test.d.ts +18 -0
- package/dist/registry/Registry.test.d.ts.map +1 -0
- package/dist/registry/Registry.test.js +79 -0
- package/dist/registry/Registry.test.js.map +1 -0
- package/dist/registry/agent/definitions.test.d.ts +15 -0
- package/dist/registry/agent/definitions.test.d.ts.map +1 -0
- package/dist/registry/agent/definitions.test.js +84 -0
- package/dist/registry/agent/definitions.test.js.map +1 -0
- package/dist/registry/connector/definitions.test.d.ts +13 -0
- package/dist/registry/connector/definitions.test.d.ts.map +1 -0
- package/dist/registry/connector/definitions.test.js +41 -0
- package/dist/registry/connector/definitions.test.js.map +1 -0
- package/dist/registry/connector/scoped.test.d.ts +21 -0
- package/dist/registry/connector/scoped.test.d.ts.map +1 -0
- package/dist/registry/connector/scoped.test.js +115 -0
- package/dist/registry/connector/scoped.test.js.map +1 -0
- package/dist/registry/plugin/index.test.d.ts +12 -0
- package/dist/registry/plugin/index.test.d.ts.map +1 -0
- package/dist/registry/plugin/index.test.js +69 -0
- package/dist/registry/plugin/index.test.js.map +1 -0
- package/dist/registry/tool/execute.test.d.ts +42 -0
- package/dist/registry/tool/execute.test.d.ts.map +1 -0
- package/dist/registry/tool/execute.test.js +281 -0
- package/dist/registry/tool/execute.test.js.map +1 -0
- package/dist/runtime/query/events.d.ts +3 -1
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +6 -1
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +3 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +30 -1
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/iteration/phases/advisory.test.d.ts +42 -0
- package/dist/runtime/query/iteration/phases/advisory.test.d.ts.map +1 -0
- package/dist/runtime/query/iteration/phases/advisory.test.js +334 -0
- package/dist/runtime/query/iteration/phases/advisory.test.js.map +1 -0
- package/dist/test-setup.d.ts +22 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +23 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/types/bus/index.d.ts +46 -2
- package/dist/types/bus/index.d.ts.map +1 -1
- package/dist/types/doctor/check.d.ts +41 -0
- package/dist/types/doctor/check.d.ts.map +1 -0
- package/dist/types/doctor/check.js +2 -0
- package/dist/types/doctor/check.js.map +1 -0
- package/dist/types/doctor/index.d.ts +2 -0
- package/dist/types/doctor/index.d.ts.map +1 -0
- package/dist/types/doctor/index.js +2 -0
- package/dist/types/doctor/index.js.map +1 -0
- package/dist/types/probe/event-kind.d.ts +6 -0
- package/dist/types/probe/event-kind.d.ts.map +1 -0
- package/dist/types/probe/event-kind.js +2 -0
- package/dist/types/probe/event-kind.js.map +1 -0
- package/dist/types/probe/event-of.d.ts +5 -0
- package/dist/types/probe/event-of.d.ts.map +1 -0
- package/dist/types/probe/event-of.js +2 -0
- package/dist/types/probe/event-of.js.map +1 -0
- package/dist/types/probe/index.d.ts +4 -0
- package/dist/types/probe/index.d.ts.map +1 -0
- package/dist/types/probe/index.js +2 -0
- package/dist/types/probe/index.js.map +1 -0
- package/dist/types/probe/registry.d.ts +27 -0
- package/dist/types/probe/registry.d.ts.map +1 -0
- package/dist/types/probe/registry.js +2 -0
- package/dist/types/probe/registry.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/vault/instrumentation.d.ts +11 -0
- package/dist/vault/instrumentation.d.ts.map +1 -0
- package/dist/vault/instrumentation.js +32 -0
- package/dist/vault/instrumentation.js.map +1 -0
- package/dist/vault/instrumentation.test.d.ts +2 -0
- package/dist/vault/instrumentation.test.d.ts.map +1 -0
- package/dist/vault/instrumentation.test.js +80 -0
- package/dist/vault/instrumentation.test.js.map +1 -0
- package/package.json +4 -1
- package/src/advisory/context.test.ts +109 -0
- package/src/advisory/evaluator.test.ts +192 -0
- package/src/advisory/executor.test.ts +272 -0
- package/src/advisory/registry.test.ts +75 -0
- package/src/bridge/a2a/agent-card.test.ts +140 -0
- package/src/bridge/a2a/mapper.test.ts +293 -0
- package/src/bridge/a2a/message.test.ts +138 -0
- package/src/bridge/a2a/task.test.ts +235 -0
- package/src/bridge/mcp/connector/adapter.test.ts +230 -0
- package/src/bridge/sse/mapper.test.ts +422 -0
- package/src/bridge/tools/connector/adapter.test.ts +224 -0
- package/src/bridge/tools/connector/definitions.test.ts +183 -0
- package/src/bridge/tools/connector/router.test.ts +159 -0
- package/src/bus/breaker.test.ts +274 -0
- package/src/bus/index.test.ts +183 -0
- package/src/bus/index.ts +21 -10
- package/src/bus/lock.test.ts +265 -0
- package/src/bus/ownership.test.ts +243 -0
- package/src/connector/BaseConnector.test.ts +130 -0
- package/src/connector/builtins/http.test.ts +290 -0
- package/src/connector/builtins/webhook.test.ts +138 -0
- package/src/connector/execution/factory.test.ts +75 -0
- package/src/connector/execution/remote.test.ts +63 -0
- package/src/connector/mcp/adapter.test.ts +249 -0
- package/src/probe/context.ts +14 -0
- package/src/probe/errors.ts +27 -0
- package/src/probe/index.ts +4 -0
- package/src/probe/registry.test.ts +480 -0
- package/src/probe/registry.ts +276 -0
- package/src/provider/instrumentation.test.ts +192 -0
- package/src/provider/instrumentation.ts +139 -0
- package/src/public-runtime.ts +17 -0
- package/src/public-types.ts +3 -0
- package/src/rag/chunking.test.ts +107 -0
- package/src/rag/context-assembler.test.ts +114 -0
- package/src/rag/embedding.test.ts +130 -0
- package/src/rag/ingestion.test.ts +114 -0
- package/src/rag/knowledge-base.test.ts +106 -0
- package/src/rag/rag-tool.test.ts +167 -0
- package/src/rag/retriever.test.ts +210 -0
- package/src/rag/vector-store.test.ts +196 -0
- package/src/registry/ManagedRegistry.test.ts +118 -0
- package/src/registry/Registry.test.ts +91 -0
- package/src/registry/agent/definitions.test.ts +100 -0
- package/src/registry/connector/definitions.test.ts +51 -0
- package/src/registry/connector/scoped.test.ts +129 -0
- package/src/registry/plugin/index.test.ts +85 -0
- package/src/registry/tool/execute.test.ts +330 -0
- package/src/runtime/query/events.ts +6 -1
- package/src/runtime/query/executor.ts +34 -0
- package/src/runtime/query/iteration/phases/advisory.test.ts +412 -0
- package/src/test-setup.ts +24 -0
- package/src/types/bus/index.ts +54 -2
- package/src/types/doctor/check.ts +53 -0
- package/src/types/doctor/index.ts +9 -0
- package/src/types/probe/event-kind.ts +8 -0
- package/src/types/probe/event-of.ts +3 -0
- package/src/types/probe/index.ts +11 -0
- package/src/types/probe/registry.ts +36 -0
- package/src/utils/logger.ts +6 -1
- package/src/vault/instrumentation.test.ts +98 -0
- package/src/vault/instrumentation.ts +56 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 4):
|
|
3
|
+
*
|
|
4
|
+
* This file doubles as the VectorStore contract — the tests here run
|
|
5
|
+
* against `InMemoryVectorStore` as the reference implementation, and
|
|
6
|
+
* are the spec a future `@namzu/vector-store-conformance` package will
|
|
7
|
+
* be built around (D4 ratification + Q5 refinement: contract first,
|
|
8
|
+
* not "whatever the reference happens to do").
|
|
9
|
+
*
|
|
10
|
+
* **VectorStore contract (derived from current code, 2026-04-21):**
|
|
11
|
+
*
|
|
12
|
+
* - `upsert(chunks[])`: stores each chunk keyed by `chunk.id`. Re-upsert
|
|
13
|
+
* of a chunk with the same id REPLACES — no merge, no error. Tenant
|
|
14
|
+
* scoping is carried on each chunk, not enforced at upsert (the
|
|
15
|
+
* caller is trusted).
|
|
16
|
+
* - `search(query)`: returns `VectorSearchResult[]`:
|
|
17
|
+
* - Filters by `tenantId` (EXACT match).
|
|
18
|
+
* - If `knowledgeBaseId` is set, filters by that too.
|
|
19
|
+
* - Skips chunks with `embedding === undefined`.
|
|
20
|
+
* - Applies `filter` as metadata-equality AND across the whole
|
|
21
|
+
* filter object.
|
|
22
|
+
* - Computes similarity via `cosineSimilarity(query, chunk.embedding)`.
|
|
23
|
+
* - If `minScore` is set, drops scores below it.
|
|
24
|
+
* - Sorts descending by score and returns the top `topK` results.
|
|
25
|
+
* - `delete(chunkIds[])`: deletes by exact chunk id. Unknown ids are
|
|
26
|
+
* silently ignored.
|
|
27
|
+
* - `deleteByDocument(documentId)`: NOT tenant-scoped in the
|
|
28
|
+
* current API — deletes every chunk with matching `documentId`
|
|
29
|
+
* ACROSS tenants. This is an asymmetry with `search` /
|
|
30
|
+
* `deleteByKnowledgeBase` and is intentional to pin (Codex #9 flag).
|
|
31
|
+
* - `deleteByKnowledgeBase(kbId, tenantId)`: tenant-scoped deletion
|
|
32
|
+
* by knowledge base.
|
|
33
|
+
* - `cosineSimilarity(a, b)`: returns 0 when arrays differ in length
|
|
34
|
+
* OR when either has zero norm. Otherwise returns the standard
|
|
35
|
+
* dot-product / (‖a‖·‖b‖) result.
|
|
36
|
+
*/
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=vector-store.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.test.d.ts","sourceRoot":"","sources":["../../src/rag/vector-store.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 4):
|
|
3
|
+
*
|
|
4
|
+
* This file doubles as the VectorStore contract — the tests here run
|
|
5
|
+
* against `InMemoryVectorStore` as the reference implementation, and
|
|
6
|
+
* are the spec a future `@namzu/vector-store-conformance` package will
|
|
7
|
+
* be built around (D4 ratification + Q5 refinement: contract first,
|
|
8
|
+
* not "whatever the reference happens to do").
|
|
9
|
+
*
|
|
10
|
+
* **VectorStore contract (derived from current code, 2026-04-21):**
|
|
11
|
+
*
|
|
12
|
+
* - `upsert(chunks[])`: stores each chunk keyed by `chunk.id`. Re-upsert
|
|
13
|
+
* of a chunk with the same id REPLACES — no merge, no error. Tenant
|
|
14
|
+
* scoping is carried on each chunk, not enforced at upsert (the
|
|
15
|
+
* caller is trusted).
|
|
16
|
+
* - `search(query)`: returns `VectorSearchResult[]`:
|
|
17
|
+
* - Filters by `tenantId` (EXACT match).
|
|
18
|
+
* - If `knowledgeBaseId` is set, filters by that too.
|
|
19
|
+
* - Skips chunks with `embedding === undefined`.
|
|
20
|
+
* - Applies `filter` as metadata-equality AND across the whole
|
|
21
|
+
* filter object.
|
|
22
|
+
* - Computes similarity via `cosineSimilarity(query, chunk.embedding)`.
|
|
23
|
+
* - If `minScore` is set, drops scores below it.
|
|
24
|
+
* - Sorts descending by score and returns the top `topK` results.
|
|
25
|
+
* - `delete(chunkIds[])`: deletes by exact chunk id. Unknown ids are
|
|
26
|
+
* silently ignored.
|
|
27
|
+
* - `deleteByDocument(documentId)`: NOT tenant-scoped in the
|
|
28
|
+
* current API — deletes every chunk with matching `documentId`
|
|
29
|
+
* ACROSS tenants. This is an asymmetry with `search` /
|
|
30
|
+
* `deleteByKnowledgeBase` and is intentional to pin (Codex #9 flag).
|
|
31
|
+
* - `deleteByKnowledgeBase(kbId, tenantId)`: tenant-scoped deletion
|
|
32
|
+
* by knowledge base.
|
|
33
|
+
* - `cosineSimilarity(a, b)`: returns 0 when arrays differ in length
|
|
34
|
+
* OR when either has zero norm. Otherwise returns the standard
|
|
35
|
+
* dot-product / (‖a‖·‖b‖) result.
|
|
36
|
+
*/
|
|
37
|
+
import { describe, expect, it } from 'vitest';
|
|
38
|
+
import { InMemoryVectorStore, cosineSimilarity } from './vector-store.js';
|
|
39
|
+
const T1 = 'tenant_1';
|
|
40
|
+
const T2 = 'tenant_2';
|
|
41
|
+
const KB1 = 'kb_1';
|
|
42
|
+
const KB2 = 'kb_2';
|
|
43
|
+
const D1 = 'doc_1';
|
|
44
|
+
const D2 = 'doc_2';
|
|
45
|
+
function chunk(id, overrides = {}) {
|
|
46
|
+
return {
|
|
47
|
+
id: id,
|
|
48
|
+
documentId: D1,
|
|
49
|
+
knowledgeBaseId: KB1,
|
|
50
|
+
tenantId: T1,
|
|
51
|
+
content: `content of ${id}`,
|
|
52
|
+
index: 0,
|
|
53
|
+
tokenCount: 10,
|
|
54
|
+
embedding: [1, 0, 0],
|
|
55
|
+
metadata: {},
|
|
56
|
+
createdAt: Date.now(),
|
|
57
|
+
...overrides,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const baseQuery = {
|
|
61
|
+
embedding: [1, 0, 0],
|
|
62
|
+
topK: 10,
|
|
63
|
+
tenantId: T1,
|
|
64
|
+
};
|
|
65
|
+
describe('InMemoryVectorStore — upsert', () => {
|
|
66
|
+
it('stores chunks by id; re-upsert replaces', async () => {
|
|
67
|
+
const s = new InMemoryVectorStore();
|
|
68
|
+
await s.upsert([chunk('c1', { content: 'v1' })]);
|
|
69
|
+
await s.upsert([chunk('c1', { content: 'v2' })]);
|
|
70
|
+
const results = await s.search(baseQuery);
|
|
71
|
+
expect(results).toHaveLength(1);
|
|
72
|
+
expect(results[0]?.chunk.content).toBe('v2');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('InMemoryVectorStore — search', () => {
|
|
76
|
+
it('enforces tenant isolation on the query path', async () => {
|
|
77
|
+
const s = new InMemoryVectorStore();
|
|
78
|
+
await s.upsert([
|
|
79
|
+
chunk('a', { tenantId: T1, embedding: [1, 0, 0] }),
|
|
80
|
+
chunk('b', { tenantId: T2, embedding: [1, 0, 0] }),
|
|
81
|
+
]);
|
|
82
|
+
const results = await s.search({ ...baseQuery, tenantId: T1 });
|
|
83
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['a']);
|
|
84
|
+
});
|
|
85
|
+
it('filters by knowledgeBaseId when provided', async () => {
|
|
86
|
+
const s = new InMemoryVectorStore();
|
|
87
|
+
await s.upsert([chunk('a', { knowledgeBaseId: KB1 }), chunk('b', { knowledgeBaseId: KB2 })]);
|
|
88
|
+
const results = await s.search({ ...baseQuery, knowledgeBaseId: KB1 });
|
|
89
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['a']);
|
|
90
|
+
});
|
|
91
|
+
it('skips chunks with no embedding', async () => {
|
|
92
|
+
const s = new InMemoryVectorStore();
|
|
93
|
+
await s.upsert([chunk('a', { embedding: [1, 0, 0] }), chunk('b', { embedding: undefined })]);
|
|
94
|
+
const results = await s.search(baseQuery);
|
|
95
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['a']);
|
|
96
|
+
});
|
|
97
|
+
it('applies AND-of-equalities across filter keys', async () => {
|
|
98
|
+
const s = new InMemoryVectorStore();
|
|
99
|
+
await s.upsert([
|
|
100
|
+
chunk('a', { metadata: { lang: 'en', year: 2026 } }),
|
|
101
|
+
chunk('b', { metadata: { lang: 'en', year: 2024 } }),
|
|
102
|
+
chunk('c', { metadata: { lang: 'tr', year: 2026 } }),
|
|
103
|
+
]);
|
|
104
|
+
const results = await s.search({
|
|
105
|
+
...baseQuery,
|
|
106
|
+
filter: { lang: 'en', year: 2026 },
|
|
107
|
+
});
|
|
108
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['a']);
|
|
109
|
+
});
|
|
110
|
+
it('applies minScore cutoff', async () => {
|
|
111
|
+
const s = new InMemoryVectorStore();
|
|
112
|
+
await s.upsert([
|
|
113
|
+
chunk('same', { embedding: [1, 0, 0] }),
|
|
114
|
+
chunk('orthogonal', { embedding: [0, 1, 0] }),
|
|
115
|
+
]);
|
|
116
|
+
const results = await s.search({ ...baseQuery, minScore: 0.5 });
|
|
117
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['same']);
|
|
118
|
+
});
|
|
119
|
+
it('sorts descending by score and slices to topK', async () => {
|
|
120
|
+
const s = new InMemoryVectorStore();
|
|
121
|
+
await s.upsert([
|
|
122
|
+
chunk('strong', { embedding: [1, 0, 0] }),
|
|
123
|
+
chunk('medium', { embedding: [0.5, 0.5, 0] }),
|
|
124
|
+
chunk('weak', { embedding: [0.1, 0.9, 0] }),
|
|
125
|
+
]);
|
|
126
|
+
const results = await s.search({ ...baseQuery, topK: 2 });
|
|
127
|
+
expect(results.map((r) => r.chunk.id)).toEqual(['strong', 'medium']);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('InMemoryVectorStore — delete', () => {
|
|
131
|
+
it('delete(chunkIds) removes each id; unknown ids are silent', async () => {
|
|
132
|
+
const s = new InMemoryVectorStore();
|
|
133
|
+
await s.upsert([chunk('a'), chunk('b')]);
|
|
134
|
+
await s.delete(['a', 'missing']);
|
|
135
|
+
expect((await s.search(baseQuery)).map((r) => r.chunk.id)).toEqual(['b']);
|
|
136
|
+
});
|
|
137
|
+
it('deleteByDocument removes every chunk of the document ACROSS tenants (asymmetry per Codex #9)', async () => {
|
|
138
|
+
const s = new InMemoryVectorStore();
|
|
139
|
+
await s.upsert([
|
|
140
|
+
chunk('a', { documentId: D1, tenantId: T1 }),
|
|
141
|
+
chunk('b', { documentId: D1, tenantId: T2 }),
|
|
142
|
+
chunk('c', { documentId: D2, tenantId: T1 }),
|
|
143
|
+
]);
|
|
144
|
+
await s.deleteByDocument(D1);
|
|
145
|
+
// Both D1 chunks gone even though we didn't pass a tenant.
|
|
146
|
+
expect((await s.search({ ...baseQuery, tenantId: T1 })).map((r) => r.chunk.id)).toEqual(['c']);
|
|
147
|
+
expect(await s.search({ ...baseQuery, tenantId: T2 })).toEqual([]);
|
|
148
|
+
});
|
|
149
|
+
it('deleteByKnowledgeBase is tenant-scoped', async () => {
|
|
150
|
+
const s = new InMemoryVectorStore();
|
|
151
|
+
await s.upsert([
|
|
152
|
+
chunk('a', { knowledgeBaseId: KB1, tenantId: T1 }),
|
|
153
|
+
chunk('b', { knowledgeBaseId: KB1, tenantId: T2 }),
|
|
154
|
+
]);
|
|
155
|
+
await s.deleteByKnowledgeBase(KB1, T1);
|
|
156
|
+
expect(await s.search({ ...baseQuery, tenantId: T1 })).toEqual([]);
|
|
157
|
+
expect((await s.search({ ...baseQuery, tenantId: T2 })).map((r) => r.chunk.id)).toEqual(['b']);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe('cosineSimilarity', () => {
|
|
161
|
+
it('is 1 for identical non-zero vectors', () => {
|
|
162
|
+
expect(cosineSimilarity([1, 2, 3], [1, 2, 3])).toBeCloseTo(1);
|
|
163
|
+
});
|
|
164
|
+
it('is 0 for orthogonal vectors', () => {
|
|
165
|
+
expect(cosineSimilarity([1, 0], [0, 1])).toBe(0);
|
|
166
|
+
});
|
|
167
|
+
it('is 0 when vectors differ in length', () => {
|
|
168
|
+
expect(cosineSimilarity([1, 0], [1, 0, 0])).toBe(0);
|
|
169
|
+
});
|
|
170
|
+
it('is 0 when either vector has zero norm', () => {
|
|
171
|
+
expect(cosineSimilarity([0, 0], [1, 1])).toBe(0);
|
|
172
|
+
expect(cosineSimilarity([1, 1], [0, 0])).toBe(0);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=vector-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.test.js","sourceRoot":"","sources":["../../src/rag/vector-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `ManagedRegistry` extends `Registry` with a component-named
|
|
5
|
+
* logger + two optional id-extraction strategies: `idField` or
|
|
6
|
+
* `computeId`. `computeId` takes precedence when both are set.
|
|
7
|
+
* - `register(id, item)` (2-arg): throws when `item` is missing;
|
|
8
|
+
* warn-logs + overwrites on duplicate id (no typed error).
|
|
9
|
+
* - `register(item)` (1-arg): extracts id via computeId/idField;
|
|
10
|
+
* throws when neither is configured.
|
|
11
|
+
* - `register(items[])`: batch-registers (recursively calls the
|
|
12
|
+
* single-arg path for each). Any failure in a single register
|
|
13
|
+
* throws and aborts the batch (no partial-success semantics).
|
|
14
|
+
* - `getOrThrow(id)`: returns the item; throws
|
|
15
|
+
* `new Error("Not found: <id>. Available: <csv of known ids>")`
|
|
16
|
+
* — a plain `Error`, NOT a typed `XYZNotFoundError` (Codex #1).
|
|
17
|
+
* - No start / stop lifecycle exists (design §2.3 claim was
|
|
18
|
+
* fictional).
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ManagedRegistry.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManagedRegistry.test.d.ts","sourceRoot":"","sources":["../../src/registry/ManagedRegistry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `ManagedRegistry` extends `Registry` with a component-named
|
|
5
|
+
* logger + two optional id-extraction strategies: `idField` or
|
|
6
|
+
* `computeId`. `computeId` takes precedence when both are set.
|
|
7
|
+
* - `register(id, item)` (2-arg): throws when `item` is missing;
|
|
8
|
+
* warn-logs + overwrites on duplicate id (no typed error).
|
|
9
|
+
* - `register(item)` (1-arg): extracts id via computeId/idField;
|
|
10
|
+
* throws when neither is configured.
|
|
11
|
+
* - `register(items[])`: batch-registers (recursively calls the
|
|
12
|
+
* single-arg path for each). Any failure in a single register
|
|
13
|
+
* throws and aborts the batch (no partial-success semantics).
|
|
14
|
+
* - `getOrThrow(id)`: returns the item; throws
|
|
15
|
+
* `new Error("Not found: <id>. Available: <csv of known ids>")`
|
|
16
|
+
* — a plain `Error`, NOT a typed `XYZNotFoundError` (Codex #1).
|
|
17
|
+
* - No start / stop lifecycle exists (design §2.3 claim was
|
|
18
|
+
* fictional).
|
|
19
|
+
*/
|
|
20
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
21
|
+
import { ManagedRegistry } from './ManagedRegistry.js';
|
|
22
|
+
function makeLogger() {
|
|
23
|
+
const self = {
|
|
24
|
+
info: vi.fn(),
|
|
25
|
+
warn: vi.fn(),
|
|
26
|
+
error: vi.fn(),
|
|
27
|
+
debug: vi.fn(),
|
|
28
|
+
child: vi.fn(),
|
|
29
|
+
};
|
|
30
|
+
self.child = vi.fn(() => self);
|
|
31
|
+
return self;
|
|
32
|
+
}
|
|
33
|
+
describe('ManagedRegistry', () => {
|
|
34
|
+
describe('register (2-arg form)', () => {
|
|
35
|
+
it('throws when called with (id) only', () => {
|
|
36
|
+
const r = new ManagedRegistry({ componentName: 't' });
|
|
37
|
+
// biome-ignore lint/suspicious/noExplicitAny: exercises the no-item-arg path
|
|
38
|
+
expect(() => r.register('a')).toThrow(/requires an item argument/);
|
|
39
|
+
});
|
|
40
|
+
it('warn-logs then overwrites on duplicate id', () => {
|
|
41
|
+
const logger = makeLogger();
|
|
42
|
+
const r = new ManagedRegistry({ componentName: 't', logger });
|
|
43
|
+
const a = { id: 'a', info: { id: 'a' }, value: 1 };
|
|
44
|
+
const b = { id: 'a', info: { id: 'a' }, value: 2 };
|
|
45
|
+
r.register('a', a);
|
|
46
|
+
r.register('a', b);
|
|
47
|
+
expect(r.get('a')?.value).toBe(2);
|
|
48
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('"a" already registered'));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('register (single-item form)', () => {
|
|
52
|
+
it('uses idField when computeId is not set', () => {
|
|
53
|
+
const r = new ManagedRegistry({ componentName: 't', idField: 'id' });
|
|
54
|
+
r.register({ id: 'a', info: { id: 'nested' }, value: 1 });
|
|
55
|
+
expect(r.get('a')).toBeDefined();
|
|
56
|
+
expect(r.get('nested')).toBeUndefined();
|
|
57
|
+
});
|
|
58
|
+
it('computeId takes precedence over idField when both are set', () => {
|
|
59
|
+
const r = new ManagedRegistry({
|
|
60
|
+
componentName: 't',
|
|
61
|
+
idField: 'id',
|
|
62
|
+
computeId: (item) => item.info.id,
|
|
63
|
+
});
|
|
64
|
+
r.register({ id: 'top', info: { id: 'nested' }, value: 1 });
|
|
65
|
+
expect(r.get('nested')).toBeDefined();
|
|
66
|
+
expect(r.get('top')).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
it('throws when neither idField nor computeId is configured', () => {
|
|
69
|
+
const r = new ManagedRegistry({ componentName: 't' });
|
|
70
|
+
expect(() => r.register({ id: 'a', info: { id: 'a' }, value: 1 })).toThrow(/requires idField or computeId/);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('register (array form)', () => {
|
|
74
|
+
it('batch-registers via the single-item path', () => {
|
|
75
|
+
const r = new ManagedRegistry({ componentName: 't', idField: 'id' });
|
|
76
|
+
r.register([
|
|
77
|
+
{ id: 'a', info: { id: 'a' }, value: 1 },
|
|
78
|
+
{ id: 'b', info: { id: 'b' }, value: 2 },
|
|
79
|
+
]);
|
|
80
|
+
expect(r.listIds()).toEqual(['a', 'b']);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('getOrThrow', () => {
|
|
84
|
+
it('returns the item when present', () => {
|
|
85
|
+
const r = new ManagedRegistry({ componentName: 't', idField: 'id' });
|
|
86
|
+
const a = { id: 'a', info: { id: 'a' }, value: 1 };
|
|
87
|
+
r.register(a);
|
|
88
|
+
expect(r.getOrThrow('a')).toBe(a);
|
|
89
|
+
});
|
|
90
|
+
it('throws a plain Error naming the missing id + available ids', () => {
|
|
91
|
+
const r = new ManagedRegistry({ componentName: 't', idField: 'id' });
|
|
92
|
+
r.register({ id: 'a', info: { id: 'a' }, value: 1 });
|
|
93
|
+
r.register({ id: 'b', info: { id: 'b' }, value: 2 });
|
|
94
|
+
expect(() => r.getOrThrow('missing')).toThrow(/Not found: "missing"\. Available: a, b/);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=ManagedRegistry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManagedRegistry.test.js","sourceRoot":"","sources":["../../src/registry/ManagedRegistry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `register(id, item)` silently overwrites an existing entry —
|
|
5
|
+
* NO duplicate-error is thrown (Codex #1 verified the design
|
|
6
|
+
* §2.3 "typed DuplicateRegistrationError" claim was fiction).
|
|
7
|
+
* - `get(id)` returns `undefined` for an unknown id (NOT a typed
|
|
8
|
+
* error). `getAll`, `listIds`, `has`, `size` reflect the current
|
|
9
|
+
* `Map` state; iteration order follows insertion order.
|
|
10
|
+
* - `unregister(id)` returns true if the entry existed (and was
|
|
11
|
+
* deleted), false otherwise.
|
|
12
|
+
* - `clear()` empties the map.
|
|
13
|
+
* - The generic `Registry<T>` has no component name, no logger, no
|
|
14
|
+
* lifecycle. All enrichment (logs, idField inference, lifecycle)
|
|
15
|
+
* happens in `ManagedRegistry`, not here.
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Registry.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Registry.test.d.ts","sourceRoot":"","sources":["../../src/registry/Registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `register(id, item)` silently overwrites an existing entry —
|
|
5
|
+
* NO duplicate-error is thrown (Codex #1 verified the design
|
|
6
|
+
* §2.3 "typed DuplicateRegistrationError" claim was fiction).
|
|
7
|
+
* - `get(id)` returns `undefined` for an unknown id (NOT a typed
|
|
8
|
+
* error). `getAll`, `listIds`, `has`, `size` reflect the current
|
|
9
|
+
* `Map` state; iteration order follows insertion order.
|
|
10
|
+
* - `unregister(id)` returns true if the entry existed (and was
|
|
11
|
+
* deleted), false otherwise.
|
|
12
|
+
* - `clear()` empties the map.
|
|
13
|
+
* - The generic `Registry<T>` has no component name, no logger, no
|
|
14
|
+
* lifecycle. All enrichment (logs, idField inference, lifecycle)
|
|
15
|
+
* happens in `ManagedRegistry`, not here.
|
|
16
|
+
*/
|
|
17
|
+
import { describe, expect, it } from 'vitest';
|
|
18
|
+
import { Registry } from './Registry.js';
|
|
19
|
+
describe('Registry', () => {
|
|
20
|
+
it('register + get + has roundtrip', () => {
|
|
21
|
+
const r = new Registry();
|
|
22
|
+
const a = { id: 'a', value: 1 };
|
|
23
|
+
r.register('a', a);
|
|
24
|
+
expect(r.get('a')).toBe(a);
|
|
25
|
+
expect(r.has('a')).toBe(true);
|
|
26
|
+
expect(r.get('b')).toBeUndefined();
|
|
27
|
+
expect(r.has('b')).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
it('register silently overwrites an existing key', () => {
|
|
30
|
+
const r = new Registry();
|
|
31
|
+
r.register('a', { id: 'a', value: 1 });
|
|
32
|
+
r.register('a', { id: 'a', value: 2 });
|
|
33
|
+
expect(r.get('a')?.value).toBe(2);
|
|
34
|
+
expect(r.size()).toBe(1);
|
|
35
|
+
});
|
|
36
|
+
it('listIds reflects insertion order', () => {
|
|
37
|
+
const r = new Registry();
|
|
38
|
+
r.register('x', { id: 'x', value: 1 });
|
|
39
|
+
r.register('y', { id: 'y', value: 2 });
|
|
40
|
+
r.register('z', { id: 'z', value: 3 });
|
|
41
|
+
expect(r.listIds()).toEqual(['x', 'y', 'z']);
|
|
42
|
+
});
|
|
43
|
+
it('getAll returns every item in insertion order', () => {
|
|
44
|
+
const r = new Registry();
|
|
45
|
+
const items = [
|
|
46
|
+
{ id: 'a', value: 1 },
|
|
47
|
+
{ id: 'b', value: 2 },
|
|
48
|
+
];
|
|
49
|
+
for (const item of items)
|
|
50
|
+
r.register(item.id, item);
|
|
51
|
+
expect(r.getAll()).toEqual(items);
|
|
52
|
+
});
|
|
53
|
+
it('unregister returns true iff the key existed', () => {
|
|
54
|
+
const r = new Registry();
|
|
55
|
+
r.register('a', { id: 'a', value: 1 });
|
|
56
|
+
expect(r.unregister('a')).toBe(true);
|
|
57
|
+
expect(r.unregister('a')).toBe(false);
|
|
58
|
+
expect(r.get('a')).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
it('clear empties the map', () => {
|
|
61
|
+
const r = new Registry();
|
|
62
|
+
r.register('a', { id: 'a', value: 1 });
|
|
63
|
+
r.register('b', { id: 'b', value: 2 });
|
|
64
|
+
r.clear();
|
|
65
|
+
expect(r.size()).toBe(0);
|
|
66
|
+
expect(r.getAll()).toEqual([]);
|
|
67
|
+
});
|
|
68
|
+
it('size matches the map size', () => {
|
|
69
|
+
const r = new Registry();
|
|
70
|
+
expect(r.size()).toBe(0);
|
|
71
|
+
r.register('a', { id: 'a', value: 1 });
|
|
72
|
+
expect(r.size()).toBe(1);
|
|
73
|
+
r.register('a', { id: 'a', value: 2 }); // overwrite
|
|
74
|
+
expect(r.size()).toBe(1);
|
|
75
|
+
r.register('b', { id: 'b', value: 3 });
|
|
76
|
+
expect(r.size()).toBe(2);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=Registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Registry.test.js","sourceRoot":"","sources":["../../src/registry/Registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `AgentRegistry` extends `ManagedRegistry<AgentDefinition>` and
|
|
5
|
+
* keys by `def.info.id` via `computeId` (NOT by the top-level id
|
|
6
|
+
* field — there isn't one on AgentDefinition).
|
|
7
|
+
* - `resolve(agentId)` returns `.typedAgent`; delegates to
|
|
8
|
+
* `getOrThrow` and therefore throws a plain `Error` when missing.
|
|
9
|
+
* - `listByType(type)` filters by `typedAgent.type`.
|
|
10
|
+
* - `search({category?, query?})` filters by info.category then by
|
|
11
|
+
* case-insensitive match against name OR description. An empty
|
|
12
|
+
* query matches all.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=definitions.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.test.d.ts","sourceRoot":"","sources":["../../../src/registry/agent/definitions.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `AgentRegistry` extends `ManagedRegistry<AgentDefinition>` and
|
|
5
|
+
* keys by `def.info.id` via `computeId` (NOT by the top-level id
|
|
6
|
+
* field — there isn't one on AgentDefinition).
|
|
7
|
+
* - `resolve(agentId)` returns `.typedAgent`; delegates to
|
|
8
|
+
* `getOrThrow` and therefore throws a plain `Error` when missing.
|
|
9
|
+
* - `listByType(type)` filters by `typedAgent.type`.
|
|
10
|
+
* - `search({category?, query?})` filters by info.category then by
|
|
11
|
+
* case-insensitive match against name OR description. An empty
|
|
12
|
+
* query matches all.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, expect, it } from 'vitest';
|
|
15
|
+
import { AgentRegistry } from './definitions.js';
|
|
16
|
+
function makeDef(id, type, overrides = {}) {
|
|
17
|
+
const info = {
|
|
18
|
+
id,
|
|
19
|
+
name: `Agent ${id}`,
|
|
20
|
+
version: '1.0.0',
|
|
21
|
+
category: 'general',
|
|
22
|
+
description: `agent ${id} does stuff`,
|
|
23
|
+
tools: [],
|
|
24
|
+
defaults: { model: 'opus', tokenBudget: 1000 },
|
|
25
|
+
...overrides,
|
|
26
|
+
};
|
|
27
|
+
const typedAgent = { type };
|
|
28
|
+
return { info, typedAgent };
|
|
29
|
+
}
|
|
30
|
+
describe('AgentRegistry', () => {
|
|
31
|
+
it('keys by info.id (computeId), not by a top-level id field', () => {
|
|
32
|
+
const r = new AgentRegistry();
|
|
33
|
+
r.register(makeDef('coder', 'reactive'));
|
|
34
|
+
expect(r.get('coder')).toBeDefined();
|
|
35
|
+
});
|
|
36
|
+
it('resolve returns typedAgent', () => {
|
|
37
|
+
const r = new AgentRegistry();
|
|
38
|
+
const def = makeDef('coder', 'reactive');
|
|
39
|
+
r.register(def);
|
|
40
|
+
expect(r.resolve('coder')).toBe(def.typedAgent);
|
|
41
|
+
});
|
|
42
|
+
it('resolve throws (plain Error) on unknown agentId', () => {
|
|
43
|
+
const r = new AgentRegistry();
|
|
44
|
+
expect(() => r.resolve('nope')).toThrow(/Not found/);
|
|
45
|
+
});
|
|
46
|
+
it('listByType filters by typedAgent.type', () => {
|
|
47
|
+
const r = new AgentRegistry();
|
|
48
|
+
r.register(makeDef('a', 'reactive'));
|
|
49
|
+
r.register(makeDef('b', 'pipeline'));
|
|
50
|
+
r.register(makeDef('c', 'reactive'));
|
|
51
|
+
expect(r.listByType('reactive').map((d) => d.info.id)).toEqual(['a', 'c']);
|
|
52
|
+
expect(r.listByType('pipeline').map((d) => d.info.id)).toEqual(['b']);
|
|
53
|
+
});
|
|
54
|
+
describe('search', () => {
|
|
55
|
+
it('empty query returns all', () => {
|
|
56
|
+
const r = new AgentRegistry();
|
|
57
|
+
r.register(makeDef('a', 'reactive'));
|
|
58
|
+
r.register(makeDef('b', 'pipeline'));
|
|
59
|
+
expect(r.search({})).toHaveLength(2);
|
|
60
|
+
});
|
|
61
|
+
it('category filter is strict-equal', () => {
|
|
62
|
+
const r = new AgentRegistry();
|
|
63
|
+
r.register(makeDef('coder', 'reactive', { category: 'coding' }));
|
|
64
|
+
r.register(makeDef('writer', 'reactive', { category: 'writing' }));
|
|
65
|
+
expect(r.search({ category: 'coding' }).map((d) => d.info.id)).toEqual(['coder']);
|
|
66
|
+
});
|
|
67
|
+
it('query matches name OR description case-insensitively', () => {
|
|
68
|
+
const r = new AgentRegistry();
|
|
69
|
+
r.register(makeDef('alpha', 'reactive', { name: 'CoderBot', description: 'writes code' }));
|
|
70
|
+
r.register(makeDef('beta', 'reactive', { name: 'Other', description: 'tests CODE' }));
|
|
71
|
+
r.register(makeDef('gamma', 'reactive', { name: 'Third', description: 'documentation' }));
|
|
72
|
+
const hits = r.search({ query: 'code' }).map((d) => d.info.id);
|
|
73
|
+
expect(hits).toEqual(['alpha', 'beta']);
|
|
74
|
+
});
|
|
75
|
+
it('combines category + query', () => {
|
|
76
|
+
const r = new AgentRegistry();
|
|
77
|
+
r.register(makeDef('alpha', 'reactive', { category: 'coding', name: 'CoderBot' }));
|
|
78
|
+
r.register(makeDef('beta', 'reactive', { category: 'writing', name: 'CoderWriter' }));
|
|
79
|
+
const hits = r.search({ category: 'coding', query: 'coder' }).map((d) => d.info.id);
|
|
80
|
+
expect(hits).toEqual(['alpha']);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=definitions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.test.js","sourceRoot":"","sources":["../../../src/registry/agent/definitions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Current-code invariants asserted (2026-04-21, ses_006 Phase 3):
|
|
3
|
+
*
|
|
4
|
+
* - `ConnectorRegistry` extends `ManagedRegistry<ConnectorDefinition>`
|
|
5
|
+
* with `idField: 'id'` — it keys by the top-level `id` field, NOT
|
|
6
|
+
* a nested path.
|
|
7
|
+
* - `listByType(connectionType)` filters by `connectionType`.
|
|
8
|
+
* - As a global (non-tenant-scoped) registry, ConnectorRegistry is
|
|
9
|
+
* shared across tenants; tenant isolation lives in
|
|
10
|
+
* `TenantConnectorManager` per Codex #5.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=definitions.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.test.d.ts","sourceRoot":"","sources":["../../../src/registry/connector/definitions.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|