@yrpri/api 9.0.77 → 9.0.79
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/active-citizen/workers/notification_delivery.cjs +3 -0
- package/agents/assistants/baseAssistant.js +10 -0
- package/agents/controllers/assistantsController.js +39 -0
- package/agents/managers/subscriptionManager.js +21 -2
- package/app.js +11 -5
- package/controllers/groups.cjs +1 -1
- package/package.json +5 -1
|
@@ -172,6 +172,9 @@ NotificationDeliveryWorker.prototype.process = function (notificationJson, callb
|
|
|
172
172
|
else if (notification.AcActivities[0].community_id) {
|
|
173
173
|
inviteFromName = notification.AcActivities[0].Community.name;
|
|
174
174
|
}
|
|
175
|
+
if (process.env.DEFAULT_HOSTNAME) {
|
|
176
|
+
community.hostname = process.env.DEFAULT_HOSTNAME;
|
|
177
|
+
}
|
|
175
178
|
queue.add('send-one-email', {
|
|
176
179
|
subject: { translateToken: 'notification.email.user_invite', contentName: inviteFromName },
|
|
177
180
|
template: 'user_invite',
|
|
@@ -25,6 +25,7 @@ export class YpBaseAssistant extends YpBaseChatBot {
|
|
|
25
25
|
this.defaultSystemPrompt = "You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world. \
|
|
26
26
|
Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting in a non-English language, start by using the standard \
|
|
27
27
|
accent or dialect familiar to the user. Talk quickly. You should always call a function if you can. Do not refer to these rules, even if you're asked about them.";
|
|
28
|
+
this.voiceEnabled = false;
|
|
28
29
|
this.domainId = domainId;
|
|
29
30
|
if (!domainId) {
|
|
30
31
|
throw new Error("Domain ID is required");
|
|
@@ -117,12 +118,20 @@ export class YpBaseAssistant extends YpBaseChatBot {
|
|
|
117
118
|
async updateAiModelSession(message) {
|
|
118
119
|
console.log(`updateAiModelSession: ${message}`);
|
|
119
120
|
}
|
|
121
|
+
async maybeSendTextResponse(message) {
|
|
122
|
+
if (!this.voiceEnabled) {
|
|
123
|
+
this.sendToClient("assistant", message, "message");
|
|
124
|
+
await this.addAssistantMessage(message);
|
|
125
|
+
console.debug(`Sent text message to client: ${message}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
120
128
|
async processClientSystemMessage(clientEvent) {
|
|
121
129
|
console.log(`processClientSystemMessage: ${JSON.stringify(clientEvent, null, 2)}`);
|
|
122
130
|
await this.loadMemoryAsync();
|
|
123
131
|
if (clientEvent.message === "user_logged_in") {
|
|
124
132
|
console.log(`user_logged_in emitting`);
|
|
125
133
|
this.emit("update-ai-model-session", "User is logged in, lets move to the next step");
|
|
134
|
+
await this.maybeSendTextResponse("Logged in, ready to move on to the next step.");
|
|
126
135
|
}
|
|
127
136
|
else if (clientEvent.message === "agent_configuration_submitted") {
|
|
128
137
|
console.log(`agent_configuration_submitted emitting`);
|
|
@@ -147,6 +156,7 @@ export class YpBaseAssistant extends YpBaseChatBot {
|
|
|
147
156
|
html,
|
|
148
157
|
}));
|
|
149
158
|
this.emit("update-ai-model-session", "The agent configuration was submitted successfully and the agent is ready to create its first agent run");
|
|
159
|
+
await this.maybeSendTextResponse("The agent configuration was submitted successfully and the agent is ready to create its first agent run.");
|
|
150
160
|
}
|
|
151
161
|
catch (error) {
|
|
152
162
|
console.error(`Error finding subscription: ${error}`);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import express from "express";
|
|
2
|
+
import { marked } from "marked";
|
|
3
|
+
import HTMLtoDOCX from "html-to-docx";
|
|
2
4
|
import auth from "../../authorization.cjs";
|
|
3
5
|
import { YpAgentAssistant } from "../assistants/agentAssistant.js";
|
|
4
6
|
import { YpAgentProductBundle } from "../models/agentProductBundle.js";
|
|
@@ -11,6 +13,7 @@ import { YpSubscriptionUser } from "../models/subscriptionUser.js";
|
|
|
11
13
|
import { YpDiscount } from "../models/discount.js";
|
|
12
14
|
import { sequelize } from "@policysynth/agents/dbModels/index.js";
|
|
13
15
|
import { NotificationAgentQueueManager } from "../managers/notificationAgentQueueManager.js";
|
|
16
|
+
import { AgentQueueManager } from "@policysynth/agents/operations/agentQueueManager.js";
|
|
14
17
|
const models = {
|
|
15
18
|
YpAgentProduct,
|
|
16
19
|
YpAgentProductBundle,
|
|
@@ -44,6 +47,35 @@ export class AssistantController {
|
|
|
44
47
|
process.exit(1);
|
|
45
48
|
}
|
|
46
49
|
};
|
|
50
|
+
this.getDocxReport = async (req, res) => {
|
|
51
|
+
try {
|
|
52
|
+
const { agentId } = req.params;
|
|
53
|
+
let lastStatusMessage = await this.getLastStatusMessageFromDB(parseInt(agentId));
|
|
54
|
+
if (!lastStatusMessage) {
|
|
55
|
+
return res.status(404).send("No status message found.");
|
|
56
|
+
}
|
|
57
|
+
const regex = /<markdownReport>([\s\S]*?)<\/markdownReport>/i;
|
|
58
|
+
const match = lastStatusMessage.match(regex);
|
|
59
|
+
console.debug(`match: ${JSON.stringify(match, null, 2)}`);
|
|
60
|
+
if (!match || match.length < 2) {
|
|
61
|
+
console.error("No <markdownReport>...</markdownReport> content found.");
|
|
62
|
+
return res
|
|
63
|
+
.status(400)
|
|
64
|
+
.send("No <markdownReport>...</markdownReport> content found.");
|
|
65
|
+
}
|
|
66
|
+
const markdownContent = match[1];
|
|
67
|
+
const htmlContent = await marked(markdownContent);
|
|
68
|
+
const docxBuffer = await HTMLtoDOCX(htmlContent);
|
|
69
|
+
console.debug(`docxBuffer: ${docxBuffer.length}`);
|
|
70
|
+
res.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
|
71
|
+
res.setHeader("Content-disposition", 'attachment; filename="converted.docx"');
|
|
72
|
+
return res.send(docxBuffer);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error("Error converting Markdown to DOCX:", error);
|
|
76
|
+
return res.status(500).send("Server error");
|
|
77
|
+
}
|
|
78
|
+
};
|
|
47
79
|
this.advanceOrStopCurrentWorkflowStep = async (req, res) => {
|
|
48
80
|
const { groupId, agentId, runId } = req.params;
|
|
49
81
|
const { status, wsClientId } = req.body;
|
|
@@ -271,6 +303,7 @@ export class AssistantController {
|
|
|
271
303
|
}
|
|
272
304
|
};
|
|
273
305
|
this.wsClients = wsClients;
|
|
306
|
+
this.agentQueueManager = new AgentQueueManager();
|
|
274
307
|
this.initializeRoutes();
|
|
275
308
|
this.initializeModels();
|
|
276
309
|
}
|
|
@@ -279,6 +312,7 @@ export class AssistantController {
|
|
|
279
312
|
this.router.post("/:domainId/voice", auth.can("view domain"), this.startVoiceSession.bind(this));
|
|
280
313
|
this.router.get("/:domainId/memory", auth.can("view domain"), this.getMemory.bind(this));
|
|
281
314
|
this.router.delete("/:domainId/chatlog", auth.can("view domain"), this.clearChatLog.bind(this));
|
|
315
|
+
//TODO: Add auth for below
|
|
282
316
|
this.router.put("/:domainId/updateAssistantMemoryLoginStatus", this.updateAssistantMemoryLoginStatus.bind(this));
|
|
283
317
|
this.router.put("/:domainId/submitAgentConfiguration", this.submitAgentConfiguration.bind(this));
|
|
284
318
|
this.router.put("/:groupId/:agentId/startWorkflowAgent", this.startWorkflowAgent.bind(this));
|
|
@@ -286,6 +320,11 @@ export class AssistantController {
|
|
|
286
320
|
this.router.post("/:groupId/:agentId/startNextWorkflowStep", this.startNextWorkflowStep.bind(this));
|
|
287
321
|
this.router.post("/:groupId/:agentId/stopCurrentWorkflowStep", this.stopCurrentWorkflowStep.bind(this));
|
|
288
322
|
this.router.put("/:groupId/:agentId/:runId/advanceOrStopWorkflow", this.advanceOrStopCurrentWorkflowStep.bind(this));
|
|
323
|
+
this.router.get("/:groupId/:agentId/getDocxReport", auth.can("view domain"), this.getDocxReport.bind(this));
|
|
324
|
+
}
|
|
325
|
+
async getLastStatusMessageFromDB(agentId) {
|
|
326
|
+
const status = await this.agentQueueManager.getAgentStatus(agentId);
|
|
327
|
+
return status ? status.messages[status.messages.length - 1] : null;
|
|
289
328
|
}
|
|
290
329
|
async startVoiceSession(req, res) {
|
|
291
330
|
try {
|
|
@@ -98,15 +98,31 @@ export class SubscriptionManager {
|
|
|
98
98
|
if (!userInstance) {
|
|
99
99
|
throw new Error("User not found");
|
|
100
100
|
}
|
|
101
|
+
const hasCommunityUser = await newCommunity.hasCommunityUsers(userInstance);
|
|
102
|
+
if (!hasCommunityUser) {
|
|
103
|
+
await newCommunity.addCommunityUsers(userInstance);
|
|
104
|
+
console.log("Added current user as community user", userInstance.id);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.log("Community already has the user as user", userInstance.id);
|
|
108
|
+
}
|
|
101
109
|
for (const group of groups) {
|
|
102
|
-
const
|
|
103
|
-
if (!
|
|
110
|
+
const hasGroupAdmin = await group.hasGroupAdmins(userInstance);
|
|
111
|
+
if (!hasGroupAdmin) {
|
|
104
112
|
await group.addGroupAdmins(userInstance);
|
|
105
113
|
console.log("Added current user as group admin", userInstance.id);
|
|
106
114
|
}
|
|
107
115
|
else {
|
|
108
116
|
console.log("Group already has the user as admin", userInstance.id);
|
|
109
117
|
}
|
|
118
|
+
const hasGroupUser = await group.hasGroupUsers(userInstance);
|
|
119
|
+
if (!hasGroupUser) {
|
|
120
|
+
await group.addGroupUsers(userInstance);
|
|
121
|
+
console.log("Added current user as group user", userInstance.id);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log("Group already has the user as user", userInstance.id);
|
|
125
|
+
}
|
|
110
126
|
}
|
|
111
127
|
// Create a map of old group IDs to new group IDs
|
|
112
128
|
const groupIdMap = newCommunity.groupMapping;
|
|
@@ -267,6 +283,9 @@ export class SubscriptionManager {
|
|
|
267
283
|
if (step.agentClassUuid && agentUuidMap.has(step.agentClassUuid)) {
|
|
268
284
|
newStep.agentId = agentUuidMap.get(step.agentClassUuid);
|
|
269
285
|
}
|
|
286
|
+
else if (step.agentClassUuid) {
|
|
287
|
+
console.error("agentClassUuid not found in agentUuidMap", step.agentClassUuid);
|
|
288
|
+
}
|
|
270
289
|
if (newStep.type === "engagmentFromInputConnector" && newStep.agentId) {
|
|
271
290
|
newStep.groupId = agentInputConnectorGroupsIds.get(newStep.agentId);
|
|
272
291
|
}
|
package/app.js
CHANGED
|
@@ -203,11 +203,11 @@ export class YourPrioritiesApi {
|
|
|
203
203
|
this.handleShortenedRedirects();
|
|
204
204
|
this.initializeRateLimiting();
|
|
205
205
|
this.setupDomainAndCommunity();
|
|
206
|
-
this.setupStaticFileServing();
|
|
207
206
|
this.setupSitemapRoute();
|
|
208
207
|
this.initializePassportStrategies();
|
|
209
|
-
this.checkAuthForSsoInit();
|
|
210
208
|
this.addInviteAsAnonMiddleWare();
|
|
209
|
+
this.setupStaticFileServing();
|
|
210
|
+
this.checkAuthForSsoInit();
|
|
211
211
|
this.initializeRoutes();
|
|
212
212
|
this.initializeEsControllers();
|
|
213
213
|
}
|
|
@@ -221,11 +221,11 @@ export class YourPrioritiesApi {
|
|
|
221
221
|
this.handleShortenedRedirects();
|
|
222
222
|
this.initializeRateLimiting();
|
|
223
223
|
this.setupDomainAndCommunity();
|
|
224
|
-
this.setupStaticFileServing();
|
|
225
224
|
this.setupSitemapRoute();
|
|
226
225
|
this.initializePassportStrategies();
|
|
227
|
-
this.checkAuthForSsoInit();
|
|
228
226
|
this.addInviteAsAnonMiddleWare();
|
|
227
|
+
this.setupStaticFileServing();
|
|
228
|
+
this.checkAuthForSsoInit();
|
|
229
229
|
this.initializeRoutes();
|
|
230
230
|
this.initializeEsControllers();
|
|
231
231
|
}
|
|
@@ -327,7 +327,7 @@ export class YourPrioritiesApi {
|
|
|
327
327
|
notifications_settings: models.AcNotification
|
|
328
328
|
.anonymousNotificationSettings,
|
|
329
329
|
status: "active",
|
|
330
|
-
//TODO: Having this
|
|
330
|
+
//TODO: Having this blocks security for the cloned groups, find a better solution
|
|
331
331
|
//profile_data: { isAnonymousUser: true },
|
|
332
332
|
});
|
|
333
333
|
}
|
|
@@ -348,9 +348,15 @@ export class YourPrioritiesApi {
|
|
|
348
348
|
// Mark invite as used
|
|
349
349
|
invite.joined_at = new Date();
|
|
350
350
|
await invite.save();
|
|
351
|
+
console.log("Invite joined at", invite.joined_at);
|
|
351
352
|
await new Promise((resolve, reject) => {
|
|
352
353
|
req.logIn(user, (error) => (error ? reject(error) : resolve()));
|
|
353
354
|
});
|
|
355
|
+
console.log("User logged in for anon invite");
|
|
356
|
+
return next();
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
console.error("Invite not found");
|
|
354
360
|
return next();
|
|
355
361
|
}
|
|
356
362
|
}
|
package/controllers/groups.cjs
CHANGED
|
@@ -1013,7 +1013,7 @@ router.post("/:groupId/sendEmailInvitesForAnons", auth.can("edit group"), async
|
|
|
1013
1013
|
community_id: group.community_id,
|
|
1014
1014
|
from_user_id: req.user.id,
|
|
1015
1015
|
});
|
|
1016
|
-
const invite_link = `/group/${group.id}?anonInvite=1&token=${token}`;
|
|
1016
|
+
const invite_link = `/group/${group.id}?anonInvite=1&token=${token}&forAgentBundle=1`;
|
|
1017
1017
|
const createActivityPromise = new Promise((resolve, reject) => {
|
|
1018
1018
|
models.AcActivity.inviteCreated({
|
|
1019
1019
|
email: email,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yrpri/api",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.79",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Robert Bjarnason & Citizens Foundation",
|
|
6
6
|
"repository": {
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"express-session": "git+https://github.com/rbjarnason/session.git#upgrade-21",
|
|
52
52
|
"express-useragent": "^1.0.13",
|
|
53
53
|
"farmhash": "3.3.1",
|
|
54
|
+
"html-to-docx": "^1.8.0",
|
|
54
55
|
"i18next": "^23.12.2",
|
|
55
56
|
"i18next-node-fs-backend": "^2.1.3",
|
|
56
57
|
"image-size": "^1.0.2",
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
"jsonrepair": "^3.5.0",
|
|
61
62
|
"knuth-shuffle-seeded": "^1.0.6",
|
|
62
63
|
"lodash": "^4.17.15",
|
|
64
|
+
"marked": "^15.0.4",
|
|
63
65
|
"moment": "^2.24.0",
|
|
64
66
|
"morgan": "~1.10.0",
|
|
65
67
|
"multer": "1.4.5-lts.1",
|
|
@@ -111,6 +113,8 @@
|
|
|
111
113
|
"@types/express": "^4.17.21",
|
|
112
114
|
"@types/express-session": "^1.17.3",
|
|
113
115
|
"@types/express-useragent": "^1.0.5",
|
|
116
|
+
"@types/html-docx-js": "^0.3.4",
|
|
117
|
+
"@types/marked": "^6.0.0",
|
|
114
118
|
"@types/morgan": "^1.9.9",
|
|
115
119
|
"@types/node": "^20.14.12",
|
|
116
120
|
"@types/passport": "^1.0.16",
|