crewx 0.8.7-rc.2 → 0.8.7-rc.21

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 (94) hide show
  1. package/dist/assets/MarketPage-aY16UW1_.js +51 -0
  2. package/dist/assets/{PromptTab-DPxKgALd.js → PromptTab-C3aTJS6u.js} +7 -7
  3. package/dist/assets/_baseUniq-DxEFlwNt.js +1 -0
  4. package/dist/assets/{arc-Wd7DG8CX.js → arc-BCQAokB1.js} +1 -1
  5. package/dist/assets/architectureDiagram-UYN6MBPD-Bc87ujv2.js +36 -0
  6. package/dist/assets/blockDiagram-ZHA2E4KO-wC9uH8Lb.js +121 -0
  7. package/dist/assets/{c4Diagram-6F5ED5ID-CcfPHYky.js → c4Diagram-6F5ED5ID-CqB7lqni.js} +1 -1
  8. package/dist/assets/channel-DNLHkiNp.js +1 -0
  9. package/dist/assets/{chunk-5HRBRIJM-TGnRph8o.js → chunk-5HRBRIJM-Cc1L17Eh.js} +1 -1
  10. package/dist/assets/{chunk-7U56Z5CX-D24Jb5U0.js → chunk-7U56Z5CX-Df3nu_7G.js} +1 -1
  11. package/dist/assets/{chunk-ASOPGD6M-zBk7x36Z.js → chunk-ASOPGD6M-DIXslLG-.js} +1 -1
  12. package/dist/assets/{chunk-KFBOBJHC-U1tpWuJd.js → chunk-KFBOBJHC-FytVljyP.js} +1 -1
  13. package/dist/assets/{chunk-T2TOU4HS-P78s0i18.js → chunk-T2TOU4HS-CU5z-cXq.js} +1 -1
  14. package/dist/assets/{chunk-TMUBEWPD-_9HBqU-T.js → chunk-TMUBEWPD-CWo1AFyn.js} +1 -1
  15. package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +1 -0
  16. package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +1 -0
  17. package/dist/assets/clone-B9O3E3P1.js +1 -0
  18. package/dist/assets/dagre-4EVJKHTY-CgZW5tg4.js +4 -0
  19. package/dist/assets/diagram-QW4FP2JN-CJAng8RC.js +24 -0
  20. package/dist/assets/{erDiagram-6RL3IURR-CR3kiDSu.js → erDiagram-6RL3IURR-C1uHztHX.js} +2 -2
  21. package/dist/assets/{flowDiagram-7ASYPVHJ-B0gVEfBk.js → flowDiagram-7ASYPVHJ-Yiu2odO-.js} +1 -1
  22. package/dist/assets/{ganttDiagram-NTVNEXSI-CIEk1X3_.js → ganttDiagram-NTVNEXSI-tutc0dJP.js} +3 -3
  23. package/dist/assets/gitGraph-YCYPL57B-C3jM6T4G.js +133 -0
  24. package/dist/assets/gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js +65 -0
  25. package/dist/assets/graph-DC224ILV.js +1 -0
  26. package/dist/assets/infoDiagram-A4XQUW5V-Do7Mpzkx.js +2 -0
  27. package/dist/assets/{journeyDiagram-G5WM74LC-U9w5k3my.js → journeyDiagram-G5WM74LC-DAruEJc7.js} +1 -1
  28. package/dist/assets/{kanban-definition-QRCXZQQD-CO8Lwd1_.js → kanban-definition-QRCXZQQD-DB63vLR0.js} +1 -1
  29. package/dist/assets/layout-BiYH5x6Q.js +1 -0
  30. package/dist/assets/{linear-CHGWcXFV.js → linear-CLyGW2s0.js} +1 -1
  31. package/dist/assets/main-CEKkUqZb.js +1094 -0
  32. package/dist/assets/main-D3YeRndF.css +10 -0
  33. package/dist/assets/min-ChJMFU2N.js +1 -0
  34. package/dist/assets/{mindmap-definition-GWI6TPTV-FRHfidFi.js → mindmap-definition-GWI6TPTV-CtADqQgd.js} +1 -1
  35. package/dist/assets/pieDiagram-YF2LJOPJ-BSOfzo3O.js +30 -0
  36. package/dist/assets/{quadrantDiagram-OS5C2QUG-N0MJL1hU.js → quadrantDiagram-OS5C2QUG-BLBQNFVb.js} +1 -1
  37. package/dist/assets/{requirementDiagram-MIRIMTAZ-n0yYIEdg.js → requirementDiagram-MIRIMTAZ-DqorvuS6.js} +2 -2
  38. package/dist/assets/{sankeyDiagram-Y46BX6SQ-DzRt1UUn.js → sankeyDiagram-Y46BX6SQ-4NDcrLkB.js} +1 -1
  39. package/dist/assets/{sequenceDiagram-G6AWOVSC-Bw73EL9L.js → sequenceDiagram-G6AWOVSC-yha6BxK2.js} +1 -1
  40. package/dist/assets/stateDiagram-MAYHULR4-XJ_I41ez.js +1 -0
  41. package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +1 -0
  42. package/dist/assets/{timeline-definition-U7ZMHBDA-BEgtmEeC.js → timeline-definition-U7ZMHBDA-DCNrmvE7.js} +1 -1
  43. package/dist/assets/{xychartDiagram-6QU3TZC5-bWuCFYmh.js → xychartDiagram-6QU3TZC5-9N-Ohhdp.js} +2 -2
  44. package/dist/index.html +2 -2
  45. package/dist-server/app.module.js +6 -0
  46. package/dist-server/common/analytics.client.js +180 -0
  47. package/dist-server/common/analytics.module.js +21 -0
  48. package/dist-server/common/device-id.js +33 -0
  49. package/dist-server/domain/cli/cli.service.js +66 -4
  50. package/dist-server/domain/document/document.service.js +6 -3
  51. package/dist-server/domain/goal/dto/goal.dto.js +49 -0
  52. package/dist-server/domain/goal/goal.controller.js +86 -0
  53. package/dist-server/domain/goal/goal.module.js +22 -0
  54. package/dist-server/domain/goal/goal.service.js +197 -0
  55. package/dist-server/domain/goal/parser/goal-md-parser.js +166 -0
  56. package/dist-server/domain/goal/parser/goal-md-serializer.js +110 -0
  57. package/dist-server/domain/market/market.controller.js +25 -1
  58. package/dist-server/domain/market/market.service.js +414 -18
  59. package/dist-server/domain/planner/dto/planner.dto.js +7 -44
  60. package/dist-server/domain/planner/planner.controller.js +2 -2
  61. package/dist-server/domain/planner/planner.service.js +24 -0
  62. package/dist-server/domain/settings/settings.controller.js +52 -0
  63. package/dist-server/domain/settings/settings.module.js +22 -0
  64. package/dist-server/domain/settings/settings.service.js +105 -0
  65. package/dist-server/domain/task/task.service.js +20 -0
  66. package/dist-server/domain/thread/thread.controller.js +28 -0
  67. package/dist-server/domain/thread/thread.service.js +20 -0
  68. package/dist-server/main.js +1 -0
  69. package/dist-server/repository/task.repository.js +4 -0
  70. package/dist-server/repository/thread.repository.js +22 -0
  71. package/package.json +13 -8
  72. package/packages/cli/dist/builtin.js +1 -0
  73. package/packages/cli/dist/commands/init.js +251 -8
  74. package/packages/cli/package.json +2 -1
  75. package/server.js +6 -3
  76. package/dist/assets/MarketPage-CjJYSssq.js +0 -56
  77. package/dist/assets/architectureDiagram-UYN6MBPD-CMavUkL9.js +0 -36
  78. package/dist/assets/blockDiagram-ZHA2E4KO-D1rNF19s.js +0 -121
  79. package/dist/assets/channel-CyMi7jVG.js +0 -1
  80. package/dist/assets/classDiagram-LNE6IOMH-DVWuJ-Df.js +0 -1
  81. package/dist/assets/classDiagram-v2-MQ7JQ4JX-DVWuJ-Df.js +0 -1
  82. package/dist/assets/dagre-4EVJKHTY-CcSwRLTq.js +0 -4
  83. package/dist/assets/diagram-QW4FP2JN-N887K_Ef.js +0 -24
  84. package/dist/assets/gitGraph-YCYPL57B-Zl60oDrh.js +0 -133
  85. package/dist/assets/gitGraphDiagram-NRZ2UAAF-CmIpkGbx.js +0 -65
  86. package/dist/assets/graph-BlwPajkw.js +0 -1
  87. package/dist/assets/infoDiagram-A4XQUW5V-D3UxyUCV.js +0 -2
  88. package/dist/assets/layout-Bvwu4dCi.js +0 -1
  89. package/dist/assets/main-Dnmo7KzM.js +0 -1064
  90. package/dist/assets/main-Fz5tpoGZ.css +0 -10
  91. package/dist/assets/pieDiagram-YF2LJOPJ-Eo_N9Dkd.js +0 -30
  92. package/dist/assets/stateDiagram-MAYHULR4-hqIdsHFt.js +0 -1
  93. package/dist/assets/stateDiagram-v2-4JROLMXI-BoqygJ0s.js +0 -1
  94. /package/dist/assets/{gemini-logo.svg → google-logo.svg} +0 -0
