@taico/taico 0.6.0 → 0.8.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 (198) hide show
  1. package/README.md +1 -1
  2. package/dist/ai-providers/ai-model-selections.service.js +24 -2
  3. package/dist/ai-providers/ai-model-selections.service.js.map +1 -1
  4. package/dist/ai-providers/ai-provider-authorization-attempt.entity.d.ts +17 -0
  5. package/dist/ai-providers/ai-provider-authorization-attempt.entity.js +90 -0
  6. package/dist/ai-providers/ai-provider-authorization-attempt.entity.js.map +1 -0
  7. package/dist/ai-providers/ai-provider-connection.entity.d.ts +24 -0
  8. package/dist/ai-providers/ai-provider-connection.entity.js +131 -0
  9. package/dist/ai-providers/ai-provider-connection.entity.js.map +1 -0
  10. package/dist/ai-providers/ai-provider-connections.controller.d.ts +15 -0
  11. package/dist/ai-providers/ai-provider-connections.controller.js +167 -0
  12. package/dist/ai-providers/ai-provider-connections.controller.js.map +1 -0
  13. package/dist/ai-providers/ai-provider-models.service.d.ts +5 -2
  14. package/dist/ai-providers/ai-provider-models.service.js +44 -5
  15. package/dist/ai-providers/ai-provider-models.service.js.map +1 -1
  16. package/dist/ai-providers/ai-provider-models.service.spec.d.ts +1 -0
  17. package/dist/ai-providers/ai-provider-models.service.spec.js +110 -0
  18. package/dist/ai-providers/ai-provider-models.service.spec.js.map +1 -0
  19. package/dist/ai-providers/ai-provider.entity.d.ts +1 -0
  20. package/dist/ai-providers/ai-provider.entity.js +5 -0
  21. package/dist/ai-providers/ai-provider.entity.js.map +1 -1
  22. package/dist/ai-providers/ai-providers.controller.d.ts +1 -1
  23. package/dist/ai-providers/ai-providers.controller.js +4 -3
  24. package/dist/ai-providers/ai-providers.controller.js.map +1 -1
  25. package/dist/ai-providers/ai-providers.module.js +30 -4
  26. package/dist/ai-providers/ai-providers.module.js.map +1 -1
  27. package/dist/ai-providers/ai-providers.scopes.d.ts +4 -0
  28. package/dist/ai-providers/ai-providers.scopes.js +4 -0
  29. package/dist/ai-providers/ai-providers.scopes.js.map +1 -1
  30. package/dist/ai-providers/ai-providers.service.d.ts +3 -1
  31. package/dist/ai-providers/ai-providers.service.js +23 -3
  32. package/dist/ai-providers/ai-providers.service.js.map +1 -1
  33. package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.d.ts +50 -0
  34. package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.js +607 -0
  35. package/dist/ai-providers/chatgpt-subscription/chatgpt-connections.service.js.map +1 -0
  36. package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.d.ts +59 -0
  37. package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.js +247 -0
  38. package/dist/ai-providers/chatgpt-subscription/chatgpt-oauth.client.js.map +1 -0
  39. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.d.ts +21 -0
  40. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.js +298 -0
  41. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.js.map +1 -0
  42. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.d.ts +1 -0
  43. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.js +345 -0
  44. package/dist/ai-providers/chatgpt-subscription/chatgpt-responses.model.spec.js.map +1 -0
  45. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.d.ts +16 -0
  46. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.js +26 -0
  47. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.constants.js.map +1 -0
  48. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.d.ts +12 -0
  49. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.js +55 -0
  50. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.errors.js.map +1 -0
  51. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.d.ts +15 -0
  52. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.js +78 -0
  53. package/dist/ai-providers/chatgpt-subscription/chatgpt-subscription.service.js.map +1 -0
  54. package/dist/ai-providers/dto/http/ai-provider-connection.dto.d.ts +30 -0
  55. package/dist/ai-providers/dto/http/ai-provider-connection.dto.js +182 -0
  56. package/dist/ai-providers/dto/http/ai-provider-connection.dto.js.map +1 -0
  57. package/dist/ai-providers/dto/service/ai-providers.service.types.d.ts +32 -1
  58. package/dist/ai-providers/enums/ai-model-job.enum.d.ts +1 -0
  59. package/dist/ai-providers/enums/ai-model-job.enum.js +5 -1
  60. package/dist/ai-providers/enums/ai-model-job.enum.js.map +1 -1
  61. package/dist/ai-providers/enums/ai-provider-connection-status.enum.d.ts +6 -0
  62. package/dist/ai-providers/enums/ai-provider-connection-status.enum.js +11 -0
  63. package/dist/ai-providers/enums/ai-provider-connection-status.enum.js.map +1 -0
  64. package/dist/ai-providers/enums/ai-provider-type.enum.d.ts +4 -1
  65. package/dist/ai-providers/enums/ai-provider-type.enum.js +9 -1
  66. package/dist/ai-providers/enums/ai-provider-type.enum.js.map +1 -1
  67. package/dist/ai-providers/enums/index.d.ts +1 -0
  68. package/dist/ai-providers/enums/index.js +1 -0
  69. package/dist/ai-providers/enums/index.js.map +1 -1
  70. package/dist/ai-providers/errors/ai-providers.errors.d.ts +33 -0
  71. package/dist/ai-providers/errors/ai-providers.errors.js +66 -1
  72. package/dist/ai-providers/errors/ai-providers.errors.js.map +1 -1
  73. package/dist/ai-providers/google-environment.d.ts +1 -0
  74. package/dist/ai-providers/google-environment.js +4 -0
  75. package/dist/ai-providers/google-environment.js.map +1 -1
  76. package/dist/app.module.js +8 -0
  77. package/dist/app.module.js.map +1 -1
  78. package/dist/config/env.config.d.ts +3 -0
  79. package/dist/config/env.config.js +17 -0
  80. package/dist/config/env.config.js.map +1 -1
  81. package/dist/errors/http/error-catalog.js +48 -0
  82. package/dist/errors/http/error-catalog.js.map +1 -1
  83. package/dist/migrations/1761300000000-ThreadSecret.d.ts +6 -0
  84. package/dist/migrations/1761300000000-ThreadSecret.js +14 -0
  85. package/dist/migrations/1761300000000-ThreadSecret.js.map +1 -0
  86. package/dist/migrations/1761400000000-ThreadReadStates.d.ts +6 -0
  87. package/dist/migrations/1761400000000-ThreadReadStates.js +19 -0
  88. package/dist/migrations/1761400000000-ThreadReadStates.js.map +1 -0
  89. package/dist/migrations/1761500000000-ThreadLastActivity.d.ts +6 -0
  90. package/dist/migrations/1761500000000-ThreadLastActivity.js +19 -0
  91. package/dist/migrations/1761500000000-ThreadLastActivity.js.map +1 -0
  92. package/dist/migrations/1761600000000-AiProviderConnections.d.ts +6 -0
  93. package/dist/migrations/1761600000000-AiProviderConnections.js +61 -0
  94. package/dist/migrations/1761600000000-AiProviderConnections.js.map +1 -0
  95. package/dist/public/assets/index-G5Ht4law.js +118 -0
  96. package/dist/public/assets/index-NjAtMwFI.css +1 -0
  97. package/dist/public/beta/assets/{index-B9fCnAUe.js → index-BO6PlAsO.js} +30 -30
  98. package/dist/public/beta/index.html +1 -1
  99. package/dist/public/index.html +2 -2
  100. package/dist/public/package.json +4 -4
  101. package/dist/search/index/search-embeddings.service.js +2 -0
  102. package/dist/search/index/search-embeddings.service.js.map +1 -1
  103. package/dist/secrets/secret-storage-format.d.ts +5 -0
  104. package/dist/secrets/secret-storage-format.js +101 -0
  105. package/dist/secrets/secret-storage-format.js.map +1 -0
  106. package/dist/secrets/secret-storage-format.spec.d.ts +1 -0
  107. package/dist/secrets/secret-storage-format.spec.js +32 -0
  108. package/dist/secrets/secret-storage-format.spec.js.map +1 -0
  109. package/dist/secrets/secrets-encryption.service.d.ts +1 -0
  110. package/dist/secrets/secrets-encryption.service.js +3 -0
  111. package/dist/secrets/secrets-encryption.service.js.map +1 -1
  112. package/dist/secrets/secrets.module.js +1 -1
  113. package/dist/secrets/secrets.module.js.map +1 -1
  114. package/dist/threads/agent/agent-context.utils.d.ts +3 -0
  115. package/dist/threads/agent/agent-context.utils.js +14 -0
  116. package/dist/threads/agent/agent-context.utils.js.map +1 -1
  117. package/dist/threads/agent/agent-context.utils.spec.js +25 -0
  118. package/dist/threads/agent/agent-context.utils.spec.js.map +1 -1
  119. package/dist/threads/agent/chat-model.factory.d.ts +6 -1
  120. package/dist/threads/agent/chat-model.factory.js +30 -8
  121. package/dist/threads/agent/chat-model.factory.js.map +1 -1
  122. package/dist/threads/agent/chat-model.factory.spec.js +96 -2
  123. package/dist/threads/agent/chat-model.factory.spec.js.map +1 -1
  124. package/dist/threads/agent/hooks/compaction.hook.d.ts +1 -0
  125. package/dist/threads/agent/hooks/compaction.hook.js +33 -8
  126. package/dist/threads/agent/hooks/compaction.hook.js.map +1 -1
  127. package/dist/threads/agent/hooks/easter-egg.hook.js +4 -3
  128. package/dist/threads/agent/hooks/easter-egg.hook.js.map +1 -1
  129. package/dist/threads/agent/hooks/hooks.spec.js +123 -0
  130. package/dist/threads/agent/hooks/hooks.spec.js.map +1 -1
  131. package/dist/threads/agent/hooks/thread-agent-hook.interface.js.map +1 -1
  132. package/dist/threads/agent/hooks/thread-agent-hooks.runner.js +2 -1
  133. package/dist/threads/agent/hooks/thread-agent-hooks.runner.js.map +1 -1
  134. package/dist/threads/agent/thread-agent-log.service.d.ts +3 -0
  135. package/dist/threads/agent/thread-agent-log.service.js +35 -1
  136. package/dist/threads/agent/thread-agent-log.service.js.map +1 -1
  137. package/dist/threads/agent/thread-agent.prompts.d.ts +6 -1
  138. package/dist/threads/agent/thread-agent.prompts.js +34 -7
  139. package/dist/threads/agent/thread-agent.prompts.js.map +1 -1
  140. package/dist/threads/agent/thread-agent.prompts.spec.d.ts +1 -0
  141. package/dist/threads/agent/thread-agent.prompts.spec.js +51 -0
  142. package/dist/threads/agent/thread-agent.prompts.spec.js.map +1 -0
  143. package/dist/threads/agent/thread-agent.service.d.ts +3 -3
  144. package/dist/threads/agent/thread-agent.service.js +11 -16
  145. package/dist/threads/agent/thread-agent.service.js.map +1 -1
  146. package/dist/threads/agent/thread-agent.service.spec.js +41 -9
  147. package/dist/threads/agent/thread-agent.service.spec.js.map +1 -1
  148. package/dist/threads/chat.service.d.ts +3 -0
  149. package/dist/threads/chat.service.js +37 -9
  150. package/dist/threads/chat.service.js.map +1 -1
  151. package/dist/threads/dto/service/threads.service.types.d.ts +9 -0
  152. package/dist/threads/dto/thread-list-item-response.dto.d.ts +2 -0
  153. package/dist/threads/dto/thread-list-item-response.dto.js +16 -0
  154. package/dist/threads/dto/thread-list-item-response.dto.js.map +1 -1
  155. package/dist/threads/dto/thread-token-usage-response.dto.d.ts +8 -0
  156. package/dist/threads/dto/thread-token-usage-response.dto.js +63 -0
  157. package/dist/threads/dto/thread-token-usage-response.dto.js.map +1 -0
  158. package/dist/threads/events/threads.events.d.ts +8 -0
  159. package/dist/threads/events/threads.events.js +8 -1
  160. package/dist/threads/events/threads.events.js.map +1 -1
  161. package/dist/threads/read-state/thread-read-state.entity.d.ts +9 -0
  162. package/dist/threads/read-state/thread-read-state.entity.js +49 -0
  163. package/dist/threads/read-state/thread-read-state.entity.js.map +1 -0
  164. package/dist/threads/read-state/thread-read-state.service.d.ts +14 -0
  165. package/dist/threads/read-state/thread-read-state.service.js +81 -0
  166. package/dist/threads/read-state/thread-read-state.service.js.map +1 -0
  167. package/dist/threads/thread-message-writer.service.d.ts +13 -0
  168. package/dist/threads/thread-message-writer.service.js +48 -0
  169. package/dist/threads/thread-message-writer.service.js.map +1 -0
  170. package/dist/threads/thread-message.entity.js +1 -0
  171. package/dist/threads/thread-message.entity.js.map +1 -1
  172. package/dist/threads/thread-state-reconciler.service.js +5 -0
  173. package/dist/threads/thread-state-reconciler.service.js.map +1 -1
  174. package/dist/threads/thread-state-reconciler.service.spec.d.ts +1 -0
  175. package/dist/threads/thread-state-reconciler.service.spec.js +44 -0
  176. package/dist/threads/thread-state-reconciler.service.spec.js.map +1 -0
  177. package/dist/threads/thread.entity.d.ts +2 -0
  178. package/dist/threads/thread.entity.js +24 -0
  179. package/dist/threads/thread.entity.js.map +1 -1
  180. package/dist/threads/threads-state.service.spec.js +1 -0
  181. package/dist/threads/threads-state.service.spec.js.map +1 -1
  182. package/dist/threads/threads.controller.d.ts +9 -2
  183. package/dist/threads/threads.controller.js +56 -6
  184. package/dist/threads/threads.controller.js.map +1 -1
  185. package/dist/threads/threads.gateway.d.ts +2 -1
  186. package/dist/threads/threads.gateway.js +40 -0
  187. package/dist/threads/threads.gateway.js.map +1 -1
  188. package/dist/threads/threads.module.js +6 -0
  189. package/dist/threads/threads.module.js.map +1 -1
  190. package/dist/threads/threads.service.d.ts +5 -1
  191. package/dist/threads/threads.service.js +19 -14
  192. package/dist/threads/threads.service.js.map +1 -1
  193. package/dist/threads/threads.service.spec.js +1 -0
  194. package/dist/threads/threads.service.spec.js.map +1 -1
  195. package/dist/tsconfig.tsbuildinfo +1 -1
  196. package/package.json +6 -5
  197. package/dist/public/assets/index-Bu8fSAx2.js +0 -117
  198. package/dist/public/assets/index-DOm5BmlC.css +0 -1
