@gitgov/core 1.0.0

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 (469) hide show
  1. package/README.md +303 -0
  2. package/dist/scripts/compile-json-to-types.d.ts +11 -0
  3. package/dist/scripts/compile-json-to-types.d.ts.map +1 -0
  4. package/dist/scripts/compile-json-to-types.js +129 -0
  5. package/dist/scripts/compile-json-to-types.js.map +1 -0
  6. package/dist/scripts/diagnose-duplicates.d.ts +7 -0
  7. package/dist/scripts/diagnose-duplicates.d.ts.map +1 -0
  8. package/dist/scripts/diagnose-duplicates.js +72 -0
  9. package/dist/scripts/diagnose-duplicates.js.map +1 -0
  10. package/dist/scripts/generate-indexes.d.ts +22 -0
  11. package/dist/scripts/generate-indexes.d.ts.map +1 -0
  12. package/dist/scripts/generate-indexes.js +168 -0
  13. package/dist/scripts/generate-indexes.js.map +1 -0
  14. package/dist/scripts/sync-schemas.d.ts +10 -0
  15. package/dist/scripts/sync-schemas.d.ts.map +1 -0
  16. package/dist/scripts/sync-schemas.js +84 -0
  17. package/dist/scripts/sync-schemas.js.map +1 -0
  18. package/dist/scripts/sync-workflow-configs.d.ts +11 -0
  19. package/dist/scripts/sync-workflow-configs.d.ts.map +1 -0
  20. package/dist/scripts/sync-workflow-configs.js +61 -0
  21. package/dist/scripts/sync-workflow-configs.js.map +1 -0
  22. package/dist/scripts/update-diagram.d.ts +7 -0
  23. package/dist/scripts/update-diagram.d.ts.map +1 -0
  24. package/dist/scripts/update-diagram.js +47 -0
  25. package/dist/scripts/update-diagram.js.map +1 -0
  26. package/dist/scripts/validate-schemas.d.ts +18 -0
  27. package/dist/scripts/validate-schemas.d.ts.map +1 -0
  28. package/dist/scripts/validate-schemas.js +313 -0
  29. package/dist/scripts/validate-schemas.js.map +1 -0
  30. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts +2 -0
  31. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts.map +1 -0
  32. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js +507 -0
  33. package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js.map +1 -0
  34. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts +2 -0
  35. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts.map +1 -0
  36. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js +1282 -0
  37. package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js.map +1 -0
  38. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts +10 -0
  39. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts.map +1 -0
  40. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js +144 -0
  41. package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js.map +1 -0
  42. package/dist/src/adapters/backlog_adapter/index.d.ts +213 -0
  43. package/dist/src/adapters/backlog_adapter/index.d.ts.map +1 -0
  44. package/dist/src/adapters/backlog_adapter/index.js +924 -0
  45. package/dist/src/adapters/backlog_adapter/index.js.map +1 -0
  46. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts +2 -0
  47. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts.map +1 -0
  48. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js +505 -0
  49. package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js.map +1 -0
  50. package/dist/src/adapters/changelog_adapter/index.d.ts +101 -0
  51. package/dist/src/adapters/changelog_adapter/index.d.ts.map +1 -0
  52. package/dist/src/adapters/changelog_adapter/index.js +197 -0
  53. package/dist/src/adapters/changelog_adapter/index.js.map +1 -0
  54. package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts +2 -0
  55. package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts.map +1 -0
  56. package/dist/src/adapters/execution_adapter/execution_adapter.test.js +266 -0
  57. package/dist/src/adapters/execution_adapter/execution_adapter.test.js.map +1 -0
  58. package/dist/src/adapters/execution_adapter/index.d.ts +90 -0
  59. package/dist/src/adapters/execution_adapter/index.d.ts.map +1 -0
  60. package/dist/src/adapters/execution_adapter/index.js +150 -0
  61. package/dist/src/adapters/execution_adapter/index.js.map +1 -0
  62. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts +2 -0
  63. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts.map +1 -0
  64. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js +256 -0
  65. package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js.map +1 -0
  66. package/dist/src/adapters/feedback_adapter/index.d.ts +95 -0
  67. package/dist/src/adapters/feedback_adapter/index.d.ts.map +1 -0
  68. package/dist/src/adapters/feedback_adapter/index.js +192 -0
  69. package/dist/src/adapters/feedback_adapter/index.js.map +1 -0
  70. package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts +2 -0
  71. package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts.map +1 -0
  72. package/dist/src/adapters/identity_adapter/identity_adapter.test.js +624 -0
  73. package/dist/src/adapters/identity_adapter/identity_adapter.test.js.map +1 -0
  74. package/dist/src/adapters/identity_adapter/index.d.ts +82 -0
  75. package/dist/src/adapters/identity_adapter/index.d.ts.map +1 -0
  76. package/dist/src/adapters/identity_adapter/index.js +336 -0
  77. package/dist/src/adapters/identity_adapter/index.js.map +1 -0
  78. package/dist/src/adapters/index.d.ts +10 -0
  79. package/dist/src/adapters/index.d.ts.map +1 -0
  80. package/dist/src/adapters/index.js +10 -0
  81. package/dist/src/adapters/index.js.map +1 -0
  82. package/dist/src/adapters/indexer_adapter/index.d.ts +214 -0
  83. package/dist/src/adapters/indexer_adapter/index.d.ts.map +1 -0
  84. package/dist/src/adapters/indexer_adapter/index.js +643 -0
  85. package/dist/src/adapters/indexer_adapter/index.js.map +1 -0
  86. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts +2 -0
  87. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts.map +1 -0
  88. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js +409 -0
  89. package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js.map +1 -0
  90. package/dist/src/adapters/metrics_adapter/index.d.ts +189 -0
  91. package/dist/src/adapters/metrics_adapter/index.d.ts.map +1 -0
  92. package/dist/src/adapters/metrics_adapter/index.js +592 -0
  93. package/dist/src/adapters/metrics_adapter/index.js.map +1 -0
  94. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts +2 -0
  95. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts.map +1 -0
  96. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js +558 -0
  97. package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js.map +1 -0
  98. package/dist/src/adapters/project_adapter/index.d.ts +164 -0
  99. package/dist/src/adapters/project_adapter/index.d.ts.map +1 -0
  100. package/dist/src/adapters/project_adapter/index.js +445 -0
  101. package/dist/src/adapters/project_adapter/index.js.map +1 -0
  102. package/dist/src/adapters/project_adapter/project_adapter.test.d.ts +2 -0
  103. package/dist/src/adapters/project_adapter/project_adapter.test.d.ts.map +1 -0
  104. package/dist/src/adapters/project_adapter/project_adapter.test.js +627 -0
  105. package/dist/src/adapters/project_adapter/project_adapter.test.js.map +1 -0
  106. package/dist/src/adapters/workflow_methodology_adapter/index.d.ts +75 -0
  107. package/dist/src/adapters/workflow_methodology_adapter/index.d.ts.map +1 -0
  108. package/dist/src/adapters/workflow_methodology_adapter/index.js +205 -0
  109. package/dist/src/adapters/workflow_methodology_adapter/index.js.map +1 -0
  110. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts +2 -0
  111. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts.map +1 -0
  112. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js +463 -0
  113. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js.map +1 -0
  114. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts +2 -0
  115. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts.map +1 -0
  116. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js +287 -0
  117. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js.map +1 -0
  118. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts +2 -0
  119. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts.map +1 -0
  120. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js +278 -0
  121. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js.map +1 -0
  122. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_default.json +188 -0
  123. package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_scrum.json +284 -0
  124. package/dist/src/config_manager/config_manager.test.d.ts +2 -0
  125. package/dist/src/config_manager/config_manager.test.d.ts.map +1 -0
  126. package/dist/src/config_manager/config_manager.test.js +321 -0
  127. package/dist/src/config_manager/config_manager.test.js.map +1 -0
  128. package/dist/src/config_manager/index.d.ts +107 -0
  129. package/dist/src/config_manager/index.d.ts.map +1 -0
  130. package/dist/src/config_manager/index.js +192 -0
  131. package/dist/src/config_manager/index.js.map +1 -0
  132. package/dist/src/crypto/checksum.d.ts +6 -0
  133. package/dist/src/crypto/checksum.d.ts.map +1 -0
  134. package/dist/src/crypto/checksum.js +38 -0
  135. package/dist/src/crypto/checksum.js.map +1 -0
  136. package/dist/src/crypto/checksum.test.d.ts +2 -0
  137. package/dist/src/crypto/checksum.test.d.ts.map +1 -0
  138. package/dist/src/crypto/checksum.test.js +167 -0
  139. package/dist/src/crypto/checksum.test.js.map +1 -0
  140. package/dist/src/crypto/index.d.ts +3 -0
  141. package/dist/src/crypto/index.d.ts.map +1 -0
  142. package/dist/src/crypto/index.js +3 -0
  143. package/dist/src/crypto/index.js.map +1 -0
  144. package/dist/src/crypto/signatures.d.ts +24 -0
  145. package/dist/src/crypto/signatures.d.ts.map +1 -0
  146. package/dist/src/crypto/signatures.js +67 -0
  147. package/dist/src/crypto/signatures.js.map +1 -0
  148. package/dist/src/crypto/signatures.test.d.ts +2 -0
  149. package/dist/src/crypto/signatures.test.d.ts.map +1 -0
  150. package/dist/src/crypto/signatures.test.js +378 -0
  151. package/dist/src/crypto/signatures.test.js.map +1 -0
  152. package/dist/src/diagram_generator/diagram_generator.d.ts +76 -0
  153. package/dist/src/diagram_generator/diagram_generator.d.ts.map +1 -0
  154. package/dist/src/diagram_generator/diagram_generator.js +233 -0
  155. package/dist/src/diagram_generator/diagram_generator.js.map +1 -0
  156. package/dist/src/diagram_generator/graph_validator.d.ts +19 -0
  157. package/dist/src/diagram_generator/graph_validator.d.ts.map +1 -0
  158. package/dist/src/diagram_generator/graph_validator.js +98 -0
  159. package/dist/src/diagram_generator/graph_validator.js.map +1 -0
  160. package/dist/src/diagram_generator/index.d.ts +4 -0
  161. package/dist/src/diagram_generator/index.d.ts.map +1 -0
  162. package/dist/src/diagram_generator/index.js +4 -0
  163. package/dist/src/diagram_generator/index.js.map +1 -0
  164. package/dist/src/diagram_generator/mermaid_renderer.d.ts +82 -0
  165. package/dist/src/diagram_generator/mermaid_renderer.d.ts.map +1 -0
  166. package/dist/src/diagram_generator/mermaid_renderer.js +306 -0
  167. package/dist/src/diagram_generator/mermaid_renderer.js.map +1 -0
  168. package/dist/src/diagram_generator/relationship_analyzer.d.ts +116 -0
  169. package/dist/src/diagram_generator/relationship_analyzer.d.ts.map +1 -0
  170. package/dist/src/diagram_generator/relationship_analyzer.js +381 -0
  171. package/dist/src/diagram_generator/relationship_analyzer.js.map +1 -0
  172. package/dist/src/event_bus/event_bus.d.ts +110 -0
  173. package/dist/src/event_bus/event_bus.d.ts.map +1 -0
  174. package/dist/src/event_bus/event_bus.js +161 -0
  175. package/dist/src/event_bus/event_bus.js.map +1 -0
  176. package/dist/src/event_bus/event_bus.test.d.ts +2 -0
  177. package/dist/src/event_bus/event_bus.test.d.ts.map +1 -0
  178. package/dist/src/event_bus/event_bus.test.js +332 -0
  179. package/dist/src/event_bus/event_bus.test.js.map +1 -0
  180. package/dist/src/event_bus/event_bus_integration.test.d.ts +2 -0
  181. package/dist/src/event_bus/event_bus_integration.test.d.ts.map +1 -0
  182. package/dist/src/event_bus/event_bus_integration.test.js +474 -0
  183. package/dist/src/event_bus/event_bus_integration.test.js.map +1 -0
  184. package/dist/src/event_bus/index.d.ts +3 -0
  185. package/dist/src/event_bus/index.d.ts.map +1 -0
  186. package/dist/src/event_bus/index.js +3 -0
  187. package/dist/src/event_bus/index.js.map +1 -0
  188. package/dist/src/event_bus/types.d.ts +203 -0
  189. package/dist/src/event_bus/types.d.ts.map +1 -0
  190. package/dist/src/event_bus/types.js +5 -0
  191. package/dist/src/event_bus/types.js.map +1 -0
  192. package/dist/src/factories/actor_factory.d.ts +6 -0
  193. package/dist/src/factories/actor_factory.d.ts.map +1 -0
  194. package/dist/src/factories/actor_factory.js +25 -0
  195. package/dist/src/factories/actor_factory.js.map +1 -0
  196. package/dist/src/factories/actor_factory.test.d.ts +2 -0
  197. package/dist/src/factories/actor_factory.test.d.ts.map +1 -0
  198. package/dist/src/factories/actor_factory.test.js +169 -0
  199. package/dist/src/factories/actor_factory.test.js.map +1 -0
  200. package/dist/src/factories/agent_factory.d.ts +6 -0
  201. package/dist/src/factories/agent_factory.d.ts.map +1 -0
  202. package/dist/src/factories/agent_factory.js +25 -0
  203. package/dist/src/factories/agent_factory.js.map +1 -0
  204. package/dist/src/factories/agent_factory.test.d.ts +2 -0
  205. package/dist/src/factories/agent_factory.test.d.ts.map +1 -0
  206. package/dist/src/factories/agent_factory.test.js +199 -0
  207. package/dist/src/factories/agent_factory.test.js.map +1 -0
  208. package/dist/src/factories/changelog_factory.d.ts +9 -0
  209. package/dist/src/factories/changelog_factory.d.ts.map +1 -0
  210. package/dist/src/factories/changelog_factory.js +46 -0
  211. package/dist/src/factories/changelog_factory.js.map +1 -0
  212. package/dist/src/factories/changelog_factory.test.d.ts +2 -0
  213. package/dist/src/factories/changelog_factory.test.d.ts.map +1 -0
  214. package/dist/src/factories/changelog_factory.test.js +368 -0
  215. package/dist/src/factories/changelog_factory.test.js.map +1 -0
  216. package/dist/src/factories/cycle_factory.d.ts +6 -0
  217. package/dist/src/factories/cycle_factory.d.ts.map +1 -0
  218. package/dist/src/factories/cycle_factory.js +28 -0
  219. package/dist/src/factories/cycle_factory.js.map +1 -0
  220. package/dist/src/factories/cycle_factory.test.d.ts +2 -0
  221. package/dist/src/factories/cycle_factory.test.d.ts.map +1 -0
  222. package/dist/src/factories/cycle_factory.test.js +175 -0
  223. package/dist/src/factories/cycle_factory.test.js.map +1 -0
  224. package/dist/src/factories/execution_factory.d.ts +9 -0
  225. package/dist/src/factories/execution_factory.d.ts.map +1 -0
  226. package/dist/src/factories/execution_factory.js +29 -0
  227. package/dist/src/factories/execution_factory.js.map +1 -0
  228. package/dist/src/factories/execution_factory.test.d.ts +2 -0
  229. package/dist/src/factories/execution_factory.test.d.ts.map +1 -0
  230. package/dist/src/factories/execution_factory.test.js +207 -0
  231. package/dist/src/factories/execution_factory.test.js.map +1 -0
  232. package/dist/src/factories/feedback_factory.d.ts +9 -0
  233. package/dist/src/factories/feedback_factory.d.ts.map +1 -0
  234. package/dist/src/factories/feedback_factory.js +30 -0
  235. package/dist/src/factories/feedback_factory.js.map +1 -0
  236. package/dist/src/factories/feedback_factory.test.d.ts +2 -0
  237. package/dist/src/factories/feedback_factory.test.d.ts.map +1 -0
  238. package/dist/src/factories/feedback_factory.test.js +256 -0
  239. package/dist/src/factories/feedback_factory.test.js.map +1 -0
  240. package/dist/src/factories/index.d.ts +9 -0
  241. package/dist/src/factories/index.d.ts.map +1 -0
  242. package/dist/src/factories/index.js +9 -0
  243. package/dist/src/factories/index.js.map +1 -0
  244. package/dist/src/factories/task_factory.d.ts +6 -0
  245. package/dist/src/factories/task_factory.d.ts.map +1 -0
  246. package/dist/src/factories/task_factory.js +30 -0
  247. package/dist/src/factories/task_factory.js.map +1 -0
  248. package/dist/src/factories/task_factory.test.d.ts +2 -0
  249. package/dist/src/factories/task_factory.test.d.ts.map +1 -0
  250. package/dist/src/factories/task_factory.test.js +197 -0
  251. package/dist/src/factories/task_factory.test.js.map +1 -0
  252. package/dist/src/factories/workflow_methodology_factory.d.ts +11 -0
  253. package/dist/src/factories/workflow_methodology_factory.d.ts.map +1 -0
  254. package/dist/src/factories/workflow_methodology_factory.js +173 -0
  255. package/dist/src/factories/workflow_methodology_factory.js.map +1 -0
  256. package/dist/src/factories/workflow_methodology_factory.test.d.ts +2 -0
  257. package/dist/src/factories/workflow_methodology_factory.test.d.ts.map +1 -0
  258. package/dist/src/factories/workflow_methodology_factory.test.js +244 -0
  259. package/dist/src/factories/workflow_methodology_factory.test.js.map +1 -0
  260. package/dist/src/index.d.ts +21 -0
  261. package/dist/src/index.d.ts.map +1 -0
  262. package/dist/src/index.js +23 -0
  263. package/dist/src/index.js.map +1 -0
  264. package/dist/src/integration/cycles_tasks_integration.test.d.ts +2 -0
  265. package/dist/src/integration/cycles_tasks_integration.test.d.ts.map +1 -0
  266. package/dist/src/integration/cycles_tasks_integration.test.js +258 -0
  267. package/dist/src/integration/cycles_tasks_integration.test.js.map +1 -0
  268. package/dist/src/integration/schema_integration.test.d.ts +8 -0
  269. package/dist/src/integration/schema_integration.test.d.ts.map +1 -0
  270. package/dist/src/integration/schema_integration.test.js +279 -0
  271. package/dist/src/integration/schema_integration.test.js.map +1 -0
  272. package/dist/src/logger/index.d.ts +2 -0
  273. package/dist/src/logger/index.d.ts.map +1 -0
  274. package/dist/src/logger/index.js +2 -0
  275. package/dist/src/logger/index.js.map +1 -0
  276. package/dist/src/logger/logger.d.ts +10 -0
  277. package/dist/src/logger/logger.d.ts.map +1 -0
  278. package/dist/src/logger/logger.js +48 -0
  279. package/dist/src/logger/logger.js.map +1 -0
  280. package/dist/src/schemas/errors.d.ts +28 -0
  281. package/dist/src/schemas/errors.d.ts.map +1 -0
  282. package/dist/src/schemas/errors.js +31 -0
  283. package/dist/src/schemas/errors.js.map +1 -0
  284. package/dist/src/schemas/generated/actor_record_schema.json +91 -0
  285. package/dist/src/schemas/generated/agent_record_schema.json +142 -0
  286. package/dist/src/schemas/generated/changelog_record_schema.json +227 -0
  287. package/dist/src/schemas/generated/cycle_record_schema.json +80 -0
  288. package/dist/src/schemas/generated/embedded_metadata_schema.json +318 -0
  289. package/dist/src/schemas/generated/execution_record_schema.json +89 -0
  290. package/dist/src/schemas/generated/feedback_record_schema.json +83 -0
  291. package/dist/src/schemas/generated/index.d.ts +2221 -0
  292. package/dist/src/schemas/generated/index.d.ts.map +1 -0
  293. package/dist/src/schemas/generated/index.js +48 -0
  294. package/dist/src/schemas/generated/index.js.map +1 -0
  295. package/dist/src/schemas/generated/task_record_schema.json +103 -0
  296. package/dist/src/schemas/generated/workflow_methodology_record_schema.json +393 -0
  297. package/dist/src/schemas/index.d.ts +4 -0
  298. package/dist/src/schemas/index.d.ts.map +1 -0
  299. package/dist/src/schemas/index.js +4 -0
  300. package/dist/src/schemas/index.js.map +1 -0
  301. package/dist/src/schemas/schema_cache.d.ts +39 -0
  302. package/dist/src/schemas/schema_cache.d.ts.map +1 -0
  303. package/dist/src/schemas/schema_cache.js +109 -0
  304. package/dist/src/schemas/schema_cache.js.map +1 -0
  305. package/dist/src/schemas/schema_cache.test.d.ts +2 -0
  306. package/dist/src/schemas/schema_cache.test.d.ts.map +1 -0
  307. package/dist/src/schemas/schema_cache.test.js +163 -0
  308. package/dist/src/schemas/schema_cache.test.js.map +1 -0
  309. package/dist/src/store/index.d.ts +2 -0
  310. package/dist/src/store/index.d.ts.map +1 -0
  311. package/dist/src/store/index.js +2 -0
  312. package/dist/src/store/index.js.map +1 -0
  313. package/dist/src/store/record_store.d.ts +30 -0
  314. package/dist/src/store/record_store.d.ts.map +1 -0
  315. package/dist/src/store/record_store.js +83 -0
  316. package/dist/src/store/record_store.js.map +1 -0
  317. package/dist/src/store/record_store.test.d.ts +2 -0
  318. package/dist/src/store/record_store.test.d.ts.map +1 -0
  319. package/dist/src/store/record_store.test.js +646 -0
  320. package/dist/src/store/record_store.test.js.map +1 -0
  321. package/dist/src/types/common.types.d.ts +43 -0
  322. package/dist/src/types/common.types.d.ts.map +1 -0
  323. package/dist/src/types/common.types.js +13 -0
  324. package/dist/src/types/common.types.js.map +1 -0
  325. package/dist/src/types/embedded.types.d.ts +17 -0
  326. package/dist/src/types/embedded.types.d.ts.map +1 -0
  327. package/dist/src/types/embedded.types.js +2 -0
  328. package/dist/src/types/embedded.types.js.map +1 -0
  329. package/dist/src/types/generated/actor_record.d.ts +45 -0
  330. package/dist/src/types/generated/actor_record.d.ts.map +1 -0
  331. package/dist/src/types/generated/actor_record.js +7 -0
  332. package/dist/src/types/generated/actor_record.js.map +1 -0
  333. package/dist/src/types/generated/agent_record.d.ts +40 -0
  334. package/dist/src/types/generated/agent_record.d.ts.map +1 -0
  335. package/dist/src/types/generated/agent_record.js +7 -0
  336. package/dist/src/types/generated/agent_record.js.map +1 -0
  337. package/dist/src/types/generated/changelog_record.d.ts +100 -0
  338. package/dist/src/types/generated/changelog_record.d.ts.map +1 -0
  339. package/dist/src/types/generated/changelog_record.js +7 -0
  340. package/dist/src/types/generated/changelog_record.js.map +1 -0
  341. package/dist/src/types/generated/cycle_record.d.ts +36 -0
  342. package/dist/src/types/generated/cycle_record.d.ts.map +1 -0
  343. package/dist/src/types/generated/cycle_record.js +7 -0
  344. package/dist/src/types/generated/cycle_record.js.map +1 -0
  345. package/dist/src/types/generated/embedded_metadata.d.ts +94 -0
  346. package/dist/src/types/generated/embedded_metadata.d.ts.map +1 -0
  347. package/dist/src/types/generated/embedded_metadata.js +7 -0
  348. package/dist/src/types/generated/embedded_metadata.js.map +1 -0
  349. package/dist/src/types/generated/execution_record.d.ts +39 -0
  350. package/dist/src/types/generated/execution_record.d.ts.map +1 -0
  351. package/dist/src/types/generated/execution_record.js +7 -0
  352. package/dist/src/types/generated/execution_record.js.map +1 -0
  353. package/dist/src/types/generated/feedback_record.d.ts +43 -0
  354. package/dist/src/types/generated/feedback_record.d.ts.map +1 -0
  355. package/dist/src/types/generated/feedback_record.js +7 -0
  356. package/dist/src/types/generated/feedback_record.js.map +1 -0
  357. package/dist/src/types/generated/index.d.ts +15 -0
  358. package/dist/src/types/generated/index.d.ts.map +1 -0
  359. package/dist/src/types/generated/index.js +15 -0
  360. package/dist/src/types/generated/index.js.map +1 -0
  361. package/dist/src/types/generated/task_record.d.ts +47 -0
  362. package/dist/src/types/generated/task_record.d.ts.map +1 -0
  363. package/dist/src/types/generated/task_record.js +7 -0
  364. package/dist/src/types/generated/task_record.js.map +1 -0
  365. package/dist/src/types/generated/workflow_methodology_record.d.ts +211 -0
  366. package/dist/src/types/generated/workflow_methodology_record.d.ts.map +1 -0
  367. package/dist/src/types/generated/workflow_methodology_record.js +7 -0
  368. package/dist/src/types/generated/workflow_methodology_record.js.map +1 -0
  369. package/dist/src/types/index.d.ts +4 -0
  370. package/dist/src/types/index.d.ts.map +1 -0
  371. package/dist/src/types/index.js +4 -0
  372. package/dist/src/types/index.js.map +1 -0
  373. package/dist/src/utils/id_generator.d.ts +44 -0
  374. package/dist/src/utils/id_generator.d.ts.map +1 -0
  375. package/dist/src/utils/id_generator.js +107 -0
  376. package/dist/src/utils/id_generator.js.map +1 -0
  377. package/dist/src/utils/id_generator.test.d.ts +2 -0
  378. package/dist/src/utils/id_generator.test.d.ts.map +1 -0
  379. package/dist/src/utils/id_generator.test.js +100 -0
  380. package/dist/src/utils/id_generator.test.js.map +1 -0
  381. package/dist/src/utils/index.d.ts +2 -0
  382. package/dist/src/utils/index.d.ts.map +1 -0
  383. package/dist/src/utils/index.js +3 -0
  384. package/dist/src/utils/index.js.map +1 -0
  385. package/dist/src/validation/actor_validator.d.ts +21 -0
  386. package/dist/src/validation/actor_validator.d.ts.map +1 -0
  387. package/dist/src/validation/actor_validator.js +48 -0
  388. package/dist/src/validation/actor_validator.js.map +1 -0
  389. package/dist/src/validation/actor_validator.test.d.ts +2 -0
  390. package/dist/src/validation/actor_validator.test.d.ts.map +1 -0
  391. package/dist/src/validation/actor_validator.test.js +83 -0
  392. package/dist/src/validation/actor_validator.test.js.map +1 -0
  393. package/dist/src/validation/agent_validator.d.ts +30 -0
  394. package/dist/src/validation/agent_validator.d.ts.map +1 -0
  395. package/dist/src/validation/agent_validator.js +66 -0
  396. package/dist/src/validation/agent_validator.js.map +1 -0
  397. package/dist/src/validation/agent_validator.test.d.ts +2 -0
  398. package/dist/src/validation/agent_validator.test.d.ts.map +1 -0
  399. package/dist/src/validation/agent_validator.test.js +73 -0
  400. package/dist/src/validation/agent_validator.test.js.map +1 -0
  401. package/dist/src/validation/changelog_validator.d.ts +23 -0
  402. package/dist/src/validation/changelog_validator.d.ts.map +1 -0
  403. package/dist/src/validation/changelog_validator.js +58 -0
  404. package/dist/src/validation/changelog_validator.js.map +1 -0
  405. package/dist/src/validation/changelog_validator.test.d.ts +2 -0
  406. package/dist/src/validation/changelog_validator.test.d.ts.map +1 -0
  407. package/dist/src/validation/changelog_validator.test.js +401 -0
  408. package/dist/src/validation/changelog_validator.test.js.map +1 -0
  409. package/dist/src/validation/common.d.ts +10 -0
  410. package/dist/src/validation/common.d.ts.map +1 -0
  411. package/dist/src/validation/common.js +12 -0
  412. package/dist/src/validation/common.js.map +1 -0
  413. package/dist/src/validation/cycle_validator.d.ts +24 -0
  414. package/dist/src/validation/cycle_validator.d.ts.map +1 -0
  415. package/dist/src/validation/cycle_validator.js +51 -0
  416. package/dist/src/validation/cycle_validator.js.map +1 -0
  417. package/dist/src/validation/cycle_validator.test.d.ts +2 -0
  418. package/dist/src/validation/cycle_validator.test.d.ts.map +1 -0
  419. package/dist/src/validation/cycle_validator.test.js +182 -0
  420. package/dist/src/validation/cycle_validator.test.js.map +1 -0
  421. package/dist/src/validation/embedded_metadata_validator.d.ts +26 -0
  422. package/dist/src/validation/embedded_metadata_validator.d.ts.map +1 -0
  423. package/dist/src/validation/embedded_metadata_validator.js +122 -0
  424. package/dist/src/validation/embedded_metadata_validator.js.map +1 -0
  425. package/dist/src/validation/embedded_metadata_validator.test.d.ts +2 -0
  426. package/dist/src/validation/embedded_metadata_validator.test.d.ts.map +1 -0
  427. package/dist/src/validation/embedded_metadata_validator.test.js +316 -0
  428. package/dist/src/validation/embedded_metadata_validator.test.js.map +1 -0
  429. package/dist/src/validation/errors.d.ts +67 -0
  430. package/dist/src/validation/errors.d.ts.map +1 -0
  431. package/dist/src/validation/errors.js +83 -0
  432. package/dist/src/validation/errors.js.map +1 -0
  433. package/dist/src/validation/execution_validator.d.ts +23 -0
  434. package/dist/src/validation/execution_validator.d.ts.map +1 -0
  435. package/dist/src/validation/execution_validator.js +58 -0
  436. package/dist/src/validation/execution_validator.js.map +1 -0
  437. package/dist/src/validation/execution_validator.test.d.ts +2 -0
  438. package/dist/src/validation/execution_validator.test.d.ts.map +1 -0
  439. package/dist/src/validation/execution_validator.test.js +167 -0
  440. package/dist/src/validation/execution_validator.test.js.map +1 -0
  441. package/dist/src/validation/feedback_validator.d.ts +23 -0
  442. package/dist/src/validation/feedback_validator.d.ts.map +1 -0
  443. package/dist/src/validation/feedback_validator.js +58 -0
  444. package/dist/src/validation/feedback_validator.js.map +1 -0
  445. package/dist/src/validation/feedback_validator.test.d.ts +2 -0
  446. package/dist/src/validation/feedback_validator.test.d.ts.map +1 -0
  447. package/dist/src/validation/feedback_validator.test.js +131 -0
  448. package/dist/src/validation/feedback_validator.test.js.map +1 -0
  449. package/dist/src/validation/index.d.ts +11 -0
  450. package/dist/src/validation/index.d.ts.map +1 -0
  451. package/dist/src/validation/index.js +10 -0
  452. package/dist/src/validation/index.js.map +1 -0
  453. package/dist/src/validation/task_validator.d.ts +24 -0
  454. package/dist/src/validation/task_validator.d.ts.map +1 -0
  455. package/dist/src/validation/task_validator.js +50 -0
  456. package/dist/src/validation/task_validator.js.map +1 -0
  457. package/dist/src/validation/task_validator.test.d.ts +2 -0
  458. package/dist/src/validation/task_validator.test.d.ts.map +1 -0
  459. package/dist/src/validation/task_validator.test.js +185 -0
  460. package/dist/src/validation/task_validator.test.js.map +1 -0
  461. package/dist/src/validation/workflow_methodology_validator.d.ts +32 -0
  462. package/dist/src/validation/workflow_methodology_validator.d.ts.map +1 -0
  463. package/dist/src/validation/workflow_methodology_validator.js +91 -0
  464. package/dist/src/validation/workflow_methodology_validator.js.map +1 -0
  465. package/dist/src/validation/workflow_methodology_validator.test.d.ts +2 -0
  466. package/dist/src/validation/workflow_methodology_validator.test.d.ts.map +1 -0
  467. package/dist/src/validation/workflow_methodology_validator.test.js +229 -0
  468. package/dist/src/validation/workflow_methodology_validator.test.js.map +1 -0
  469. package/package.json +63 -0
