@vertesia/common 0.24.0-dev.202601221707

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 (388) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +53 -0
  3. package/lib/cjs/Progress.js +61 -0
  4. package/lib/cjs/Progress.js.map +1 -0
  5. package/lib/cjs/access-control.js +56 -0
  6. package/lib/cjs/access-control.js.map +1 -0
  7. package/lib/cjs/analytics.js +3 -0
  8. package/lib/cjs/analytics.js.map +1 -0
  9. package/lib/cjs/apikey.js +16 -0
  10. package/lib/cjs/apikey.js.map +1 -0
  11. package/lib/cjs/apps.js +35 -0
  12. package/lib/cjs/apps.js.map +1 -0
  13. package/lib/cjs/ask-user.js +8 -0
  14. package/lib/cjs/ask-user.js.map +1 -0
  15. package/lib/cjs/channels.js +63 -0
  16. package/lib/cjs/channels.js.map +1 -0
  17. package/lib/cjs/common.js +3 -0
  18. package/lib/cjs/common.js.map +1 -0
  19. package/lib/cjs/data-platform.js +127 -0
  20. package/lib/cjs/data-platform.js.map +1 -0
  21. package/lib/cjs/email.js +20 -0
  22. package/lib/cjs/email.js.map +1 -0
  23. package/lib/cjs/environment.js +44 -0
  24. package/lib/cjs/environment.js.map +1 -0
  25. package/lib/cjs/facets.js +3 -0
  26. package/lib/cjs/facets.js.map +1 -0
  27. package/lib/cjs/group.js +5 -0
  28. package/lib/cjs/group.js.map +1 -0
  29. package/lib/cjs/index.js +55 -0
  30. package/lib/cjs/index.js.map +1 -0
  31. package/lib/cjs/integrations.js +14 -0
  32. package/lib/cjs/integrations.js.map +1 -0
  33. package/lib/cjs/interaction.js +97 -0
  34. package/lib/cjs/interaction.js.map +1 -0
  35. package/lib/cjs/json-schema.js +3 -0
  36. package/lib/cjs/json-schema.js.map +1 -0
  37. package/lib/cjs/json.js +3 -0
  38. package/lib/cjs/json.js.map +1 -0
  39. package/lib/cjs/meters.js +13 -0
  40. package/lib/cjs/meters.js.map +1 -0
  41. package/lib/cjs/model_utility.js +6 -0
  42. package/lib/cjs/model_utility.js.map +1 -0
  43. package/lib/cjs/package.json +3 -0
  44. package/lib/cjs/payload.js +3 -0
  45. package/lib/cjs/payload.js.map +1 -0
  46. package/lib/cjs/pending-asks.js +7 -0
  47. package/lib/cjs/pending-asks.js.map +1 -0
  48. package/lib/cjs/project.js +107 -0
  49. package/lib/cjs/project.js.map +1 -0
  50. package/lib/cjs/prompt.js +21 -0
  51. package/lib/cjs/prompt.js.map +1 -0
  52. package/lib/cjs/query.js +3 -0
  53. package/lib/cjs/query.js.map +1 -0
  54. package/lib/cjs/rate-limiter.js +6 -0
  55. package/lib/cjs/rate-limiter.js.map +1 -0
  56. package/lib/cjs/refs.js +14 -0
  57. package/lib/cjs/refs.js.map +1 -0
  58. package/lib/cjs/runs.js +3 -0
  59. package/lib/cjs/runs.js.map +1 -0
  60. package/lib/cjs/skill.js +14 -0
  61. package/lib/cjs/skill.js.map +1 -0
  62. package/lib/cjs/store/activity-catalog.js +3 -0
  63. package/lib/cjs/store/activity-catalog.js.map +1 -0
  64. package/lib/cjs/store/collections.js +9 -0
  65. package/lib/cjs/store/collections.js.map +1 -0
  66. package/lib/cjs/store/common.js +3 -0
  67. package/lib/cjs/store/common.js.map +1 -0
  68. package/lib/cjs/store/conversation-state.js +3 -0
  69. package/lib/cjs/store/conversation-state.js.map +1 -0
  70. package/lib/cjs/store/doc-analyzer.js +3 -0
  71. package/lib/cjs/store/doc-analyzer.js.map +1 -0
  72. package/lib/cjs/store/dsl-workflow.js +5 -0
  73. package/lib/cjs/store/dsl-workflow.js.map +1 -0
  74. package/lib/cjs/store/index.js +30 -0
  75. package/lib/cjs/store/index.js.map +1 -0
  76. package/lib/cjs/store/object-types.js +98 -0
  77. package/lib/cjs/store/object-types.js.map +1 -0
  78. package/lib/cjs/store/schedule.js +32 -0
  79. package/lib/cjs/store/schedule.js.map +1 -0
  80. package/lib/cjs/store/signals.js +3 -0
  81. package/lib/cjs/store/signals.js.map +1 -0
  82. package/lib/cjs/store/store.js +166 -0
  83. package/lib/cjs/store/store.js.map +1 -0
  84. package/lib/cjs/store/temporalio.js +44 -0
  85. package/lib/cjs/store/temporalio.js.map +1 -0
  86. package/lib/cjs/store/worker.js +3 -0
  87. package/lib/cjs/store/worker.js.map +1 -0
  88. package/lib/cjs/store/workflow.js +241 -0
  89. package/lib/cjs/store/workflow.js.map +1 -0
  90. package/lib/cjs/sts-token-types.js +32 -0
  91. package/lib/cjs/sts-token-types.js.map +1 -0
  92. package/lib/cjs/tenant.js +3 -0
  93. package/lib/cjs/tenant.js.map +1 -0
  94. package/lib/cjs/tool-execution.js +6 -0
  95. package/lib/cjs/tool-execution.js.map +1 -0
  96. package/lib/cjs/training.js +14 -0
  97. package/lib/cjs/training.js.map +1 -0
  98. package/lib/cjs/transient-tokens.js +9 -0
  99. package/lib/cjs/transient-tokens.js.map +1 -0
  100. package/lib/cjs/user.js +25 -0
  101. package/lib/cjs/user.js.map +1 -0
  102. package/lib/cjs/utils/auth.js +15 -0
  103. package/lib/cjs/utils/auth.js.map +1 -0
  104. package/lib/cjs/utils/schemas.js +114 -0
  105. package/lib/cjs/utils/schemas.js.map +1 -0
  106. package/lib/cjs/utils/type-helpers.js +3 -0
  107. package/lib/cjs/utils/type-helpers.js.map +1 -0
  108. package/lib/cjs/versions.js +8 -0
  109. package/lib/cjs/versions.js.map +1 -0
  110. package/lib/cjs/workflow-analytics.js +52 -0
  111. package/lib/cjs/workflow-analytics.js.map +1 -0
  112. package/lib/esm/Progress.js +57 -0
  113. package/lib/esm/Progress.js.map +1 -0
  114. package/lib/esm/access-control.js +53 -0
  115. package/lib/esm/access-control.js.map +1 -0
  116. package/lib/esm/analytics.js +2 -0
  117. package/lib/esm/analytics.js.map +1 -0
  118. package/lib/esm/apikey.js +13 -0
  119. package/lib/esm/apikey.js.map +1 -0
  120. package/lib/esm/apps.js +32 -0
  121. package/lib/esm/apps.js.map +1 -0
  122. package/lib/esm/ask-user.js +7 -0
  123. package/lib/esm/ask-user.js.map +1 -0
  124. package/lib/esm/channels.js +57 -0
  125. package/lib/esm/channels.js.map +1 -0
  126. package/lib/esm/common.js +2 -0
  127. package/lib/esm/common.js.map +1 -0
  128. package/lib/esm/data-platform.js +124 -0
  129. package/lib/esm/data-platform.js.map +1 -0
  130. package/lib/esm/email.js +16 -0
  131. package/lib/esm/email.js.map +1 -0
  132. package/lib/esm/environment.js +41 -0
  133. package/lib/esm/environment.js.map +1 -0
  134. package/lib/esm/facets.js +2 -0
  135. package/lib/esm/facets.js.map +1 -0
  136. package/lib/esm/group.js +2 -0
  137. package/lib/esm/group.js.map +1 -0
  138. package/lib/esm/index.js +39 -0
  139. package/lib/esm/index.js.map +1 -0
  140. package/lib/esm/integrations.js +11 -0
  141. package/lib/esm/integrations.js.map +1 -0
  142. package/lib/esm/interaction.js +92 -0
  143. package/lib/esm/interaction.js.map +1 -0
  144. package/lib/esm/json-schema.js +2 -0
  145. package/lib/esm/json-schema.js.map +1 -0
  146. package/lib/esm/json.js +2 -0
  147. package/lib/esm/json.js.map +1 -0
  148. package/lib/esm/meters.js +10 -0
  149. package/lib/esm/meters.js.map +1 -0
  150. package/lib/esm/model_utility.js +2 -0
  151. package/lib/esm/model_utility.js.map +1 -0
  152. package/lib/esm/payload.js +2 -0
  153. package/lib/esm/payload.js.map +1 -0
  154. package/lib/esm/pending-asks.js +6 -0
  155. package/lib/esm/pending-asks.js.map +1 -0
  156. package/lib/esm/project.js +102 -0
  157. package/lib/esm/project.js.map +1 -0
  158. package/lib/esm/prompt.js +18 -0
  159. package/lib/esm/prompt.js.map +1 -0
  160. package/lib/esm/query.js +2 -0
  161. package/lib/esm/query.js.map +1 -0
  162. package/lib/esm/rate-limiter.js +5 -0
  163. package/lib/esm/rate-limiter.js.map +1 -0
  164. package/lib/esm/refs.js +11 -0
  165. package/lib/esm/refs.js.map +1 -0
  166. package/lib/esm/runs.js +2 -0
  167. package/lib/esm/runs.js.map +1 -0
  168. package/lib/esm/skill.js +13 -0
  169. package/lib/esm/skill.js.map +1 -0
  170. package/lib/esm/store/activity-catalog.js +2 -0
  171. package/lib/esm/store/activity-catalog.js.map +1 -0
  172. package/lib/esm/store/collections.js +6 -0
  173. package/lib/esm/store/collections.js.map +1 -0
  174. package/lib/esm/store/common.js +2 -0
  175. package/lib/esm/store/common.js.map +1 -0
  176. package/lib/esm/store/conversation-state.js +2 -0
  177. package/lib/esm/store/conversation-state.js.map +1 -0
  178. package/lib/esm/store/doc-analyzer.js +2 -0
  179. package/lib/esm/store/doc-analyzer.js.map +1 -0
  180. package/lib/esm/store/dsl-workflow.js +2 -0
  181. package/lib/esm/store/dsl-workflow.js.map +1 -0
  182. package/lib/esm/store/index.js +14 -0
  183. package/lib/esm/store/index.js.map +1 -0
  184. package/lib/esm/store/object-types.js +95 -0
  185. package/lib/esm/store/object-types.js.map +1 -0
  186. package/lib/esm/store/schedule.js +29 -0
  187. package/lib/esm/store/schedule.js.map +1 -0
  188. package/lib/esm/store/signals.js +2 -0
  189. package/lib/esm/store/signals.js.map +1 -0
  190. package/lib/esm/store/store.js +160 -0
  191. package/lib/esm/store/store.js.map +1 -0
  192. package/lib/esm/store/temporalio.js +41 -0
  193. package/lib/esm/store/temporalio.js.map +1 -0
  194. package/lib/esm/store/worker.js +2 -0
  195. package/lib/esm/store/worker.js.map +1 -0
  196. package/lib/esm/store/workflow.js +228 -0
  197. package/lib/esm/store/workflow.js.map +1 -0
  198. package/lib/esm/sts-token-types.js +24 -0
  199. package/lib/esm/sts-token-types.js.map +1 -0
  200. package/lib/esm/tenant.js +2 -0
  201. package/lib/esm/tenant.js.map +1 -0
  202. package/lib/esm/tool-execution.js +5 -0
  203. package/lib/esm/tool-execution.js.map +1 -0
  204. package/lib/esm/training.js +11 -0
  205. package/lib/esm/training.js.map +1 -0
  206. package/lib/esm/transient-tokens.js +6 -0
  207. package/lib/esm/transient-tokens.js.map +1 -0
  208. package/lib/esm/user.js +22 -0
  209. package/lib/esm/user.js.map +1 -0
  210. package/lib/esm/utils/auth.js +11 -0
  211. package/lib/esm/utils/auth.js.map +1 -0
  212. package/lib/esm/utils/schemas.js +107 -0
  213. package/lib/esm/utils/schemas.js.map +1 -0
  214. package/lib/esm/utils/type-helpers.js +2 -0
  215. package/lib/esm/utils/type-helpers.js.map +1 -0
  216. package/lib/esm/versions.js +5 -0
  217. package/lib/esm/versions.js.map +1 -0
  218. package/lib/esm/workflow-analytics.js +49 -0
  219. package/lib/esm/workflow-analytics.js.map +1 -0
  220. package/lib/tsconfig.tsbuildinfo +1 -0
  221. package/lib/types/Progress.d.ts +21 -0
  222. package/lib/types/Progress.d.ts.map +1 -0
  223. package/lib/types/access-control.d.ts +73 -0
  224. package/lib/types/access-control.d.ts.map +1 -0
  225. package/lib/types/analytics.d.ts +87 -0
  226. package/lib/types/analytics.d.ts.map +1 -0
  227. package/lib/types/apikey.d.ts +98 -0
  228. package/lib/types/apikey.d.ts.map +1 -0
  229. package/lib/types/apps.d.ts +236 -0
  230. package/lib/types/apps.d.ts.map +1 -0
  231. package/lib/types/ask-user.d.ts +32 -0
  232. package/lib/types/ask-user.d.ts.map +1 -0
  233. package/lib/types/channels.d.ts +21 -0
  234. package/lib/types/channels.d.ts.map +1 -0
  235. package/lib/types/common.d.ts +31 -0
  236. package/lib/types/common.d.ts.map +1 -0
  237. package/lib/types/data-platform.d.ts +860 -0
  238. package/lib/types/data-platform.d.ts.map +1 -0
  239. package/lib/types/email.d.ts +66 -0
  240. package/lib/types/email.d.ts.map +1 -0
  241. package/lib/types/environment.d.ts +106 -0
  242. package/lib/types/environment.d.ts.map +1 -0
  243. package/lib/types/facets.d.ts +34 -0
  244. package/lib/types/facets.d.ts.map +1 -0
  245. package/lib/types/group.d.ts +21 -0
  246. package/lib/types/group.d.ts.map +1 -0
  247. package/lib/types/index.d.ts +39 -0
  248. package/lib/types/index.d.ts.map +1 -0
  249. package/lib/types/integrations.d.ts +60 -0
  250. package/lib/types/integrations.d.ts.map +1 -0
  251. package/lib/types/interaction.d.ts +958 -0
  252. package/lib/types/interaction.d.ts.map +1 -0
  253. package/lib/types/json-schema.d.ts +1 -0
  254. package/lib/types/json-schema.d.ts.map +1 -0
  255. package/lib/types/json.d.ts +1 -0
  256. package/lib/types/json.d.ts.map +1 -0
  257. package/lib/types/meters.d.ts +23 -0
  258. package/lib/types/meters.d.ts.map +1 -0
  259. package/lib/types/model_utility.d.ts +1 -0
  260. package/lib/types/model_utility.d.ts.map +1 -0
  261. package/lib/types/payload.d.ts +60 -0
  262. package/lib/types/payload.d.ts.map +1 -0
  263. package/lib/types/pending-asks.d.ts +93 -0
  264. package/lib/types/pending-asks.d.ts.map +1 -0
  265. package/lib/types/project.d.ts +179 -0
  266. package/lib/types/project.d.ts.map +1 -0
  267. package/lib/types/prompt.d.ts +78 -0
  268. package/lib/types/prompt.d.ts.map +1 -0
  269. package/lib/types/query.d.ts +118 -0
  270. package/lib/types/query.d.ts.map +1 -0
  271. package/lib/types/rate-limiter.d.ts +28 -0
  272. package/lib/types/rate-limiter.d.ts.map +1 -0
  273. package/lib/types/refs.d.ts +22 -0
  274. package/lib/types/refs.d.ts.map +1 -0
  275. package/lib/types/runs.d.ts +32 -0
  276. package/lib/types/runs.d.ts.map +1 -0
  277. package/lib/types/skill.d.ts +78 -0
  278. package/lib/types/skill.d.ts.map +1 -0
  279. package/lib/types/store/activity-catalog.d.ts +26 -0
  280. package/lib/types/store/activity-catalog.d.ts.map +1 -0
  281. package/lib/types/store/collections.d.ts +78 -0
  282. package/lib/types/store/collections.d.ts.map +1 -0
  283. package/lib/types/store/common.d.ts +22 -0
  284. package/lib/types/store/common.d.ts.map +1 -0
  285. package/lib/types/store/conversation-state.d.ts +120 -0
  286. package/lib/types/store/conversation-state.d.ts.map +1 -0
  287. package/lib/types/store/doc-analyzer.d.ts +140 -0
  288. package/lib/types/store/doc-analyzer.d.ts.map +1 -0
  289. package/lib/types/store/dsl-workflow.d.ts +244 -0
  290. package/lib/types/store/dsl-workflow.d.ts.map +1 -0
  291. package/lib/types/store/index.d.ts +13 -0
  292. package/lib/types/store/index.d.ts.map +1 -0
  293. package/lib/types/store/object-types.d.ts +23 -0
  294. package/lib/types/store/object-types.d.ts.map +1 -0
  295. package/lib/types/store/schedule.d.ts +182 -0
  296. package/lib/types/store/schedule.d.ts.map +1 -0
  297. package/lib/types/store/signals.d.ts +24 -0
  298. package/lib/types/store/signals.d.ts.map +1 -0
  299. package/lib/types/store/store.d.ts +407 -0
  300. package/lib/types/store/store.d.ts.map +1 -0
  301. package/lib/types/store/temporalio.d.ts +16 -0
  302. package/lib/types/store/temporalio.d.ts.map +1 -0
  303. package/lib/types/store/worker.d.ts +18 -0
  304. package/lib/types/store/worker.d.ts.map +1 -0
  305. package/lib/types/store/workflow.d.ts +730 -0
  306. package/lib/types/store/workflow.d.ts.map +1 -0
  307. package/lib/types/sts-token-types.d.ts +72 -0
  308. package/lib/types/sts-token-types.d.ts.map +1 -0
  309. package/lib/types/tenant.d.ts +10 -0
  310. package/lib/types/tenant.d.ts.map +1 -0
  311. package/lib/types/tool-execution.d.ts +45 -0
  312. package/lib/types/tool-execution.d.ts.map +1 -0
  313. package/lib/types/training.d.ts +38 -0
  314. package/lib/types/training.d.ts.map +1 -0
  315. package/lib/types/transient-tokens.d.ts +24 -0
  316. package/lib/types/transient-tokens.d.ts.map +1 -0
  317. package/lib/types/user.d.ts +116 -0
  318. package/lib/types/user.d.ts.map +1 -0
  319. package/lib/types/utils/auth.d.ts +3 -0
  320. package/lib/types/utils/auth.d.ts.map +1 -0
  321. package/lib/types/utils/schemas.d.ts +9 -0
  322. package/lib/types/utils/schemas.d.ts.map +1 -0
  323. package/lib/types/utils/type-helpers.d.ts +3 -0
  324. package/lib/types/utils/type-helpers.d.ts.map +1 -0
  325. package/lib/types/versions.d.ts +3 -0
  326. package/lib/types/versions.d.ts.map +1 -0
  327. package/lib/types/workflow-analytics.d.ts +777 -0
  328. package/lib/types/workflow-analytics.d.ts.map +1 -0
  329. package/lib/vertesia-common.js +2 -0
  330. package/lib/vertesia-common.js.map +1 -0
  331. package/package.json +54 -0
  332. package/src/Progress.ts +57 -0
  333. package/src/access-control.ts +98 -0
  334. package/src/analytics.ts +106 -0
  335. package/src/apikey.ts +116 -0
  336. package/src/apps.ts +296 -0
  337. package/src/ask-user.ts +35 -0
  338. package/src/channels.ts +70 -0
  339. package/src/common.ts +37 -0
  340. package/src/data-platform.ts +976 -0
  341. package/src/email.ts +80 -0
  342. package/src/environment.ts +137 -0
  343. package/src/facets.ts +44 -0
  344. package/src/group.ts +26 -0
  345. package/src/index.ts +40 -0
  346. package/src/integrations.ts +72 -0
  347. package/src/interaction.ts +1182 -0
  348. package/src/json-schema.ts +7 -0
  349. package/src/json.ts +4 -0
  350. package/src/meters.ts +30 -0
  351. package/src/model_utility.ts +1 -0
  352. package/src/payload.ts +83 -0
  353. package/src/pending-asks.ts +106 -0
  354. package/src/project.ts +263 -0
  355. package/src/prompt.ts +103 -0
  356. package/src/query.ts +137 -0
  357. package/src/rate-limiter.ts +34 -0
  358. package/src/refs.ts +30 -0
  359. package/src/runs.ts +36 -0
  360. package/src/skill.ts +90 -0
  361. package/src/store/activity-catalog.ts +44 -0
  362. package/src/store/collections.ts +87 -0
  363. package/src/store/common.ts +30 -0
  364. package/src/store/conversation-state.ts +146 -0
  365. package/src/store/doc-analyzer.ts +161 -0
  366. package/src/store/dsl-workflow.ts +288 -0
  367. package/src/store/index.ts +14 -0
  368. package/src/store/ms.d.ts +11 -0
  369. package/src/store/object-types.ts +127 -0
  370. package/src/store/schedule.ts +238 -0
  371. package/src/store/signals.ts +25 -0
  372. package/src/store/store.ts +579 -0
  373. package/src/store/temporalio.ts +54 -0
  374. package/src/store/worker.ts +19 -0
  375. package/src/store/workflow.test.ts +578 -0
  376. package/src/store/workflow.ts +973 -0
  377. package/src/sts-token-types.ts +117 -0
  378. package/src/tenant.ts +10 -0
  379. package/src/tool-execution.ts +47 -0
  380. package/src/training.ts +44 -0
  381. package/src/transient-tokens.ts +30 -0
  382. package/src/user.ts +153 -0
  383. package/src/utils/auth.ts +12 -0
  384. package/src/utils/schemas.ts +108 -0
  385. package/src/utils/type-helpers.ts +6 -0
  386. package/src/versions.ts +3 -0
  387. package/src/workflow-analytics.ts +925 -0
  388. package/tsconfig.dist.json +20 -0
