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
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allocateDailyEstimateExport = allocateDailyEstimateExport;
4
+ const epic_time_local_day_1 = require("./epic-time-local-day");
5
+ const MILLIS_PER_MINUTE = 60_000;
6
+ function toTotalsMap(entries, label) {
7
+ const map = new Map();
8
+ for (const entry of entries) {
9
+ if (!(0, epic_time_local_day_1.isValidActivityDate)(entry.activityDate)) {
10
+ throw new Error(`${label} contains an invalid activity date.`);
11
+ }
12
+ if (!Number.isSafeInteger(entry.minutes) || entry.minutes < 0) {
13
+ throw new Error(`${label} minutes must be nonnegative whole numbers.`);
14
+ }
15
+ map.set(entry.activityDate, (map.get(entry.activityDate) ?? 0) + entry.minutes);
16
+ }
17
+ return map;
18
+ }
19
+ function sumMinutes(values) {
20
+ let total = 0;
21
+ for (const value of values) {
22
+ total += value;
23
+ }
24
+ return total;
25
+ }
26
+ function requireCanonicalZone(zone) {
27
+ const canonical = (0, epic_time_local_day_1.canonicalizeEpicTimeZone)(zone);
28
+ if (!canonical) {
29
+ throw new Error('A valid IANA time zone is required.');
30
+ }
31
+ return canonical;
32
+ }
33
+ function blockedAllocation(status, rebaseline) {
34
+ return {
35
+ status,
36
+ totalNewMinutes: 0,
37
+ materializedCredit: [],
38
+ datedDeltas: [],
39
+ entryChunks: [],
40
+ rebaseline,
41
+ safeZoneRebind: false,
42
+ };
43
+ }
44
+ function buildEntryChunks(datedDeltas, timeZone) {
45
+ const chunks = [];
46
+ for (const delta of datedDeltas) {
47
+ const interval = (0, epic_time_local_day_1.resolveLocalDayInterval)(delta.activityDate, timeZone);
48
+ const maxChunkMinutes = Math.floor(interval.durationMs / MILLIS_PER_MINUTE);
49
+ if (maxChunkMinutes < 1) {
50
+ throw new Error(`The local day for ${delta.activityDate} fits no whole minutes.`);
51
+ }
52
+ let remainingMinutes = delta.minutes;
53
+ while (remainingMinutes > 0) {
54
+ const chunkMinutes = Math.min(remainingMinutes, maxChunkMinutes);
55
+ chunks.push({
56
+ activityDate: delta.activityDate,
57
+ startedAt: new Date(interval.startUtcMs).toISOString(),
58
+ durationMs: chunkMinutes * MILLIS_PER_MINUTE,
59
+ minutes: chunkMinutes,
60
+ });
61
+ remainingMinutes -= chunkMinutes;
62
+ }
63
+ }
64
+ return chunks;
65
+ }
66
+ function allocateDailyEstimateExport(input) {
67
+ const currentZone = requireCanonicalZone(input.currentCanonicalTimeZone);
68
+ const storedZone = input.storedCanonicalTimeZone === null
69
+ ? null
70
+ : requireCanonicalZone(input.storedCanonicalTimeZone);
71
+ const liveByDate = toTotalsMap(input.liveByDate, 'Live totals');
72
+ const capturedByDate = toTotalsMap(input.capturedByDate, 'Captured totals');
73
+ const ledgerByDate = toTotalsMap(input.ledgerByDate, 'Ledger totals');
74
+ if (!Number.isSafeInteger(input.unallocatedCreditMinutes) || input.unallocatedCreditMinutes < 0) {
75
+ throw new Error('Unallocated credit minutes must be a nonnegative whole number.');
76
+ }
77
+ const persistedTotal = sumMinutes(ledgerByDate.values()) + input.unallocatedCreditMinutes;
78
+ const liveTotal = sumMinutes(liveByDate.values());
79
+ const capturedTotal = sumMinutes(capturedByDate.values());
80
+ const zoneChanged = storedZone !== null && storedZone !== currentZone;
81
+ const hasDatedDeficit = [...ledgerByDate.entries()].some(([activityDate, ledgerMinutes]) => (liveByDate.get(activityDate) ?? 0) < ledgerMinutes);
82
+ const hasShrink = hasDatedDeficit || liveTotal < persistedTotal;
83
+ if (zoneChanged && hasShrink) {
84
+ return blockedAllocation('zone_rebind_required', {
85
+ required: true,
86
+ reason: 'zone_rebind',
87
+ });
88
+ }
89
+ if (hasShrink) {
90
+ return blockedAllocation('real_shrink', { required: true, reason: 'dated_deficit' });
91
+ }
92
+ const hasStaleCapture = capturedTotal < persistedTotal ||
93
+ [...ledgerByDate.entries()].some(([activityDate, ledgerMinutes]) => (capturedByDate.get(activityDate) ?? 0) < ledgerMinutes);
94
+ if (hasStaleCapture) {
95
+ return blockedAllocation('stale_capture', { required: false, reason: null });
96
+ }
97
+ const materializedCredit = [];
98
+ const datedDeltas = [];
99
+ let remainingCreditMinutes = input.unallocatedCreditMinutes;
100
+ const dates = [...new Set([...capturedByDate.keys(), ...ledgerByDate.keys()])].sort((left, right) => left.localeCompare(right));
101
+ for (const activityDate of dates) {
102
+ const capturedMinutes = capturedByDate.get(activityDate) ?? 0;
103
+ const ledgerMinutes = ledgerByDate.get(activityDate) ?? 0;
104
+ const uncoveredMinutes = Math.max(0, capturedMinutes - ledgerMinutes);
105
+ const placedMinutes = Math.min(remainingCreditMinutes, uncoveredMinutes);
106
+ if (placedMinutes > 0) {
107
+ materializedCredit.push({ activityDate, minutes: placedMinutes });
108
+ remainingCreditMinutes -= placedMinutes;
109
+ }
110
+ const deltaMinutes = capturedMinutes - ledgerMinutes - placedMinutes;
111
+ if (deltaMinutes > 0) {
112
+ datedDeltas.push({ activityDate, minutes: deltaMinutes });
113
+ }
114
+ }
115
+ return {
116
+ status: 'ok',
117
+ totalNewMinutes: sumMinutes(datedDeltas.map((delta) => delta.minutes)),
118
+ materializedCredit,
119
+ datedDeltas,
120
+ entryChunks: buildEntryChunks(datedDeltas, currentZone),
121
+ rebaseline: { required: false, reason: null },
122
+ safeZoneRebind: zoneChanged,
123
+ };
124
+ }
125
+ //# sourceMappingURL=epic-time-daily-allocator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-time-daily-allocator.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/models/epic-time-daily-allocator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface LocalDayInterval {
2
+ activityDate: string;
3
+ startUtcMs: number;
4
+ nextStartUtcMs: number;
5
+ durationMs: number;
6
+ }
7
+ export declare function isValidActivityDate(activityDate: string): boolean;
8
+ export declare function canonicalizeEpicTimeZone(requested: string): string | null;
9
+ export declare function resolveLocalDayInterval(activityDate: string, timeZone: string): LocalDayInterval;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidActivityDate = isValidActivityDate;
4
+ exports.canonicalizeEpicTimeZone = canonicalizeEpicTimeZone;
5
+ exports.resolveLocalDayInterval = resolveLocalDayInterval;
6
+ const MILLIS_PER_MINUTE = 60_000;
7
+ const MAX_ZONE_LENGTH = 128;
8
+ const FIXED_OFFSET_PATTERN = /^[+-]\d{2}:?\d{2}$/;
9
+ const ACTIVITY_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
10
+ const WALL_CLOCK_ITERATIONS = 3;
11
+ const DAY_BOUNDARY_SEARCH_WINDOW_MS = 26 * 3_600_000;
12
+ const DAY_BOUNDARY_SEARCH_PRECISION_MS = 1_000;
13
+ const partsFormatters = new Map();
14
+ function partsFormatter(timeZone) {
15
+ let formatter = partsFormatters.get(timeZone);
16
+ if (!formatter) {
17
+ formatter = new Intl.DateTimeFormat('en-US', {
18
+ timeZone,
19
+ hourCycle: 'h23',
20
+ year: 'numeric',
21
+ month: '2-digit',
22
+ day: '2-digit',
23
+ hour: '2-digit',
24
+ minute: '2-digit',
25
+ second: '2-digit',
26
+ });
27
+ partsFormatters.set(timeZone, formatter);
28
+ }
29
+ return formatter;
30
+ }
31
+ function zoneParts(utcMs, timeZone) {
32
+ const byType = new Map();
33
+ for (const part of partsFormatter(timeZone).formatToParts(new Date(utcMs))) {
34
+ byType.set(part.type, part.value);
35
+ }
36
+ return {
37
+ year: Number(byType.get('year')),
38
+ month: Number(byType.get('month')),
39
+ day: Number(byType.get('day')),
40
+ hour: Number(byType.get('hour')),
41
+ minute: Number(byType.get('minute')),
42
+ second: Number(byType.get('second')),
43
+ };
44
+ }
45
+ function localDateKey(utcMs, timeZone) {
46
+ const parts = zoneParts(utcMs, timeZone);
47
+ return `${pad2(parts.year)}-${pad2(parts.month)}-${pad2(parts.day)}`;
48
+ }
49
+ function pad2(value) {
50
+ return value < 10 ? `0${value}` : `${value}`;
51
+ }
52
+ function zoneOffsetMsAt(utcMs, timeZone) {
53
+ const parts = zoneParts(utcMs, timeZone);
54
+ return (Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second) - utcMs);
55
+ }
56
+ function wallClockToUtcMs(parts, timeZone) {
57
+ const targetMs = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);
58
+ let guessMs = targetMs;
59
+ for (let pass = 0; pass < WALL_CLOCK_ITERATIONS; pass += 1) {
60
+ const nextMs = targetMs - zoneOffsetMsAt(guessMs, timeZone);
61
+ if (nextMs === guessMs) {
62
+ break;
63
+ }
64
+ guessMs = nextMs;
65
+ }
66
+ return guessMs;
67
+ }
68
+ function firstInstantOfLocalDate(parts, timeZone) {
69
+ const targetKey = `${pad2(parts.year)}-${pad2(parts.month)}-${pad2(parts.day)}`;
70
+ const noonAnchorMs = wallClockToUtcMs({ ...parts, hour: 12, minute: 0, second: 0 }, timeZone);
71
+ if (localDateKey(noonAnchorMs, timeZone) !== targetKey) {
72
+ throw new Error('Unable to anchor the local day start.');
73
+ }
74
+ let lowerMs = noonAnchorMs - DAY_BOUNDARY_SEARCH_WINDOW_MS;
75
+ let upperMs = noonAnchorMs;
76
+ while (upperMs - lowerMs > DAY_BOUNDARY_SEARCH_PRECISION_MS) {
77
+ const midMs = lowerMs + Math.floor((upperMs - lowerMs) / 2);
78
+ if (localDateKey(midMs, timeZone) === targetKey) {
79
+ upperMs = midMs;
80
+ }
81
+ else {
82
+ lowerMs = midMs;
83
+ }
84
+ }
85
+ while (localDateKey(upperMs - 1, timeZone) === targetKey) {
86
+ upperMs -= 1;
87
+ }
88
+ return upperMs;
89
+ }
90
+ function localDayStartUtcMs(parts, timeZone) {
91
+ const guessMs = wallClockToUtcMs({ ...parts, hour: 0, minute: 0, second: 0 }, timeZone);
92
+ const guessParts = zoneParts(guessMs, timeZone);
93
+ if (guessParts.year === parts.year &&
94
+ guessParts.month === parts.month &&
95
+ guessParts.day === parts.day &&
96
+ guessParts.hour === 0 &&
97
+ guessParts.minute === 0 &&
98
+ guessParts.second === 0) {
99
+ return guessMs;
100
+ }
101
+ return firstInstantOfLocalDate(parts, timeZone);
102
+ }
103
+ function isValidActivityDate(activityDate) {
104
+ if (typeof activityDate !== 'string' || !ACTIVITY_DATE_PATTERN.test(activityDate)) {
105
+ return false;
106
+ }
107
+ const [year, month, day] = activityDate.split('-').map(Number);
108
+ const normalized = new Date(Date.UTC(year, month - 1, day));
109
+ return (normalized.getUTCFullYear() === year &&
110
+ normalized.getUTCMonth() === month - 1 &&
111
+ normalized.getUTCDate() === day);
112
+ }
113
+ function parseActivityDate(activityDate) {
114
+ if (!isValidActivityDate(activityDate)) {
115
+ throw new Error(`Invalid activity date: ${activityDate}`);
116
+ }
117
+ const [year, month, day] = activityDate.split('-').map(Number);
118
+ return { year, month, day, hour: 0, minute: 0, second: 0 };
119
+ }
120
+ function nextCalendarDate(parts) {
121
+ const next = new Date(Date.UTC(parts.year, parts.month - 1, parts.day + 1));
122
+ return {
123
+ year: next.getUTCFullYear(),
124
+ month: next.getUTCMonth() + 1,
125
+ day: next.getUTCDate(),
126
+ hour: 0,
127
+ minute: 0,
128
+ second: 0,
129
+ };
130
+ }
131
+ function canonicalizeEpicTimeZone(requested) {
132
+ try {
133
+ const normalized = requested.trim();
134
+ if (!normalized ||
135
+ normalized.length > MAX_ZONE_LENGTH ||
136
+ FIXED_OFFSET_PATTERN.test(normalized)) {
137
+ return null;
138
+ }
139
+ const resolved = new Intl.DateTimeFormat('en-US', {
140
+ timeZone: normalized,
141
+ year: 'numeric',
142
+ }).resolvedOptions().timeZone;
143
+ return resolved && resolved.trim().length > 0 ? resolved : null;
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ function resolveLocalDayInterval(activityDate, timeZone) {
150
+ const startParts = parseActivityDate(activityDate);
151
+ const startUtcMs = localDayStartUtcMs(startParts, timeZone);
152
+ const nextStartUtcMs = localDayStartUtcMs(nextCalendarDate(startParts), timeZone);
153
+ if (!Number.isFinite(startUtcMs) ||
154
+ !Number.isFinite(nextStartUtcMs) ||
155
+ nextStartUtcMs <= startUtcMs) {
156
+ throw new Error(`Unable to resolve the local day interval for ${activityDate}.`);
157
+ }
158
+ const durationMs = nextStartUtcMs - startUtcMs;
159
+ if (durationMs < MILLIS_PER_MINUTE) {
160
+ throw new Error(`The local day for ${activityDate} is shorter than one minute.`);
161
+ }
162
+ return { activityDate, startUtcMs, nextStartUtcMs, durationMs };
163
+ }
164
+ //# sourceMappingURL=epic-time-local-day.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-time-local-day.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/models/epic-time-local-day.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,19 @@
1
+ import type { ExternalEstimateLogPendingPhase, ExternalEstimateLogPendingResolution, ExternalEstimateLogState, IntegrationProvider } from '../../storage/models/domain.models';
2
+ export type EpicTimeAttributionSource = 'direct' | 'team';
1
3
  export interface EpicTimeSummaryItem {
2
4
  activityDate: string;
3
5
  agentId: string;
4
6
  agentName: string;
7
+ attributionSource?: EpicTimeAttributionSource;
8
+ teamId?: string | null;
9
+ teamName?: string | null;
5
10
  minutes: number;
6
11
  }
7
12
  export interface EpicTimeTaskItem {
8
13
  epicId: string;
9
14
  epicTitle: string;
15
+ groupEpicId?: string | null;
16
+ groupEpicTitle?: string | null;
10
17
  isDirect: boolean;
11
18
  minutes: number;
12
19
  }
@@ -14,6 +21,7 @@ export interface EpicTimeDetailSummary {
14
21
  isRoot: boolean;
15
22
  directMinutes: number;
16
23
  totalMinutes: number;
24
+ includesRelatedTime: boolean;
17
25
  items: EpicTimeSummaryItem[];
18
26
  taskItems: EpicTimeTaskItem[];
19
27
  }
@@ -21,6 +29,136 @@ export interface EpicTimeBatchSummaryItem {
21
29
  epicId: string;
22
30
  totalMinutes: number;
23
31
  }
32
+ export interface AgentTimeBufferItem {
33
+ agentId: string;
34
+ snapshotToken: string;
35
+ minutes: number;
36
+ durationMs: number;
37
+ segmentCount: number;
38
+ oldestActivityAt: string;
39
+ newestActivityAt: string;
40
+ }
41
+ export interface AgentTimeBufferSnapshot {
42
+ capturedAt: string | null;
43
+ items: AgentTimeBufferItem[];
44
+ }
45
+ export interface AgentTimeBufferAssignmentInput {
46
+ projectId: string;
47
+ agentId: string;
48
+ targetEpicId: string;
49
+ capturedAt: string;
50
+ snapshotToken: string;
51
+ }
52
+ export interface AgentTimeBufferAssignmentResult {
53
+ workspaceId: string;
54
+ }
24
55
  export interface EpicTimeBatchSummary {
25
56
  items: EpicTimeBatchSummaryItem[];
26
57
  }
58
+ export interface EpicTimeDailyTotal {
59
+ activityDate: string;
60
+ minutes: number;
61
+ }
62
+ export interface EpicTimeDailyProjection {
63
+ canonicalTimeZone: string;
64
+ totalMinutes: number;
65
+ currentByDate: EpicTimeDailyTotal[];
66
+ }
67
+ export declare const EXTERNAL_ESTIMATE_TIME_ENTRY_NOTE = "DevChain estimated agent time";
68
+ export interface ExternalEstimateTaskContext {
69
+ projectId: string;
70
+ provider: IntegrationProvider;
71
+ remoteScopeKey: string;
72
+ remoteTaskId: string;
73
+ expectedEpoch: number;
74
+ }
75
+ export type ExternalEstimatePendingDisposition = 'none' | 'busy' | 'outcome_unknown' | 'manual_review' | 'finishing';
76
+ export interface ExternalEstimateLoggedDay {
77
+ activityDate: string;
78
+ loggedMinutes: number;
79
+ }
80
+ export interface ExternalEstimateLogSnapshot {
81
+ state: ExternalEstimateLogState | null;
82
+ initialized: boolean;
83
+ revision: number;
84
+ loggedMinutes: number;
85
+ aggregationTimeZone: string | null;
86
+ days: ExternalEstimateLoggedDay[];
87
+ unallocatedLoggedMinutes: number;
88
+ pendingDisposition: ExternalEstimatePendingDisposition;
89
+ canVerify: boolean;
90
+ verifyExpiresAt: string | null;
91
+ }
92
+ export interface CreateExternalEstimateTimeEntryInput extends ExternalEstimateTaskContext {
93
+ requestKey: string;
94
+ timeZone: string;
95
+ estimateTotalMinutes: number;
96
+ expectedRevision: number;
97
+ dailySnapshot: EpicTimeDailyTotal[];
98
+ }
99
+ export type ExternalEstimateCreateStoppedReason = 'completed' | 'entry_cap' | 'provider_error' | 'concurrent_write' | 'outcome_unknown';
100
+ export interface ExternalEstimateCreateOutcome {
101
+ entriesLogged: number;
102
+ minutesLogged: number;
103
+ hasMore: boolean;
104
+ stoppedReason: ExternalEstimateCreateStoppedReason;
105
+ snapshot: ExternalEstimateLogSnapshot;
106
+ }
107
+ export type CreateExternalEstimateTimeEntryResult = ({
108
+ outcome: 'logged';
109
+ } & ExternalEstimateCreateOutcome) | ({
110
+ outcome: 'partially_logged';
111
+ } & ExternalEstimateCreateOutcome) | ({
112
+ outcome: 'outcome_unknown';
113
+ } & ExternalEstimateCreateOutcome);
114
+ export interface SetExternalEstimateLoggedMinutesInput extends ExternalEstimateTaskContext {
115
+ loggedMinutes: number;
116
+ expectedRevision: number;
117
+ timeZone: string;
118
+ }
119
+ export type ExternalEstimateOperationAction = 'verify' | 'logged' | 'not_logged';
120
+ export interface ResolveExternalEstimateOperationInput extends ExternalEstimateTaskContext {
121
+ operationId: string;
122
+ action: ExternalEstimateOperationAction;
123
+ expectedRevision: number;
124
+ }
125
+ export type ResolveExternalEstimateOperationResult = {
126
+ outcome: 'logged' | 'not_logged';
127
+ snapshot: ExternalEstimateLogSnapshot;
128
+ } | {
129
+ outcome: 'unresolved';
130
+ snapshot: ExternalEstimateLogSnapshot;
131
+ };
132
+ export interface ExternalEstimatePendingOperationView {
133
+ operationId: string;
134
+ deltaMinutes: number;
135
+ estimateTotalMinutes: number;
136
+ startedAt: string;
137
+ phase: ExternalEstimateLogPendingPhase;
138
+ resolution: ExternalEstimateLogPendingResolution | null;
139
+ activityDate: string | null;
140
+ }
141
+ export interface ExternalEstimateLogStateView {
142
+ initialized: boolean;
143
+ revision: number;
144
+ loggedMinutes: number;
145
+ aggregationTimeZone: string | null;
146
+ days: ExternalEstimateLoggedDay[];
147
+ unallocatedLoggedMinutes: number;
148
+ pendingDisposition: ExternalEstimatePendingDisposition;
149
+ canVerify: boolean;
150
+ verifyExpiresAt: string | null;
151
+ pending: ExternalEstimatePendingOperationView | null;
152
+ }
153
+ export interface ExternalEstimateCreateTimeEntryResponse {
154
+ outcome: CreateExternalEstimateTimeEntryResult['outcome'];
155
+ entriesLogged: number;
156
+ minutesLogged: number;
157
+ hasMore: boolean;
158
+ stoppedReason: ExternalEstimateCreateStoppedReason;
159
+ state: ExternalEstimateLogStateView;
160
+ }
161
+ export interface ExternalEstimateResolveOperationResponse {
162
+ outcome: ResolveExternalEstimateOperationResult['outcome'];
163
+ state: ExternalEstimateLogStateView;
164
+ }
@@ -1,3 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXTERNAL_ESTIMATE_TIME_ENTRY_NOTE = void 0;
4
+ exports.EXTERNAL_ESTIMATE_TIME_ENTRY_NOTE = 'DevChain estimated agent time';
3
5
  //# sourceMappingURL=epic-time.models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"epic-time.models.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/models/epic-time.models.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"epic-time.models.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/models/epic-time.models.ts"],"names":[],"mappings":";;;AA0Ga,QAAA,iCAAiC,GAAG,+BAA+B,CAAC"}
@@ -24,6 +24,7 @@ export declare class AgentTimeAccountingService implements OnModuleInit, OnModul
24
24
  handleSessionStopped(payload: SessionStoppedEventPayload): Promise<void>;
25
25
  handleSessionCrashed(payload: SessionCrashedEventPayload): Promise<void>;
26
26
  handleCommittedTaskTouch(event: CommittedEvent): Promise<void>;
27
+ private recordCommittedTaskTouch;
27
28
  requestSessionReconciliation(sessionId: string, now?: Date): Promise<void>;
28
29
  requestFullSweep(now?: Date, options?: FullSweepOptions): Promise<void>;
29
30
  private enqueue;
@@ -36,7 +36,7 @@ let AgentTimeAccountingService = class AgentTimeAccountingService {
36
36
  this.activation = await this.store.activate();
37
37
  this.unregisterDurableSubscriber = this.events.registerDurableSubscriber({
38
38
  deliveryKey: exports.EPIC_TIME_DELIVERY_KEY,
39
- eventNames: ['epic.created', 'epic.updated'],
39
+ eventNames: ['epic.created', 'epic.updated', 'epic.comment.created'],
40
40
  ordered: true,
41
41
  handle: (event) => this.handleCommittedTaskTouch(event),
42
42
  });
@@ -61,20 +61,41 @@ let AgentTimeAccountingService = class AgentTimeAccountingService {
61
61
  handleSessionCrashed(payload) {
62
62
  return this.requestSessionReconciliation(payload.sessionId);
63
63
  }
64
- async handleCommittedTaskTouch(event) {
65
- if (event.name !== 'epic.created' && event.name !== 'epic.updated') {
64
+ handleCommittedTaskTouch(event) {
65
+ return this.enqueue(async () => {
66
+ await this.recordCommittedTaskTouch(event);
67
+ const activation = this.activation;
68
+ if (activation) {
69
+ await this.store.processTeamBatches(exports.EPIC_TIME_DELIVERY_KEY, activation.idleTimeoutMs, new Date());
70
+ }
71
+ });
72
+ }
73
+ async recordCommittedTaskTouch(event) {
74
+ if (event.name !== 'epic.created' &&
75
+ event.name !== 'epic.updated' &&
76
+ event.name !== 'epic.comment.created') {
66
77
  return;
67
78
  }
68
79
  const payload = event.payload;
69
80
  if (payload.actor?.type !== 'agent') {
70
81
  return;
71
82
  }
72
- const createdParentId = event.name === 'epic.created' ? payload.parentId : null;
73
- const targetEpicId = createdParentId ?? payload.epicId;
74
- const targetEpicTitle = event.name === 'epic.created'
75
- ? ((createdParentId ? payload.parentTitle : payload.title) ?? payload.title)
76
- : payload.epicTitle;
83
+ let targetEpicId = payload.epicId;
84
+ let targetEpicTitle = payload.epicTitle;
85
+ if (event.name === 'epic.created') {
86
+ if (payload.parentId) {
87
+ targetEpicId = payload.parentId;
88
+ targetEpicTitle = payload.parentTitle ?? payload.title;
89
+ }
90
+ else {
91
+ targetEpicTitle = payload.title;
92
+ }
93
+ }
77
94
  if (!targetEpicTitle) {
95
+ if (event.name === 'epic.comment.created') {
96
+ logger.warn({ eventId: event.id, eventName: event.name }, 'Skipping comment task touch without an Epic title snapshot');
97
+ return;
98
+ }
78
99
  throw new Error('Committed Epic task touch is missing its target title snapshot.');
79
100
  }
80
101
  await this.store.recordTaskTouch({
@@ -94,6 +115,7 @@ let AgentTimeAccountingService = class AgentTimeAccountingService {
94
115
  return;
95
116
  }
96
117
  await this.store.reconcileSession(sessionId, activation.trackingStartedAt, activation.idleTimeoutMs, now);
118
+ await this.store.processTeamBatches(exports.EPIC_TIME_DELIVERY_KEY, activation.idleTimeoutMs, now);
97
119
  });
98
120
  }
99
121
  requestFullSweep(now = new Date(), options = {}) {
@@ -109,6 +131,7 @@ let AgentTimeAccountingService = class AgentTimeAccountingService {
109
131
  }
110
132
  await this.store.reconcileSession(sessionId, activation.trackingStartedAt, activation.idleTimeoutMs, now, { forceCloseOpenSegment: options.forceCloseOpenSegments ?? false });
111
133
  }
134
+ await this.store.processTeamBatches(exports.EPIC_TIME_DELIVERY_KEY, activation.idleTimeoutMs, now);
112
135
  });
113
136
  }
114
137
  enqueue(work) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-time-accounting.service.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/services/agent-time-accounting.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-time-accounting.service.js","sourceRoot":"","sources":["../../../../src/modules/epic-time/services/agent-time-accounting.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { ExternalTimeMutationService } from '../../external-integrations/my-work/external-time-mutation.service';
2
+ import { type StorageService } from '../../storage/interfaces/storage.interface';
3
+ import { type CreateExternalEstimateTimeEntryInput, type CreateExternalEstimateTimeEntryResult, type ExternalEstimateLogSnapshot, type ExternalEstimateTaskContext, type ResolveExternalEstimateOperationInput, type ResolveExternalEstimateOperationResult, type SetExternalEstimateLoggedMinutesInput } from '../models/epic-time.models';
4
+ import { EpicTimeService } from './epic-time.service';
5
+ export declare class EpicEstimateLoggingService {
6
+ private readonly storage;
7
+ private readonly epicTime;
8
+ private readonly timeMutations;
9
+ constructor(storage: StorageService, epicTime: EpicTimeService, timeMutations: ExternalTimeMutationService);
10
+ getState(input: ExternalEstimateTaskContext): Promise<ExternalEstimateLogSnapshot>;
11
+ setLoggedMinutes(input: SetExternalEstimateLoggedMinutesInput): Promise<ExternalEstimateLogSnapshot>;
12
+ createTimeEntry(input: CreateExternalEstimateTimeEntryInput): Promise<CreateExternalEstimateTimeEntryResult>;
13
+ private createOutcome;
14
+ resolveOperation(input: ResolveExternalEstimateOperationInput): Promise<ResolveExternalEstimateOperationResult>;
15
+ private verify;
16
+ private resolveManually;
17
+ private reconcilePending;
18
+ private resumeStoredResolution;
19
+ private settleExactTerminalReceipt;
20
+ private clearKnownFailureFromCurrentCall;
21
+ private markOutcomeUnknown;
22
+ private snapshot;
23
+ private pendingDispositionFields;
24
+ private requireMatchingInspection;
25
+ private assertInspectionMatches;
26
+ private requirePendingState;
27
+ private requirePendingValue;
28
+ private resolveContext;
29
+ private normalizeContext;
30
+ private isCurrentPendingEpoch;
31
+ private assertExpectedRevision;
32
+ private optimisticLock;
33
+ private requireRequestKey;
34
+ private requireDailySnapshot;
35
+ private requireIdentifier;
36
+ private requireNonnegativeInteger;
37
+ }