comisai 1.0.11 → 1.0.13

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 (255) hide show
  1. package/node_modules/@comis/agent/dist/model/operation-model-defaults.js +1 -0
  2. package/node_modules/@comis/agent/dist/session/comis-session-manager.js +9 -9
  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/package.json +1 -1
  6. package/node_modules/@comis/core/dist/event-bus/events-infra.d.ts +2 -0
  7. package/node_modules/@comis/core/package.json +1 -1
  8. package/node_modules/@comis/daemon/dist/wiring/setup-channels.js +12 -1
  9. package/node_modules/@comis/daemon/dist/wiring/setup-gateway.js +1 -0
  10. package/node_modules/@comis/daemon/dist/wiring/setup-schedulers.js +1 -0
  11. package/node_modules/@comis/daemon/package.json +1 -1
  12. package/node_modules/@comis/gateway/package.json +1 -1
  13. package/node_modules/@comis/infra/package.json +1 -1
  14. package/node_modules/@comis/memory/package.json +1 -1
  15. package/node_modules/@comis/scheduler/dist/cron/cron-types.d.ts +6 -0
  16. package/node_modules/@comis/scheduler/dist/cron/cron-types.js +2 -0
  17. package/node_modules/@comis/scheduler/package.json +1 -1
  18. package/node_modules/@comis/shared/package.json +1 -1
  19. package/node_modules/@comis/skills/dist/builtin/platform/gateway-tool.d.ts +1 -1
  20. package/node_modules/@comis/skills/package.json +1 -1
  21. package/package.json +18 -18
  22. package/node_modules/@comis/core/dist/approval/approval-gate.test.d.ts +0 -1
  23. package/node_modules/@comis/core/dist/approval/approval-gate.test.js +0 -1003
  24. package/node_modules/@comis/core/dist/bootstrap.test.d.ts +0 -1
  25. package/node_modules/@comis/core/dist/bootstrap.test.js +0 -150
  26. package/node_modules/@comis/core/dist/config/backup.test.d.ts +0 -1
  27. package/node_modules/@comis/core/dist/config/backup.test.js +0 -160
  28. package/node_modules/@comis/core/dist/config/env-substitution.test.d.ts +0 -1
  29. package/node_modules/@comis/core/dist/config/env-substitution.test.js +0 -259
  30. package/node_modules/@comis/core/dist/config/field-metadata.test.d.ts +0 -1
  31. package/node_modules/@comis/core/dist/config/field-metadata.test.js +0 -72
  32. package/node_modules/@comis/core/dist/config/git-manager.test.d.ts +0 -1
  33. package/node_modules/@comis/core/dist/config/git-manager.test.js +0 -1042
  34. package/node_modules/@comis/core/dist/config/immutable-keys.test.d.ts +0 -1
  35. package/node_modules/@comis/core/dist/config/immutable-keys.test.js +0 -283
  36. package/node_modules/@comis/core/dist/config/include-resolver.test.d.ts +0 -1
  37. package/node_modules/@comis/core/dist/config/include-resolver.test.js +0 -292
  38. package/node_modules/@comis/core/dist/config/layered.test.d.ts +0 -1
  39. package/node_modules/@comis/core/dist/config/layered.test.js +0 -211
  40. package/node_modules/@comis/core/dist/config/loader.test.d.ts +0 -1
  41. package/node_modules/@comis/core/dist/config/loader.test.js +0 -300
  42. package/node_modules/@comis/core/dist/config/migrate.test.d.ts +0 -1
  43. package/node_modules/@comis/core/dist/config/migrate.test.js +0 -244
  44. package/node_modules/@comis/core/dist/config/partial-validator.test.d.ts +0 -1
  45. package/node_modules/@comis/core/dist/config/partial-validator.test.js +0 -98
  46. package/node_modules/@comis/core/dist/config/schema-agent-model.test.d.ts +0 -1
  47. package/node_modules/@comis/core/dist/config/schema-agent-model.test.js +0 -279
  48. package/node_modules/@comis/core/dist/config/schema-agent-session.test.d.ts +0 -1
  49. package/node_modules/@comis/core/dist/config/schema-agent-session.test.js +0 -242
  50. package/node_modules/@comis/core/dist/config/schema-agent.test.d.ts +0 -1
  51. package/node_modules/@comis/core/dist/config/schema-agent.test.js +0 -645
  52. package/node_modules/@comis/core/dist/config/schema-channel.test.d.ts +0 -1
  53. package/node_modules/@comis/core/dist/config/schema-channel.test.js +0 -341
  54. package/node_modules/@comis/core/dist/config/schema-coalescer.test.d.ts +0 -1
  55. package/node_modules/@comis/core/dist/config/schema-coalescer.test.js +0 -51
  56. package/node_modules/@comis/core/dist/config/schema-context-engine.test.d.ts +0 -1
  57. package/node_modules/@comis/core/dist/config/schema-context-engine.test.js +0 -797
  58. package/node_modules/@comis/core/dist/config/schema-context-guard.test.d.ts +0 -1
  59. package/node_modules/@comis/core/dist/config/schema-context-guard.test.js +0 -111
  60. package/node_modules/@comis/core/dist/config/schema-daemon.test.d.ts +0 -1
  61. package/node_modules/@comis/core/dist/config/schema-daemon.test.js +0 -107
  62. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.d.ts +0 -1
  63. package/node_modules/@comis/core/dist/config/schema-delivery-timing.test.js +0 -51
  64. package/node_modules/@comis/core/dist/config/schema-documentation.test.d.ts +0 -1
  65. package/node_modules/@comis/core/dist/config/schema-documentation.test.js +0 -63
  66. package/node_modules/@comis/core/dist/config/schema-gateway.test.d.ts +0 -1
  67. package/node_modules/@comis/core/dist/config/schema-gateway.test.js +0 -219
  68. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.d.ts +0 -1
  69. package/node_modules/@comis/core/dist/config/schema-gemini-cache.test.js +0 -41
  70. package/node_modules/@comis/core/dist/config/schema-integrations.test.d.ts +0 -1
  71. package/node_modules/@comis/core/dist/config/schema-integrations.test.js +0 -92
  72. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.d.ts +0 -1
  73. package/node_modules/@comis/core/dist/config/schema-lifecycle-reactions.test.js +0 -61
  74. package/node_modules/@comis/core/dist/config/schema-misc.test.d.ts +0 -1
  75. package/node_modules/@comis/core/dist/config/schema-misc.test.js +0 -394
  76. package/node_modules/@comis/core/dist/config/schema-observability.test.d.ts +0 -1
  77. package/node_modules/@comis/core/dist/config/schema-observability.test.js +0 -76
  78. package/node_modules/@comis/core/dist/config/schema-providers.test.d.ts +0 -1
  79. package/node_modules/@comis/core/dist/config/schema-providers.test.js +0 -294
  80. package/node_modules/@comis/core/dist/config/schema-queue.test.d.ts +0 -1
  81. package/node_modules/@comis/core/dist/config/schema-queue.test.js +0 -234
  82. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.d.ts +0 -1
  83. package/node_modules/@comis/core/dist/config/schema-response-prefix.test.js +0 -36
  84. package/node_modules/@comis/core/dist/config/schema-security.test.d.ts +0 -1
  85. package/node_modules/@comis/core/dist/config/schema-security.test.js +0 -54
  86. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.d.ts +0 -1
  87. package/node_modules/@comis/core/dist/config/schema-sender-trust-display.test.js +0 -60
  88. package/node_modules/@comis/core/dist/config/schema-serializer.test.d.ts +0 -1
  89. package/node_modules/@comis/core/dist/config/schema-serializer.test.js +0 -73
  90. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.d.ts +0 -1
  91. package/node_modules/@comis/core/dist/config/schema-telegram-file-guard.test.js +0 -39
  92. package/node_modules/@comis/core/dist/context/context.test.d.ts +0 -1
  93. package/node_modules/@comis/core/dist/context/context.test.js +0 -276
  94. package/node_modules/@comis/core/dist/domain/agent-response.test.d.ts +0 -1
  95. package/node_modules/@comis/core/dist/domain/agent-response.test.js +0 -159
  96. package/node_modules/@comis/core/dist/domain/credential-mapping.test.d.ts +0 -1
  97. package/node_modules/@comis/core/dist/domain/credential-mapping.test.js +0 -135
  98. package/node_modules/@comis/core/dist/domain/delivery-origin.test.d.ts +0 -1
  99. package/node_modules/@comis/core/dist/domain/delivery-origin.test.js +0 -68
  100. package/node_modules/@comis/core/dist/domain/execution-graph.test.d.ts +0 -1
  101. package/node_modules/@comis/core/dist/domain/execution-graph.test.js +0 -441
  102. package/node_modules/@comis/core/dist/domain/memory-entry.test.d.ts +0 -1
  103. package/node_modules/@comis/core/dist/domain/memory-entry.test.js +0 -193
  104. package/node_modules/@comis/core/dist/domain/normalized-message.test.d.ts +0 -1
  105. package/node_modules/@comis/core/dist/domain/normalized-message.test.js +0 -255
  106. package/node_modules/@comis/core/dist/domain/session-key.test.d.ts +0 -1
  107. package/node_modules/@comis/core/dist/domain/session-key.test.js +0 -291
  108. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.d.ts +0 -1
  109. package/node_modules/@comis/core/dist/domain/subagent-context-config.test.js +0 -131
  110. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.d.ts +0 -1
  111. package/node_modules/@comis/core/dist/domain/subagent-context-types.test.js +0 -182
  112. package/node_modules/@comis/core/dist/event-bus/bus.test.d.ts +0 -1
  113. package/node_modules/@comis/core/dist/event-bus/bus.test.js +0 -152
  114. package/node_modules/@comis/core/dist/event-bus/events-agent.test.d.ts +0 -1
  115. package/node_modules/@comis/core/dist/event-bus/events-agent.test.js +0 -409
  116. package/node_modules/@comis/core/dist/event-bus/events-channel.test.d.ts +0 -1
  117. package/node_modules/@comis/core/dist/event-bus/events-channel.test.js +0 -240
  118. package/node_modules/@comis/core/dist/event-bus/events-infra.test.d.ts +0 -1
  119. package/node_modules/@comis/core/dist/event-bus/events-infra.test.js +0 -416
  120. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.d.ts +0 -1
  121. package/node_modules/@comis/core/dist/event-bus/events-messaging.test.js +0 -433
  122. package/node_modules/@comis/core/dist/event-bus/events.test.d.ts +0 -1
  123. package/node_modules/@comis/core/dist/event-bus/events.test.js +0 -93
  124. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.d.ts +0 -1
  125. package/node_modules/@comis/core/dist/hooks/hook-runner-global.test.js +0 -29
  126. package/node_modules/@comis/core/dist/hooks/hook-runner.test.d.ts +0 -1
  127. package/node_modules/@comis/core/dist/hooks/hook-runner.test.js +0 -490
  128. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.d.ts +0 -1
  129. package/node_modules/@comis/core/dist/hooks/hook-strategies.test.js +0 -209
  130. package/node_modules/@comis/core/dist/hooks/integration.test.d.ts +0 -1
  131. package/node_modules/@comis/core/dist/hooks/integration.test.js +0 -235
  132. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.d.ts +0 -1
  133. package/node_modules/@comis/core/dist/hooks/plugin-registry.test.js +0 -470
  134. package/node_modules/@comis/core/dist/load-env.test.d.ts +0 -1
  135. package/node_modules/@comis/core/dist/load-env.test.js +0 -21
  136. package/node_modules/@comis/core/dist/security/action-classifier.test.d.ts +0 -1
  137. package/node_modules/@comis/core/dist/security/action-classifier.test.js +0 -298
  138. package/node_modules/@comis/core/dist/security/audit-aggregator.test.d.ts +0 -1
  139. package/node_modules/@comis/core/dist/security/audit-aggregator.test.js +0 -128
  140. package/node_modules/@comis/core/dist/security/audit.test.d.ts +0 -1
  141. package/node_modules/@comis/core/dist/security/audit.test.js +0 -154
  142. package/node_modules/@comis/core/dist/security/canary-token.test.d.ts +0 -1
  143. package/node_modules/@comis/core/dist/security/canary-token.test.js +0 -45
  144. package/node_modules/@comis/core/dist/security/config-redaction.test.d.ts +0 -1
  145. package/node_modules/@comis/core/dist/security/config-redaction.test.js +0 -107
  146. package/node_modules/@comis/core/dist/security/external-content.test.d.ts +0 -1
  147. package/node_modules/@comis/core/dist/security/external-content.test.js +0 -210
  148. package/node_modules/@comis/core/dist/security/injection-patterns.test.d.ts +0 -1
  149. package/node_modules/@comis/core/dist/security/injection-patterns.test.js +0 -213
  150. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.d.ts +0 -1
  151. package/node_modules/@comis/core/dist/security/injection-rate-limiter.test.js +0 -194
  152. package/node_modules/@comis/core/dist/security/input-guard.test.d.ts +0 -1
  153. package/node_modules/@comis/core/dist/security/input-guard.test.js +0 -215
  154. package/node_modules/@comis/core/dist/security/input-security-guard.test.d.ts +0 -1
  155. package/node_modules/@comis/core/dist/security/input-security-guard.test.js +0 -215
  156. package/node_modules/@comis/core/dist/security/input-validator.test.d.ts +0 -1
  157. package/node_modules/@comis/core/dist/security/input-validator.test.js +0 -133
  158. package/node_modules/@comis/core/dist/security/log-sanitizer.test.d.ts +0 -1
  159. package/node_modules/@comis/core/dist/security/log-sanitizer.test.js +0 -260
  160. package/node_modules/@comis/core/dist/security/memory-write-validator.test.d.ts +0 -1
  161. package/node_modules/@comis/core/dist/security/memory-write-validator.test.js +0 -62
  162. package/node_modules/@comis/core/dist/security/output-guard.test.d.ts +0 -1
  163. package/node_modules/@comis/core/dist/security/output-guard.test.js +0 -397
  164. package/node_modules/@comis/core/dist/security/safe-path.test.d.ts +0 -1
  165. package/node_modules/@comis/core/dist/security/safe-path.test.js +0 -95
  166. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.d.ts +0 -1
  167. package/node_modules/@comis/core/dist/security/scoped-secret-manager.test.js +0 -231
  168. package/node_modules/@comis/core/dist/security/secret-access.test.d.ts +0 -1
  169. package/node_modules/@comis/core/dist/security/secret-access.test.js +0 -41
  170. package/node_modules/@comis/core/dist/security/secret-crypto.test.d.ts +0 -1
  171. package/node_modules/@comis/core/dist/security/secret-crypto.test.js +0 -113
  172. package/node_modules/@comis/core/dist/security/secret-manager.test.d.ts +0 -1
  173. package/node_modules/@comis/core/dist/security/secret-manager.test.js +0 -394
  174. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.d.ts +0 -1
  175. package/node_modules/@comis/core/dist/security/secret-ref-resolver.test.js +0 -268
  176. package/node_modules/@comis/core/dist/security/secrets-audit.test.d.ts +0 -10
  177. package/node_modules/@comis/core/dist/security/secrets-audit.test.js +0 -295
  178. package/node_modules/@comis/core/dist/security/ssrf-guard.test.d.ts +0 -1
  179. package/node_modules/@comis/core/dist/security/ssrf-guard.test.js +0 -127
  180. package/node_modules/@comis/core/dist/security/token-generator.test.d.ts +0 -1
  181. package/node_modules/@comis/core/dist/security/token-generator.test.js +0 -35
  182. package/node_modules/@comis/core/dist/tool-metadata.test.d.ts +0 -1
  183. package/node_modules/@comis/core/dist/tool-metadata.test.js +0 -112
  184. package/node_modules/@comis/memory/dist/compaction.test.d.ts +0 -1
  185. package/node_modules/@comis/memory/dist/compaction.test.js +0 -298
  186. package/node_modules/@comis/memory/dist/context-schema.test.d.ts +0 -1
  187. package/node_modules/@comis/memory/dist/context-schema.test.js +0 -246
  188. package/node_modules/@comis/memory/dist/context-store.test.d.ts +0 -1
  189. package/node_modules/@comis/memory/dist/context-store.test.js +0 -708
  190. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.d.ts +0 -7
  191. package/node_modules/@comis/memory/dist/credential-mapping-schema.test.js +0 -73
  192. package/node_modules/@comis/memory/dist/credential-mapping-store.test.d.ts +0 -8
  193. package/node_modules/@comis/memory/dist/credential-mapping-store.test.js +0 -340
  194. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.d.ts +0 -1
  195. package/node_modules/@comis/memory/dist/delivery-mirror-adapter.test.js +0 -165
  196. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.d.ts +0 -1
  197. package/node_modules/@comis/memory/dist/delivery-queue-adapter.test.js +0 -263
  198. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.d.ts +0 -1
  199. package/node_modules/@comis/memory/dist/embedding-batch-indexer.test.js +0 -202
  200. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.d.ts +0 -1
  201. package/node_modules/@comis/memory/dist/embedding-cache-lru.test.js +0 -241
  202. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.d.ts +0 -8
  203. package/node_modules/@comis/memory/dist/embedding-cache-sqlite.test.js +0 -678
  204. package/node_modules/@comis/memory/dist/embedding-cache.test.d.ts +0 -1
  205. package/node_modules/@comis/memory/dist/embedding-cache.test.js +0 -213
  206. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.d.ts +0 -1
  207. package/node_modules/@comis/memory/dist/embedding-fingerprint.test.js +0 -87
  208. package/node_modules/@comis/memory/dist/embedding-hash.test.d.ts +0 -1
  209. package/node_modules/@comis/memory/dist/embedding-hash.test.js +0 -31
  210. package/node_modules/@comis/memory/dist/embedding-integration.test.d.ts +0 -8
  211. package/node_modules/@comis/memory/dist/embedding-integration.test.js +0 -232
  212. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.d.ts +0 -1
  213. package/node_modules/@comis/memory/dist/embedding-provider-factory.test.js +0 -176
  214. package/node_modules/@comis/memory/dist/embedding-provider-local.test.d.ts +0 -8
  215. package/node_modules/@comis/memory/dist/embedding-provider-local.test.js +0 -76
  216. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.d.ts +0 -8
  217. package/node_modules/@comis/memory/dist/embedding-provider-openai.test.js +0 -100
  218. package/node_modules/@comis/memory/dist/embedding-queue.test.d.ts +0 -1
  219. package/node_modules/@comis/memory/dist/embedding-queue.test.js +0 -236
  220. package/node_modules/@comis/memory/dist/hybrid-search.test.d.ts +0 -1
  221. package/node_modules/@comis/memory/dist/hybrid-search.test.js +0 -476
  222. package/node_modules/@comis/memory/dist/identity-link-store.test.d.ts +0 -1
  223. package/node_modules/@comis/memory/dist/identity-link-store.test.js +0 -88
  224. package/node_modules/@comis/memory/dist/memory-api.test.d.ts +0 -1
  225. package/node_modules/@comis/memory/dist/memory-api.test.js +0 -495
  226. package/node_modules/@comis/memory/dist/memory-concurrency.test.d.ts +0 -20
  227. package/node_modules/@comis/memory/dist/memory-concurrency.test.js +0 -222
  228. package/node_modules/@comis/memory/dist/named-graph-store.test.d.ts +0 -1
  229. package/node_modules/@comis/memory/dist/named-graph-store.test.js +0 -227
  230. package/node_modules/@comis/memory/dist/observability-store.test.d.ts +0 -1
  231. package/node_modules/@comis/memory/dist/observability-store.test.js +0 -704
  232. package/node_modules/@comis/memory/dist/row-mapper.test.d.ts +0 -1
  233. package/node_modules/@comis/memory/dist/row-mapper.test.js +0 -409
  234. package/node_modules/@comis/memory/dist/schema.test.d.ts +0 -1
  235. package/node_modules/@comis/memory/dist/schema.test.js +0 -240
  236. package/node_modules/@comis/memory/dist/secret-store-schema.test.d.ts +0 -7
  237. package/node_modules/@comis/memory/dist/secret-store-schema.test.js +0 -90
  238. package/node_modules/@comis/memory/dist/session-store.test.d.ts +0 -1
  239. package/node_modules/@comis/memory/dist/session-store.test.js +0 -262
  240. package/node_modules/@comis/memory/dist/setup-secrets.test.d.ts +0 -1
  241. package/node_modules/@comis/memory/dist/setup-secrets.test.js +0 -140
  242. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.d.ts +0 -1
  243. package/node_modules/@comis/memory/dist/sqlite-memory-adapter.test.js +0 -888
  244. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.d.ts +0 -8
  245. package/node_modules/@comis/memory/dist/sqlite-secret-store.test.js +0 -245
  246. package/node_modules/@comis/shared/dist/abort.test.d.ts +0 -1
  247. package/node_modules/@comis/shared/dist/abort.test.js +0 -71
  248. package/node_modules/@comis/shared/dist/result.test.d.ts +0 -1
  249. package/node_modules/@comis/shared/dist/result.test.js +0 -178
  250. package/node_modules/@comis/shared/dist/suppress-error.test.d.ts +0 -1
  251. package/node_modules/@comis/shared/dist/suppress-error.test.js +0 -50
  252. package/node_modules/@comis/shared/dist/timeout.test.d.ts +0 -1
  253. package/node_modules/@comis/shared/dist/timeout.test.js +0 -75
  254. package/node_modules/@comis/shared/dist/ttl-cache.test.d.ts +0 -1
  255. package/node_modules/@comis/shared/dist/ttl-cache.test.js +0 -81
