@aix-chat/core 0.1.0

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.
Files changed (41) hide show
  1. package/dist/bridge/ChatBridge.d.ts +111 -0
  2. package/dist/bridge/ChatBridge.js +273 -0
  3. package/dist/bridge/index.d.ts +16 -0
  4. package/dist/bridge/index.js +25 -0
  5. package/dist/domain/block.d.ts +7 -0
  6. package/dist/domain/block.js +1 -0
  7. package/dist/domain/chat.d.ts +77 -0
  8. package/dist/domain/chat.js +265 -0
  9. package/dist/domain/conversation.d.ts +17 -0
  10. package/dist/domain/conversation.js +1 -0
  11. package/dist/domain/index.d.ts +7 -0
  12. package/dist/domain/index.js +2 -0
  13. package/dist/domain/message.d.ts +38 -0
  14. package/dist/domain/message.js +1 -0
  15. package/dist/domain/status.d.ts +10 -0
  16. package/dist/domain/status.js +30 -0
  17. package/dist/index.d.ts +18 -0
  18. package/dist/index.js +31 -0
  19. package/dist/types/blocks.d.ts +78 -0
  20. package/dist/types/blocks.js +1 -0
  21. package/dist/types/context.d.ts +22 -0
  22. package/dist/types/context.js +1 -0
  23. package/dist/types/index.d.ts +6 -0
  24. package/dist/types/index.js +6 -0
  25. package/dist/types/interaction.d.ts +46 -0
  26. package/dist/types/interaction.js +1 -0
  27. package/dist/types/message.d.ts +39 -0
  28. package/dist/types/message.js +1 -0
  29. package/dist/types/openclaw-blocks.d.ts +77 -0
  30. package/dist/types/openclaw-blocks.js +1 -0
  31. package/dist/types/panel.d.ts +71 -0
  32. package/dist/types/panel.js +1 -0
  33. package/dist/types/protocol.d.ts +48 -0
  34. package/dist/types/protocol.js +1 -0
  35. package/dist/types/provider.d.ts +15 -0
  36. package/dist/types/provider.js +1 -0
  37. package/dist/utils/EventEmitter.d.ts +18 -0
  38. package/dist/utils/EventEmitter.js +65 -0
  39. package/dist/utils/InteractionBuffer.d.ts +17 -0
  40. package/dist/utils/InteractionBuffer.js +64 -0
  41. package/package.json +85 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * OpenClaw 协议消息块类型
