@awell-health/awell-extensions 2.0.282 → 2.0.284
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/extensions/freshdesk/actions/index.d.ts +1 -0
- package/dist/extensions/freshdesk/actions/index.js +5 -0
- package/dist/extensions/freshdesk/actions/index.js.map +1 -0
- package/dist/extensions/freshdesk/index.d.ts +2 -0
- package/dist/extensions/freshdesk/index.js +21 -0
- package/dist/extensions/freshdesk/index.js.map +1 -0
- package/dist/extensions/freshdesk/settings.d.ts +27 -0
- package/dist/extensions/freshdesk/settings.js +25 -0
- package/dist/extensions/freshdesk/settings.js.map +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/__testdata__/ticketCreated.mock.d.ts +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/__testdata__/ticketCreated.mock.js +5 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/__testdata__/ticketCreated.mock.js.map +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/index.d.ts +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/index.js +18 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/index.js.map +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/ticketCreated.d.ts +7 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/ticketCreated.js +14 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/ticketCreated.js.map +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/types.d.ts +1 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/types.js +3 -0
- package/dist/extensions/freshdesk/webhooks/TicketCreated/types.js.map +1 -0
- package/dist/extensions/freshdesk/webhooks/index.d.ts +16 -0
- package/dist/extensions/freshdesk/webhooks/index.js +6 -0
- package/dist/extensions/freshdesk/webhooks/index.js.map +1 -0
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/markdown.json +4 -0
- package/package.json +1 -1
@@ -0,0 +1 @@
|
|
1
|
+
export declare const actions: {};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../extensions/freshdesk/actions/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,EAAE,CAAA"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.freshdesk = void 0;
|
4
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
5
|
+
const actions_1 = require("./actions");
|
6
|
+
const settings_1 = require("./settings");
|
7
|
+
const webhooks_1 = require("./webhooks");
|
8
|
+
exports.freshdesk = {
|
9
|
+
key: 'freshdesk',
|
10
|
+
title: 'Freshdesk',
|
11
|
+
icon_url: 'https://res.cloudinary.com/da7x4rzl4/image/upload/v1751905938/Awell%20Extensions/png-clipart-freshdesk-logo-icon-tech-companies.png',
|
12
|
+
description: 'Freshdesk is a cloud-based customer service software that helps businesses manage and streamline their customer support operations.',
|
13
|
+
category: extensions_core_1.Category.CUSTOMER_SUPPORT,
|
14
|
+
author: {
|
15
|
+
authorType: extensions_core_1.AuthorType.AWELL,
|
16
|
+
},
|
17
|
+
actions: actions_1.actions,
|
18
|
+
settings: settings_1.settings,
|
19
|
+
webhooks: webhooks_1.webhooks,
|
20
|
+
};
|
21
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../extensions/freshdesk/index.ts"],"names":[],"mappings":";;;AACA,mEAAoE;AACpE,uCAAmC;AACnC,yCAAqC;AACrC,yCAAqC;AAExB,QAAA,SAAS,GAAc;IAClC,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,WAAW;IAClB,QAAQ,EACN,qIAAqI;IACvI,WAAW,EACT,qIAAqI;IACvI,QAAQ,EAAE,0BAAQ,CAAC,gBAAgB;IACnC,MAAM,EAAE;QACN,UAAU,EAAE,4BAAU,CAAC,KAAK;KAC7B;IACD,OAAO,EAAP,iBAAO;IACP,QAAQ,EAAR,mBAAQ;IACR,QAAQ,EAAR,mBAAQ;CACT,CAAA"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
export declare const settings: {
|
3
|
+
domain: {
|
4
|
+
key: string;
|
5
|
+
label: string;
|
6
|
+
description: string;
|
7
|
+
required: true;
|
8
|
+
obfuscated: false;
|
9
|
+
};
|
10
|
+
apiKey: {
|
11
|
+
key: string;
|
12
|
+
label: string;
|
13
|
+
description: string;
|
14
|
+
required: true;
|
15
|
+
obfuscated: true;
|
16
|
+
};
|
17
|
+
};
|
18
|
+
export declare const SettingsValidationSchema: z.ZodObject<{
|
19
|
+
domain: z.ZodString;
|
20
|
+
apiKey: z.ZodString;
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
22
|
+
apiKey: string;
|
23
|
+
domain: string;
|
24
|
+
}, {
|
25
|
+
apiKey: string;
|
26
|
+
domain: string;
|
27
|
+
}>;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.SettingsValidationSchema = exports.settings = void 0;
|
4
|
+
const zod_1 = require("zod");
|
5
|
+
exports.settings = {
|
6
|
+
domain: {
|
7
|
+
key: 'domain',
|
8
|
+
label: 'Freshdesk helpdesk domain',
|
9
|
+
description: 'Will be used to construct the API URL. E.g. https://<domain>.freshdesk.com/api/v2/contacts',
|
10
|
+
required: true,
|
11
|
+
obfuscated: false,
|
12
|
+
},
|
13
|
+
apiKey: {
|
14
|
+
key: 'apiKey',
|
15
|
+
label: 'API key',
|
16
|
+
description: '',
|
17
|
+
required: true,
|
18
|
+
obfuscated: true,
|
19
|
+
},
|
20
|
+
};
|
21
|
+
exports.SettingsValidationSchema = zod_1.z.object({
|
22
|
+
domain: zod_1.z.string().min(1),
|
23
|
+
apiKey: zod_1.z.string().min(1),
|
24
|
+
});
|
25
|
+
//# sourceMappingURL=settings.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../extensions/freshdesk/settings.ts"],"names":[],"mappings":";;;AACA,6BAAwC;AAE3B,QAAA,QAAQ,GAAG;IACtB,MAAM,EAAE;QACN,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,4FAA4F;QAC9F,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,KAAK;KAClB;IACD,MAAM,EAAE;QACN,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;KACjB;CACgC,CAAA;AAEtB,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC0B,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const ticketCreatedPayload: {};
|
package/dist/extensions/freshdesk/webhooks/TicketCreated/__testdata__/ticketCreated.mock.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ticketCreated.mock.js","sourceRoot":"","sources":["../../../../../../extensions/freshdesk/webhooks/TicketCreated/__testdata__/ticketCreated.mock.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAG,EAAwC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './ticketCreated';
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
__exportStar(require("./ticketCreated"), exports);
|
18
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../extensions/freshdesk/webhooks/TicketCreated/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { type Webhook } from '@awell-health/extensions-core';
|
2
|
+
import { type settings } from '../../settings';
|
3
|
+
import { type TicketCreatedWebhookPayload } from './types';
|
4
|
+
declare const dataPoints: {};
|
5
|
+
export declare const ticketCreated: Webhook<keyof typeof dataPoints, TicketCreatedWebhookPayload, typeof settings>;
|
6
|
+
export type TicketCreated = typeof ticketCreated;
|
7
|
+
export {};
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ticketCreated = void 0;
|
4
|
+
const dataPoints = {};
|
5
|
+
exports.ticketCreated = {
|
6
|
+
key: 'ticketCreated',
|
7
|
+
dataPoints,
|
8
|
+
onEvent: async ({ payload: { payload, rawBody, headers, settings }, onSuccess, onError, }) => {
|
9
|
+
await onSuccess({
|
10
|
+
data_points: {},
|
11
|
+
});
|
12
|
+
},
|
13
|
+
};
|
14
|
+
//# sourceMappingURL=ticketCreated.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ticketCreated.js","sourceRoot":"","sources":["../../../../../extensions/freshdesk/webhooks/TicketCreated/ticketCreated.ts"],"names":[],"mappings":";;;AAOA,MAAM,UAAU,GAAG,EAAgD,CAAA;AAEtD,QAAA,aAAa,GAItB;IACF,GAAG,EAAE,eAAe;IACpB,UAAU;IACV,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAChD,SAAS,EACT,OAAO,GACR,EAAE,EAAE;QACH,MAAM,SAAS,CAAC;YACd,WAAW,EAAE,EAAE;SAChB,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export type TicketCreatedWebhookPayload = Record<string, unknown>;
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../extensions/freshdesk/webhooks/TicketCreated/types.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
export declare const webhooks: import("@awell-health/extensions-core").Webhook<never, import("./TicketCreated/types").TicketCreatedWebhookPayload, {
|
2
|
+
domain: {
|
3
|
+
key: string;
|
4
|
+
label: string;
|
5
|
+
description: string;
|
6
|
+
required: true;
|
7
|
+
obfuscated: false;
|
8
|
+
};
|
9
|
+
apiKey: {
|
10
|
+
key: string;
|
11
|
+
label: string;
|
12
|
+
description: string;
|
13
|
+
required: true;
|
14
|
+
obfuscated: true;
|
15
|
+
};
|
16
|
+
}>[];
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../extensions/freshdesk/webhooks/index.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAEhD,QAAA,QAAQ,GAAG,CAAC,6BAAa,CAAC,CAAA"}
|
package/dist/extensions/index.js
CHANGED
@@ -56,6 +56,7 @@ const epic_1 = require("./epic");
|
|
56
56
|
const experimental_1 = require("./experimental");
|
57
57
|
const external_server_1 = require("./external-server");
|
58
58
|
const formsort_1 = require("./formsort");
|
59
|
+
const freshdesk_1 = require("./freshdesk");
|
59
60
|
const gridspace_1 = require("./gridspace");
|
60
61
|
const healthie_1 = require("./healthie");
|
61
62
|
const hello_world_1 = require("./hello-world");
|
@@ -110,6 +111,7 @@ exports.extensions = [
|
|
110
111
|
experimental_1.Experimental,
|
111
112
|
external_server_1.ExternalServer,
|
112
113
|
formsort_1.Formsort,
|
114
|
+
freshdesk_1.freshdesk,
|
113
115
|
gridspace_1.Gridspace,
|
114
116
|
healthie_1.Healthie,
|
115
117
|
hello_world_1.HelloWorld,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../extensions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA6C;AAC7C,mCAA+B;AAC/B,6CAAyC;AACzC,mCAA+B;AAC/B,mCAA+B;AAC/B,2CAAuC;AACvC,yCAAqC;AACrC,mDAA+C;AAC/C,qCAAiC;AACjC,6CAAyC;AACzC,yCAAqC;AACrC,+CAA2C;AAC3C,6CAAyC;AACzC,+CAA2C;AAC3C,6CAAyC;AACzC,yCAAqC;AACrC,+CAA2C;AAC3C,uCAAmC;AACnC,iCAA6B;AAC7B,iDAA6C;AAC7C,uDAAkD;AAClD,yCAAqC;AACrC,2CAAuC;AACvC,yCAAqC;AACrC,+CAA0C;AAC1C,uCAAmC;AACnC,iEAA6D;AAC7D,uCAAmC;AACnC,yCAAqC;AACrC,2CAAuC;AACvC,uCAAmC;AACnC,iCAAsC;AACtC,uCAAmC;AACnC,+CAA2C;AAC3C,0CAA0C;AAC1C,+CAA2C;AAC3C,iCAA6B;AAC7B,yCAAqC;AACrC,6DAA+C;AAC/C,iCAA6B;AAC7B,qCAAiC;AACjC,qCAAiC;AACjC,yCAAqC;AACrC,yCAAqC;AACrC,+CAAyC;AACzC,2CAAuC;AACvC,qCAAiC;AACjC,uCAAmC;AACnC,yCAAqC;AACrC,uCAAmC;AACnC,iCAA6B;AAE7B,sDAAuC;AAG1B,QAAA,QAAQ,GAAa,IAAI,CAAA;AAEzB,QAAA,UAAU,GAAG;IACxB,aAAK;IACL,aAAK;IACL,2BAAY;IACZ,aAAK;IACL,uBAAU;IACV,qBAAS;IACT,mBAAQ;IACR,6BAAa;IACb,eAAM;IACN,uBAAU;IACV,mBAAQ;IACR,yBAAW;IACX,uBAAU;IACV,yBAAW;IACX,uBAAU;IACV,mBAAQ;IACR,yBAAW;IACX,iBAAO;IACP,WAAI;IACJ,2BAAY;IACZ,gCAAc;IACd,mBAAQ;IACR,qBAAS;IACT,mBAAQ;IACR,wBAAU;IACV,iBAAO;IACP,2CAAoB;IACpB,iBAAO;IACP,mBAAQ;IACR,qBAAS;IACT,iBAAO;IACP,oBAAa;IACb,yBAAW;IACX,iBAAO;IACP,aAAa;IACb,yBAAW;IACX,WAAI;IACJ,mBAAQ;IACR,6BAAQ;IACR,WAAI;IACJ,eAAM;IACN,eAAM;IACN,mBAAQ;IACR,mBAAQ;IACR,uBAAS;IACT,qBAAS;IACT,eAAM;IACN,iBAAO;IACP,mBAAQ;IACR,iBAAO;IACP,WAAI;CACL,CAAA"}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../extensions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA6C;AAC7C,mCAA+B;AAC/B,6CAAyC;AACzC,mCAA+B;AAC/B,mCAA+B;AAC/B,2CAAuC;AACvC,yCAAqC;AACrC,mDAA+C;AAC/C,qCAAiC;AACjC,6CAAyC;AACzC,yCAAqC;AACrC,+CAA2C;AAC3C,6CAAyC;AACzC,+CAA2C;AAC3C,6CAAyC;AACzC,yCAAqC;AACrC,+CAA2C;AAC3C,uCAAmC;AACnC,iCAA6B;AAC7B,iDAA6C;AAC7C,uDAAkD;AAClD,yCAAqC;AACrC,2CAAuC;AACvC,2CAAuC;AACvC,yCAAqC;AACrC,+CAA0C;AAC1C,uCAAmC;AACnC,iEAA6D;AAC7D,uCAAmC;AACnC,yCAAqC;AACrC,2CAAuC;AACvC,uCAAmC;AACnC,iCAAsC;AACtC,uCAAmC;AACnC,+CAA2C;AAC3C,0CAA0C;AAC1C,+CAA2C;AAC3C,iCAA6B;AAC7B,yCAAqC;AACrC,6DAA+C;AAC/C,iCAA6B;AAC7B,qCAAiC;AACjC,qCAAiC;AACjC,yCAAqC;AACrC,yCAAqC;AACrC,+CAAyC;AACzC,2CAAuC;AACvC,qCAAiC;AACjC,uCAAmC;AACnC,yCAAqC;AACrC,uCAAmC;AACnC,iCAA6B;AAE7B,sDAAuC;AAG1B,QAAA,QAAQ,GAAa,IAAI,CAAA;AAEzB,QAAA,UAAU,GAAG;IACxB,aAAK;IACL,aAAK;IACL,2BAAY;IACZ,aAAK;IACL,uBAAU;IACV,qBAAS;IACT,mBAAQ;IACR,6BAAa;IACb,eAAM;IACN,uBAAU;IACV,mBAAQ;IACR,yBAAW;IACX,uBAAU;IACV,yBAAW;IACX,uBAAU;IACV,mBAAQ;IACR,yBAAW;IACX,iBAAO;IACP,WAAI;IACJ,2BAAY;IACZ,gCAAc;IACd,mBAAQ;IACR,qBAAS;IACT,qBAAS;IACT,mBAAQ;IACR,wBAAU;IACV,iBAAO;IACP,2CAAoB;IACpB,iBAAO;IACP,mBAAQ;IACR,qBAAS;IACT,iBAAO;IACP,oBAAa;IACb,yBAAW;IACX,iBAAO;IACP,aAAa;IACb,yBAAW;IACX,WAAI;IACJ,mBAAQ;IACR,6BAAQ;IACR,WAAI;IACJ,eAAM;IACN,eAAM;IACN,mBAAQ;IACR,mBAAQ;IACR,uBAAS;IACT,qBAAS;IACT,eAAM;IACN,iBAAO;IACP,mBAAQ;IACR,iBAAO;IACP,WAAI;CACL,CAAA"}
|
@@ -87,6 +87,10 @@
|
|
87
87
|
"readme": "---\ntitle: Formsort\ndescription: Formsort is a fully-managed form-building platform.\n---\n# Formsort\n\nFormsort is a fully-managed form-building platform. Team can use the online studio (a specialized content management system for forms) to create form content, modify styles, and configure integrations.\n\nFormsort hosts your fully-branded forms, either on one of your subdomains or embedded in a page on your site. When responders submit answers, Formsort sends the answers to a destination of your liking directly. Formsort doesn't store the responder's answers. \n\n## Flow settings\n\nIn order for the flows to work well with Awell care flows, make sure your flow settings are set as follows:\n\n- There should be no redirects\n- \"Start each session as a new responder\" should be checked\n- \"Enable URL navigation\" should be disabled\n- \"Enable restart once flow completed\" should be disabled\n- \"Enable close once flow completed\" should be disabled\n\n## Custom Actions\n\n### Complete flow\n\nLet a stakeholder complete a Formsort flow from within Awell Hosted Pages.\n\n**Limitations:**\nCurrently data from the flow is not ingested into Awell yet and cannot be used in your care flow as data points.\n",
|
88
88
|
"changelog": "# Formsort changelog"
|
89
89
|
},
|
90
|
+
"freshdesk": {
|
91
|
+
"readme": "---\ntitle: Freshdesk.ai\ndescription: Freshdesk is a cloud-based customer service software that helps businesses manage and streamline their customer support operations.\n---\n\n# Freshdesk\n\nFreshdesk is a cloud-based customer service software that helps businesses manage and streamline their customer support operations.\n\n## Extension settings\n\nTo set up this extension, you will need to provide your Freshdesk helpdesk domain and API key.",
|
92
|
+
"changelog": "# CHANGELOG"
|
93
|
+
},
|
90
94
|
"gridspace": {
|
91
95
|
"readme": "---\ntitle: Gridspace\ndescription: Gridspace \n---\n\n# What is Gridspace\n\nGridspace is a conversational speech bot platform using its proprietary AI, Grace. It was built for long-form conversations over the phone, which distinguishes her from other voice AIs such as Siri and Alexa.\n\nGrace can perform an an ever-increasing variety of service-oriented tasks across multiple roles. Grace's job functions include, but are by no means limited to:\n- Healthcare Scheduler\n- Lead Qualifier\n- Payments Facilitator\n- After-hours Phone Operator\n- Service Appointment Booker\n\nGrace has the ability to manage customer service and patient care interactions independently from start to finish, or she can work in collaboration with human agents.",
|
92
96
|
"changelog": "# Gridspace changelog\n\n## October, 2024\n\nCreated Gridspace extension"
|