@fastybird/smart-panel-backend 0.4.0-alpha.1 → 0.4.0-alpha.2
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.
- package/dist/app.module.js +0 -17
- package/dist/app.module.js.map +1 -1
- package/dist/common/filters/not-found-exception.filter.d.ts +4 -0
- package/dist/common/filters/not-found-exception.filter.js +22 -1
- package/dist/common/filters/not-found-exception.filter.js.map +1 -1
- package/dist/common/services/app-instance-holder.service.d.ts +1 -2
- package/dist/common/services/app-instance-holder.service.js.map +1 -1
- package/dist/common/utils/config.utils.d.ts +0 -1
- package/dist/common/utils/config.utils.js +1 -11
- package/dist/common/utils/config.utils.js.map +1 -1
- package/dist/main.js +15 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations/1000000000000-InitialSetup.js +8 -0
- package/dist/migrations/1000000000000-InitialSetup.js.map +1 -1
- package/dist/modules/buddy/buddy.module.js +2 -1
- package/dist/modules/buddy/buddy.module.js.map +1 -1
- package/dist/modules/buddy/buddy.utils.d.ts +8 -0
- package/dist/modules/buddy/buddy.utils.js +49 -0
- package/dist/modules/buddy/buddy.utils.js.map +1 -1
- package/dist/modules/buddy/controllers/buddy-suggestions.controller.js +2 -2
- package/dist/modules/buddy/controllers/buddy-suggestions.controller.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-conversation.entity.js +3 -3
- package/dist/modules/buddy/entities/buddy-conversation.entity.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-message.entity.js +2 -2
- package/dist/modules/buddy/entities/buddy-message.entity.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-suggestion.entity.d.ts +19 -0
- package/dist/modules/buddy/entities/buddy-suggestion.entity.js +93 -0
- package/dist/modules/buddy/entities/buddy-suggestion.entity.js.map +1 -0
- package/dist/modules/buddy/platforms/llm-provider.platform.d.ts +6 -0
- package/dist/modules/buddy/platforms/openai-sdk.utils.d.ts +2 -1
- package/dist/modules/buddy/platforms/openai-sdk.utils.js +12 -1
- package/dist/modules/buddy/platforms/openai-sdk.utils.js.map +1 -1
- package/dist/modules/buddy/services/buddy-conversation.service.js +23 -8
- package/dist/modules/buddy/services/buddy-conversation.service.js.map +1 -1
- package/dist/modules/buddy/services/heartbeat.service.js +1 -1
- package/dist/modules/buddy/services/heartbeat.service.js.map +1 -1
- package/dist/modules/buddy/services/llm-provider.service.js +2 -10
- package/dist/modules/buddy/services/llm-provider.service.js.map +1 -1
- package/dist/modules/buddy/services/module-reset.service.d.ts +3 -1
- package/dist/modules/buddy/services/module-reset.service.js +6 -1
- package/dist/modules/buddy/services/module-reset.service.js.map +1 -1
- package/dist/modules/buddy/services/pattern-detector.service.d.ts +4 -1
- package/dist/modules/buddy/services/pattern-detector.service.js +10 -3
- package/dist/modules/buddy/services/pattern-detector.service.js.map +1 -1
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.d.ts +4 -1
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.js +10 -4
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.js.map +1 -1
- package/dist/modules/buddy/services/stt-provider.service.js +2 -10
- package/dist/modules/buddy/services/stt-provider.service.js.map +1 -1
- package/dist/modules/buddy/services/suggestion-engine.service.d.ts +19 -13
- package/dist/modules/buddy/services/suggestion-engine.service.js +170 -103
- package/dist/modules/buddy/services/suggestion-engine.service.js.map +1 -1
- package/dist/modules/buddy/services/tts-provider.service.js +2 -10
- package/dist/modules/buddy/services/tts-provider.service.js.map +1 -1
- package/dist/modules/extensions/controllers/actions.controller.d.ts +9 -4
- package/dist/modules/extensions/controllers/actions.controller.js +63 -10
- package/dist/modules/extensions/controllers/actions.controller.js.map +1 -1
- package/dist/modules/extensions/extensions.module.js +3 -1
- package/dist/modules/extensions/extensions.module.js.map +1 -1
- package/dist/modules/extensions/extensions.openapi.d.ts +3 -3
- package/dist/modules/extensions/extensions.openapi.js +2 -0
- package/dist/modules/extensions/extensions.openapi.js.map +1 -1
- package/dist/modules/extensions/models/action.model.d.ts +13 -0
- package/dist/modules/extensions/models/action.model.js +87 -1
- package/dist/modules/extensions/models/action.model.js.map +1 -1
- package/dist/modules/extensions/models/actions-response.model.d.ts +4 -1
- package/dist/modules/extensions/models/actions-response.model.js +19 -1
- package/dist/modules/extensions/models/actions-response.model.js.map +1 -1
- package/dist/modules/extensions/services/action-audit.service.d.ts +21 -0
- package/dist/modules/extensions/services/action-audit.service.js +49 -0
- package/dist/modules/extensions/services/action-audit.service.js.map +1 -0
- package/dist/modules/extensions/services/extension-action-registry.service.d.ts +6 -1
- package/dist/modules/extensions/services/extension-action-registry.service.js +22 -3
- package/dist/modules/extensions/services/extension-action-registry.service.js.map +1 -1
- package/dist/modules/extensions/services/extension-action.interface.d.ts +3 -0
- package/dist/modules/extensions/services/extension-action.interface.js +3 -1
- package/dist/modules/extensions/services/extension-action.interface.js.map +1 -1
- package/dist/modules/swagger/commands/serve-swagger.command.d.ts +14 -0
- package/dist/modules/swagger/commands/serve-swagger.command.js +60 -0
- package/dist/modules/swagger/commands/serve-swagger.command.js.map +1 -0
- package/dist/modules/swagger/swagger.module.js +2 -0
- package/dist/modules/swagger/swagger.module.js.map +1 -1
- package/dist/modules/system/scripts/update-worker.sh +42 -32
- package/dist/modules/system/services/system-command.service.d.ts +7 -1
- package/dist/modules/system/services/system-command.service.js +24 -4
- package/dist/modules/system/services/system-command.service.js.map +1 -1
- package/dist/modules/system/services/update-executor.service.d.ts +4 -0
- package/dist/modules/system/services/update-executor.service.js +83 -0
- package/dist/modules/system/services/update-executor.service.js.map +1 -1
- package/dist/modules/system/system.constants.d.ts +2 -0
- package/dist/modules/system/system.constants.js +2 -0
- package/dist/modules/system/system.constants.js.map +1 -1
- package/dist/modules/system/system.module.js +6 -3
- package/dist/modules/system/system.module.js.map +1 -1
- package/dist/modules/users/controllers/users.controller.js +9 -0
- package/dist/modules/users/controllers/users.controller.js.map +1 -1
- package/dist/modules/users/dto/update-user.dto.d.ts +1 -0
- package/dist/modules/users/dto/update-user.dto.js +14 -1
- package/dist/modules/users/dto/update-user.dto.js.map +1 -1
- package/dist/modules/users/services/users.service.d.ts +1 -0
- package/dist/modules/users/services/users.service.js +10 -0
- package/dist/modules/users/services/users.service.js.map +1 -1
- package/dist/modules/websocket/gateway/websocket.gateway.js +5 -2
- package/dist/modules/websocket/gateway/websocket.gateway.js.map +1 -1
- package/dist/modules/websocket/services/command-event-registry.service.d.ts +3 -1
- package/dist/modules/websocket/services/command-event-registry.service.js +5 -4
- package/dist/modules/websocket/services/command-event-registry.service.js.map +1 -1
- package/dist/plugins/buddy-openai/platforms/openai.provider.js +1 -0
- package/dist/plugins/buddy-openai/platforms/openai.provider.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +5 -0
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +1 -0
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +6 -4
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +2 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
- package/dist/plugins/simulator/services/simulator-actions.service.js +3 -0
- package/dist/plugins/simulator/services/simulator-actions.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -8,35 +8,49 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.SuggestionEngineService = void 0;
|
|
16
|
+
const typeorm_1 = require("typeorm");
|
|
13
17
|
const uuid_1 = require("uuid");
|
|
14
18
|
const common_1 = require("@nestjs/common");
|
|
15
19
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
20
|
+
const typeorm_2 = require("@nestjs/typeorm");
|
|
16
21
|
const logger_1 = require("../../../common/logger");
|
|
17
|
-
const cooldown_manager_1 = require("../../../common/utils/cooldown-manager");
|
|
18
22
|
const spaces_service_1 = require("../../spaces/services/spaces.service");
|
|
23
|
+
const spaces_constants_1 = require("../../spaces/spaces.constants");
|
|
19
24
|
const buddy_constants_1 = require("../buddy.constants");
|
|
20
25
|
const buddy_exceptions_1 = require("../buddy.exceptions");
|
|
26
|
+
const buddy_suggestion_entity_1 = require("../entities/buddy-suggestion.entity");
|
|
21
27
|
const pattern_detector_service_1 = require("./pattern-detector.service");
|
|
22
28
|
let SuggestionEngineService = class SuggestionEngineService {
|
|
23
|
-
constructor(patternDetector, spacesService, eventEmitter) {
|
|
29
|
+
constructor(suggestionRepo, patternDetector, spacesService, eventEmitter) {
|
|
30
|
+
this.suggestionRepo = suggestionRepo;
|
|
24
31
|
this.patternDetector = patternDetector;
|
|
25
32
|
this.spacesService = spacesService;
|
|
26
33
|
this.eventEmitter = eventEmitter;
|
|
27
34
|
this.logger = (0, logger_1.createExtensionLogger)(buddy_constants_1.BUDDY_MODULE_NAME, 'SuggestionEngineService');
|
|
28
|
-
this.suggestions = new Map();
|
|
29
|
-
this.cooldowns = new cooldown_manager_1.CooldownManager();
|
|
30
35
|
this.cleanupTimer = null;
|
|
31
|
-
this.
|
|
32
|
-
this.
|
|
33
|
-
this.cleanupTimer.unref();
|
|
34
|
-
}
|
|
35
|
-
isOnCooldown(spaceId, type, now) {
|
|
36
|
-
return this.cooldowns.isOnCooldown(spaceId, type, now);
|
|
36
|
+
this.generationPromise = null;
|
|
37
|
+
this.mutexTail = Promise.resolve();
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
async onModuleInit() {
|
|
40
|
+
try {
|
|
41
|
+
await this.cleanupExpired();
|
|
42
|
+
const active = await this.suggestionRepo.count({ where: { status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE } });
|
|
43
|
+
this.logger.log(`Loaded ${active} active suggestion(s) from database`);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger.warn(`Failed to load suggestions on init: ${error.message}`);
|
|
47
|
+
}
|
|
48
|
+
this.cleanupTimer = setInterval(() => {
|
|
49
|
+
this.cleanupExpired().catch((err) => {
|
|
50
|
+
this.logger.error(`Suggestion cleanup failed: ${err.message}`);
|
|
51
|
+
});
|
|
52
|
+
}, buddy_constants_1.SUGGESTION_CLEANUP_INTERVAL_MS);
|
|
53
|
+
this.cleanupTimer.unref();
|
|
40
54
|
}
|
|
41
55
|
onModuleDestroy() {
|
|
42
56
|
if (this.cleanupTimer) {
|
|
@@ -44,148 +58,187 @@ let SuggestionEngineService = class SuggestionEngineService {
|
|
|
44
58
|
this.cleanupTimer = null;
|
|
45
59
|
}
|
|
46
60
|
}
|
|
61
|
+
async isOnCooldown(spaceId, type, now) {
|
|
62
|
+
const cutoff = new Date((now ?? Date.now()) - buddy_constants_1.SUGGESTION_COOLDOWN_MS);
|
|
63
|
+
const recent = await this.suggestionRepo.findOne({
|
|
64
|
+
where: {
|
|
65
|
+
spaceId,
|
|
66
|
+
type,
|
|
67
|
+
status: (0, typeorm_1.In)([buddy_suggestion_entity_1.SuggestionStatus.ACCEPTED, buddy_suggestion_entity_1.SuggestionStatus.DISMISSED]),
|
|
68
|
+
feedbackAt: (0, typeorm_1.MoreThan)(cutoff),
|
|
69
|
+
},
|
|
70
|
+
order: { feedbackAt: 'DESC' },
|
|
71
|
+
});
|
|
72
|
+
return recent !== null;
|
|
73
|
+
}
|
|
74
|
+
withMutex(fn) {
|
|
75
|
+
const ticket = this.mutexTail.then(fn, fn);
|
|
76
|
+
this.mutexTail = ticket.then(() => { }, () => { });
|
|
77
|
+
return ticket;
|
|
78
|
+
}
|
|
47
79
|
async generateSuggestions() {
|
|
48
|
-
if (this.
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
this.generating = true;
|
|
52
|
-
try {
|
|
53
|
-
return await this.doGenerateSuggestions();
|
|
54
|
-
}
|
|
55
|
-
finally {
|
|
56
|
-
this.generating = false;
|
|
80
|
+
if (this.generationPromise !== null) {
|
|
81
|
+
return this.generationPromise;
|
|
57
82
|
}
|
|
83
|
+
this.generationPromise = this.withMutex(() => this.doGenerateSuggestions()).finally(() => {
|
|
84
|
+
this.generationPromise = null;
|
|
85
|
+
});
|
|
86
|
+
return this.generationPromise;
|
|
58
87
|
}
|
|
59
88
|
async doGenerateSuggestions() {
|
|
60
89
|
const patterns = this.patternDetector.detectPatterns();
|
|
61
90
|
const newSuggestions = [];
|
|
62
91
|
for (const pattern of patterns) {
|
|
63
|
-
if (this.
|
|
92
|
+
if (await this.isOnCooldown(pattern.spaceId, buddy_constants_1.SuggestionType.PATTERN_SCENE_CREATE)) {
|
|
64
93
|
continue;
|
|
65
94
|
}
|
|
66
|
-
if (this.hasSuggestionForPattern(pattern)) {
|
|
95
|
+
if (await this.hasSuggestionForPattern(pattern)) {
|
|
67
96
|
continue;
|
|
68
97
|
}
|
|
69
98
|
const spaceName = await this.resolveSpaceName(pattern.spaceId);
|
|
70
|
-
if (this.hasSuggestionForPattern(pattern)) {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
99
|
const result = (0, pattern_detector_service_1.patternToEvaluatorResult)(pattern, spaceName);
|
|
74
|
-
const
|
|
100
|
+
const entity = this.suggestionRepo.create({
|
|
75
101
|
id: (0, uuid_1.v4)(),
|
|
76
|
-
|
|
77
|
-
|
|
102
|
+
type: result.type,
|
|
103
|
+
title: result.title,
|
|
104
|
+
reason: result.reason,
|
|
105
|
+
spaceId: result.spaceId,
|
|
106
|
+
metadata: result.metadata,
|
|
107
|
+
status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE,
|
|
78
108
|
expiresAt: new Date(Date.now() + buddy_constants_1.SUGGESTION_EXPIRY_MS),
|
|
79
|
-
|
|
80
|
-
|
|
109
|
+
feedbackAt: null,
|
|
110
|
+
});
|
|
111
|
+
await this.suggestionRepo.save(entity);
|
|
112
|
+
const suggestion = this.entityToSuggestion(entity);
|
|
81
113
|
newSuggestions.push(suggestion);
|
|
82
114
|
this.eventEmitter.emit(buddy_constants_1.EventType.SUGGESTION_CREATED, suggestion);
|
|
83
115
|
this.logger.debug(`Created suggestion id=${suggestion.id}: "${suggestion.reason}" (confidence=${pattern.confidence})`);
|
|
84
116
|
}
|
|
85
117
|
return newSuggestions;
|
|
86
118
|
}
|
|
87
|
-
getActiveSuggestions(spaceId) {
|
|
88
|
-
const now = Date
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
if (spaceId && suggestion.spaceId !== spaceId) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
active.push(suggestion);
|
|
119
|
+
async getActiveSuggestions(spaceId) {
|
|
120
|
+
const now = new Date();
|
|
121
|
+
const where = {
|
|
122
|
+
status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE,
|
|
123
|
+
expiresAt: (0, typeorm_1.MoreThan)(now),
|
|
124
|
+
};
|
|
125
|
+
if (spaceId) {
|
|
126
|
+
where.spaceId = spaceId;
|
|
101
127
|
}
|
|
102
|
-
|
|
128
|
+
const entities = await this.suggestionRepo.find({
|
|
129
|
+
where,
|
|
130
|
+
order: { createdAt: 'DESC' },
|
|
131
|
+
});
|
|
132
|
+
const cooldownKeys = await this.getCooldownKeys(now);
|
|
133
|
+
const filtered = entities.filter((e) => !cooldownKeys.has(`${e.spaceId}:${e.type}`));
|
|
134
|
+
return filtered.map((e) => this.entityToSuggestion(e));
|
|
103
135
|
}
|
|
104
|
-
getSuggestionOrThrow(id) {
|
|
105
|
-
const
|
|
106
|
-
if (!
|
|
136
|
+
async getSuggestionOrThrow(id) {
|
|
137
|
+
const entity = await this.suggestionRepo.findOne({ where: { id } });
|
|
138
|
+
if (!entity) {
|
|
107
139
|
throw new buddy_exceptions_1.BuddySuggestionNotFoundException(id);
|
|
108
140
|
}
|
|
109
|
-
return
|
|
141
|
+
return this.entityToSuggestion(entity);
|
|
142
|
+
}
|
|
143
|
+
async recordFeedback(id, feedback) {
|
|
144
|
+
return this.withMutex(async () => {
|
|
145
|
+
const entity = await this.suggestionRepo.findOne({ where: { id } });
|
|
146
|
+
if (!entity) {
|
|
147
|
+
throw new buddy_exceptions_1.BuddySuggestionNotFoundException(id);
|
|
148
|
+
}
|
|
149
|
+
if (entity.status !== buddy_suggestion_entity_1.SuggestionStatus.ACTIVE) {
|
|
150
|
+
throw new buddy_exceptions_1.BuddySuggestionNotFoundException(id);
|
|
151
|
+
}
|
|
152
|
+
entity.status = feedback === spaces_constants_1.SuggestionFeedback.APPLIED ? buddy_suggestion_entity_1.SuggestionStatus.ACCEPTED : buddy_suggestion_entity_1.SuggestionStatus.DISMISSED;
|
|
153
|
+
entity.feedbackAt = new Date();
|
|
154
|
+
await this.suggestionRepo.save(entity);
|
|
155
|
+
this.logger.debug(`Feedback "${feedback}" recorded for suggestion id=${id}`);
|
|
156
|
+
return { success: true, suggestion: this.entityToSuggestion(entity) };
|
|
157
|
+
});
|
|
110
158
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
this.cooldowns.setCooldown(suggestion.spaceId, suggestion.type, buddy_constants_1.SUGGESTION_COOLDOWN_MS);
|
|
114
|
-
this.suggestions.delete(id);
|
|
115
|
-
this.logger.debug(`Feedback "${feedback}" recorded for suggestion id=${id}, cooldown set`);
|
|
116
|
-
return { success: true, suggestion };
|
|
159
|
+
async createFromEvaluatorResults(results) {
|
|
160
|
+
return this.withMutex(() => this.doCreateFromEvaluatorResults(results));
|
|
117
161
|
}
|
|
118
|
-
|
|
162
|
+
async doCreateFromEvaluatorResults(results) {
|
|
119
163
|
const created = [];
|
|
120
164
|
for (const result of results) {
|
|
121
|
-
if (this.
|
|
165
|
+
if (await this.isOnCooldown(result.spaceId, result.type)) {
|
|
122
166
|
continue;
|
|
123
167
|
}
|
|
124
|
-
if (this.hasDuplicateSuggestion(result.spaceId, result.type, result.metadata)) {
|
|
168
|
+
if (await this.hasDuplicateSuggestion(result.spaceId, result.type, result.metadata)) {
|
|
125
169
|
continue;
|
|
126
170
|
}
|
|
127
|
-
const
|
|
171
|
+
const entity = this.suggestionRepo.create({
|
|
128
172
|
id: (0, uuid_1.v4)(),
|
|
129
173
|
type: result.type,
|
|
130
174
|
title: result.title,
|
|
131
175
|
reason: result.reason,
|
|
132
176
|
spaceId: result.spaceId,
|
|
133
177
|
metadata: result.metadata,
|
|
134
|
-
|
|
178
|
+
status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE,
|
|
135
179
|
expiresAt: new Date(Date.now() + buddy_constants_1.SUGGESTION_EXPIRY_MS),
|
|
136
|
-
|
|
137
|
-
|
|
180
|
+
feedbackAt: null,
|
|
181
|
+
});
|
|
182
|
+
await this.suggestionRepo.save(entity);
|
|
183
|
+
const suggestion = this.entityToSuggestion(entity);
|
|
138
184
|
created.push(suggestion);
|
|
139
185
|
this.eventEmitter.emit(buddy_constants_1.EventType.SUGGESTION_CREATED, suggestion);
|
|
140
186
|
this.logger.debug(`Created suggestion from evaluator id=${suggestion.id}: "${suggestion.reason}"`);
|
|
141
187
|
}
|
|
142
188
|
return created;
|
|
143
189
|
}
|
|
144
|
-
hasDuplicateSuggestion(spaceId, type, metadata) {
|
|
145
|
-
const now = Date
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
190
|
+
async hasDuplicateSuggestion(spaceId, type, metadata) {
|
|
191
|
+
const now = new Date();
|
|
192
|
+
const candidates = await this.suggestionRepo.find({
|
|
193
|
+
where: {
|
|
194
|
+
spaceId,
|
|
195
|
+
type,
|
|
196
|
+
status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE,
|
|
197
|
+
expiresAt: (0, typeorm_1.MoreThan)(now),
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
for (const suggestion of candidates) {
|
|
201
|
+
if (type === buddy_constants_1.SuggestionType.PATTERN_SCENE_CREATE) {
|
|
202
|
+
const meta = suggestion.metadata ?? {};
|
|
203
|
+
if (meta.intentType !== undefined && meta.intentType === metadata.intentType) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
if (meta.sequenceHash !== undefined && meta.sequenceHash === metadata.sequenceHash) {
|
|
207
|
+
return true;
|
|
160
208
|
}
|
|
161
|
-
return true;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
hasSuggestionForPattern(pattern) {
|
|
167
|
-
const now = Date.now();
|
|
168
|
-
for (const suggestion of this.suggestions.values()) {
|
|
169
|
-
if (suggestion.expiresAt.getTime() <= now) {
|
|
170
209
|
continue;
|
|
171
210
|
}
|
|
172
|
-
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
211
|
+
return true;
|
|
175
212
|
}
|
|
176
213
|
return false;
|
|
177
214
|
}
|
|
178
|
-
|
|
179
|
-
const now = Date
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
|
|
215
|
+
async hasSuggestionForPattern(pattern) {
|
|
216
|
+
const now = new Date();
|
|
217
|
+
const candidates = await this.suggestionRepo.find({
|
|
218
|
+
where: {
|
|
219
|
+
spaceId: pattern.spaceId,
|
|
220
|
+
status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE,
|
|
221
|
+
expiresAt: (0, typeorm_1.MoreThan)(now),
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
return candidates.some((s) => s.metadata && s.metadata.intentType === pattern.intentType);
|
|
225
|
+
}
|
|
226
|
+
async getCooldownKeys(now) {
|
|
227
|
+
const cutoff = new Date(now.getTime() - buddy_constants_1.SUGGESTION_COOLDOWN_MS);
|
|
228
|
+
const recentFeedback = await this.suggestionRepo.find({
|
|
229
|
+
where: {
|
|
230
|
+
status: (0, typeorm_1.In)([buddy_suggestion_entity_1.SuggestionStatus.ACCEPTED, buddy_suggestion_entity_1.SuggestionStatus.DISMISSED]),
|
|
231
|
+
feedbackAt: (0, typeorm_1.MoreThan)(cutoff),
|
|
232
|
+
},
|
|
233
|
+
select: ['spaceId', 'type'],
|
|
234
|
+
});
|
|
235
|
+
return new Set(recentFeedback.map((r) => `${r.spaceId}:${r.type}`));
|
|
236
|
+
}
|
|
237
|
+
async cleanupExpired() {
|
|
238
|
+
const now = new Date();
|
|
239
|
+
const result = await this.suggestionRepo.update({ status: buddy_suggestion_entity_1.SuggestionStatus.ACTIVE, expiresAt: (0, typeorm_1.LessThanOrEqual)(now) }, { status: buddy_suggestion_entity_1.SuggestionStatus.EXPIRED });
|
|
240
|
+
if (result.affected && result.affected > 0) {
|
|
241
|
+
this.logger.debug(`Expired ${result.affected} suggestion(s)`);
|
|
189
242
|
}
|
|
190
243
|
}
|
|
191
244
|
async resolveSpaceName(spaceId) {
|
|
@@ -197,11 +250,25 @@ let SuggestionEngineService = class SuggestionEngineService {
|
|
|
197
250
|
return 'unknown space';
|
|
198
251
|
}
|
|
199
252
|
}
|
|
253
|
+
entityToSuggestion(entity) {
|
|
254
|
+
return {
|
|
255
|
+
id: entity.id,
|
|
256
|
+
type: entity.type,
|
|
257
|
+
title: entity.title,
|
|
258
|
+
reason: entity.reason,
|
|
259
|
+
spaceId: entity.spaceId,
|
|
260
|
+
metadata: entity.metadata ?? {},
|
|
261
|
+
createdAt: entity.createdAt,
|
|
262
|
+
expiresAt: entity.expiresAt,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
200
265
|
};
|
|
201
266
|
exports.SuggestionEngineService = SuggestionEngineService;
|
|
202
267
|
exports.SuggestionEngineService = SuggestionEngineService = __decorate([
|
|
203
268
|
(0, common_1.Injectable)(),
|
|
204
|
-
|
|
269
|
+
__param(0, (0, typeorm_2.InjectRepository)(buddy_suggestion_entity_1.BuddySuggestionEntity)),
|
|
270
|
+
__metadata("design:paramtypes", [typeorm_1.Repository,
|
|
271
|
+
pattern_detector_service_1.PatternDetectorService,
|
|
205
272
|
spaces_service_1.SpacesService,
|
|
206
273
|
event_emitter_1.EventEmitter2])
|
|
207
274
|
], SuggestionEngineService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggestion-engine.service.js","sourceRoot":"","sources":["../../../../src/modules/buddy/services/suggestion-engine.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"suggestion-engine.service.js","sourceRoot":"","sources":["../../../../src/modules/buddy/services/suggestion-engine.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -158,19 +158,11 @@ let TtsProviderService = class TtsProviderService {
|
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
handleProviderError(providerName, error) {
|
|
161
|
-
|
|
162
|
-
const name = err.name ?? '';
|
|
163
|
-
const message = err.message ?? '';
|
|
164
|
-
const isTimeout = name === 'AbortError' ||
|
|
165
|
-
name.includes('Timeout') ||
|
|
166
|
-
message.includes('timeout') ||
|
|
167
|
-
message.includes('timed out') ||
|
|
168
|
-
message.includes('ETIMEDOUT') ||
|
|
169
|
-
message.includes('ECONNABORTED');
|
|
170
|
-
if (isTimeout) {
|
|
161
|
+
if ((0, buddy_utils_1.isTimeoutError)(error)) {
|
|
171
162
|
this.logger.error(`${providerName} TTS provider timeout`);
|
|
172
163
|
throw new buddy_exceptions_1.BuddyTtsProviderTimeoutException();
|
|
173
164
|
}
|
|
165
|
+
const message = error instanceof Error ? error.message : 'Unknown provider error';
|
|
174
166
|
this.logger.error(`${providerName} TTS provider error: ${message}`);
|
|
175
167
|
throw new buddy_exceptions_1.BuddyTtsProviderErrorException(message);
|
|
176
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts-provider.service.js","sourceRoot":"","sources":["../../../../src/modules/buddy/services/tts-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA2E;AAE3E,mDAA+D;AAC/D,yEAAqE;AAErE,oEAAmE;AACnE,wDAAgG;AAChG,0DAI6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"tts-provider.service.js","sourceRoot":"","sources":["../../../../src/modules/buddy/services/tts-provider.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { AuthenticatedRequest } from '../../auth/guards/auth.guard';
|
|
1
2
|
import { ReqExecuteActionDto } from '../dto/execute-action.dto';
|
|
2
|
-
import { ActionResultResponseModel, ExtensionActionsResponseModel } from '../models/actions-response.model';
|
|
3
|
+
import { ActionHistoryResponseModel, ActionResultResponseModel, ExtensionActionsResponseModel } from '../models/actions-response.model';
|
|
4
|
+
import { ActionAuditService } from '../services/action-audit.service';
|
|
3
5
|
import { ExtensionActionRegistryService } from '../services/extension-action-registry.service';
|
|
4
6
|
export declare class ActionsController {
|
|
5
7
|
private readonly actionRegistry;
|
|
8
|
+
private readonly auditService;
|
|
6
9
|
private readonly logger;
|
|
7
|
-
constructor(actionRegistry: ExtensionActionRegistryService);
|
|
8
|
-
getActions(type: string): Promise<ExtensionActionsResponseModel>;
|
|
9
|
-
executeAction(type: string, actionId: string, body: ReqExecuteActionDto): Promise<ActionResultResponseModel>;
|
|
10
|
+
constructor(actionRegistry: ExtensionActionRegistryService, auditService: ActionAuditService);
|
|
11
|
+
getActions(type: string, req: AuthenticatedRequest): Promise<ExtensionActionsResponseModel>;
|
|
12
|
+
executeAction(type: string, actionId: string, body: ReqExecuteActionDto, req: AuthenticatedRequest): Promise<ActionResultResponseModel>;
|
|
13
|
+
getActionHistory(type: string, actionId: string): ActionHistoryResponseModel;
|
|
14
|
+
private getUserRole;
|
|
10
15
|
}
|
|
@@ -22,26 +22,58 @@ const users_constants_1 = require("../../users/users.constants");
|
|
|
22
22
|
const execute_action_dto_1 = require("../dto/execute-action.dto");
|
|
23
23
|
const extensions_constants_1 = require("../extensions.constants");
|
|
24
24
|
const actions_response_model_1 = require("../models/actions-response.model");
|
|
25
|
+
const action_audit_service_1 = require("../services/action-audit.service");
|
|
25
26
|
const extension_action_registry_service_1 = require("../services/extension-action-registry.service");
|
|
26
27
|
let ActionsController = class ActionsController {
|
|
27
|
-
constructor(actionRegistry) {
|
|
28
|
+
constructor(actionRegistry, auditService) {
|
|
28
29
|
this.actionRegistry = actionRegistry;
|
|
30
|
+
this.auditService = auditService;
|
|
29
31
|
this.logger = (0, extension_logger_service_1.createExtensionLogger)(extensions_constants_1.EXTENSIONS_MODULE_NAME, 'ActionsController');
|
|
30
32
|
}
|
|
31
|
-
async getActions(type) {
|
|
33
|
+
async getActions(type, req) {
|
|
32
34
|
this.logger.debug(`Fetching actions for extension '${type}'`);
|
|
33
|
-
const
|
|
35
|
+
const userRole = this.getUserRole(req);
|
|
36
|
+
const actions = await this.actionRegistry.getActions(type, userRole);
|
|
34
37
|
const response = new actions_response_model_1.ExtensionActionsResponseModel();
|
|
35
38
|
response.data = actions;
|
|
36
39
|
return response;
|
|
37
40
|
}
|
|
38
|
-
async executeAction(type, actionId, body) {
|
|
41
|
+
async executeAction(type, actionId, body, req) {
|
|
42
|
+
const userRole = this.getUserRole(req);
|
|
43
|
+
const allowed = this.actionRegistry.isAllowed(type, actionId, userRole);
|
|
44
|
+
if (allowed === false) {
|
|
45
|
+
throw new common_1.ForbiddenException(`Insufficient permissions to execute action '${actionId}'`);
|
|
46
|
+
}
|
|
39
47
|
this.logger.log(`Executing action '${actionId}' for extension '${type}'`);
|
|
40
|
-
const
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
const params = body.data.params ?? {};
|
|
50
|
+
const result = await this.actionRegistry.execute(type, actionId, params);
|
|
51
|
+
this.auditService.record({
|
|
52
|
+
extensionType: type,
|
|
53
|
+
actionId,
|
|
54
|
+
userId: req.auth?.type === 'user' ? req.auth.id : null,
|
|
55
|
+
userRole: userRole,
|
|
56
|
+
params,
|
|
57
|
+
success: result.success,
|
|
58
|
+
message: result.message ?? null,
|
|
59
|
+
durationMs: Date.now() - startTime,
|
|
60
|
+
});
|
|
41
61
|
const response = new actions_response_model_1.ActionResultResponseModel();
|
|
42
62
|
response.data = result;
|
|
43
63
|
return response;
|
|
44
64
|
}
|
|
65
|
+
getActionHistory(type, actionId) {
|
|
66
|
+
const records = this.auditService.getHistory(type, actionId);
|
|
67
|
+
const response = new actions_response_model_1.ActionHistoryResponseModel();
|
|
68
|
+
response.data = records;
|
|
69
|
+
return response;
|
|
70
|
+
}
|
|
71
|
+
getUserRole(req) {
|
|
72
|
+
if (!req.auth?.role) {
|
|
73
|
+
throw new common_1.ForbiddenException('Unable to determine user role');
|
|
74
|
+
}
|
|
75
|
+
return req.auth.role;
|
|
76
|
+
}
|
|
45
77
|
};
|
|
46
78
|
exports.ActionsController = ActionsController;
|
|
47
79
|
__decorate([
|
|
@@ -50,14 +82,15 @@ __decorate([
|
|
|
50
82
|
(0, swagger_1.ApiOperation)({
|
|
51
83
|
operationId: 'get-extensions-module-extension-actions',
|
|
52
84
|
summary: 'List extension actions',
|
|
53
|
-
description: 'Returns available actions for an extension with resolved dynamic parameter options.
|
|
85
|
+
description: 'Returns available actions for an extension with resolved dynamic parameter options. Each action includes an `allowed` field based on the current user role.',
|
|
54
86
|
}),
|
|
55
87
|
(0, swagger_1.ApiParam)({ name: 'type', type: 'string', description: 'Extension type identifier' }),
|
|
56
88
|
(0, api_documentation_decorator_1.ApiSuccessResponse)(actions_response_model_1.ExtensionActionsResponseModel, 'Returns the list of available actions'),
|
|
57
89
|
(0, api_documentation_decorator_1.ApiNotFoundResponse)('Extension not found'),
|
|
58
90
|
__param(0, (0, common_1.Param)('type')),
|
|
91
|
+
__param(1, (0, common_1.Req)()),
|
|
59
92
|
__metadata("design:type", Function),
|
|
60
|
-
__metadata("design:paramtypes", [String]),
|
|
93
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
61
94
|
__metadata("design:returntype", Promise)
|
|
62
95
|
], ActionsController.prototype, "getActions", null);
|
|
63
96
|
__decorate([
|
|
@@ -66,7 +99,7 @@ __decorate([
|
|
|
66
99
|
(0, swagger_1.ApiOperation)({
|
|
67
100
|
operationId: 'execute-extensions-module-extension-action',
|
|
68
101
|
summary: 'Execute an extension action',
|
|
69
|
-
description:
|
|
102
|
+
description: "Executes an immediate action with the provided parameters. Requires the user role to match the action's required roles.",
|
|
70
103
|
}),
|
|
71
104
|
(0, swagger_1.ApiParam)({ name: 'type', type: 'string', description: 'Extension type identifier' }),
|
|
72
105
|
(0, swagger_1.ApiParam)({ name: 'actionId', type: 'string', description: 'Action identifier' }),
|
|
@@ -74,16 +107,36 @@ __decorate([
|
|
|
74
107
|
(0, api_documentation_decorator_1.ApiSuccessResponse)(actions_response_model_1.ActionResultResponseModel, 'Returns the action execution result'),
|
|
75
108
|
(0, api_documentation_decorator_1.ApiNotFoundResponse)('Extension or action not found'),
|
|
76
109
|
(0, api_documentation_decorator_1.ApiBadRequestResponse)('Action is not executable (wrong mode) or invalid parameters'),
|
|
110
|
+
(0, api_documentation_decorator_1.ApiForbiddenResponse)('Insufficient permissions to execute this action'),
|
|
77
111
|
__param(0, (0, common_1.Param)('type')),
|
|
78
112
|
__param(1, (0, common_1.Param)('actionId')),
|
|
79
113
|
__param(2, (0, common_1.Body)()),
|
|
114
|
+
__param(3, (0, common_1.Req)()),
|
|
80
115
|
__metadata("design:type", Function),
|
|
81
|
-
__metadata("design:paramtypes", [String, String, execute_action_dto_1.ReqExecuteActionDto]),
|
|
116
|
+
__metadata("design:paramtypes", [String, String, execute_action_dto_1.ReqExecuteActionDto, Object]),
|
|
82
117
|
__metadata("design:returntype", Promise)
|
|
83
118
|
], ActionsController.prototype, "executeAction", null);
|
|
119
|
+
__decorate([
|
|
120
|
+
(0, common_1.Get)(':actionId/history'),
|
|
121
|
+
(0, roles_guard_1.Roles)(users_constants_1.UserRole.OWNER, users_constants_1.UserRole.ADMIN),
|
|
122
|
+
(0, swagger_1.ApiOperation)({
|
|
123
|
+
operationId: 'get-extensions-module-extension-action-history',
|
|
124
|
+
summary: 'Get action execution history',
|
|
125
|
+
description: 'Returns recent execution records for a specific action.',
|
|
126
|
+
}),
|
|
127
|
+
(0, swagger_1.ApiParam)({ name: 'type', type: 'string', description: 'Extension type identifier' }),
|
|
128
|
+
(0, swagger_1.ApiParam)({ name: 'actionId', type: 'string', description: 'Action identifier' }),
|
|
129
|
+
(0, api_documentation_decorator_1.ApiSuccessResponse)(actions_response_model_1.ActionHistoryResponseModel, 'Returns the action execution history'),
|
|
130
|
+
__param(0, (0, common_1.Param)('type')),
|
|
131
|
+
__param(1, (0, common_1.Param)('actionId')),
|
|
132
|
+
__metadata("design:type", Function),
|
|
133
|
+
__metadata("design:paramtypes", [String, String]),
|
|
134
|
+
__metadata("design:returntype", actions_response_model_1.ActionHistoryResponseModel)
|
|
135
|
+
], ActionsController.prototype, "getActionHistory", null);
|
|
84
136
|
exports.ActionsController = ActionsController = __decorate([
|
|
85
137
|
(0, swagger_1.ApiTags)(extensions_constants_1.EXTENSIONS_MODULE_API_TAG_NAME),
|
|
86
138
|
(0, common_1.Controller)('extensions/:type/actions'),
|
|
87
|
-
__metadata("design:paramtypes", [extension_action_registry_service_1.ExtensionActionRegistryService
|
|
139
|
+
__metadata("design:paramtypes", [extension_action_registry_service_1.ExtensionActionRegistryService,
|
|
140
|
+
action_audit_service_1.ActionAuditService])
|
|
88
141
|
], ActionsController);
|
|
89
142
|
//# sourceMappingURL=actions.controller.js.map
|