devchain-cli 0.22.0 → 0.23.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 (241) hide show
  1. package/dist/drizzle/0077_familiar_morbius.sql +6 -0
  2. package/dist/drizzle/0078_preserve_legacy_connection_ownership.sql +180 -0
  3. package/dist/drizzle/0079_premium_forgotten_one.sql +18 -0
  4. package/dist/drizzle/0080_lethal_thunderbolt_ross.sql +49 -0
  5. package/dist/drizzle/0081_early_kronos.sql +58 -0
  6. package/dist/drizzle/0082_huge_black_queen.sql +14 -0
  7. package/dist/drizzle/meta/0077_snapshot.json +6957 -0
  8. package/dist/drizzle/meta/0078_snapshot.json +6957 -0
  9. package/dist/drizzle/meta/0079_snapshot.json +7093 -0
  10. package/dist/drizzle/meta/0080_snapshot.json +7241 -0
  11. package/dist/drizzle/meta/0081_snapshot.json +7482 -0
  12. package/dist/drizzle/meta/0082_snapshot.json +7571 -0
  13. package/dist/drizzle/meta/_journal.json +42 -0
  14. package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
  15. package/dist/server/common/errors/error-types.d.ts +7 -0
  16. package/dist/server/common/errors/error-types.js +7 -1
  17. package/dist/server/common/errors/error-types.js.map +1 -1
  18. package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.d.ts +8 -0
  19. package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.js +67 -0
  20. package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.js.map +1 -0
  21. package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.d.ts +12 -0
  22. package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.js +322 -0
  23. package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.js.map +1 -0
  24. package/dist/server/modules/epic-time/epic-time.module.js +14 -4
  25. package/dist/server/modules/epic-time/epic-time.module.js.map +1 -1
  26. package/dist/server/modules/epic-time/models/epic-time-daily-allocator.d.ts +30 -0
  27. package/dist/server/modules/epic-time/models/epic-time-daily-allocator.js +125 -0
  28. package/dist/server/modules/epic-time/models/epic-time-daily-allocator.js.map +1 -0
  29. package/dist/server/modules/epic-time/models/epic-time-local-day.d.ts +9 -0
  30. package/dist/server/modules/epic-time/models/epic-time-local-day.js +164 -0
  31. package/dist/server/modules/epic-time/models/epic-time-local-day.js.map +1 -0
  32. package/dist/server/modules/epic-time/models/epic-time.models.d.ts +138 -0
  33. package/dist/server/modules/epic-time/models/epic-time.models.js +2 -0
  34. package/dist/server/modules/epic-time/models/epic-time.models.js.map +1 -1
  35. package/dist/server/modules/epic-time/services/agent-time-accounting.service.d.ts +1 -0
  36. package/dist/server/modules/epic-time/services/agent-time-accounting.service.js +31 -8
  37. package/dist/server/modules/epic-time/services/agent-time-accounting.service.js.map +1 -1
  38. package/dist/server/modules/epic-time/services/epic-estimate-logging.service.d.ts +37 -0
  39. package/dist/server/modules/epic-time/services/epic-estimate-logging.service.js +716 -0
  40. package/dist/server/modules/epic-time/services/epic-estimate-logging.service.js.map +1 -0
  41. package/dist/server/modules/epic-time/services/epic-time.service.d.ts +12 -3
  42. package/dist/server/modules/epic-time/services/epic-time.service.js +155 -69
  43. package/dist/server/modules/epic-time/services/epic-time.service.js.map +1 -1
  44. package/dist/server/modules/epic-time/services/epic-time.store.d.ts +29 -3
  45. package/dist/server/modules/epic-time/services/epic-time.store.js +524 -40
  46. package/dist/server/modules/epic-time/services/epic-time.store.js.map +1 -1
  47. package/dist/server/modules/epics/controllers/epics.controller.d.ts +10 -1
  48. package/dist/server/modules/epics/controllers/epics.controller.js +108 -2
  49. package/dist/server/modules/epics/controllers/epics.controller.js.map +1 -1
  50. package/dist/server/modules/epics/epics.module.js +8 -2
  51. package/dist/server/modules/epics/epics.module.js.map +1 -1
  52. package/dist/server/modules/epics/models/epic-relations.models.d.ts +34 -0
  53. package/dist/server/modules/epics/models/epic-relations.models.js +16 -0
  54. package/dist/server/modules/epics/models/epic-relations.models.js.map +1 -0
  55. package/dist/server/modules/epics/services/epic-relation-target-resolver.d.ts +8 -0
  56. package/dist/server/modules/epics/services/epic-relation-target-resolver.js +37 -0
  57. package/dist/server/modules/epics/services/epic-relation-target-resolver.js.map +1 -0
  58. package/dist/server/modules/epics/services/epic-relations.service.d.ts +52 -0
  59. package/dist/server/modules/epics/services/epic-relations.service.js +135 -0
  60. package/dist/server/modules/epics/services/epic-relations.service.js.map +1 -0
  61. package/dist/server/modules/epics/services/epics.service.d.ts +9 -2
  62. package/dist/server/modules/epics/services/epics.service.js +115 -11
  63. package/dist/server/modules/epics/services/epics.service.js.map +1 -1
  64. package/dist/server/modules/events/catalog/broadcast-registry.js +16 -0
  65. package/dist/server/modules/events/catalog/broadcast-registry.js.map +1 -1
  66. package/dist/server/modules/events/catalog/epic.relations.invalidated.d.ts +12 -0
  67. package/dist/server/modules/events/catalog/epic.relations.invalidated.js +13 -0
  68. package/dist/server/modules/events/catalog/epic.relations.invalidated.js.map +1 -0
  69. package/dist/server/modules/events/catalog/epic.time.scope.invalidated.d.ts +12 -0
  70. package/dist/server/modules/events/catalog/epic.time.scope.invalidated.js +13 -0
  71. package/dist/server/modules/events/catalog/epic.time.scope.invalidated.js.map +1 -0
  72. package/dist/server/modules/events/catalog/index.d.ts +27 -4
  73. package/dist/server/modules/events/catalog/index.js +6 -0
  74. package/dist/server/modules/events/catalog/index.js.map +1 -1
  75. package/dist/server/modules/events/catalog/integration.connection.created.d.ts +4 -1
  76. package/dist/server/modules/events/catalog/integration.connection.created.js +5 -2
  77. package/dist/server/modules/events/catalog/integration.connection.created.js.map +1 -1
  78. package/dist/server/modules/events/catalog/integration.connection.deleted.d.ts +4 -1
  79. package/dist/server/modules/events/catalog/integration.connection.deleted.js +5 -2
  80. package/dist/server/modules/events/catalog/integration.connection.deleted.js.map +1 -1
  81. package/dist/server/modules/events/catalog/integration.connection.legacy.d.ts +85 -0
  82. package/dist/server/modules/events/catalog/integration.connection.legacy.js +41 -0
  83. package/dist/server/modules/events/catalog/integration.connection.legacy.js.map +1 -0
  84. package/dist/server/modules/events/catalog/integration.connection.updated.d.ts +4 -1
  85. package/dist/server/modules/events/catalog/integration.connection.updated.js +5 -2
  86. package/dist/server/modules/events/catalog/integration.connection.updated.js.map +1 -1
  87. package/dist/server/modules/events/services/committed-event-replay.d.ts +10 -0
  88. package/dist/server/modules/events/services/committed-event-replay.js +30 -0
  89. package/dist/server/modules/events/services/committed-event-replay.js.map +1 -0
  90. package/dist/server/modules/events/services/committed-event.store.d.ts +1 -0
  91. package/dist/server/modules/events/services/committed-event.store.js +12 -7
  92. package/dist/server/modules/events/services/committed-event.store.js.map +1 -1
  93. package/dist/server/modules/events/services/durable-event-registry.service.d.ts +9 -2
  94. package/dist/server/modules/events/services/durable-event-registry.service.js.map +1 -1
  95. package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.d.ts +7 -0
  96. package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.js +158 -50
  97. package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.js.map +1 -1
  98. package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.d.ts +4 -0
  99. package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.js +73 -33
  100. package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.js.map +1 -1
  101. package/dist/server/modules/external-integrations/connections/integration-connections.controller.d.ts +6 -3
  102. package/dist/server/modules/external-integrations/connections/integration-connections.controller.js +67 -12
  103. package/dist/server/modules/external-integrations/connections/integration-connections.controller.js.map +1 -1
  104. package/dist/server/modules/external-integrations/connections/integration-connections.service.d.ts +35 -3
  105. package/dist/server/modules/external-integrations/connections/integration-connections.service.js +178 -17
  106. package/dist/server/modules/external-integrations/connections/integration-connections.service.js.map +1 -1
  107. package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.d.ts +6 -3
  108. package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.js +51 -11
  109. package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.js.map +1 -1
  110. package/dist/server/modules/external-integrations/external-integrations.module.js +6 -1
  111. package/dist/server/modules/external-integrations/external-integrations.module.js.map +1 -1
  112. package/dist/server/modules/external-integrations/models/external-edit-session.models.d.ts +1 -0
  113. package/dist/server/modules/external-integrations/models/external-provider.models.d.ts +6 -2
  114. package/dist/server/modules/external-integrations/models/external-provider.models.js +2 -3
  115. package/dist/server/modules/external-integrations/models/external-provider.models.js.map +1 -1
  116. package/dist/server/modules/external-integrations/models/external-time-mutation.models.d.ts +33 -2
  117. package/dist/server/modules/external-integrations/models/external-time-mutation.models.js +14 -0
  118. package/dist/server/modules/external-integrations/models/external-time-mutation.models.js.map +1 -1
  119. package/dist/server/modules/external-integrations/my-work/external-edit-session.service.d.ts +10 -9
  120. package/dist/server/modules/external-integrations/my-work/external-edit-session.service.js +81 -46
  121. package/dist/server/modules/external-integrations/my-work/external-edit-session.service.js.map +1 -1
  122. package/dist/server/modules/external-integrations/my-work/external-my-work.controller.d.ts +22 -20
  123. package/dist/server/modules/external-integrations/my-work/external-my-work.controller.js +136 -64
  124. package/dist/server/modules/external-integrations/my-work/external-my-work.controller.js.map +1 -1
  125. package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.d.ts +7 -0
  126. package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.js +289 -4
  127. package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.js.map +1 -1
  128. package/dist/server/modules/external-integrations/my-work/external-my-work.service.d.ts +12 -7
  129. package/dist/server/modules/external-integrations/my-work/external-my-work.service.js +114 -54
  130. package/dist/server/modules/external-integrations/my-work/external-my-work.service.js.map +1 -1
  131. package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.d.ts +19 -6
  132. package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.js +346 -46
  133. package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.js.map +1 -1
  134. package/dist/server/modules/external-integrations/sessions/external-edit-session.store.d.ts +2 -1
  135. package/dist/server/modules/external-integrations/sessions/external-edit-session.store.js +3 -2
  136. package/dist/server/modules/external-integrations/sessions/external-edit-session.store.js.map +1 -1
  137. package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.d.ts +6 -1
  138. package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.js +19 -0
  139. package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.js.map +1 -1
  140. package/dist/server/modules/external-integrations/sessions/provider-operation-gate.d.ts +15 -2
  141. package/dist/server/modules/external-integrations/sessions/provider-operation-gate.js +33 -6
  142. package/dist/server/modules/external-integrations/sessions/provider-operation-gate.js.map +1 -1
  143. package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.d.ts +13 -6
  144. package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.js +212 -75
  145. package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.js.map +1 -1
  146. package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.d.ts +13 -4
  147. package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.js +98 -0
  148. package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.js.map +1 -1
  149. package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.d.ts +10 -4
  150. package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.js +57 -18
  151. package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.js.map +1 -1
  152. package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +139 -0
  153. package/dist/server/modules/mcp/dtos/mcp.dto.js +41 -1
  154. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  155. package/dist/server/modules/mcp/services/handlers/epic-context.d.ts +2 -0
  156. package/dist/server/modules/mcp/services/handlers/epic-tools.d.ts +4 -0
  157. package/dist/server/modules/mcp/services/handlers/epic-tools.js +275 -0
  158. package/dist/server/modules/mcp/services/handlers/epic-tools.js.map +1 -1
  159. package/dist/server/modules/mcp/services/mcp-tool-binding.registry.d.ts +2 -1
  160. package/dist/server/modules/mcp/services/mcp-tool-binding.registry.js +13 -8
  161. package/dist/server/modules/mcp/services/mcp-tool-binding.registry.js.map +1 -1
  162. package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.d.ts +1 -1
  163. package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.js +1 -1
  164. package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.js.map +1 -1
  165. package/dist/server/modules/mcp/tool-descriptors/binding-types.d.ts +2 -0
  166. package/dist/server/modules/mcp/tool-descriptors/binding-types.js.map +1 -1
  167. package/dist/server/modules/mcp/tool-descriptors/epic.bindings.js +6 -0
  168. package/dist/server/modules/mcp/tool-descriptors/epic.bindings.js.map +1 -1
  169. package/dist/server/modules/mcp/tool-descriptors/epic.metadata.js +132 -0
  170. package/dist/server/modules/mcp/tool-descriptors/epic.metadata.js.map +1 -1
  171. package/dist/server/modules/projects/controllers/projects.controller.js +1 -4
  172. package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
  173. package/dist/server/modules/projects/projects.module.js +2 -0
  174. package/dist/server/modules/projects/projects.module.js.map +1 -1
  175. package/dist/server/modules/projects/services/projects.service.d.ts +4 -1
  176. package/dist/server/modules/projects/services/projects.service.js +23 -2
  177. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  178. package/dist/server/modules/providers/adapters/claude.adapter.d.ts +4 -2
  179. package/dist/server/modules/providers/adapters/claude.adapter.js +31 -0
  180. package/dist/server/modules/providers/adapters/claude.adapter.js.map +1 -1
  181. package/dist/server/modules/providers/services/provider-mcp-ensure.service.d.ts +7 -0
  182. package/dist/server/modules/providers/services/provider-mcp-ensure.service.js +69 -4
  183. package/dist/server/modules/providers/services/provider-mcp-ensure.service.js.map +1 -1
  184. package/dist/server/modules/session-reader/data/pricing.json +452 -56
  185. package/dist/server/modules/session-reader/services/session-reader.service.d.ts +2 -0
  186. package/dist/server/modules/session-reader/services/session-reader.service.js +85 -9
  187. package/dist/server/modules/session-reader/services/session-reader.service.js.map +1 -1
  188. package/dist/server/modules/session-reader/services/transcript-path-validator.service.js +8 -2
  189. package/dist/server/modules/session-reader/services/transcript-path-validator.service.js.map +1 -1
  190. package/dist/server/modules/session-reader/services/transcript-watcher.service.js +44 -17
  191. package/dist/server/modules/session-reader/services/transcript-watcher.service.js.map +1 -1
  192. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.d.ts +1 -0
  193. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js +1 -0
  194. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js.map +1 -1
  195. package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js +11 -1
  196. package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js.map +1 -1
  197. package/dist/server/modules/sessions/utils/claude-config.d.ts +4 -1
  198. package/dist/server/modules/sessions/utils/claude-config.js +265 -60
  199. package/dist/server/modules/sessions/utils/claude-config.js.map +1 -1
  200. package/dist/server/modules/storage/db/schema.d.ts +1109 -98
  201. package/dist/server/modules/storage/db/schema.js +141 -3
  202. package/dist/server/modules/storage/db/schema.js.map +1 -1
  203. package/dist/server/modules/storage/db/sqlite-json.d.ts +1 -0
  204. package/dist/server/modules/storage/db/sqlite-json.js +4 -0
  205. package/dist/server/modules/storage/db/sqlite-json.js.map +1 -1
  206. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +58 -10
  207. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  208. package/dist/server/modules/storage/local/delegates/epic.delegate.d.ts +30 -5
  209. package/dist/server/modules/storage/local/delegates/epic.delegate.js +718 -14
  210. package/dist/server/modules/storage/local/delegates/epic.delegate.js.map +1 -1
  211. package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.d.ts +52 -0
  212. package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.js +659 -0
  213. package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.js.map +1 -0
  214. package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.d.ts +2 -1
  215. package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.js +17 -4
  216. package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.js.map +1 -1
  217. package/dist/server/modules/storage/local/delegates/integration.delegate.d.ts +23 -8
  218. package/dist/server/modules/storage/local/delegates/integration.delegate.js +238 -52
  219. package/dist/server/modules/storage/local/delegates/integration.delegate.js.map +1 -1
  220. package/dist/server/modules/storage/local/delegates/project.delegate.d.ts +2 -0
  221. package/dist/server/modules/storage/local/delegates/project.delegate.js +180 -130
  222. package/dist/server/modules/storage/local/delegates/project.delegate.js.map +1 -1
  223. package/dist/server/modules/storage/local/local-storage.service.d.ts +45 -10
  224. package/dist/server/modules/storage/local/local-storage.service.js +99 -15
  225. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  226. package/dist/server/modules/storage/models/domain.models.d.ts +170 -0
  227. package/dist/server/modules/storage/models/domain.models.js +9 -0
  228. package/dist/server/modules/storage/models/domain.models.js.map +1 -1
  229. package/dist/server/templates/teams-dev.json +311 -301
  230. package/dist/server/tsconfig.tsbuildinfo +1 -1
  231. package/dist/server/ui/assets/{ExternalRichEditor-DMtnZIMZ.js → ExternalRichEditor-BG9SopK8.js} +1 -1
  232. package/dist/server/ui/assets/{ReviewDetailPage-BmyiM5IR.js → ReviewDetailPage-DNo7Qx3m.js} +1 -1
  233. package/dist/server/ui/assets/{ReviewsPage-CQ87BMwT.js → ReviewsPage-Cay-IObR.js} +1 -1
  234. package/dist/server/ui/assets/index-C1Fdqua-.js +1197 -0
  235. package/dist/server/ui/assets/index-CV8ydm7w.css +32 -0
  236. package/dist/server/ui/assets/{useReviewSubscription-DjbEUzt4.js → useReviewSubscription-sAAfh4k9.js} +1 -1
  237. package/dist/server/ui/index.html +2 -2
  238. package/dist/templates/teams-dev.json +311 -301
  239. package/package.json +19 -2
  240. package/dist/server/ui/assets/index-BX6Yze-A.js +0 -1177
  241. package/dist/server/ui/assets/index-qoQEv_u4.css +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"durable-event-registry.service.js","sourceRoot":"","sources":["../../../../src/modules/events/services/durable-event-registry.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,wCAAiF;AAwB1E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACrB,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEnF,QAAQ,CAAC,UAAkC;QACzC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,IAAA,0BAAgB,EAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,+BAA+B,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,yBAAyB,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,UAAU,GAAqC;YACnD,GAAG,UAAU;YACb,WAAW;YACX,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/C,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;SACrC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,SAAoB;QAClC,OAAO,IAAI,CAAC,cAAc,EAAE;aACzB,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;CACF,CAAA;AA/CY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;GACA,2BAA2B,CA+CvC"}
