@theia/ai-chat-ui 1.76.0-next.6 → 1.76.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.
- package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +1 -1
- package/lib/browser/ai-chat-ui-frontend-module.js +6 -0
- package/lib/browser/ai-chat-ui-frontend-module.js.map +1 -1
- package/lib/browser/chat-find/chat-find-contribution.d.ts +18 -0
- package/lib/browser/chat-find/chat-find-contribution.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-contribution.js +76 -0
- package/lib/browser/chat-find/chat-find-contribution.js.map +1 -0
- package/lib/browser/chat-find/chat-find-highlighter.d.ts +114 -0
- package/lib/browser/chat-find/chat-find-highlighter.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-highlighter.js +353 -0
- package/lib/browser/chat-find/chat-find-highlighter.js.map +1 -0
- package/lib/browser/chat-find/chat-find-highlighter.spec.d.ts +2 -0
- package/lib/browser/chat-find/chat-find-highlighter.spec.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-highlighter.spec.js +283 -0
- package/lib/browser/chat-find/chat-find-highlighter.spec.js.map +1 -0
- package/lib/browser/chat-find/chat-find-matcher.d.ts +72 -0
- package/lib/browser/chat-find/chat-find-matcher.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-matcher.js +168 -0
- package/lib/browser/chat-find/chat-find-matcher.js.map +1 -0
- package/lib/browser/chat-find/chat-find-matcher.spec.d.ts +2 -0
- package/lib/browser/chat-find/chat-find-matcher.spec.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-matcher.spec.js +145 -0
- package/lib/browser/chat-find/chat-find-matcher.spec.js.map +1 -0
- package/lib/browser/chat-find/chat-find-text.d.ts +20 -0
- package/lib/browser/chat-find/chat-find-text.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-text.js +56 -0
- package/lib/browser/chat-find/chat-find-text.js.map +1 -0
- package/lib/browser/chat-find/chat-find-widget.d.ts +96 -0
- package/lib/browser/chat-find/chat-find-widget.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-widget.js +332 -0
- package/lib/browser/chat-find/chat-find-widget.js.map +1 -0
- package/lib/browser/chat-find/chat-find-widget.spec.d.ts +2 -0
- package/lib/browser/chat-find/chat-find-widget.spec.d.ts.map +1 -0
- package/lib/browser/chat-find/chat-find-widget.spec.js +236 -0
- package/lib/browser/chat-find/chat-find-widget.spec.js.map +1 -0
- package/lib/browser/chat-input-scroll-util.d.ts +7 -0
- package/lib/browser/chat-input-scroll-util.d.ts.map +1 -0
- package/lib/browser/chat-input-scroll-util.js +33 -0
- package/lib/browser/chat-input-scroll-util.js.map +1 -0
- package/lib/browser/chat-input-scroll-util.spec.d.ts +2 -0
- package/lib/browser/chat-input-scroll-util.spec.d.ts.map +1 -0
- package/lib/browser/chat-input-scroll-util.spec.js +38 -0
- package/lib/browser/chat-input-scroll-util.spec.js.map +1 -0
- package/lib/browser/chat-input-widget.d.ts +21 -3
- package/lib/browser/chat-input-widget.d.ts.map +1 -1
- package/lib/browser/chat-input-widget.js +109 -50
- package/lib/browser/chat-input-widget.js.map +1 -1
- package/lib/browser/chat-input-widget.spec.js +21 -0
- package/lib/browser/chat-input-widget.spec.js.map +1 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.js +9 -1
- package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/code-wrapper-editors.d.ts +13 -0
- package/lib/browser/chat-response-renderer/code-wrapper-editors.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/code-wrapper-editors.js +41 -0
- package/lib/browser/chat-response-renderer/code-wrapper-editors.js.map +1 -0
- package/lib/browser/chat-response-renderer/delegation-tool-renderer.js +74 -43
- package/lib/browser/chat-response-renderer/delegation-tool-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/index.d.ts +1 -0
- package/lib/browser/chat-response-renderer/index.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/index.js +1 -0
- package/lib/browser/chat-response-renderer/index.js.map +1 -1
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +9 -0
- package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js +34 -16
- package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/server-toolcall-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/server-toolcall-part-renderer.js +2 -2
- package/lib/browser/chat-response-renderer/server-toolcall-part-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/spinner.d.ts +3 -0
- package/lib/browser/chat-response-renderer/spinner.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/spinner.js +24 -0
- package/lib/browser/chat-response-renderer/spinner.js.map +1 -0
- package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts +9 -1
- package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/thinking-part-renderer.js +93 -2
- package/lib/browser/chat-response-renderer/thinking-part-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/thinking-part-renderer.spec.d.ts +2 -0
- package/lib/browser/chat-response-renderer/thinking-part-renderer.spec.d.ts.map +1 -0
- package/lib/browser/chat-response-renderer/thinking-part-renderer.spec.js +84 -0
- package/lib/browser/chat-response-renderer/thinking-part-renderer.spec.js.map +1 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +2 -2
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -1
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.spec.js +16 -0
- package/lib/browser/chat-response-renderer/toolcall-part-renderer.spec.js.map +1 -1
- package/lib/browser/chat-response-renderer/toolcall-utils.d.ts.map +1 -1
- package/lib/browser/chat-response-renderer/toolcall-utils.js +7 -2
- package/lib/browser/chat-response-renderer/toolcall-utils.js.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-container.d.ts.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-container.js +4 -0
- package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +20 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js +88 -7
- package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
- package/lib/common/toolcall-utils.d.ts +11 -1
- package/lib/common/toolcall-utils.d.ts.map +1 -1
- package/lib/common/toolcall-utils.js +191 -9
- package/lib/common/toolcall-utils.js.map +1 -1
- package/lib/common/toolcall-utils.spec.js +92 -4
- package/lib/common/toolcall-utils.spec.js.map +1 -1
- package/package.json +13 -13
- package/src/browser/ai-chat-ui-frontend-module.ts +7 -0
- package/src/browser/chat-find/chat-find-contribution.ts +74 -0
- package/src/browser/chat-find/chat-find-highlighter.spec.ts +313 -0
- package/src/browser/chat-find/chat-find-highlighter.ts +385 -0
- package/src/browser/chat-find/chat-find-matcher.spec.ts +173 -0
- package/src/browser/chat-find/chat-find-matcher.ts +197 -0
- package/src/browser/chat-find/chat-find-text.ts +65 -0
- package/src/browser/chat-find/chat-find-widget.spec.tsx +261 -0
- package/src/browser/chat-find/chat-find-widget.tsx +418 -0
- package/src/browser/chat-input-scroll-util.spec.ts +42 -0
- package/src/browser/chat-input-scroll-util.ts +30 -0
- package/src/browser/chat-input-widget.spec.ts +29 -0
- package/src/browser/chat-input-widget.tsx +118 -56
- package/src/browser/chat-response-renderer/code-part-renderer.tsx +9 -1
- package/src/browser/chat-response-renderer/code-wrapper-editors.ts +41 -0
- package/src/browser/chat-response-renderer/delegation-tool-renderer.tsx +88 -62
- package/src/browser/chat-response-renderer/index.ts +1 -0
- package/src/browser/chat-response-renderer/markdown-part-renderer.tsx +34 -17
- package/src/browser/chat-response-renderer/server-toolcall-part-renderer.tsx +2 -5
- package/src/browser/chat-response-renderer/spinner.tsx +22 -0
- package/src/browser/chat-response-renderer/thinking-part-renderer.spec.tsx +104 -0
- package/src/browser/chat-response-renderer/thinking-part-renderer.tsx +129 -9
- package/src/browser/chat-response-renderer/toolcall-part-renderer.spec.ts +16 -0
- package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +1 -4
- package/src/browser/chat-response-renderer/toolcall-utils.ts +5 -0
- package/src/browser/chat-tree-view/chat-view-tree-container.ts +4 -0
- package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +99 -6
- package/src/browser/style/chat-find.css +107 -0
- package/src/browser/style/index.css +75 -8
- package/src/common/toolcall-utils.spec.ts +113 -4
- package/src/common/toolcall-utils.ts +207 -9
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
19
|
+
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
|
+
const common_1 = require("@theia/ai-chat/lib/common");
|
|
21
|
+
const chai_1 = require("chai");
|
|
22
|
+
const chat_find_matcher_1 = require("./chat-find-matcher");
|
|
23
|
+
disableJSDOM();
|
|
24
|
+
const plain = { matchCase: false, wholeWord: false, useRegex: false };
|
|
25
|
+
function request(id, text, content) {
|
|
26
|
+
return {
|
|
27
|
+
id,
|
|
28
|
+
message: { parts: [{ kind: 'text', text }] },
|
|
29
|
+
response: { id: `${id}-response`, response: { content } }
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function model(...requests) {
|
|
33
|
+
return { getRequests: () => requests };
|
|
34
|
+
}
|
|
35
|
+
describe('ChatFindMatcher', () => {
|
|
36
|
+
const matcher = new chat_find_matcher_1.ChatFindMatcher();
|
|
37
|
+
const count = (chat, query, options = plain) => matcher.findMatches(chat, matcher.createRegExp(query, options)).length;
|
|
38
|
+
before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
|
|
39
|
+
after(() => disableJSDOM());
|
|
40
|
+
describe('createRegExp', () => {
|
|
41
|
+
it('returns undefined for an empty query', () => {
|
|
42
|
+
(0, chai_1.expect)(matcher.createRegExp('', plain)).to.be.undefined;
|
|
43
|
+
});
|
|
44
|
+
it('escapes regex characters unless useRegex is set', () => {
|
|
45
|
+
(0, chai_1.expect)(matcher.createRegExp('a.b', plain).test('axb')).to.be.false;
|
|
46
|
+
(0, chai_1.expect)(matcher.createRegExp('a.b', { ...plain, useRegex: true }).test('axb')).to.be.true;
|
|
47
|
+
});
|
|
48
|
+
it('is case-insensitive unless matchCase is set', () => {
|
|
49
|
+
(0, chai_1.expect)(matcher.createRegExp('abc', plain).test('ABC')).to.be.true;
|
|
50
|
+
(0, chai_1.expect)(matcher.createRegExp('abc', { ...plain, matchCase: true }).test('ABC')).to.be.false;
|
|
51
|
+
});
|
|
52
|
+
it('matches whole words only for wholeWord', () => {
|
|
53
|
+
const whole = { ...plain, wholeWord: true };
|
|
54
|
+
const find = (query, text) => matcher.findInText(text, matcher.createRegExp(query, whole));
|
|
55
|
+
(0, chai_1.expect)(find('cat', 'a cat sat')).to.deep.equal([{ start: 2, end: 5 }]);
|
|
56
|
+
(0, chai_1.expect)(find('cat', 'concatenate')).to.deep.equal([]);
|
|
57
|
+
(0, chai_1.expect)(find('cat', 'cat')).to.deep.equal([{ start: 0, end: 3 }]);
|
|
58
|
+
(0, chai_1.expect)(find('cat', 'cat.')).to.deep.equal([{ start: 0, end: 3 }]);
|
|
59
|
+
});
|
|
60
|
+
it('matches whole words that start or end with a separator, unlike \\b', () => {
|
|
61
|
+
const whole = { ...plain, wholeWord: true };
|
|
62
|
+
const find = (query, text) => matcher.findInText(text, matcher.createRegExp(query, whole));
|
|
63
|
+
(0, chai_1.expect)(find('C++', 'I like C++ a lot')).to.deep.equal([{ start: 7, end: 10 }]);
|
|
64
|
+
(0, chai_1.expect)(find('foo()', 'call foo() now')).to.deep.equal([{ start: 5, end: 10 }]);
|
|
65
|
+
(0, chai_1.expect)(find('C++', 'xC++')).to.deep.equal([]);
|
|
66
|
+
});
|
|
67
|
+
it('returns undefined for an invalid regular expression', () => {
|
|
68
|
+
(0, chai_1.expect)(matcher.createRegExp('(', { ...plain, useRegex: true })).to.be.undefined;
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('findInText', () => {
|
|
72
|
+
it('returns all occurrences in order', () => {
|
|
73
|
+
const ranges = matcher.findInText('foo bar foo', matcher.createRegExp('foo', plain));
|
|
74
|
+
(0, chai_1.expect)(ranges).to.deep.equal([{ start: 0, end: 3 }, { start: 8, end: 11 }]);
|
|
75
|
+
});
|
|
76
|
+
it('skips zero-length matches without looping forever', () => {
|
|
77
|
+
const ranges = matcher.findInText('aab', matcher.createRegExp('a*', { ...plain, useRegex: true }));
|
|
78
|
+
(0, chai_1.expect)(ranges).to.deep.equal([{ start: 0, end: 2 }]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('findMatches', () => {
|
|
82
|
+
it('searches request text and response parts in tree order', () => {
|
|
83
|
+
const chat = model(request('r1', 'find me', [new common_1.TextChatResponseContentImpl('nothing'), new common_1.MarkdownChatResponseContentImpl('find **me** and find me')]), request('r2', 'other', [new common_1.CodeChatResponseContentImpl('const findMe = 1;', 'ts')]));
|
|
84
|
+
const matches = matcher.findMatches(chat, matcher.createRegExp('find', plain));
|
|
85
|
+
// Offsets are into the rendered text: the markdown renders as 'find me and find me'.
|
|
86
|
+
(0, chai_1.expect)(matches).to.deep.equal([
|
|
87
|
+
{ nodeId: 'r1', kind: 'request', contentIndex: undefined, occurrence: 0, start: 0, end: 4 },
|
|
88
|
+
{ nodeId: 'r1-response', kind: 'markdownContent', contentIndex: 1, occurrence: 0, start: 0, end: 4 },
|
|
89
|
+
{ nodeId: 'r1-response', kind: 'markdownContent', contentIndex: 1, occurrence: 1, start: 12, end: 16 },
|
|
90
|
+
{ nodeId: 'r2-response', kind: 'code', contentIndex: 0, occurrence: 0, start: 6, end: 10 }
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
it('searches markdown as rendered: link targets and markup are not searched, text across markup is', () => {
|
|
94
|
+
const chat = model(request('r1', '', [
|
|
95
|
+
new common_1.MarkdownChatResponseContentImpl('See the [docs](https://example.org/docs/page) for **important note** details.')
|
|
96
|
+
]));
|
|
97
|
+
(0, chai_1.expect)(count(chat, 'docs')).to.equal(1);
|
|
98
|
+
(0, chai_1.expect)(count(chat, 'for important')).to.equal(1);
|
|
99
|
+
(0, chai_1.expect)(count(chat, '**')).to.equal(0);
|
|
100
|
+
});
|
|
101
|
+
it('follows streamed markdown', () => {
|
|
102
|
+
const content = new common_1.MarkdownChatResponseContentImpl('first needle');
|
|
103
|
+
const chat = model(request('r1', '', [content]));
|
|
104
|
+
(0, chai_1.expect)(count(chat, 'needle')).to.equal(1);
|
|
105
|
+
content.merge(new common_1.MarkdownChatResponseContentImpl(' and a second needle'));
|
|
106
|
+
(0, chai_1.expect)(count(chat, 'needle')).to.equal(2);
|
|
107
|
+
});
|
|
108
|
+
it('searches request text as rendered markdown', () => {
|
|
109
|
+
(0, chai_1.expect)(count(model(request('r1', 'use `npm` **now**', [])), 'npm now')).to.equal(1);
|
|
110
|
+
});
|
|
111
|
+
it('searches the visible error headline only and skips informational parts, which are not rendered', () => {
|
|
112
|
+
const error = new common_1.ErrorChatResponseContentImpl(new Error('401 {"error":{"message":"needle in headline","type":"needle_type"}}'));
|
|
113
|
+
const chat = model(request('r1', '', [new common_1.InformationalChatResponseContentImpl('needle info'), error]));
|
|
114
|
+
const matches = matcher.findMatches(chat, matcher.createRegExp('needle', plain));
|
|
115
|
+
(0, chai_1.expect)(matches.map(m => [m.contentIndex, m.kind, m.occurrence])).to.deep.equal([[1, 'error', 0]]);
|
|
116
|
+
});
|
|
117
|
+
it('ignores a mermaid block, which is rendered as a diagram rather than as its source', () => {
|
|
118
|
+
const chart = new common_1.CodeChatResponseContentImpl('flowchart TD\n A[needle] --> B[other]', 'mermaid');
|
|
119
|
+
const chat = model(request('r1', '', [chart, new common_1.TextChatResponseContentImpl('needle in text')]));
|
|
120
|
+
const matches = matcher.findMatches(chat, matcher.createRegExp('needle', plain));
|
|
121
|
+
(0, chai_1.expect)(matches.map(m => m.contentIndex)).to.deep.equal([1]);
|
|
122
|
+
});
|
|
123
|
+
it('still searches a plain code block', () => {
|
|
124
|
+
const chat = model(request('r1', '', [new common_1.CodeChatResponseContentImpl('const needle = 1;', 'ts')]));
|
|
125
|
+
(0, chai_1.expect)(matcher.findMatches(chat, matcher.createRegExp('needle', plain))).to.have.length(1);
|
|
126
|
+
});
|
|
127
|
+
it('ignores tool calls and reasoning', () => {
|
|
128
|
+
const chat = model(request('r1', '', [
|
|
129
|
+
new common_1.ToolCallChatResponseContentImpl('id', 'needle_tool', '{"q":"needle"}', true),
|
|
130
|
+
new common_1.ThinkingChatResponseContentImpl('thinking about needle', 'sig')
|
|
131
|
+
]));
|
|
132
|
+
(0, chai_1.expect)(matcher.findMatches(chat, matcher.createRegExp('needle', plain))).to.deep.equal([]);
|
|
133
|
+
});
|
|
134
|
+
it('joins request parts, e.g. agent mentions, into one text', () => {
|
|
135
|
+
const req = {
|
|
136
|
+
id: 'r1',
|
|
137
|
+
message: { parts: [{ kind: 'agent', text: '@Coder' }, { kind: 'text', text: ' please fix' }] },
|
|
138
|
+
response: { id: 'r1-response', response: { content: [] } }
|
|
139
|
+
};
|
|
140
|
+
const matches = matcher.findMatches(model(req), matcher.createRegExp('coder please', plain));
|
|
141
|
+
(0, chai_1.expect)(matches).to.deep.equal([{ nodeId: 'r1', kind: 'request', contentIndex: undefined, occurrence: 0, start: 1, end: 13 }]);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=chat-find-matcher.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-find-matcher.spec.js","sourceRoot":"","sources":["../../../src/browser/chat-find/chat-find-matcher.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ChatFindTextSegment {
|
|
2
|
+
node: Text;
|
|
3
|
+
/** Offset of the node's first character in {@link ChatFindTextContent.text}. */
|
|
4
|
+
start: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ChatFindTextContent {
|
|
7
|
+
text: string;
|
|
8
|
+
segments: ChatFindTextSegment[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Reads the searchable text of rendered chat content. The matcher reads it from a detached render and the
|
|
12
|
+
* highlighter from the mounted DOM, so match offsets computed on the one are valid in the other.
|
|
13
|
+
*/
|
|
14
|
+
export declare namespace ChatFindText {
|
|
15
|
+
/** The concatenated text nodes under `root`, skipping subtrees that do not hold visible text. */
|
|
16
|
+
function collect(root: Node): ChatFindTextContent;
|
|
17
|
+
/** Non-breaking spaces (e.g. from ` ` in markdown) are searched as plain spaces; the length is unchanged. */
|
|
18
|
+
function normalize(text: string): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=chat-find-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-find-text.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-find/chat-find-text.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,yBAAiB,YAAY,CAAC;IAE1B,iGAAiG;IACjG,SAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,mBAAmB,CAavD;IAED,kHAAkH;IAClH,SAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;CAUJ"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.ChatFindText = void 0;
|
|
19
|
+
const block_external_resources_1 = require("../chat-response-renderer/block-external-resources");
|
|
20
|
+
/**
|
|
21
|
+
* Reads the searchable text of rendered chat content. The matcher reads it from a detached render and the
|
|
22
|
+
* highlighter from the mounted DOM, so match offsets computed on the one are valid in the other.
|
|
23
|
+
*/
|
|
24
|
+
var ChatFindText;
|
|
25
|
+
(function (ChatFindText) {
|
|
26
|
+
/** The concatenated text nodes under `root`, skipping subtrees that do not hold visible text. */
|
|
27
|
+
function collect(root) {
|
|
28
|
+
const segments = [];
|
|
29
|
+
let text = '';
|
|
30
|
+
const walker = (root.ownerDocument ?? document).createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, {
|
|
31
|
+
acceptNode: node => node.nodeType === Node.ELEMENT_NODE
|
|
32
|
+
? (isSkipped(node) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_SKIP)
|
|
33
|
+
: NodeFilter.FILTER_ACCEPT
|
|
34
|
+
});
|
|
35
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
36
|
+
segments.push({ node: node, start: text.length });
|
|
37
|
+
text += node.textContent ?? '';
|
|
38
|
+
}
|
|
39
|
+
return { text: normalize(text), segments };
|
|
40
|
+
}
|
|
41
|
+
ChatFindText.collect = collect;
|
|
42
|
+
/** Non-breaking spaces (e.g. from ` ` in markdown) are searched as plain spaces; the length is unchanged. */
|
|
43
|
+
function normalize(text) {
|
|
44
|
+
return text.replace(/ /g, ' ');
|
|
45
|
+
}
|
|
46
|
+
ChatFindText.normalize = normalize;
|
|
47
|
+
/**
|
|
48
|
+
* Code rather than visible text (e.g. the stylesheet of a rendered mermaid diagram), and blocked-resource
|
|
49
|
+
* placeholders, whose label disappears once the user allows the resource.
|
|
50
|
+
*/
|
|
51
|
+
function isSkipped(element) {
|
|
52
|
+
const name = element.nodeName.toLowerCase();
|
|
53
|
+
return name === 'style' || name === 'script' || element.classList.contains(block_external_resources_1.BLOCKED_RESOURCE_CLASS);
|
|
54
|
+
}
|
|
55
|
+
})(ChatFindText || (exports.ChatFindText = ChatFindText = {}));
|
|
56
|
+
//# sourceMappingURL=chat-find-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-find-text.js","sourceRoot":"","sources":["../../../src/browser/chat-find/chat-find-text.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yDAAyD;AACzD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,iGAA4F;AAa5F;;;GAGG;AACH,IAAiB,YAAY,CA+B5B;AA/BD,WAAiB,YAAY;IAEzB,iGAAiG;IACjG,SAAgB,OAAO,CAAC,IAAU;QAC9B,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,SAAS,EAAE;YACnH,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;gBACnD,CAAC,CAAC,CAAC,SAAS,CAAC,IAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;gBAClF,CAAC,CAAC,UAAU,CAAC,aAAa;SACjC,CAAC,CAAC;QACH,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAY,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAbe,oBAAO,UAatB,CAAA;IAED,kHAAkH;IAClH,SAAgB,SAAS,CAAC,IAAY;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAFe,sBAAS,YAExB,CAAA;IAED;;;OAGG;IACH,SAAS,SAAS,CAAC,OAAgB;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,iDAAsB,CAAC,CAAC;IACvG,CAAC;AACL,CAAC,EA/BgB,YAAY,4BAAZ,YAAY,QA+B5B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { ChatChangeEvent, ChatModel, ChatRequestModel } from '@theia/ai-chat/lib/common';
|
|
2
|
+
import { DisposableCollection, Emitter, Event } from '@theia/core';
|
|
3
|
+
import { ReactWidget } from '@theia/core/lib/browser';
|
|
4
|
+
import { ContextKey, ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
5
|
+
import * as React from '@theia/core/shared/react';
|
|
6
|
+
import '../../../src/browser/style/chat-find.css';
|
|
7
|
+
import { ChatFindMatch, ChatFindMatcher, ChatFindOptions } from './chat-find-matcher';
|
|
8
|
+
export interface ChatFindState {
|
|
9
|
+
regexp: RegExp | undefined;
|
|
10
|
+
matches: ChatFindMatch[];
|
|
11
|
+
current: ChatFindMatch | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The find bar of a chat view: owns query, options, matches and the current match, and tracks the
|
|
15
|
+
* chat model so matches follow streamed responses. Reveal and highlighting are done by the host
|
|
16
|
+
* (the chat tree widget) via {@link onDidRequestReveal} and {@link onDidChangeState}.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ChatFindWidget extends ReactWidget {
|
|
19
|
+
static readonly ID = "chat-find-widget";
|
|
20
|
+
protected static readonly RECOMPUTE_DELAY_MS = 100;
|
|
21
|
+
protected matcher: ChatFindMatcher;
|
|
22
|
+
protected contextKeyService: ContextKeyService;
|
|
23
|
+
protected readonly onDidChangeStateEmitter: Emitter<ChatFindState>;
|
|
24
|
+
readonly onDidChangeState: Event<ChatFindState>;
|
|
25
|
+
protected readonly onDidRequestRevealEmitter: Emitter<ChatFindMatch>;
|
|
26
|
+
readonly onDidRequestReveal: Event<ChatFindMatch>;
|
|
27
|
+
/** Focused when the bar closes and the previously focused element is gone. */
|
|
28
|
+
fallbackFocusTarget: HTMLElement | undefined;
|
|
29
|
+
protected visibleKey: ContextKey<boolean>;
|
|
30
|
+
protected query: string;
|
|
31
|
+
protected options: ChatFindOptions;
|
|
32
|
+
protected regexp: RegExp | undefined;
|
|
33
|
+
protected matches: ChatFindMatch[];
|
|
34
|
+
protected currentIndex: number;
|
|
35
|
+
protected chatModel: ChatModel | undefined;
|
|
36
|
+
protected nodeOrder: Map<string, number>;
|
|
37
|
+
protected readonly toDisposeOnModelChange: DisposableCollection;
|
|
38
|
+
protected recomputeTimeout: ReturnType<typeof setTimeout> | undefined;
|
|
39
|
+
protected previouslyFocused: HTMLElement | undefined;
|
|
40
|
+
protected input: HTMLInputElement | undefined;
|
|
41
|
+
protected pendingFocus: boolean;
|
|
42
|
+
protected init(): void;
|
|
43
|
+
dispose(): void;
|
|
44
|
+
get isOpen(): boolean;
|
|
45
|
+
get state(): ChatFindState;
|
|
46
|
+
get currentMatch(): ChatFindMatch | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Whether there is anything to search. A session without requests renders the welcome screen (which hosts
|
|
49
|
+
* the session list), so the find bar has nothing to search and stays closed there.
|
|
50
|
+
*/
|
|
51
|
+
get canFind(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Track a chat model; query and options are kept, the position resets. Like the find widget of an editor, the bar
|
|
54
|
+
* belongs to one session: it closes when another session is tracked, and `Ctrl+F` brings the query back.
|
|
55
|
+
*/
|
|
56
|
+
setChatModel(model: ChatModel | undefined): void;
|
|
57
|
+
open(): void;
|
|
58
|
+
/** Closes the bar and returns focus to where it was before the bar opened. */
|
|
59
|
+
dismiss(): void;
|
|
60
|
+
/** Closes the bar and clears the highlights without touching focus. */
|
|
61
|
+
protected hideBar(): void;
|
|
62
|
+
setQuery(query: string): void;
|
|
63
|
+
toggleOption(option: keyof ChatFindOptions): void;
|
|
64
|
+
next(): void;
|
|
65
|
+
previous(): void;
|
|
66
|
+
protected step(delta: number): void;
|
|
67
|
+
protected revealCurrent(): void;
|
|
68
|
+
protected handleModelChange(event: ChatChangeEvent): void;
|
|
69
|
+
protected trackResponse(request: ChatRequestModel): void;
|
|
70
|
+
protected scheduleRecompute(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Recompute matches. The current match is kept by identity when it still exists; otherwise (or when
|
|
73
|
+
* `moveToNearest` is set after a query change) the first match at or after the previous position becomes current.
|
|
74
|
+
* While the bar is closed there are no matches.
|
|
75
|
+
*/
|
|
76
|
+
protected recompute(moveToNearest: boolean): void;
|
|
77
|
+
/** Closes the bar once the tracked session has no requests left to search. */
|
|
78
|
+
protected closeWhenNothingToFind(): void;
|
|
79
|
+
protected fireStateIfOpen(): void;
|
|
80
|
+
protected computeNodeOrder(): Map<string, number>;
|
|
81
|
+
protected pickCurrentIndex(previous: ChatFindMatch | undefined, moveToNearest: boolean): number;
|
|
82
|
+
/** Document order of two matches: row order, then content index, then offset. */
|
|
83
|
+
protected compare(a: ChatFindMatch, b: ChatFindMatch): number;
|
|
84
|
+
protected focusInput(): void;
|
|
85
|
+
protected setInput: (input: HTMLInputElement | null) => void;
|
|
86
|
+
protected handleInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
87
|
+
protected handleInputKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
88
|
+
protected handleToggleClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
89
|
+
protected handlePreviousClick: () => void;
|
|
90
|
+
protected handleNextClick: () => void;
|
|
91
|
+
protected handleCloseClick: () => void;
|
|
92
|
+
protected render(): React.ReactNode;
|
|
93
|
+
protected renderToggle(option: keyof ChatFindOptions, icon: string, title: string): React.ReactNode;
|
|
94
|
+
protected renderButton(icon: string, title: string, enabled: boolean, onClick: () => void): React.ReactNode;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=chat-find-widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-find-widget.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-find/chat-find-widget.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAA2B,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAG5F,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAC;AAClD,OAAO,0CAA0C,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC;CACtC;AAED;;;;GAIG;AACH,qBACa,cAAe,SAAQ,WAAW;IAE3C,MAAM,CAAC,QAAQ,CAAC,EAAE,sBAAsB;IACxC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,OAAO;IAGnD,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;IAGnC,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAE/C,SAAS,CAAC,QAAQ,CAAC,uBAAuB,yBAAgC;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAsC;IAErF,SAAS,CAAC,QAAQ,CAAC,yBAAyB,yBAAgC;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAwC;IAEzF,8EAA8E;IAC9E,mBAAmB,EAAE,WAAW,GAAG,SAAS,CAAC;IAE7C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,KAAK,SAAM;IACrB,SAAS,CAAC,OAAO,EAAE,eAAe,CAA2D;IAC7F,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,CAAM;IACxC,SAAS,CAAC,YAAY,SAAM;IAC5B,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,SAAS,sBAA6B;IAChD,SAAS,CAAC,QAAQ,CAAC,sBAAsB,uBAA8B;IACvE,SAAS,CAAC,gBAAgB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAC;IACtE,SAAS,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,CAAC;IACrD,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,YAAY,UAAS;IAG/B,SAAS,CAAC,IAAI,IAAI,IAAI;IAWb,OAAO,IAAI,IAAI;IASxB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,KAAK,IAAI,aAAa,CAEzB;IAED,IAAI,YAAY,IAAI,aAAa,GAAG,SAAS,CAE5C;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IAgBhD,IAAI,IAAI,IAAI;IAcZ,8EAA8E;IAC9E,OAAO,IAAI,IAAI;IASf,uEAAuE;IACvE,SAAS,CAAC,OAAO,IAAI,IAAI;IAUzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS7B,YAAY,CAAC,MAAM,EAAE,MAAM,eAAe,GAAG,IAAI;IAMjD,IAAI,IAAI,IAAI;IAIZ,QAAQ,IAAI,IAAI;IAIhB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAUnC,SAAS,CAAC,aAAa,IAAI,IAAI;IAO/B,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAOzD,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAMxD,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAWnC;;;;OAIG;IACH,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAWjD,8EAA8E;IAC9E,SAAS,CAAC,sBAAsB,IAAI,IAAI;IAMxC,SAAS,CAAC,eAAe,IAAI,IAAI;IAMjC,SAAS,CAAC,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IASjD,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM;IAkB/F,iFAAiF;IACjF,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM;IAc7D,SAAS,CAAC,UAAU,IAAI,IAAI;IAS5B,SAAS,CAAC,QAAQ,GAAI,OAAO,gBAAgB,GAAG,IAAI,KAAG,IAAI,CAOzD;IAEF,SAAS,CAAC,iBAAiB,GAAI,OAAO,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI,CAE9E;IAEF,SAAS,CAAC,kBAAkB,GAAI,OAAO,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAG,IAAI,CAcjF;IAEF,SAAS,CAAC,iBAAiB,GAAI,OAAO,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAG,IAAI,CAM9E;IAEF,SAAS,CAAC,mBAAmB,QAAO,IAAI,CAGtC;IAEF,SAAS,CAAC,eAAe,QAAO,IAAI,CAGlC;IAEF,SAAS,CAAC,gBAAgB,QAAO,IAAI,CAEnC;IAEF,SAAS,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS;IAgCnC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS;IAanG,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS;CAS9G"}
|