comisai 1.0.10 → 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 (251) hide show
  1. package/README.md +3 -3
  2. package/node_modules/@comis/agent/dist/executor/pi-executor.d.ts +1 -4
  3. package/node_modules/@comis/agent/package.json +1 -1
  4. package/node_modules/@comis/channels/package.json +1 -1
  5. package/node_modules/@comis/cli/dist/wizard/steps/06-channels.js +88 -11
  6. package/node_modules/@comis/cli/dist/wizard/steps/10-write-config.js +4 -0
  7. package/node_modules/@comis/cli/dist/wizard/types.d.ts +1 -0
  8. package/node_modules/@comis/cli/package.json +1 -1
  9. package/node_modules/@comis/core/package.json +1 -1
  10. package/node_modules/@comis/daemon/package.json +1 -1
  11. package/node_modules/@comis/gateway/package.json +1 -1
  12. package/node_modules/@comis/infra/package.json +1 -1
  13. package/node_modules/@comis/memory/package.json +1 -1
  14. package/node_modules/@comis/scheduler/package.json +1 -1
  15. package/node_modules/@comis/shared/package.json +1 -1
  16. package/node_modules/@comis/skills/package.json +1 -1
  17. package/package.json +18 -18
  18. package/node_modules/@comis/core/dist/approval/approval-gate.test.d.ts +0 -1
  19. package/node_modules/@comis/core/dist/approval/approval-gate.test.js +0 -1003
  20. package/node_modules/@comis/core/dist/bootstrap.test.d.ts +0 -1
  21. package/node_modules/@comis/core/dist/bootstrap.test.js +0 -150
  22. package/node_modules/@comis/core/dist/config/backup.test.d.ts +0 -1
  23. package/node_modules/@comis/core/dist/config/backup.test.js +0 -160
  24. package/node_modules/@comis/core/dist/config/env-substitution.test.d.ts +0 -1
  25. package/node_modules/@comis/core/dist/config/env-substitution.test.js +0 -259
  26. package/node_modules/@comis/core/dist/config/field-metadata.test.d.ts +0 -1
  27. package/node_modules/@comis/core/dist/config/field-metadata.test.js +0 -72
  28. package/node_modules/@comis/core/dist/config/git-manager.test.d.ts +0 -1
  29. package/node_modules/@comis/core/dist/config/git-manager.test.js +0 -1042
  30. package/node_modules/@comis/core/dist/config/immutable-keys.test.d.ts +0 -1
  31. package/node_modules/@comis/core/dist/config/immutable-keys.test.js +0 -283
  32. package/node_modules/@comis/core/dist/config/include-resolver.test.d.ts +0 -1
  33. package/node_modules/@comis/core/dist/config/include-resolver.test.js +0 -292
  34. package/node_modules/@comis/core/dist/config/layered.test.d.ts +0 -1
  35. package/node_modules/@comis/core/dist/config/layered.test.js +0 -211
  36. package/node_modules/@comis/core/dist/config/loader.test.d.ts +0 -1
  37. package/node_modules/@comis/core/dist/config/loader.test.js +0 -300
  38. package/node_modules/@comis/core/dist/config/migrate.test.d.ts +0 -1
  39. package/node_modules/@comis/core/dist/config/migrate.test.js +0 -244
  40. package/node_modules/@comis/core/dist/config/partial-validator.test.d.ts +0 -1
  41. package/node_modules/@comis/core/dist/config/partial-validator.test.js +0 -98
  42. package/node_modules/@comis/core/dist/config/schema-agent-model.test.d.ts +0 -1
  43. package/node_modules/@comis/core/dist/config/schema-agent-model.test.js +0 -279
  44. package/node_modules/@comis/core/dist/config/schema-agent-session.test.d.ts +0 -1
  45. package/node_modules/@comis/core/dist/config/schema-agent-session.test.js +0 -242
  46. package/node_modules/@comis/core/dist/config/schema-agent.test.d.ts +0 -1
  47. package/node_modules/@comis/core/dist/config/schema-agent.test.js +0 -645
  48. package/node_modules/@comis/core/dist/config/schema-channel.test.d.ts +0 -1
  49. package/node_modules/@comis/core/dist/config/schema-channel.test.js +0 -341
  50. package/node_modules/@comis/core/dist/config/schema-coalescer.test.d.ts +0 -1
  51. package/node_modules/@comis/core/dist/config/schema-coalescer.test.js +0 -51
  52. package/node_modules/@comis/core/dist/config/schema-context-engine.test.d.ts +0 -1
  53. package/node_modules/@comis/core/dist/config/schema-context-engine.test.js +0 -797
  54. package/node_modules/@comis/core/dist/config/schema-context-guard.test.d.ts +0 -1
  55. package/node_modules/@comis/core/dist/config/schema-context-guard.test.js +0 -111
  56. package/node_modules/@comis/core/dist/config/schema-daemon.test.d.ts +0 -1
  57. package/node_modules/@comis/core/dist/config/schema-daemon.test.js +0 -107
  58. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.d.ts +0 -1
  59. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.js +0 -51
  60. package/node_modules/@comis/core/dist/config/schema-documentation.test.d.ts +0 -1
  61. package/node_modules/@comis/core/dist/config/schema-documentation.test.js +0 -63
  62. package/node_modules/@comis/core/dist/config/schema-gateway.test.d.ts +0 -1
  63. package/node_modules/@comis/core/dist/config/schema-gateway.test.js +0 -219
  64. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.d.ts +0 -1
  65. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.js +0 -41
  66. package/node_modules/@comis/core/dist/config/schema-integrations.test.d.ts +0 -1
  67. package/node_modules/@comis/core/dist/config/schema-integrations.test.js +0 -92
  68. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.d.ts +0 -1
  69. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.js +0 -61
  70. package/node_modules/@comis/core/dist/config/schema-misc.test.d.ts +0 -1
  71. package/node_modules/@comis/core/dist/config/schema-misc.test.js +0 -394
  72. package/node_modules/@comis/core/dist/config/schema-observability.test.d.ts +0 -1
  73. package/node_modules/@comis/core/dist/config/schema-observability.test.js +0 -76
  74. package/node_modules/@comis/core/dist/config/schema-providers.test.d.ts +0 -1
  75. package/node_modules/@comis/core/dist/config/schema-providers.test.js +0 -294
  76. package/node_modules/@comis/core/dist/config/schema-queue.test.d.ts +0 -1
  77. package/node_modules/@comis/core/dist/config/schema-queue.test.js +0 -234
  78. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.d.ts +0 -1
  79. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.js +0 -36
  80. package/node_modules/@comis/core/dist/config/schema-security.test.d.ts +0 -1
  81. package/node_modules/@comis/core/dist/config/schema-security.test.js +0 -54
  82. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.d.ts +0 -1
  83. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.js +0 -60
  84. package/node_modules/@comis/core/dist/config/schema-serializer.test.d.ts +0 -1
  85. package/node_modules/@comis/core/dist/config/schema-serializer.test.js +0 -73
  86. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.d.ts +0 -1
  87. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.js +0 -39
  88. package/node_modules/@comis/core/dist/context/context.test.d.ts +0 -1
  89. package/node_modules/@comis/core/dist/context/context.test.js +0 -276
  90. package/node_modules/@comis/core/dist/domain/agent-response.test.d.ts +0 -1
  91. package/node_modules/@comis/core/dist/domain/agent-response.test.js +0 -159
  92. package/node_modules/@comis/core/dist/domain/credential-mapping.test.d.ts +0 -1
  93. package/node_modules/@comis/core/dist/domain/credential-mapping.test.js +0 -135
  94. package/node_modules/@comis/core/dist/domain/delivery-origin.test.d.ts +0 -1
  95. package/node_modules/@comis/core/dist/domain/delivery-origin.test.js +0 -68
  96. package/node_modules/@comis/core/dist/domain/execution-graph.test.d.ts +0 -1
  97. package/node_modules/@comis/core/dist/domain/execution-graph.test.js +0 -441
  98. package/node_modules/@comis/core/dist/domain/memory-entry.test.d.ts +0 -1
  99. package/node_modules/@comis/core/dist/domain/memory-entry.test.js +0 -193
  100. package/node_modules/@comis/core/dist/domain/normalized-message.test.d.ts +0 -1
  101. package/node_modules/@comis/core/dist/domain/normalized-message.test.js +0 -255
  102. package/node_modules/@comis/core/dist/domain/session-key.test.d.ts +0 -1
  103. package/node_modules/@comis/core/dist/domain/session-key.test.js +0 -291
  104. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.d.ts +0 -1
  105. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.js +0 -131
  106. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.d.ts +0 -1
  107. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.js +0 -182
  108. package/node_modules/@comis/core/dist/event-bus/bus.test.d.ts +0 -1
  109. package/node_modules/@comis/core/dist/event-bus/bus.test.js +0 -152
  110. package/node_modules/@comis/core/dist/event-bus/events-agent.test.d.ts +0 -1
  111. package/node_modules/@comis/core/dist/event-bus/events-agent.test.js +0 -409
  112. package/node_modules/@comis/core/dist/event-bus/events-channel.test.d.ts +0 -1
  113. package/node_modules/@comis/core/dist/event-bus/events-channel.test.js +0 -240
  114. package/node_modules/@comis/core/dist/event-bus/events-infra.test.d.ts +0 -1
  115. package/node_modules/@comis/core/dist/event-bus/events-infra.test.js +0 -416
  116. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.d.ts +0 -1
  117. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.js +0 -433
  118. package/node_modules/@comis/core/dist/event-bus/events.test.d.ts +0 -1
  119. package/node_modules/@comis/core/dist/event-bus/events.test.js +0 -93
  120. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.d.ts +0 -1
  121. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.js +0 -29
  122. package/node_modules/@comis/core/dist/hooks/hook-runner.test.d.ts +0 -1
  123. package/node_modules/@comis/core/dist/hooks/hook-runner.test.js +0 -490
  124. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.d.ts +0 -1
  125. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.js +0 -209
  126. package/node_modules/@comis/core/dist/hooks/integration.test.d.ts +0 -1
  127. package/node_modules/@comis/core/dist/hooks/integration.test.js +0 -235
  128. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.d.ts +0 -1
  129. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.js +0 -470
  130. package/node_modules/@comis/core/dist/load-env.test.d.ts +0 -1
  131. package/node_modules/@comis/core/dist/load-env.test.js +0 -21
  132. package/node_modules/@comis/core/dist/security/action-classifier.test.d.ts +0 -1
  133. package/node_modules/@comis/core/dist/security/action-classifier.test.js +0 -298
  134. package/node_modules/@comis/core/dist/security/audit-aggregator.test.d.ts +0 -1
  135. package/node_modules/@comis/core/dist/security/audit-aggregator.test.js +0 -128
  136. package/node_modules/@comis/core/dist/security/audit.test.d.ts +0 -1
  137. package/node_modules/@comis/core/dist/security/audit.test.js +0 -154
  138. package/node_modules/@comis/core/dist/security/canary-token.test.d.ts +0 -1
  139. package/node_modules/@comis/core/dist/security/canary-token.test.js +0 -45
  140. package/node_modules/@comis/core/dist/security/config-redaction.test.d.ts +0 -1
  141. package/node_modules/@comis/core/dist/security/config-redaction.test.js +0 -107
  142. package/node_modules/@comis/core/dist/security/external-content.test.d.ts +0 -1
  143. package/node_modules/@comis/core/dist/security/external-content.test.js +0 -210
  144. package/node_modules/@comis/core/dist/security/injection-patterns.test.d.ts +0 -1
  145. package/node_modules/@comis/core/dist/security/injection-patterns.test.js +0 -213
  146. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.d.ts +0 -1
  147. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.js +0 -194
  148. package/node_modules/@comis/core/dist/security/input-guard.test.d.ts +0 -1
  149. package/node_modules/@comis/core/dist/security/input-guard.test.js +0 -215
  150. package/node_modules/@comis/core/dist/security/input-security-guard.test.d.ts +0 -1
  151. package/node_modules/@comis/core/dist/security/input-security-guard.test.js +0 -215
  152. package/node_modules/@comis/core/dist/security/input-validator.test.d.ts +0 -1
  153. package/node_modules/@comis/core/dist/security/input-validator.test.js +0 -133
  154. package/node_modules/@comis/core/dist/security/log-sanitizer.test.d.ts +0 -1
  155. package/node_modules/@comis/core/dist/security/log-sanitizer.test.js +0 -260
  156. package/node_modules/@comis/core/dist/security/memory-write-validator.test.d.ts +0 -1
  157. package/node_modules/@comis/core/dist/security/memory-write-validator.test.js +0 -62
  158. package/node_modules/@comis/core/dist/security/output-guard.test.d.ts +0 -1
  159. package/node_modules/@comis/core/dist/security/output-guard.test.js +0 -397
  160. package/node_modules/@comis/core/dist/security/safe-path.test.d.ts +0 -1
  161. package/node_modules/@comis/core/dist/security/safe-path.test.js +0 -95
  162. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.d.ts +0 -1
  163. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.js +0 -231
  164. package/node_modules/@comis/core/dist/security/secret-access.test.d.ts +0 -1
  165. package/node_modules/@comis/core/dist/security/secret-access.test.js +0 -41
  166. package/node_modules/@comis/core/dist/security/secret-crypto.test.d.ts +0 -1
  167. package/node_modules/@comis/core/dist/security/secret-crypto.test.js +0 -113
  168. package/node_modules/@comis/core/dist/security/secret-manager.test.d.ts +0 -1
  169. package/node_modules/@comis/core/dist/security/secret-manager.test.js +0 -394
  170. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.d.ts +0 -1
  171. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.js +0 -268
  172. package/node_modules/@comis/core/dist/security/secrets-audit.test.d.ts +0 -10
  173. package/node_modules/@comis/core/dist/security/secrets-audit.test.js +0 -295
  174. package/node_modules/@comis/core/dist/security/ssrf-guard.test.d.ts +0 -1
  175. package/node_modules/@comis/core/dist/security/ssrf-guard.test.js +0 -127
  176. package/node_modules/@comis/core/dist/security/token-generator.test.d.ts +0 -1
  177. package/node_modules/@comis/core/dist/security/token-generator.test.js +0 -35
  178. package/node_modules/@comis/core/dist/tool-metadata.test.d.ts +0 -1
  179. package/node_modules/@comis/core/dist/tool-metadata.test.js +0 -112
  180. package/node_modules/@comis/memory/dist/compaction.test.d.ts +0 -1
  181. package/node_modules/@comis/memory/dist/compaction.test.js +0 -298
  182. package/node_modules/@comis/memory/dist/context-schema.test.d.ts +0 -1
  183. package/node_modules/@comis/memory/dist/context-schema.test.js +0 -246
  184. package/node_modules/@comis/memory/dist/context-store.test.d.ts +0 -1
  185. package/node_modules/@comis/memory/dist/context-store.test.js +0 -708
  186. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.d.ts +0 -7
  187. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.js +0 -73
  188. package/node_modules/@comis/memory/dist/credential-mapping-store.test.d.ts +0 -8
  189. package/node_modules/@comis/memory/dist/credential-mapping-store.test.js +0 -340
  190. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.d.ts +0 -1
  191. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.js +0 -165
  192. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.d.ts +0 -1
  193. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.js +0 -263
  194. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.d.ts +0 -1
  195. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.js +0 -202
  196. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.d.ts +0 -1
  197. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.js +0 -241
  198. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.d.ts +0 -8
  199. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.js +0 -678
  200. package/node_modules/@comis/memory/dist/embedding-cache.test.d.ts +0 -1
  201. package/node_modules/@comis/memory/dist/embedding-cache.test.js +0 -213
  202. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.d.ts +0 -1
  203. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.js +0 -87
  204. package/node_modules/@comis/memory/dist/embedding-hash.test.d.ts +0 -1
  205. package/node_modules/@comis/memory/dist/embedding-hash.test.js +0 -31
  206. package/node_modules/@comis/memory/dist/embedding-integration.test.d.ts +0 -8
  207. package/node_modules/@comis/memory/dist/embedding-integration.test.js +0 -232
  208. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.d.ts +0 -1
  209. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.js +0 -176
  210. package/node_modules/@comis/memory/dist/embedding-provider-local.test.d.ts +0 -8
  211. package/node_modules/@comis/memory/dist/embedding-provider-local.test.js +0 -76
  212. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.d.ts +0 -8
  213. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.js +0 -100
  214. package/node_modules/@comis/memory/dist/embedding-queue.test.d.ts +0 -1
  215. package/node_modules/@comis/memory/dist/embedding-queue.test.js +0 -236
  216. package/node_modules/@comis/memory/dist/hybrid-search.test.d.ts +0 -1
  217. package/node_modules/@comis/memory/dist/hybrid-search.test.js +0 -476
  218. package/node_modules/@comis/memory/dist/identity-link-store.test.d.ts +0 -1
  219. package/node_modules/@comis/memory/dist/identity-link-store.test.js +0 -88
  220. package/node_modules/@comis/memory/dist/memory-api.test.d.ts +0 -1
  221. package/node_modules/@comis/memory/dist/memory-api.test.js +0 -495
  222. package/node_modules/@comis/memory/dist/memory-concurrency.test.d.ts +0 -20
  223. package/node_modules/@comis/memory/dist/memory-concurrency.test.js +0 -222
  224. package/node_modules/@comis/memory/dist/named-graph-store.test.d.ts +0 -1
  225. package/node_modules/@comis/memory/dist/named-graph-store.test.js +0 -227
  226. package/node_modules/@comis/memory/dist/observability-store.test.d.ts +0 -1
  227. package/node_modules/@comis/memory/dist/observability-store.test.js +0 -704
  228. package/node_modules/@comis/memory/dist/row-mapper.test.d.ts +0 -1
  229. package/node_modules/@comis/memory/dist/row-mapper.test.js +0 -409
  230. package/node_modules/@comis/memory/dist/schema.test.d.ts +0 -1
  231. package/node_modules/@comis/memory/dist/schema.test.js +0 -240
  232. package/node_modules/@comis/memory/dist/secret-store-schema.test.d.ts +0 -7
  233. package/node_modules/@comis/memory/dist/secret-store-schema.test.js +0 -90
  234. package/node_modules/@comis/memory/dist/session-store.test.d.ts +0 -1
  235. package/node_modules/@comis/memory/dist/session-store.test.js +0 -262
  236. package/node_modules/@comis/memory/dist/setup-secrets.test.d.ts +0 -1
  237. package/node_modules/@comis/memory/dist/setup-secrets.test.js +0 -140
  238. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.d.ts +0 -1
  239. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.js +0 -888
  240. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.d.ts +0 -8
  241. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.js +0 -245
  242. package/node_modules/@comis/shared/dist/abort.test.d.ts +0 -1
  243. package/node_modules/@comis/shared/dist/abort.test.js +0 -71
  244. package/node_modules/@comis/shared/dist/result.test.d.ts +0 -1
  245. package/node_modules/@comis/shared/dist/result.test.js +0 -178
  246. package/node_modules/@comis/shared/dist/suppress-error.test.d.ts +0 -1
  247. package/node_modules/@comis/shared/dist/suppress-error.test.js +0 -50
  248. package/node_modules/@comis/shared/dist/timeout.test.d.ts +0 -1
  249. package/node_modules/@comis/shared/dist/timeout.test.js +0 -75
  250. package/node_modules/@comis/shared/dist/ttl-cache.test.d.ts +0 -1
  251. package/node_modules/@comis/shared/dist/ttl-cache.test.js +0 -81