1
+ {"version":3,"file":"durable-event-registry.service.js","sourceRoot":"","sources":["../../../../src/modules/events/services/durable-event-registry.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,wCAAiF;AAiC1E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACrB,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEnF,QAAQ,CAAC,UAAkC;QACzC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,IAAA,0BAAgB,EAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,+BAA+B,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,yBAAyB,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,UAAU,GAAqC;YACnD,GAAG,UAAU;YACb,WAAW;YACX,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/C,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;SACrC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,SAAoB;QAClC,OAAO,IAAI,CAAC,cAAc,EAAE;aACzB,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;CACF,CAAA;AA/CY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;GACA,2BAA2B,CA+CvC"}
@@ -54,8 +54,13 @@ export declare class ClickUpExternalTaskProvider implements ExternalTaskProvider
54
54
  private addTaskComment;
55
55
  private loadTaskWorkspace;
56
56
  private createTimeEntry;
57
+ private confirmCreatedEntryExactly;
58
+ private provesExactTaskAssociation;
59
+ private isStrictClickUpTaskUrl;
57
60
  private isDocumentedCreateReceipt;
58
61
  private readTimeEntryExact;
62
+ private updateTimeEntry;
63
+ private assertTimeEntryEditable;
59
64
  private singularTimeEntryBody;
60
65
  private deleteTimeEntry;
61
66
  private listOwnTimeEntryIdsInRange;
@@ -71,6 +76,8 @@ export declare class ClickUpExternalTaskProvider implements ExternalTaskProvider
71
76
  private loadWorkspaces;
72
77
  private loadTaskPages;
73
78
  private normalizeTask;
79
+ private supplementalListMemberships;
80
+ private baseListWorkArea;
74
81
  private normalizeTaskSubtasks;
75
82
  private normalizeTaskSubtask;
76
83
  private optionalTaskParentId;
@@ -20,13 +20,13 @@ const clickup_comment_converter_2 = require("./rich/clickup-comment-converter");
20
20
  const safe_vendor_http_client_1 = require("../transport/safe-vendor-http-client");
21
21
  const vendor_shared_1 = require("./vendor-shared");
22
22
  const CLICKUP_ORIGIN = 'https://api.clickup.com';
23
+ const CLICKUP_TASK_URL_HOST = 'prod.clickup.com';
23
24
  const CLICKUP_TASK_PAGE_SIZE = 100;
24
25
  const CLICKUP_MAX_TASK_PAGES = 1_000;
25
26
  const CLICKUP_COMMENT_PAGE_SIZE = 25;
26
27
  const CLICKUP_SUBTASK_PAGE_SIZE = 100;
27
28
  const CLICKUP_SUBTASK_MAX_PAGES = 10;
28
- const CLICKUP_OWNERSHIP_PREFIX = 'DevChain ownership token: `';
29
- const CLICKUP_OWNERSHIP_SUFFIX = '`';
29
+ const CLICKUP_SOURCE_ID_MARKER_PATTERN = /^(?:([\s\S]*)\n\n)?SourceId: ([0-9a-f]{8})$/;
30
30
  const CLICKUP_COMMENT_CURSOR_PATTERN = /^[A-Za-z0-9_-]+$/;
31
31
  const CLICKUP_COMMENT_AUTHOR = {
32
32
  nameKey: 'username',
@@ -51,10 +51,12 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
51
51
  };
52
52
  timeEntryMutations = {
53
53
  createTimeEntry: (credentials, context, remoteTaskId, input) => this.createTimeEntry(credentials, context, remoteTaskId, input),
54
+ updateTimeEntry: (credentials, context, remoteTaskId, remoteEntryId, input) => this.updateTimeEntry(credentials, context, remoteTaskId, remoteEntryId, input),
54
55
  deleteTimeEntry: (credentials, context, remoteTaskId, remoteEntryId) => this.deleteTimeEntry(credentials, context, remoteTaskId, remoteEntryId),
55
56
  readTimeEntryExact: (credentials, context, remoteTaskId, remoteEntryId) => this.readTimeEntryExact(credentials, context, remoteTaskId, remoteEntryId),
56
57
  listOwnTimeEntryIdsInRange: (credentials, context, remoteTaskId, startedAfterMs, startedBeforeMs) => this.listOwnTimeEntryIdsInRange(credentials, context, remoteTaskId, startedAfterMs, startedBeforeMs),
57
58
  assertTimeEntryDeletable: (credentials, context, remoteTaskId, remoteEntryId) => this.assertTimeEntryDeletable(credentials, context, remoteTaskId, remoteEntryId),
59
+ assertTimeEntryEditable: (credentials, context, remoteTaskId, remoteEntryId) => this.assertTimeEntryEditable(credentials, context, remoteTaskId, remoteEntryId),
58
60
  };
59
61
  listMetadataCache = new vendor_shared_1.VendorMetadataCache(vendor_shared_1.WORK_AREA_METADATA_CACHE_MAX_ENTRIES);
60
62
  validate = (0, vendor_shared_1.createVendorValidators)((reason) => new external_provider_errors_1.ClickUpProviderError(reason));
@@ -264,33 +266,18 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
264
266
  };