@@ -15,6 +15,8 @@ class ThreadListItemResponseDto {
15
15
  id;
16
16
  title;
17
17
  stateContextBlockId;
18
+ lastActivityAt;
19
+ unreadCount;
18
20
  }
19
21
  exports.ThreadListItemResponseDto = ThreadListItemResponseDto;
20
22
  __decorate([
@@ -38,4 +40,18 @@ __decorate([
38
40
  }),
39
41
  __metadata("design:type", String)
40
42
  ], ThreadListItemResponseDto.prototype, "stateContextBlockId", void 0);
43
+ __decorate([
44
+ (0, swagger_1.ApiProperty)({
45
+ description: 'When the latest message people can see was posted, or when the thread was created if it has none. The list is ordered by this, newest first',
46
+ example: '2026-01-01T00:00:00.000Z',
47
+ }),
48
+ __metadata("design:type", String)
49
+ ], ThreadListItemResponseDto.prototype, "lastActivityAt", void 0);
50
+ __decorate([
51
+ (0, swagger_1.ApiProperty)({
52
+ description: 'Messages in this thread written by someone else that the caller has not read yet',
53
+ example: 2,
54
+ }),
55
+ __metadata("design:type", Number)
56
+ ], ThreadListItemResponseDto.prototype, "unreadCount", void 0);
41
57
  //# sourceMappingURL=thread-list-item-response.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item-response.dto.js","sourceRoot":"","sources":["../../../src/threads/dto/thread-list-item-response.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAE9C,MAAa,yBAAyB;IAKpC,EAAE,CAAU;IAMZ,KAAK,CAAU;IAMf,mBAAmB,CAAU;CAC9B;AAlBD,8DAkBC;AAbC;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,sCAAsC;KAChD,CAAC;;qDACU;AAMZ;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,kCAAkC;KAC5C,CAAC;;wDACa;AAMf;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sEAAsE;QACnF,OAAO,EAAE,sCAAsC;KAChD,CAAC;;sEAC2B"}
