Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3c64c8f
wsd: ai chat: add multi-round tool loop with approval UI
Rash419 Mar 19, 2026
5e48605
browser: hightlight the messsage which needs approval from user
Rash419 Mar 23, 2026
c62f180
browser: show progressText beside the loading animation dots
Rash419 Mar 23, 2026
c5ee8bc
browser: ai chat: fix sidebar width changes on "see more" button click
Rash419 Mar 23, 2026
890f888
wsd: ai chat: add GenerateImage.N for inline image generation in tran…
Rash419 Mar 23, 2026
9c2c305
wsd: ai chat: reduce code duplication
Rash419 Mar 24, 2026
9aefa58
browser: fix flicker in ai sidebar chat on message update
Rash419 Mar 25, 2026
a4c5877
browser: aichat: add image size configuration option in viewsettings
Rash419 Mar 25, 2026
948ac3a
browser: aichat: add request timeout configuration in view settings
Rash419 Mar 25, 2026
c7c84ea
browser: fix: API key input field goes outside the parent container
Rash419 Mar 25, 2026
fa6964b
feat: aichat: formula creation
Rash419 Mar 27, 2026
c1bf6e9
browser: aichat: fix input text reappearing after LLM response
Rash419 Apr 8, 2026
52f8369
browser: settings: rename AI Settings to AI Assistant and reorder
Rash419 Apr 8, 2026
ca88b7c
wsd,browser: pipe AI model name from server to client
Rash419 Apr 8, 2026
3f1641d
browser: aichat: show AI model name in sidebar title
Rash419 Apr 8, 2026
fe8de30
browser: aichat: use model name in approval prompts
Rash419 Apr 8, 2026
bcce59f
browser: aichat: add EU AI directive compliance hooks
Rash419 Apr 8, 2026
fb93a87
browser: aichat: show transient hint after inserting content
Rash419 Apr 8, 2026
e5bd53f
browser: aichat: add EU AI Act transparency notice in sidebar
Rash419 Apr 8, 2026
b41b933
browser: calc: show error help button and menu on formula error cells
Rash419 Apr 8, 2026
81bc2bd
aichat: use light tinted background for user message bubbles
Rash419 Apr 9, 2026
9559c50
browser: aichat: focus document after "insert at cursor"
Rash419 Apr 9, 2026
2b767ca
browser: css: increase the saturation of comment marker
Rash419 Apr 9, 2026
324f080
browser: update AI sidebar icons
Rash419 Apr 15, 2026
6f204e4
browser: css: repharse the EU AI directive
Rash419 Apr 15, 2026
536efe6
browser: aichat: limit initial prompt chips to avoid sparkle clipping
Rash419 Apr 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ wsd_headers = \
wsd/ClientSession.hpp \
wsd/ContentSecurityPolicy.hpp \
wsd/ContentType.hpp \
wsd/DocumentToolDescriptions.hpp \
wsd/DocumentBroker.hpp \
wsd/Exceptions.hpp \
wsd/FileServer.hpp \
Expand Down
5 changes: 5 additions & 0 deletions browser/admin/css/adminIntegratorSettings.css
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,9 @@ ul {

.view-input-container input[type='text'],
.view-input-container input[type='password'],
.view-input-container input[type='number'],
.view-input-container select {
box-sizing: border-box;
width: 100%;
max-width: 400px;
padding: 8px 12px;
Expand All @@ -359,6 +361,7 @@ ul {

.view-input-container input[type='text']:focus,
.view-input-container input[type='password']:focus,
.view-input-container input[type='number']:focus,
.view-input-container select:focus {
outline: none;
border-color: var(--settings-btn-primary);
Expand Down Expand Up @@ -548,10 +551,12 @@ ul {

/* AI Settings sub-sections */
.ai-settings-group {
box-sizing: border-box;
border: 1px solid var(--settings-border);
border-radius: 6px;
padding: 16px 20px 8px;
margin: 16px 0;
min-width: 0;
}

.ai-settings-group legend {
Expand Down
54 changes: 51 additions & 3 deletions browser/admin/src/integrator/AdminIntegratorSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ interface ViewSettings {
aiImageProviderAPIKey: string;
aiImageProviderURL: string;
aiImageModel: string;
aiImageSize: string;
aiRequestTimeout: string;
}

interface AIProvider {
Expand Down Expand Up @@ -416,6 +418,8 @@ class SettingIframe {
aiImageProviderAPIKey: _('API Key'),
aiImageProviderURL: _('Base URL'),
aiImageModel: _('Model'),
aiImageSize: _('Image Size'),
aiRequestTimeout: _('Request Timeout (seconds)'),
};
private readonly settingLabels: Record<string, string> = {
lockAccessibilityOn: _('In-document Screen Reader'),
Expand Down Expand Up @@ -1590,9 +1594,9 @@ class SettingIframe {
return;
}

this.generateAISettingsUI(data, settingsContainer);
this.generateZoteroUI(data, settingsContainer);
this.generateDocSigningUI(data, settingsContainer);
this.generateAISettingsUI(data, settingsContainer);
}

private generateZoteroUI(data: ViewSettings, settingsContainer: HTMLElement) {
Expand Down Expand Up @@ -1730,7 +1734,7 @@ class SettingIframe {
aiContainer.id = 'ai-section';
aiContainer.classList.add('section');

aiContainer.appendChild(this.createHeading(_('AI Settings')));
aiContainer.appendChild(this.createHeading(_('AI Assistant')));
const aiDesc = document.createElement('p');
aiDesc.className = 'view-setting-description';
aiDesc.textContent = _(
Expand All @@ -1747,7 +1751,7 @@ class SettingIframe {
aiContainer.appendChild(
this.createSettingsActions(
'ai',
'AI Settings',
'AI Assistant',
'viewsetting.json',
() => {
const defaultSettings = this.getDefaultViewSettings();
Expand All @@ -1759,6 +1763,8 @@ class SettingIframe {
aiImageProviderURL: defaultSettings.aiImageProviderURL,
aiImageProviderAPIKey: defaultSettings.aiImageProviderAPIKey,
aiImageModel: defaultSettings.aiImageModel,
aiImageSize: defaultSettings.aiImageSize,
aiRequestTimeout: defaultSettings.aiRequestTimeout,
};
},
() => this._viewSetting,
Expand Down Expand Up @@ -1802,6 +1808,22 @@ class SettingIframe {
container.appendChild(this.createTextAIGroup(data));
container.appendChild(this.createImageAIGroup(data));

const timeoutBox = this.createViewSettingsTextBox(
'aiRequestTimeout',
data,
false,
true,
);
container.appendChild(timeoutBox);
const timeoutInput = timeoutBox.querySelector(
'#aiRequestTimeout',
) as HTMLInputElement | null;
if (timeoutInput) {
timeoutInput.placeholder = '120';
timeoutInput.type = 'number';
timeoutInput.min = '10';
}

this.attachAISettingsAutoFetch(data, container);
this.attachAIImageSettingsAutoFetch(data, container);

Expand Down Expand Up @@ -2020,6 +2042,30 @@ class SettingIframe {
status.style.display = 'none';
group.appendChild(status);

group.appendChild(
this.createViewSettingsTextBox('aiImageSize', data, false, true),
);
const imageSizeInput = group.querySelector(
'#aiImageSize',
) as HTMLInputElement | null;
if (imageSizeInput) {
imageSizeInput.placeholder = '1024x1024';
imageSizeInput.addEventListener('input', () => {
const val = imageSizeInput.value.trim();
if (val === '' || /^\d+x\d+$/.test(val)) {
const parts = val ? val.split('x') : [];
const valid =
val === '' || (Number(parts[0]) > 0 && Number(parts[1]) > 0);
imageSizeInput.style.borderColor = valid ? '' : 'red';
if (valid) {
data.aiImageSize = val;
}
} else {
imageSizeInput.style.borderColor = 'red';
}
});
}

if (
data.aiImageProviderURL &&
this.getProviderIdFromUrl(data.aiImageProviderURL) === 'custom'
Expand Down Expand Up @@ -2837,6 +2883,8 @@ class SettingIframe {
aiImageProviderAPIKey: '',
aiImageProviderURL: '',
aiImageModel: '',
aiImageSize: '',
aiRequestTimeout: '',
};
}

Expand Down
Loading
Loading