@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.
@@ -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 build /builds/onereach/platform/idw/idw-template/packages/level-system/idw-init-account-resources
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onereach/idw-init-account-resources",
3
- "version": "0.19.4",
3
+ "version": "0.19.6",
4
4
  "description": "Creation of required resources in OneReach account to enable IDW",
5
5
  "license": "UNLICENSED",
6
6
  "contributors": [
@@ -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
+ }