pith-ui 0.1.4 → 0.2.0-app.2
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/AI.md +21 -7
- package/API.md +263 -262
- package/APP-API.md +2023 -0
- package/APP.md +141 -0
- package/README.md +35 -4
- package/dist/app/files.d.ts +68 -0
- package/dist/app/files.d.ts.map +1 -0
- package/dist/app/files.js +177 -0
- package/dist/app/files.js.map +1 -0
- package/dist/app/index.d.ts +57 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +300 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/internal.d.ts +31 -0
- package/dist/app/internal.d.ts.map +1 -0
- package/dist/app/internal.js +2 -0
- package/dist/app/internal.js.map +1 -0
- package/dist/app/resources.d.ts +89 -0
- package/dist/app/resources.d.ts.map +1 -0
- package/dist/app/resources.js +190 -0
- package/dist/app/resources.js.map +1 -0
- package/dist/app/session.d.ts +14 -0
- package/dist/app/session.d.ts.map +1 -0
- package/dist/app/session.js +12 -0
- package/dist/app/session.js.map +1 -0
- package/dist/app/settings.d.ts +109 -0
- package/dist/app/settings.d.ts.map +1 -0
- package/dist/app/settings.js +283 -0
- package/dist/app/settings.js.map +1 -0
- package/dist/app/workspace.d.ts +232 -0
- package/dist/app/workspace.d.ts.map +1 -0
- package/dist/app/workspace.js +413 -0
- package/dist/app/workspace.js.map +1 -0
- package/dist/forms/actions.d.ts +1 -0
- package/dist/forms/actions.d.ts.map +1 -1
- package/dist/forms/actions.js +3 -2
- package/dist/forms/actions.js.map +1 -1
- package/dist/styles.css +4 -1
- package/dist/tasks/runtime.js +2 -2
- package/dist/tasks/runtime.js.map +1 -1
- package/package.json +42 -8
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { adoptAction } from '../foundations.js';
|
|
2
|
+
import { createWorkspaceShell } from '../workspace.js';
|
|
3
|
+
import { createWorkspaceNavigation, createWorkspacePicker, createRenameConversation } from '../navigation/navigation.js';
|
|
4
|
+
import { createContextMenu } from '../navigation/context-menu.js';
|
|
5
|
+
import { createConversationView } from '../content/conversation-view.js';
|
|
6
|
+
import { installConversationReader } from '../content/conversation-reader.js';
|
|
7
|
+
import { createWelcomeView } from '../content/welcome.js';
|
|
8
|
+
import { createPendingMessages, createAttachments, createDropFeedback } from '../composer.js';
|
|
9
|
+
import { createPermissionControl, createFullAccessConfirmation, createTaskFailure } from '../tasks/permission.js';
|
|
10
|
+
import { createApprovalPanel } from '../tasks/approval.js';
|
|
11
|
+
import { createRuntimePanel } from '../tasks/runtime.js';
|
|
12
|
+
import { createCostLedger, createCompletionNotices, createCopyFeedback, historyStatusMarkup } from '../files/systems.js';
|
|
13
|
+
import { createTextEditDialog, createConfirmDialog } from '../primitives.js';
|
|
14
|
+
import { createBranchHistory } from '../forms/history.js';
|
|
15
|
+
export function createWorkspaceScene(env, shell, callbacks, brand) {
|
|
16
|
+
let destroyed = false, activeId = '', query = '', dropPending = false, attachmentsDisabled = false;
|
|
17
|
+
let navigationState = { groups: [], empty: 'workspaces' };
|
|
18
|
+
let navigationConversation = '';
|
|
19
|
+
let composerState = {};
|
|
20
|
+
let availability = {};
|
|
21
|
+
let messageAvailability = {};
|
|
22
|
+
const composerUnavailable = () => destroyed || !!composerState.disabled || !!composerState.readOnly || !!availability.busy || env.hasModal();
|
|
23
|
+
const abort = new AbortController();
|
|
24
|
+
const folds = new Map(), expanded = new Map();
|
|
25
|
+
const imageData = new Map();
|
|
26
|
+
let requestedImages = new WeakSet();
|
|
27
|
+
let currentMessages = [];
|
|
28
|
+
let imageGeneration = 0;
|
|
29
|
+
const imageURLs = new Set();
|
|
30
|
+
const sessions = new Set();
|
|
31
|
+
const fail = (error) => { if (!destroyed)
|
|
32
|
+
callbacks.onError?.(error instanceof Error ? error.message : String(error)); };
|
|
33
|
+
const run = async (action) => {
|
|
34
|
+
if (!action || destroyed)
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
const result = await action();
|
|
38
|
+
if (result && !result.ok)
|
|
39
|
+
throw new Error(result.error);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
fail(error);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const copy = createCopyFeedback({ status: env.part('copy-status'), isDisabled: button => !!availability.busy || (button.hasAttribute('data-message-action') && !!messageAvailability[button.dataset.messageAction]), onError: fail });
|
|
46
|
+
const copyAction = (button, action, label) => copy.copy(button, async () => { const result = await action(); if (result && !result.ok)
|
|
47
|
+
throw new Error(result.error); }, label);
|
|
48
|
+
const messages = createConversationView({ container: env.part('messages'), markdown: id => ({ resolveLocalLink: href => callbacks.resolveLocalLink?.(href, id) ?? null }),
|
|
49
|
+
onAction(action, button) {
|
|
50
|
+
const target = Object.freeze({ ...action });
|
|
51
|
+
if (target.action === 'copy')
|
|
52
|
+
void copyAction(button, () => callbacks.onMessageAction ? callbacks.onMessageAction(target) : env.copyText(currentMessages.find(message => message.id === target.messageId)?.text || ''), 'Message copied');
|
|
53
|
+
else
|
|
54
|
+
void run(() => callbacks.onMessageAction?.(target));
|
|
55
|
+
},
|
|
56
|
+
onCopyCode(text, button) { void copyAction(button, () => callbacks.onCopyCode ? callbacks.onCopyCode(text) : env.copyText(text), 'Code copied'); },
|
|
57
|
+
});
|
|
58
|
+
const reader = installConversationReader(env.part('chat-scroll'), env.part('messages'), env.part('conversation-find'), env.part('back-to-latest'), { isKeyboardBlocked: env.hasModal });
|
|
59
|
+
let logo;
|
|
60
|
+
if (brand.mark) {
|
|
61
|
+
logo = document.createElement('img');
|
|
62
|
+
logo.className = 'pui-app-brand-image';
|
|
63
|
+
logo.src = env.brandMarkSource();
|
|
64
|
+
logo.alt = brand.mark.alt;
|
|
65
|
+
}
|
|
66
|
+
const welcome = createWelcomeView({ container: env.part('welcome'), logo, onAction: action => { void run(() => callbacks.onAction?.(action)); }, onPrompt: text => { if (composerUnavailable())
|
|
67
|
+
return; shell.composer.reset(text); callbacks.onInput?.(text); shell.composer.focus(); } });
|
|
68
|
+
const menu = createContextMenu({ element: env.part('conversation-menu'), onDismiss: () => { menuTarget = undefined; renderNavigation(); }, onAction(item) {
|
|
69
|
+
const target = menuTarget;
|
|
70
|
+
closeMenu();
|
|
71
|
+
if (!target)
|
|
72
|
+
return;
|
|
73
|
+
if (target.kind === 'conversation')
|
|
74
|
+
void run(() => callbacks.onConversationAction?.(item.action, target.id));
|
|
75
|
+
else
|
|
76
|
+
void run(() => callbacks.onWorkspaceAction?.('remove', target.id));
|
|
77
|
+
} });
|
|
78
|
+
let menuTarget;
|
|
79
|
+
const navigation = createWorkspaceNavigation({ groups: [], empty: 'workspaces' }, { element: env.part('history-list'), idPrefix: env.idPrefix,
|
|
80
|
+
onToggle(id) { const group = navigationState.groups.find(group => group.id === id); if (!group)
|
|
81
|
+
return; const open = !(expanded.get(id) ?? group.selected); expanded.set(id, open); if (open)
|
|
82
|
+
callbacks.onSelectWorkspace?.(id); renderNavigation(); },
|
|
83
|
+
onSelect(id) { closeMenu(); shell.setSidebarOpen(false); callbacks.onSelectConversation?.(id); },
|
|
84
|
+
onAction(action) {
|
|
85
|
+
if (action.action === 'add-workspace') {
|
|
86
|
+
void run(() => callbacks.onAction?.('workspace'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (action.action === 'new-conversation') {
|
|
90
|
+
closeMenu();
|
|
91
|
+
callbacks.onNewConversation?.(action.workspaceId);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const target = action.action === 'conversation-menu' ? { kind: 'conversation', id: action.conversationId } : { kind: 'workspace', id: action.workspaceId };
|
|
95
|
+
if (menuTarget?.kind === target.kind && menuTarget.id === target.id) {
|
|
96
|
+
closeMenu();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
closeMenu();
|
|
100
|
+
menuTarget = target;
|
|
101
|
+
menu.open(action.trigger, { label: target.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(target) });
|
|
102
|
+
renderNavigation();
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
function closeMenu() { menu.close(); menuTarget = undefined; renderNavigation(); }
|
|
106
|
+
function menuItems(target) {
|
|
107
|
+
if (target.kind === 'workspace') {
|
|
108
|
+
const group = navigationState.groups.find(group => group.id === target.id);
|
|
109
|
+
return [{ id: 'remove', label: 'Remove workspace', action: 'remove', danger: true, disabled: !!navigationState.disabled || !!availability.busy || availability.workspaces?.includes(target.id) || group?.canRemove === false }];
|
|
110
|
+
}
|
|
111
|
+
const entry = navigationState.groups.flatMap(group => group.children).find(item => item.id === target.id);
|
|
112
|
+
return [['rename', 'Rename'], ['history', 'Conversation branches'], ['export', 'Export Markdown'], ['delete', 'Delete conversation']]
|
|
113
|
+
.filter(([action]) => action !== 'history' || entry?.active)
|
|
114
|
+
.map(([action, label]) => ({ id: action, action, label, danger: action === 'delete', disabled: !!navigationState.disabled || !!availability.busy || availability.conversations?.includes(target.id) || entry?.actions?.[action] === false }));
|
|
115
|
+
}
|
|
116
|
+
function renderNavigation() {
|
|
117
|
+
if (destroyed)
|
|
118
|
+
return;
|
|
119
|
+
const searched = query.trim().toLocaleLowerCase();
|
|
120
|
+
const groups = navigationState.groups.map(group => ({ ...group, menuOpen: menuTarget?.kind === 'workspace' && menuTarget.id === group.id,
|
|
121
|
+
expanded: searched ? true : expanded.get(group.id) ?? group.selected,
|
|
122
|
+
children: group.children.filter(item => !searched || (item.title || '').toLocaleLowerCase().includes(searched)).map(item => {
|
|
123
|
+
let status;
|
|
124
|
+
if (item.status) {
|
|
125
|
+
const template = document.createElement('template');
|
|
126
|
+
template.innerHTML = historyStatusMarkup(item.status.kind);
|
|
127
|
+
status = template.content;
|
|
128
|
+
}
|
|
129
|
+
return { ...item, status, menuOpen: menuTarget?.kind === 'conversation' && menuTarget.id === item.id };
|
|
130
|
+
}),
|
|
131
|
+
})).filter(group => !searched || group.children.length > 0);
|
|
132
|
+
navigation.update({ groups, empty: searched && !groups.length ? 'search' : navigationState.empty, disabled: navigationState.disabled });
|
|
133
|
+
if (menuTarget)
|
|
134
|
+
menu.update({ label: menuTarget.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(menuTarget) });
|
|
135
|
+
}
|
|
136
|
+
const pending = createPendingMessages({ container: env.part('queued-messages'), onAction: callbacks.onQueueAction });
|
|
137
|
+
const attachments = createAttachments({ container: env.part('draft-images'), onRemove: callbacks.onRemoveAttachment, onOpen: env.openImage });
|
|
138
|
+
const drop = createDropFeedback({ container: shell.composer.element });
|
|
139
|
+
const permission = createPermissionControl({ mode: 'ask', description: '' }, { element: env.part('permission-control'), descriptionElement: env.part('permission-description'), onChange: callbacks.onPermissionChange });
|
|
140
|
+
const approval = createApprovalPanel({ approval: null }, { element: env.part('approval'), idPrefix: env.idPrefix, onAction: callbacks.onApproval });
|
|
141
|
+
const failure = createTaskFailure({ visible: false, message: '', advice: '', canContinue: false }, { element: env.part('task-failure'), onContinue: () => { void run(() => callbacks.onAction?.('continue')); }, onSettings: () => { void run(() => callbacks.onAction?.('settings')); }, onDiagnostics: () => { void run(() => callbacks.onAction?.('diagnostics')); } });
|
|
142
|
+
const runtime = createRuntimePanel({ visible: false, summary: '', duration: '', speed: '', inputTokens: '', outputTokens: '', cacheRead: '', cacheWrite: '', contextTokens: '', contextWindow: '', compactions: '', toolFailures: '', recordedCost: '', latestCost: '' }, { element: env.part('run-status'), idPrefix: '' });
|
|
143
|
+
const ledger = createCostLedger({ container: env.part('cost-ledger') });
|
|
144
|
+
const costs = env.part('cost-requests'), runDetails = env.part('run-status');
|
|
145
|
+
const costsChanged = () => callbacks.onCostsChange?.();
|
|
146
|
+
costs.addEventListener('toggle', costsChanged, { signal: abort.signal });
|
|
147
|
+
runDetails.addEventListener('toggle', costsChanged, { signal: abort.signal });
|
|
148
|
+
const notices = createCompletionNotices({ container: env.part('completion-notices'), onOpen: callbacks.onCompletionOpen, onDismiss: callbacks.onCompletionDismiss });
|
|
149
|
+
shell.element.addEventListener('click', event => {
|
|
150
|
+
const target = event.target.closest('[data-action], [data-sdk="compact"], a[data-download-path]');
|
|
151
|
+
if (!target || target instanceof HTMLButtonElement && target.disabled)
|
|
152
|
+
return;
|
|
153
|
+
if (target.matches('a[data-download-path]')) {
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
const link = Object.freeze({ conversationId: target.dataset.downloadConversation, path: target.dataset.downloadPath });
|
|
156
|
+
void run(() => callbacks.onLocalFile?.(link));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const action = target.dataset.sdk === 'compact' ? 'compact' : target.dataset.action;
|
|
160
|
+
if (action && ['workspace', 'resources', 'connections', 'settings'].includes(action) || action === 'compact') {
|
|
161
|
+
event.stopPropagation();
|
|
162
|
+
void run(() => callbacks.onAction?.(action));
|
|
163
|
+
}
|
|
164
|
+
}, { signal: abort.signal });
|
|
165
|
+
const input = shell.composer.input, form = shell.composer.element;
|
|
166
|
+
const attachmentAction = adoptAction(env.part('attach-images'));
|
|
167
|
+
const syncAttachment = () => attachmentAction.update({ disabled: attachmentsDisabled || !!composerState.disabled || !!composerState.readOnly || !!availability.busy });
|
|
168
|
+
input.addEventListener('blur', () => callbacks.onBlur?.(), { signal: abort.signal });
|
|
169
|
+
input.addEventListener('paste', event => { const files = [...event.clipboardData?.items || []].filter(item => item.type.startsWith('image/')).map(item => item.getAsFile()).filter((file) => !!file); if (files.length) {
|
|
170
|
+
event.preventDefault();
|
|
171
|
+
callbacks.onImages?.(files);
|
|
172
|
+
} }, { signal: abort.signal });
|
|
173
|
+
const dropUnavailable = () => composerUnavailable() || dropPending;
|
|
174
|
+
form.addEventListener('dragover', event => { if (dropUnavailable())
|
|
175
|
+
return; event.preventDefault(); drop.update({ active: true }); }, { signal: abort.signal });
|
|
176
|
+
form.addEventListener('dragleave', event => { if (!form.contains(event.relatedTarget))
|
|
177
|
+
drop.update({ active: false }); }, { signal: abort.signal });
|
|
178
|
+
form.addEventListener('drop', event => {
|
|
179
|
+
event.preventDefault();
|
|
180
|
+
drop.update({ active: false });
|
|
181
|
+
if (composerUnavailable())
|
|
182
|
+
return;
|
|
183
|
+
const files = [...event.dataTransfer?.files || []];
|
|
184
|
+
const isImage = (file) => ['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(file.type) || !file.type && /\.(?:png|jpe?g|gif|webp)$/i.test(file.name);
|
|
185
|
+
const images = files.filter(isImage), uris = event.dataTransfer?.getData('text/uri-list') || '';
|
|
186
|
+
if (images.length && !attachmentsDisabled)
|
|
187
|
+
callbacks.onImages?.(images);
|
|
188
|
+
if (dropPending)
|
|
189
|
+
return;
|
|
190
|
+
const hasUnidentifiedFiles = files.some(file => !isImage(file));
|
|
191
|
+
if (uris || hasUnidentifiedFiles)
|
|
192
|
+
callbacks.onDropReferences?.({ paths: [], uris, hasUnidentifiedFiles });
|
|
193
|
+
}, { signal: abort.signal });
|
|
194
|
+
const collectFolds = () => { if (!activeId)
|
|
195
|
+
return; const map = new Map(); for (const item of env.part('messages').querySelectorAll('[data-tool-fold]'))
|
|
196
|
+
map.set(item.dataset.toolFold, item.open); folds.set(activeId, map); };
|
|
197
|
+
const clearImages = () => { imageGeneration++; imageData.clear(); requestedImages = new WeakSet(); for (const url of imageURLs)
|
|
198
|
+
URL.revokeObjectURL(url); imageURLs.clear(); };
|
|
199
|
+
function loadImages() {
|
|
200
|
+
const generation = imageGeneration, id = activeId;
|
|
201
|
+
for (const image of messages.images()) {
|
|
202
|
+
if (requestedImages.has(image))
|
|
203
|
+
continue;
|
|
204
|
+
requestedImages.add(image);
|
|
205
|
+
const target = Object.freeze({ conversationId: id, messageId: image.dataset.messageId, index: Number(image.dataset.imageIndex) });
|
|
206
|
+
const key = JSON.stringify([target.conversationId, target.messageId, target.index]);
|
|
207
|
+
let pending = imageData.get(key);
|
|
208
|
+
if (!pending) {
|
|
209
|
+
pending = Promise.resolve().then(() => callbacks.onLoadImage?.(target)).then(blob => {
|
|
210
|
+
if (!blob || !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(blob.type) || generation !== imageGeneration || destroyed)
|
|
211
|
+
return null;
|
|
212
|
+
const url = URL.createObjectURL(blob);
|
|
213
|
+
imageURLs.add(url);
|
|
214
|
+
return url;
|
|
215
|
+
}).catch(() => null);
|
|
216
|
+
imageData.set(key, pending);
|
|
217
|
+
}
|
|
218
|
+
void pending.then(src => {
|
|
219
|
+
if (!destroyed && generation === imageGeneration && id === activeId) {
|
|
220
|
+
if (!src) {
|
|
221
|
+
requestedImages.delete(image);
|
|
222
|
+
if (imageData.get(key) === pending)
|
|
223
|
+
imageData.delete(key);
|
|
224
|
+
}
|
|
225
|
+
messages.setImageState(image, src ? { status: 'ready', src } : { status: 'unavailable' });
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const editorSlots = new Map();
|
|
231
|
+
function openEditor(kind, state, actions = {}) {
|
|
232
|
+
editorSlots.get(kind)?.close();
|
|
233
|
+
let alive = !destroyed, current = state, savedDraft = state.value, block;
|
|
234
|
+
const release = () => { if (!alive)
|
|
235
|
+
return; alive = false; savedDraft = block.getValue(); block.destroy(); sessions.delete(session); if (editorSlots.get(kind) === session)
|
|
236
|
+
editorSlots.delete(kind); env.notifyClose(actions.onClose); env.changed(); };
|
|
237
|
+
block = createTextEditDialog({ title: state.title, submitLabel: state.submitLabel, label: kind === 'message' ? 'Message' : 'Pending message', onInput: actions.onInput, onSubmit: value => actions.onSubmit?.(value) ?? { ok: true }, onClose: release });
|
|
238
|
+
block.control.rows = kind === 'message' ? 8 : 5;
|
|
239
|
+
shell.element.append(block.element);
|
|
240
|
+
const isOpen = () => alive && !destroyed && block.element.open;
|
|
241
|
+
const session = { isOpen, close: release, destroy: release, read: () => alive ? block.getValue() : savedDraft,
|
|
242
|
+
update(next) { if (isOpen()) {
|
|
243
|
+
current = next;
|
|
244
|
+
block.update(next);
|
|
245
|
+
} },
|
|
246
|
+
reset(value) { if (isOpen()) {
|
|
247
|
+
current = { ...current, value };
|
|
248
|
+
block.open(current);
|
|
249
|
+
} }, focus() { if (isOpen())
|
|
250
|
+
block.focus(); }, fail(message) { if (isOpen())
|
|
251
|
+
block.update({ ...current, error: message }); }, };
|
|
252
|
+
editorSlots.set(kind, session);
|
|
253
|
+
sessions.add(session);
|
|
254
|
+
if (alive) {
|
|
255
|
+
block.update(state);
|
|
256
|
+
block.open(state);
|
|
257
|
+
env.changed();
|
|
258
|
+
}
|
|
259
|
+
else
|
|
260
|
+
block.destroy();
|
|
261
|
+
return session;
|
|
262
|
+
}
|
|
263
|
+
let confirmation;
|
|
264
|
+
function openConfirmation(state, actions) {
|
|
265
|
+
confirmation?.close();
|
|
266
|
+
let alive = !destroyed, current = state, block;
|
|
267
|
+
const message = (value) => { const fragment = document.createDocumentFragment(); fragment.append(value.description.before); if (value.description.subject) {
|
|
268
|
+
const strong = document.createElement('strong');
|
|
269
|
+
strong.textContent = value.description.subject;
|
|
270
|
+
fragment.append(strong);
|
|
271
|
+
} fragment.append(value.description.after || ''); return fragment; };
|
|
272
|
+
const release = () => { if (!alive)
|
|
273
|
+
return; alive = false; block.destroy(); sessions.delete(session); env.notifyClose(actions.onClose); env.changed(); };
|
|
274
|
+
const presentation = (value) => ({ title: value.title, hint: value.hint, error: value.error, disabled: value.disabled, message: message(value), confirmLabel: value.action });
|
|
275
|
+
block = createConfirmDialog({ ...presentation(state), onConfirm: actions.onConfirm, onClose: release });
|
|
276
|
+
shell.element.append(block.element);
|
|
277
|
+
const session = { isOpen: () => alive && !destroyed && block.element.open, close: release, destroy: release,
|
|
278
|
+
update(next) { if (!session.isOpen())
|
|
279
|
+
return; current = next; block.update(presentation(next)); }, fail(error) { session.update({ ...current, error }); },
|
|
280
|
+
};
|
|
281
|
+
confirmation = session;
|
|
282
|
+
sessions.add(session);
|
|
283
|
+
if (alive) {
|
|
284
|
+
block.open();
|
|
285
|
+
env.changed();
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
block.destroy();
|
|
289
|
+
return session;
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
updateShell: state => { if (!destroyed)
|
|
293
|
+
shell.update(state); },
|
|
294
|
+
updateComposer(state) { if (!destroyed) {
|
|
295
|
+
composerState = state;
|
|
296
|
+
shell.composer.update(state);
|
|
297
|
+
syncAttachment();
|
|
298
|
+
drop.update({ active: false, disabled: dropUnavailable() });
|
|
299
|
+
} },
|
|
300
|
+
readDraft: () => shell.composer.getValue(), resetDraft: text => { if (!destroyed)
|
|
301
|
+
shell.composer.reset(text); }, focusComposer: shell.composer.focus,
|
|
302
|
+
pickImages() { if (!composerUnavailable() && !attachmentsDisabled)
|
|
303
|
+
shell.composer.pickImages(); },
|
|
304
|
+
insertReferences(paths) {
|
|
305
|
+
if (dropUnavailable() || !paths.length)
|
|
306
|
+
return;
|
|
307
|
+
const reference = paths.map(path => { const ticks = Math.max(0, ...[...path.matchAll(/`+/g)].map(match => match[0].length)) + 1; const delimiter = '`'.repeat(ticks); return delimiter + (/^`|`$|^ | $/.test(path) && !/^ +$/.test(path) ? ' ' + path + ' ' : path) + delimiter; }).join(' ');
|
|
308
|
+
const value = input.value, start = input.selectionStart, end = input.selectionEnd;
|
|
309
|
+
const before = value.slice(0, start), after = value.slice(end), inserted = (before && !/\s$/.test(before) ? ' ' : '') + reference + (after && !/^\s/.test(after) ? ' ' : '');
|
|
310
|
+
shell.composer.reset(before + inserted + after);
|
|
311
|
+
input.setSelectionRange(before.length + inserted.length, before.length + inserted.length);
|
|
312
|
+
shell.composer.focus();
|
|
313
|
+
callbacks.onInput?.(input.value);
|
|
314
|
+
},
|
|
315
|
+
receiveNativeDrop({ paths, x, y }) { if (dropUnavailable() || !Number.isFinite(x) || !Number.isFinite(y) || !form.contains(document.elementFromPoint(x, y)))
|
|
316
|
+
return; callbacks.onDropReferences?.({ paths: [...paths], hasUnidentifiedFiles: false }); },
|
|
317
|
+
setDropPending(value) { dropPending = value; if (value)
|
|
318
|
+
drop.update({ active: false }); },
|
|
319
|
+
updateNavigation(state) { navigationState = state; const active = state.groups.flatMap(group => group.children.filter(item => item.active).map(item => ({ workspace: group.id, conversation: item.id })))[0]; if (active && active.conversation !== navigationConversation)
|
|
320
|
+
expanded.set(active.workspace, true); navigationConversation = active?.conversation || ''; const ids = new Set(state.groups.map(group => group.id)); for (const id of expanded.keys())
|
|
321
|
+
if (!ids.has(id))
|
|
322
|
+
expanded.delete(id); if (menuTarget && !state.groups.some(group => menuTarget.kind === 'workspace' ? group.id === menuTarget.id : group.children.some(item => item.id === menuTarget.id)))
|
|
323
|
+
closeMenu(); renderNavigation(); },
|
|
324
|
+
search(value) { query = value; renderNavigation(); callbacks.onSearch?.(value); }, closeNavigationMenu: closeMenu, setSidebarOpen: shell.setSidebarOpen,
|
|
325
|
+
updateConversation(state) {
|
|
326
|
+
if (destroyed)
|
|
327
|
+
return;
|
|
328
|
+
collectFolds();
|
|
329
|
+
if (state.id !== activeId) {
|
|
330
|
+
env.closeImage();
|
|
331
|
+
clearImages();
|
|
332
|
+
costs.open = false;
|
|
333
|
+
ledger.clear();
|
|
334
|
+
}
|
|
335
|
+
activeId = state.id;
|
|
336
|
+
currentMessages = state.messages;
|
|
337
|
+
reader.beforeRender(state.id);
|
|
338
|
+
env.part('welcome').hidden = state.messages.length > 0;
|
|
339
|
+
env.part('messages').hidden = !state.messages.length;
|
|
340
|
+
messages.update({ ...state, folds: folds.get(state.id) });
|
|
341
|
+
loadImages();
|
|
342
|
+
reader.afterRender();
|
|
343
|
+
},
|
|
344
|
+
updateMessageAvailability(state) { messageAvailability = state; messages.updateActionAvailability(state); },
|
|
345
|
+
pruneConversations(ids) { const keep = new Set(ids); for (const id of folds.keys())
|
|
346
|
+
if (!keep.has(id))
|
|
347
|
+
folds.delete(id); reader.prune([...ids]); },
|
|
348
|
+
updateWelcome(state) { if (destroyed)
|
|
349
|
+
return; if (logo)
|
|
350
|
+
logo.src = env.brandMarkSource(); welcome.update(state); }, followLatest: reader.followLatest, openFind: reader.openFind, closeFind: reader.closeFind,
|
|
351
|
+
updatePending: pending.update,
|
|
352
|
+
updateAttachments(state) { if (!destroyed) {
|
|
353
|
+
attachmentsDisabled = !!state.disabled;
|
|
354
|
+
attachments.update(state);
|
|
355
|
+
syncAttachment();
|
|
356
|
+
} },
|
|
357
|
+
updateImageGuidance(message) { const element = env.part('image-guidance'); element.textContent = message; element.hidden = !message; },
|
|
358
|
+
updatePermission: permission.update, updateApproval: approval.update, updateFailure: failure.update, updateRuntime: runtime.update, updateTiming: runtime.updateTiming, updateNotices: notices.update,
|
|
359
|
+
updateAvailability(state) { if (destroyed)
|
|
360
|
+
return; availability = state; const conversations = new Set(state.conversations), workspaces = new Set(state.workspaces); shell.updateActionAvailability(scope => !!state.busy || (scope.kind === 'global' ? !!state.global : scope.kind === 'conversation' ? conversations.has(scope.id || '') : scope.kind === 'workspace' ? workspaces.has(scope.id || '') : !!state.active)); syncAttachment(); renderNavigation(); },
|
|
361
|
+
readCosts: () => ({ open: costs.open, runtimeOpen: runDetails.open }),
|
|
362
|
+
updateCosts(state) { if (destroyed)
|
|
363
|
+
return; costs.hidden = !state.visible; if (state.error)
|
|
364
|
+
ledger.setError(state.error);
|
|
365
|
+
else if (state.loading)
|
|
366
|
+
ledger.loading();
|
|
367
|
+
else if (state.report)
|
|
368
|
+
ledger.update(state.report); },
|
|
369
|
+
resetCosts() { costs.open = false; ledger.clear(); },
|
|
370
|
+
openMessageEditor: (state, actions) => openEditor('message', state, actions), openQueueEditor: (state, actions) => openEditor('queue', state, actions), openConfirmation,
|
|
371
|
+
openWorkspacePicker(state, actions = {}) {
|
|
372
|
+
let surface;
|
|
373
|
+
const block = createWorkspacePicker(state, { idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onPick: actions.onPick, onSelect: actions.onSelect, onSubmitted: () => surface.close(), onCancel: () => surface.close() });
|
|
374
|
+
surface = env.openDialog('workspace', block, actions.onClose);
|
|
375
|
+
block.focus();
|
|
376
|
+
return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) { if (surface.isOpen())
|
|
377
|
+
block.update(next); }, reset(path) { if (surface.isOpen())
|
|
378
|
+
block.reset(path); }, focus() { if (surface.isOpen())
|
|
379
|
+
block.focus(); } };
|
|
380
|
+
},
|
|
381
|
+
openRename(state, actions = {}) {
|
|
382
|
+
let surface;
|
|
383
|
+
const block = createRenameConversation(state, { idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onSubmitted: () => surface.close(), onCancel: () => surface.close() });
|
|
384
|
+
surface = env.openDialog('rename', block, actions.onClose);
|
|
385
|
+
block.focus();
|
|
386
|
+
return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) { if (surface.isOpen())
|
|
387
|
+
block.update(next); }, reset(next) { if (surface.isOpen())
|
|
388
|
+
block.reset(next); }, focus() { if (surface.isOpen())
|
|
389
|
+
block.focus(); } };
|
|
390
|
+
},
|
|
391
|
+
openFullAccess(state, actions) {
|
|
392
|
+
let surface;
|
|
393
|
+
const block = createFullAccessConfirmation(state, { idPrefix: env.idPrefix, onConfirm: async () => { const result = await actions.onConfirm(); if (result.ok && surface.isOpen())
|
|
394
|
+
surface.close(); return result; } });
|
|
395
|
+
surface = env.openDialog('permissions', block, actions.onClose);
|
|
396
|
+
return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) { if (surface.isOpen())
|
|
397
|
+
block.update(next); } };
|
|
398
|
+
},
|
|
399
|
+
openHistory(state, actions = {}) {
|
|
400
|
+
let surface;
|
|
401
|
+
const block = createBranchHistory(state, { onContinue: async (id) => { const result = await actions.onContinue?.(id); if (result && !result.ok)
|
|
402
|
+
throw new Error(result.error); if (surface.isOpen())
|
|
403
|
+
surface.close(); } });
|
|
404
|
+
surface = env.openFeature('Conversation branches', block, actions.onClose);
|
|
405
|
+
return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) { if (surface.isOpen())
|
|
406
|
+
block.update(next); } };
|
|
407
|
+
},
|
|
408
|
+
destroy() { if (destroyed)
|
|
409
|
+
return; destroyed = true; abort.abort(); for (const session of [...sessions])
|
|
410
|
+
session.close(); sessions.clear(); clearImages(); folds.clear(); expanded.clear(); menu.destroy(); navigation.destroy(); copy.destroy(); reader.destroy(); messages.destroy(); welcome.destroy(); pending.destroy(); attachments.destroy(); attachmentAction.destroy(); drop.destroy(); permission.destroy(); approval.destroy(); failure.destroy(); runtime.destroy(); ledger.destroy(); notices.destroy(); },
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/app/workspace.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ActionResult} from '../core.js';\nimport {adoptAction} from '../foundations.js';\nimport {createWorkspaceShell, type ComposerViewState, type WorkspaceShellState} from '../workspace.js';\nimport {createWorkspaceNavigation, createWorkspacePicker, createRenameConversation, type NavigationWorkspace, type WorkspacePickerState, type RenameConversationState, type RenameConversationDraft} from '../navigation/navigation.js';\nimport {createContextMenu, type ContextMenuItem} from '../navigation/context-menu.js';\nimport {createConversationView, type ConversationMessage, type ConversationAction, type ConversationActionAvailability} from '../content/conversation-view.js';\nimport {installConversationReader} from '../content/conversation-reader.js';\nimport {createWelcomeView, type WelcomeState} from '../content/welcome.js';\nimport type {LocalContentLink} from '../content/markdown.js';\nimport {createPendingMessages, createAttachments, createDropFeedback, type PendingMessagesState, type AttachmentsState} from '../composer.js';\nimport {createPermissionControl, createFullAccessConfirmation, createTaskFailure, type PermissionControlState, type FullAccessState, type TaskFailureState} from '../tasks/permission.js';\nimport {createApprovalPanel, type ApprovalPanelState} from '../tasks/approval.js';\nimport {createRuntimePanel, type RuntimePanelState} from '../tasks/runtime.js';\nimport {createCostLedger, createCompletionNotices, createCopyFeedback, historyStatusMarkup, type CostLedgerState, type CompletionNoticeDisplay} from '../files/systems.js';\nimport {createTextEditDialog, createConfirmDialog, type TextEditState, type TextEditBlock, type ConfirmBlock} from '../primitives.js';\nimport {createBranchHistory, type BranchHistoryState} from '../forms/history.js';\nimport type {AppEnvironment, HostResult, OwnedSurface} from './internal.js';\nimport type {ApplicationBrand} from './index.js';\n\nexport type {ComposerViewState, WorkspaceShellState, WelcomeState, PendingMessagesState, AttachmentsState, PermissionControlState, FullAccessState, TaskFailureState, ApprovalPanelState, RuntimePanelState, CostLedgerState, CompletionNoticeDisplay, ConversationMessage, ConversationAction, ConversationActionAvailability, WorkspacePickerState, RenameConversationState, RenameConversationDraft, BranchHistoryState};\nexport interface NavigationStatus {readonly kind: 'approval' | 'running' | 'unread' | 'idle'}\nexport interface ApplicationConversation {\n readonly id: string; readonly title?: string; readonly active: boolean; readonly status?: NavigationStatus;\n readonly actions?: {readonly rename?: boolean; readonly history?: boolean; readonly export?: boolean; readonly delete?: boolean};\n}\nexport interface ApplicationWorkspace {\n readonly id: string; readonly name: string; readonly path: string;\n readonly selected: boolean; readonly children: readonly ApplicationConversation[];\n readonly canRemove?: boolean;\n}\nexport interface NavigationState {readonly groups: readonly ApplicationWorkspace[]; readonly empty: 'workspaces' | 'search' | null; readonly disabled?: boolean}\nexport interface ConversationState {readonly id: string; readonly messages: readonly ConversationMessage[]; readonly working: boolean}\nexport interface ImageTarget {readonly conversationId: string; readonly messageId: string; readonly index: number}\nexport type WorkspaceAction = 'workspace' | 'resources' | 'connections' | 'settings' | 'model' | 'compact' | 'continue' | 'diagnostics';\nexport type ConversationNavigationAction = 'rename' | 'history' | 'export' | 'delete';\nexport interface WorkspaceCallbacks {\n onAction?(action: WorkspaceAction): HostResult;\n onSubmit?(text: string): HostResult;\n onStop?(): HostResult;\n onInput?(text: string): void;\n onBlur?(): void;\n onImages?(files: File[]): void;\n onThinkingChange?(value: string): void;\n onBusyAction?(key: string): void;\n onSearch?(query: string): void;\n onSelectConversation?(id: string): void;\n onSelectWorkspace?(id: string): void;\n onNewConversation?(workspaceId: string): void;\n onConversationAction?(action: ConversationNavigationAction, id: string): HostResult;\n onWorkspaceAction?(action: 'remove', id: string): HostResult;\n onMessageAction?(action: ConversationAction): HostResult;\n onCopyCode?(text: string): HostResult;\n resolveLocalLink?(href: string, conversationId: string): LocalContentLink | null;\n onLocalFile?(target: LocalContentLink): HostResult;\n onLoadImage?(target: ImageTarget): Promise<Blob | null>;\n onQueueAction?(action: 'edit' | 'delete' | 'steer', id: string): void;\n onRemoveAttachment?(id: string): void;\n onDropReferences?(input: {readonly paths: readonly string[]; readonly uris?: string; readonly hasUnidentifiedFiles: boolean}): void;\n onPermissionChange?(value: string): void;\n onApproval?(id: string, action: 'deny' | 'always' | 'allow'): void;\n onCompletionOpen?(id: string): void;\n onCompletionDismiss?(runId: string): void;\n onCostsChange?(): void;\n onError?(message: string): void;\n}\nexport interface SceneSession<State> {\n update(state: Readonly<State>): void;\n close(): void;\n isOpen(): boolean;\n fail(message: string): void;\n destroy(): void;\n}\nexport interface MessageEditorState {\n readonly title: string; readonly value: string; readonly description?: string; readonly note?: string;\n readonly submitLabel?: string; readonly disabled?: boolean; readonly pending?: boolean;\n readonly inputDisabled?: boolean; readonly error?: string;\n}\nexport interface MessageEditorSession extends SceneSession<MessageEditorState> {read(): string; reset(value: string): void; focus(): void}\nexport interface ConfirmationState {\n readonly title: string; readonly action: string;\n readonly description: {readonly before: string; readonly subject?: string; readonly after?: string};\n readonly hint?: string; readonly error?: string; readonly disabled?: boolean;\n}\nexport interface WorkspaceAvailability {\n /** A host mutation blocks actions in every scope. A running task is scoped below. */\n readonly busy?: boolean;\n /** Global actions only; unrelated inactive targets keep their own availability. */\n readonly global?: boolean;\n readonly active?: boolean; readonly conversations?: readonly string[]; readonly workspaces?: readonly string[];\n}\nexport interface WorkspaceScene {\n updateShell(state: Readonly<WorkspaceShellState>): void;\n updateComposer(state: Readonly<ComposerViewState>): void;\n readDraft(): string;\n resetDraft(text: string): void;\n focusComposer(): void;\n pickImages(): void;\n insertReferences(paths: readonly string[]): void;\n receiveNativeDrop(input: {readonly paths: readonly string[]; readonly x: number; readonly y: number}): void;\n setDropPending(pending: boolean): void;\n updateNavigation(state: Readonly<NavigationState>): void;\n search(query: string): void;\n closeNavigationMenu(): void;\n setSidebarOpen(open: boolean): void;\n updateConversation(state: Readonly<ConversationState>): void;\n updateMessageAvailability(state: Readonly<ConversationActionAvailability>): void;\n pruneConversations(ids: readonly string[]): void;\n updateWelcome(state: Readonly<WelcomeState>): void;\n followLatest(): void;\n openFind(): void;\n closeFind(): void;\n updatePending(state: Readonly<PendingMessagesState>): void;\n updateAttachments(state: Readonly<AttachmentsState>): void;\n updateImageGuidance(message: string): void;\n updatePermission(state: Readonly<PermissionControlState>): void;\n updateApproval(state: Readonly<ApprovalPanelState>): void;\n updateFailure(state: Readonly<TaskFailureState>): void;\n updateRuntime(state: Readonly<RuntimePanelState>): void;\n updateTiming(value: {summary: string; duration: string; speed: string}): void;\n updateNotices(state: readonly CompletionNoticeDisplay[]): void;\n updateAvailability(state: Readonly<WorkspaceAvailability>): void;\n readCosts(): {readonly open: boolean; readonly runtimeOpen: boolean};\n updateCosts(state: {readonly visible: boolean; readonly report?: CostLedgerState; readonly loading?: boolean; readonly error?: string}): void;\n resetCosts(): void;\n openMessageEditor(state: MessageEditorState, callbacks?: {onSubmit?(text: string): ActionResult | Promise<ActionResult>; onInput?(text: string): void; onClose?(): void}): MessageEditorSession;\n openQueueEditor(state: MessageEditorState, callbacks?: {onSubmit?(text: string): ActionResult | Promise<ActionResult>; onInput?(text: string): void; onClose?(): void}): MessageEditorSession;\n openConfirmation(state: ConfirmationState, callbacks: {onConfirm(): ActionResult | Promise<ActionResult>; onClose?(): void}): SceneSession<ConfirmationState>;\n openWorkspacePicker(state: WorkspacePickerState, callbacks?: {onSubmit?(path: string): ActionResult | Promise<ActionResult>; onPick?(): Promise<{path?: string; error?: string}>; onSelect?(id: string): void; onClose?(): void}): SceneSession<WorkspacePickerState> & {read(): {path: string}; reset(path?: string): void; focus(): void};\n openRename(state: RenameConversationState, callbacks?: {onSubmit?(draft: RenameConversationDraft): ActionResult | Promise<ActionResult>; onClose?(): void}): SceneSession<RenameConversationState> & {read(): RenameConversationDraft; reset(state: RenameConversationState): void; focus(): void};\n openFullAccess(state: FullAccessState, callbacks: {onConfirm(): ActionResult | Promise<ActionResult>; onClose?(): void}): SceneSession<FullAccessState>;\n openHistory(state: BranchHistoryState, callbacks?: {onContinue?(nodeId: string): HostResult; onClose?(): void}): SceneSession<BranchHistoryState>;\n destroy(): void;\n}\n\nexport function createWorkspaceScene(env: AppEnvironment, shell: ReturnType<typeof createWorkspaceShell>, callbacks: WorkspaceCallbacks, brand: ApplicationBrand): WorkspaceScene {\n let destroyed = false, activeId = '', query = '', dropPending = false, attachmentsDisabled = false;\n let navigationState: NavigationState = {groups: [], empty: 'workspaces'};\n let navigationConversation = '';\n let composerState: ComposerViewState = {};\n let availability: WorkspaceAvailability = {};\n let messageAvailability: ConversationActionAvailability = {};\n const composerUnavailable = () => destroyed || !!composerState.disabled || !!composerState.readOnly || !!availability.busy || env.hasModal();\n const abort = new AbortController();\n const folds = new Map<string, Map<string, boolean>>(), expanded = new Map<string, boolean>();\n const imageData = new Map<string, Promise<string | null>>();\n let requestedImages = new WeakSet<HTMLImageElement>();\n let currentMessages: readonly ConversationMessage[] = [];\n let imageGeneration = 0;\n const imageURLs = new Set<string>();\n const sessions = new Set<{close(): void}>();\n const fail = (error: unknown) => {if (!destroyed) callbacks.onError?.(error instanceof Error ? error.message : String(error));};\n const run = async (action: (() => HostResult) | undefined): Promise<void> => {\n if (!action || destroyed) return;\n try {const result = await action(); if (result && !result.ok) throw new Error(result.error);}\n catch (error) {fail(error);}\n };\n const copy = createCopyFeedback({status: env.part('copy-status'), isDisabled: button => !!availability.busy || (button.hasAttribute('data-message-action') && !!messageAvailability[button.dataset.messageAction as ConversationAction['action']]), onError: fail});\n const copyAction = (button: HTMLButtonElement, action: () => HostResult, label: string) => copy.copy(button, async () => {const result = await action(); if (result && !result.ok) throw new Error(result.error);}, label);\n const messages = createConversationView({container: env.part('messages'), markdown: id => ({resolveLocalLink: href => callbacks.resolveLocalLink?.(href, id) ?? null}),\n onAction(action, button) {\n const target = Object.freeze({...action});\n if (target.action === 'copy') void copyAction(button, () => callbacks.onMessageAction ? callbacks.onMessageAction(target) : env.copyText(currentMessages.find(message => message.id === target.messageId)?.text || ''), 'Message copied');\n else void run(() => callbacks.onMessageAction?.(target));\n },\n onCopyCode(text, button) {void copyAction(button, () => callbacks.onCopyCode ? callbacks.onCopyCode(text) : env.copyText(text), 'Code copied');},\n });\n const reader = installConversationReader(env.part('chat-scroll'), env.part('messages'), env.part('conversation-find'), env.part<HTMLButtonElement>('back-to-latest'), {isKeyboardBlocked: env.hasModal});\n let logo: HTMLImageElement | undefined;\n if (brand.mark) {logo = document.createElement('img'); logo.className = 'pui-app-brand-image'; logo.src = env.brandMarkSource(); logo.alt = brand.mark.alt;}\n const welcome = createWelcomeView({container: env.part('welcome'), logo, onAction: action => {void run(() => callbacks.onAction?.(action));}, onPrompt: text => {if (composerUnavailable()) return; shell.composer.reset(text); callbacks.onInput?.(text); shell.composer.focus();}});\n const menu = createContextMenu({element: env.part('conversation-menu'), onDismiss: () => {menuTarget = undefined; renderNavigation();}, onAction(item) {\n const target = menuTarget; closeMenu(); if (!target) return;\n if (target.kind === 'conversation') void run(() => callbacks.onConversationAction?.(item.action as ConversationNavigationAction, target.id));\n else void run(() => callbacks.onWorkspaceAction?.('remove', target.id));\n }});\n let menuTarget: {kind: 'workspace' | 'conversation'; id: string} | undefined;\n const navigation = createWorkspaceNavigation({groups: [], empty: 'workspaces'}, {element: env.part('history-list'), idPrefix: env.idPrefix,\n onToggle(id) {const group = navigationState.groups.find(group => group.id === id); if (!group) return; const open = !(expanded.get(id) ?? group.selected); expanded.set(id, open); if (open) callbacks.onSelectWorkspace?.(id); renderNavigation();},\n onSelect(id) {closeMenu(); shell.setSidebarOpen(false); callbacks.onSelectConversation?.(id);},\n onAction(action) {\n if (action.action === 'add-workspace') {void run(() => callbacks.onAction?.('workspace')); return;}\n if (action.action === 'new-conversation') {closeMenu(); callbacks.onNewConversation?.(action.workspaceId); return;}\n const target = action.action === 'conversation-menu' ? {kind: 'conversation' as const, id: action.conversationId} : {kind: 'workspace' as const, id: action.workspaceId};\n if (menuTarget?.kind === target.kind && menuTarget.id === target.id) {closeMenu(); return;}\n closeMenu(); menuTarget = target;\n menu.open(action.trigger, {label: target.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(target)}); renderNavigation();\n },\n });\n function closeMenu(): void {menu.close(); menuTarget = undefined; renderNavigation();}\n function menuItems(target: {kind: 'workspace' | 'conversation'; id: string}): ContextMenuItem[] {\n if (target.kind === 'workspace') {\n const group = navigationState.groups.find(group => group.id === target.id);\n return [{id: 'remove', label: 'Remove workspace', action: 'remove', danger: true, disabled: !!navigationState.disabled || !!availability.busy || availability.workspaces?.includes(target.id) || group?.canRemove === false}];\n }\n const entry = navigationState.groups.flatMap(group => group.children).find(item => item.id === target.id);\n return ([['rename', 'Rename'], ['history', 'Conversation branches'], ['export', 'Export Markdown'], ['delete', 'Delete conversation']] as const)\n .filter(([action]) => action !== 'history' || entry?.active)\n .map(([action, label]) => ({id: action, action, label, danger: action === 'delete', disabled: !!navigationState.disabled || !!availability.busy || availability.conversations?.includes(target.id) || entry?.actions?.[action] === false}));\n }\n function renderNavigation(): void {\n if (destroyed) return;\n const searched = query.trim().toLocaleLowerCase();\n const groups: NavigationWorkspace[] = navigationState.groups.map(group => ({...group, menuOpen: menuTarget?.kind === 'workspace' && menuTarget.id === group.id,\n expanded: searched ? true : expanded.get(group.id) ?? group.selected,\n children: group.children.filter(item => !searched || (item.title || '').toLocaleLowerCase().includes(searched)).map(item => {\n let status: Node | undefined;\n if (item.status) {const template = document.createElement('template'); template.innerHTML = historyStatusMarkup(item.status.kind); status = template.content;}\n return {...item, status, menuOpen: menuTarget?.kind === 'conversation' && menuTarget.id === item.id};\n }),\n })).filter(group => !searched || group.children.length > 0);\n navigation.update({groups, empty: searched && !groups.length ? 'search' : navigationState.empty, disabled: navigationState.disabled});\n if (menuTarget) menu.update({label: menuTarget.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(menuTarget)});\n }\n const pending = createPendingMessages({container: env.part('queued-messages'), onAction: callbacks.onQueueAction});\n const attachments = createAttachments({container: env.part('draft-images'), onRemove: callbacks.onRemoveAttachment, onOpen: env.openImage});\n const drop = createDropFeedback({container: shell.composer.element});\n const permission = createPermissionControl({mode: 'ask', description: ''}, {element: env.part('permission-control'), descriptionElement: env.part('permission-description'), onChange: callbacks.onPermissionChange});\n const approval = createApprovalPanel({approval: null}, {element: env.part('approval'), idPrefix: env.idPrefix, onAction: callbacks.onApproval});\n const failure = createTaskFailure({visible: false, message: '', advice: '', canContinue: false}, {element: env.part('task-failure'), onContinue: () => {void run(() => callbacks.onAction?.('continue'));}, onSettings: () => {void run(() => callbacks.onAction?.('settings'));}, onDiagnostics: () => {void run(() => callbacks.onAction?.('diagnostics'));}});\n const runtime = createRuntimePanel({visible: false, summary: '', duration: '', speed: '', inputTokens: '', outputTokens: '', cacheRead: '', cacheWrite: '', contextTokens: '', contextWindow: '', compactions: '', toolFailures: '', recordedCost: '', latestCost: ''}, {element: env.part('run-status'), idPrefix: ''});\n const ledger = createCostLedger({container: env.part('cost-ledger')});\n const costs = env.part<HTMLDetailsElement>('cost-requests'), runDetails = env.part<HTMLDetailsElement>('run-status');\n const costsChanged = () => callbacks.onCostsChange?.(); costs.addEventListener('toggle', costsChanged, {signal: abort.signal}); runDetails.addEventListener('toggle', costsChanged, {signal: abort.signal});\n const notices = createCompletionNotices({container: env.part('completion-notices'), onOpen: callbacks.onCompletionOpen, onDismiss: callbacks.onCompletionDismiss});\n shell.element.addEventListener('click', event => {\n const target = (event.target as Element).closest<HTMLElement>('[data-action], [data-sdk=\"compact\"], a[data-download-path]');\n if (!target || target instanceof HTMLButtonElement && target.disabled) return;\n if (target.matches('a[data-download-path]')) {event.preventDefault(); const link = Object.freeze({conversationId: target.dataset.downloadConversation!, path: target.dataset.downloadPath!}); void run(() => callbacks.onLocalFile?.(link)); return;}\n const action = target.dataset.sdk === 'compact' ? 'compact' : target.dataset.action;\n if (action && ['workspace', 'resources', 'connections', 'settings'].includes(action) || action === 'compact') {event.stopPropagation(); void run(() => callbacks.onAction?.(action as WorkspaceAction));}\n }, {signal: abort.signal});\n const input = shell.composer.input, form = shell.composer.element;\n const attachmentAction = adoptAction(env.part<HTMLButtonElement>('attach-images'));\n const syncAttachment = () => attachmentAction.update({disabled: attachmentsDisabled || !!composerState.disabled || !!composerState.readOnly || !!availability.busy});\n input.addEventListener('blur', () => callbacks.onBlur?.(), {signal: abort.signal});\n input.addEventListener('paste', event => {const files = [...event.clipboardData?.items || []].filter(item => item.type.startsWith('image/')).map(item => item.getAsFile()).filter((file): file is File => !!file); if (files.length) {event.preventDefault(); callbacks.onImages?.(files);}}, {signal: abort.signal});\n const dropUnavailable = () => composerUnavailable() || dropPending;\n form.addEventListener('dragover', event => {if (dropUnavailable()) return; event.preventDefault(); drop.update({active: true});}, {signal: abort.signal});\n form.addEventListener('dragleave', event => {if (!form.contains(event.relatedTarget as Node | null)) drop.update({active: false});}, {signal: abort.signal});\n form.addEventListener('drop', event => {\n event.preventDefault(); drop.update({active: false}); if (composerUnavailable()) return;\n const files = [...event.dataTransfer?.files || []];\n const isImage = (file: File) => ['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(file.type) || !file.type && /\\.(?:png|jpe?g|gif|webp)$/i.test(file.name);\n const images = files.filter(isImage), uris = event.dataTransfer?.getData('text/uri-list') || '';\n if (images.length && !attachmentsDisabled) callbacks.onImages?.(images);\n if (dropPending) return;\n const hasUnidentifiedFiles = files.some(file => !isImage(file));\n if (uris || hasUnidentifiedFiles) callbacks.onDropReferences?.({paths: [], uris, hasUnidentifiedFiles});\n }, {signal: abort.signal});\n const collectFolds = () => {if (!activeId) return; const map = new Map<string, boolean>(); for (const item of env.part('messages').querySelectorAll<HTMLDetailsElement>('[data-tool-fold]')) map.set(item.dataset.toolFold!, item.open); folds.set(activeId, map);};\n const clearImages = () => {imageGeneration++; imageData.clear(); requestedImages = new WeakSet(); for (const url of imageURLs) URL.revokeObjectURL(url); imageURLs.clear();};\n function loadImages(): void {\n const generation = imageGeneration, id = activeId;\n for (const image of messages.images()) {\n if (requestedImages.has(image)) continue;\n requestedImages.add(image);\n const target: ImageTarget = Object.freeze({conversationId: id, messageId: image.dataset.messageId!, index: Number(image.dataset.imageIndex)});\n const key = JSON.stringify([target.conversationId, target.messageId, target.index]);\n let pending = imageData.get(key);\n if (!pending) {\n pending = Promise.resolve().then(() => callbacks.onLoadImage?.(target)).then(blob => {\n if (!blob || !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(blob.type) || generation !== imageGeneration || destroyed) return null;\n const url = URL.createObjectURL(blob); imageURLs.add(url); return url;\n }).catch(() => null); imageData.set(key, pending);\n }\n void pending.then(src => {\n if (!destroyed && generation === imageGeneration && id === activeId) {\n if (!src) {requestedImages.delete(image); if (imageData.get(key) === pending) imageData.delete(key);}\n messages.setImageState(image, src ? {status: 'ready', src} : {status: 'unavailable'});\n }\n });\n }\n }\n const editorSlots = new Map<'message' | 'queue', {close(): void}>();\n function openEditor(kind: 'message' | 'queue', state: MessageEditorState, actions: Parameters<WorkspaceScene['openMessageEditor']>[1] = {}): MessageEditorSession {\n editorSlots.get(kind)?.close();\n let alive = !destroyed, current = state, savedDraft = state.value, block: TextEditBlock;\n const release = () => {if (!alive) return; alive = false; savedDraft = block.getValue(); block.destroy(); sessions.delete(session); if (editorSlots.get(kind) === session) editorSlots.delete(kind); env.notifyClose(actions.onClose); env.changed();};\n block = createTextEditDialog({title: state.title, submitLabel: state.submitLabel, label: kind === 'message' ? 'Message' : 'Pending message', onInput: actions.onInput, onSubmit: value => actions.onSubmit?.(value) ?? {ok: true}, onClose: release});\n block.control.rows = kind === 'message' ? 8 : 5;\n shell.element.append(block.element);\n const isOpen = () => alive && !destroyed && block.element.open;\n const session: MessageEditorSession = {isOpen, close: release, destroy: release, read: () => alive ? block.getValue() : savedDraft,\n update(next) {if (isOpen()) {current = next; block.update(next as TextEditState);}},\n reset(value) {if (isOpen()) {current = {...current, value}; block.open(current);}}, focus() {if (isOpen()) block.focus();}, fail(message) {if (isOpen()) block.update({...current, error: message});},\n };\n editorSlots.set(kind, session); sessions.add(session);\n if (alive) {block.update(state); block.open(state); env.changed();} else block.destroy();\n return session;\n }\n let confirmation: SceneSession<ConfirmationState> | undefined;\n function openConfirmation(state: ConfirmationState, actions: Parameters<WorkspaceScene['openConfirmation']>[1]): SceneSession<ConfirmationState> {\n confirmation?.close();\n let alive = !destroyed, current = state, block: ConfirmBlock;\n const message = (value: ConfirmationState) => {const fragment = document.createDocumentFragment(); fragment.append(value.description.before); if (value.description.subject) {const strong = document.createElement('strong'); strong.textContent = value.description.subject; fragment.append(strong);} fragment.append(value.description.after || ''); return fragment;};\n const release = () => {if (!alive) return; alive = false; block.destroy(); sessions.delete(session); env.notifyClose(actions.onClose); env.changed();};\n const presentation = (value: ConfirmationState) => ({title: value.title, hint: value.hint, error: value.error, disabled: value.disabled, message: message(value), confirmLabel: value.action});\n block = createConfirmDialog({...presentation(state), onConfirm: actions.onConfirm, onClose: release}); shell.element.append(block.element);\n const session: SceneSession<ConfirmationState> = {isOpen: () => alive && !destroyed && block.element.open, close: release, destroy: release,\n update(next) {if (!session.isOpen()) return; current = next; block.update(presentation(next));}, fail(error) {session.update({...current, error});},\n };\n confirmation = session; sessions.add(session); if (alive) {block.open(); env.changed();} else block.destroy(); return session;\n }\n return {\n updateShell: state => {if (!destroyed) shell.update(state);},\n updateComposer(state) {if (!destroyed) {composerState = state; shell.composer.update(state); syncAttachment(); drop.update({active: false, disabled: dropUnavailable()});}},\n readDraft: () => shell.composer.getValue(), resetDraft: text => {if (!destroyed) shell.composer.reset(text);}, focusComposer: shell.composer.focus,\n pickImages() {if (!composerUnavailable() && !attachmentsDisabled) shell.composer.pickImages();},\n insertReferences(paths) {\n if (dropUnavailable() || !paths.length) return;\n const reference = paths.map(path => {const ticks = Math.max(0, ...[...path.matchAll(/`+/g)].map(match => match[0].length)) + 1; const delimiter = '`'.repeat(ticks); return delimiter + (/^`|`$|^ | $/.test(path) && !/^ +$/.test(path) ? ' ' + path + ' ' : path) + delimiter;}).join(' ');\n const value = input.value, start = input.selectionStart, end = input.selectionEnd;\n const before = value.slice(0, start), after = value.slice(end), inserted = (before && !/\\s$/.test(before) ? ' ' : '') + reference + (after && !/^\\s/.test(after) ? ' ' : '');\n shell.composer.reset(before + inserted + after); input.setSelectionRange(before.length + inserted.length, before.length + inserted.length); shell.composer.focus(); callbacks.onInput?.(input.value);\n },\n receiveNativeDrop({paths, x, y}) {if (dropUnavailable() || !Number.isFinite(x) || !Number.isFinite(y) || !form.contains(document.elementFromPoint(x, y))) return; callbacks.onDropReferences?.({paths: [...paths], hasUnidentifiedFiles: false});},\n setDropPending(value) {dropPending = value; if (value) drop.update({active: false});},\n updateNavigation(state) {navigationState = state; const active = state.groups.flatMap(group => group.children.filter(item => item.active).map(item => ({workspace: group.id, conversation: item.id})))[0]; if (active && active.conversation !== navigationConversation) expanded.set(active.workspace, true); navigationConversation = active?.conversation || ''; const ids = new Set(state.groups.map(group => group.id)); for (const id of expanded.keys()) if (!ids.has(id)) expanded.delete(id); if (menuTarget && !state.groups.some(group => menuTarget!.kind === 'workspace' ? group.id === menuTarget!.id : group.children.some(item => item.id === menuTarget!.id))) closeMenu(); renderNavigation();},\n search(value) {query = value; renderNavigation(); callbacks.onSearch?.(value);}, closeNavigationMenu: closeMenu, setSidebarOpen: shell.setSidebarOpen,\n updateConversation(state) {\n if (destroyed) return; collectFolds();\n if (state.id !== activeId) {env.closeImage(); clearImages(); costs.open = false; ledger.clear();}\n activeId = state.id; currentMessages = state.messages; reader.beforeRender(state.id);\n env.part('welcome').hidden = state.messages.length > 0; env.part('messages').hidden = !state.messages.length;\n messages.update({...state, folds: folds.get(state.id)}); loadImages(); reader.afterRender();\n },\n updateMessageAvailability(state) {messageAvailability = state; messages.updateActionAvailability(state);},\n pruneConversations(ids) {const keep = new Set(ids); for (const id of folds.keys()) if (!keep.has(id)) folds.delete(id); reader.prune([...ids]);},\n updateWelcome(state) {if (destroyed) return; if (logo) logo.src = env.brandMarkSource(); welcome.update(state);}, followLatest: reader.followLatest, openFind: reader.openFind, closeFind: reader.closeFind,\n updatePending: pending.update,\n updateAttachments(state) {if (!destroyed) {attachmentsDisabled = !!state.disabled; attachments.update(state); syncAttachment();}},\n updateImageGuidance(message) {const element = env.part('image-guidance'); element.textContent = message; element.hidden = !message;},\n updatePermission: permission.update, updateApproval: approval.update, updateFailure: failure.update, updateRuntime: runtime.update, updateTiming: runtime.updateTiming, updateNotices: notices.update,\n updateAvailability(state) {if (destroyed) return; availability = state; const conversations = new Set(state.conversations), workspaces = new Set(state.workspaces); shell.updateActionAvailability(scope => !!state.busy || (scope.kind === 'global' ? !!state.global : scope.kind === 'conversation' ? conversations.has(scope.id || '') : scope.kind === 'workspace' ? workspaces.has(scope.id || '') : !!state.active)); syncAttachment(); renderNavigation();},\n readCosts: () => ({open: costs.open, runtimeOpen: runDetails.open}),\n updateCosts(state) {if (destroyed) return; costs.hidden = !state.visible; if (state.error) ledger.setError(state.error); else if (state.loading) ledger.loading(); else if (state.report) ledger.update(state.report);},\n resetCosts() {costs.open = false; ledger.clear();},\n openMessageEditor: (state, actions) => openEditor('message', state, actions), openQueueEditor: (state, actions) => openEditor('queue', state, actions), openConfirmation,\n openWorkspacePicker(state, actions = {}) {\n let surface: OwnedSurface; const block = createWorkspacePicker(state, {idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onPick: actions.onPick, onSelect: actions.onSelect, onSubmitted: () => surface.close(), onCancel: () => surface.close()});\n surface = env.openDialog('workspace', block, actions.onClose); block.focus();\n return {isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) {if (surface.isOpen()) block.update(next);}, reset(path) {if (surface.isOpen()) block.reset(path);}, focus() {if (surface.isOpen()) block.focus();}};\n },\n openRename(state, actions = {}) {\n let surface: OwnedSurface; const block = createRenameConversation(state, {idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onSubmitted: () => surface.close(), onCancel: () => surface.close()});\n surface = env.openDialog('rename', block, actions.onClose); block.focus();\n return {isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) {if (surface.isOpen()) block.update(next);}, reset(next) {if (surface.isOpen()) block.reset(next);}, focus() {if (surface.isOpen()) block.focus();}};\n },\n openFullAccess(state, actions) {\n let surface: OwnedSurface; const block = createFullAccessConfirmation(state, {idPrefix: env.idPrefix, onConfirm: async () => {const result = await actions.onConfirm(); if (result.ok && surface.isOpen()) surface.close(); return result;}});\n surface = env.openDialog('permissions', block, actions.onClose);\n return {isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) {if (surface.isOpen()) block.update(next);}};\n },\n openHistory(state, actions = {}) {\n let surface: OwnedSurface; const block = createBranchHistory(state, {onContinue: async id => {const result = await actions.onContinue?.(id); if (result && !result.ok) throw new Error(result.error); if (surface.isOpen()) surface.close();}});\n surface = env.openFeature('Conversation branches', block, actions.onClose);\n return {isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) {if (surface.isOpen()) block.update(next);}};\n },\n destroy() {if (destroyed) return; destroyed = true; abort.abort(); for (const session of [...sessions]) session.close(); sessions.clear(); clearImages(); folds.clear(); expanded.clear(); menu.destroy(); navigation.destroy(); copy.destroy(); reader.destroy(); messages.destroy(); welcome.destroy(); pending.destroy(); attachments.destroy(); attachmentAction.destroy(); drop.destroy(); permission.destroy(); approval.destroy(); failure.destroy(); runtime.destroy(); ledger.destroy(); notices.destroy();},\n };\n}\n"]}
|
package/dist/forms/actions.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/forms/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,WAAW,oBAAoB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/forms/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIpD,MAAM,WAAW,oBAAoB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAC;AAC1H,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,CAAC;AACjE,MAAM,WAAW,oBAAoB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC;AACjH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AACjF,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;AACzD,MAAM,WAAW,oBAAoB;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAC;AAC3D,MAAM,WAAW,oBAAoB;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC;AACzL,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAA+lB;AAE5qB,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvH;AACD,MAAM,WAAW,oBAAoB;IAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAC;AACtJ,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAAE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAA;CAAC;AACvK,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAAE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAA;CAAC;AAmBvK,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAOrI;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAOrI"}
|
package/dist/forms/actions.js
CHANGED
|
@@ -29,7 +29,8 @@ function actions(initial, className, describe, options, onAction) {
|
|
|
29
29
|
const row = { element: button, view, handle: adoptAction(button, { onAction: stop ? () => onAction ? onAction(row.view.action, row.view.target) : options.onAction(row.view.action, button.dataset) : undefined, onError: options.onError }), stop };
|
|
30
30
|
return row;
|
|
31
31
|
}, update(row, view) { row.view = view; row.element.className = `pui-secondary-button${view.destructive ? ' pui-destructive-button' : ''}`; setText(row.element, view.label); for (const [name, value] of Object.entries(view.dataset))
|
|
32
|
-
row.element.dataset[name] = value;
|
|
32
|
+
row.element.dataset[name] = value; if (view.disabled !== undefined)
|
|
33
|
+
row.handle.update({ disabled: view.disabled }); }, destroy: release });
|
|
33
34
|
};
|
|
34
35
|
update(initial);
|
|
35
36
|
return { element, update, destroy() { if (destroyed)
|
|
@@ -40,7 +41,7 @@ export function createProviderActions(state, options = {}) {
|
|
|
40
41
|
return actions(state, 'pui-feature-toolbar', value => {
|
|
41
42
|
const target = Object.freeze({ id: value.id });
|
|
42
43
|
const result = [];
|
|
43
|
-
const add = (action, label, destructive = false) => result.push({ key: JSON.stringify([value.id, action]), action, label, target, dataset: { sdk: action, id: value.id }, destructive });
|
|
44
|
+
const add = (action, label, destructive = false) => result.push({ key: JSON.stringify([value.id, action]), action, label, target, dataset: { sdk: action, id: value.id }, destructive, disabled: !!value.disabled });
|
|
44
45
|
if (value.oauth)
|
|
45
46
|
add(value.signedIn ? 'logout' : 'login', value.signedIn ? 'Sign out' : 'Sign in with provider');
|
|
46
47
|
if (value.custom) {
|