1
+ {"version":3,"file":"thread-list-item-response.dto.js","sourceRoot":"","sources":["../../../src/threads/dto/thread-list-item-response.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAE9C,MAAa,yBAAyB;IAKpC,EAAE,CAAU;IAMZ,KAAK,CAAU;IAMf,mBAAmB,CAAU;IAO7B,cAAc,CAAU;IAOxB,WAAW,CAAU;CACtB;AAhCD,8DAgCC;AA3BC;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,sCAAsC;KAChD,CAAC;;qDACU;AAMZ;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,kCAAkC;KAC5C,CAAC;;wDACa;AAMf;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,sEAAsE;QACnF,OAAO,EAAE,sCAAsC;KAChD,CAAC;;sEAC2B;AAO7B;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,6IAA6I;QAC/I,OAAO,EAAE,0BAA0B;KACpC,CAAC;;iEACsB;AAOxB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,kFAAkF;QACpF,OAAO,EAAE,CAAC;KACX,CAAC;;8DACmB"}
@@ -0,0 +1,8 @@
1
+ import { ThreadTokenUsageResult } from './service/threads.service.types';
2
+ export declare class ThreadTokenUsageResponseDto {
3
+ contextTokens: number | null;
4
+ inputTokens: number | null;
5
+ outputTokens: number | null;
6
+ steps: number;
7
+ static fromResult(result: ThreadTokenUsageResult): ThreadTokenUsageResponseDto;
8
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ThreadTokenUsageResponseDto = void 0;
13
+ const swagger_1 = require("@nestjs/swagger");
14
+ class ThreadTokenUsageResponseDto {
15
+ contextTokens;
16
+ inputTokens;
17
+ outputTokens;
18
+ steps;
19
+ static fromResult(result) {
20
+ const dto = new ThreadTokenUsageResponseDto();
21
+ dto.contextTokens = result.contextTokens;
22
+ dto.inputTokens = result.inputTokens;
23
+ dto.outputTokens = result.outputTokens;
24
+ dto.steps = result.steps;
25
+ return dto;
26
+ }
27
+ }
28
+ exports.ThreadTokenUsageResponseDto = ThreadTokenUsageResponseDto;
29
+ __decorate([
30
+ (0, swagger_1.ApiProperty)({
31
+ description: 'Input tokens of the most recent model step: roughly the size of the conversation the model reads now. Null when the provider reported no figure.',
32
+ example: 42351,
33
+ nullable: true,
34
+ type: Number,
35
+ }),
36
+ __metadata("design:type", Object)
37
+ ], ThreadTokenUsageResponseDto.prototype, "contextTokens", void 0);
38
+ __decorate([
39
+ (0, swagger_1.ApiProperty)({
40
+ description: 'Input tokens summed over every model step in the thread. Null when no step reported a figure.',
41
+ example: 423512,
42
+ nullable: true,
43
+ type: Number,
44
+ }),
45
+ __metadata("design:type", Object)
46
+ ], ThreadTokenUsageResponseDto.prototype, "inputTokens", void 0);
47
+ __decorate([
48
+ (0, swagger_1.ApiProperty)({
49
+ description: 'Output tokens summed over every model step in the thread. Null when no step reported a figure.',
50
+ example: 8123,
51
+ nullable: true,
52
+ type: Number,
53
+ }),
54
+ __metadata("design:type", Object)
55
+ ], ThreadTokenUsageResponseDto.prototype, "outputTokens", void 0);
56
+ __decorate([
57
+ (0, swagger_1.ApiProperty)({
58
+ description: 'Number of model steps that reported token usage',
59
+ example: 12,
60
+ }),
61
+ __metadata("design:type", Number)
62
+ ], ThreadTokenUsageResponseDto.prototype, "steps", void 0);
63
+ //# sourceMappingURL=thread-token-usage-response.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-token-usage-response.dto.js","sourceRoot":"","sources":["../../../src/threads/dto/thread-token-usage-response.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAI9C,MAAa,2BAA2B;IAQtC,aAAa,CAAiB;IAS9B,WAAW,CAAiB;IAS5B,YAAY,CAAiB;IAM7B,KAAK,CAAU;IAEf,MAAM,CAAC,UAAU,CAAC,MAA8B;QAC9C,MAAM,GAAG,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAC9C,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QACzC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACrC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACvC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA1CD,kEA0CC;AAlCC;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,kJAAkJ;QACpJ,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;kEAC4B;AAS9B;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,+FAA+F;QACjG,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;gEAC0B;AAS5B;IAPC,IAAA,qBAAW,EAAC;QACX,WAAW,EACT,gGAAgG;QAClG,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC;;iEAC2B;AAM7B;IAJC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,iDAAiD;QAC9D,OAAO,EAAE,EAAE;KACZ,CAAC;;0DACa"}
@@ -54,3 +54,11 @@ export declare class ThreadTitleUpdatedEvent extends ThreadDomainEvent<ThreadTit
54
54
  static readonly INTERNAL: unique symbol;
55
55
  constructor(actor: EventActor, payload: ThreadTitleUpdatedPayload);
56
56
  }
57
+ export type ThreadReadPayload = {
58
+ threadId: string;
59
+ actorId: string;
60
+ };
61
+ export declare class ThreadReadEvent extends ThreadDomainEvent<ThreadReadPayload> {
62
+ static readonly INTERNAL: unique symbol;
63
+ constructor(actor: EventActor, payload: ThreadReadPayload);
64
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThreadTitleUpdatedEvent = exports.ThreadAgentResponseDeltaEvent = exports.ThreadAgentActivityEvent = exports.MessageCreatedEvent = exports.ThreadDeletedEvent = exports.ThreadUpdatedEvent = exports.ThreadCreatedEvent = exports.ThreadDomainEvent = void 0;
3
+ exports.ThreadReadEvent = exports.ThreadTitleUpdatedEvent = exports.ThreadAgentResponseDeltaEvent = exports.ThreadAgentActivityEvent = exports.MessageCreatedEvent = exports.ThreadDeletedEvent = exports.ThreadUpdatedEvent = exports.ThreadCreatedEvent = exports.ThreadDomainEvent = void 0;
4
4
  class ThreadDomainEvent {
5
5
  actor;
6
6
  payload;
@@ -64,4 +64,11 @@ class ThreadTitleUpdatedEvent extends ThreadDomainEvent {
64
64
  }
65
65
  }
66
66
  exports.ThreadTitleUpdatedEvent = ThreadTitleUpdatedEvent;
67
+ class ThreadReadEvent extends ThreadDomainEvent {
68
+ static INTERNAL = Symbol('threads.ThreadReadEvent');
69
+ constructor(actor, payload) {
70
+ super(actor, payload);
71
+ }
72
+ }
73
+ exports.ThreadReadEvent = ThreadReadEvent;
67
74
  //# sourceMappingURL=threads.events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"threads.events.js","sourceRoot":"","sources":["../../../src/threads/events/threads.events.ts"],"names":[],"mappings":";;;AAeA,MAAsB,iBAAiB;IAInB;IACA;IAJT,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IAEvC,YACkB,KAAiB,EACjB,OAAiB;QADjB,UAAK,GAAL,KAAK,CAAY;QACjB,YAAO,GAAP,OAAO,CAAU;IAChC,CAAC;CACL;AAPD,8CAOC;AAED,MAAa,kBAAmB,SAAQ,iBAA+B;IACrE,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEhE,YAAY,KAAiB,EAAE,MAAoB;QACjD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;;AALH,gDAMC;AAED,MAAa,kBAAmB,SAAQ,iBAA+B;IACrE,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEhE,YAAY,KAAiB,EAAE,MAAoB;QACjD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;;AALH,gDAMC;AAED,MAAa,kBAAkB;IAMX;IACA;IANlB,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEvD,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IAEvC,YACkB,KAAiB,EACjB,QAAgB;QADhB,UAAK,GAAL,KAAK,CAAY;QACjB,aAAQ,GAAR,QAAQ,CAAQ;IAC/B,CAAC;;AARN,gDASC;AAED,MAAa,mBAAoB,SAAQ,iBAAsC;IAC7E,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAEjE,YAAY,KAAiB,EAAE,OAA4B;QACzD,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,kDAMC;AASD,MAAa,wBAAyB,SAAQ,iBAA6C;IACzF,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAEtE,YAAY,KAAiB,EAAE,OAAmC;QAChE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,4DAMC;AAQD,MAAa,6BAA8B,SAAQ,iBAAkD;IACnG,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAE3E,YAAY,KAAiB,EAAE,OAAwC;QACrE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,sEAMC;AAOD,MAAa,uBAAwB,SAAQ,iBAA4C;IACvF,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,iCAAiC,CAAC,CAAC;IAErE,YAAY,KAAiB,EAAE,OAAkC;QAC/D,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,0DAMC"}
1
+ {"version":3,"file":"threads.events.js","sourceRoot":"","sources":["../../../src/threads/events/threads.events.ts"],"names":[],"mappings":";;;AAeA,MAAsB,iBAAiB;IAInB;IACA;IAJT,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IAEvC,YACkB,KAAiB,EACjB,OAAiB;QADjB,UAAK,GAAL,KAAK,CAAY;QACjB,YAAO,GAAP,OAAO,CAAU;IAChC,CAAC;CACL;AAPD,8CAOC;AAED,MAAa,kBAAmB,SAAQ,iBAA+B;IACrE,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEhE,YAAY,KAAiB,EAAE,MAAoB;QACjD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;;AALH,gDAMC;AAED,MAAa,kBAAmB,SAAQ,iBAA+B;IACrE,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEhE,YAAY,KAAiB,EAAE,MAAoB;QACjD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;;AALH,gDAMC;AAED,MAAa,kBAAkB;IAMX;IACA;IANlB,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAEvD,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IAEvC,YACkB,KAAiB,EACjB,QAAgB;QADhB,UAAK,GAAL,KAAK,CAAY;QACjB,aAAQ,GAAR,QAAQ,CAAQ;IAC/B,CAAC;;AARN,gDASC;AAED,MAAa,mBAAoB,SAAQ,iBAAsC;IAC7E,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAEjE,YAAY,KAAiB,EAAE,OAA4B;QACzD,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,kDAMC;AASD,MAAa,wBAAyB,SAAQ,iBAA6C;IACzF,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAEtE,YAAY,KAAiB,EAAE,OAAmC;QAChE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,4DAMC;AAQD,MAAa,6BAA8B,SAAQ,iBAAkD;IACnG,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAE3E,YAAY,KAAiB,EAAE,OAAwC;QACrE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,sEAMC;AAOD,MAAa,uBAAwB,SAAQ,iBAA4C;IACvF,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,iCAAiC,CAAC,CAAC;IAErE,YAAY,KAAiB,EAAE,OAAkC;QAC/D,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,0DAMC;AAQD,MAAa,eAAgB,SAAQ,iBAAoC;IACvE,MAAM,CAAU,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAE7D,YAAY,KAAiB,EAAE,OAA0B;QACvD,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxB,CAAC;;AALH,0CAMC"}
@@ -0,0 +1,9 @@
1
+ import { ActorEntity } from '../../identity-provider/actor.entity';
2
+ import { ThreadEntity } from '../thread.entity';
3
+ export declare class ThreadReadStateEntity {
4
+ threadId: string;
5
+ actorId: string;
6
+ thread?: ThreadEntity;
7
+ actor?: ActorEntity;
8
+ lastReadAt: Date;
9
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ThreadReadStateEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const actor_entity_1 = require("../../identity-provider/actor.entity");
15
+ const thread_entity_1 = require("../thread.entity");
16
+ let ThreadReadStateEntity = class ThreadReadStateEntity {
17
+ threadId;
18
+ actorId;
19
+ thread;
20
+ actor;
21
+ lastReadAt;
22
+ };
23
+ exports.ThreadReadStateEntity = ThreadReadStateEntity;
24
+ __decorate([
25
+ (0, typeorm_1.PrimaryColumn)({ type: 'uuid', name: 'thread_id' }),
26
+ __metadata("design:type", String)
27
+ ], ThreadReadStateEntity.prototype, "threadId", void 0);
28
+ __decorate([
29
+ (0, typeorm_1.PrimaryColumn)({ type: 'uuid', name: 'actor_id' }),
30
+ __metadata("design:type", String)
31
+ ], ThreadReadStateEntity.prototype, "actorId", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.ManyToOne)(() => thread_entity_1.ThreadEntity, { onDelete: 'CASCADE' }),
34
+ (0, typeorm_1.JoinColumn)({ name: 'thread_id' }),
35
+ __metadata("design:type", thread_entity_1.ThreadEntity)
36
+ ], ThreadReadStateEntity.prototype, "thread", void 0);
37
+ __decorate([
38
+ (0, typeorm_1.ManyToOne)(() => actor_entity_1.ActorEntity, { onDelete: 'CASCADE' }),
39
+ (0, typeorm_1.JoinColumn)({ name: 'actor_id' }),
40
+ __metadata("design:type", actor_entity_1.ActorEntity)
41
+ ], ThreadReadStateEntity.prototype, "actor", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.Column)({ type: 'timestamptz', name: 'last_read_at' }),
44
+ __metadata("design:type", Date)
45
+ ], ThreadReadStateEntity.prototype, "lastReadAt", void 0);
46
+ exports.ThreadReadStateEntity = ThreadReadStateEntity = __decorate([
47
+ (0, typeorm_1.Entity)({ name: 'thread_read_states' })
48
+ ], ThreadReadStateEntity);
49
+ //# sourceMappingURL=thread-read-state.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-read-state.entity.js","sourceRoot":"","sources":["../../../src/threads/read-state/thread-read-state.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAA+E;AAC/E,uEAAmE;AACnE,oDAAgD;AAUzC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAEhC,QAAQ,CAAU;IAGlB,OAAO,CAAU;IAIjB,MAAM,CAAgB;IAItB,KAAK,CAAe;IAGpB,UAAU,CAAQ;CACnB,CAAA;AAjBY,sDAAqB;AAEhC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;uDACjC;AAGlB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;sDACjC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACzB,4BAAY;qDAAC;AAItB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;8BACzB,0BAAW;oDAAC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;8BACzC,IAAI;yDAAC;gCAhBP,qBAAqB;IADjC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;GAC1B,qBAAqB,CAiBjC"}
@@ -0,0 +1,14 @@
1
+ import { EventEmitter2 } from '@nestjs/event-emitter';
2
+ import { Repository } from 'typeorm';
3
+ import { ThreadEntity } from '../thread.entity';
4
+ import { ThreadMessageEntity } from '../thread-message.entity';
5
+ import { ThreadReadStateEntity } from './thread-read-state.entity';
6
+ export declare class ThreadReadStateService {
7
+ private readonly readStateRepository;
8
+ private readonly threadMessageRepository;
9
+ private readonly threadRepository;
10
+ private readonly eventEmitter;
11
+ constructor(readStateRepository: Repository<ThreadReadStateEntity>, threadMessageRepository: Repository<ThreadMessageEntity>, threadRepository: Repository<ThreadEntity>, eventEmitter: EventEmitter2);
12
+ markRead(threadId: string, actorId: string): Promise<void>;
13
+ getUnreadCounts(threadIds: string[], actorId: string): Promise<Map<string, number>>;
14
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ThreadReadStateService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const typeorm_1 = require("@nestjs/typeorm");
18
+ const event_emitter_1 = require("@nestjs/event-emitter");
19
+ const typeorm_2 = require("typeorm");
20
+ const thread_entity_1 = require("../thread.entity");
21
+ const thread_message_entity_1 = require("../thread-message.entity");
22
+ const threads_errors_1 = require("../errors/threads.errors");
23
+ const threads_events_1 = require("../events/threads.events");
24
+ const thread_read_state_entity_1 = require("./thread-read-state.entity");
25
+ let ThreadReadStateService = class ThreadReadStateService {
26
+ readStateRepository;
27
+ threadMessageRepository;
28
+ threadRepository;
29
+ eventEmitter;
30
+ constructor(readStateRepository, threadMessageRepository, threadRepository, eventEmitter) {
31
+ this.readStateRepository = readStateRepository;
32
+ this.threadMessageRepository = threadMessageRepository;
33
+ this.threadRepository = threadRepository;
34
+ this.eventEmitter = eventEmitter;
35
+ }
36
+ async markRead(threadId, actorId) {
37
+ const thread = await this.threadRepository.findOne({
38
+ where: { id: threadId },
39
+ select: { id: true },
40
+ });
41
+ if (!thread) {
42
+ throw new threads_errors_1.ThreadNotFoundError(threadId);
43
+ }
44
+ await this.readStateRepository
45
+ .createQueryBuilder()
46
+ .insert()
47
+ .values({ threadId, actorId, lastReadAt: () => 'now()' })
48
+ .orUpdate(['last_read_at'], ['thread_id', 'actor_id'])
49
+ .execute();
50
+ this.eventEmitter.emit(threads_events_1.ThreadReadEvent.INTERNAL, new threads_events_1.ThreadReadEvent({ id: actorId }, { threadId, actorId }));
51
+ }
52
+ async getUnreadCounts(threadIds, actorId) {
53
+ if (threadIds.length === 0) {
54
+ return new Map();
55
+ }
56
+ const rows = await this.threadMessageRepository
57
+ .createQueryBuilder('m')
58
+ .select('m.thread_id', 'threadId')
59
+ .addSelect('COUNT(*)', 'count')
60
+ .leftJoin(thread_read_state_entity_1.ThreadReadStateEntity, 'r', 'r.thread_id = m.thread_id AND r.actor_id = :actorId')
61
+ .where('m.thread_id IN (:...threadIds)')
62
+ .andWhere('m.created_by_actor_id <> :actorId')
63
+ .andWhere('(r.last_read_at IS NULL OR m.created_at > r.last_read_at)')
64
+ .setParameters({ actorId, threadIds })
65
+ .groupBy('m.thread_id')
66
+ .getRawMany();
67
+ return new Map(rows.map((row) => [row.threadId, Number(row.count)]));
68
+ }
69
+ };
70
+ exports.ThreadReadStateService = ThreadReadStateService;
71
+ exports.ThreadReadStateService = ThreadReadStateService = __decorate([
72
+ (0, common_1.Injectable)(),
73
+ __param(0, (0, typeorm_1.InjectRepository)(thread_read_state_entity_1.ThreadReadStateEntity)),
74
+ __param(1, (0, typeorm_1.InjectRepository)(thread_message_entity_1.ThreadMessageEntity)),
75
+ __param(2, (0, typeorm_1.InjectRepository)(thread_entity_1.ThreadEntity)),
76
+ __metadata("design:paramtypes", [typeorm_2.Repository,
77
+ typeorm_2.Repository,
78
+ typeorm_2.Repository,
79
+ event_emitter_1.EventEmitter2])
80
+ ], ThreadReadStateService);
81
+ //# sourceMappingURL=thread-read-state.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-read-state.service.js","sourceRoot":"","sources":["../../../src/threads/read-state/thread-read-state.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,yDAAsD;AACtD,qCAAqC;AACrC,oDAAgD;AAChD,oEAA+D;AAC/D,6DAA+D;AAC/D,6DAA2D;AAC3D,yEAAmE;AAI5D,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAGd;IAEA;IAEA;IACA;IAPnB,YAEmB,mBAAsD,EAEtD,uBAAwD,EAExD,gBAA0C,EAC1C,YAA2B;QAL3B,wBAAmB,GAAnB,mBAAmB,CAAmC;QAEtD,4BAAuB,GAAvB,uBAAuB,CAAiC;QAExD,qBAAgB,GAAhB,gBAAgB,CAA0B;QAC1C,iBAAY,GAAZ,YAAY,CAAe;IAC3C,CAAC;IAGJ,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,OAAe;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE;YACvB,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oCAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,CAAC,mBAAmB;aAC3B,kBAAkB,EAAE;aACpB,MAAM,EAAE;aACR,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;aACxD,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;aACrD,OAAO,EAAE,CAAC;QAEb,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,gCAAe,CAAC,QAAQ,EACxB,IAAI,gCAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAC5D,CAAC;IACJ,CAAC;IAMD,KAAK,CAAC,eAAe,CACnB,SAAmB,EACnB,OAAe;QAEf,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB;aAC5C,kBAAkB,CAAC,GAAG,CAAC;aACvB,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC;aACjC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;aAC9B,QAAQ,CACP,gDAAqB,EACrB,GAAG,EACH,qDAAqD,CACtD;aACA,KAAK,CAAC,gCAAgC,CAAC;aACvC,QAAQ,CAAC,mCAAmC,CAAC;aAC7C,QAAQ,CAAC,2DAA2D,CAAC;aACrE,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;aACrC,OAAO,CAAC,aAAa,CAAC;aACtB,UAAU,EAAuC,CAAC;QAErD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;CACF,CAAA;AAhEY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,gDAAqB,CAAC,CAAA;IAEvC,WAAA,IAAA,0BAAgB,EAAC,2CAAmB,CAAC,CAAA;IAErC,WAAA,IAAA,0BAAgB,EAAC,4BAAY,CAAC,CAAA;qCAHO,oBAAU;QAEN,oBAAU;QAEjB,oBAAU;QACd,6BAAa;GARnC,sBAAsB,CAgElC"}
@@ -0,0 +1,13 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { ThreadMessageEntity } from './thread-message.entity';
3
+ export type WriteThreadMessageInput = {
4
+ threadId: string;
5
+ content: string;
6
+ createdByActorId: string;
7
+ agentMessageId?: string | null;
8
+ };
9
+ export declare class ThreadMessageWriterService {
10
+ private readonly dataSource;
11
+ constructor(dataSource: DataSource);
12
+ write(input: WriteThreadMessageInput): Promise<ThreadMessageEntity>;
13
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ThreadMessageWriterService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const typeorm_1 = require("typeorm");
15
+ const thread_message_entity_1 = require("./thread-message.entity");
16
+ let ThreadMessageWriterService = class ThreadMessageWriterService {
17
+ dataSource;
18
+ constructor(dataSource) {
19
+ this.dataSource = dataSource;
20
+ }
21
+ async write(input) {
22
+ return this.dataSource.transaction(async (manager) => {
23
+ const saved = await manager.save(manager.create(thread_message_entity_1.ThreadMessageEntity, {
24
+ threadId: input.threadId,
25
+ content: input.content,
26
+ createdByActorId: input.createdByActorId,
27
+ agentMessageId: input.agentMessageId ?? null,
28
+ }));
29
+ await manager.query(`UPDATE threads t
30
+ SET last_activity_at = GREATEST(
31
+ t.last_activity_at,
32
+ date_trunc('milliseconds', m.created_at)
33
+ )
34
+ FROM thread_messages m
35
+ WHERE m.id = $1 AND t.id = m.thread_id`, [saved.id]);
36
+ return manager.findOneOrFail(thread_message_entity_1.ThreadMessageEntity, {
37
+ where: { id: saved.id },
38
+ relations: ['createdByActor'],
39
+ });
40
+ });
41
+ }
42
+ };
43
+ exports.ThreadMessageWriterService = ThreadMessageWriterService;
44
+ exports.ThreadMessageWriterService = ThreadMessageWriterService = __decorate([
45
+ (0, common_1.Injectable)(),
46
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
47
+ ], ThreadMessageWriterService);
48
+ //# sourceMappingURL=thread-message-writer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-message-writer.service.js","sourceRoot":"","sources":["../../src/threads/thread-message-writer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,qCAAqC;AACrC,mEAA8D;AAmBvD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IACR;IAA7B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAGvD,KAAK,CAAC,KAAK,CAAC,KAA8B;QAGxC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACnD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAC9B,OAAO,CAAC,MAAM,CAAC,2CAAmB,EAAE;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;aAC7C,CAAC,CACH,CAAC;YAMF,MAAM,OAAO,CAAC,KAAK,CACjB;;;;;;iDAMyC,EACzC,CAAC,KAAK,CAAC,EAAE,CAAC,CACX,CAAC;YAEF,OAAO,OAAO,CAAC,aAAa,CAAC,2CAAmB,EAAE;gBAChD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;gBACvB,SAAS,EAAE,CAAC,gBAAgB,CAAC;aAC9B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAtCY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,mBAAU,GAAE;qCAE8B,oBAAU;GADxC,0BAA0B,CAsCtC"}
@@ -66,6 +66,7 @@ __decorate([
66
66
  __metadata("design:type", Date)
67
67
  ], ThreadMessageEntity.prototype, "createdAt", void 0);
68
68
  exports.ThreadMessageEntity = ThreadMessageEntity = __decorate([
69
+ (0, typeorm_1.Index)('IDX_thread_messages_thread_created', ['threadId', 'createdAt']),
69
70
  (0, typeorm_1.Entity)({ name: 'thread_messages' })
70
71
  ], ThreadMessageEntity);
71
72
  //# sourceMappingURL=thread-message.entity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread-message.entity.js","sourceRoot":"","sources":["../../src/threads/thread-message.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAOiB;AACjB,mDAA+C;AAC/C,oEAAgE;AAChE,qFAA+E;AAGxE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE9B,EAAE,CAAU;IAGZ,QAAQ,CAAU;IAIlB,MAAM,CAAgB;IAGtB,OAAO,CAAU;IAGjB,gBAAgB,CAAU;IAI1B,cAAc,CAAe;IAI7B,cAAc,CAAiB;IAI/B,YAAY,CAAmC;IAG/C,SAAS,CAAQ;CAClB,CAAA;AA/BY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;+CACnB;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;qDAC3C;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACzB,4BAAY;mDAAC;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;oDACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;;6DAC7C;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAW,CAAC;IAC5B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;8BAC3B,0BAAW;2DAAC;AAI7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;2DACpC;AAI/B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sDAAwB,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACnE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;yDACM;AAG/C;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAClD,IAAI;sDAAC;8BA9BN,mBAAmB;IAD/B,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;GACvB,mBAAmB,CA+B/B"}
1
+ {"version":3,"file":"thread-message.entity.js","sourceRoot":"","sources":["../../src/threads/thread-message.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAQiB;AACjB,mDAA+C;AAC/C,oEAAgE;AAChE,qFAA+E;AAIxE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE9B,EAAE,CAAU;IAGZ,QAAQ,CAAU;IAIlB,MAAM,CAAgB;IAGtB,OAAO,CAAU;IAGjB,gBAAgB,CAAU;IAI1B,cAAc,CAAe;IAI7B,cAAc,CAAiB;IAI/B,YAAY,CAAmC;IAG/C,SAAS,CAAQ;CAClB,CAAA;AA/BY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;+CACnB;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;qDAC3C;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACzB,4BAAY;mDAAC;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;oDACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;;6DAC7C;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAW,CAAC;IAC5B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;8BAC3B,0BAAW;2DAAC;AAI7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;2DACpC;AAI/B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sDAAwB,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACnE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;yDACM;AAG/C;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAClD,IAAI;sDAAC;8BA9BN,mBAAmB;IAF/B,IAAA,eAAK,EAAC,oCAAoC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACtE,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;GACvB,mBAAmB,CA+B/B"}
@@ -125,6 +125,11 @@ Now run the required process. If relevant, update the state block with context__
125
125
  taskId: latestItem.taskId,
126
126
  }),
127
127
  actor,
128
+ onBehalfOf: {
129
+ actorId: thread.createdByActor.id,
130
+ automated: true,
131
+ description: 'the person who created this thread',
132
+ },
128
133
  });
