@taico/taico 0.0.2 → 0.0.3

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 (181) hide show
  1. package/dist/agents/agent.entity.d.ts +2 -0
  2. package/dist/agents/agent.entity.js +10 -0
  3. package/dist/agents/agent.entity.js.map +1 -1
  4. package/dist/agents/agents.controller.js +6 -0
  5. package/dist/agents/agents.controller.js.map +1 -1
  6. package/dist/agents/agents.service.d.ts +1 -0
  7. package/dist/agents/agents.service.js +36 -7
  8. package/dist/agents/agents.service.js.map +1 -1
  9. package/dist/agents/dto/agent-response.dto.d.ts +3 -0
  10. package/dist/agents/dto/agent-response.dto.js +46 -9
  11. package/dist/agents/dto/agent-response.dto.js.map +1 -1
  12. package/dist/agents/dto/create-agent.dto.d.ts +3 -0
  13. package/dist/agents/dto/create-agent.dto.js +37 -5
  14. package/dist/agents/dto/create-agent.dto.js.map +1 -1
  15. package/dist/agents/dto/patch-agent.dto.d.ts +3 -0
  16. package/dist/agents/dto/patch-agent.dto.js +37 -5
  17. package/dist/agents/dto/patch-agent.dto.js.map +1 -1
  18. package/dist/agents/dto/service/agents.service.types.d.ts +9 -2
  19. package/dist/agents/enums/agent-type.enum.d.ts +1 -0
  20. package/dist/agents/enums/agent-type.enum.js +2 -0
  21. package/dist/agents/enums/agent-type.enum.js.map +1 -1
  22. package/dist/app-init/agent/code-reviewer.agent.js +1 -0
  23. package/dist/app-init/agent/code-reviewer.agent.js.map +1 -1
  24. package/dist/app-init/agent/prompts.d.ts +3 -3
  25. package/dist/app-init/agent/prompts.js +10 -9
  26. package/dist/app-init/agent/prompts.js.map +1 -1
  27. package/dist/app-init/agent/qwen3-coder-next.d.ts +2 -0
  28. package/dist/app-init/agent/qwen3-coder-next.js +22 -0
  29. package/dist/app-init/agent/qwen3-coder-next.js.map +1 -0
  30. package/dist/app-init/app-init.runner.js +7 -0
  31. package/dist/app-init/app-init.runner.js.map +1 -1
  32. package/dist/app.module.js +4 -3
  33. package/dist/app.module.js.map +1 -1
  34. package/dist/authorization-server/authorization.controller.d.ts +1 -0
  35. package/dist/authorization-server/authorization.controller.js +13 -1
  36. package/dist/authorization-server/authorization.controller.js.map +1 -1
  37. package/dist/authorization-server/authorization.service.js.map +1 -1
  38. package/dist/authorization-server/client-registration.service.d.ts +1 -0
  39. package/dist/authorization-server/client-registration.service.js +41 -3
  40. package/dist/authorization-server/client-registration.service.js.map +1 -1
  41. package/dist/authorization-server/dto/consent-metadata-response.dto.d.ts +1 -1
  42. package/dist/authorization-server/dto/consent-metadata-response.dto.js +1 -1
  43. package/dist/authorization-server/dto/consent-metadata-response.dto.js.map +1 -1
  44. package/dist/authorization-server/errors/web-auth.errors.d.ts +16 -0
  45. package/dist/authorization-server/errors/web-auth.errors.js +33 -0
  46. package/dist/authorization-server/errors/web-auth.errors.js.map +1 -0
  47. package/dist/authorization-server/web-auth.service.js +11 -2
  48. package/dist/authorization-server/web-auth.service.js.map +1 -1
  49. package/dist/config/env.config.d.ts +0 -2
  50. package/dist/config/env.config.js +8 -31
  51. package/dist/config/env.config.js.map +1 -1
  52. package/dist/context/context.module.js +2 -0
  53. package/dist/context/context.module.js.map +1 -1
  54. package/dist/context/context.service.d.ts +3 -1
  55. package/dist/context/context.service.js +11 -2
  56. package/dist/context/context.service.js.map +1 -1
  57. package/dist/context/errors/context.errors.d.ts +4 -0
  58. package/dist/context/errors/context.errors.js +8 -1
  59. package/dist/context/errors/context.errors.js.map +1 -1
  60. package/dist/discovery/discovery.controller.d.ts +4 -2
  61. package/dist/discovery/discovery.controller.js +30 -2
  62. package/dist/discovery/discovery.controller.js.map +1 -1
  63. package/dist/discovery/dto/protected-resource-metadata-response.dto.d.ts +7 -0
  64. package/dist/discovery/dto/protected-resource-metadata-response.dto.js +60 -0
  65. package/dist/discovery/dto/protected-resource-metadata-response.dto.js.map +1 -0
  66. package/dist/errors/http/error-catalog.js +18 -0
  67. package/dist/errors/http/error-catalog.js.map +1 -1
  68. package/dist/identity-provider/actor.controller.d.ts +2 -0
  69. package/dist/identity-provider/actor.controller.js +31 -0
  70. package/dist/identity-provider/actor.controller.js.map +1 -1
  71. package/dist/identity-provider/actor.service.js +1 -0
  72. package/dist/identity-provider/actor.service.js.map +1 -1
  73. package/dist/identity-provider/dto/search-actors-query.dto.d.ts +5 -0
  74. package/dist/identity-provider/dto/search-actors-query.dto.js +60 -0
  75. package/dist/identity-provider/dto/search-actors-query.dto.js.map +1 -0
  76. package/dist/main.js +26 -2
  77. package/dist/main.js.map +1 -1
  78. package/dist/meta/meta.service.js +25 -3
  79. package/dist/meta/meta.service.js.map +1 -1
  80. package/dist/{context/migrations/1765060392-AddNestedPageSchema.d.ts → migrations/1700000000000-BaselineSchema.d.ts} +1 -1
  81. package/dist/migrations/1700000000000-BaselineSchema.js +480 -0
  82. package/dist/migrations/1700000000000-BaselineSchema.js.map +1 -0
  83. package/dist/{mcp-registry/migrations/1733964000000-AddProvidedIdToMcpConnections.d.ts → migrations/1700000000001-UpdateAgentTypeConstraint.d.ts} +2 -1
  84. package/dist/migrations/1700000000001-UpdateAgentTypeConstraint.js +142 -0
  85. package/dist/migrations/1700000000001-UpdateAgentTypeConstraint.js.map +1 -0
  86. package/dist/public/assets/index-BCPnRhO0.js +11 -0
  87. package/dist/public/assets/index-_FDBdUKK.css +1 -0
  88. package/dist/public/beta/assets/index-S66NF8rC.js +85 -0
  89. package/dist/public/beta/index.html +1 -1
  90. package/dist/public/icons/cockatoo.png +0 -0
  91. package/dist/public/icons/qwen.png +0 -0
  92. package/dist/public/index.html +2 -2
  93. package/dist/search/search.service.js +10 -1
  94. package/dist/search/search.service.js.map +1 -1
  95. package/dist/search/search.types.d.ts +1 -0
  96. package/dist/tasks/artefact.entity.d.ts +12 -0
  97. package/dist/tasks/artefact.entity.js +67 -0
  98. package/dist/tasks/artefact.entity.js.map +1 -0
  99. package/dist/tasks/dto/artefact-response.dto.d.ts +11 -0
  100. package/dist/tasks/dto/artefact-response.dto.js +75 -0
  101. package/dist/tasks/dto/artefact-response.dto.js.map +1 -0
  102. package/dist/tasks/dto/create-artefact.dto.d.ts +4 -0
  103. package/dist/tasks/dto/create-artefact.dto.js +38 -0
  104. package/dist/tasks/dto/create-artefact.dto.js.map +1 -0
  105. package/dist/tasks/dto/service/tasks.service.types.d.ts +12 -0
  106. package/dist/tasks/dto/task-response.dto.d.ts +2 -0
  107. package/dist/tasks/dto/task-response.dto.js +11 -0
  108. package/dist/tasks/dto/task-response.dto.js.map +1 -1
  109. package/dist/tasks/errors/tasks.errors.d.ts +8 -0
  110. package/dist/tasks/errors/tasks.errors.js +15 -1
  111. package/dist/tasks/errors/tasks.errors.js.map +1 -1
  112. package/dist/tasks/events/tasks.events.d.ts +5 -0
  113. package/dist/tasks/events/tasks.events.js +8 -1
  114. package/dist/tasks/events/tasks.events.js.map +1 -1
  115. package/dist/tasks/task.entity.d.ts +2 -0
  116. package/dist/tasks/task.entity.js +6 -0
  117. package/dist/tasks/task.entity.js.map +1 -1
  118. package/dist/tasks/tasks.controller.d.ts +3 -0
  119. package/dist/tasks/tasks.controller.js +27 -0
  120. package/dist/tasks/tasks.controller.js.map +1 -1
  121. package/dist/tasks/tasks.gateway.d.ts +2 -1
  122. package/dist/tasks/tasks.gateway.js +23 -0
  123. package/dist/tasks/tasks.gateway.js.map +1 -1
  124. package/dist/tasks/tasks.mcp.gateway.js +28 -1
  125. package/dist/tasks/tasks.mcp.gateway.js.map +1 -1
  126. package/dist/tasks/tasks.module.js +2 -1
  127. package/dist/tasks/tasks.module.js.map +1 -1
  128. package/dist/tasks/tasks.service.d.ts +6 -2
  129. package/dist/tasks/tasks.service.js +68 -4
  130. package/dist/tasks/tasks.service.js.map +1 -1
  131. package/dist/threads/dto/append-thread-state.dto.d.ts +3 -0
  132. package/dist/threads/dto/append-thread-state.dto.js +28 -0
  133. package/dist/threads/dto/append-thread-state.dto.js.map +1 -0
  134. package/dist/threads/dto/create-thread.dto.d.ts +1 -0
  135. package/dist/threads/dto/create-thread.dto.js +9 -0
  136. package/dist/threads/dto/create-thread.dto.js.map +1 -1
  137. package/dist/threads/dto/service/threads.service.types.d.ts +3 -1
  138. package/dist/threads/dto/thread-response.dto.d.ts +2 -1
  139. package/dist/threads/dto/thread-response.dto.js +12 -5
  140. package/dist/threads/dto/thread-response.dto.js.map +1 -1
  141. package/dist/threads/dto/thread-state-response.dto.d.ts +3 -0
  142. package/dist/threads/dto/thread-state-response.dto.js +25 -0
  143. package/dist/threads/dto/thread-state-response.dto.js.map +1 -0
  144. package/dist/threads/dto/update-thread-state.dto.d.ts +3 -0
  145. package/dist/threads/dto/update-thread-state.dto.js +28 -0
  146. package/dist/threads/dto/update-thread-state.dto.js.map +1 -0
  147. package/dist/threads/thread.entity.d.ts +4 -0
  148. package/dist/threads/thread.entity.js +22 -0
  149. package/dist/threads/thread.entity.js.map +1 -1
  150. package/dist/threads/threads-state.service.spec.d.ts +1 -0
  151. package/dist/threads/threads-state.service.spec.js +415 -0
  152. package/dist/threads/threads-state.service.spec.js.map +1 -0
  153. package/dist/threads/threads.controller.d.ts +7 -0
  154. package/dist/threads/threads.controller.js +79 -0
  155. package/dist/threads/threads.controller.js.map +1 -1
  156. package/dist/threads/threads.module.js +2 -0
  157. package/dist/threads/threads.module.js.map +1 -1
  158. package/dist/threads/threads.service.d.ts +9 -2
  159. package/dist/threads/threads.service.js +149 -22
  160. package/dist/threads/threads.service.js.map +1 -1
  161. package/dist/threads/threads.service.spec.d.ts +1 -0
  162. package/dist/threads/threads.service.spec.js +431 -0
  163. package/dist/threads/threads.service.spec.js.map +1 -0
  164. package/dist/tsconfig.tsbuildinfo +1 -1
  165. package/package.json +6 -4
  166. package/dist/context/migrations/1765060392-AddNestedPageSchema.js +0 -61
  167. package/dist/context/migrations/1765060392-AddNestedPageSchema.js.map +0 -1
  168. package/dist/llm-helper/llm-helper.module.d.ts +0 -2
  169. package/dist/llm-helper/llm-helper.module.js +0 -21
  170. package/dist/llm-helper/llm-helper.module.js.map +0 -1
  171. package/dist/llm-helper/llm-helper.service.d.ts +0 -9
  172. package/dist/llm-helper/llm-helper.service.js +0 -71
  173. package/dist/llm-helper/llm-helper.service.js.map +0 -1
  174. package/dist/mcp-registry/migrations/1733964000000-AddProvidedIdToMcpConnections.js +0 -25
  175. package/dist/mcp-registry/migrations/1733964000000-AddProvidedIdToMcpConnections.js.map +0 -1
  176. package/dist/mcp-registry/migrations/1734184000000-AddUrlToMcpServers.d.ts +0 -5
  177. package/dist/mcp-registry/migrations/1734184000000-AddUrlToMcpServers.js +0 -19
  178. package/dist/mcp-registry/migrations/1734184000000-AddUrlToMcpServers.js.map +0 -1
  179. package/dist/public/assets/index-CQNjiEI4.css +0 -1
  180. package/dist/public/assets/index-DAZtEION.js +0 -11
  181. package/dist/public/beta/assets/index-BakZ6bA-.js +0 -85
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const testing_1 = require("@nestjs/testing");
4
+ const typeorm_1 = require("@nestjs/typeorm");
5
+ const threads_service_1 = require("./threads.service");
6
+ const thread_entity_1 = require("./thread.entity");
7
+ const task_entity_1 = require("../tasks/task.entity");
8
+ const block_entity_1 = require("../context/block.entity");
9
+ const actor_entity_1 = require("../identity-provider/actor.entity");
10
+ const agent_run_entity_1 = require("../agent-runs/agent-run.entity");
11
+ const meta_service_1 = require("../meta/meta.service");
12
+ const context_service_1 = require("../context/context.service");
13
+ const threads_errors_1 = require("./errors/threads.errors");
14
+ const enums_1 = require("../identity-provider/enums");
15
+ describe('ThreadsService - Parent Task ID', () => {
16
+ let service;
17
+ let threadRepository;
18
+ let taskRepository;
19
+ let actorRepository;
20
+ let metaService;
21
+ let contextService;
22
+ const mockActor = {
23
+ id: 'actor-uuid',
24
+ type: enums_1.ActorType.HUMAN,
25
+ slug: 'test-user',
26
+ displayName: 'Test User',
27
+ avatarUrl: null,
28
+ introduction: null,
29
+ createdAt: new Date(),
30
+ updatedAt: new Date(),
31
+ };
32
+ const mockParentTask = {
33
+ id: 'parent-task-uuid',
34
+ name: 'Parent Task',
35
+ description: 'Parent task description',
36
+ status: 'NOT_STARTED',
37
+ createdByActorId: 'actor-uuid',
38
+ assigneeActorId: null,
39
+ sessionId: null,
40
+ tags: [],
41
+ comments: [],
42
+ artefacts: [],
43
+ inputRequests: [],
44
+ dependsOn: [],
45
+ dependents: [],
46
+ rowVersion: 1,
47
+ createdAt: new Date(),
48
+ updatedAt: new Date(),
49
+ deletedAt: null,
50
+ get assignee() {
51
+ return this.assigneeActor?.slug ?? null;
52
+ },
53
+ };
54
+ const mockThread = {
55
+ id: 'thread-uuid',
56
+ title: 'Test Thread',
57
+ createdByActorId: 'actor-uuid',
58
+ parentTaskId: 'parent-task-uuid',
59
+ stateContextBlockId: 'state-block-uuid',
60
+ tasks: [mockParentTask],
61
+ referencedContextBlocks: [],
62
+ tags: [],
63
+ participants: [],
64
+ createdByActor: mockActor,
65
+ rowVersion: 1,
66
+ createdAt: new Date(),
67
+ updatedAt: new Date(),
68
+ deletedAt: null,
69
+ };
70
+ beforeEach(async () => {
71
+ const module = await testing_1.Test.createTestingModule({
72
+ providers: [
73
+ threads_service_1.ThreadsService,
74
+ {
75
+ provide: (0, typeorm_1.getRepositoryToken)(thread_entity_1.ThreadEntity),
76
+ useValue: {
77
+ create: jest.fn(),
78
+ save: jest.fn(),
79
+ findOne: jest.fn(),
80
+ findBy: jest.fn(),
81
+ findAndCount: jest.fn(),
82
+ softRemove: jest.fn(),
83
+ createQueryBuilder: jest.fn(),
84
+ },
85
+ },
86
+ {
87
+ provide: (0, typeorm_1.getRepositoryToken)(task_entity_1.TaskEntity),
88
+ useValue: {
89
+ findOne: jest.fn(),
90
+ findBy: jest.fn(),
91
+ },
92
+ },
93
+ {
94
+ provide: (0, typeorm_1.getRepositoryToken)(block_entity_1.ContextBlockEntity),
95
+ useValue: {
96
+ findOne: jest.fn(),
97
+ findBy: jest.fn(),
98
+ },
99
+ },
100
+ {
101
+ provide: (0, typeorm_1.getRepositoryToken)(actor_entity_1.ActorEntity),
102
+ useValue: {
103
+ findOne: jest.fn(),
104
+ findBy: jest.fn(),
105
+ },
106
+ },
107
+ {
108
+ provide: (0, typeorm_1.getRepositoryToken)(agent_run_entity_1.AgentRunEntity),
109
+ useValue: {
110
+ createQueryBuilder: jest.fn(),
111
+ },
112
+ },
113
+ {
114
+ provide: meta_service_1.MetaService,
115
+ useValue: {
116
+ findOrCreateTagEntities: jest.fn(),
117
+ findOrCreateTagEntity: jest.fn(),
118
+ cleanupOrphanedTag: jest.fn(),
119
+ },
120
+ },
121
+ {
122
+ provide: context_service_1.ContextService,
123
+ useValue: {
124
+ createBlock: jest.fn(),
125
+ getBlockById: jest.fn(),
126
+ updateBlock: jest.fn(),
127
+ appendToBlock: jest.fn(),
128
+ deleteBlock: jest.fn(),
129
+ },
130
+ },
131
+ ],
132
+ }).compile();
133
+ service = module.get(threads_service_1.ThreadsService);
134
+ threadRepository = module.get((0, typeorm_1.getRepositoryToken)(thread_entity_1.ThreadEntity));
135
+ taskRepository = module.get((0, typeorm_1.getRepositoryToken)(task_entity_1.TaskEntity));
136
+ actorRepository = module.get((0, typeorm_1.getRepositoryToken)(actor_entity_1.ActorEntity));
137
+ metaService = module.get(meta_service_1.MetaService);
138
+ contextService = module.get(context_service_1.ContextService);
139
+ });
140
+ const mockStateBlock = {
141
+ id: 'state-block-uuid',
142
+ title: 'Thread State: Test Thread',
143
+ content: 'This thread was created to achieve task Parent Task (id parent-task-uuid).',
144
+ createdByActorId: 'actor-uuid',
145
+ createdBy: 'test-user',
146
+ assigneeActorId: null,
147
+ assignee: null,
148
+ parentId: null,
149
+ order: 0,
150
+ tags: [{ id: 'tag-uuid', name: 'thread:state', color: '#000000', createdAt: new Date(), updatedAt: new Date() }],
151
+ createdAt: new Date(),
152
+ updatedAt: new Date(),
153
+ };
154
+ afterEach(() => {
155
+ jest.clearAllMocks();
156
+ });
157
+ describe('Thread Creation Tests', () => {
158
+ describe('1.1. Successful Thread Creation with Parent Task', () => {
159
+ it('should create a thread with a valid parent task ID', async () => {
160
+ const input = {
161
+ title: 'Test Thread',
162
+ createdByActorId: 'actor-uuid',
163
+ parentTaskId: 'parent-task-uuid',
164
+ };
165
+ actorRepository.findOne.mockResolvedValue(mockActor);
166
+ taskRepository.findOne.mockResolvedValue(mockParentTask);
167
+ contextService.createBlock.mockResolvedValue(mockStateBlock);
168
+ threadRepository.create.mockReturnValue(mockThread);
169
+ threadRepository.save.mockResolvedValue(mockThread);
170
+ taskRepository.findBy.mockResolvedValue([mockParentTask]);
171
+ threadRepository.findOne.mockResolvedValue(mockThread);
172
+ const result = await service.createThread(input);
173
+ expect(result.parentTaskId).toBe('parent-task-uuid');
174
+ expect(taskRepository.findOne).toHaveBeenCalledWith({
175
+ where: { id: 'parent-task-uuid' },
176
+ });
177
+ expect(threadRepository.create).toHaveBeenCalledWith({
178
+ title: 'Test Thread',
179
+ createdByActorId: 'actor-uuid',
180
+ parentTaskId: 'parent-task-uuid',
181
+ stateContextBlockId: 'state-block-uuid',
182
+ });
183
+ });
184
+ });
185
+ describe('1.3. Thread Creation Fails with Non-Existent Parent Task', () => {
186
+ it('should throw TaskNotFoundForThreadError when parent task does not exist', async () => {
187
+ const input = {
188
+ title: 'Test Thread',
189
+ createdByActorId: 'actor-uuid',
190
+ parentTaskId: 'non-existent-task-uuid',
191
+ };
192
+ actorRepository.findOne.mockResolvedValue(mockActor);
193
+ taskRepository.findOne.mockResolvedValue(null);
194
+ await expect(service.createThread(input)).rejects.toThrow(threads_errors_1.TaskNotFoundForThreadError);
195
+ expect(threadRepository.create).not.toHaveBeenCalled();
196
+ });
197
+ });
198
+ describe('1.4. Parent Task is Automatically Added to Thread\'s Tasks Relation', () => {
199
+ it('should include parent task in tasks array even if not in taskIds', async () => {
200
+ const input = {
201
+ title: 'Test Thread',
202
+ createdByActorId: 'actor-uuid',
203
+ parentTaskId: 'parent-task-uuid',
204
+ taskIds: [],
205
+ };
206
+ actorRepository.findOne.mockResolvedValue(mockActor);
207
+ taskRepository.findOne.mockResolvedValue(mockParentTask);
208
+ contextService.createBlock.mockResolvedValue(mockStateBlock);
209
+ threadRepository.create.mockReturnValue(mockThread);
210
+ threadRepository.save.mockResolvedValue(mockThread);
211
+ taskRepository.findBy.mockResolvedValue([mockParentTask]);
212
+ threadRepository.findOne.mockResolvedValue(mockThread);
213
+ await service.createThread(input);
214
+ expect(taskRepository.findBy).toHaveBeenCalledWith({
215
+ id: expect.anything(),
216
+ });
217
+ const callArg = taskRepository.findBy.mock.calls[0][0];
218
+ expect(callArg).toBeDefined();
219
+ });
220
+ });
221
+ describe('1.5. Parent Task Not Duplicated When Also in taskIds', () => {
222
+ it('should not duplicate parent task when it is also in taskIds', async () => {
223
+ const additionalTask = {
224
+ ...mockParentTask,
225
+ id: 'another-task-uuid',
226
+ name: 'Another Task',
227
+ };
228
+ const input = {
229
+ title: 'Test Thread',
230
+ createdByActorId: 'actor-uuid',
231
+ parentTaskId: 'parent-task-uuid',
232
+ taskIds: ['parent-task-uuid', 'another-task-uuid'],
233
+ };
234
+ actorRepository.findOne.mockResolvedValue(mockActor);
235
+ taskRepository.findOne.mockResolvedValue(mockParentTask);
236
+ contextService.createBlock.mockResolvedValue(mockStateBlock);
237
+ threadRepository.create.mockReturnValue(mockThread);
238
+ threadRepository.save.mockResolvedValue(mockThread);
239
+ taskRepository.findBy.mockResolvedValue([
240
+ mockParentTask,
241
+ additionalTask,
242
+ ]);
243
+ threadRepository.findOne.mockResolvedValue({
244
+ ...mockThread,
245
+ tasks: [mockParentTask, additionalTask],
246
+ });
247
+ const result = await service.createThread(input);
248
+ const findByCall = taskRepository.findBy.mock.calls[0][0];
249
+ expect(findByCall).toBeDefined();
250
+ expect(result.tasks.length).toBe(2);
251
+ });
252
+ });
253
+ describe('Thread Creation with Non-Existent Creator', () => {
254
+ it('should throw ActorNotFoundForThreadError when creator does not exist', async () => {
255
+ const input = {
256
+ title: 'Test Thread',
257
+ createdByActorId: 'non-existent-actor',
258
+ parentTaskId: 'parent-task-uuid',
259
+ };
260
+ actorRepository.findOne.mockResolvedValue(null);
261
+ await expect(service.createThread(input)).rejects.toThrow(threads_errors_1.ActorNotFoundForThreadError);
262
+ expect(taskRepository.findOne).not.toHaveBeenCalled();
263
+ });
264
+ });
265
+ });
266
+ describe('Thread Retrieval Tests', () => {
267
+ describe('3.1. Get Thread Returns Correct parentTaskId', () => {
268
+ it('should return thread with correct parentTaskId', async () => {
269
+ threadRepository.findOne.mockResolvedValue(mockThread);
270
+ const result = await service.getThreadById('thread-uuid');
271
+ expect(result.parentTaskId).toBe('parent-task-uuid');
272
+ expect(result.parentTaskId).not.toBeNull();
273
+ });
274
+ });
275
+ describe('Get Thread by Non-Existent ID', () => {
276
+ it('should throw ThreadNotFoundError when thread does not exist', async () => {
277
+ threadRepository.findOne.mockResolvedValue(null);
278
+ await expect(service.getThreadById('non-existent-uuid')).rejects.toThrow(threads_errors_1.ThreadNotFoundError);
279
+ });
280
+ });
281
+ describe('3.3. Find Thread by Task ID', () => {
282
+ it('should find thread by parent task ID', async () => {
283
+ const mockQueryBuilder = {
284
+ leftJoinAndSelect: jest.fn().mockReturnThis(),
285
+ innerJoin: jest.fn().mockReturnThis(),
286
+ where: jest.fn().mockReturnThis(),
287
+ getOne: jest.fn().mockResolvedValue(mockThread),
288
+ };
289
+ threadRepository.createQueryBuilder = jest
290
+ .fn()
291
+ .mockReturnValue(mockQueryBuilder);
292
+ const result = await service.findThreadByTaskId('parent-task-uuid');
293
+ expect(result).toBeDefined();
294
+ expect(result?.parentTaskId).toBe('parent-task-uuid');
295
+ expect(mockQueryBuilder.where).toHaveBeenCalledWith('filterTask.id = :taskId', { taskId: 'parent-task-uuid' });
296
+ });
297
+ it('should return null when thread is not found by task ID', async () => {
298
+ const mockQueryBuilder = {
299
+ leftJoinAndSelect: jest.fn().mockReturnThis(),
300
+ innerJoin: jest.fn().mockReturnThis(),
301
+ where: jest.fn().mockReturnThis(),
302
+ getOne: jest.fn().mockResolvedValue(null),
303
+ };
304
+ threadRepository.createQueryBuilder = jest
305
+ .fn()
306
+ .mockReturnValue(mockQueryBuilder);
307
+ const result = await service.findThreadByTaskId('non-existent-task-uuid');
308
+ expect(result).toBeNull();
309
+ });
310
+ });
311
+ });
312
+ describe('Thread Deletion Tests', () => {
313
+ describe('2.2. Can Delete Thread Without Affecting Parent Task', () => {
314
+ it('should soft-delete thread successfully', async () => {
315
+ threadRepository.findOne.mockResolvedValue(mockThread);
316
+ threadRepository.softRemove.mockResolvedValue(mockThread);
317
+ await service.deleteThread('thread-uuid', 'actor-uuid');
318
+ expect(threadRepository.softRemove).toHaveBeenCalledWith(mockThread);
319
+ });
320
+ it('should throw ThreadNotFoundError when deleting non-existent thread', async () => {
321
+ threadRepository.findOne.mockResolvedValue(null);
322
+ await expect(service.deleteThread('non-existent-uuid', 'actor-uuid')).rejects.toThrow(threads_errors_1.ThreadNotFoundError);
323
+ expect(threadRepository.softRemove).not.toHaveBeenCalled();
324
+ });
325
+ });
326
+ });
327
+ describe('Edge Cases', () => {
328
+ describe('5.1. Multiple Threads Can Share Same Parent Task', () => {
329
+ it('should allow creating multiple threads with the same parent task', async () => {
330
+ const input1 = {
331
+ title: 'Thread 1',
332
+ createdByActorId: 'actor-uuid',
333
+ parentTaskId: 'parent-task-uuid',
334
+ };
335
+ const input2 = {
336
+ title: 'Thread 2',
337
+ createdByActorId: 'actor-uuid',
338
+ parentTaskId: 'parent-task-uuid',
339
+ };
340
+ actorRepository.findOne.mockResolvedValue(mockActor);
341
+ taskRepository.findOne.mockResolvedValue(mockParentTask);
342
+ taskRepository.findBy.mockResolvedValue([mockParentTask]);
343
+ contextService.createBlock.mockResolvedValue(mockStateBlock);
344
+ const thread1 = { ...mockThread, id: 'thread-1-uuid', title: 'Thread 1' };
345
+ const thread2 = { ...mockThread, id: 'thread-2-uuid', title: 'Thread 2' };
346
+ threadRepository.create
347
+ .mockReturnValueOnce(thread1)
348
+ .mockReturnValueOnce(thread2);
349
+ threadRepository.save
350
+ .mockResolvedValueOnce(thread1)
351
+ .mockResolvedValueOnce(thread2);
352
+ threadRepository.findOne
353
+ .mockResolvedValueOnce(thread1)
354
+ .mockResolvedValueOnce(thread2);
355
+ const result1 = await service.createThread(input1);
356
+ const result2 = await service.createThread(input2);
357
+ expect(result1.parentTaskId).toBe('parent-task-uuid');
358
+ expect(result2.parentTaskId).toBe('parent-task-uuid');
359
+ expect(result1.id).not.toBe(result2.id);
360
+ });
361
+ });
362
+ describe('5.3. Attaching Additional Tasks Does Not Change Parent', () => {
363
+ it('should not change parentTaskId when attaching new tasks', async () => {
364
+ const newTask = {
365
+ ...mockParentTask,
366
+ id: 'new-task-uuid',
367
+ name: 'New Task',
368
+ };
369
+ const threadWithTwoTasks = {
370
+ ...mockThread,
371
+ tasks: [mockParentTask, newTask],
372
+ };
373
+ threadRepository.findOne.mockResolvedValue(mockThread);
374
+ taskRepository.findOne.mockResolvedValue(newTask);
375
+ threadRepository.save.mockResolvedValue(threadWithTwoTasks);
376
+ threadRepository.findOne.mockResolvedValueOnce(mockThread);
377
+ threadRepository.findOne.mockResolvedValueOnce(threadWithTwoTasks);
378
+ threadRepository.findOne.mockResolvedValueOnce(threadWithTwoTasks);
379
+ const result = await service.attachTask('thread-uuid', 'new-task-uuid');
380
+ expect(result.parentTaskId).toBe('parent-task-uuid');
381
+ expect(result.tasks.length).toBe(2);
382
+ });
383
+ });
384
+ });
385
+ describe('Thread Update Tests', () => {
386
+ it('should update thread title without changing parentTaskId', async () => {
387
+ const updatedThread = { ...mockThread, title: 'Updated Title' };
388
+ threadRepository.findOne
389
+ .mockResolvedValueOnce(mockThread)
390
+ .mockResolvedValueOnce(updatedThread);
391
+ threadRepository.save.mockResolvedValue(updatedThread);
392
+ const result = await service.updateThread('thread-uuid', { title: 'Updated Title' }, 'actor-uuid');
393
+ expect(result.title).toBe('Updated Title');
394
+ expect(result.parentTaskId).toBe('parent-task-uuid');
395
+ });
396
+ });
397
+ describe('Thread Listing Tests', () => {
398
+ it('should list threads with pagination', async () => {
399
+ threadRepository.findAndCount.mockResolvedValue([[mockThread], 1]);
400
+ const result = await service.listThreads({ page: 1, limit: 20 });
401
+ expect(result.items.length).toBe(1);
402
+ expect(result.total).toBe(1);
403
+ expect(result.page).toBe(1);
404
+ expect(result.limit).toBe(20);
405
+ });
406
+ });
407
+ describe('findThreadsByStateBlockId', () => {
408
+ it('should find threads by state block ID including soft-deleted', async () => {
409
+ threadRepository.find.mockResolvedValue([mockThread]);
410
+ const result = await service.findThreadsByStateBlockId('state-block-uuid');
411
+ expect(result.length).toBe(1);
412
+ expect(result[0].id).toBe('thread-uuid');
413
+ expect(threadRepository.find).toHaveBeenCalledWith({
414
+ where: { stateContextBlockId: 'state-block-uuid' },
415
+ relations: expect.any(Array),
416
+ withDeleted: true,
417
+ });
418
+ });
419
+ it('should return empty array when no threads use the state block', async () => {
420
+ threadRepository.find.mockResolvedValue([]);
421
+ const result = await service.findThreadsByStateBlockId('non-existent-state-block');
422
+ expect(result.length).toBe(0);
423
+ expect(threadRepository.find).toHaveBeenCalledWith({
424
+ where: { stateContextBlockId: 'non-existent-state-block' },
425
+ relations: expect.any(Array),
426
+ withDeleted: true,
427
+ });
428
+ });
429
+ });
430
+ });
431
+ //# sourceMappingURL=threads.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.service.spec.js","sourceRoot":"","sources":["../../src/threads/threads.service.spec.ts"],"names":[],"mappings":"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"}