@onereach/idw-init-account-resources 0.19.4 → 0.19.6
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +12 -0
- package/dist/assets/db_migrations/20251210192730-add-url-to-skills.js +120 -0
- package/dist/assets/db_migrations/20251210192730-add-url-to-skills.js.map +1 -0
- package/dist/assets/db_migrations/20251218101200-add-new-settings-to-kv.js +91 -0
- package/dist/assets/db_migrations/20251218101200-add-new-settings-to-kv.js.map +1 -0
- package/dist/utils/encodeAccountId.js +37 -0
- package/dist/utils/encodeAccountId.js.map +1 -0
- package/package.json +1 -1
- package/src/assets/db_migrations/20251210192730-add-url-to-skills.ts +87 -0
- package/src/assets/db_migrations/20251218101200-add-new-settings-to-kv.ts +44 -0
- package/src/types.ts +2 -0
- package/src/utils/encodeAccountId.ts +43 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
WARN Issue while reading "/builds/onereach/platform/idw/idw-template/.npmrc". Failed to replace env in config: ${OR_NPM_TOKEN}
|
|
2
2
|
|
|
3
|
-
> @onereach/idw-init-account-resources@0.19.
|
|
3
|
+
> @onereach/idw-init-account-resources@0.19.5 build /builds/onereach/platform/idw/idw-template/packages/level-system/idw-init-account-resources
|
|
4
4
|
> rimraf dist && tsc -b && mkdir dist/assets/skills/documentation && cp -r src/assets/skills/documentation/* dist/assets/skills/documentation
|
|
5
5
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @onereach/idw-init-account-resources
|
|
2
2
|
|
|
3
|
+
## 0.19.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- f4a63bf: add url column to the skills table
|
|
8
|
+
|
|
9
|
+
## 0.19.5
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 25ab2fb: add new migration for settings
|
|
14
|
+
|
|
3
15
|
## 0.19.4
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var encodeAccountId_1 = require("../../utils/encodeAccountId");
|
|
40
|
+
module.exports = {
|
|
41
|
+
up: function (queryInterface) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
43
|
+
var _a, sequelize, discoveryUrl, skills, services, rwcService, baseUrl, _i, skills_1, skill, url, meta, encodedAccountId, encodedAccountId;
|
|
44
|
+
var _b, _c, _d;
|
|
45
|
+
return __generator(this, function (_e) {
|
|
46
|
+
switch (_e.label) {
|
|
47
|
+
case 0:
|
|
48
|
+
_a = queryInterface.context, sequelize = _a.sequelize, discoveryUrl = _a.discoveryUrl;
|
|
49
|
+
return [4, sequelize.query("\n ALTER TABLE skills\n ADD COLUMN IF NOT EXISTS url TEXT;\n ")];
|
|
50
|
+
case 1:
|
|
51
|
+
_e.sent();
|
|
52
|
+
return [4, sequelize.query('SELECT id, account_id, slug, meta FROM skills')];
|
|
53
|
+
case 2:
|
|
54
|
+
skills = (_e.sent())[0];
|
|
55
|
+
return [4, fetch("".concat(discoveryUrl, "/api/v2/services")).then(function (res) { return res.json(); })];
|
|
56
|
+
case 3:
|
|
57
|
+
services = (_e.sent()).services;
|
|
58
|
+
rwcService = services.find(function (service) { return service.serviceKey === 'rwc'; });
|
|
59
|
+
baseUrl = (_b = rwcService === null || rwcService === void 0 ? void 0 : rwcService.url) === null || _b === void 0 ? void 0 : _b.replace('rwc.', 'chat.');
|
|
60
|
+
_i = 0, skills_1 = skills;
|
|
61
|
+
_e.label = 4;
|
|
62
|
+
case 4:
|
|
63
|
+
if (!(_i < skills_1.length)) return [3, 7];
|
|
64
|
+
skill = skills_1[_i];
|
|
65
|
+
url = void 0;
|
|
66
|
+
meta = skill.meta;
|
|
67
|
+
if ((_c = meta === null || meta === void 0 ? void 0 : meta.chat) === null || _c === void 0 ? void 0 : _c.url) {
|
|
68
|
+
url = meta.chat.url;
|
|
69
|
+
}
|
|
70
|
+
else if ((_d = meta === null || meta === void 0 ? void 0 : meta.chat) === null || _d === void 0 ? void 0 : _d.id) {
|
|
71
|
+
encodedAccountId = (0, encodeAccountId_1.encodeAccountId)(skill.account_id);
|
|
72
|
+
url = "".concat(baseUrl, "/").concat(encodedAccountId, "/").concat(meta.chat.id);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
encodedAccountId = (0, encodeAccountId_1.encodeAccountId)(skill.account_id);
|
|
76
|
+
url = "".concat(baseUrl, "/").concat(encodedAccountId, "/").concat(skill.slug);
|
|
77
|
+
}
|
|
78
|
+
return [4, sequelize.query('UPDATE skills SET url = :url WHERE id = :id', {
|
|
79
|
+
replacements: {
|
|
80
|
+
url: url,
|
|
81
|
+
id: skill.id,
|
|
82
|
+
},
|
|
83
|
+
})];
|
|
84
|
+
case 5:
|
|
85
|
+
_e.sent();
|
|
86
|
+
_e.label = 6;
|
|
87
|
+
case 6:
|
|
88
|
+
_i++;
|
|
89
|
+
return [3, 4];
|
|
90
|
+
case 7: return [4, sequelize.query("\n ALTER TABLE skills\n ALTER COLUMN url SET NOT NULL;\n ")];
|
|
91
|
+
case 8:
|
|
92
|
+
_e.sent();
|
|
93
|
+
return [4, sequelize.query("\n CREATE UNIQUE INDEX IF NOT EXISTS skills_account_id_url_unique_idx\n ON skills (account_id, url);\n ")];
|
|
94
|
+
case 9:
|
|
95
|
+
_e.sent();
|
|
96
|
+
return [2];
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
down: function (queryInterface) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
103
|
+
var sequelize;
|
|
104
|
+
return __generator(this, function (_a) {
|
|
105
|
+
switch (_a.label) {
|
|
106
|
+
case 0:
|
|
107
|
+
sequelize = queryInterface.context.sequelize;
|
|
108
|
+
return [4, sequelize.query("\n DROP INDEX IF EXISTS skills_account_id_url_unique_idx;\n ")];
|
|
109
|
+
case 1:
|
|
110
|
+
_a.sent();
|
|
111
|
+
return [4, sequelize.query("\n ALTER TABLE skills\n DROP COLUMN IF EXISTS url;\n ")];
|
|
112
|
+
case 2:
|
|
113
|
+
_a.sent();
|
|
114
|
+
return [2];
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=20251210192730-add-url-to-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251210192730-add-url-to-skills.js","sourceRoot":"","sources":["../../../src/assets/db_migrations/20251210192730-add-url-to-skills.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMb,+DAA8D;AAI9D,MAAM,CAAC,OAAO,GAAG;IACT,EAAE,YAAC,cAAoE;;;;;;;wBACrE,KAA8B,cAAc,CAAC,OAAO,EAAlD,SAAS,eAAA,EAAE,YAAY,kBAAA,CAA4B;wBAG3D,WAAM,SAAS,CAAC,KAAK,CAAC,4EAGrB,CAAC,EAAA;;wBAHF,SAGE,CAAC;wBAGc,WAAM,SAAS,CAAC,KAAK,CACpC,+CAA+C,CAChD,EAAA;;wBAFM,MAAM,GAAI,CAAA,SAEqE,CAAA,GAFzE;wBAKX,WAAM,KAAK,CAAC,UAAG,YAAY,qBAAkB,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,IAAI,EAAE,EAAV,CAAU,CAAC,EAAA;;wBADhE,QAAQ,GACd,CAAA,SAAsE,CAAA,SADxD;wBAGV,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAC,OAA4C,IAAK,OAAA,OAAO,CAAC,UAAU,KAAK,KAAK,EAA5B,CAA4B,CAAC,CAAC;wBAE3G,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,GAAG,0CAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;8BAEhC,EAAN,iBAAM;;;6BAAN,CAAA,oBAAM,CAAA;wBAAf,KAAK;wBACV,GAAG,SAAQ,CAAC;wBACV,IAAI,GAAG,KAAK,CAAC,IAAgD,CAAC;wBAEpE,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,GAAG,EAAE,CAAC;4BACpB,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;wBACtB,CAAC;6BAAM,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,EAAE,EAAE,CAAC;4BAEpB,gBAAgB,GAAG,IAAA,iCAAe,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;4BAC3D,GAAG,GAAG,UAAG,OAAO,cAAI,gBAAgB,cAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;wBACzD,CAAC;6BAAM,CAAC;4BAEA,gBAAgB,GAAG,IAAA,iCAAe,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;4BAC3D,GAAG,GAAG,UAAG,OAAO,cAAI,gBAAgB,cAAI,KAAK,CAAC,IAAI,CAAE,CAAC;wBACvD,CAAC;wBAED,WAAM,SAAS,CAAC,KAAK,CACnB,6CAA6C,EAC7C;gCACE,YAAY,EAAE;oCACZ,GAAG,KAAA;oCACH,EAAE,EAAE,KAAK,CAAC,EAAE;iCACb;6BACF,CACF,EAAA;;wBARD,SAQC,CAAC;;;wBAxBgB,IAAM,CAAA;;4BA4B1B,WAAM,SAAS,CAAC,KAAK,CAAC,wEAGrB,CAAC,EAAA;;wBAHF,SAGE,CAAC;wBAGH,WAAM,SAAS,CAAC,KAAK,CAAC,sHAGrB,CAAC,EAAA;;wBAHF,SAGE,CAAC;;;;;KACJ;IAEK,IAAI,YAAC,cAAoE;;;;;;wBACvE,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;wBAGnD,WAAM,SAAS,CAAC,KAAK,CAAC,sEAErB,CAAC,EAAA;;wBAFF,SAEE,CAAC;wBAGH,WAAM,SAAS,CAAC,KAAK,CAAC,oEAGrB,CAAC,EAAA;;wBAHF,SAGE,CAAC;;;;;KACJ;CACF,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
var key_value_storage_1 = require("@or-sdk/key-value-storage");
|
|
51
|
+
module.exports = {
|
|
52
|
+
up: function (queryInterface) {
|
|
53
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
54
|
+
var keyValueStorage, settings, updated;
|
|
55
|
+
var _a, _b;
|
|
56
|
+
return __generator(this, function (_c) {
|
|
57
|
+
switch (_c.label) {
|
|
58
|
+
case 0:
|
|
59
|
+
keyValueStorage = new key_value_storage_1.KeyValueStorage({
|
|
60
|
+
discoveryUrl: queryInterface.context.discoveryUrl,
|
|
61
|
+
token: queryInterface.context._orToken,
|
|
62
|
+
});
|
|
63
|
+
return [4, keyValueStorage.getValueByKey('idw-settings', 'all')];
|
|
64
|
+
case 1:
|
|
65
|
+
settings = (_c.sent()).value;
|
|
66
|
+
updated = __assign(__assign({}, settings), { instruction: settings.description, signup: {
|
|
67
|
+
header: ((_a = settings === null || settings === void 0 ? void 0 : settings.signup) === null || _a === void 0 ? void 0 : _a.header) || 'Hello!',
|
|
68
|
+
description: ((_b = settings === null || settings === void 0 ? void 0 : settings.signup) === null || _b === void 0 ? void 0 : _b.description) || 'Let\'s create your account.',
|
|
69
|
+
}, welcomeScreen: {
|
|
70
|
+
title: 'Hi there!',
|
|
71
|
+
description: 'Ask a question or use one of the suggested prompts to get started',
|
|
72
|
+
placeholder: 'Lets get to work! What do you need?',
|
|
73
|
+
suggestions: [
|
|
74
|
+
{
|
|
75
|
+
text: 'How can I add my company\'s knowledge to the IDW?',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
text: 'What are the different ways I can use the IDW?',
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
} });
|
|
82
|
+
return [4, keyValueStorage.setValueByKey('idw-settings', 'all', updated)];
|
|
83
|
+
case 2:
|
|
84
|
+
_c.sent();
|
|
85
|
+
return [2];
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=20251218101200-add-new-settings-to-kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251218101200-add-new-settings-to-kv.js","sourceRoot":"","sources":["../../../src/assets/db_migrations/20251218101200-add-new-settings-to-kv.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,+DAA4D;AAO5D,MAAM,CAAC,OAAO,GAAG;IACT,EAAE,YAAC,cAAoE;;;;;;;wBACrE,eAAe,GAAG,IAAI,mCAAe,CAAC;4BAC1C,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY;4BACjD,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ;yBACvC,CAAC,CAAC;wBAGe,WAAM,eAAe,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC,EAAA;;wBAAtE,QAAQ,GAAG,CAAC,SAA0D,CAAC,CAAC,KAA4B;wBAEpG,OAAO,yBACR,QAAQ,KACX,WAAW,EAAE,QAAQ,CAAC,WAAW,EACjC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,MAAM,KAAI,QAAQ;gCAC5C,WAAW,EAAE,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,WAAW,KAAI,6BAA6B;6BAC5E,EACD,aAAa,EAAE;gCACb,KAAK,EAAE,WAAW;gCAClB,WAAW,EAAE,mEAAmE;gCAChF,WAAW,EAAE,qCAAqC;gCAClD,WAAW,EAAE;oCACX;wCACE,IAAI,EAAE,mDAAmD;qCAC1D;oCACD;wCACE,IAAI,EAAE,gDAAgD;qCACvD;iCACF;6BACF,GACF,CAAC;wBAEF,WAAM,eAAe,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,EAAA;;wBAAnE,SAAmE,CAAC;;;;;KACrE;CACF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encodeAccountId = void 0;
|
|
4
|
+
function encodeAccountId(uuid) {
|
|
5
|
+
var bytes = parseUuid(uuid);
|
|
6
|
+
var base64 = arrayBufferToBase64(bytes);
|
|
7
|
+
var slug = base64.replace(/\+/g, '-').replace(/\//g, '_').substring(0, 22);
|
|
8
|
+
return slug;
|
|
9
|
+
}
|
|
10
|
+
exports.encodeAccountId = encodeAccountId;
|
|
11
|
+
function parseUuid(s, buf, offset) {
|
|
12
|
+
var byteToHex = [];
|
|
13
|
+
var hexToByte = {};
|
|
14
|
+
for (var i_1 = 0; i_1 < 256; i_1++) {
|
|
15
|
+
byteToHex[i_1] = (i_1 + 0x100).toString(16).substring(1);
|
|
16
|
+
hexToByte[byteToHex[i_1]] = i_1;
|
|
17
|
+
}
|
|
18
|
+
var i = (buf && offset) || 0;
|
|
19
|
+
var ii = 0;
|
|
20
|
+
buf = buf || [];
|
|
21
|
+
s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {
|
|
22
|
+
if (ii < 16) {
|
|
23
|
+
buf[i + ii++] = hexToByte[oct];
|
|
24
|
+
}
|
|
25
|
+
return oct;
|
|
26
|
+
});
|
|
27
|
+
while (ii < 16) {
|
|
28
|
+
buf[i + ii++] = 0;
|
|
29
|
+
}
|
|
30
|
+
return buf;
|
|
31
|
+
}
|
|
32
|
+
function arrayBufferToBase64(buffer) {
|
|
33
|
+
var bytes = new Uint8Array(buffer);
|
|
34
|
+
var binary = Buffer.from(bytes).toString('base64');
|
|
35
|
+
return binary;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=encodeAccountId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encodeAccountId.js","sourceRoot":"","sources":["../../src/utils/encodeAccountId.ts"],"names":[],"mappings":";;;AAAA,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE7E,OAAO,IAAI,CAAC;AACd,CAAC;AAND,0CAMC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,GAAc,EAAE,MAAe;IAC3D,IAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,KAAK,IAAI,GAAC,GAAG,CAAC,EAAC,GAAC,GAAG,GAAG,EAAC,GAAC,EAAE,EAAE,CAAC;QAC3B,SAAS,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,CAAC,GAAC,CAAC,CAAC,GAAG,GAAC,CAAC;IAC9B,CAAC;IAED,IAAM,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,EAAE,GAAG,CAAC,CAAC;IAEX,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,GAAG;QACnD,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACZ,GAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAGH,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;QACf,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAgB;IAC3C,IAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { QueryInterface } from 'sequelize';
|
|
4
|
+
import { MigrationParams } from 'umzug';
|
|
5
|
+
|
|
6
|
+
import { OrMigrationContext } from '../../types';
|
|
7
|
+
import { encodeAccountId } from '../../utils/encodeAccountId';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
/** @type {import('sequelize-cli').Migration} */
|
|
11
|
+
module.exports = {
|
|
12
|
+
async up(queryInterface: MigrationParams<QueryInterface & OrMigrationContext>) {
|
|
13
|
+
const { sequelize, discoveryUrl } = queryInterface.context;
|
|
14
|
+
|
|
15
|
+
// Add url column to skills table (nullable initially)
|
|
16
|
+
await sequelize.query(`
|
|
17
|
+
ALTER TABLE skills
|
|
18
|
+
ADD COLUMN IF NOT EXISTS url TEXT;
|
|
19
|
+
`);
|
|
20
|
+
|
|
21
|
+
// Update each skill with the appropriate url value
|
|
22
|
+
const [skills] = await sequelize.query(
|
|
23
|
+
'SELECT id, account_id, slug, meta FROM skills',
|
|
24
|
+
) as unknown as [ { id: string; account_id: string; slug: string; meta: unknown; }[] ];
|
|
25
|
+
|
|
26
|
+
const { services } =
|
|
27
|
+
await fetch(`${discoveryUrl}/api/v2/services`).then(res => res.json());
|
|
28
|
+
|
|
29
|
+
const rwcService = services.find((service: { serviceKey: string; url: string }) => service.serviceKey === 'rwc');
|
|
30
|
+
// todo: is there a better way to get chat url?
|
|
31
|
+
const baseUrl = rwcService?.url?.replace('rwc.', 'chat.');
|
|
32
|
+
|
|
33
|
+
for (const skill of skills) {
|
|
34
|
+
let url: string;
|
|
35
|
+
const meta = skill.meta as { chat?: { url?: string; id?: string } };
|
|
36
|
+
|
|
37
|
+
if (meta?.chat?.url) {
|
|
38
|
+
url = meta.chat.url;
|
|
39
|
+
} else if (meta?.chat?.id) {
|
|
40
|
+
// Compose URL from baseUrl, encoded account_id, and meta.chat.id
|
|
41
|
+
const encodedAccountId = encodeAccountId(skill.account_id);
|
|
42
|
+
url = `${baseUrl}/${encodedAccountId}/${meta.chat.id}`;
|
|
43
|
+
} else {
|
|
44
|
+
// Fallback: use skill id as part of URL if no chat metadata exists
|
|
45
|
+
const encodedAccountId = encodeAccountId(skill.account_id);
|
|
46
|
+
url = `${baseUrl}/${encodedAccountId}/${skill.slug}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await sequelize.query(
|
|
50
|
+
'UPDATE skills SET url = :url WHERE id = :id',
|
|
51
|
+
{
|
|
52
|
+
replacements: {
|
|
53
|
+
url,
|
|
54
|
+
id: skill.id,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Make url column NOT NULL after populating values
|
|
61
|
+
await sequelize.query(`
|
|
62
|
+
ALTER TABLE skills
|
|
63
|
+
ALTER COLUMN url SET NOT NULL;
|
|
64
|
+
`);
|
|
65
|
+
|
|
66
|
+
// Create unique index on account_id and url
|
|
67
|
+
await sequelize.query(`
|
|
68
|
+
CREATE UNIQUE INDEX IF NOT EXISTS skills_account_id_url_unique_idx
|
|
69
|
+
ON skills (account_id, url);
|
|
70
|
+
`);
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
async down(queryInterface: MigrationParams<QueryInterface & OrMigrationContext>) {
|
|
74
|
+
const sequelize = queryInterface.context.sequelize;
|
|
75
|
+
|
|
76
|
+
// Drop the unique index
|
|
77
|
+
await sequelize.query(`
|
|
78
|
+
DROP INDEX IF EXISTS skills_account_id_url_unique_idx;
|
|
79
|
+
`);
|
|
80
|
+
|
|
81
|
+
// Drop the url column
|
|
82
|
+
await sequelize.query(`
|
|
83
|
+
ALTER TABLE skills
|
|
84
|
+
DROP COLUMN IF EXISTS url;
|
|
85
|
+
`);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { KeyValueStorage } from '@or-sdk/key-value-storage';
|
|
4
|
+
import { QueryInterface } from 'sequelize';
|
|
5
|
+
import { MigrationParams } from 'umzug';
|
|
6
|
+
|
|
7
|
+
import { OrMigrationContext } from '../../types';
|
|
8
|
+
|
|
9
|
+
/** @type {import('sequelize-cli').Migration} */
|
|
10
|
+
module.exports = {
|
|
11
|
+
async up(queryInterface: MigrationParams<QueryInterface & OrMigrationContext>) {
|
|
12
|
+
const keyValueStorage = new KeyValueStorage({
|
|
13
|
+
discoveryUrl: queryInterface.context.discoveryUrl,
|
|
14
|
+
token: queryInterface.context._orToken,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line
|
|
18
|
+
const settings = (await keyValueStorage.getValueByKey('idw-settings', 'all')).value as Record<string, any>;
|
|
19
|
+
|
|
20
|
+
const updated = {
|
|
21
|
+
...settings,
|
|
22
|
+
instruction: settings.description,
|
|
23
|
+
signup: {
|
|
24
|
+
header: settings?.signup?.header || 'Hello!',
|
|
25
|
+
description: settings?.signup?.description || 'Let\'s create your account.',
|
|
26
|
+
},
|
|
27
|
+
welcomeScreen: {
|
|
28
|
+
title: 'Hi there!',
|
|
29
|
+
description: 'Ask a question or use one of the suggested prompts to get started',
|
|
30
|
+
placeholder: 'Lets get to work! What do you need?',
|
|
31
|
+
suggestions: [
|
|
32
|
+
{
|
|
33
|
+
text: 'How can I add my company\'s knowledge to the IDW?',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
text: 'What are the different ways I can use the IDW?',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
await keyValueStorage.setValueByKey('idw-settings', 'all', updated);
|
|
43
|
+
},
|
|
44
|
+
};
|
package/src/types.ts
CHANGED
|
@@ -21,6 +21,8 @@ export type UmzugParams = {
|
|
|
21
21
|
export type OrMigrationContext = Omit<UmzugParams, 'sequelizeInstance' | 'migrationsPath'> & {
|
|
22
22
|
// Not sure why we need _
|
|
23
23
|
_orToken: string;
|
|
24
|
+
discoveryUrl: string;
|
|
25
|
+
accountId: string;
|
|
24
26
|
};
|
|
25
27
|
|
|
26
28
|
export type InitLookupResourcesConfig = InitResourcesConfig
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function encodeAccountId(uuid: string): string {
|
|
2
|
+
const bytes = parseUuid(uuid);
|
|
3
|
+
const base64 = arrayBufferToBase64(bytes);
|
|
4
|
+
const slug = base64.replace(/\+/g, '-').replace(/\//g, '_').substring(0, 22);
|
|
5
|
+
|
|
6
|
+
return slug;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function parseUuid(s: string, buf?: number[], offset?: number): number[] {
|
|
10
|
+
const byteToHex: string[] = [];
|
|
11
|
+
const hexToByte: Record<string, number> = {};
|
|
12
|
+
|
|
13
|
+
for (let i = 0;i < 256;i++) {
|
|
14
|
+
byteToHex[i] = (i + 0x100).toString(16).substring(1);
|
|
15
|
+
hexToByte[byteToHex[i]] = i;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const i = (buf && offset) || 0;
|
|
19
|
+
let ii = 0;
|
|
20
|
+
|
|
21
|
+
buf = buf || [];
|
|
22
|
+
s.toLowerCase().replace(/[0-9a-f]{2}/g, function (oct) {
|
|
23
|
+
if (ii < 16) { // Don't overflow!
|
|
24
|
+
buf![i + ii++] = hexToByte[oct];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return oct;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Zero out remaining bytes if string was short
|
|
31
|
+
while (ii < 16) {
|
|
32
|
+
buf[i + ii++] = 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return buf;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function arrayBufferToBase64(buffer: number[]): string {
|
|
39
|
+
const bytes = new Uint8Array(buffer);
|
|
40
|
+
const binary = Buffer.from(bytes).toString('base64');
|
|
41
|
+
|
|
42
|
+
return binary;
|
|
43
|
+
}
|