@@ -0,0 +1,578 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ AgentMessageType,
4
+ AgentMessage,
5
+ CompactMessage,
6
+ normalizeMessageType,
7
+ toCompactMessage,
8
+ toAgentMessage,
9
+ parseMessage,
10
+ isCompactMessage,
11
+ isLegacyMessage,
12
+ createCompactMessage,
13
+ } from './workflow.js';
14
+
15
+ describe('CompactMessage converters', () => {
16
+ describe('normalizeMessageType', () => {
17
+ it('handles integer values (current format)', () => {
18
+ expect(normalizeMessageType(0)).toBe(AgentMessageType.SYSTEM);
19
+ expect(normalizeMessageType(1)).toBe(AgentMessageType.THOUGHT);
20
+ expect(normalizeMessageType(2)).toBe(AgentMessageType.PLAN);
21
+ expect(normalizeMessageType(3)).toBe(AgentMessageType.UPDATE);
22
+ expect(normalizeMessageType(4)).toBe(AgentMessageType.COMPLETE);
23
+ expect(normalizeMessageType(5)).toBe(AgentMessageType.WARNING);
24
+ expect(normalizeMessageType(6)).toBe(AgentMessageType.ERROR);
25
+ expect(normalizeMessageType(7)).toBe(AgentMessageType.ANSWER);
26
+ expect(normalizeMessageType(8)).toBe(AgentMessageType.QUESTION);
27
+ expect(normalizeMessageType(9)).toBe(AgentMessageType.REQUEST_INPUT);
28
+ expect(normalizeMessageType(10)).toBe(AgentMessageType.IDLE);
29
+ expect(normalizeMessageType(11)).toBe(AgentMessageType.TERMINATED);
30
+ expect(normalizeMessageType(12)).toBe(AgentMessageType.STREAMING_CHUNK);
31
+ expect(normalizeMessageType(13)).toBe(AgentMessageType.BATCH_PROGRESS);
32
+ });
33
+
34
+ it('handles string values (legacy format)', () => {
35
+ expect(normalizeMessageType('system')).toBe(AgentMessageType.SYSTEM);
36
+ expect(normalizeMessageType('thought')).toBe(AgentMessageType.THOUGHT);
37
+ expect(normalizeMessageType('plan')).toBe(AgentMessageType.PLAN);
38
+ expect(normalizeMessageType('update')).toBe(AgentMessageType.UPDATE);
39
+ expect(normalizeMessageType('complete')).toBe(AgentMessageType.COMPLETE);
40
+ expect(normalizeMessageType('warning')).toBe(AgentMessageType.WARNING);
41
+ expect(normalizeMessageType('error')).toBe(AgentMessageType.ERROR);
42
+ expect(normalizeMessageType('answer')).toBe(AgentMessageType.ANSWER);
43
+ expect(normalizeMessageType('question')).toBe(AgentMessageType.QUESTION);
44
+ expect(normalizeMessageType('request_input')).toBe(AgentMessageType.REQUEST_INPUT);
45
+ expect(normalizeMessageType('idle')).toBe(AgentMessageType.IDLE);
46
+ expect(normalizeMessageType('terminated')).toBe(AgentMessageType.TERMINATED);
47
+ expect(normalizeMessageType('streaming_chunk')).toBe(AgentMessageType.STREAMING_CHUNK);
48
+ expect(normalizeMessageType('batch_progress')).toBe(AgentMessageType.BATCH_PROGRESS);
49
+ });
50
+
51
+ it('handles AgentMessageType enum values', () => {
52
+ expect(normalizeMessageType(AgentMessageType.SYSTEM)).toBe(AgentMessageType.SYSTEM);
53
+ expect(normalizeMessageType(AgentMessageType.ERROR)).toBe(AgentMessageType.ERROR);
54
+ expect(normalizeMessageType(AgentMessageType.ANSWER)).toBe(AgentMessageType.ANSWER);
55
+ });
56
+
57
+ it('returns UPDATE for unknown values', () => {
58
+ expect(normalizeMessageType(999)).toBe(AgentMessageType.UPDATE);
59
+ expect(normalizeMessageType('unknown')).toBe(AgentMessageType.UPDATE);
60
+ });
61
+ });
62
+
63
+ describe('isCompactMessage', () => {
64
+ it('returns true for compact messages', () => {
65
+ expect(isCompactMessage({ t: AgentMessageType.UPDATE })).toBe(true);
66
+ expect(isCompactMessage({ t: 0, m: 'test' })).toBe(true);
67
+ });
68
+
69
+ it('returns false for non-compact messages', () => {
70
+ expect(isCompactMessage({ type: AgentMessageType.UPDATE })).toBe(false);
71
+ expect(isCompactMessage(null)).toBe(false);
72
+ expect(isCompactMessage(undefined)).toBe(false);
73
+ expect(isCompactMessage('string')).toBe(false);
74
+ expect(isCompactMessage(123)).toBe(false);
75
+ });
76
+ });
77
+
78
+ describe('isLegacyMessage', () => {
79
+ it('returns true for legacy messages', () => {
80
+ expect(isLegacyMessage({ type: AgentMessageType.UPDATE })).toBe(true);
81
+ expect(isLegacyMessage({
82
+ type: AgentMessageType.ANSWER,
83
+ timestamp: 12345,
84
+ workflow_run_id: 'run-1',
85
+ message: 'test'
86
+ })).toBe(true);
87
+ });
88
+
89
+ it('returns false for compact messages', () => {
90
+ expect(isLegacyMessage({ t: AgentMessageType.UPDATE })).toBe(false);
91
+ // Has both type and t - compact takes precedence
92
+ expect(isLegacyMessage({ type: AgentMessageType.UPDATE, t: AgentMessageType.UPDATE })).toBe(false);
93
+ });
94
+
95
+ it('returns false for non-messages', () => {
96
+ expect(isLegacyMessage(null)).toBe(false);
97
+ expect(isLegacyMessage(undefined)).toBe(false);
98
+ expect(isLegacyMessage({})).toBe(false);
99
+ });
100
+ });
101
+
102
+ describe('toCompactMessage', () => {
103
+ it('converts basic legacy message', () => {
104
+ const legacy: AgentMessage = {
105
+ type: AgentMessageType.UPDATE,
106
+ timestamp: 1234567890,
107
+ workflow_run_id: 'run-123',
108
+ message: 'Test message',
109
+ };
110
+
111
+ const compact = toCompactMessage(legacy);
112
+
113
+ expect(compact.t).toBe(AgentMessageType.UPDATE);
114
+ expect(compact.m).toBe('Test message');
115
+ expect(compact.ts).toBe(1234567890);
116
+ expect(compact.w).toBeUndefined(); // main is default, not included
117
+ });
118
+
119
+ it('includes workstream_id when not main', () => {
120
+ const legacy: AgentMessage = {
121
+ type: AgentMessageType.THOUGHT,
122
+ timestamp: 1234567890,
123
+ workflow_run_id: 'run-123',
124
+ message: 'Thinking...',
125
+ workstream_id: 'research',
126
+ };
127
+
128
+ const compact = toCompactMessage(legacy);
129
+
130
+ expect(compact.w).toBe('research');
131
+ });
132
+
133
+ it('excludes workstream_id when main', () => {
134
+ const legacy: AgentMessage = {
135
+ type: AgentMessageType.UPDATE,
136
+ timestamp: 1234567890,
137
+ workflow_run_id: 'run-123',
138
+ message: 'Update',
139
+ workstream_id: 'main',
140
+ };
141
+
142
+ const compact = toCompactMessage(legacy);
143
+
144
+ expect(compact.w).toBeUndefined();
145
+ });
146
+
147
+ it('includes details for non-streaming messages', () => {
148
+ const legacy: AgentMessage = {
149
+ type: AgentMessageType.PLAN,
150
+ timestamp: 1234567890,
151
+ workflow_run_id: 'run-123',
152
+ message: 'Plan created',
153
+ details: { plan: [{ id: 1, goal: 'Step 1' }] },
154
+ };
155
+
156
+ const compact = toCompactMessage(legacy);
157
+
158
+ expect(compact.d).toEqual({ plan: [{ id: 1, goal: 'Step 1' }] });
159
+ });
160
+
161
+ it('handles streaming chunk with is_final flag', () => {
162
+ const legacy: AgentMessage = {
163
+ type: AgentMessageType.STREAMING_CHUNK,
164
+ timestamp: 1234567890,
165
+ workflow_run_id: 'run-123',
166
+ message: 'chunk content',
167
+ details: {
168
+ streaming_id: 'stream-1',
169
+ chunk_index: 5,
170
+ is_final: true,
171
+ },
172
+ };
173
+
174
+ const compact = toCompactMessage(legacy);
175
+
176
+ expect(compact.t).toBe(AgentMessageType.STREAMING_CHUNK);
177
+ expect(compact.m).toBe('chunk content');
178
+ expect(compact.f).toBe(1);
179
+ expect(compact.d).toBeUndefined(); // streaming_id and chunk_index removed
180
+ });
181
+
182
+ it('handles streaming chunk without is_final', () => {
183
+ const legacy: AgentMessage = {
184
+ type: AgentMessageType.STREAMING_CHUNK,
185
+ timestamp: 1234567890,
186
+ workflow_run_id: 'run-123',
187
+ message: 'chunk content',
188
+ details: {
189
+ streaming_id: 'stream-1',
190
+ chunk_index: 2,
191
+ is_final: false,
192
+ },
193
+ };
194
+
195
+ const compact = toCompactMessage(legacy);
196
+
197
+ expect(compact.f).toBeUndefined();
198
+ });
199
+
200
+ it('normalizes legacy string type values', () => {
201
+ // Simulate a message from Redis with old string type
202
+ const legacy = {
203
+ type: 'answer' as unknown as AgentMessageType,
204
+ timestamp: 1234567890,
205
+ workflow_run_id: 'run-123',
206
+ message: 'Response',
207
+ };
208
+
209
+ const compact = toCompactMessage(legacy);
210
+
211
+ expect(compact.t).toBe(AgentMessageType.ANSWER);
212
+ });
213
+
214
+ it('omits empty/undefined fields', () => {
215
+ const legacy: AgentMessage = {
216
+ type: AgentMessageType.IDLE,
217
+ timestamp: 0,
218
+ workflow_run_id: 'run-123',
219
+ message: '',
220
+ };
221
+
222
+ const compact = toCompactMessage(legacy);
223
+
224
+ expect(compact).toEqual({ t: AgentMessageType.IDLE });
225
+ expect(Object.keys(compact)).toEqual(['t']);
226
+ });
227
+ });
228
+
229
+ describe('toAgentMessage', () => {
230
+ it('converts compact message to legacy format', () => {
231
+ const compact: CompactMessage = {
232
+ t: AgentMessageType.ANSWER,
233
+ m: 'Hello world',
234
+ ts: 1234567890,
235
+ };
236
+
237
+ const legacy = toAgentMessage(compact, 'run-456');
238
+
239
+ expect(legacy.type).toBe(AgentMessageType.ANSWER);
240
+ expect(legacy.message).toBe('Hello world');
241
+ expect(legacy.timestamp).toBe(1234567890);
242
+ expect(legacy.workflow_run_id).toBe('run-456');
243
+ expect(legacy.workstream_id).toBe('main');
244
+ });
245
+
246
+ it('restores workstream_id', () => {
247
+ const compact: CompactMessage = {
248
+ t: AgentMessageType.UPDATE,
249
+ m: 'Working...',
250
+ w: 'analysis',
251
+ };
252
+
253
+ const legacy = toAgentMessage(compact, 'run-789');
254
+
255
+ expect(legacy.workstream_id).toBe('analysis');
256
+ });
257
+
258
+ it('provides defaults for missing fields', () => {
259
+ const compact: CompactMessage = {
260
+ t: AgentMessageType.SYSTEM,
261
+ };
262
+
263
+ const legacy = toAgentMessage(compact);
264
+
265
+ expect(legacy.message).toBe('');
266
+ expect(legacy.workflow_run_id).toBe('');
267
+ expect(legacy.workstream_id).toBe('main');
268
+ expect(legacy.timestamp).toBeGreaterThan(0); // Uses Date.now()
269
+ });
270
+
271
+ it('restores details', () => {
272
+ const compact: CompactMessage = {
273
+ t: AgentMessageType.BATCH_PROGRESS,
274
+ m: 'Processing batch',
275
+ d: { batch_id: 'batch-1', completed: 5, total: 10 },
276
+ };
277
+
278
+ const legacy = toAgentMessage(compact, 'run-1');
279
+
280
+ expect(legacy.details).toEqual({ batch_id: 'batch-1', completed: 5, total: 10 });
281
+ });
282
+
283
+ it('restores streaming chunk details with is_final', () => {
284
+ const compact: CompactMessage = {
285
+ t: AgentMessageType.STREAMING_CHUNK,
286
+ m: 'chunk text',
287
+ w: 'stream-workstream',
288
+ f: 1,
289
+ };
290
+
291
+ const legacy = toAgentMessage(compact, 'run-1');
292
+
293
+ expect(legacy.details).toEqual({
294
+ streaming_id: 'stream-workstream',
295
+ is_final: true,
296
+ });
297
+ });
298
+
299
+ it('restores streaming chunk details without is_final', () => {
300
+ const compact: CompactMessage = {
301
+ t: AgentMessageType.STREAMING_CHUNK,
302
+ m: 'chunk text',
303
+ };
304
+
305
+ const legacy = toAgentMessage(compact, 'run-1');
306
+
307
+ expect(legacy.details).toEqual({
308
+ streaming_id: 'main',
309
+ is_final: false,
310
+ });
311
+ });
312
+ });
313
+
314
+ describe('parseMessage', () => {
315
+ it('parses compact message from object', () => {
316
+ const input: CompactMessage = { t: AgentMessageType.UPDATE, m: 'Test' };
317
+
318
+ const result = parseMessage(input);
319
+
320
+ expect(result).toEqual(input);
321
+ });
322
+
323
+ it('parses compact message from JSON string', () => {
324
+ const input = JSON.stringify({ t: AgentMessageType.ERROR, m: 'Error occurred' });
325
+
326
+ const result = parseMessage(input);
327
+
328
+ expect(result.t).toBe(AgentMessageType.ERROR);
329
+ expect(result.m).toBe('Error occurred');
330
+ });
331
+
332
+ it('converts legacy message object to compact', () => {
333
+ const legacy: AgentMessage = {
334
+ type: AgentMessageType.COMPLETE,
335
+ timestamp: 1234567890,
336
+ workflow_run_id: 'run-1',
337
+ message: 'Done!',
338
+ };
339
+
340
+ const result = parseMessage(legacy);
341
+
342
+ expect(isCompactMessage(result)).toBe(true);
343
+ expect(result.t).toBe(AgentMessageType.COMPLETE);
344
+ expect(result.m).toBe('Done!');
345
+ });
346
+
347
+ it('converts legacy message JSON string to compact', () => {
348
+ const legacy = JSON.stringify({
349
+ type: AgentMessageType.WARNING,
350
+ timestamp: 1234567890,
351
+ workflow_run_id: 'run-1',
352
+ message: 'Warning message',
353
+ });
354
+
355
+ const result = parseMessage(legacy);
356
+
357
+ expect(isCompactMessage(result)).toBe(true);
358
+ expect(result.t).toBe(AgentMessageType.WARNING);
359
+ });
360
+
361
+ it('throws error for unknown format', () => {
362
+ expect(() => parseMessage({})).toThrow('Unknown message format');
363
+ expect(() => parseMessage({ foo: 'bar' })).toThrow('Unknown message format');
364
+ });
365
+
366
+ it('throws error for invalid JSON', () => {
367
+ expect(() => parseMessage('not json')).toThrow();
368
+ });
369
+ });
370
+
371
+ describe('createCompactMessage', () => {
372
+ it('creates minimal compact message', () => {
373
+ const msg = createCompactMessage(AgentMessageType.IDLE);
374
+
375
+ expect(msg).toEqual({ t: AgentMessageType.IDLE });
376
+ });
377
+
378
+ it('creates compact message with all options', () => {
379
+ const msg = createCompactMessage(AgentMessageType.PLAN, {
380
+ message: 'Plan created',
381
+ workstreamId: 'planning',
382
+ details: { steps: 5 },
383
+ timestamp: 1234567890,
384
+ });
385
+
386
+ expect(msg).toEqual({
387
+ t: AgentMessageType.PLAN,
388
+ m: 'Plan created',
389
+ w: 'planning',
390
+ d: { steps: 5 },
391
+ ts: 1234567890,
392
+ });
393
+ });
394
+
395
+ it('excludes workstreamId when main', () => {
396
+ const msg = createCompactMessage(AgentMessageType.UPDATE, {
397
+ message: 'Update',
398
+ workstreamId: 'main',
399
+ });
400
+
401
+ expect(msg.w).toBeUndefined();
402
+ });
403
+
404
+ it('sets is_final flag for streaming chunks', () => {
405
+ const msg = createCompactMessage(AgentMessageType.STREAMING_CHUNK, {
406
+ message: 'final chunk',
407
+ isFinal: true,
408
+ });
409
+
410
+ expect(msg.f).toBe(1);
411
+ });
412
+ });
413
+
414
+ describe('round-trip conversion', () => {
415
+ it('legacy -> compact -> legacy preserves essential data', () => {
416
+ const original: AgentMessage = {
417
+ type: AgentMessageType.ANSWER,
418
+ timestamp: 1234567890,
419
+ workflow_run_id: 'run-abc',
420
+ message: 'This is a long response from the AI assistant.',
421
+ workstream_id: 'conversation',
422
+ details: { sources: ['doc1', 'doc2'] },
423
+ };
424
+
425
+ const compact = toCompactMessage(original);
426
+ const restored = toAgentMessage(compact, original.workflow_run_id);
427
+
428
+ expect(restored.type).toBe(original.type);
429
+ expect(restored.timestamp).toBe(original.timestamp);
430
+ expect(restored.workflow_run_id).toBe(original.workflow_run_id);
431
+ expect(restored.message).toBe(original.message);
432
+ expect(restored.workstream_id).toBe(original.workstream_id);
433
+ expect(restored.details).toEqual(original.details);
434
+ });
435
+
436
+ it('compact -> legacy -> compact preserves essential data', () => {
437
+ const original: CompactMessage = {
438
+ t: AgentMessageType.THOUGHT,
439
+ m: 'Analyzing the problem...',
440
+ w: 'reasoning',
441
+ d: { confidence: 0.85 },
442
+ ts: 1234567890,
443
+ };
444
+
445
+ const legacy = toAgentMessage(original, 'run-xyz');
446
+ const restored = toCompactMessage(legacy);
447
+
448
+ expect(restored.t).toBe(original.t);
449
+ expect(restored.m).toBe(original.m);
450
+ expect(restored.w).toBe(original.w);
451
+ expect(restored.d).toEqual(original.d);
452
+ expect(restored.ts).toBe(original.ts);
453
+ });
454
+
455
+ it('handles all message types in round-trip', () => {
456
+ const messageTypes = [
457
+ AgentMessageType.SYSTEM,
458
+ AgentMessageType.THOUGHT,
459
+ AgentMessageType.PLAN,
460
+ AgentMessageType.UPDATE,
461
+ AgentMessageType.COMPLETE,
462
+ AgentMessageType.WARNING,
463
+ AgentMessageType.ERROR,
464
+ AgentMessageType.ANSWER,
465
+ AgentMessageType.QUESTION,
466
+ AgentMessageType.REQUEST_INPUT,
467
+ AgentMessageType.IDLE,
468
+ AgentMessageType.TERMINATED,
469
+ AgentMessageType.BATCH_PROGRESS,
470
+ ];
471
+
472
+ for (const type of messageTypes) {
473
+ const original: AgentMessage = {
474
+ type,
475
+ timestamp: 1234567890,
476
+ workflow_run_id: 'run-test',
477
+ message: `Test message for type ${type}`,
478
+ };
479
+
480
+ const compact = toCompactMessage(original);
481
+ const restored = toAgentMessage(compact, original.workflow_run_id);
482
+
483
+ expect(restored.type).toBe(type);
484
+ expect(restored.message).toBe(original.message);
485
+ }
486
+ });
487
+
488
+ it('streaming chunk round-trip preserves is_final', () => {
489
+ const original: AgentMessage = {
490
+ type: AgentMessageType.STREAMING_CHUNK,
491
+ timestamp: 1234567890,
492
+ workflow_run_id: 'run-stream',
493
+ message: 'Final chunk content',
494
+ workstream_id: 'stream-1',
495
+ details: {
496
+ streaming_id: 'stream-1',
497
+ chunk_index: 10,
498
+ is_final: true,
499
+ },
500
+ };
501
+
502
+ const compact = toCompactMessage(original);
503
+ const restored = toAgentMessage(compact, original.workflow_run_id);
504
+
505
+ expect(restored.type).toBe(AgentMessageType.STREAMING_CHUNK);
506
+ expect(restored.details?.is_final).toBe(true);
507
+ expect(restored.details?.streaming_id).toBe(original.workstream_id);
508
+ });
509
+ });
510
+
511
+ describe('edge cases', () => {
512
+ it('handles unicode and special characters', () => {
513
+ const original: AgentMessage = {
514
+ type: AgentMessageType.ANSWER,
515
+ timestamp: 1234567890,
516
+ workflow_run_id: 'run-1',
517
+ message: 'Unicode: 你好世界 🎉 émojis & spëcial chars <script>alert(1)</script>',
518
+ };
519
+
520
+ const compact = toCompactMessage(original);
521
+ const restored = toAgentMessage(compact, original.workflow_run_id);
522
+
523
+ expect(restored.message).toBe(original.message);
524
+ });
525
+
526
+ it('handles very long messages', () => {
527
+ const longMessage = 'A'.repeat(100000);
528
+ const original: AgentMessage = {
529
+ type: AgentMessageType.ANSWER,
530
+ timestamp: 1234567890,
531
+ workflow_run_id: 'run-1',
532
+ message: longMessage,
533
+ };
534
+
535
+ const compact = toCompactMessage(original);
536
+ const restored = toAgentMessage(compact, original.workflow_run_id);
537
+
538
+ expect(restored.message).toBe(longMessage);
539
+ expect(restored.message.length).toBe(100000);
540
+ });
541
+
542
+ it('handles null-like values in details', () => {
543
+ const original: AgentMessage = {
544
+ type: AgentMessageType.UPDATE,
545
+ timestamp: 1234567890,
546
+ workflow_run_id: 'run-1',
547
+ message: 'Update',
548
+ details: { value: null, empty: '', zero: 0, bool: false },
549
+ };
550
+
551
+ const compact = toCompactMessage(original);
552
+ const restored = toAgentMessage(compact, original.workflow_run_id);
553
+
554
+ expect(restored.details).toEqual(original.details);
555
+ });
556
+
557
+ it('handles nested object details', () => {
558
+ const original: AgentMessage = {
559
+ type: AgentMessageType.PLAN,
560
+ timestamp: 1234567890,
561
+ workflow_run_id: 'run-1',
562
+ message: 'Plan',
563
+ details: {
564
+ plan: [
565
+ { id: 1, goal: 'Step 1', instructions: ['Do this', 'Then that'] },
566
+ { id: 2, goal: 'Step 2', instructions: ['Final step'] },
567
+ ],
568
+ metadata: { version: 1, author: 'agent' },
569
+ },
570
+ };
571
+
572
+ const compact = toCompactMessage(original);
573
+ const restored = toAgentMessage(compact, original.workflow_run_id);
574
+
575
+ expect(restored.details).toEqual(original.details);
576
+ });
577
+ });
578
+ });