@@ -1,645 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { AgentConfigSchema, PerAgentConfigSchema, RoutingConfigSchema, RoutingBindingSchema, RagConfigSchema, BootstrapConfigSchema, ConcurrencyConfigSchema, BroadcastGroupSchema, ElevatedReplyConfigSchema, TracingConfigSchema, SdkRetryConfigSchema, ContextGuardConfigSchema, AgentsMapSchema, DeferredToolsConfigSchema, } from "./schema-agent.js";
3
- // ---------------------------------------------------------------------------
4
- // AgentConfigSchema
5
- // ---------------------------------------------------------------------------
6
- describe("AgentConfigSchema", () => {
7
- it("produces valid defaults from empty object", () => {
8
- const result = AgentConfigSchema.safeParse({});
9
- expect(result.success).toBe(true);
10
- if (result.success) {
11
- expect(result.data.name).toBe("Comis");
12
- expect(result.data.model).toBe("default");
13
- expect(result.data.provider).toBe("default");
14
- expect(result.data.maxSteps).toBe(150);
15
- expect(result.data.maxContextChars).toBe(100_000);
16
- expect(result.data.maxToolResultChars).toBe(50_000);
17
- expect(result.data.preserveRecent).toBe(4);
18
- }
19
- });
20
- it("leaves optional fields undefined when omitted (except cacheRetention which defaults)", () => {
21
- const result = AgentConfigSchema.safeParse({});
22
- expect(result.success).toBe(true);
23
- if (result.success) {
24
- expect(result.data.thinkingLevel).toBeUndefined();
25
- expect(result.data.maxTokens).toBeUndefined();
26
- expect(result.data.temperature).toBeUndefined();
27
- expect(result.data.cacheRetention).toBe("long");
28
- expect(result.data.workspacePath).toBeUndefined();
29
- expect(result.data.reactionLevel).toBeUndefined();
30
- }
31
- });
32
- it("rejects empty string for name", () => {
33
- const result = AgentConfigSchema.safeParse({ name: "" });
34
- expect(result.success).toBe(false);
35
- });
36
- it("rejects non-positive maxSteps", () => {
37
- const result = AgentConfigSchema.safeParse({ maxSteps: 0 });
38
- expect(result.success).toBe(false);
39
- });
40
- it("rejects negative maxSteps", () => {
41
- const result = AgentConfigSchema.safeParse({ maxSteps: -5 });
42
- expect(result.success).toBe(false);
43
- });
44
- it("rejects temperature below 0", () => {
45
- const result = AgentConfigSchema.safeParse({ temperature: -0.1 });
46
- expect(result.success).toBe(false);
47
- });
48
- it("rejects temperature above 2", () => {
49
- const result = AgentConfigSchema.safeParse({ temperature: 2.1 });
50
- expect(result.success).toBe(false);
51
- });
52
- it("accepts temperature at boundary values", () => {
53
- const r0 = AgentConfigSchema.safeParse({ temperature: 0 });
54
- expect(r0.success).toBe(true);
55
- const r2 = AgentConfigSchema.safeParse({ temperature: 2 });
56
- expect(r2.success).toBe(true);
57
- });
58
- it("accepts valid thinkingLevel enum values", () => {
59
- for (const level of ["off", "minimal", "low", "medium", "high", "xhigh"]) {
60
- const result = AgentConfigSchema.safeParse({ thinkingLevel: level });
61
- expect(result.success).toBe(true);
62
- if (result.success) {
63
- expect(result.data.thinkingLevel).toBe(level);
64
- }
65
- }
66
- });
67
- it("rejects invalid thinkingLevel", () => {
68
- const result = AgentConfigSchema.safeParse({ thinkingLevel: "ultra" });
69
- expect(result.success).toBe(false);
70
- });
71
- it("accepts valid cacheRetention values", () => {
72
- for (const val of ["none", "short", "long"]) {
73
- const result = AgentConfigSchema.safeParse({ cacheRetention: val });
74
- expect(result.success).toBe(true);
75
- }
76
- });
77
- it("includes nested defaults for budgets, circuitBreaker, rag, bootstrap", () => {
78
- const result = AgentConfigSchema.safeParse({});
79
- expect(result.success).toBe(true);
80
- if (result.success) {
81
- expect(result.data.budgets).toBeDefined();
82
- expect(result.data.circuitBreaker).toBeDefined();
83
- expect(result.data.rag).toBeDefined();
84
- expect(result.data.rag.enabled).toBe(true);
85
- expect(result.data.bootstrap).toBeDefined();
86
- expect(result.data.bootstrap.maxChars).toBe(20_000);
87
- expect(result.data.modelFailover).toBeDefined();
88
- expect(result.data.sdkRetry).toBeDefined();
89
- }
90
- });
91
- it("includes promptTimeout defaults", () => {
92
- const config = AgentConfigSchema.parse({});
93
- expect(config.promptTimeout.promptTimeoutMs).toBe(180_000);
94
- expect(config.promptTimeout.retryPromptTimeoutMs).toBe(60_000);
95
- });
96
- it("enforceFinalTag defaults to false", () => {
97
- const result = AgentConfigSchema.safeParse({});
98
- expect(result.success).toBe(true);
99
- if (result.success) {
100
- expect(result.data.enforceFinalTag).toBe(false);
101
- }
102
- });
103
- it("fastMode defaults to false", () => {
104
- const result = AgentConfigSchema.safeParse({});
105
- expect(result.success).toBe(true);
106
- if (result.success) {
107
- expect(result.data.fastMode).toBe(false);
108
- }
109
- });
110
- it("storeCompletions defaults to false", () => {
111
- const result = AgentConfigSchema.safeParse({});
112
- expect(result.success).toBe(true);
113
- if (result.success) {
114
- expect(result.data.storeCompletions).toBe(false);
115
- }
116
- });
117
- it("enforceFinalTag, fastMode, storeCompletions accept true when explicitly set", () => {
118
- const result = AgentConfigSchema.safeParse({
119
- enforceFinalTag: true,
120
- fastMode: true,
121
- storeCompletions: true,
122
- });
123
- expect(result.success).toBe(true);
124
- if (result.success) {
125
- expect(result.data.enforceFinalTag).toBe(true);
126
- expect(result.data.fastMode).toBe(true);
127
- expect(result.data.storeCompletions).toBe(true);
128
- }
129
- });
130
- it("cacheRetention defaults to 'long'", () => {
131
- const result = AgentConfigSchema.safeParse({});
132
- expect(result.success).toBe(true);
133
- if (result.success) {
134
- expect(result.data.cacheRetention).toBe("long");
135
- }
136
- });
137
- it("cacheBreakpointStrategy defaults to 'auto'", () => {
138
- const result = AgentConfigSchema.safeParse({});
139
- expect(result.success).toBe(true);
140
- if (result.success) {
141
- expect(result.data.cacheBreakpointStrategy).toBe("auto");
142
- }
143
- });
144
- it("cacheBreakpointStrategy accepts 'auto'", () => {
145
- const result = AgentConfigSchema.safeParse({ cacheBreakpointStrategy: "auto" });
146
- expect(result.success).toBe(true);
147
- if (result.success) {
148
- expect(result.data.cacheBreakpointStrategy).toBe("auto");
149
- }
150
- });
151
- it("cacheBreakpointStrategy accepts valid values", () => {
152
- const result = AgentConfigSchema.safeParse({ cacheBreakpointStrategy: "single" });
153
- expect(result.success).toBe(true);
154
- if (result.success) {
155
- expect(result.data.cacheBreakpointStrategy).toBe("single");
156
- }
157
- });
158
- it("cacheBreakpointStrategy rejects invalid values", () => {
159
- const result = AgentConfigSchema.safeParse({ cacheBreakpointStrategy: "double" });
160
- expect(result.success).toBe(false);
161
- });
162
- // CCACHE-05: cacheRetentionOverrides schema tests
163
- it("cacheRetentionOverrides accepts valid record of string->CacheRetention", () => {
164
- const result = AgentConfigSchema.safeParse({
165
- cacheRetentionOverrides: {
166
- "claude-sonnet": "none",
167
- "claude-opus-4-6": "short",
168
- "gpt-4o": "long",
169
- },
170
- });
171
- expect(result.success).toBe(true);
172
- if (result.success) {
173
- expect(result.data.cacheRetentionOverrides).toEqual({
174
- "claude-sonnet": "none",
175
- "claude-opus-4-6": "short",
176
- "gpt-4o": "long",
177
- });
178
- }
179
- });
180
- it("cacheRetentionOverrides is optional (omitting is valid)", () => {
181
- const result = AgentConfigSchema.safeParse({});
182
- expect(result.success).toBe(true);
183
- if (result.success) {
184
- expect(result.data.cacheRetentionOverrides).toBeUndefined();
185
- }
186
- });
187
- it("cacheRetentionOverrides rejects invalid retention values", () => {
188
- const result = AgentConfigSchema.safeParse({
189
- cacheRetentionOverrides: { "claude-sonnet": "forever" },
190
- });
191
- expect(result.success).toBe(false);
192
- });
193
- });
194
- // ---------------------------------------------------------------------------
195
- // PerAgentConfigSchema
196
- // ---------------------------------------------------------------------------
197
- describe("PerAgentConfigSchema", () => {
198
- it("produces valid defaults from empty object including nested defaults", () => {
199
- const result = PerAgentConfigSchema.safeParse({});
200
- expect(result.success).toBe(true);
201
- if (result.success) {
202
- // Inherits AgentConfigSchema defaults
203
- expect(result.data.name).toBe("Comis");
204
- expect(result.data.model).toBe("default");
205
- expect(result.data.provider).toBe("default");
206
- // PerAgent-specific nested defaults
207
- expect(result.data.concurrency).toBeDefined();
208
- expect(result.data.concurrency.maxConcurrentRuns).toBe(4);
209
- expect(result.data.concurrency.maxQueuedPerSession).toBe(50);
210
- expect(result.data.broadcastGroups).toEqual([]);
211
- expect(result.data.elevatedReply).toBeDefined();
212
- expect(result.data.elevatedReply.enabled).toBe(false);
213
- expect(result.data.tracing).toBeDefined();
214
- expect(result.data.tracing.enabled).toBe(false);
215
- expect(result.data.contextGuard).toBeDefined();
216
- expect(result.data.contextGuard.enabled).toBe(true);
217
- }
218
- });
219
- it("has optional skills, scheduler, session, secrets, contextPruning, sourceGate", () => {
220
- const result = PerAgentConfigSchema.safeParse({});
221
- expect(result.success).toBe(true);
222
- if (result.success) {
223
- expect(result.data.skills).toBeUndefined();
224
- expect(result.data.scheduler).toBeUndefined();
225
- expect(result.data.session).toBeUndefined();
226
- expect(result.data.secrets).toBeUndefined();
227
- expect(result.data.contextPruning).toBeUndefined();
228
- expect(result.data.sourceGate).toBeUndefined();
229
- }
230
- });
231
- it("extends AgentConfigSchema (has all AgentConfig fields)", () => {
232
- const result = PerAgentConfigSchema.safeParse({
233
- name: "CustomAgent",
234
- model: "gpt-4o",
235
- maxSteps: 10,
236
- });
237
- expect(result.success).toBe(true);
238
- if (result.success) {
239
- expect(result.data.name).toBe("CustomAgent");
240
- expect(result.data.model).toBe("gpt-4o");
241
- expect(result.data.maxSteps).toBe(10);
242
- }
243
- });
244
- it("accepts full config with all nested objects populated", () => {
245
- const result = PerAgentConfigSchema.safeParse({
246
- name: "FullAgent",
247
- skills: {
248
- discoveryPaths: ["./my-skills"],
249
- watchEnabled: true,
250
- watchDebounceMs: 500,
251
- },
252
- concurrency: { maxConcurrentRuns: 3, maxQueuedPerSession: 100 },
253
- broadcastGroups: [
254
- { id: "team", name: "Team", targets: [{ channelType: "telegram", channelId: "tg1", chatId: "123" }] },
255
- ],
256
- elevatedReply: { enabled: true, defaultTrustLevel: "admin" },
257
- tracing: { enabled: true, outputDir: "/var/traces" },
258
- contextGuard: { enabled: false, warnPercent: 70, blockPercent: 90 },
259
- contextPruning: { softTrimRatio: 0.2, hardClearRatio: 0.6 },
260
- sourceGate: { maxResponseBytes: 1_000_000 },
261
- });
262
- expect(result.success).toBe(true);
263
- if (result.success) {
264
- expect(result.data.skills?.discoveryPaths).toEqual(["./my-skills"]);
265
- expect(result.data.concurrency.maxConcurrentRuns).toBe(3);
266
- expect(result.data.broadcastGroups).toHaveLength(1);
267
- expect(result.data.elevatedReply.enabled).toBe(true);
268
- expect(result.data.tracing.outputDir).toBe("/var/traces");
269
- expect(result.data.contextGuard.warnPercent).toBe(70);
270
- expect(result.data.contextPruning?.softTrimRatio).toBe(0.2);
271
- expect(result.data.contextPruning?.hardClearRatio).toBe(0.6);
272
- expect(result.data.sourceGate?.maxResponseBytes).toBe(1_000_000);
273
- }
274
- });
275
- it("contextPruning as empty object parses to valid defaults", () => {
276
- const result = PerAgentConfigSchema.safeParse({ contextPruning: {} });
277
- expect(result.success).toBe(true);
278
- if (result.success) {
279
- expect(result.data.contextPruning).toBeDefined();
280
- expect(result.data.contextPruning.enabled).toBe(true);
281
- expect(result.data.contextPruning.softTrimRatio).toBe(0.3);
282
- expect(result.data.contextPruning.hardClearRatio).toBe(0.5);
283
- expect(result.data.contextPruning.keepLastAssistants).toBe(3);
284
- expect(result.data.contextPruning.minPrunableToolChars).toBe(4000);
285
- expect(result.data.contextPruning.protectedTools).toHaveLength(4);
286
- }
287
- });
288
- it("contextPruning accepts custom values", () => {
289
- const result = PerAgentConfigSchema.safeParse({
290
- contextPruning: { softTrimRatio: 0.1, hardClearRatio: 0.4 },
291
- });
292
- expect(result.success).toBe(true);
293
- if (result.success) {
294
- expect(result.data.contextPruning.softTrimRatio).toBe(0.1);
295
- expect(result.data.contextPruning.hardClearRatio).toBe(0.4);
296
- }
297
- });
298
- it("rejects contextPruning with softTrimRatio >= hardClearRatio", () => {
299
- const result = PerAgentConfigSchema.safeParse({
300
- contextPruning: { softTrimRatio: 0.5, hardClearRatio: 0.3 },
301
- });
302
- expect(result.success).toBe(false);
303
- });
304
- it("sourceGate defaults to undefined when omitted", () => {
305
- const result = PerAgentConfigSchema.safeParse({});
306
- expect(result.success).toBe(true);
307
- if (result.success) {
308
- expect(result.data.sourceGate).toBeUndefined();
309
- }
310
- });
311
- it("sourceGate as empty object parses to valid defaults", () => {
312
- const result = PerAgentConfigSchema.safeParse({ sourceGate: {} });
313
- expect(result.success).toBe(true);
314
- if (result.success) {
315
- expect(result.data.sourceGate).toBeDefined();
316
- expect(result.data.sourceGate.maxResponseBytes).toBe(2_000_000);
317
- expect(result.data.sourceGate.stripHiddenHtml).toBe(true);
318
- }
319
- });
320
- it("deferredTools is undefined when omitted (not defaulted)", () => {
321
- const result = PerAgentConfigSchema.safeParse({});
322
- expect(result.success).toBe(true);
323
- if (result.success) {
324
- expect(result.data.deferredTools).toBeUndefined();
325
- }
326
- });
327
- it("deferredTools with explicit config passes validation", () => {
328
- const result = PerAgentConfigSchema.safeParse({
329
- deferredTools: { mode: "never", neverDefer: ["tool_a"], alwaysDefer: ["tool_b"] },
330
- });
331
- expect(result.success).toBe(true);
332
- if (result.success) {
333
- expect(result.data.deferredTools).toBeDefined();
334
- expect(result.data.deferredTools.mode).toBe("never");
335
- expect(result.data.deferredTools.neverDefer).toEqual(["tool_a"]);
336
- expect(result.data.deferredTools.alwaysDefer).toEqual(["tool_b"]);
337
- }
338
- });
339
- });
340
- // ---------------------------------------------------------------------------
341
- // DeferredToolsConfigSchema
342
- // ---------------------------------------------------------------------------
343
- describe("DeferredToolsConfigSchema", () => {
344
- it("empty object produces correct defaults", () => {
345
- const result = DeferredToolsConfigSchema.safeParse({});
346
- expect(result.success).toBe(true);
347
- if (result.success) {
348
- expect(result.data.mode).toBe("auto");
349
- expect(result.data.neverDefer).toEqual([]);
350
- expect(result.data.alwaysDefer).toEqual([]);
351
- }
352
- });
353
- it("explicit values are preserved", () => {
354
- const result = DeferredToolsConfigSchema.safeParse({
355
- mode: "never",
356
- neverDefer: ["tool_a"],
357
- alwaysDefer: ["tool_b"],
358
- });
359
- expect(result.success).toBe(true);
360
- if (result.success) {
361
- expect(result.data.mode).toBe("never");
362
- expect(result.data.neverDefer).toEqual(["tool_a"]);
363
- expect(result.data.alwaysDefer).toEqual(["tool_b"]);
364
- }
365
- });
366
- it("invalid mode value is rejected", () => {
367
- const result = DeferredToolsConfigSchema.safeParse({ mode: "invalid" });
368
- expect(result.success).toBe(false);
369
- });
370
- it("extra properties on strictObject are rejected", () => {
371
- const result = DeferredToolsConfigSchema.safeParse({ extraProp: true });
372
- expect(result.success).toBe(false);
373
- });
374
- it("accepts all valid mode values", () => {
375
- for (const mode of ["always", "auto", "never"]) {
376
- const result = DeferredToolsConfigSchema.safeParse({ mode });
377
- expect(result.success).toBe(true);
378
- if (result.success) {
379
- expect(result.data.mode).toBe(mode);
380
- }
381
- }
382
- });
383
- });
384
- // ---------------------------------------------------------------------------
385
- // RoutingConfigSchema
386
- // ---------------------------------------------------------------------------
387
- describe("RoutingConfigSchema", () => {
388
- it("produces valid defaults", () => {
389
- const result = RoutingConfigSchema.safeParse({});
390
- expect(result.success).toBe(true);
391
- if (result.success) {
392
- expect(result.data.defaultAgentId).toBe("default");
393
- expect(result.data.bindings).toEqual([]);
394
- }
395
- });
396
- it("accepts binding with all fields", () => {
397
- const result = RoutingConfigSchema.safeParse({
398
- bindings: [{
399
- channelType: "telegram",
400
- channelId: "ch1",
401
- peerId: "user1",
402
- guildId: "guild1",
403
- agentId: "agent1",
404
- }],
405
- });
406
- expect(result.success).toBe(true);
407
- if (result.success) {
408
- expect(result.data.bindings).toHaveLength(1);
409
- expect(result.data.bindings[0].agentId).toBe("agent1");
410
- }
411
- });
412
- it("rejects binding with empty agentId", () => {
413
- const result = RoutingBindingSchema.safeParse({ agentId: "" });
414
- expect(result.success).toBe(false);
415
- });
416
- });
417
- // ---------------------------------------------------------------------------
418
- // RagConfigSchema
419
- // ---------------------------------------------------------------------------
420
- describe("RagConfigSchema", () => {
421
- it("produces valid defaults", () => {
422
- const result = RagConfigSchema.safeParse({});
423
- expect(result.success).toBe(true);
424
- if (result.success) {
425
- expect(result.data.enabled).toBe(true);
426
- expect(result.data.maxResults).toBe(5);
427
- expect(result.data.maxContextChars).toBe(4000);
428
- expect(result.data.minScore).toBe(0.1);
429
- expect(result.data.includeTrustLevels).toEqual(["system", "learned"]);
430
- }
431
- });
432
- it("rejects minScore above 1", () => {
433
- const result = RagConfigSchema.safeParse({ minScore: 1.1 });
434
- expect(result.success).toBe(false);
435
- });
436
- it("rejects minScore below 0", () => {
437
- const result = RagConfigSchema.safeParse({ minScore: -0.1 });
438
- expect(result.success).toBe(false);
439
- });
440
- it("accepts minScore at boundary values", () => {
441
- const r0 = RagConfigSchema.safeParse({ minScore: 0 });
442
- expect(r0.success).toBe(true);
443
- const r1 = RagConfigSchema.safeParse({ minScore: 1 });
444
- expect(r1.success).toBe(true);
445
- });
446
- it("rejects non-positive maxResults", () => {
447
- const result = RagConfigSchema.safeParse({ maxResults: 0 });
448
- expect(result.success).toBe(false);
449
- });
450
- });
451
- // ---------------------------------------------------------------------------
452
- // BootstrapConfigSchema
453
- // ---------------------------------------------------------------------------
454
- describe("BootstrapConfigSchema", () => {
455
- it("produces valid defaults", () => {
456
- const result = BootstrapConfigSchema.safeParse({});
457
- expect(result.success).toBe(true);
458
- if (result.success) {
459
- expect(result.data.maxChars).toBe(20_000);
460
- expect(result.data.promptMode).toBe("full");
461
- }
462
- });
463
- it("accepts all 3 promptMode values", () => {
464
- for (const mode of ["full", "minimal", "none"]) {
465
- const result = BootstrapConfigSchema.safeParse({ promptMode: mode });
466
- expect(result.success).toBe(true);
467
- if (result.success) {
468
- expect(result.data.promptMode).toBe(mode);
469
- }
470
- }
471
- });
472
- it("rejects invalid promptMode", () => {
473
- const result = BootstrapConfigSchema.safeParse({ promptMode: "verbose" });
474
- expect(result.success).toBe(false);
475
- });
476
- it("defaults groupChatFiltering to true", () => {
477
- const result = BootstrapConfigSchema.safeParse({});
478
- expect(result.success).toBe(true);
479
- if (result.success) {
480
- expect(result.data.groupChatFiltering).toBe(true);
481
- }
482
- });
483
- it("accepts explicit groupChatFiltering: false", () => {
484
- const result = BootstrapConfigSchema.safeParse({ groupChatFiltering: false });
485
- expect(result.success).toBe(true);
486
- if (result.success) {
487
- expect(result.data.groupChatFiltering).toBe(false);
488
- }
489
- });
490
- it("accepts explicit groupChatFiltering: true", () => {
491
- const result = BootstrapConfigSchema.safeParse({ groupChatFiltering: true });
492
- expect(result.success).toBe(true);
493
- if (result.success) {
494
- expect(result.data.groupChatFiltering).toBe(true);
495
- }
496
- });
497
- });
498
- // ---------------------------------------------------------------------------
499
- // ConcurrencyConfigSchema
500
- // ---------------------------------------------------------------------------
501
- describe("ConcurrencyConfigSchema", () => {
502
- it("produces valid defaults", () => {
503
- const result = ConcurrencyConfigSchema.safeParse({});
504
- expect(result.success).toBe(true);
505
- if (result.success) {
506
- expect(result.data.maxConcurrentRuns).toBe(4);
507
- expect(result.data.maxQueuedPerSession).toBe(50);
508
- }
509
- });
510
- it("rejects non-positive maxConcurrentRuns", () => {
511
- const result = ConcurrencyConfigSchema.safeParse({ maxConcurrentRuns: 0 });
512
- expect(result.success).toBe(false);
513
- });
514
- });
515
- // ---------------------------------------------------------------------------
516
- // BroadcastGroupSchema
517
- // ---------------------------------------------------------------------------
518
- describe("BroadcastGroupSchema", () => {
519
- it("produces valid defaults for optional fields", () => {
520
- const result = BroadcastGroupSchema.safeParse({ id: "test" });
521
- expect(result.success).toBe(true);
522
- if (result.success) {
523
- expect(result.data.name).toBe("");
524
- expect(result.data.targets).toEqual([]);
525
- expect(result.data.enabled).toBe(true);
526
- }
527
- });
528
- it("rejects empty id", () => {
529
- const result = BroadcastGroupSchema.safeParse({ id: "" });
530
- expect(result.success).toBe(false);
531
- });
532
- it("accepts targets with all fields", () => {
533
- const result = BroadcastGroupSchema.safeParse({
534
- id: "alerts",
535
- targets: [{ channelType: "discord", channelId: "ch1", chatId: "123" }],
536
- });
537
- expect(result.success).toBe(true);
538
- if (result.success) {
539
- expect(result.data.targets).toHaveLength(1);
540
- }
541
- });
542
- });
543
- // ---------------------------------------------------------------------------
544
- // ElevatedReplyConfigSchema
545
- // ---------------------------------------------------------------------------
546
- describe("ElevatedReplyConfigSchema", () => {
547
- it("produces valid defaults", () => {
548
- const result = ElevatedReplyConfigSchema.safeParse({});
549
- expect(result.success).toBe(true);
550
- if (result.success) {
551
- expect(result.data.enabled).toBe(false);
552
- expect(result.data.trustModelRoutes).toEqual({});
553
- expect(result.data.trustPromptOverrides).toEqual({});
554
- expect(result.data.defaultTrustLevel).toBe("external");
555
- expect(result.data.senderTrustMap).toEqual({});
556
- }
557
- });
558
- });
559
- // ---------------------------------------------------------------------------
560
- // TracingConfigSchema
561
- // ---------------------------------------------------------------------------
562
- describe("TracingConfigSchema", () => {
563
- it("produces valid defaults", () => {
564
- const result = TracingConfigSchema.safeParse({});
565
- expect(result.success).toBe(true);
566
- if (result.success) {
567
- expect(result.data.enabled).toBe(false);
568
- expect(result.data.outputDir).toBe("~/.comis/traces");
569
- }
570
- });
571
- });
572
- // ---------------------------------------------------------------------------
573
- // SdkRetryConfigSchema
574
- // ---------------------------------------------------------------------------
575
- describe("SdkRetryConfigSchema", () => {
576
- it("produces valid defaults", () => {
577
- const result = SdkRetryConfigSchema.safeParse({});
578
- expect(result.success).toBe(true);
579
- if (result.success) {
580
- expect(result.data.enabled).toBe(true);
581
- expect(result.data.maxRetries).toBe(5);
582
- expect(result.data.baseDelayMs).toBe(4000);
583
- expect(result.data.maxDelayMs).toBe(60000);
584
- }
585
- });
586
- it("accepts maxRetries=0 (disabled retries)", () => {
587
- const result = SdkRetryConfigSchema.safeParse({ maxRetries: 0 });
588
- expect(result.success).toBe(true);
589
- if (result.success) {
590
- expect(result.data.maxRetries).toBe(0);
591
- }
592
- });
593
- });
594
- // ---------------------------------------------------------------------------
595
- // ContextGuardConfigSchema
596
- // ---------------------------------------------------------------------------
597
- describe("ContextGuardConfigSchema", () => {
598
- it("produces valid defaults", () => {
599
- const result = ContextGuardConfigSchema.safeParse({});
600
- expect(result.success).toBe(true);
601
- if (result.success) {
602
- expect(result.data.enabled).toBe(true);
603
- expect(result.data.warnPercent).toBe(80);
604
- expect(result.data.blockPercent).toBe(95);
605
- }
606
- });
607
- it("rejects warnPercent above 100", () => {
608
- const result = ContextGuardConfigSchema.safeParse({ warnPercent: 101 });
609
- expect(result.success).toBe(false);
610
- });
611
- it("rejects warnPercent below 0", () => {
612
- const result = ContextGuardConfigSchema.safeParse({ warnPercent: -1 });
613
- expect(result.success).toBe(false);
614
- });
615
- it("rejects blockPercent above 100", () => {
616
- const result = ContextGuardConfigSchema.safeParse({ blockPercent: 101 });
617
- expect(result.success).toBe(false);
618
- });
619
- it("accepts boundary values", () => {
620
- const r0 = ContextGuardConfigSchema.safeParse({ warnPercent: 0, blockPercent: 0 });
621
- expect(r0.success).toBe(true);
622
- const r100 = ContextGuardConfigSchema.safeParse({ warnPercent: 100, blockPercent: 100 });
623
- expect(r100.success).toBe(true);
624
- });
625
- });
626
- // ---------------------------------------------------------------------------
627
- // AgentsMapSchema
628
- // ---------------------------------------------------------------------------
629
- describe("AgentsMapSchema", () => {
630
- it("parses a record with string keys to PerAgentConfig values", () => {
631
- const result = AgentsMapSchema.safeParse({
632
- default: {},
633
- assistant: { name: "Assistant", model: "gpt-4o" },
634
- });
635
- expect(result.success).toBe(true);
636
- if (result.success) {
637
- expect(result.data.default.name).toBe("Comis");
638
- expect(result.data.assistant.name).toBe("Assistant");
639
- }
640
- });
641
- it("rejects empty string keys", () => {
642
- const result = AgentsMapSchema.safeParse({ "": {} });
643
- expect(result.success).toBe(false);
644
- });
645
- });