comisai 1.0.11 → 1.0.12

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.
Files changed (247) hide show
  1. package/node_modules/@comis/agent/dist/executor/pi-executor.d.ts +1 -4
  2. package/node_modules/@comis/agent/package.json +1 -1
  3. package/node_modules/@comis/channels/package.json +1 -1
  4. package/node_modules/@comis/cli/package.json +1 -1
  5. package/node_modules/@comis/core/package.json +1 -1
  6. package/node_modules/@comis/daemon/package.json +1 -1
  7. package/node_modules/@comis/gateway/package.json +1 -1
  8. package/node_modules/@comis/infra/package.json +1 -1
  9. package/node_modules/@comis/memory/package.json +1 -1
  10. package/node_modules/@comis/scheduler/package.json +1 -1
  11. package/node_modules/@comis/shared/package.json +1 -1
  12. package/node_modules/@comis/skills/package.json +1 -1
  13. package/package.json +18 -18
  14. package/node_modules/@comis/core/dist/approval/approval-gate.test.d.ts +0 -1
  15. package/node_modules/@comis/core/dist/approval/approval-gate.test.js +0 -1003
  16. package/node_modules/@comis/core/dist/bootstrap.test.d.ts +0 -1
  17. package/node_modules/@comis/core/dist/bootstrap.test.js +0 -150
  18. package/node_modules/@comis/core/dist/config/backup.test.d.ts +0 -1
  19. package/node_modules/@comis/core/dist/config/backup.test.js +0 -160
  20. package/node_modules/@comis/core/dist/config/env-substitution.test.d.ts +0 -1
  21. package/node_modules/@comis/core/dist/config/env-substitution.test.js +0 -259
  22. package/node_modules/@comis/core/dist/config/field-metadata.test.d.ts +0 -1
  23. package/node_modules/@comis/core/dist/config/field-metadata.test.js +0 -72
  24. package/node_modules/@comis/core/dist/config/git-manager.test.d.ts +0 -1
  25. package/node_modules/@comis/core/dist/config/git-manager.test.js +0 -1042
  26. package/node_modules/@comis/core/dist/config/immutable-keys.test.d.ts +0 -1
  27. package/node_modules/@comis/core/dist/config/immutable-keys.test.js +0 -283
  28. package/node_modules/@comis/core/dist/config/include-resolver.test.d.ts +0 -1
  29. package/node_modules/@comis/core/dist/config/include-resolver.test.js +0 -292
  30. package/node_modules/@comis/core/dist/config/layered.test.d.ts +0 -1
  31. package/node_modules/@comis/core/dist/config/layered.test.js +0 -211
  32. package/node_modules/@comis/core/dist/config/loader.test.d.ts +0 -1
  33. package/node_modules/@comis/core/dist/config/loader.test.js +0 -300
  34. package/node_modules/@comis/core/dist/config/migrate.test.d.ts +0 -1
  35. package/node_modules/@comis/core/dist/config/migrate.test.js +0 -244
  36. package/node_modules/@comis/core/dist/config/partial-validator.test.d.ts +0 -1
  37. package/node_modules/@comis/core/dist/config/partial-validator.test.js +0 -98
  38. package/node_modules/@comis/core/dist/config/schema-agent-model.test.d.ts +0 -1
  39. package/node_modules/@comis/core/dist/config/schema-agent-model.test.js +0 -279
  40. package/node_modules/@comis/core/dist/config/schema-agent-session.test.d.ts +0 -1
  41. package/node_modules/@comis/core/dist/config/schema-agent-session.test.js +0 -242
  42. package/node_modules/@comis/core/dist/config/schema-agent.test.d.ts +0 -1
  43. package/node_modules/@comis/core/dist/config/schema-agent.test.js +0 -645
  44. package/node_modules/@comis/core/dist/config/schema-channel.test.d.ts +0 -1
  45. package/node_modules/@comis/core/dist/config/schema-channel.test.js +0 -341
  46. package/node_modules/@comis/core/dist/config/schema-coalescer.test.d.ts +0 -1
  47. package/node_modules/@comis/core/dist/config/schema-coalescer.test.js +0 -51
  48. package/node_modules/@comis/core/dist/config/schema-context-engine.test.d.ts +0 -1
  49. package/node_modules/@comis/core/dist/config/schema-context-engine.test.js +0 -797
  50. package/node_modules/@comis/core/dist/config/schema-context-guard.test.d.ts +0 -1
  51. package/node_modules/@comis/core/dist/config/schema-context-guard.test.js +0 -111
  52. package/node_modules/@comis/core/dist/config/schema-daemon.test.d.ts +0 -1
  53. package/node_modules/@comis/core/dist/config/schema-daemon.test.js +0 -107
  54. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.d.ts +0 -1
  55. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.js +0 -51
  56. package/node_modules/@comis/core/dist/config/schema-documentation.test.d.ts +0 -1
  57. package/node_modules/@comis/core/dist/config/schema-documentation.test.js +0 -63
  58. package/node_modules/@comis/core/dist/config/schema-gateway.test.d.ts +0 -1
  59. package/node_modules/@comis/core/dist/config/schema-gateway.test.js +0 -219
  60. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.d.ts +0 -1
  61. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.js +0 -41
  62. package/node_modules/@comis/core/dist/config/schema-integrations.test.d.ts +0 -1
  63. package/node_modules/@comis/core/dist/config/schema-integrations.test.js +0 -92
  64. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.d.ts +0 -1
  65. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.js +0 -61
  66. package/node_modules/@comis/core/dist/config/schema-misc.test.d.ts +0 -1
  67. package/node_modules/@comis/core/dist/config/schema-misc.test.js +0 -394
  68. package/node_modules/@comis/core/dist/config/schema-observability.test.d.ts +0 -1
  69. package/node_modules/@comis/core/dist/config/schema-observability.test.js +0 -76
  70. package/node_modules/@comis/core/dist/config/schema-providers.test.d.ts +0 -1
  71. package/node_modules/@comis/core/dist/config/schema-providers.test.js +0 -294
  72. package/node_modules/@comis/core/dist/config/schema-queue.test.d.ts +0 -1
  73. package/node_modules/@comis/core/dist/config/schema-queue.test.js +0 -234
  74. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.d.ts +0 -1
  75. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.js +0 -36
  76. package/node_modules/@comis/core/dist/config/schema-security.test.d.ts +0 -1
  77. package/node_modules/@comis/core/dist/config/schema-security.test.js +0 -54
  78. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.d.ts +0 -1
  79. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.js +0 -60
  80. package/node_modules/@comis/core/dist/config/schema-serializer.test.d.ts +0 -1
  81. package/node_modules/@comis/core/dist/config/schema-serializer.test.js +0 -73
  82. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.d.ts +0 -1
  83. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.js +0 -39
  84. package/node_modules/@comis/core/dist/context/context.test.d.ts +0 -1
  85. package/node_modules/@comis/core/dist/context/context.test.js +0 -276
  86. package/node_modules/@comis/core/dist/domain/agent-response.test.d.ts +0 -1
  87. package/node_modules/@comis/core/dist/domain/agent-response.test.js +0 -159
  88. package/node_modules/@comis/core/dist/domain/credential-mapping.test.d.ts +0 -1
  89. package/node_modules/@comis/core/dist/domain/credential-mapping.test.js +0 -135
  90. package/node_modules/@comis/core/dist/domain/delivery-origin.test.d.ts +0 -1
  91. package/node_modules/@comis/core/dist/domain/delivery-origin.test.js +0 -68
  92. package/node_modules/@comis/core/dist/domain/execution-graph.test.d.ts +0 -1
  93. package/node_modules/@comis/core/dist/domain/execution-graph.test.js +0 -441
  94. package/node_modules/@comis/core/dist/domain/memory-entry.test.d.ts +0 -1
  95. package/node_modules/@comis/core/dist/domain/memory-entry.test.js +0 -193
  96. package/node_modules/@comis/core/dist/domain/normalized-message.test.d.ts +0 -1
  97. package/node_modules/@comis/core/dist/domain/normalized-message.test.js +0 -255
  98. package/node_modules/@comis/core/dist/domain/session-key.test.d.ts +0 -1
  99. package/node_modules/@comis/core/dist/domain/session-key.test.js +0 -291
  100. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.d.ts +0 -1
  101. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.js +0 -131
  102. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.d.ts +0 -1
  103. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.js +0 -182
  104. package/node_modules/@comis/core/dist/event-bus/bus.test.d.ts +0 -1
  105. package/node_modules/@comis/core/dist/event-bus/bus.test.js +0 -152
  106. package/node_modules/@comis/core/dist/event-bus/events-agent.test.d.ts +0 -1
  107. package/node_modules/@comis/core/dist/event-bus/events-agent.test.js +0 -409
  108. package/node_modules/@comis/core/dist/event-bus/events-channel.test.d.ts +0 -1
  109. package/node_modules/@comis/core/dist/event-bus/events-channel.test.js +0 -240
  110. package/node_modules/@comis/core/dist/event-bus/events-infra.test.d.ts +0 -1
  111. package/node_modules/@comis/core/dist/event-bus/events-infra.test.js +0 -416
  112. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.d.ts +0 -1
  113. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.js +0 -433
  114. package/node_modules/@comis/core/dist/event-bus/events.test.d.ts +0 -1
  115. package/node_modules/@comis/core/dist/event-bus/events.test.js +0 -93
  116. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.d.ts +0 -1
  117. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.js +0 -29
  118. package/node_modules/@comis/core/dist/hooks/hook-runner.test.d.ts +0 -1
  119. package/node_modules/@comis/core/dist/hooks/hook-runner.test.js +0 -490
  120. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.d.ts +0 -1
  121. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.js +0 -209
  122. package/node_modules/@comis/core/dist/hooks/integration.test.d.ts +0 -1
  123. package/node_modules/@comis/core/dist/hooks/integration.test.js +0 -235
  124. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.d.ts +0 -1
  125. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.js +0 -470
  126. package/node_modules/@comis/core/dist/load-env.test.d.ts +0 -1
  127. package/node_modules/@comis/core/dist/load-env.test.js +0 -21
  128. package/node_modules/@comis/core/dist/security/action-classifier.test.d.ts +0 -1
  129. package/node_modules/@comis/core/dist/security/action-classifier.test.js +0 -298
  130. package/node_modules/@comis/core/dist/security/audit-aggregator.test.d.ts +0 -1
  131. package/node_modules/@comis/core/dist/security/audit-aggregator.test.js +0 -128
  132. package/node_modules/@comis/core/dist/security/audit.test.d.ts +0 -1
  133. package/node_modules/@comis/core/dist/security/audit.test.js +0 -154
  134. package/node_modules/@comis/core/dist/security/canary-token.test.d.ts +0 -1
  135. package/node_modules/@comis/core/dist/security/canary-token.test.js +0 -45
  136. package/node_modules/@comis/core/dist/security/config-redaction.test.d.ts +0 -1
  137. package/node_modules/@comis/core/dist/security/config-redaction.test.js +0 -107
  138. package/node_modules/@comis/core/dist/security/external-content.test.d.ts +0 -1
  139. package/node_modules/@comis/core/dist/security/external-content.test.js +0 -210
  140. package/node_modules/@comis/core/dist/security/injection-patterns.test.d.ts +0 -1
  141. package/node_modules/@comis/core/dist/security/injection-patterns.test.js +0 -213
  142. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.d.ts +0 -1
  143. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.js +0 -194
  144. package/node_modules/@comis/core/dist/security/input-guard.test.d.ts +0 -1
  145. package/node_modules/@comis/core/dist/security/input-guard.test.js +0 -215
  146. package/node_modules/@comis/core/dist/security/input-security-guard.test.d.ts +0 -1
  147. package/node_modules/@comis/core/dist/security/input-security-guard.test.js +0 -215
  148. package/node_modules/@comis/core/dist/security/input-validator.test.d.ts +0 -1
  149. package/node_modules/@comis/core/dist/security/input-validator.test.js +0 -133
  150. package/node_modules/@comis/core/dist/security/log-sanitizer.test.d.ts +0 -1
  151. package/node_modules/@comis/core/dist/security/log-sanitizer.test.js +0 -260
  152. package/node_modules/@comis/core/dist/security/memory-write-validator.test.d.ts +0 -1
  153. package/node_modules/@comis/core/dist/security/memory-write-validator.test.js +0 -62
  154. package/node_modules/@comis/core/dist/security/output-guard.test.d.ts +0 -1
  155. package/node_modules/@comis/core/dist/security/output-guard.test.js +0 -397
  156. package/node_modules/@comis/core/dist/security/safe-path.test.d.ts +0 -1
  157. package/node_modules/@comis/core/dist/security/safe-path.test.js +0 -95
  158. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.d.ts +0 -1
  159. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.js +0 -231
  160. package/node_modules/@comis/core/dist/security/secret-access.test.d.ts +0 -1
  161. package/node_modules/@comis/core/dist/security/secret-access.test.js +0 -41
  162. package/node_modules/@comis/core/dist/security/secret-crypto.test.d.ts +0 -1
  163. package/node_modules/@comis/core/dist/security/secret-crypto.test.js +0 -113
  164. package/node_modules/@comis/core/dist/security/secret-manager.test.d.ts +0 -1
  165. package/node_modules/@comis/core/dist/security/secret-manager.test.js +0 -394
  166. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.d.ts +0 -1
  167. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.js +0 -268
  168. package/node_modules/@comis/core/dist/security/secrets-audit.test.d.ts +0 -10
  169. package/node_modules/@comis/core/dist/security/secrets-audit.test.js +0 -295
  170. package/node_modules/@comis/core/dist/security/ssrf-guard.test.d.ts +0 -1
  171. package/node_modules/@comis/core/dist/security/ssrf-guard.test.js +0 -127
  172. package/node_modules/@comis/core/dist/security/token-generator.test.d.ts +0 -1
  173. package/node_modules/@comis/core/dist/security/token-generator.test.js +0 -35
  174. package/node_modules/@comis/core/dist/tool-metadata.test.d.ts +0 -1
  175. package/node_modules/@comis/core/dist/tool-metadata.test.js +0 -112
  176. package/node_modules/@comis/memory/dist/compaction.test.d.ts +0 -1
  177. package/node_modules/@comis/memory/dist/compaction.test.js +0 -298
  178. package/node_modules/@comis/memory/dist/context-schema.test.d.ts +0 -1
  179. package/node_modules/@comis/memory/dist/context-schema.test.js +0 -246
  180. package/node_modules/@comis/memory/dist/context-store.test.d.ts +0 -1
  181. package/node_modules/@comis/memory/dist/context-store.test.js +0 -708
  182. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.d.ts +0 -7
  183. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.js +0 -73
  184. package/node_modules/@comis/memory/dist/credential-mapping-store.test.d.ts +0 -8
  185. package/node_modules/@comis/memory/dist/credential-mapping-store.test.js +0 -340
  186. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.d.ts +0 -1
  187. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.js +0 -165
  188. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.d.ts +0 -1
  189. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.js +0 -263
  190. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.d.ts +0 -1
  191. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.js +0 -202
  192. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.d.ts +0 -1
  193. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.js +0 -241
  194. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.d.ts +0 -8
  195. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.js +0 -678
  196. package/node_modules/@comis/memory/dist/embedding-cache.test.d.ts +0 -1
  197. package/node_modules/@comis/memory/dist/embedding-cache.test.js +0 -213
  198. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.d.ts +0 -1
  199. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.js +0 -87
  200. package/node_modules/@comis/memory/dist/embedding-hash.test.d.ts +0 -1
  201. package/node_modules/@comis/memory/dist/embedding-hash.test.js +0 -31
  202. package/node_modules/@comis/memory/dist/embedding-integration.test.d.ts +0 -8
  203. package/node_modules/@comis/memory/dist/embedding-integration.test.js +0 -232
  204. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.d.ts +0 -1
  205. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.js +0 -176
  206. package/node_modules/@comis/memory/dist/embedding-provider-local.test.d.ts +0 -8
  207. package/node_modules/@comis/memory/dist/embedding-provider-local.test.js +0 -76
  208. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.d.ts +0 -8
  209. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.js +0 -100
  210. package/node_modules/@comis/memory/dist/embedding-queue.test.d.ts +0 -1
  211. package/node_modules/@comis/memory/dist/embedding-queue.test.js +0 -236
  212. package/node_modules/@comis/memory/dist/hybrid-search.test.d.ts +0 -1
  213. package/node_modules/@comis/memory/dist/hybrid-search.test.js +0 -476
  214. package/node_modules/@comis/memory/dist/identity-link-store.test.d.ts +0 -1
  215. package/node_modules/@comis/memory/dist/identity-link-store.test.js +0 -88
  216. package/node_modules/@comis/memory/dist/memory-api.test.d.ts +0 -1
  217. package/node_modules/@comis/memory/dist/memory-api.test.js +0 -495
  218. package/node_modules/@comis/memory/dist/memory-concurrency.test.d.ts +0 -20
  219. package/node_modules/@comis/memory/dist/memory-concurrency.test.js +0 -222
  220. package/node_modules/@comis/memory/dist/named-graph-store.test.d.ts +0 -1
  221. package/node_modules/@comis/memory/dist/named-graph-store.test.js +0 -227
  222. package/node_modules/@comis/memory/dist/observability-store.test.d.ts +0 -1
  223. package/node_modules/@comis/memory/dist/observability-store.test.js +0 -704
  224. package/node_modules/@comis/memory/dist/row-mapper.test.d.ts +0 -1
  225. package/node_modules/@comis/memory/dist/row-mapper.test.js +0 -409
  226. package/node_modules/@comis/memory/dist/schema.test.d.ts +0 -1
  227. package/node_modules/@comis/memory/dist/schema.test.js +0 -240
  228. package/node_modules/@comis/memory/dist/secret-store-schema.test.d.ts +0 -7
  229. package/node_modules/@comis/memory/dist/secret-store-schema.test.js +0 -90
  230. package/node_modules/@comis/memory/dist/session-store.test.d.ts +0 -1
  231. package/node_modules/@comis/memory/dist/session-store.test.js +0 -262
  232. package/node_modules/@comis/memory/dist/setup-secrets.test.d.ts +0 -1
  233. package/node_modules/@comis/memory/dist/setup-secrets.test.js +0 -140
  234. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.d.ts +0 -1
  235. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.js +0 -888
  236. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.d.ts +0 -8
  237. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.js +0 -245
  238. package/node_modules/@comis/shared/dist/abort.test.d.ts +0 -1
  239. package/node_modules/@comis/shared/dist/abort.test.js +0 -71
  240. package/node_modules/@comis/shared/dist/result.test.d.ts +0 -1
  241. package/node_modules/@comis/shared/dist/result.test.js +0 -178
  242. package/node_modules/@comis/shared/dist/suppress-error.test.d.ts +0 -1
  243. package/node_modules/@comis/shared/dist/suppress-error.test.js +0 -50
  244. package/node_modules/@comis/shared/dist/timeout.test.d.ts +0 -1
  245. package/node_modules/@comis/shared/dist/timeout.test.js +0 -75
  246. package/node_modules/@comis/shared/dist/ttl-cache.test.d.ts +0 -1
  247. package/node_modules/@comis/shared/dist/ttl-cache.test.js +0 -81