@@ -0,0 +1,624 @@
1
+ import { IdentityAdapter } from './index';
2
+ import { RecordStore } from '../../store/record_store';
3
+ import { createActorRecord } from '../../factories/actor_factory';
4
+ import { validateFullActorRecord } from '../../validation/actor_validator';
5
+ import { createAgentRecord } from '../../factories/agent_factory';
6
+ import { validateFullAgentRecord } from '../../validation/agent_validator';
7
+ import { generateKeys, signPayload } from '../../crypto/signatures';
8
+ import { calculatePayloadChecksum } from '../../crypto/checksum';
9
+ import { generateActorId } from '../../utils/id_generator';
10
+ // Mock all dependencies
11
+ jest.mock('../../factories/actor_factory');
12
+ jest.mock('../../validation/actor_validator');
13
+ jest.mock('../../factories/agent_factory');
14
+ jest.mock('../../validation/agent_validator');
15
+ jest.mock('../../crypto/signatures');
16
+ jest.mock('../../crypto/checksum');
17
+ jest.mock('../../utils/id_generator');
18
+ const mockedCreateActorRecord = createActorRecord;
19
+ const mockedValidateFullActorRecord = validateFullActorRecord;
20
+ const mockedCreateAgentRecord = createAgentRecord;
21
+ const mockedValidateFullAgentRecord = validateFullAgentRecord;
22
+ const mockedGenerateKeys = generateKeys;
23
+ const mockedSignPayload = signPayload;
24
+ const mockedCalculatePayloadChecksum = calculatePayloadChecksum;
25
+ const mockedGenerateActorId = generateActorId;
26
+ describe('IdentityAdapter - ActorRecord Operations', () => {
27
+ let identityAdapter;
28
+ let identityAdapterWithEvents;
29
+ let mockActorStore;
30
+ let mockAgentStore;
31
+ let mockEventBus;
32
+ beforeEach(() => {
33
+ jest.clearAllMocks();
34
+ // Create mock store instances
35
+ mockActorStore = {
36
+ read: jest.fn(),
37
+ write: jest.fn(),
38
+ delete: jest.fn(),
39
+ list: jest.fn(),
40
+ exists: jest.fn(),
41
+ };
42
+ mockAgentStore = {
43
+ read: jest.fn(),
44
+ write: jest.fn(),
45
+ delete: jest.fn(),
46
+ list: jest.fn(),
47
+ exists: jest.fn(),
48
+ };
49
+ // Create mock event bus
50
+ mockEventBus = {
51
+ publish: jest.fn(),
52
+ subscribe: jest.fn().mockReturnValue({ id: 'mock-subscription', eventType: '', handler: jest.fn() }),
53
+ unsubscribe: jest.fn().mockReturnValue(true),
54
+ getSubscriptions: jest.fn().mockReturnValue([]),
55
+ clearSubscriptions: jest.fn(),
56
+ };
57
+ // Create IdentityAdapter without events (graceful degradation)
58
+ identityAdapter = new IdentityAdapter({
59
+ actorStore: mockActorStore,
60
+ agentStore: mockAgentStore,
61
+ });
62
+ // Create IdentityAdapter with events
63
+ identityAdapterWithEvents = new IdentityAdapter({
64
+ actorStore: mockActorStore,
65
+ agentStore: mockAgentStore,
66
+ eventBus: mockEventBus,
67
+ });
68
+ });
69
+ const sampleActorPayload = {
70
+ id: 'human:test-user',
71
+ type: 'human',
72
+ displayName: 'Test User',
73
+ publicKey: 'sample-public-key',
74
+ roles: ['author'],
75
+ status: 'active'
76
+ };
77
+ const sampleRecord = {
78
+ header: {
79
+ version: '1.0',
80
+ type: 'actor',
81
+ payloadChecksum: 'sample-checksum',
82
+ signatures: [{
83
+ keyId: 'human:test-user',
84
+ role: 'author',
85
+ signature: 'sample-signature',
86
+ timestamp: 1234567890,
87
+ timestamp_iso: '2023-01-01T00:00:00Z'
88
+ }]
89
+ },
90
+ payload: sampleActorPayload
91
+ };
92
+ describe('getActor', () => {
93
+ it('[EARS-1] should return ActorRecord when it exists', async () => {
94
+ mockActorStore.read.mockResolvedValue(sampleRecord);
95
+ const result = await identityAdapter.getActor('human:test-user');
96
+ expect(mockActorStore.read).toHaveBeenCalledWith('human:test-user');
97
+ expect(result).toEqual(sampleActorPayload);
98
+ });
99
+ it('[EARS-2] should return null when ActorRecord does not exist', async () => {
100
+ mockActorStore.read.mockResolvedValue(null);
101
+ const result = await identityAdapter.getActor('non-existent');
102
+ expect(mockActorStore.read).toHaveBeenCalledWith('non-existent');
103
+ expect(result).toBeNull();
104
+ });
105
+ });
106
+ describe('listActors', () => {
107
+ it('[EARS-3] should return all ActorRecords', async () => {
108
+ const actorIds = ['human:user1', 'human:user2'];
109
+ const record1 = { ...sampleRecord, payload: { ...sampleActorPayload, id: 'human:user1' } };
110
+ const record2 = { ...sampleRecord, payload: { ...sampleActorPayload, id: 'human:user2' } };
111
+ mockActorStore.list.mockResolvedValue(actorIds);
112
+ mockActorStore.read
113
+ .mockResolvedValueOnce(record1)
114
+ .mockResolvedValueOnce(record2);
115
+ const result = await identityAdapter.listActors();
116
+ expect(mockActorStore.list).toHaveBeenCalled();
117
+ expect(mockActorStore.read).toHaveBeenCalledTimes(2);
118
+ expect(result).toHaveLength(2);
119
+ expect(result[0]?.id).toBe('human:user1');
120
+ expect(result[1]?.id).toBe('human:user2');
121
+ });
122
+ it('[EARS-4] should return empty array when no actors exist', async () => {
123
+ mockActorStore.list.mockResolvedValue([]);
124
+ const result = await identityAdapter.listActors();
125
+ expect(mockActorStore.list).toHaveBeenCalled();
126
+ expect(result).toEqual([]);
127
+ });
128
+ });
129
+ describe('createActor', () => {
130
+ it('[EARS-5] should create a new ActorRecord with generated keys', async () => {
131
+ const inputPayload = {
132
+ type: 'human',
133
+ displayName: 'Test User',
134
+ roles: ['author']
135
+ };
136
+ // Mock all dependencies
137
+ mockedGenerateKeys.mockResolvedValue({
138
+ publicKey: 'generated-public-key',
139
+ privateKey: 'generated-private-key'
140
+ });
141
+ mockedGenerateActorId.mockReturnValue('human:test-user');
142
+ mockedCreateActorRecord.mockResolvedValue(sampleActorPayload);
143
+ mockedCalculatePayloadChecksum.mockReturnValue('calculated-checksum');
144
+ mockedSignPayload.mockReturnValue({
145
+ keyId: 'human:test-user',
146
+ role: 'author',
147
+ signature: 'generated-signature',
148
+ timestamp: 1234567890,
149
+ timestamp_iso: '2023-01-01T00:00:00Z'
150
+ });
151
+ mockedValidateFullActorRecord.mockResolvedValue(undefined);
152
+ mockActorStore.write.mockResolvedValue(undefined);
153
+ // Suppress console.warn for tests
154
+ const originalWarn = console.warn;
155
+ console.warn = jest.fn();
156
+ const result = await identityAdapter.createActor(inputPayload, 'human:test-user');
157
+ expect(mockedGenerateKeys).toHaveBeenCalled();
158
+ expect(mockedGenerateActorId).toHaveBeenCalledWith('human', 'Test User');
159
+ expect(mockedCreateActorRecord).toHaveBeenCalled();
160
+ expect(mockedCalculatePayloadChecksum).toHaveBeenCalled();
161
+ expect(mockedSignPayload).toHaveBeenCalled();
162
+ expect(mockedValidateFullActorRecord).toHaveBeenCalled();
163
+ expect(mockActorStore.write).toHaveBeenCalled();
164
+ expect(result).toEqual(sampleActorPayload);
165
+ // Restore console.warn
166
+ console.warn = originalWarn;
167
+ });
168
+ it('[EARS-6] should throw error when required fields are missing', async () => {
169
+ const invalidPayload = {
170
+ type: 'human',
171
+ // Missing displayName
172
+ };
173
+ await expect(identityAdapter.createActor(invalidPayload, 'signer'))
174
+ .rejects.toThrow('ActorRecord requires type and displayName');
175
+ });
176
+ });
177
+ describe('revokeActor', () => {
178
+ it('[EARS-7] should revoke an existing actor', async () => {
179
+ const existingRecord = { ...sampleRecord };
180
+ mockActorStore.read.mockResolvedValue(existingRecord);
181
+ mockActorStore.write.mockResolvedValue(undefined);
182
+ mockedCalculatePayloadChecksum.mockReturnValue('new-checksum');
183
+ const result = await identityAdapter.revokeActor('human:test-user');
184
+ expect(mockActorStore.read).toHaveBeenCalledWith('human:test-user');
185
+ expect(mockActorStore.write).toHaveBeenCalled();
186
+ expect(result.status).toBe('revoked');
187
+ });
188
+ it('[EARS-8] should throw error when actor does not exist', async () => {
189
+ mockActorStore.read.mockResolvedValue(null);
190
+ await expect(identityAdapter.revokeActor('non-existent'))
191
+ .rejects.toThrow('ActorRecord with id non-existent not found');
192
+ });
193
+ });
194
+ describe('signRecord', () => {
195
+ it('[EARS-9] should sign record with mock signature in MVP mode', async () => {
196
+ const mockRecord = {
197
+ header: {
198
+ version: '1.0',
199
+ type: 'task',
200
+ payloadChecksum: 'test',
201
+ signatures: [{
202
+ keyId: 'initial-signer',
203
+ role: 'author',
204
+ signature: 'initial-signature',
205
+ timestamp: 1234567890,
206
+ timestamp_iso: '2023-01-01T00:00:00Z'
207
+ }]
208
+ },
209
+ payload: sampleActorPayload // Use valid ActorRecord payload
210
+ };
211
+ // Mock actor exists
212
+ mockActorStore.read.mockResolvedValue(sampleRecord);
213
+ const signedRecord = await identityAdapter.signRecord(mockRecord, 'human:test-user', 'author');
214
+ // Should have 2 signatures: original + new mock signature
215
+ expect(signedRecord.header.signatures).toHaveLength(2);
216
+ // Check the new signature (second one)
217
+ const newSignature = signedRecord.header.signatures[1];
218
+ expect(newSignature).toBeDefined();
219
+ expect(newSignature.keyId).toBe('human:test-user');
220
+ expect(newSignature.role).toBe('author');
221
+ expect(newSignature.signature).toContain('mock-signature-');
222
+ expect(newSignature.timestamp).toBeGreaterThan(0);
223
+ expect(newSignature.timestamp_iso).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
224
+ // Check that payload checksum was updated
225
+ expect(signedRecord.header.payloadChecksum).toBeDefined();
226
+ });
227
+ it('[EARS-9] should throw error when actor not found', async () => {
228
+ const mockRecord = {
229
+ header: {
230
+ version: '1.0',
231
+ type: 'actor',
232
+ payloadChecksum: 'test',
233
+ signatures: [{
234
+ keyId: 'initial-signer',
235
+ role: 'author',
236
+ signature: 'initial-signature',
237
+ timestamp: 1234567890,
238
+ timestamp_iso: '2023-01-01T00:00:00Z'
239
+ }]
240
+ },
241
+ payload: sampleActorPayload
242
+ };
243
+ mockActorStore.read.mockResolvedValue(null);
244
+ await expect(identityAdapter.signRecord(mockRecord, 'non-existent', 'author'))
245
+ .rejects.toThrow('Actor not found: non-existent');
246
+ });
247
+ });
248
+ describe('rotateActorKey', () => {
249
+ it('[EARS-10] should throw error indicating complex operation not implemented', async () => {
250
+ await expect(identityAdapter.rotateActorKey('human:test-user'))
251
+ .rejects.toThrow('rotateActorKey not implemented yet - complex operation');
252
+ });
253
+ });
254
+ describe('authenticate', () => {
255
+ it('[EARS-11] should log warning for unimplemented method', async () => {
256
+ const originalWarn = console.warn;
257
+ console.warn = jest.fn();
258
+ await identityAdapter.authenticate('test-token');
259
+ expect(console.warn).toHaveBeenCalledWith('authenticate not fully implemented yet');
260
+ console.warn = originalWarn;
261
+ });
262
+ });
263
+ describe('AgentRecord operations', () => {
264
+ const sampleAgentPayload = {
265
+ id: 'agent:test-agent',
266
+ guild: 'design',
267
+ status: 'active',
268
+ engine: { type: 'local', runtime: 'typescript', entrypoint: 'test.ts', function: 'run' },
269
+ triggers: [{ type: 'manual' }],
270
+ knowledge_dependencies: [],
271
+ prompt_engine_requirements: {}
272
+ };
273
+ const sampleAgentRecord = {
274
+ header: {
275
+ version: '1.0',
276
+ type: 'agent',
277
+ payloadChecksum: 'sample-agent-checksum',
278
+ signatures: [{
279
+ keyId: 'agent:test-agent',
280
+ role: 'author',
281
+ signature: 'sample-agent-signature',
282
+ timestamp: 1234567890,
283
+ timestamp_iso: '2023-01-01T00:00:00Z'
284
+ }]
285
+ },
286
+ payload: sampleAgentPayload
287
+ };
288
+ const correspondingActorPayload = {
289
+ id: 'agent:test-agent',
290
+ type: 'agent',
291
+ displayName: 'Test Agent',
292
+ publicKey: 'agent-public-key',
293
+ roles: ['author'],
294
+ status: 'active'
295
+ };
296
+ const correspondingActorRecord = {
297
+ header: {
298
+ version: '1.0',
299
+ type: 'actor',
300
+ payloadChecksum: 'actor-checksum',
301
+ signatures: [{ keyId: 'agent:test-agent', role: 'author', signature: 'sig', timestamp: 123, timestamp_iso: '' }]
302
+ },
303
+ payload: correspondingActorPayload
304
+ };
305
+ describe('getAgentRecord', () => {
306
+ it('[EARS-12] should return AgentRecord when it exists', async () => {
307
+ mockAgentStore.read.mockResolvedValue(sampleAgentRecord);
308
+ const result = await identityAdapter.getAgentRecord('agent:test-agent');
309
+ expect(mockAgentStore.read).toHaveBeenCalledWith('agent:test-agent');
310
+ expect(result).toEqual(sampleAgentPayload);
311
+ });
312
+ it('[EARS-13] should return null when AgentRecord does not exist', async () => {
313
+ mockAgentStore.read.mockResolvedValue(null);
314
+ const result = await identityAdapter.getAgentRecord('agent:non-existent');
315
+ expect(mockAgentStore.read).toHaveBeenCalledWith('agent:non-existent');
316
+ expect(result).toBeNull();
317
+ });
318
+ });
319
+ describe('listAgentRecords', () => {
320
+ it('[EARS-14] should return all AgentRecords', async () => {
321
+ const agentIds = ['agent:agent1', 'agent:agent2'];
322
+ const record1 = { ...sampleAgentRecord, payload: { ...sampleAgentPayload, id: 'agent:agent1' } };
323
+ const record2 = { ...sampleAgentRecord, payload: { ...sampleAgentPayload, id: 'agent:agent2' } };
324
+ mockAgentStore.list.mockResolvedValue(agentIds);
325
+ mockAgentStore.read
326
+ .mockResolvedValueOnce(record1)
327
+ .mockResolvedValueOnce(record2);
328
+ const result = await identityAdapter.listAgentRecords();
329
+ expect(mockAgentStore.list).toHaveBeenCalled();
330
+ expect(mockAgentStore.read).toHaveBeenCalledTimes(2);
331
+ expect(result).toHaveLength(2);
332
+ expect(result[0]?.id).toBe('agent:agent1');
333
+ expect(result[1]?.id).toBe('agent:agent2');
334
+ });
335
+ it('[EARS-15] should return empty array when no agents exist', async () => {
336
+ mockAgentStore.list.mockResolvedValue([]);
337
+ const result = await identityAdapter.listAgentRecords();
338
+ expect(mockAgentStore.list).toHaveBeenCalled();
339
+ expect(result).toEqual([]);
340
+ });
341
+ });
342
+ describe('createAgentRecord', () => {
343
+ it('[EARS-16] should create a new AgentRecord when corresponding ActorRecord exists', async () => {
344
+ const inputPayload = {
345
+ id: 'agent:test-agent',
346
+ guild: 'design',
347
+ engine: { type: 'local', runtime: 'typescript', entrypoint: 'test.ts', function: 'run' }
348
+ };
349
+ // Mock dependencies
350
+ mockActorStore.read.mockResolvedValue(correspondingActorRecord);
351
+ mockedCreateAgentRecord.mockResolvedValue(sampleAgentPayload);
352
+ mockedCalculatePayloadChecksum.mockReturnValue('calculated-agent-checksum');
353
+ mockedSignPayload.mockReturnValue({
354
+ keyId: 'agent:test-agent',
355
+ role: 'author',
356
+ signature: 'generated-agent-signature',
357
+ timestamp: 1234567890,
358
+ timestamp_iso: '2023-01-01T00:00:00Z'
359
+ });
360
+ mockedValidateFullAgentRecord.mockResolvedValue(undefined);
361
+ mockAgentStore.write.mockResolvedValue(undefined);
362
+ const result = await identityAdapter.createAgentRecord(inputPayload);
363
+ expect(mockActorStore.read).toHaveBeenCalledWith('agent:test-agent');
364
+ expect(mockedCreateAgentRecord).toHaveBeenCalled();
365
+ expect(mockedCalculatePayloadChecksum).toHaveBeenCalled();
366
+ expect(mockedSignPayload).toHaveBeenCalled();
367
+ expect(mockedValidateFullAgentRecord).toHaveBeenCalled();
368
+ expect(mockAgentStore.write).toHaveBeenCalled();
369
+ expect(result).toEqual(sampleAgentPayload);
370
+ });
371
+ it('[EARS-17] should throw error when required fields are missing', async () => {
372
+ const invalidPayload = {
373
+ id: 'agent:test-agent',
374
+ // Missing guild and engine
375
+ };
376
+ await expect(identityAdapter.createAgentRecord(invalidPayload))
377
+ .rejects.toThrow('AgentRecord requires id, guild and engine');
378
+ });
379
+ it('[EARS-18] should throw error when corresponding ActorRecord does not exist', async () => {
380
+ const inputPayload = {
381
+ id: 'agent:non-existent',
382
+ guild: 'design',
383
+ engine: { type: 'local' }
384
+ };
385
+ mockActorStore.read.mockResolvedValue(null);
386
+ await expect(identityAdapter.createAgentRecord(inputPayload))
387
+ .rejects.toThrow('ActorRecord with id agent:non-existent not found. AgentRecord can only be created for existing ActorRecord.');
388
+ });
389
+ it('[EARS-19] should throw error when ActorRecord is not of type agent', async () => {
390
+ const inputPayload = {
391
+ id: 'human:test-user',
392
+ guild: 'design',
393
+ engine: { type: 'local' }
394
+ };
395
+ const humanActorRecord = {
396
+ ...correspondingActorRecord,
397
+ payload: { ...correspondingActorPayload, id: 'human:test-user', type: 'human' }
398
+ };
399
+ mockActorStore.read.mockResolvedValue(humanActorRecord);
400
+ await expect(identityAdapter.createAgentRecord(inputPayload))
401
+ .rejects.toThrow('ActorRecord with id human:test-user must be of type \'agent\' to create AgentRecord.');
402
+ });
403
+ });
404
+ });
405
+ describe('resolveCurrentActorId', () => {
406
+ it('[EARS-20] should return same ID for active actor', async () => {
407
+ const activeActor = { ...sampleActorPayload, status: 'active' };
408
+ mockActorStore.read.mockResolvedValue({
409
+ ...sampleRecord,
410
+ payload: activeActor
411
+ });
412
+ const result = await identityAdapter.resolveCurrentActorId('human:test-user');
413
+ expect(result).toBe('human:test-user');
414
+ expect(mockActorStore.read).toHaveBeenCalledWith('human:test-user');
415
+ });
416
+ it('[EARS-21] should follow succession chain for revoked actor', async () => {
417
+ const revokedActor = {
418
+ ...sampleActorPayload,
419
+ status: 'revoked',
420
+ supersededBy: 'human:test-user-v2'
421
+ };
422
+ const newActiveActor = {
423
+ ...sampleActorPayload,
424
+ id: 'human:test-user-v2',
425
+ status: 'active'
426
+ };
427
+ mockActorStore.read
428
+ .mockResolvedValueOnce({
429
+ ...sampleRecord,
430
+ payload: revokedActor
431
+ })
432
+ .mockResolvedValueOnce({
433
+ ...sampleRecord,
434
+ payload: newActiveActor
435
+ });
436
+ const result = await identityAdapter.resolveCurrentActorId('human:test-user');
437
+ expect(result).toBe('human:test-user-v2');
438
+ expect(mockActorStore.read).toHaveBeenCalledTimes(2);
439
+ expect(mockActorStore.read).toHaveBeenNthCalledWith(1, 'human:test-user');
440
+ expect(mockActorStore.read).toHaveBeenNthCalledWith(2, 'human:test-user-v2');
441
+ });
442
+ it('[EARS-22] should follow long succession chain', async () => {
443
+ const actor1 = { ...sampleActorPayload, status: 'revoked', supersededBy: 'human:test-user-v2' };
444
+ const actor2 = { ...sampleActorPayload, id: 'human:test-user-v2', status: 'revoked', supersededBy: 'human:test-user-v3' };
445
+ const actor3 = { ...sampleActorPayload, id: 'human:test-user-v3', status: 'active' };
446
+ mockActorStore.read
447
+ .mockResolvedValueOnce({ ...sampleRecord, payload: actor1 })
448
+ .mockResolvedValueOnce({ ...sampleRecord, payload: actor2 })
449
+ .mockResolvedValueOnce({ ...sampleRecord, payload: actor3 });
450
+ const result = await identityAdapter.resolveCurrentActorId('human:test-user');
451
+ expect(result).toBe('human:test-user-v3');
452
+ expect(mockActorStore.read).toHaveBeenCalledTimes(3);
453
+ });
454
+ });
455
+ describe('getEffectiveActorForAgent', () => {
456
+ it('[EARS-23] should return effective actor for agent with succession', async () => {
457
+ // Test the method by mocking resolveCurrentActorId and getActor separately
458
+ const newActiveAgentActor = {
459
+ ...sampleActorPayload,
460
+ id: 'agent:test-agent-v2',
461
+ type: 'agent',
462
+ status: 'active'
463
+ };
464
+ // Spy on the methods to control their behavior
465
+ jest.spyOn(identityAdapter, 'resolveCurrentActorId')
466
+ .mockResolvedValue('agent:test-agent-v2');
467
+ jest.spyOn(identityAdapter, 'getActor')
468
+ .mockResolvedValue(newActiveAgentActor);
469
+ const result = await identityAdapter.getEffectiveActorForAgent('agent:test-agent');
470
+ expect(result).toEqual(newActiveAgentActor);
471
+ expect(result?.id).toBe('agent:test-agent-v2');
472
+ expect(result?.status).toBe('active');
473
+ // Verify the method calls
474
+ expect(identityAdapter.resolveCurrentActorId).toHaveBeenCalledWith('agent:test-agent');
475
+ expect(identityAdapter.getActor).toHaveBeenCalledWith('agent:test-agent-v2');
476
+ });
477
+ });
478
+ describe('getCurrentActor', () => {
479
+ it('[EARS-24] should return actor from valid session resolving succession chain', async () => {
480
+ // Since the real ConfigManager is being used and returns 'human:camilo',
481
+ // we test with the actual session data
482
+ jest.spyOn(identityAdapter, 'resolveCurrentActorId')
483
+ .mockResolvedValue('human:camilo');
484
+ jest.spyOn(identityAdapter, 'getActor')
485
+ .mockResolvedValue(sampleActorPayload);
486
+ const result = await identityAdapter.getCurrentActor();
487
+ expect(result).toEqual(sampleActorPayload);
488
+ expect(identityAdapter.resolveCurrentActorId).toHaveBeenCalledWith('human:camilo');
489
+ expect(identityAdapter.getActor).toHaveBeenCalledWith('human:camilo');
490
+ });
491
+ it('[EARS-25] should return first active actor when no valid session', async () => {
492
+ // Mock ConfigManager with no session
493
+ const mockConfigManager = {
494
+ loadSession: jest.fn().mockResolvedValue(null)
495
+ };
496
+ jest.doMock('../../config_manager', () => ({
497
+ ConfigManager: jest.fn().mockImplementation(() => mockConfigManager)
498
+ }));
499
+ // Mock listActors to return active actor
500
+ jest.spyOn(identityAdapter, 'listActors')
501
+ .mockResolvedValue([
502
+ { ...sampleActorPayload, status: 'revoked' },
503
+ { ...sampleActorPayload, id: 'human:active-user', status: 'active' }
504
+ ]);
505
+ const result = await identityAdapter.getCurrentActor();
506
+ expect(result.id).toBe('human:active-user');
507
+ expect(result.status).toBe('active');
508
+ });
509
+ it('[EARS-26] should throw error when no active actors exist', async () => {
510
+ // Mock ConfigManager with no session
511
+ const mockConfigManager = {
512
+ loadSession: jest.fn().mockResolvedValue(null)
513
+ };
514
+ jest.doMock('../../config_manager', () => ({
515
+ ConfigManager: jest.fn().mockImplementation(() => mockConfigManager)
516
+ }));
517
+ // Mock listActors to return only revoked actors
518
+ jest.spyOn(identityAdapter, 'listActors')
519
+ .mockResolvedValue([
520
+ { ...sampleActorPayload, status: 'revoked' },
521
+ { ...sampleActorPayload, id: 'human:revoked-2', status: 'revoked' }
522
+ ]);
523
+ await expect(identityAdapter.getCurrentActor())
524
+ .rejects.toThrow("❌ No active actors found. Run 'gitgov init' first.");
525
+ });
526
+ });
527
+ describe('Event Emission', () => {
528
+ it('should emit actor.created event when creating actor with eventBus', async () => {
529
+ const inputPayload = {
530
+ type: 'human',
531
+ displayName: 'Test User',
532
+ roles: ['author']
533
+ };
534
+ // Mock dependencies
535
+ mockedGenerateKeys.mockResolvedValue({
536
+ publicKey: 'generated-public-key',
537
+ privateKey: 'generated-private-key'
538
+ });
539
+ mockedGenerateActorId.mockReturnValue('human:test-user');
540
+ mockedCreateActorRecord.mockResolvedValue(sampleActorPayload);
541
+ mockedCalculatePayloadChecksum.mockReturnValue('calculated-checksum');
542
+ mockedSignPayload.mockReturnValue({
543
+ keyId: 'human:test-user',
544
+ role: 'author',
545
+ signature: 'generated-signature',
546
+ timestamp: 1234567890,
547
+ timestamp_iso: '2023-01-01T00:00:00Z'
548
+ });
549
+ mockedValidateFullActorRecord.mockResolvedValue(undefined);
550
+ mockActorStore.write.mockResolvedValue(undefined);
551
+ mockActorStore.list.mockResolvedValue(['human:test-user']); // Only one actor (bootstrap)
552
+ // Suppress console.warn for tests
553
+ const originalWarn = console.warn;
554
+ console.warn = jest.fn();
555
+ await identityAdapterWithEvents.createActor(inputPayload, 'human:test-user');
556
+ // Verify event was published
557
+ expect(mockEventBus.publish).toHaveBeenCalledWith({
558
+ type: 'identity.actor.created',
559
+ timestamp: expect.any(Number),
560
+ source: 'identity_adapter',
561
+ payload: {
562
+ actorId: 'human:test-user',
563
+ type: 'human',
564
+ publicKey: 'sample-public-key',
565
+ roles: ['author'],
566
+ isBootstrap: true,
567
+ },
568
+ });
569
+ console.warn = originalWarn;
570
+ });
571
+ it('should emit actor.revoked event when revoking actor with eventBus', async () => {
572
+ const existingRecord = { ...sampleRecord };
573
+ mockActorStore.read.mockResolvedValue(existingRecord);
574
+ mockActorStore.write.mockResolvedValue(undefined);
575
+ mockedCalculatePayloadChecksum.mockReturnValue('new-checksum');
576
+ await identityAdapterWithEvents.revokeActor('human:test-user', 'admin', 'manual', 'human:test-user-v2');
577
+ // Verify event was published
578
+ expect(mockEventBus.publish).toHaveBeenCalledWith({
579
+ type: 'identity.actor.revoked',
580
+ timestamp: expect.any(Number),
581
+ source: 'identity_adapter',
582
+ payload: {
583
+ actorId: 'human:test-user',
584
+ revokedBy: 'admin',
585
+ supersededBy: 'human:test-user-v2',
586
+ revocationReason: 'manual',
587
+ },
588
+ });
589
+ });
590
+ it('should not emit events when eventBus is not provided (graceful degradation)', async () => {
591
+ const inputPayload = {
592
+ type: 'human',
593
+ displayName: 'Test User',
594
+ roles: ['author']
595
+ };
596
+ // Mock dependencies
597
+ mockedGenerateKeys.mockResolvedValue({
598
+ publicKey: 'generated-public-key',
599
+ privateKey: 'generated-private-key'
600
+ });
601
+ mockedGenerateActorId.mockReturnValue('human:test-user');
602
+ mockedCreateActorRecord.mockResolvedValue(sampleActorPayload);
603
+ mockedCalculatePayloadChecksum.mockReturnValue('calculated-checksum');
604
+ mockedSignPayload.mockReturnValue({
605
+ keyId: 'human:test-user',
606
+ role: 'author',
607
+ signature: 'generated-signature',
608
+ timestamp: 1234567890,
609
+ timestamp_iso: '2023-01-01T00:00:00Z'
610
+ });
611
+ mockedValidateFullActorRecord.mockResolvedValue(undefined);
612
+ mockActorStore.write.mockResolvedValue(undefined);
613
+ // Suppress console.warn for tests
614
+ const originalWarn = console.warn;
615
+ console.warn = jest.fn();
616
+ // Use adapter WITHOUT eventBus
617
+ await identityAdapter.createActor(inputPayload, 'human:test-user');
618
+ // Verify no events were published (graceful degradation)
619
+ expect(mockEventBus.publish).not.toHaveBeenCalled();
620
+ console.warn = originalWarn;
621
+ });
622
+ });
623
+ });
624
+ //# sourceMappingURL=identity_adapter.test.js.map