3
+ *
4
+ * 这是 OpenClawParser 的输出 schema,专属于 OpenClaw 协议。
5
+ * 其他协议定义各自的 block 类型,通过 Block 基础接口兼容。
6
+ */
7
+ /** 工具执行状态 */
8
+ export type ToolStatus = 'success' | 'error' | 'running' | 'pending';
9
+ /** 审批状态 */
10
+ export type ApprovalStatus = 'pending' | 'approved' | 'rejected';
11
+ /** 文本块 */
12
+ export interface TextBlock {
13
+ type: 'text';
14
+ /** 文本内容(支持 Markdown) */
15
+ content: string;
16
+ }
17
+ /** 思考过程块 */
18
+ export interface ThinkingBlock {
19
+ type: 'thinking';
20
+ /** 思考内容 */
21
+ content: string;
22
+ /** 是否正在思考中(显示加载态) */
23
+ isLoading?: boolean;
24
+ }
25
+ /** 工具执行步骤 */
26
+ export interface ToolStep {
27
+ /** 步骤唯一标识 */
28
+ id: string;
29
+ /** 工具名称 */
30
+ tool: string;
31
+ /** 操作描述 */
32
+ title: string;
33
+ /** 执行状态 */
34
+ status: ToolStatus;
35
+ /** 执行耗时(毫秒) */
36
+ duration?: number;
37
+ /** 输入参数(JSON 字符串) */
38
+ input?: string;
39
+ /** 输出结果(JSON 字符串) */
40
+ output?: string;
41
+ }
42
+ /** 工具执行块 */
43
+ export interface ToolExecutionBlock {
44
+ type: 'tool_execution';
45
+ /** 工具执行步骤列表 */
46
+ steps: ToolStep[];
47
+ }
48
+ /** 审批块 */
49
+ export interface ApprovalBlock {
50
+ type: 'approval';
51
+ /** 审批 ID(用于回调标识) */
52
+ approvalId?: string;
53
+ /** 审批标题 */
54
+ title: string;
55
+ /** 审批描述 */
56
+ description: string;
57
+ /** 审批状态 */
58
+ status: ApprovalStatus;
59
+ /** 操作详情(可折叠显示) */
60
+ details?: string;
61
+ /** 批准回调 */
62
+ onApprove?: () => void;
63
+ /** 拒绝回调 */
64
+ onReject?: () => void;
65
+ }
66
+ /** 图片块 */
67
+ export interface ImageBlock {
68
+ type: 'image';
69
+ /** 图片数据(Base64 Data URI) */
70
+ data: string;
71
+ /** 图片名称 */
72
+ name: string;
73
+ /** MIME 类型 */
74
+ mimeType: string;
75
+ }
76
+ /** OpenClaw 协议消息块联合类型 */
77
+ export type OpenClawBlock = TextBlock | ThinkingBlock | ToolExecutionBlock | ApprovalBlock | ImageBlock;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ export interface PanelTab {
2
+ /** Agent 定义的语义 ID,如 "main_flow" */
3
+ id: string;
4
+ title: string;
5
+ /** 对应注册的渲染器 key,如 "dag" */
6
+ type: string;
7
+ /** OC event 透传的数据,SDK 不解析 */
8
+ payload?: Record<string, any>;
9
+ /** 是否显示关闭按钮,默认 false */
10
+ closable?: boolean;
11
+ /**
12
+ * 该 tab 激活时,右栏 TopBar 右侧槽内容(操作按钮等)。
13
+ * 切换 tab 时随 activeTab 联动。类型为 ReactNode,core 不依赖 React 故用 unknown。
14
+ */
15
+ slotRight?: unknown;
16
+ /**
17
+ * 该 tab 关联的事件总线(可选),供 tab 内组件订阅/触发命名事件。
18
+ * 通常由 ChatBridge 维护,关闭 tab 时由消费方调用 removeAllListeners 清理。
19
+ * 为避免在 core 引入具体实现,使用 PanelTabEventEmitter 接口形式声明。
20
+ */
21
+ eventEmitter?: PanelTabEventEmitter;
22
+ }
23
+ /**
24
+ * Tab 事件总线最小接口,与 core/utils/EventEmitter 兼容。
25
+ */
26
+ export interface PanelTabEventEmitter {
27
+ on(event: string, handler: (...args: any[]) => void): () => void;
28
+ emit(event: string, ...args: any[]): void;
29
+ removeAllListeners(event?: string): void;
30
+ }
31
+ export type PanelAction = {
32
+ type: 'send_message';
33
+ content: string;
34
+ } | {
35
+ type: 'fill_input';
36
+ content: string;
37
+ };
38
+ export interface PanelActionEvent {
39
+ event: 'panel_action';
40
+ /** 语义 ID:首次出现新建 tab,已存在则更新 payload */
41
+ tabId: string;
42
+ /** 仅首次建 tab 时必须提供 */
43
+ type?: string;
44
+ /** 无则自动生成,如 "Panel 1" */
45
+ title?: string;
46
+ /** SDK 级别容器指令 */
47
+ panelCommand?: 'expand' | 'collapse';
48
+ /** 透传给组件,SDK 不解析 */
49
+ payload?: Record<string, any>;
50
+ }
51
+ export interface PanelHandle {
52
+ openTab(tab: PanelTab): void;
53
+ closeTab(id: string): void;
54
+ updateTab(id: string, update: Partial<Omit<PanelTab, 'id'>>): void;
55
+ focusTab(id: string): void;
56
+ openPanel(): void;
57
+ closePanel(): void;
58
+ /** 强制关闭面板并清空所有 tabs */
59
+ closePanelForce(): void;
60
+ /**
61
+ * 取出完整上下文并清空交互缓冲。
62
+ * 发消息前调用,将返回值作为 panelContext 注入请求。
63
+ */
64
+ flushContext(): import('./context').AixContext;
65
+ }
66
+ export interface PanelEvent {
67
+ /** 事件类型,如 'highlight-node', 'reset-view' */
68
+ type: string;
69
+ /** 事件数据,任意结构 */
70
+ payload?: Record<string, any>;
71
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import type { OpenClawBlock } from './openclaw-blocks';
2
+ import type { ApprovalRequestPayload, ToolCallInfo } from './message';
3
+ /**
4
+ * 协议解析结果
5
+ *
6
+ * 结构化输出,不包含任何 HTML 标签。
7
+ * UI 层根据 blocks 数组渲染对应组件。
8
+ */
9
+ export interface ParseResult {
10
+ /** 结构化内容块(OpenClaw 协议输出) */
11
+ blocks: OpenClawBlock[];
12
+ /** 纯文本内容(向后兼容,从 TextBlock 拼接生成) */
13
+ content: string;
14
+ /** 是否完成 */
15
+ done: boolean;
16
+ /** 工具调用列表(结构化数据) */
17
+ toolCalls: ToolCallInfo[];
18
+ /** 会话 key */
19
+ sessionKey?: string;
20
+ /** 是否有待审批 */
21
+ isApproval?: boolean;
22
+ /** 审批请求数据 */
23
+ approvalRequest?: ApprovalRequestPayload;
24
+ /** inject 消息的 runId(以 'inject-' 开头),用于区分不同的 inject 消息 */
25
+ runId?: string;
26
+ }
27
+ /**
28
+ * 协议解析器接口
29
+ *
30
+ * 接收 WebSocket 原始事件,输出结构化 ParseResult。
31
+ * 不生成任何 HTML 标签,渲染决策交给 UI 层。
32
+ */
33
+ export interface ProtocolParser<TInput = any> {
34
+ /** 处理原始消息事件 */
35
+ handleMessage(message: Record<string, any>): boolean;
36
+ /** 构造请求消息 */
37
+ buildRequest(params: TInput): Record<string, any>;
38
+ /** 获取当前解析结果 */
39
+ getResult(): ParseResult;
40
+ /** 重置状态 */
41
+ reset(): void;
42
+ /** 更新回调 */
43
+ onUpdate?: (result: ParseResult) => void;
44
+ /** 完成回调 */
45
+ onComplete?: (result: ParseResult) => void;
46
+ /** 错误回调 */
47
+ onError?: (error: Error) => void;
48
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { ChatMessage } from './message';
2
+ /**
3
+ * Provider 接口 — 暴露给 Chat 实体
4
+ * 具体实现(OpenClawProvider、SSEProvider 等)位于 @aix-chat/adapters
5
+ */
6
+ export interface ChatProvider<TInput = any> {
7
+ connect(): Promise<void>;
8
+ disconnect(): void;
9
+ readonly isConnected: boolean;
10
+ request(params: TInput, messageId?: string): Promise<void>;
11
+ abort(): void;
12
+ onMessage?: (message: ChatMessage) => void;
13
+ onComplete?: (messages: ChatMessage[]) => void;
14
+ onError?: (error: Error) => void;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 简单的事件发射器
3
+ */
4
+ export declare class EventEmitter {
5
+ private listeners;
6
+ /**
7
+ * 监听事件
8
+ */
9
+ on(event: string, handler: (...args: any[]) => void): () => void;
10
+ /**
11
+ * 触发事件
12
+ */
13
+ emit(event: string, ...args: any[]): void;
14
+ /**
15
+ * 移除所有监听器
16
+ */
17
+ removeAllListeners(): void;
18
+ }
@@ -0,0 +1,65 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
4
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ /**
9
+ * 简单的事件发射器
10
+ */
11
+ export var EventEmitter = /*#__PURE__*/function () {
12
+ function EventEmitter() {
13
+ _classCallCheck(this, EventEmitter);
14
+ _defineProperty(this, "listeners", new Map());
15
+ }
16
+ _createClass(EventEmitter, [{
17
+ key: "on",
18
+ value:
19
+ /**
20
+ * 监听事件
21
+ */
22
+ function on(event, handler) {
23
+ if (!this.listeners.has(event)) {
24
+ this.listeners.set(event, []);
25
+ }
26
+ var handlers = this.listeners.get(event);
27
+ handlers.push(handler);
28
+
29
+ // 返回取消订阅函数
30
+ return function () {
31
+ var idx = handlers.indexOf(handler);
32
+ if (idx > -1) {
33
+ handlers.splice(idx, 1);
34
+ }
35
+ };
36
+ }
37
+
38
+ /**
39
+ * 触发事件
40
+ */
41
+ }, {
42
+ key: "emit",
43
+ value: function emit(event) {
44
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
45
+ args[_key - 1] = arguments[_key];
46
+ }
47
+ var handlers = this.listeners.get(event);
48
+ if (handlers) {
49
+ handlers.forEach(function (handler) {
50
+ return handler.apply(void 0, args);
51
+ });
52
+ }
53
+ }
54
+
55
+ /**
56
+ * 移除所有监听器
57
+ */
58
+ }, {
59
+ key: "removeAllListeners",
60
+ value: function removeAllListeners() {
61
+ this.listeners.clear();
62
+ }
63
+ }]);
64
+ return EventEmitter;
65
+ }();
@@ -0,0 +1,17 @@
1
+ import type { InteractionRecord } from '../types/interaction';
2
+ /**
3
+ * InteractionBuffer
4
+ *
5
+ * 收集副屏用户交互记录的缓冲区。纯 JS 工具类,无 React 依赖。
6
+ * 消费方自行决定何时调用 flush() 及如何处理数据(上报埋点、注入请求、本地展示等)。
7
+ */
8
+ export declare class InteractionBuffer {
9
+ private _records;
10
+ push(record: Omit<InteractionRecord, 'id' | 'timestamp'>): void;
11
+ /** 返回并清空所有记录 */
12
+ flush(): InteractionRecord[];
13
+ /** 只读预览,不清空 */
14
+ peek(): InteractionRecord[];
15
+ clear(): void;
16
+ get size(): number;
17
+ }
@@ -0,0 +1,64 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
5
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
6
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
12
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
13
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
15
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
+ import { v4 as uuidv4 } from 'uuid';
17
+ /**
18
+ * InteractionBuffer
19
+ *
20
+ * 收集副屏用户交互记录的缓冲区。纯 JS 工具类,无 React 依赖。
21
+ * 消费方自行决定何时调用 flush() 及如何处理数据(上报埋点、注入请求、本地展示等)。
22
+ */
23
+ export var InteractionBuffer = /*#__PURE__*/function () {
24
+ function InteractionBuffer() {
25
+ _classCallCheck(this, InteractionBuffer);
26
+ _defineProperty(this, "_records", []);
27
+ }
28
+ _createClass(InteractionBuffer, [{
29
+ key: "push",
30
+ value: function push(record) {
31
+ this._records.push(_objectSpread({
32
+ id: uuidv4(),
33
+ timestamp: Date.now()
34
+ }, record));
35
+ }
36
+
37
+ /** 返回并清空所有记录 */
38
+ }, {
39
+ key: "flush",
40
+ value: function flush() {
41
+ var records = this._records;
42
+ this._records = [];
43
+ return records;
44
+ }
45
+
46
+ /** 只读预览,不清空 */
47
+ }, {
48
+ key: "peek",
49
+ value: function peek() {
50
+ return _toConsumableArray(this._records);
51
+ }
52
+ }, {
53
+ key: "clear",
54
+ value: function clear() {
55
+ this._records = [];
56
+ }
57
+ }, {
58
+ key: "size",
59
+ get: function get() {
60
+ return this._records.length;
61
+ }
62
+ }]);
63
+ return InteractionBuffer;
64
+ }();
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@aix-chat/core",
3
+ "version": "0.1.0",
4
+ "description": "Aix-Chat 核心业务逻辑包,提供聊天会话管理、消息处理、插件扩展等核心能力",
5
+ "keywords": [
6
+ "chat",
7
+ "ai",
8
+ "conversation",
9
+ "message",
10
+ "plugin",
11
+ "aix",
12
+ "alipay"
13
+ ],
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "homepage": "https://github.com/alipay/Aix-Chat-Packages/tree/master/packages/core",
18
+ "bugs": {
19
+ "url": "https://github.com/alipay/Aix-Chat-Packages/issues"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/aix-chat/aix-chat"
24
+ },
25
+ "author": "yubai.zly",
26
+ "module": "dist/index.js",
27
+ "typings": "dist/index.d.ts",
28
+ "libType": "UTIL",
29
+ "scripts": {
30
+ "build": "father build",
31
+ "build:watch": "father build -w",
32
+ "ci": "npm run lint && jest --coverage --passWithNoTests",
33
+ "cov": "jest --coverage",
34
+ "dev": "dumi dev",
35
+ "lint": "eslint src --ext .ts,.tsx",
36
+ "start": "npm run dev",
37
+ "test": "jest",
38
+ "typecheck": "tsc --noEmit"
39
+ },
40
+ "commitlint": {
41
+ "extends": [
42
+ "@commitlint/config-conventional"
43
+ ]
44
+ },
45
+ "lint-staged": {
46
+ "*.{md,json}": [
47
+ "prettier --cache --write --no-error-on-unmatched-pattern"
48
+ ],
49
+ "*.{js,jsx}": [
50
+ "eslint --fix",
51
+ "prettier --cache --write"
52
+ ],
53
+ "*.{css,less}": [
54
+ "prettier --cache --write"
55
+ ],
56
+ "*.{ts,tsx}": [
57
+ "eslint --fix",
58
+ "prettier --cache --parser=typescript --write"
59
+ ]
60
+ },
61
+ "dependencies": {
62
+ "uuid": "^9.0.0"
63
+ },
64
+ "devDependencies": {
65
+ "@commitlint/cli": "^17.3.0",
66
+ "@commitlint/config-conventional": "^17.3.0",
67
+ "@types/jest": "^29.4.0",
68
+ "@types/uuid": "^10.0.0",
69
+ "dumi": "^2.0.0",
70
+ "father": "^4.0.0",
71
+ "husky": "^8.0.0",
72
+ "jest": "^29.4.3",
73
+ "jest-environment-jsdom": "^29.4.3",
74
+ "lint-staged": "^13.0.0",
75
+ "prettier": "^2.0.0"
76
+ },
77
+ "engines": {},
78
+ "ci": {
79
+ "type": "aci"
80
+ },
81
+ "tnpm": {
82
+ "mode": "npm"
83
+ },
84
+ "main": "dist/index.js"
85
+ }