@@ -1,193 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { parseMemoryEntry } from "./memory-entry.js";
3
- const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
4
- function validEntry(overrides = {}) {
5
- return {
6
- id: VALID_UUID,
7
- userId: "user-42",
8
- content: "The user prefers dark mode.",
9
- trustLevel: "learned",
10
- source: { who: "agent" },
11
- createdAt: 1700000000,
12
- ...overrides,
13
- };
14
- }
15
- describe("MemoryEntry", () => {
16
- describe("valid data", () => {
17
- it("parses a minimal valid entry", () => {
18
- const result = parseMemoryEntry(validEntry());
19
- expect(result.ok).toBe(true);
20
- if (result.ok) {
21
- expect(result.value.id).toBe(VALID_UUID);
22
- expect(result.value.userId).toBe("user-42");
23
- expect(result.value.trustLevel).toBe("learned");
24
- }
25
- });
26
- it("applies default tenantId", () => {
27
- const result = parseMemoryEntry(validEntry());
28
- expect(result.ok).toBe(true);
29
- if (result.ok) {
30
- expect(result.value.tenantId).toBe("default");
31
- }
32
- });
33
- it("applies default tags", () => {
34
- const result = parseMemoryEntry(validEntry());
35
- expect(result.ok).toBe(true);
36
- if (result.ok) {
37
- expect(result.value.tags).toEqual([]);
38
- }
39
- });
40
- it("accepts explicit tenantId override", () => {
41
- const result = parseMemoryEntry(validEntry({ tenantId: "acme-corp" }));
42
- expect(result.ok).toBe(true);
43
- if (result.ok) {
44
- expect(result.value.tenantId).toBe("acme-corp");
45
- }
46
- });
47
- it("accepts all trust levels", () => {
48
- for (const trustLevel of ["system", "learned", "external"]) {
49
- const result = parseMemoryEntry(validEntry({ trustLevel }));
50
- expect(result.ok).toBe(true);
51
- }
52
- });
53
- it("accepts optional embedding", () => {
54
- const result = parseMemoryEntry(validEntry({ embedding: [0.1, 0.2, 0.3] }));
55
- expect(result.ok).toBe(true);
56
- if (result.ok) {
57
- expect(result.value.embedding).toEqual([0.1, 0.2, 0.3]);
58
- }
59
- });
60
- it("allows omitting optional fields (embedding, updatedAt, expiresAt)", () => {
61
- const result = parseMemoryEntry(validEntry());
62
- expect(result.ok).toBe(true);
63
- if (result.ok) {
64
- expect(result.value.embedding).toBeUndefined();
65
- expect(result.value.updatedAt).toBeUndefined();
66
- expect(result.value.expiresAt).toBeUndefined();
67
- }
68
- });
69
- it("accepts tags array", () => {
70
- const result = parseMemoryEntry(validEntry({ tags: ["preference", "ui"] }));
71
- expect(result.ok).toBe(true);
72
- if (result.ok) {
73
- expect(result.value.tags).toEqual(["preference", "ui"]);
74
- }
75
- });
76
- it("accepts source with channel and sessionKey", () => {
77
- const result = parseMemoryEntry(validEntry({
78
- source: {
79
- who: "agent",
80
- channel: "telegram",
81
- sessionKey: "default:user-42:general",
82
- },
83
- }));
84
- expect(result.ok).toBe(true);
85
- if (result.ok) {
86
- expect(result.value.source.channel).toBe("telegram");
87
- expect(result.value.source.sessionKey).toBe("default:user-42:general");
88
- }
89
- });
90
- });
91
- describe("invalid data", () => {
92
- it("rejects missing required fields", () => {
93
- const result = parseMemoryEntry({});
94
- expect(result.ok).toBe(false);
95
- if (!result.ok) {
96
- const paths = result.error.issues.map((i) => i.path[0]);
97
- expect(paths).toContain("id");
98
- expect(paths).toContain("userId");
99
- expect(paths).toContain("content");
100
- expect(paths).toContain("trustLevel");
101
- expect(paths).toContain("source");
102
- expect(paths).toContain("createdAt");
103
- }
104
- });
105
- it("rejects invalid UUID for id", () => {
106
- const result = parseMemoryEntry(validEntry({ id: "bad" }));
107
- expect(result.ok).toBe(false);
108
- });
109
- it("rejects empty userId", () => {
110
- const result = parseMemoryEntry(validEntry({ userId: "" }));
111
- expect(result.ok).toBe(false);
112
- });
113
- it("rejects empty content", () => {
114
- const result = parseMemoryEntry(validEntry({ content: "" }));
115
- expect(result.ok).toBe(false);
116
- });
117
- it("rejects invalid trustLevel", () => {
118
- const result = parseMemoryEntry(validEntry({ trustLevel: "untrusted" }));
119
- expect(result.ok).toBe(false);
120
- });
121
- it("rejects non-integer createdAt", () => {
122
- const result = parseMemoryEntry(validEntry({ createdAt: 1.5 }));
123
- expect(result.ok).toBe(false);
124
- });
125
- it("rejects zero createdAt", () => {
126
- const result = parseMemoryEntry(validEntry({ createdAt: 0 }));
127
- expect(result.ok).toBe(false);
128
- });
129
- it("rejects empty tenantId", () => {
130
- const result = parseMemoryEntry(validEntry({ tenantId: "" }));
131
- expect(result.ok).toBe(false);
132
- });
133
- it("strips extra/unknown fields", () => {
134
- const result = parseMemoryEntry(validEntry({ extraField: true }));
135
- expect(result.ok).toBe(false);
136
- });
137
- it("returns descriptive ZodError issues", () => {
138
- const result = parseMemoryEntry({ id: 42 });
139
- expect(result.ok).toBe(false);
140
- if (!result.ok) {
141
- expect(result.error.issues.length).toBeGreaterThan(0);
142
- for (const issue of result.error.issues) {
143
- expect(issue.message).toBeTruthy();
144
- }
145
- }
146
- });
147
- });
148
- describe("taintLevel and sourceType fields (SHR-06)", () => {
149
- it("accepts MemoryEntry with taintLevel and sourceType", () => {
150
- const result = parseMemoryEntry(validEntry({ taintLevel: "wrapped", sourceType: "web" }));
151
- expect(result.ok).toBe(true);
152
- if (result.ok) {
153
- expect(result.value.taintLevel).toBe("wrapped");
154
- expect(result.value.sourceType).toBe("web");
155
- }
156
- });
157
- it("MemoryEntry without taintLevel and sourceType still parses (fields are optional)", () => {
158
- const result = parseMemoryEntry(validEntry());
159
- expect(result.ok).toBe(true);
160
- if (result.ok) {
161
- expect(result.value.taintLevel).toBeUndefined();
162
- expect(result.value.sourceType).toBeUndefined();
163
- }
164
- });
165
- it("accepts all valid taintLevel values", () => {
166
- for (const taintLevel of ["clean", "wrapped", "raw"]) {
167
- const result = parseMemoryEntry(validEntry({ taintLevel }));
168
- expect(result.ok).toBe(true);
169
- }
170
- });
171
- it("accepts all valid sourceType values", () => {
172
- for (const sourceType of [
173
- "system",
174
- "conversation",
175
- "tool",
176
- "web",
177
- "api",
178
- "unknown",
179
- ]) {
180
- const result = parseMemoryEntry(validEntry({ sourceType }));
181
- expect(result.ok).toBe(true);
182
- }
183
- });
184
- it("rejects invalid taintLevel value", () => {
185
- const result = parseMemoryEntry(validEntry({ taintLevel: "dirty" }));
186
- expect(result.ok).toBe(false);
187
- });
188
- it("rejects invalid sourceType value", () => {
189
- const result = parseMemoryEntry(validEntry({ sourceType: "magic" }));
190
- expect(result.ok).toBe(false);
191
- });
192
- });
193
- });
@@ -1,255 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { parseMessage, AttachmentSchema } from "./normalized-message.js";
3
- const VALID_UUID = "550e8400-e29b-41d4-a716-446655440000";
4
- const VALID_UUID_2 = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
5
- function validMessage(overrides = {}) {
6
- return {
7
- id: VALID_UUID,
8
- channelId: "general",
9
- channelType: "telegram",
10
- senderId: "user-123",
11
- text: "Hello, world!",
12
- timestamp: 1700000000,
13
- ...overrides,
14
- };
15
- }
16
- describe("NormalizedMessage", () => {
17
- describe("valid data", () => {
18
- it("parses a minimal valid message", () => {
19
- const result = parseMessage(validMessage());
20
- expect(result.ok).toBe(true);
21
- if (result.ok) {
22
- expect(result.value.id).toBe(VALID_UUID);
23
- expect(result.value.channelType).toBe("telegram");
24
- expect(result.value.text).toBe("Hello, world!");
25
- }
26
- });
27
- it("applies default values for attachments and metadata", () => {
28
- const result = parseMessage(validMessage());
29
- expect(result.ok).toBe(true);
30
- if (result.ok) {
31
- expect(result.value.attachments).toEqual([]);
32
- expect(result.value.metadata).toEqual({});
33
- }
34
- });
35
- it("accepts all valid channel types", () => {
36
- const channelTypes = [
37
- "telegram",
38
- "discord",
39
- "slack",
40
- "whatsapp",
41
- "web",
42
- "cli",
43
- "gateway",
44
- ];
45
- for (const channelType of channelTypes) {
46
- const result = parseMessage(validMessage({ channelType }));
47
- expect(result.ok).toBe(true);
48
- }
49
- });
50
- it("accepts optional replyTo field", () => {
51
- const result = parseMessage(validMessage({ replyTo: VALID_UUID_2 }));
52
- expect(result.ok).toBe(true);
53
- if (result.ok) {
54
- expect(result.value.replyTo).toBe(VALID_UUID_2);
55
- }
56
- });
57
- it("allows omitting optional replyTo", () => {
58
- const result = parseMessage(validMessage());
59
- expect(result.ok).toBe(true);
60
- if (result.ok) {
61
- expect(result.value.replyTo).toBeUndefined();
62
- }
63
- });
64
- it("accepts valid attachments", () => {
65
- const result = parseMessage(validMessage({
66
- attachments: [
67
- {
68
- type: "image",
69
- url: "https://example.com/img.png",
70
- mimeType: "image/png",
71
- fileName: "img.png",
72
- sizeBytes: 1024,
73
- },
74
- ],
75
- }));
76
- expect(result.ok).toBe(true);
77
- if (result.ok) {
78
- expect(result.value.attachments).toHaveLength(1);
79
- expect(result.value.attachments[0].type).toBe("image");
80
- }
81
- });
82
- it("accepts tg-file:// URIs in attachments for deferred media resolution", () => {
83
- const result = parseMessage(validMessage({
84
- attachments: [
85
- {
86
- type: "file",
87
- url: "tg-file://abc123",
88
- },
89
- ],
90
- }));
91
- expect(result.ok).toBe(true);
92
- if (result.ok) {
93
- expect(result.value.attachments).toHaveLength(1);
94
- expect(result.value.attachments[0].url).toBe("tg-file://abc123");
95
- }
96
- });
97
- it("rejects empty string as attachment url", () => {
98
- const result = parseMessage(validMessage({
99
- attachments: [
100
- {
101
- type: "file",
102
- url: "",
103
- },
104
- ],
105
- }));
106
- expect(result.ok).toBe(false);
107
- });
108
- it("accepts metadata with arbitrary values", () => {
109
- const result = parseMessage(validMessage({ metadata: { priority: 1, urgent: true } }));
110
- expect(result.ok).toBe(true);
111
- if (result.ok) {
112
- expect(result.value.metadata).toEqual({ priority: 1, urgent: true });
113
- }
114
- });
115
- });
116
- describe("invalid data", () => {
117
- it("rejects missing required fields", () => {
118
- const result = parseMessage({});
119
- expect(result.ok).toBe(false);
120
- if (!result.ok) {
121
- const paths = result.error.issues.map((i) => i.path[0]);
122
- expect(paths).toContain("id");
123
- expect(paths).toContain("channelId");
124
- expect(paths).toContain("channelType");
125
- expect(paths).toContain("senderId");
126
- expect(paths).toContain("text");
127
- expect(paths).toContain("timestamp");
128
- }
129
- });
130
- it("rejects invalid UUID for id", () => {
131
- const result = parseMessage(validMessage({ id: "not-a-uuid" }));
132
- expect(result.ok).toBe(false);
133
- });
134
- it("accepts arbitrary non-empty channel type strings", () => {
135
- // channelType is now z.string().min(1) to support dynamic channel plugins
136
- const result = parseMessage(validMessage({ channelType: "sms" }));
137
- expect(result.ok).toBe(true);
138
- });
139
- it("rejects empty channel type", () => {
140
- const result = parseMessage(validMessage({ channelType: "" }));
141
- expect(result.ok).toBe(false);
142
- });
143
- it("rejects empty channelId", () => {
144
- const result = parseMessage(validMessage({ channelId: "" }));
145
- expect(result.ok).toBe(false);
146
- });
147
- it("rejects empty senderId", () => {
148
- const result = parseMessage(validMessage({ senderId: "" }));
149
- expect(result.ok).toBe(false);
150
- });
151
- it("rejects text exceeding max length", () => {
152
- const result = parseMessage(validMessage({ text: "x".repeat(32769) }));
153
- expect(result.ok).toBe(false);
154
- });
155
- it("rejects non-integer timestamp", () => {
156
- const result = parseMessage(validMessage({ timestamp: 1700000000.5 }));
157
- expect(result.ok).toBe(false);
158
- });
159
- it("rejects negative timestamp", () => {
160
- const result = parseMessage(validMessage({ timestamp: -1 }));
161
- expect(result.ok).toBe(false);
162
- });
163
- it("rejects zero timestamp", () => {
164
- const result = parseMessage(validMessage({ timestamp: 0 }));
165
- expect(result.ok).toBe(false);
166
- });
167
- it("rejects invalid replyTo UUID", () => {
168
- const result = parseMessage(validMessage({ replyTo: "bad" }));
169
- expect(result.ok).toBe(false);
170
- });
171
- it("strips extra/unknown fields", () => {
172
- const result = parseMessage(validMessage({ extraField: "sneaky" }));
173
- expect(result.ok).toBe(false);
174
- });
175
- it("rejects non-object input", () => {
176
- const result = parseMessage("not an object");
177
- expect(result.ok).toBe(false);
178
- });
179
- it("rejects null input", () => {
180
- const result = parseMessage(null);
181
- expect(result.ok).toBe(false);
182
- });
183
- it("returns descriptive ZodError with issue paths", () => {
184
- const result = parseMessage({ id: 123, channelType: "invalid" });
185
- expect(result.ok).toBe(false);
186
- if (!result.ok) {
187
- expect(result.error.issues.length).toBeGreaterThan(0);
188
- for (const issue of result.error.issues) {
189
- expect(issue.message).toBeTruthy();
190
- }
191
- }
192
- });
193
- });
194
- describe("voice metadata fields", () => {
195
- it("accepts a voice attachment with all new fields", () => {
196
- const result = parseMessage(validMessage({
197
- attachments: [
198
- {
199
- type: "audio",
200
- url: "tg-file://voice123",
201
- durationMs: 5000,
202
- isVoiceNote: true,
203
- voiceMeta: { waveform: "AAAA", codec: "opus" },
204
- transcription: "Hello, world!",
205
- },
206
- ],
207
- }));
208
- expect(result.ok).toBe(true);
209
- if (result.ok) {
210
- const att = result.value.attachments[0];
211
- expect(att.durationMs).toBe(5000);
212
- expect(att.isVoiceNote).toBe(true);
213
- expect(att.voiceMeta).toEqual({ waveform: "AAAA", codec: "opus" });
214
- expect(att.transcription).toBe("Hello, world!");
215
- }
216
- });
217
- it("accepts an attachment with only existing fields (backward compatibility)", () => {
218
- const result = AttachmentSchema.safeParse({
219
- type: "file",
220
- url: "https://example.com/doc.pdf",
221
- });
222
- expect(result.success).toBe(true);
223
- if (result.success) {
224
- expect(result.data.durationMs).toBeUndefined();
225
- expect(result.data.isVoiceNote).toBeUndefined();
226
- expect(result.data.voiceMeta).toBeUndefined();
227
- expect(result.data.transcription).toBeUndefined();
228
- }
229
- });
230
- it("rejects voiceMeta with extra unknown fields (strictObject)", () => {
231
- const result = AttachmentSchema.safeParse({
232
- type: "audio",
233
- url: "https://example.com/audio.ogg",
234
- voiceMeta: { waveform: "AAAA", codec: "opus", extraField: "bad" },
235
- });
236
- expect(result.success).toBe(false);
237
- });
238
- it("rejects negative durationMs", () => {
239
- const result = AttachmentSchema.safeParse({
240
- type: "audio",
241
- url: "https://example.com/audio.ogg",
242
- durationMs: -100,
243
- });
244
- expect(result.success).toBe(false);
245
- });
246
- it("rejects non-integer durationMs", () => {
247
- const result = AttachmentSchema.safeParse({
248
- type: "audio",
249
- url: "https://example.com/audio.ogg",
250
- durationMs: 5000.5,
251
- });
252
- expect(result.success).toBe(false);
253
- });
254
- });
255
- });