@stack-spot/ai-chat-widget 1.4.0 → 1.4.1

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.
@@ -0,0 +1,151 @@
1
+ {
2
+ "name": "@stack-spot/ai-chat-widget",
3
+ "version": "1.4.1",
4
+ "date": "Mon Nov 04 2024 16:26:03 GMT-0300 (Horário Padrão de Brasília)",
5
+ "dependencies": [
6
+ {
7
+ "name": "@stack-spot/app-metadata",
8
+ "version": "1.0.1"
9
+ },
10
+ {
11
+ "name": "@types/lodash",
12
+ "version": "4.17.9"
13
+ },
14
+ {
15
+ "name": "@types/react",
16
+ "version": "18.3.11"
17
+ },
18
+ {
19
+ "name": "@types/react-dom",
20
+ "version": "18.3.0"
21
+ },
22
+ {
23
+ "name": "@types/react-syntax-highlighter",
24
+ "version": "15.5.13"
25
+ },
26
+ {
27
+ "name": "@typescript-eslint/eslint-plugin",
28
+ "version": "6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)"
29
+ },
30
+ {
31
+ "name": "@typescript-eslint/parser",
32
+ "version": "6.21.0(eslint@8.57.1)(typescript@5.6.2)"
33
+ },
34
+ {
35
+ "name": "cpy-cli",
36
+ "version": "5.0.0"
37
+ },
38
+ {
39
+ "name": "eslint",
40
+ "version": "8.57.1"
41
+ },
42
+ {
43
+ "name": "eslint-plugin-filenames",
44
+ "version": "1.3.2(eslint@8.57.1)"
45
+ },
46
+ {
47
+ "name": "eslint-plugin-import",
48
+ "version": "2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)"
49
+ },
50
+ {
51
+ "name": "eslint-plugin-lodash",
52
+ "version": "7.4.0(eslint@8.57.1)"
53
+ },
54
+ {
55
+ "name": "eslint-plugin-promise",
56
+ "version": "6.6.0(eslint@8.57.1)"
57
+ },
58
+ {
59
+ "name": "eslint-plugin-react",
60
+ "version": "7.37.1(eslint@8.57.1)"
61
+ },
62
+ {
63
+ "name": "eslint-plugin-react-hooks",
64
+ "version": "4.6.2(eslint@8.57.1)"
65
+ },
66
+ {
67
+ "name": "react",
68
+ "version": "18.2.0"
69
+ },
70
+ {
71
+ "name": "react-dom",
72
+ "version": "18.2.0(react@18.2.0)"
73
+ },
74
+ {
75
+ "name": "rimraf",
76
+ "version": "5.0.10"
77
+ },
78
+ {
79
+ "name": "styled-components",
80
+ "version": "6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
81
+ },
82
+ {
83
+ "name": "tsc-esm-fix",
84
+ "version": "2.20.27"
85
+ },
86
+ {
87
+ "name": "typescript",
88
+ "version": "5.6.2"
89
+ },
90
+ {
91
+ "name": "@citric/core",
92
+ "version": "6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
93
+ },
94
+ {
95
+ "name": "@citric/icons",
96
+ "version": "5.7.7(react@18.2.0)"
97
+ },
98
+ {
99
+ "name": "@citric/ui",
100
+ "version": "6.1.2(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
101
+ },
102
+ {
103
+ "name": "@monaco-editor/react",
104
+ "version": "4.6.0(monaco-editor@0.52.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
105
+ },
106
+ {
107
+ "name": "@stack-spot/portal-components",
108
+ "version": "2.8.1(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(@citric/ui@6.1.2(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@stack-spot/portal-theme@1.1.0(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@stack-spot/portal-translate@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
109
+ },
110
+ {
111
+ "name": "@stack-spot/portal-network",
112
+ "version": "0.48.0(@stack-spot/auth@5.3.2)(@stack-spot/opa@2.5.0(@stack-spot/auth@5.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@stack-spot/portal-translate@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tanstack/react-query@5.59.16(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
113
+ },
114
+ {
115
+ "name": "@stack-spot/portal-theme",
116
+ "version": "1.1.0(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
117
+ },
118
+ {
119
+ "name": "@stack-spot/portal-translate",
120
+ "version": "1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
121
+ },
122
+ {
123
+ "name": "lodash",
124
+ "version": "4.17.21"
125
+ },
126
+ {
127
+ "name": "monaco-editor",
128
+ "version": "0.52.0"
129
+ },
130
+ {
131
+ "name": "react-infinite-scroll-component",
132
+ "version": "6.1.0(react@18.2.0)"
133
+ },
134
+ {
135
+ "name": "react-markdown",
136
+ "version": "9.0.1(@types/react@18.3.11)(react@18.2.0)"
137
+ },
138
+ {
139
+ "name": "react-syntax-highlighter",
140
+ "version": "15.5.0(react@18.2.0)"
141
+ },
142
+ {
143
+ "name": "remark-gfm",
144
+ "version": "4.0.0"
145
+ },
146
+ {
147
+ "name": "ulid",
148
+ "version": "2.3.0"
149
+ }
150
+ ]
151
+ }
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export type { AIWidgetFeatures, ChatFeatures } from './features.js';
6
6
  export { StackspotAIWidget } from './StackspotAIWidget.js';