@@ -9,46 +9,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.UpdatePlannerDto = exports.ScheduleItemDto = exports.Top3ItemDto = void 0;
12
+ exports.UpdatePlannerDto = void 0;
13
13
  const class_validator_1 = require("class-validator");
14
- const class_transformer_1 = require("class-transformer");
15
- class Top3ItemDto {
16
- rank;
17
- text;
18
- agents;
19
- }
20
- exports.Top3ItemDto = Top3ItemDto;
21
- __decorate([
22
- (0, class_validator_1.IsString)(),
23
- __metadata("design:type", Number)
24
- ], Top3ItemDto.prototype, "rank", void 0);
25
- __decorate([
26
- (0, class_validator_1.IsString)(),
27
- __metadata("design:type", String)
28
- ], Top3ItemDto.prototype, "text", void 0);
29
- __decorate([
30
- (0, class_validator_1.IsArray)(),
31
- (0, class_validator_1.IsString)({ each: true }),
32
- __metadata("design:type", Array)
33
- ], Top3ItemDto.prototype, "agents", void 0);
34
- class ScheduleItemDto {
35
- time;
36
- task;
37
- status;
38
- }
39
- exports.ScheduleItemDto = ScheduleItemDto;
40
- __decorate([
41
- (0, class_validator_1.IsString)(),
42
- __metadata("design:type", String)
43
- ], ScheduleItemDto.prototype, "time", void 0);
44
- __decorate([
45
- (0, class_validator_1.IsString)(),
46
- __metadata("design:type", String)
47
- ], ScheduleItemDto.prototype, "task", void 0);
48
- __decorate([
49
- (0, class_validator_1.IsString)(),
50
- __metadata("design:type", String)
51
- ], ScheduleItemDto.prototype, "status", void 0);
52
14
  class UpdatePlannerDto {
53
15
  weekday;
54
16
  top3;
@@ -56,6 +18,7 @@ class UpdatePlannerDto {
56
18
  schedule;
57
19
  notes;
58
20
  reflection;
21
+ goals;
59
22
  }
60
23
  exports.UpdatePlannerDto = UpdatePlannerDto;
61
24
  __decorate([
@@ -66,21 +29,16 @@ __decorate([
66
29
  __decorate([
67
30
  (0, class_validator_1.IsOptional)(),
68
31
  (0, class_validator_1.IsArray)(),
69
- (0, class_validator_1.ValidateNested)({ each: true }),
70
- (0, class_transformer_1.Type)(() => Top3ItemDto),
71
32
  __metadata("design:type", Array)
72
33
  ], UpdatePlannerDto.prototype, "top3", void 0);
73
34
  __decorate([
74
35
  (0, class_validator_1.IsOptional)(),
75
36
  (0, class_validator_1.IsArray)(),
76
- (0, class_validator_1.IsString)({ each: true }),
77
37
  __metadata("design:type", Array)
78
38
  ], UpdatePlannerDto.prototype, "braindump", void 0);
79
39
  __decorate([
80
40
  (0, class_validator_1.IsOptional)(),
81
41
  (0, class_validator_1.IsArray)(),
82
- (0, class_validator_1.ValidateNested)({ each: true }),
83
- (0, class_transformer_1.Type)(() => ScheduleItemDto),
84
42
  __metadata("design:type", Array)
85
43
  ], UpdatePlannerDto.prototype, "schedule", void 0);
86
44
  __decorate([
@@ -93,3 +51,8 @@ __decorate([
93
51
  (0, class_validator_1.IsString)(),
94
52
  __metadata("design:type", String)
95
53
  ], UpdatePlannerDto.prototype, "reflection", void 0);
54
+ __decorate([
55
+ (0, class_validator_1.IsOptional)(),
56
+ (0, class_validator_1.IsArray)(),
57
+ __metadata("design:type", Array)
58
+ ], UpdatePlannerDto.prototype, "goals", void 0);
@@ -68,7 +68,7 @@ __decorate([
68
68
  __metadata("design:returntype", void 0)
69
69
  ], PlannerController.prototype, "updatePlanner", null);
70
70
  exports.PlannerController = PlannerController = __decorate([
71
- (0, swagger_1.ApiTags)('planner'),
72
- (0, common_1.Controller)('ws/:slug/planner'),
71
+ (0, swagger_1.ApiTags)('daily-planner'),
72
+ (0, common_1.Controller)('ws/:slug/daily-planner'),
73
73
  __metadata("design:paramtypes", [planner_service_js_1.PlannerService])
74
74
  ], PlannerController);
@@ -60,6 +60,7 @@ let PlannerService = class PlannerService {
60
60
  schedule: dto.schedule ?? existing.schedule,
61
61
  notes: dto.notes ?? existing.notes,
62
62
  reflection: dto.reflection ?? existing.reflection,
63
+ goals: dto.goals !== undefined ? dto.goals : existing.goals,
63
64
  };
64
65
  const dir = this.dailyDir(workspacePath);
65
66
  if (!(0, fs_1.existsSync)(dir)) {
@@ -90,6 +91,9 @@ let PlannerService = class PlannerService {
90
91
  else if (h === 'schedule') {
91
92
  result.schedule = this.parseSchedule(body);
92
93
  }
94
+ else if (h === 'goal') {
95
+ result.goals = this.parseGoalLinks(body);
96
+ }
93
97
  else if (h === 'notes') {
94
98
  result.notes = body.trim();
95
99
  }
@@ -154,6 +158,17 @@ let PlannerService = class PlannerService {
154
158
  .map((l) => l.replace(/^-\s+/, '').trim())
155
159
  .filter(Boolean);
156
160
  }
161
+ parseGoalLinks(body) {
162
+ const items = [];
163
+ const lines = body.split('\n');
164
+ for (const line of lines) {
165
+ const m = line.match(/^-\s+\[([^\]]+)\]\(\.\.\/goal\/([^)]+)\.md\)/);
166
+ if (!m)
167
+ continue;
168
+ items.push({ goalId: m[2], title: m[1] });
169
+ }
170
+ return items;
171
+ }
157
172
  parseSchedule(body) {
158
173
  const items = [];
159
174
  const lines = body.split('\n');
@@ -203,6 +218,14 @@ let PlannerService = class PlannerService {
203
218
  lines.push(`- [${marker}] ${item.time} ${item.task}`);
204
219
  }
205
220
  lines.push('');
221
+ // Goal
222
+ if (planner.goals.length > 0) {
223
+ lines.push('## Goal');
224
+ for (const g of planner.goals) {
225
+ lines.push(`- [${g.title}](../goal/${g.goalId}.md)`);
226
+ }
227
+ lines.push('');
228
+ }
206
229
  // Notes
207
230
  lines.push('## Notes');
208
231
  if (planner.notes) {
@@ -227,6 +250,7 @@ let PlannerService = class PlannerService {
227
250
  schedule: [],
228
251
  notes: '',
229
252
  reflection: '',
253
+ goals: [],
230
254
  };
231
255
  }
232
256
  getWeekday(date) {
@@ -0,0 +1,52 @@
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.SettingsController = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const swagger_1 = require("@nestjs/swagger");
18
+ const settings_service_js_1 = require("./settings.service.js");
19
+ let SettingsController = class SettingsController {
20
+ settingsService;
21
+ constructor(settingsService) {
22
+ this.settingsService = settingsService;
23
+ }
24
+ getSettings() {
25
+ return { success: true, data: this.settingsService.getSettings() };
26
+ }
27
+ updateSettings(body) {
28
+ const updated = this.settingsService.updateSettings(body);
29
+ return { success: true, data: updated };
30
+ }
31
+ };
32
+ exports.SettingsController = SettingsController;
33
+ __decorate([
34
+ (0, swagger_1.ApiOperation)({ operationId: 'STG.GET', summary: 'Get settings' }),
35
+ (0, common_1.Get)(),
36
+ __metadata("design:type", Function),
37
+ __metadata("design:paramtypes", []),
38
+ __metadata("design:returntype", void 0)
39
+ ], SettingsController.prototype, "getSettings", null);
40
+ __decorate([
41
+ (0, swagger_1.ApiOperation)({ operationId: 'STG.UPDATE', summary: 'Update settings' }),
42
+ (0, common_1.Put)(),
43
+ __param(0, (0, common_1.Body)()),
44
+ __metadata("design:type", Function),
45
+ __metadata("design:paramtypes", [Object]),
46
+ __metadata("design:returntype", void 0)
47
+ ], SettingsController.prototype, "updateSettings", null);
48
+ exports.SettingsController = SettingsController = __decorate([
49
+ (0, swagger_1.ApiTags)('settings'),
50
+ (0, common_1.Controller)('settings'),
51
+ __metadata("design:paramtypes", [settings_service_js_1.SettingsService])
52
+ ], SettingsController);
@@ -0,0 +1,22 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SettingsModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const settings_controller_js_1 = require("./settings.controller.js");
12
+ const settings_service_js_1 = require("./settings.service.js");
13
+ let SettingsModule = class SettingsModule {
14
+ };
15
+ exports.SettingsModule = SettingsModule;
16
+ exports.SettingsModule = SettingsModule = __decorate([
17
+ (0, common_1.Module)({
18
+ controllers: [settings_controller_js_1.SettingsController],
19
+ providers: [settings_service_js_1.SettingsService],
20
+ exports: [settings_service_js_1.SettingsService],
21
+ })
22
+ ], SettingsModule);
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.SettingsService = void 0;
46
+ const fs_1 = require("fs");
47
+ const common_1 = require("@nestjs/common");
48
+ const yaml = __importStar(require("js-yaml"));
49
+ const analytics_client_js_1 = require("../../common/analytics.client.js");
50
+ let SettingsService = class SettingsService {
51
+ analyticsService;
52
+ constructor(analyticsService) {
53
+ this.analyticsService = analyticsService;
54
+ }
55
+ get configPath() {
56
+ return process.env.CREWX_CONFIG || 'crewx.yaml';
57
+ }
58
+ getSettings() {
59
+ const config = this.loadConfig();
60
+ const settings = (config.settings ?? {});
61
+ return {
62
+ analytics: settings.analytics !== false,
63
+ };
64
+ }
65
+ updateSettings(patch) {
66
+ const config = this.loadConfig();
67
+ if (!config.settings || typeof config.settings !== 'object') {
68
+ config.settings = {};
69
+ }
70
+ const settings = config.settings;
71
+ if (patch.analytics !== undefined) {
72
+ if (patch.analytics) {
73
+ delete settings.analytics;
74
+ }
75
+ else {
76
+ settings.analytics = false;
77
+ }
78
+ this.saveConfig(config);
79
+ this.analyticsService.setEnabled(patch.analytics);
80
+ }
81
+ return this.getSettings();
82
+ }
83
+ loadConfig() {
84
+ if (!(0, fs_1.existsSync)(this.configPath))
85
+ return {};
86
+ try {
87
+ const content = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
88
+ const parsed = yaml.load(content);
89
+ return typeof parsed === 'object' && parsed !== null
90
+ ? parsed
91
+ : {};
92
+ }
93
+ catch {
94
+ return {};
95
+ }
96
+ }
97
+ saveConfig(config) {
98
+ (0, fs_1.writeFileSync)(this.configPath, yaml.dump(config, { lineWidth: -1 }), 'utf-8');
99
+ }
100
+ };
101
+ exports.SettingsService = SettingsService;
102
+ exports.SettingsService = SettingsService = __decorate([
103
+ (0, common_1.Injectable)(),
104
+ __metadata("design:paramtypes", [analytics_client_js_1.AnalyticsService])
105
+ ], SettingsService);
@@ -32,11 +32,31 @@ let TaskService = TaskService_1 = class TaskService {
32
32
  crewxPool;
33
33
  projectRepo;
34
34
  logger = new common_1.Logger(TaskService_1.name);
35
+ reaperInterval;
35
36
  constructor(taskRepo, crewxPool, projectRepo) {
36
37
  this.taskRepo = taskRepo;
37
38
  this.crewxPool = crewxPool;
38
39
  this.projectRepo = projectRepo;
39
40
  }
41
+ onModuleInit() {
42
+ const reaped = this.taskRepo.reapOrphanedTasks();
43
+ if (reaped > 0) {
44
+ this.logger.warn(`Reaped ${reaped} orphaned task(s) on startup`);
45
+ }
46
+ this.reaperInterval = setInterval(() => {
47
+ try {
48
+ const n = this.taskRepo.reapOrphanedTasks();
49
+ if (n > 0)
50
+ this.logger.warn(`Reaped ${n} orphaned task(s)`);
51
+ }
52
+ catch { /* non-fatal */ }
53
+ }, 5 * 60 * 1000);
54
+ }
55
+ onModuleDestroy() {
56
+ if (this.reaperInterval !== undefined) {
57
+ clearInterval(this.reaperInterval);
58
+ }
59
+ }
40
60
  // TSK.ALL: All tasks from crewx.db with filtering, search, and pagination
41
61
  getAllTasks(params, workspaceId) {
42
62
  const agents = params.agent?.split(',').map(s => s.trim()).filter(Boolean);
@@ -33,6 +33,16 @@ let ThreadController = class ThreadController {
33
33
  const data = this.threadService.listThreads(query, ws.id);
34
34
  return { success: true, data };
35
35
  }
36
+ // THD.PIN: Toggle thread pinned
37
+ togglePin(threadId, ws) {
38
+ const data = this.threadService.togglePin(ws.id, threadId);
39
+ return { success: true, data };
40
+ }
41
+ // THD.STAR: Toggle thread starred
42
+ toggleStar(threadId, ws) {
43
+ const data = this.threadService.toggleStar(ws.id, threadId);
44
+ return { success: true, data };
45
+ }
36
46
  // THD.UPDATE: Update thread title
37
47
  updateThread(threadId, dto, ws) {
38
48
  const data = this.threadService.updateThread(threadId, ws.id, { title: dto.title });
@@ -74,6 +84,24 @@ __decorate([
74
84
  __metadata("design:paramtypes", [list_threads_dto_js_1.ListThreadsDto, Object]),
75
85
  __metadata("design:returntype", void 0)
76
86
  ], ThreadController.prototype, "listThreads", null);
87
+ __decorate([
88
+ (0, swagger_1.ApiOperation)({ operationId: 'THD.PIN', summary: 'Toggle thread pinned' }),
89
+ (0, common_1.Patch)(':threadId/pin'),
90
+ __param(0, (0, common_1.Param)('threadId')),
91
+ __param(1, (0, workspace_decorator_js_1.Workspace)()),
92
+ __metadata("design:type", Function),
93
+ __metadata("design:paramtypes", [String, Object]),
94
+ __metadata("design:returntype", void 0)
95
+ ], ThreadController.prototype, "togglePin", null);
96
+ __decorate([
97
+ (0, swagger_1.ApiOperation)({ operationId: 'THD.STAR', summary: 'Toggle thread starred' }),
98
+ (0, common_1.Patch)(':threadId/star'),
99
+ __param(0, (0, common_1.Param)('threadId')),
100
+ __param(1, (0, workspace_decorator_js_1.Workspace)()),
101
+ __metadata("design:type", Function),
102
+ __metadata("design:paramtypes", [String, Object]),
103
+ __metadata("design:returntype", void 0)
104
+ ], ThreadController.prototype, "toggleStar", null);
77
105
  __decorate([
78
106
  (0, swagger_1.ApiOperation)({ operationId: 'THD.UPDATE', summary: 'Update thread title' }),
79
107
  (0, common_1.Patch)(':threadId'),
@@ -93,6 +93,8 @@ let ThreadService = class ThreadService {
93
93
  agents: stats.agents,
94
94
  createdAt: threadRow.created_at,
95
95
  updatedAt: threadRow.updated_at,
96
+ pinned: !!(threadRow.pinned ?? 0),
97
+ starred: !!(threadRow.starred ?? 0),
96
98
  totals: {
97
99
  taskCount: stats.taskCount,
98
100
  inputTokens: stats.inputTokens,
@@ -101,6 +103,22 @@ let ThreadService = class ThreadService {
101
103
  },
102
104
  };
103
105
  }
106
+ // THD.PIN: Toggle pinned 0↔1
107
+ togglePin(workspaceId, threadId) {
108
+ this.validateId(threadId);
109
+ const result = this.threadRepo.togglePin(threadId, workspaceId);
110
+ if (!result)
111
+ throw new common_1.NotFoundException(`Thread not found: ${threadId}`);
112
+ return { threadId, pinned: result.pinned };
113
+ }
114
+ // THD.STAR: Toggle starred 0↔1
115
+ toggleStar(workspaceId, threadId) {
116
+ this.validateId(threadId);
117
+ const result = this.threadRepo.toggleStar(threadId, workspaceId);
118
+ if (!result)
119
+ throw new common_1.NotFoundException(`Thread not found: ${threadId}`);
120
+ return { threadId, starred: result.starred };
121
+ }
104
122
  // THD.UPDATE: Update thread title (locks against auto-overwrite)
105
123
  updateThread(threadId, workspaceId, patch) {
106
124
  this.validateId(threadId);
@@ -297,6 +315,8 @@ let ThreadService = class ThreadService {
297
315
  messageCount: row.message_count ?? 0,
298
316
  createdAt: row.created_at,
299
317
  updatedAt: row.updated_at,
318
+ pinned: !!(row.pinned ?? 0),
319
+ starred: !!(row.starred ?? 0),
300
320
  });
301
321
  validateId(id) {
302
322
  if (!/^[\w\p{L}\p{N}._-]+$/u.test(id)) {
@@ -163,6 +163,7 @@ async function bootstrap() {
163
163
  catch (e) {
164
164
  console.warn('CWD auto-register failed (non-fatal):', e);
165
165
  }
166
+ app.enableShutdownHooks();
166
167
  const port = process.env.PORT || 8150;
167
168
  await app.listen(port);
168
169
  // Get actual port (important when PORT=0 for random port)
@@ -94,6 +94,10 @@ let TaskRepository = class TaskRepository extends base_sqlite_repository_js_1.Ba
94
94
  findTasksByPromptHint(hint, workspaceId) {
95
95
  return this.sdk.findTasksByPromptHint(hint, workspaceId);
96
96
  }
97
+ /** Transition orphaned running tasks (no live process) to failed. */
98
+ reapOrphanedTasks() {
99
+ return this.sdk.reapOrphanedTasks();
100
+ }
97
101
  };
98
102
  exports.TaskRepository = TaskRepository;
99
103
  exports.TaskRepository = TaskRepository = __decorate([
@@ -127,6 +127,28 @@ let ThreadRepository = class ThreadRepository extends base_sqlite_repository_js_
127
127
  throw e;
128
128
  }
129
129
  }
130
+ /** Toggle pinned 0↔1 for a thread. Returns new state or null if not found. */
131
+ togglePin(threadId, workspaceId) {
132
+ try {
133
+ return this.sdkThread.togglePin(threadId, workspaceId);
134
+ }
135
+ catch (e) {
136
+ if (e instanceof repository_1.RepositoryError)
137
+ return null;
138
+ throw e;
139
+ }
140
+ }
141
+ /** Toggle starred 0↔1 for a thread. Returns new state or null if not found. */
142
+ toggleStar(threadId, workspaceId) {
143
+ try {
144
+ return this.sdkThread.toggleStar(threadId, workspaceId);
145
+ }
146
+ catch (e) {
147
+ if (e instanceof repository_1.RepositoryError)
148
+ return null;
149
+ throw e;
150
+ }
151
+ }
130
152
  /** UPSERT thread (used by MSG.SEND).
131
153
  * workspace_id is required on INSERT to prevent NULL workspace rows. */
132
154
  upsertThread(threadId, opts) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewx",
3
- "version": "0.8.7-rc.2",
3
+ "version": "0.8.7-rc.21",
4
4
  "description": "CrewX — AI agent team dashboard with Electron UI and CLI (Web + Electron + Global CLI)",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -25,6 +25,9 @@
25
25
  },
26
26
  "license": "UNLICENSED",
27
27
  "dependencies": {
28
+ "@dnd-kit/core": "^6.3.1",
29
+ "@dnd-kit/sortable": "^10.0.0",
30
+ "@dnd-kit/utilities": "^3.2.2",
28
31
  "@modelcontextprotocol/sdk": "1.27.0",
29
32
  "@nestjs/common": "11.1.21",
30
33
  "@nestjs/config": "4.0.3",
@@ -45,6 +48,7 @@
45
48
  "class-transformer": "0.5.1",
46
49
  "class-validator": "0.15.1",
47
50
  "cookie-parser": "1.4.7",
51
+ "date-fns": "^4.3.0",
48
52
  "dotenv": "17.2.3",
49
53
  "execa": "8.0.1",
50
54
  "express": "4.21.2",
@@ -58,6 +62,7 @@
58
62
  "md-to-slack": "1.0.0",
59
63
  "node-forge": "1.4.0",
60
64
  "open": "11.0.0",
65
+ "react-day-picker": "^10.0.1",
61
66
  "reflect-metadata": "0.2.2",
62
67
  "remark-parse": "11.0.0",
63
68
  "remark-stringify": "11.0.0",
@@ -69,17 +74,17 @@
69
74
  "wink-nlp-utils": "2.1.0",
70
75
  "yargs": "17.7.0",
71
76
  "zod": "3.25.76",
72
- "@crewx/cli": "0.8.7-rc.2",
77
+ "@crewx/cli": "0.8.7-rc.21",
73
78
  "@crewx/doc": "0.1.8",
74
79
  "@crewx/cron": "0.1.8",
75
- "@crewx/knowledge-core": "0.1.7",
76
- "@crewx/memory": "0.1.12",
77
- "@crewx/sdk": "0.8.7-rc.2",
78
- "@crewx/skill": "0.1.10",
80
+ "@crewx/memory": "0.1.19",
81
+ "@crewx/knowledge-core": "0.1.14",
79
82
  "@crewx/search": "0.1.9",
83
+ "@crewx/shared": "0.0.5",
84
+ "@crewx/sdk": "0.8.7-rc.21",
80
85
  "@crewx/wbs": "0.1.9",
81
86
  "@crewx/workflow": "0.3.18",
82
- "@crewx/shared": "0.0.5"
87
+ "@crewx/skill": "0.1.17"
83
88
  },
84
89
  "devDependencies": {
85
90
  "@ccusage/codex": "0.0.1",
@@ -200,7 +205,7 @@
200
205
  "build:built-in": "pnpm -r --filter './packages/built-in/*' run build",
201
206
  "build": "pnpm run build:sdk && pnpm run build:built-in && pnpm run build:cli && pnpm run build:server && pnpm run build:ui",
202
207
  "build:cli": "cd packages/cli && npm run build",
203
- "build:server": "tsc -p tsconfig.server.json && node scripts/emit-dist-server-package-json.mjs",
208
+ "build:server": "tsc -p tsconfig.server.json && cp src/server/domain/market/default-marketplace.json dist-server/domain/market/ && node scripts/emit-dist-server-package-json.mjs",
204
209
  "build:ui": "vite build",
205
210
  "build:chrome-x": "pnpm -F @crewx/chrome-x run build",
206
211
  "build:web": "npm run build",
@@ -52,6 +52,7 @@ const BUILTIN_MAP = {
52
52
  cron: () => Promise.resolve().then(() => __importStar(require('@crewx/cron/cli'))),
53
53
  workflow: () => Promise.resolve().then(() => __importStar(require('@crewx/workflow/cli'))),
54
54
  skill: () => Promise.resolve().then(() => __importStar(require('@crewx/skill/cli'))),
55
+ wi: () => Promise.resolve().then(() => __importStar(require('@crewx/wi/cli'))),
55
56
  };
56
57
  exports.BUILTIN_COMMANDS = new Set(Object.keys(BUILTIN_MAP));
57
58
  // Load skill-tracer for observability (graceful degradation if unavailable)