@@ -1,60 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { SenderTrustDisplayConfigSchema } from "./schema-sender-trust-display.js";
3
- describe("SenderTrustDisplayConfigSchema", () => {
4
- it("produces valid defaults from empty object", () => {
5
- const result = SenderTrustDisplayConfigSchema.safeParse({});
6
- expect(result.success).toBe(true);
7
- if (result.success) {
8
- expect(result.data.enabled).toBe(false);
9
- expect(result.data.displayMode).toBe("hash");
10
- expect(result.data.hashPrefix).toBe(8);
11
- expect(result.data.hashSecretRef).toBe("");
12
- expect(result.data.aliases).toEqual({});
13
- }
14
- });
15
- it("accepts fully specified config", () => {
16
- const result = SenderTrustDisplayConfigSchema.safeParse({
17
- enabled: true,
18
- displayMode: "alias",
19
- hashPrefix: 12,
20
- hashSecretRef: "secrets/hmac-key",
21
- aliases: {
22
- "user-123": "Alice",
23
- "user-456": "Bob",
24
- },
25
- });
26
- expect(result.success).toBe(true);
27
- if (result.success) {
28
- expect(result.data.enabled).toBe(true);
29
- expect(result.data.displayMode).toBe("alias");
30
- expect(result.data.hashPrefix).toBe(12);
31
- expect(result.data.hashSecretRef).toBe("secrets/hmac-key");
32
- expect(result.data.aliases["user-123"]).toBe("Alice");
33
- }
34
- });
35
- it("rejects unknown keys (strictObject)", () => {
36
- const result = SenderTrustDisplayConfigSchema.safeParse({
37
- enabled: true,
38
- unknownField: "should-fail",
39
- });
40
- expect(result.success).toBe(false);
41
- });
42
- it("rejects invalid displayMode enum value", () => {
43
- const result = SenderTrustDisplayConfigSchema.safeParse({
44
- displayMode: "obfuscated",
45
- });
46
- expect(result.success).toBe(false);
47
- });
48
- it("rejects hashPrefix below minimum (4)", () => {
49
- const result = SenderTrustDisplayConfigSchema.safeParse({
50
- hashPrefix: 3,
51
- });
52
- expect(result.success).toBe(false);
53
- });
54
- it("rejects hashPrefix above maximum (16)", () => {
55
- const result = SenderTrustDisplayConfigSchema.safeParse({
56
- hashPrefix: 17,
57
- });
58
- expect(result.success).toBe(false);
59
- });
60
- });
@@ -1,73 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { getConfigSchema, getConfigSections } from "./schema-serializer.js";
3
- describe("getConfigSchema", () => {
4
- it("returns full schema with type property", () => {
5
- const schema = getConfigSchema();
6
- expect(schema).toBeDefined();
7
- expect(typeof schema).toBe("object");
8
- // JSON Schema always has a type or definitions at the top level
9
- expect(schema).toHaveProperty("type");
10
- });
11
- it("caches the full schema (same reference on second call)", () => {
12
- const first = getConfigSchema();
13
- const second = getConfigSchema();
14
- expect(first).toBe(second);
15
- });
16
- it("returns section-specific schema for agents", () => {
17
- const schema = getConfigSchema("agents");
18
- expect(schema).toBeDefined();
19
- expect(typeof schema).toBe("object");
20
- expect(schema).toHaveProperty("type");
21
- });
22
- it("returns section-specific schema for gateway", () => {
23
- const schema = getConfigSchema("gateway");
24
- expect(schema).toBeDefined();
25
- expect(typeof schema).toBe("object");
26
- expect(schema).toHaveProperty("type");
27
- });
28
- it("throws for unknown section name", () => {
29
- expect(() => getConfigSchema("unknown_section")).toThrow("Unknown config section: unknown_section");
30
- });
31
- it("throws for empty string section", () => {
32
- expect(() => getConfigSchema("")).toThrow("Unknown config section: ");
33
- });
34
- it("getConfigSchema('agents') returns JSON Schema for per-agent config", () => {
35
- const schema = getConfigSchema("agents");
36
- expect(schema).toHaveProperty("type");
37
- // PerAgentConfigSchema is an object type with agent properties
38
- expect(schema.type).toBe("object");
39
- const sections = getConfigSections();
40
- expect(sections).toContain("agents");
41
- });
42
- });
43
- describe("getConfigSections", () => {
44
- it("returns an array of section names", () => {
45
- const sections = getConfigSections();
46
- expect(Array.isArray(sections)).toBe(true);
47
- expect(sections.length).toBeGreaterThan(0);
48
- });
49
- it("contains agents, security, and gateway", () => {
50
- const sections = getConfigSections();
51
- expect(sections).toContain("agents");
52
- expect(sections).toContain("security");
53
- expect(sections).toContain("gateway");
54
- });
55
- it("contains all 15 sections", () => {
56
- const sections = getConfigSections();
57
- expect(sections).toHaveLength(15);
58
- expect(sections).toContain("agents");
59
- expect(sections).toContain("channels");
60
- expect(sections).toContain("memory");
61
- expect(sections).toContain("routing");
62
- expect(sections).toContain("daemon");
63
- expect(sections).toContain("scheduler");
64
- expect(sections).toContain("integrations");
65
- expect(sections).toContain("monitoring");
66
- // CFG-07: New config sections
67
- expect(sections).toContain("browser");
68
- expect(sections).toContain("models");
69
- expect(sections).toContain("providers");
70
- expect(sections).toContain("messages");
71
- expect(sections).toContain("approvals");
72
- });
73
- });
@@ -1,39 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { TelegramFileRefGuardConfigSchema } from "./schema-telegram-file-guard.js";
3
- describe("TelegramFileRefGuardConfigSchema", () => {
4
- it("produces valid defaults from empty object", () => {
5
- const result = TelegramFileRefGuardConfigSchema.safeParse({});
6
- expect(result.success).toBe(true);
7
- if (result.success) {
8
- expect(result.data.enabled).toBe(true);
9
- expect(result.data.additionalExtensions).toEqual([]);
10
- expect(result.data.excludedExtensions).toEqual([]);
11
- }
12
- });
13
- it("accepts fully specified config", () => {
14
- const result = TelegramFileRefGuardConfigSchema.safeParse({
15
- enabled: false,
16
- additionalExtensions: [".docx", ".xlsx"],
17
- excludedExtensions: [".txt"],
18
- });
19
- expect(result.success).toBe(true);
20
- if (result.success) {
21
- expect(result.data.enabled).toBe(false);
22
- expect(result.data.additionalExtensions).toEqual([".docx", ".xlsx"]);
23
- expect(result.data.excludedExtensions).toEqual([".txt"]);
24
- }
25
- });
26
- it("rejects unknown keys (strictObject)", () => {
27
- const result = TelegramFileRefGuardConfigSchema.safeParse({
28
- enabled: true,
29
- unknownField: "should-fail",
30
- });
31
- expect(result.success).toBe(false);
32
- });
33
- it("rejects non-array additionalExtensions", () => {
34
- const result = TelegramFileRefGuardConfigSchema.safeParse({
35
- additionalExtensions: ".docx",
36
- });
37
- expect(result.success).toBe(false);
38
- });
39
- });
@@ -1,276 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { describe, it, expect } from "vitest";
3
- import { RequestContextSchema, getContext, tryGetContext, runWithContext } from "./context.js";
4
- function makeContext(overrides = {}) {
5
- return {
6
- tenantId: "tenant-1",
7
- userId: "user-1",
8
- sessionKey: "tenant-1:user-1:chan-1",
9
- traceId: randomUUID(),
10
- startedAt: Date.now(),
11
- trustLevel: "user",
12
- ...overrides,
13
- };
14
- }
15
- describe("RequestContext", () => {
16
- describe("runWithContext + getContext", () => {
17
- it("returns context within scope", () => {
18
- const ctx = makeContext();
19
- const result = runWithContext(ctx, () => getContext());
20
- expect(result).toEqual(ctx);
21
- });
22
- it("returns the exact same context object", () => {
23
- const ctx = makeContext();
24
- runWithContext(ctx, () => {
25
- const retrieved = getContext();
26
- expect(retrieved).toBe(ctx);
27
- });
28
- });
29
- });
30
- describe("getContext outside scope", () => {
31
- it("throws descriptive error", () => {
32
- expect(() => getContext()).toThrow("getContext() called outside of a request context scope");
33
- });
34
- it("error message mentions runWithContext", () => {
35
- expect(() => getContext()).toThrow("runWithContext()");
36
- });
37
- it("error message mentions tryGetContext alternative", () => {
38
- expect(() => getContext()).toThrow("tryGetContext()");
39
- });
40
- });
41
- describe("tryGetContext", () => {
42
- it("returns undefined outside scope", () => {
43
- expect(tryGetContext()).toBeUndefined();
44
- });
45
- it("returns context within scope", () => {
46
- const ctx = makeContext();
47
- runWithContext(ctx, () => {
48
- expect(tryGetContext()).toEqual(ctx);
49
- });
50
- });
51
- });
52
- describe("async propagation", () => {
53
- it("context propagates through async/await", async () => {
54
- const ctx = makeContext();
55
- const result = await runWithContext(ctx, async () => {
56
- // Simulate async work
57
- await new Promise((resolve) => setTimeout(resolve, 10));
58
- return getContext();
59
- });
60
- expect(result).toEqual(ctx);
61
- });
62
- it("context propagates through multiple async hops", async () => {
63
- const ctx = makeContext();
64
- async function innerAsync() {
65
- await new Promise((resolve) => setTimeout(resolve, 5));
66
- return getContext();
67
- }
68
- const result = await runWithContext(ctx, async () => {
69
- await new Promise((resolve) => setTimeout(resolve, 5));
70
- return innerAsync();
71
- });
72
- expect(result.traceId).toBe(ctx.traceId);
73
- });
74
- });
75
- describe("nested scopes", () => {
76
- it("nested runWithContext creates independent scopes", () => {
77
- const outerCtx = makeContext({ tenantId: "outer" });
78
- const innerCtx = makeContext({ tenantId: "inner" });
79
- runWithContext(outerCtx, () => {
80
- expect(getContext().tenantId).toBe("outer");
81
- runWithContext(innerCtx, () => {
82
- expect(getContext().tenantId).toBe("inner");
83
- });
84
- // Outer context restored after inner scope exits
85
- expect(getContext().tenantId).toBe("outer");
86
- });
87
- });
88
- });
89
- describe("concurrent isolation", () => {
90
- it("concurrent contexts maintain isolation via Promise.all", async () => {
91
- const ctx1 = makeContext({ tenantId: "tenant-A", userId: "user-A" });
92
- const ctx2 = makeContext({ tenantId: "tenant-B", userId: "user-B" });
93
- const ctx3 = makeContext({ tenantId: "tenant-C", userId: "user-C" });
94
- const [result1, result2, result3] = await Promise.all([
95
- runWithContext(ctx1, async () => {
96
- await new Promise((resolve) => setTimeout(resolve, 15));
97
- return getContext().tenantId;
98
- }),
99
- runWithContext(ctx2, async () => {
100
- await new Promise((resolve) => setTimeout(resolve, 10));
101
- return getContext().tenantId;
102
- }),
103
- runWithContext(ctx3, async () => {
104
- await new Promise((resolve) => setTimeout(resolve, 5));
105
- return getContext().tenantId;
106
- }),
107
- ]);
108
- expect(result1).toBe("tenant-A");
109
- expect(result2).toBe("tenant-B");
110
- expect(result3).toBe("tenant-C");
111
- });
112
- });
113
- describe("RequestContextSchema", () => {
114
- it("validates correct context", () => {
115
- const result = RequestContextSchema.safeParse({
116
- userId: "user-1",
117
- sessionKey: "default:user-1:chan-1",
118
- traceId: randomUUID(),
119
- startedAt: Date.now(),
120
- });
121
- expect(result.success).toBe(true);
122
- });
123
- it("tenantId defaults to 'default'", () => {
124
- const result = RequestContextSchema.parse({
125
- userId: "user-1",
126
- sessionKey: "default:user-1:chan-1",
127
- traceId: randomUUID(),
128
- startedAt: Date.now(),
129
- });
130
- expect(result.tenantId).toBe("default");
131
- });
132
- it("rejects missing required fields", () => {
133
- const result = RequestContextSchema.safeParse({
134
- tenantId: "t1",
135
- });
136
- expect(result.success).toBe(false);
137
- });
138
- it("rejects invalid traceId format", () => {
139
- const result = RequestContextSchema.safeParse({
140
- tenantId: "t1",
141
- userId: "u1",
142
- sessionKey: "t1:u1:c1",
143
- traceId: "not-a-uuid",
144
- startedAt: Date.now(),
145
- });
146
- expect(result.success).toBe(false);
147
- });
148
- it("rejects unknown fields (strict mode)", () => {
149
- const result = RequestContextSchema.safeParse({
150
- tenantId: "t1",
151
- userId: "u1",
152
- sessionKey: "t1:u1:c1",
153
- traceId: randomUUID(),
154
- startedAt: Date.now(),
155
- extraField: "should-fail",
156
- });
157
- expect(result.success).toBe(false);
158
- });
159
- });
160
- describe("trustLevel", () => {
161
- it("trustLevel defaults to 'admin'", () => {
162
- const result = RequestContextSchema.parse({
163
- userId: "user-1",
164
- sessionKey: "default:user-1:chan-1",
165
- traceId: randomUUID(),
166
- startedAt: Date.now(),
167
- });
168
- expect(result.trustLevel).toBe("admin");
169
- });
170
- it("accepts admin trustLevel", () => {
171
- const result = RequestContextSchema.safeParse({
172
- userId: "user-1",
173
- sessionKey: "default:user-1:chan-1",
174
- traceId: randomUUID(),
175
- startedAt: Date.now(),
176
- trustLevel: "admin",
177
- });
178
- expect(result.success).toBe(true);
179
- if (result.success) {
180
- expect(result.data.trustLevel).toBe("admin");
181
- }
182
- });
183
- it("accepts guest trustLevel", () => {
184
- const result = RequestContextSchema.safeParse({
185
- userId: "user-1",
186
- sessionKey: "default:user-1:chan-1",
187
- traceId: randomUUID(),
188
- startedAt: Date.now(),
189
- trustLevel: "guest",
190
- });
191
- expect(result.success).toBe(true);
192
- if (result.success) {
193
- expect(result.data.trustLevel).toBe("guest");
194
- }
195
- });
196
- it("rejects invalid trustLevel", () => {
197
- const result = RequestContextSchema.safeParse({
198
- userId: "user-1",
199
- sessionKey: "default:user-1:chan-1",
200
- traceId: randomUUID(),
201
- startedAt: Date.now(),
202
- trustLevel: "superadmin",
203
- });
204
- expect(result.success).toBe(false);
205
- });
206
- });
207
- describe("contentDelimiter", () => {
208
- it("accepts optional contentDelimiter field", () => {
209
- const result = RequestContextSchema.safeParse({
210
- userId: "user-1",
211
- sessionKey: "default:user-1:chan-1",
212
- traceId: randomUUID(),
213
- startedAt: Date.now(),
214
- contentDelimiter: "abcdef0123456789abcdef01",
215
- });
216
- expect(result.success).toBe(true);
217
- if (result.success) {
218
- expect(result.data.contentDelimiter).toBe("abcdef0123456789abcdef01");
219
- }
220
- });
221
- it("context without contentDelimiter still parses (backward compat)", () => {
222
- const result = RequestContextSchema.safeParse({
223
- userId: "user-1",
224
- sessionKey: "default:user-1:chan-1",
225
- traceId: randomUUID(),
226
- startedAt: Date.now(),
227
- });
228
- expect(result.success).toBe(true);
229
- if (result.success) {
230
- expect(result.data.contentDelimiter).toBeUndefined();
231
- }
232
- });
233
- it("rejects contentDelimiter shorter than 16 chars", () => {
234
- const result = RequestContextSchema.safeParse({
235
- userId: "user-1",
236
- sessionKey: "default:user-1:chan-1",
237
- traceId: randomUUID(),
238
- startedAt: Date.now(),
239
- contentDelimiter: "short",
240
- });
241
- expect(result.success).toBe(false);
242
- });
243
- });
244
- describe("channelType", () => {
245
- it("accepts optional channelType field", () => {
246
- const result = RequestContextSchema.safeParse({
247
- userId: "user-1",
248
- sessionKey: "default:user-1:chan-1",
249
- traceId: randomUUID(),
250
- startedAt: Date.now(),
251
- channelType: "telegram",
252
- });
253
- expect(result.success).toBe(true);
254
- if (result.success) {
255
- expect(result.data.channelType).toBe("telegram");
256
- }
257
- });
258
- it("context without channelType still parses (backward compat)", () => {
259
- const result = RequestContextSchema.safeParse({
260
- userId: "user-1",
261
- sessionKey: "default:user-1:chan-1",
262
- traceId: randomUUID(),
263
- startedAt: Date.now(),
264
- });
265
- expect(result.success).toBe(true);
266
- if (result.success) {
267
- expect(result.data.channelType).toBeUndefined();
268
- }
269
- });
270
- it("channelType propagates through runWithContext", () => {
271
- const ctx = makeContext({ channelType: "discord" });
272
- const result = runWithContext(ctx, () => getContext());
273
- expect(result.channelType).toBe("discord");
274
- });
275
- });
276
- });
@@ -1,159 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { parseAgentResponse } from "./agent-response.js";
3
- function validResponse(overrides = {}) {
4
- return {
5
- agentId: "main-agent",
6
- content: "Here is my response.",
7
- ...overrides,
8
- };
9
- }
10
- describe("AgentResponse", () => {
11
- describe("valid data", () => {
12
- it("parses a minimal valid response", () => {
13
- const result = parseAgentResponse(validResponse());
14
- expect(result.ok).toBe(true);
15
- if (result.ok) {
16
- expect(result.value.agentId).toBe("main-agent");
17
- expect(result.value.content).toBe("Here is my response.");
18
- }
19
- });
20
- it("applies default values for toolCalls, finishReason, metadata", () => {
21
- const result = parseAgentResponse(validResponse());
22
- expect(result.ok).toBe(true);
23
- if (result.ok) {
24
- expect(result.value.toolCalls).toEqual([]);
25
- expect(result.value.finishReason).toBe("stop");
26
- expect(result.value.metadata).toEqual({});
27
- }
28
- });
29
- it("accepts empty content (agent may return only tool calls)", () => {
30
- const result = parseAgentResponse(validResponse({ content: "" }));
31
- expect(result.ok).toBe(true);
32
- if (result.ok) {
33
- expect(result.value.content).toBe("");
34
- }
35
- });
36
- it("accepts all finish reasons", () => {
37
- const reasons = ["stop", "max_tokens", "tool_use", "error", "budget_exceeded"];
38
- for (const finishReason of reasons) {
39
- const result = parseAgentResponse(validResponse({ finishReason }));
40
- expect(result.ok).toBe(true);
41
- }
42
- });
43
- it("accepts tool calls array", () => {
44
- const result = parseAgentResponse(validResponse({
45
- toolCalls: [
46
- { id: "tc-1", name: "search", input: { query: "test" } },
47
- { id: "tc-2", name: "read_file", input: { path: "/tmp/a.txt" } },
48
- ],
49
- }));
50
- expect(result.ok).toBe(true);
51
- if (result.ok) {
52
- expect(result.value.toolCalls).toHaveLength(2);
53
- expect(result.value.toolCalls[0].name).toBe("search");
54
- }
55
- });
56
- it("accepts tokensUsed when provided", () => {
57
- const result = parseAgentResponse(validResponse({
58
- tokensUsed: {
59
- prompt: 100,
60
- completion: 50,
61
- provider: "anthropic",
62
- model: "claude-opus-4-20250514",
63
- },
64
- }));
65
- expect(result.ok).toBe(true);
66
- if (result.ok) {
67
- expect(result.value.tokensUsed?.prompt).toBe(100);
68
- expect(result.value.tokensUsed?.provider).toBe("anthropic");
69
- }
70
- });
71
- it("allows omitting optional tokensUsed", () => {
72
- const result = parseAgentResponse(validResponse());
73
- expect(result.ok).toBe(true);
74
- if (result.ok) {
75
- expect(result.value.tokensUsed).toBeUndefined();
76
- }
77
- });
78
- it("accepts metadata with arbitrary values", () => {
79
- const result = parseAgentResponse(validResponse({
80
- metadata: { latencyMs: 234, cached: false },
81
- }));
82
- expect(result.ok).toBe(true);
83
- if (result.ok) {
84
- expect(result.value.metadata).toEqual({
85
- latencyMs: 234,
86
- cached: false,
87
- });
88
- }
89
- });
90
- });
91
- describe("invalid data", () => {
92
- it("rejects missing required fields", () => {
93
- const result = parseAgentResponse({});
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("agentId");
98
- expect(paths).toContain("content");
99
- }
100
- });
101
- it("rejects empty agentId", () => {
102
- const result = parseAgentResponse(validResponse({ agentId: "" }));
103
- expect(result.ok).toBe(false);
104
- });
105
- it("rejects invalid finishReason", () => {
106
- const result = parseAgentResponse(validResponse({ finishReason: "cancelled" }));
107
- expect(result.ok).toBe(false);
108
- });
109
- it("rejects invalid tool call shape", () => {
110
- const result = parseAgentResponse(validResponse({ toolCalls: [{ bad: "shape" }] }));
111
- expect(result.ok).toBe(false);
112
- });
113
- it("rejects tool call with empty id", () => {
114
- const result = parseAgentResponse(validResponse({
115
- toolCalls: [{ id: "", name: "search", input: {} }],
116
- }));
117
- expect(result.ok).toBe(false);
118
- });
119
- it("rejects tool call with empty name", () => {
120
- const result = parseAgentResponse(validResponse({
121
- toolCalls: [{ id: "tc-1", name: "", input: {} }],
122
- }));
123
- expect(result.ok).toBe(false);
124
- });
125
- it("rejects invalid tokensUsed shape", () => {
126
- const result = parseAgentResponse(validResponse({ tokensUsed: { prompt: "not a number" } }));
127
- expect(result.ok).toBe(false);
128
- });
129
- it("rejects negative token counts", () => {
130
- const result = parseAgentResponse(validResponse({
131
- tokensUsed: {
132
- prompt: -1,
133
- completion: 50,
134
- provider: "openai",
135
- model: "gpt-4",
136
- },
137
- }));
138
- expect(result.ok).toBe(false);
139
- });
140
- it("strips extra/unknown fields", () => {
141
- const result = parseAgentResponse(validResponse({ unknownField: "surprise" }));
142
- expect(result.ok).toBe(false);
143
- });
144
- it("rejects non-object input", () => {
145
- const result = parseAgentResponse(42);
146
- expect(result.ok).toBe(false);
147
- });
148
- it("returns descriptive ZodError issues", () => {
149
- const result = parseAgentResponse({ agentId: 123 });
150
- expect(result.ok).toBe(false);
151
- if (!result.ok) {
152
- expect(result.error.issues.length).toBeGreaterThan(0);
153
- for (const issue of result.error.issues) {
154
- expect(issue.message).toBeTruthy();
155
- }
156
- }
157
- });
158
- });
159
- });