7
7
  export { ChatEntry } from './state/ChatEntry.js';
8
8
  export { ChatState } from './state/ChatState.js';
9
+ export type { MessageInterceptor } from './state/ChatState.js';
9
10
  export { ChatTabsController } from './state/ChatTabsController.js';
10
11
  export { ObservableState } from './state/ObservableState.js';
11
12
  export type { Labeled, LabeledWithImage } from './state/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2IAA2I;AAE3I,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2IAA2I;AAE3I,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
@@ -68,6 +68,7 @@ export declare class WidgetState extends ObservableState<WidgetProperties> {
68
68
  chatFeatures: ChatFeatures;
69
69
  constructor({ chatTabs, initial, interceptors, features }?: Options);
70
70
  private getNextUntitledChatIndex;
71
+ private getNextUntitledChatLabel;
71
72
  /**
72
73
  * Utility function for adding a new chat to the chat tabs. This also selects the new tab.
73
74
  * @param properties the chat properties (initial state).
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetState.d.ts","sourceRoot":"","sources":["../../src/state/WidgetState.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAA2B,cAAc,EAAE,MAAM,aAAa,CAAA;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,kCAAkC,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IACrF;;OAEG;IACH,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,UAAU,OAAO;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAID;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAChE,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC;;OAEG;IACH,YAAY,EAAE,kBAAkB,EAAE,CAAK;IACvC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAA;gBAEd,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAiB,EAAE,QAAQ,EAAE,GAAE,OAAY;IAc5E,OAAO,CAAC,wBAAwB;IAUhC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,GAAE,OAAO,CAAC,kCAAkC,CAAM,EAAE,OAAO,GAAE,SAAS,EAAO;CAYjH"}
1
+ {"version":3,"file":"WidgetState.d.ts","sourceRoot":"","sources":["../../src/state/WidgetState.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAA2B,cAAc,EAAE,MAAM,aAAa,CAAA;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,kCAAkC,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IACrF;;OAEG;IACH,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,UAAU,OAAO;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAID;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAChE,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC;;OAEG;IACH,YAAY,EAAE,kBAAkB,EAAE,CAAK;IACvC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAA;gBAEd,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAiB,EAAE,QAAQ,EAAE,GAAE,OAAY;IAc5E,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,wBAAwB;IAKhC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,GAAE,OAAO,CAAC,kCAAkC,CAAM,EAAE,OAAO,GAAE,SAAS,EAAO;CAYjH"}
@@ -7,7 +7,7 @@ import { getFeaturesWithDefaults } from '../features.js';
7
7
  import { ChatState } from './ChatState.js';
8
8
  import { ChatTabsController } from './ChatTabsController.js';
9
9
  import { ObservableState } from './ObservableState.js';
10
- const untitledChatPrefix = 'Chat ';
10
+ const untitledChatPrefix = 'Chat';
11
11
  /**
12
12
  * Holds the full state of the AI Chat Widget.
13
13
  *
@@ -39,13 +39,19 @@ export class WidgetState extends ObservableState {
39
39
  getNextUntitledChatIndex() {
40
40
  let max = 0;
41
41
  for (const chat of this.chatTabs.getAll()) {
42
- const [, match] = chat.get('label').match(`${untitledChatPrefix}(\\d+)`) ?? [];
43
- const index = parseInt(match);
42
+ if (chat.get('label') === untitledChatPrefix && max < 1)
43
+ max = 1;
44
+ const [, match] = chat.get('label').match(`^${untitledChatPrefix} (\\d+)$`) ?? [];
45
+ const index = match ? parseInt(match) : 0;
44
46
  if (index > max)
45
47
  max = index;
46
48
  }
47
49
  return max + 1;
48
50
  }
51
+ getNextUntitledChatLabel() {
52
+ const next = this.getNextUntitledChatIndex();
53
+ return next > 1 ? `${untitledChatPrefix} ${next}` : untitledChatPrefix;
54
+ }
49
55
  /**
50
56
  * Utility function for adding a new chat to the chat tabs. This also selects the new tab.
51
57
  * @param properties the chat properties (initial state).
@@ -55,7 +61,7 @@ export class WidgetState extends ObservableState {
55
61
  createChat({ label, ...properties } = {}, entries = []) {
56
62
  const chat = new ChatState({
57
63
  id: ulid(),
58
- initial: { label: label || `${untitledChatPrefix}${this.getNextUntitledChatIndex()}`, features: this.chatFeatures, ...properties },
64
+ initial: { label: label || this.getNextUntitledChatLabel(), features: this.chatFeatures, ...properties },
59
65
  entries,
60
66
  interceptors: this.interceptors,
61
67
  untitled: !label,
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetState.js","sourceRoot":"","sources":["../../src/state/WidgetState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,gCAAgC,EAAE,MAAM,8CAA8C,CAAA;AAC/F,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAkC,uBAAuB,EAAkB,MAAM,aAAa,CAAA;AAErG,OAAO,EAAsC,SAAS,EAAsB,MAAM,aAAa,CAAA;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AA+CnD,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAElC;;;;GAIG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAiC;IACvD,QAAQ,CAAoB;IACrC;;OAEG;IACH,YAAY,GAAyB,EAAE,CAAA;IACvC;;OAEG;IACH,YAAY,CAAc;IAE1B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,EAAE,EAAE,QAAQ,KAAc,EAAE;QAC1E,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAA;QAC9D,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAA;QACrD,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAA;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,kBAAkB,EAAE,CAAA;QACpD,IAAI,CAAC,YAAY,GAAG;YAClB,GAAG,YAAY;YACf,gCAAgC;YAChC,6BAA6B,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,MAAM,CAAC;YAC/E,sBAAsB;SACvB,CAAA;QACD,IAAI,CAAC,UAAU,EAAE,CAAA;IACnB,CAAC;IAEO,wBAAwB;QAC9B,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,kBAAkB,QAAQ,CAAC,IAAI,EAAE,CAAA;YAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC7B,IAAI,KAAK,GAAG,GAAG;gBAAE,GAAG,GAAG,KAAK,CAAA;QAC9B,CAAC;QACD,OAAO,GAAG,GAAG,CAAC,CAAA;IAChB,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,UAAU,KAAkD,EAAE,EAAE,UAAuB,EAAE;QAC9G,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC;YACzB,EAAE,EAAE,IAAI,EAAE;YACV,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,UAAU,EAAE;YAClI,OAAO;YACP,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,CAAC,KAAK;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
1
+ {"version":3,"file":"WidgetState.js","sourceRoot":"","sources":["../../src/state/WidgetState.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "name": "@stack-spot/ai-chat-widget",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
- "scripts": {
8
- "build": "rimraf dist && pnpm generate:metadata && tsc && tsc-esm-fix --target='dist' && cpy src/layout.css dist --flat",
9
- "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
10
- "generate:metadata": "pnpm app-metadata --lockfile ../../pnpm-lock.yaml --path packages/widget"
11
- },
12
7
  "peerDependencies": {
13
8
  "@citric/core": "^6.0.0",
14
9
  "@citric/icons": "^5.4.0 || ^6.0.0",
@@ -53,5 +48,10 @@
53
48
  "react-syntax-highlighter": "^15.5.0",
54
49
  "remark-gfm": "^4.0.0",
55
50
  "ulid": "^2.3.0"
51
+ },
52
+ "scripts": {
53
+ "build": "rimraf dist && pnpm generate:metadata && tsc && tsc-esm-fix --target='dist' && cpy src/layout.css dist --flat",
54
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
55
+ "generate:metadata": "pnpm app-metadata --lockfile ../../pnpm-lock.yaml --path packages/widget"
56
56
  }
57
57
  }
@@ -0,0 +1,151 @@
1
+ {
2
+ "name": "@stack-spot/ai-chat-widget",
3
+ "version": "1.4.1",
4
+ "date": "Mon Nov 04 2024 16:26:03 GMT-0300 (Horário Padrão de Brasília)",
5
+ "dependencies": [
6
+ {
7
+ "name": "@stack-spot/app-metadata",
8
+ "version": "1.0.1"
9
+ },
10
+ {
11
+ "name": "@types/lodash",
12
+ "version": "4.17.9"
13
+ },
14
+ {
15
+ "name": "@types/react",
16
+ "version": "18.3.11"
17
+ },
18
+ {
19
+ "name": "@types/react-dom",
20
+ "version": "18.3.0"
21
+ },
22
+ {
23
+ "name": "@types/react-syntax-highlighter",
24
+ "version": "15.5.13"
25
+ },
26
+ {
27
+ "name": "@typescript-eslint/eslint-plugin",
28
+ "version": "6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)"
29
+ },
30
+ {
31
+ "name": "@typescript-eslint/parser",
32
+ "version": "6.21.0(eslint@8.57.1)(typescript@5.6.2)"
33
+ },
34
+ {
35
+ "name": "cpy-cli",
36
+ "version": "5.0.0"
37
+ },
38
+ {
39
+ "name": "eslint",
40
+ "version": "8.57.1"
41
+ },
42
+ {
43
+ "name": "eslint-plugin-filenames",
44
+ "version": "1.3.2(eslint@8.57.1)"
45
+ },
46
+ {
47
+ "name": "eslint-plugin-import",
48
+ "version": "2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)"
49
+ },
50
+ {
51
+ "name": "eslint-plugin-lodash",
52
+ "version": "7.4.0(eslint@8.57.1)"
53
+ },
54
+ {
55
+ "name": "eslint-plugin-promise",
56
+ "version": "6.6.0(eslint@8.57.1)"
57
+ },
58
+ {
59
+ "name": "eslint-plugin-react",
60
+ "version": "7.37.1(eslint@8.57.1)"
61
+ },
62
+ {
63
+ "name": "eslint-plugin-react-hooks",
64
+ "version": "4.6.2(eslint@8.57.1)"
65
+ },
66
+ {
67
+ "name": "react",
68
+ "version": "18.2.0"
69
+ },
70
+ {
71
+ "name": "react-dom",
72
+ "version": "18.2.0(react@18.2.0)"
73
+ },
74
+ {
75
+ "name": "rimraf",
76
+ "version": "5.0.10"
77
+ },
78
+ {
79
+ "name": "styled-components",
80
+ "version": "6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
81
+ },
82
+ {
83
+ "name": "tsc-esm-fix",
84
+ "version": "2.20.27"
85
+ },
86
+ {
87
+ "name": "typescript",
88
+ "version": "5.6.2"
89
+ },
90
+ {
91
+ "name": "@citric/core",
92
+ "version": "6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
93
+ },
94
+ {
95
+ "name": "@citric/icons",
96
+ "version": "5.7.7(react@18.2.0)"
97
+ },
98
+ {
99
+ "name": "@citric/ui",
100
+ "version": "6.1.2(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
101
+ },
102
+ {
103
+ "name": "@monaco-editor/react",
104
+ "version": "4.6.0(monaco-editor@0.52.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
105
+ },
106
+ {
107
+ "name": "@stack-spot/portal-components",
108
+ "version": "2.8.1(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(@citric/ui@6.1.2(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@citric/icons@5.7.7(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@stack-spot/portal-theme@1.1.0(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(@stack-spot/portal-translate@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
109
+ },
110
+ {
111
+ "name": "@stack-spot/portal-network",
112
+ "version": "0.48.0(@stack-spot/auth@5.3.2)(@stack-spot/opa@2.5.0(@stack-spot/auth@5.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@stack-spot/portal-translate@1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@tanstack/react-query@5.59.16(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
113
+ },
114
+ {
115
+ "name": "@stack-spot/portal-theme",
116
+ "version": "1.1.0(@citric/core@6.2.0(lodash@4.17.21)(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0))"
117
+ },
118
+ {
119
+ "name": "@stack-spot/portal-translate",
120
+ "version": "1.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)"
121
+ },
122
+ {
123
+ "name": "lodash",
124
+ "version": "4.17.21"
125
+ },
126
+ {
127
+ "name": "monaco-editor",
128
+ "version": "0.52.0"
129
+ },
130
+ {
131
+ "name": "react-infinite-scroll-component",
132
+ "version": "6.1.0(react@18.2.0)"
133
+ },
134
+ {
135
+ "name": "react-markdown",
136
+ "version": "9.0.1(@types/react@18.3.11)(react@18.2.0)"
137
+ },
138
+ {
139
+ "name": "react-syntax-highlighter",
140
+ "version": "15.5.0(react@18.2.0)"
141
+ },
142
+ {
143
+ "name": "remark-gfm",
144
+ "version": "4.0.0"
145
+ },
146
+ {
147
+ "name": "ulid",
148
+ "version": "2.3.0"
149
+ }
150
+ ]
151
+ }
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ export type { AIWidgetFeatures, ChatFeatures } from './features'
8
8
  export { StackspotAIWidget } from './StackspotAIWidget'
9
9
  export { ChatEntry } from './state/ChatEntry'
10
10
  export { ChatState } from './state/ChatState'
11
+ export type { MessageInterceptor } from './state/ChatState'
11
12
  export { ChatTabsController } from './state/ChatTabsController'
12
13
  export { ObservableState } from './state/ObservableState'
13
14
  export type { Labeled, LabeledWithImage } from './state/types'
@@ -54,7 +54,7 @@ interface Options {
54
54
  chatTabs?: ChatTabsController,
55
55
  }
56
56
 
57
- const untitledChatPrefix = 'Chat '
57
+ const untitledChatPrefix = 'Chat'
58
58
 
59
59
  /**
60
60
  * Holds the full state of the AI Chat Widget.
@@ -89,13 +89,19 @@ export class WidgetState extends ObservableState<WidgetProperties> {
89
89
  private getNextUntitledChatIndex() {
90
90
  let max = 0
91
91
  for (const chat of this.chatTabs.getAll()) {
92
- const [, match] = chat.get('label').match(`${untitledChatPrefix}(\\d+)`) ?? []
93
- const index = parseInt(match)
92
+ if (chat.get('label') === untitledChatPrefix && max < 1) max = 1
93
+ const [, match] = chat.get('label').match(`^${untitledChatPrefix} (\\d+)$`) ?? []
94
+ const index = match ? parseInt(match) : 0
94
95
  if (index > max) max = index
95
96
  }
96
97
  return max + 1
97
98
  }
98
99
 
100
+ private getNextUntitledChatLabel() {
101
+ const next = this.getNextUntitledChatIndex()
102
+ return next > 1 ? `${untitledChatPrefix} ${next}` : untitledChatPrefix
103
+ }
104
+
99
105
  /**
100
106
  * Utility function for adding a new chat to the chat tabs. This also selects the new tab.
101
107
  * @param properties the chat properties (initial state).
@@ -105,7 +111,7 @@ export class WidgetState extends ObservableState<WidgetProperties> {
105
111
  createChat({ label, ...properties }: Partial<ChatPropertiesWithOptionalFeatures> = {}, entries: ChatEntry[] = []) {
106
112
  const chat = new ChatState({
107
113
  id: ulid(),
108
- initial: { label: label || `${untitledChatPrefix}${this.getNextUntitledChatIndex()}`, features: this.chatFeatures, ...properties },
114
+ initial: { label: label || this.getNextUntitledChatLabel(), features: this.chatFeatures, ...properties },
109
115
  entries,
110
116
  interceptors: this.interceptors,
111
117
  untitled: !label,