129
134
  }
130
135
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"thread-state-reconciler.service.js","sourceRoot":"","sources":["../../src/threads/thread-state-reconciler.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread-state-reconciler.service.js","sourceRoot":"","sources":["../../src/threads/thread-state-reconciler.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const thread_state_reconciler_service_1 = require("./thread-state-reconciler.service");
4
+ jest.mock('src/config/env.config', () => ({
5
+ getConfig: () => ({ threadStateReconcilerDebounceMs: 1 }),
6
+ isThreadStateReconcilerEnabled: () => true,
7
+ }));
8
+ jest.mock('./threads.service', () => ({ ThreadsService: class {
9
+ } }));
10
+ jest.mock('./chat.service', () => ({ ChatService: class {
11
+ } }));
12
+ describe('ThreadStateReconcilerService', () => {
13
+ const thread = {
14
+ id: 'thread-1',
15
+ title: 'Plan',
16
+ parentTaskId: null,
17
+ stateContextBlockId: 'block-1',
18
+ createdByActor: { id: 'creator-1' },
19
+ tasks: [],
20
+ };
21
+ const setup = () => {
22
+ const runTask = jest.fn(async () => undefined);
23
+ const service = new thread_state_reconciler_service_1.ThreadStateReconcilerService({ getThreadById: jest.fn(async () => thread) }, { runTask }, { findOne: jest.fn(async () => ({ id: 'agent-actor' })) });
24
+ return { service, runTask };
25
+ };
26
+ it('runs unattended, on behalf of the thread creator rather than whoever changed the task', async () => {
27
+ const { service, runTask } = setup();
28
+ await service.reconcileThreadStateBatch('thread-1', [
29
+ {
30
+ threadId: 'thread-1',
31
+ taskId: 'task-1',
32
+ actorId: 'agent-actor',
33
+ kind: 'status_changed',
34
+ activitySummary: 'Task changed status to DONE.',
35
+ },
36
+ ]);
37
+ service.onModuleDestroy();
38
+ expect(runTask).toHaveBeenCalledWith(expect.objectContaining({
39
+ actor: { id: 'agent-actor' },
40
+ onBehalfOf: expect.objectContaining({ actorId: 'creator-1', automated: true }),
41
+ }));
42
+ });
43
+ });
44
+ //# sourceMappingURL=thread-state-reconciler.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-state-reconciler.service.spec.js","sourceRoot":"","sources":["../../src/threads/thread-state-reconciler.service.spec.ts"],"names":[],"mappings":";;AAAA,uFAAiF;AAEjF,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,+BAA+B,EAAE,CAAC,EAAE,CAAC;IACzD,8BAA8B,EAAE,GAAG,EAAE,CAAC,IAAI;CAC3C,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE;KAAQ,EAAE,CAAC,CAAC,CAAC;AACrE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE;KAAQ,EAAE,CAAC,CAAC,CAAC;AAE/D,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,SAAS;QAC9B,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;QACnC,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,8DAA4B,CAC9C,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,EAAW,EACvD,EAAE,OAAO,EAAW,EACpB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,EAAW,CACnE,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QAErC,MAAO,OAAe,CAAC,yBAAyB,CAAC,UAAU,EAAE;YAC3D;gBACE,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,gBAAgB;gBACtB,eAAe,EAAE,8BAA8B;aAChD;SACF,CAAC,CAAC;QACH,OAAO,CAAC,eAAe,EAAE,CAAC;QAE1B,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,MAAM,CAAC,gBAAgB,CAAC;YACtB,KAAK,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE;YAC5B,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC/E,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -9,6 +9,7 @@ export declare class ThreadEntity {
9
9
  headAgentMessageId: string | null;
10
10
  aiProviderId: string | null;
11
11
  modelId: string | null;
12
+ secret?: string | null;
12
13
  createdByActorId: string;
13
14
  createdByActor?: ActorEntity;
14
15
  parentTaskId?: string | null;
@@ -23,5 +24,6 @@ export declare class ThreadEntity {
23
24
  rowVersion: number;
24
25
  createdAt: Date;
25
26
  updatedAt: Date;
27
+ lastActivityAt: Date;
26
28
  deletedAt?: Date | null;
27
29
  }
@@ -22,6 +22,7 @@ let ThreadEntity = class ThreadEntity {
22
22
  headAgentMessageId;
23
23
  aiProviderId;
24
24
  modelId;
25
+ secret;
25
26
  createdByActorId;
26
27
  createdByActor;
27
28
  parentTaskId;
@@ -36,6 +37,7 @@ let ThreadEntity = class ThreadEntity {
36
37
  rowVersion;
37
38
  createdAt;
38
39
  updatedAt;
40
+ lastActivityAt;
39
41
  deletedAt;
40
42
  };
41
43
  exports.ThreadEntity = ThreadEntity;
@@ -69,6 +71,17 @@ __decorate([
69
71
  (0, typeorm_1.Column)({ type: 'text', nullable: true, name: 'model_id', update: false }),
70
72
  __metadata("design:type", Object)
71
73
  ], ThreadEntity.prototype, "modelId", void 0);
74
+ __decorate([
75
+ (0, typeorm_1.Column)({
76
+ type: 'text',
77
+ nullable: true,
78
+ name: 'secret',
79
+ select: false,
80
+ insert: false,
81
+ update: false,
82
+ }),
83
+ __metadata("design:type", Object)
84
+ ], ThreadEntity.prototype, "secret", void 0);
72
85
  __decorate([
73
86
  (0, typeorm_1.Column)({ type: 'uuid', nullable: false, name: 'created_by_actor_id' }),
74
87
  __metadata("design:type", String)
@@ -148,11 +161,22 @@ __decorate([
148
161
  (0, typeorm_1.UpdateDateColumn)({ type: 'timestamptz', name: 'updated_at' }),
149
162
  __metadata("design:type", Date)
150
163
  ], ThreadEntity.prototype, "updatedAt", void 0);
164
+ __decorate([
165
+ (0, typeorm_1.Column)({
166
+ type: 'timestamptz',
167
+ precision: 3,
168
+ name: 'last_activity_at',
169
+ default: () => "date_trunc('milliseconds', now())",
170
+ update: false,
171
+ }),
172
+ __metadata("design:type", Date)
173
+ ], ThreadEntity.prototype, "lastActivityAt", void 0);
151
174
  __decorate([
152
175
  (0, typeorm_1.DeleteDateColumn)({ type: 'timestamptz', name: 'deleted_at', nullable: true }),
153
176
  __metadata("design:type", Object)
154
177
  ], ThreadEntity.prototype, "deletedAt", void 0);
155
178
  exports.ThreadEntity = ThreadEntity = __decorate([
179
+ (0, typeorm_1.Index)('IDX_threads_last_activity', ['lastActivityAt', 'id']),
156
180
  (0, typeorm_1.Entity)({ name: 'threads' })
157
181
  ], ThreadEntity);
158
182
  //# sourceMappingURL=thread.entity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread.entity.js","sourceRoot":"","sources":["../../src/threads/thread.entity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread.entity.js","sourceRoot":"","sources":["../../src/threads/thread.entity.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,7 @@ describe('ThreadsService - State Context Block', () => {
84
84
  rowVersion: 1,
85
85
  createdAt: new Date(),
86
86
  updatedAt: new Date(),
87
+ lastActivityAt: new Date(),
87
88
  deletedAt: null,
88
89
  };
89
90
  beforeEach(async () => {