265
267
  }
266
268
  managedMarkdown(description, ownershipToken) {
267
- const footer = `${external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE}\n\n${CLICKUP_OWNERSHIP_PREFIX}${ownershipToken}${CLICKUP_OWNERSHIP_SUFFIX}`;
268
- return description === null ? footer : `${description}\n\n${footer}`;
269
+ const marker = `SourceId: ${ownershipToken}`;
270
+ return description === null ? marker : `${description}\n\n${marker}`;
269
271
  }
270
272
  parseManagedMarkdown(value) {
271
273
  if (value === null || value === '') {
272
274
  return { description: null, ownershipToken: null };
273
275
  }
274
- const notePosition = value.lastIndexOf(`\n\n${external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE}\n\n`);
275
- const startsWithNote = value.startsWith(`${external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE}\n\n`);
276
- const markerStart = notePosition >= 0
277
- ? notePosition + 2 + external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE.length + 2
278
- : startsWithNote
279
- ? external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE.length + 2
280
- : -1;
281
- if (markerStart < 0 || !value.startsWith(CLICKUP_OWNERSHIP_PREFIX, markerStart)) {
282
- return { description: value || null, ownershipToken: null };
276
+ const match = CLICKUP_SOURCE_ID_MARKER_PATTERN.exec(value);
277
+ if (match === null) {
278
+ return { description: value, ownershipToken: null };
283
279
  }
284
- const tokenStart = markerStart + CLICKUP_OWNERSHIP_PREFIX.length;
285
- if (!value.endsWith(CLICKUP_OWNERSHIP_SUFFIX)) {
286
- return { description: value || null, ownershipToken: null };
287
- }
288
- const token = value.slice(tokenStart, -CLICKUP_OWNERSHIP_SUFFIX.length);
289
- if (!this.isSubtaskOwnershipToken(token)) {
290
- return { description: value || null, ownershipToken: null };
291
- }
292
- const description = notePosition > 0 ? value.slice(0, notePosition) : null;
293
- return { description: description || null, ownershipToken: token };
280
+ return { description: match[1] || null, ownershipToken: match[2] };
294
281
  }
295
282
  requireSubtaskTitle(value) {
296
283
  if (typeof value !== 'string' ||
@@ -310,8 +297,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
310
297
  return value;
311
298
  }
312
299
  isSubtaskOwnershipToken(value) {
313
- return (value.length <= external_provider_models_1.MAX_EXTERNAL_SUBTASK_OWNERSHIP_TOKEN_LENGTH &&
314
- /^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(value));
300
+ return external_provider_models_1.EXTERNAL_SUBTASK_SOURCE_ID_PATTERN.test(value);
315
301
  }
316
302
  requireSubtaskOwnershipToken(value) {
317
303
  if (typeof value !== 'string' || !this.isSubtaskOwnershipToken(value)) {
@@ -630,10 +616,10 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
630
616
  async createTimeEntry(credentials, _context, remoteTaskId, input) {
631
617
  const token = this.requireToken(credentials);
632
618
  const taskId = this.validate.requiredTaskId(remoteTaskId);
633
- const startedAt = this.validate.timeEntryInput(input);
619
+ const startedAtMs = this.validate.timeEntryInput(input);
634
620
  const workspaceId = await this.loadTaskWorkspace(token, taskId);
635
621
  const body = {
636
- start: startedAt,
622
+ start: startedAtMs,
637
623
  duration: input.durationMs,
638
624
  };
639
625
  if (input.note !== null) {
@@ -641,10 +627,70 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
641
627
  }
642
628
  body.tid = taskId;
643
629
  const payload = await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries`, { method: 'POST', body: JSON.stringify(body) });
644
- if (!(0, vendor_shared_1.isRecord)(payload) || !this.isDocumentedCreateReceipt(payload, taskId)) {
630
+ const receipt = this.singularTimeEntryBody(payload);
631
+ if (receipt !== null && this.isDocumentedCreateReceipt(receipt, taskId)) {
632
+ return { remoteEntryId: this.optionalIdentifier(receipt.id) };
633
+ }
634
+ const entryId = receipt !== null ? this.optionalIdentifier(receipt.id) : null;
635
+ if (entryId === null) {
645
636
  throw new external_provider_errors_1.ClickUpProviderError('invalid_response', undefined, true);
646
637
  }
647
- return { remoteEntryId: this.optionalIdentifier(payload.id) };
638
+ await this.confirmCreatedEntryExactly(token, workspaceId, entryId, taskId, startedAtMs, input.durationMs);
639
+ return { remoteEntryId: entryId };
640
+ }
641
+ async confirmCreatedEntryExactly(token, workspaceId, entryId, taskId, startedAtMs, durationMs) {
642
+ try {
643
+ const payload = await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries/${encodeURIComponent(entryId)}`);
644
+ const entry = this.singularTimeEntryBody(payload);
645
+ if (entry === null) {
646
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
647
+ }
648
+ const remoteId = this.optionalIdentifier(entry.id);
649
+ if (remoteId !== entryId) {
650
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
651
+ }
652
+ if (!this.provesExactTaskAssociation(entry, taskId)) {
653
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
654
+ }
655
+ if (this.numericValue(entry.start) !== startedAtMs) {
656
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
657
+ }
658
+ if (this.numericValue(entry.duration) !== durationMs) {
659
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
660
+ }
661
+ }
662
+ catch {
663
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response', undefined, true);
664
+ }
665
+ }
666
+ provesExactTaskAssociation(entry, taskId) {
667
+ if ((0, vendor_shared_1.isRecord)(entry.task)) {
668
+ const taskRemoteId = this.optionalIdentifier(entry.task.id);
669
+ if (taskRemoteId !== null && taskRemoteId === taskId) {
670
+ return true;
671
+ }
672
+ }
673
+ return this.isStrictClickUpTaskUrl(entry.task_url, taskId);
674
+ }
675
+ isStrictClickUpTaskUrl(value, taskId) {
676
+ if (typeof value !== 'string' || value === '') {
677
+ return false;
678
+ }
679
+ let url;
680
+ try {
681
+ url = new URL(value);
682
+ }
683
+ catch {
684
+ return false;
685
+ }
686
+ return (url.protocol === 'https:' &&
687
+ url.hostname === CLICKUP_TASK_URL_HOST &&
688
+ url.port === '' &&
689
+ url.username === '' &&
690
+ url.password === '' &&
691
+ url.pathname === `/t/${taskId}` &&
692
+ url.search === '' &&
693
+ url.hash === '');
648
694
  }
649
695
  isDocumentedCreateReceipt(payload, taskId) {
650
696
  if (!this.isNumericValue(payload.start) || !this.isNumericValue(payload.duration)) {
@@ -692,13 +738,45 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
692
738
  if (owner === null) {
693
739
  throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
694
740
  }
741
+ const description = entry.description;
742
+ if (description !== null && description !== undefined && typeof description !== 'string') {
743
+ throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
744
+ }
695
745
  return {
696
746
  remoteId,
697
747
  startedAt: new Date(this.numericValue(entry.start)).toISOString(),
698
748
  durationMs: this.numericValue(entry.duration),
749
+ note: description || null,
699
750
  owned: owner === ownerId,
700
751
  };
701
752
  }
753
+ async updateTimeEntry(credentials, _context, remoteTaskId, remoteEntryId, input) {
754
+ const token = this.requireToken(credentials);
755
+ const taskId = this.validate.requiredTaskId(remoteTaskId);
756
+ const entryId = this.validate.requiredIdentifier(remoteEntryId);
757
+ const startedAtMs = this.validate.timeEntryInput(input);
758
+ const workspaceId = await this.loadTaskWorkspace(token, taskId);
759
+ await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries/${encodeURIComponent(entryId)}`, {
760
+ method: 'PUT',
761
+ body: JSON.stringify({
762
+ start: startedAtMs,
763
+ end: startedAtMs + input.durationMs,
764
+ duration: input.durationMs,
765
+ description: input.note ?? '',
766
+ }),
767
+ });
768
+ }
769
+ async assertTimeEntryEditable(credentials, context, remoteTaskId, remoteEntryId) {
770
+ await this.assertTimeEntryDeletable(credentials, context, remoteTaskId, remoteEntryId);
771
+ const exact = await this.readTimeEntryExact(credentials, context, remoteTaskId, remoteEntryId);
772
+ if (exact === null) {
773
+ throw new external_provider_errors_1.ClickUpProviderError('not_found');
774
+ }
775
+ if (!exact.owned) {
776
+ throw new external_provider_errors_1.ClickUpProviderError('permission_denied');
777
+ }
778
+ return exact;
779
+ }
702
780
  singularTimeEntryBody(payload) {
703
781
  if (!(0, vendor_shared_1.isRecord)(payload)) {
704
782
  return null;
@@ -841,6 +919,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
841
919
  startedAt,
842
920
  note: note ? note.slice(0, external_provider_models_1.MAX_TIME_ENTRY_NOTE_LENGTH) : null,
843
921
  noteTruncated: note.length > external_provider_models_1.MAX_TIME_ENTRY_NOTE_LENGTH,
922
+ canEdit: true,
844
923
  canDelete: true,
845
924
  },
846
925
  running: false,
@@ -970,6 +1049,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
970
1049
  continue;
971
1050
  }
972
1051
  result.push(task);
1052
+ result.push(...this.supplementalListMemberships(value, workspace, task));
973
1053
  }
974
1054
  if (payload.tasks.length < CLICKUP_TASK_PAGE_SIZE) {
975
1055
  return result;
@@ -993,22 +1073,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
993
1073
  const remoteId = this.validate.requiredIdentifier(value.id);
994
1074
  const statusType = this.validate.requiredString(value.status.type).toLowerCase();
995
1075
  const completedAt = this.optionalTimestamp(value.date_done ?? value.date_closed);
996
- const workArea = {
997
- remoteId: this.validate.requiredIdentifier(value.list.id),
998
- scopeKey: workspace.id,
999
- name: this.validate.requiredString(value.list.name),
1000
- kind: 'list',
1001
- description: null,
1002
- assignedTaskCount: 0,
1003
- hierarchy: [{ kind: 'workspace', remoteId: workspace.id, name: workspace.name }],
1004
- workflow: { isOverridden: false, columns: [] },
1005
- refresh: {
1006
- state: 'error',
1007
- refreshedAt: null,
1008
- retryable: true,
1009
- retryAt: null,
1010
- },
1011
- };
1076
+ const workArea = this.baseListWorkArea(workspace, this.validate.requiredIdentifier(value.list.id), this.validate.requiredString(value.list.name));
1012
1077
  return {
1013
1078
  workArea,
1014
1079
  task: {
@@ -1029,6 +1094,45 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
1029
1094
  },
1030
1095
  };
1031
1096
  }
1097
+ supplementalListMemberships(value, workspace, home) {
1098
+ if (!Array.isArray(value.locations)) {
1099
+ return [];
1100
+ }
1101
+ const memberships = [];
1102
+ for (const location of value.locations) {
1103
+ if (!(0, vendor_shared_1.isRecord)(location)) {
1104
+ continue;
1105
+ }
1106
+ const remoteId = this.optionalIdentifier(location.id);
1107
+ const name = typeof location.name === 'string' ? location.name.trim() : '';
1108
+ if (remoteId === null || !name) {
1109
+ continue;
1110
+ }
1111
+ memberships.push({
1112
+ workArea: this.baseListWorkArea(workspace, remoteId, name),
1113
+ task: home.task,
1114
+ });
1115
+ }
1116
+ return memberships;
1117
+ }
1118
+ baseListWorkArea(workspace, remoteId, name) {
1119
+ return {
1120
+ remoteId,
1121
+ scopeKey: workspace.id,
1122
+ name,
1123
+ kind: 'list',
1124
+ description: null,
1125
+ assignedTaskCount: 0,
1126
+ hierarchy: [{ kind: 'workspace', remoteId: workspace.id, name: workspace.name }],
1127
+ workflow: { isOverridden: false, columns: [] },
1128
+ refresh: {
1129
+ state: 'error',
1130
+ refreshedAt: null,
1131
+ retryable: true,
1132
+ retryAt: null,
1133
+ },
1134
+ };
1135
+ }
1032
1136
  normalizeTaskSubtasks(value, parentRemoteTaskId) {
1033
1137
  if (value === null || value === undefined) {
1034
1138
  return { items: [], truncated: false };
@@ -1106,9 +1210,9 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
1106
1210
  }
1107
1211
  addTasks(tasks, additions) {
1108
1212
  for (const item of additions) {
1109
- const taskKey = `${item.workArea.scopeKey}:${item.task.remoteId}`;
1110
- if (!tasks.has(taskKey)) {
1111
- tasks.set(taskKey, item);
1213
+ const membershipKey = this.workAreaKey(item.workArea, item.task.remoteId);
1214
+ if (!tasks.has(membershipKey)) {
1215
+ tasks.set(membershipKey, item);
1112
1216
  }
1113
1217
  }
1114
1218
  }
@@ -1299,8 +1403,12 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
1299
1403
  }
1300
1404
  return url;
1301
1405
  }
1302
- workAreaKey(workArea) {
1303
- return JSON.stringify([workArea.scopeKey, workArea.remoteId]);
1406
+ workAreaKey(workArea, taskId) {
1407
+ const parts = [workArea.scopeKey, workArea.remoteId];
1408
+ if (taskId !== undefined) {
1409
+ parts.push(taskId);
1410
+ }
1411
+ return JSON.stringify(parts);
1304
1412
  }
1305
1413
  optionalDescription(value) {
1306
1414
  if (value === null || value === undefined || value === '') {