pith-ui 0.1.4 → 0.2.0-app.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/AI.md +21 -7
  2. package/API.md +263 -262
  3. package/APP-API.md +2019 -0
  4. package/APP.md +137 -0
  5. package/README.md +35 -4
  6. package/dist/app/files.d.ts +68 -0
  7. package/dist/app/files.d.ts.map +1 -0
  8. package/dist/app/files.js +177 -0
  9. package/dist/app/files.js.map +1 -0
  10. package/dist/app/index.d.ts +57 -0
  11. package/dist/app/index.d.ts.map +1 -0
  12. package/dist/app/index.js +300 -0
  13. package/dist/app/index.js.map +1 -0
  14. package/dist/app/internal.d.ts +31 -0
  15. package/dist/app/internal.d.ts.map +1 -0
  16. package/dist/app/internal.js +2 -0
  17. package/dist/app/internal.js.map +1 -0
  18. package/dist/app/resources.d.ts +89 -0
  19. package/dist/app/resources.d.ts.map +1 -0
  20. package/dist/app/resources.js +190 -0
  21. package/dist/app/resources.js.map +1 -0
  22. package/dist/app/session.d.ts +14 -0
  23. package/dist/app/session.d.ts.map +1 -0
  24. package/dist/app/session.js +12 -0
  25. package/dist/app/session.js.map +1 -0
  26. package/dist/app/settings.d.ts +109 -0
  27. package/dist/app/settings.d.ts.map +1 -0
  28. package/dist/app/settings.js +279 -0
  29. package/dist/app/settings.js.map +1 -0
  30. package/dist/app/workspace.d.ts +228 -0
  31. package/dist/app/workspace.d.ts.map +1 -0
  32. package/dist/app/workspace.js +402 -0
  33. package/dist/app/workspace.js.map +1 -0
  34. package/dist/forms/actions.d.ts +1 -0
  35. package/dist/forms/actions.d.ts.map +1 -1
  36. package/dist/forms/actions.js +3 -2
  37. package/dist/forms/actions.js.map +1 -1
  38. package/dist/styles.css +4 -1
  39. package/dist/tasks/runtime.js +2 -2
  40. package/dist/tasks/runtime.js.map +1 -1
  41. package/package.json +42 -8
@@ -0,0 +1,402 @@
1
+ import { createWorkspaceShell } from '../workspace.js';
2
+ import { createWorkspaceNavigation, createWorkspacePicker, createRenameConversation } from '../navigation/navigation.js';
3
+ import { createContextMenu } from '../navigation/context-menu.js';
4
+ import { createConversationView } from '../content/conversation-view.js';
5
+ import { installConversationReader } from '../content/conversation-reader.js';
6
+ import { createWelcomeView } from '../content/welcome.js';
7
+ import { createPendingMessages, createAttachments, createDropFeedback } from '../composer.js';
8
+ import { createPermissionControl, createFullAccessConfirmation, createTaskFailure } from '../tasks/permission.js';
9
+ import { createApprovalPanel } from '../tasks/approval.js';
10
+ import { createRuntimePanel } from '../tasks/runtime.js';
11
+ import { createCostLedger, createCompletionNotices, createCopyFeedback, historyStatusMarkup } from '../files/systems.js';
12
+ import { createTextEditDialog, createConfirmDialog } from '../primitives.js';
13
+ import { createBranchHistory } from '../forms/history.js';
14
+ export function createWorkspaceScene(env, shell, callbacks, brand) {
15
+ let destroyed = false, activeId = '', query = '', dropPending = false, attachmentsDisabled = false;
16
+ let navigationState = { groups: [], empty: 'workspaces' };
17
+ let navigationConversation = '';
18
+ let composerState = {};
19
+ let availability = {};
20
+ const abort = new AbortController();
21
+ const folds = new Map(), expanded = new Map();
22
+ const imageData = new Map();
23
+ let requestedImages = new WeakSet();
24
+ let currentMessages = [];
25
+ let imageGeneration = 0;
26
+ const imageURLs = new Set();
27
+ const sessions = new Set();
28
+ const fail = (error) => { if (!destroyed)
29
+ callbacks.onError?.(error instanceof Error ? error.message : String(error)); };
30
+ const run = async (action) => {
31
+ if (!action || destroyed)
32
+ return;
33
+ try {
34
+ const result = await action();
35
+ if (result && !result.ok)
36
+ throw new Error(result.error);
37
+ }
38
+ catch (error) {
39
+ fail(error);
40
+ }
41
+ };
42
+ const copy = createCopyFeedback({ status: env.part('copy-status'), isDisabled: button => !!availability.global || (button.hasAttribute('data-message-action') && !!availability.active), onError: fail });
43
+ const copyAction = (button, action, label) => copy.copy(button, async () => { const result = await action(); if (result && !result.ok)
44
+ throw new Error(result.error); }, label);
45
+ const messages = createConversationView({ container: env.part('messages'), markdown: id => ({ resolveLocalLink: href => callbacks.resolveLocalLink?.(href, id) ?? null }),
46
+ onAction(action, button) {
47
+ const target = Object.freeze({ ...action });
48
+ if (target.action === 'copy')
49
+ void copyAction(button, () => callbacks.onMessageAction ? callbacks.onMessageAction(target) : env.copyText(currentMessages.find(message => message.id === target.messageId)?.text || ''), 'Message copied');
50
+ else
51
+ void run(() => callbacks.onMessageAction?.(target));
52
+ },
53
+ onCopyCode(text, button) { void copyAction(button, () => callbacks.onCopyCode ? callbacks.onCopyCode(text) : env.copyText(text), 'Code copied'); },
54
+ });
55
+ const reader = installConversationReader(env.part('chat-scroll'), env.part('messages'), env.part('conversation-find'), env.part('back-to-latest'), { isKeyboardBlocked: env.hasModal });
56
+ let logo;
57
+ if (brand.mark) {
58
+ logo = document.createElement('img');
59
+ logo.className = 'pui-app-brand-image';
60
+ logo.src = env.brandMarkSource();
61
+ logo.alt = brand.mark.alt;
62
+ }
63
+ const welcome = createWelcomeView({ container: env.part('welcome'), logo, onAction: action => { void run(() => callbacks.onAction?.(action)); }, onPrompt: text => { shell.composer.reset(text); callbacks.onInput?.(text); shell.composer.focus(); } });
64
+ const menu = createContextMenu({ element: env.part('conversation-menu'), onDismiss: () => { menuTarget = undefined; renderNavigation(); }, onAction(item) {
65
+ const target = menuTarget;
66
+ closeMenu();
67
+ if (!target)
68
+ return;
69
+ if (target.kind === 'conversation')
70
+ void run(() => callbacks.onConversationAction?.(item.action, target.id));
71
+ else
72
+ void run(() => callbacks.onWorkspaceAction?.('remove', target.id));
73
+ } });
74
+ let menuTarget;
75
+ const navigation = createWorkspaceNavigation({ groups: [], empty: 'workspaces' }, { element: env.part('history-list'), idPrefix: env.idPrefix,
76
+ onToggle(id) { const group = navigationState.groups.find(group => group.id === id); if (!group)
77
+ return; const open = !(expanded.get(id) ?? group.selected); expanded.set(id, open); if (open)
78
+ callbacks.onSelectWorkspace?.(id); renderNavigation(); },
79
+ onSelect(id) { closeMenu(); shell.setSidebarOpen(false); callbacks.onSelectConversation?.(id); },
80
+ onAction(action) {
81
+ if (action.action === 'add-workspace') {
82
+ void run(() => callbacks.onAction?.('workspace'));
83
+ return;
84
+ }
85
+ if (action.action === 'new-conversation') {
86
+ closeMenu();
87
+ callbacks.onNewConversation?.(action.workspaceId);
88
+ return;
89
+ }
90
+ const target = action.action === 'conversation-menu' ? { kind: 'conversation', id: action.conversationId } : { kind: 'workspace', id: action.workspaceId };
91
+ if (menuTarget?.kind === target.kind && menuTarget.id === target.id) {
92
+ closeMenu();
93
+ return;
94
+ }
95
+ closeMenu();
96
+ menuTarget = target;
97
+ menu.open(action.trigger, { label: target.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(target) });
98
+ renderNavigation();
99
+ },
100
+ });
101
+ function closeMenu() { menu.close(); menuTarget = undefined; renderNavigation(); }
102
+ function menuItems(target) {
103
+ if (target.kind === 'workspace') {
104
+ const group = navigationState.groups.find(group => group.id === target.id);
105
+ return [{ id: 'remove', label: 'Remove workspace', action: 'remove', danger: true, disabled: !!navigationState.disabled || !!availability.global || availability.workspaces?.includes(target.id) || group?.canRemove === false }];
106
+ }
107
+ const entry = navigationState.groups.flatMap(group => group.children).find(item => item.id === target.id);
108
+ return [['rename', 'Rename conversation'], ['history', 'Conversation branches'], ['export', 'Export conversation'], ['delete', 'Delete conversation']]
109
+ .filter(([action]) => action !== 'history' || entry?.active)
110
+ .map(([action, label]) => ({ id: action, action, label, danger: action === 'delete', disabled: !!navigationState.disabled || !!availability.global || availability.conversations?.includes(target.id) || entry?.actions?.[action] === false }));
111
+ }
112
+ function renderNavigation() {
113
+ if (destroyed)
114
+ return;
115
+ const searched = query.trim().toLocaleLowerCase();
116
+ const groups = navigationState.groups.map(group => ({ ...group, menuOpen: menuTarget?.kind === 'workspace' && menuTarget.id === group.id,
117
+ expanded: searched ? true : expanded.get(group.id) ?? group.selected,
118
+ children: group.children.filter(item => !searched || (item.title || '').toLocaleLowerCase().includes(searched)).map(item => {
119
+ let status;
120
+ if (item.status) {
121
+ const template = document.createElement('template');
122
+ template.innerHTML = historyStatusMarkup(item.status.kind);
123
+ status = template.content;
124
+ }
125
+ return { ...item, status, menuOpen: menuTarget?.kind === 'conversation' && menuTarget.id === item.id };
126
+ }),
127
+ })).filter(group => !searched || group.children.length > 0);
128
+ navigation.update({ groups, empty: searched && !groups.length ? 'search' : navigationState.empty, disabled: navigationState.disabled });
129
+ if (menuTarget)
130
+ menu.update({ label: menuTarget.kind === 'conversation' ? 'Conversation actions' : 'Workspace actions', items: menuItems(menuTarget) });
131
+ }
132
+ const pending = createPendingMessages({ container: env.part('queued-messages'), onAction: callbacks.onQueueAction });
133
+ const attachments = createAttachments({ container: env.part('draft-images'), onRemove: callbacks.onRemoveAttachment, onOpen: env.openImage });
134
+ const drop = createDropFeedback({ container: shell.composer.element });
135
+ const permission = createPermissionControl({ mode: 'ask', description: '' }, { element: env.part('permission-control'), descriptionElement: env.part('permission-description'), onChange: callbacks.onPermissionChange });
136
+ const approval = createApprovalPanel({ approval: null }, { element: env.part('approval'), idPrefix: env.idPrefix, onAction: callbacks.onApproval });
137
+ 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')); } });
138
+ const runtime = createRuntimePanel({ visible: false, summary: '', duration: '', speed: '', inputTokens: '', outputTokens: '', cacheRead: '', cacheWrite: '', contextTokens: '', contextWindow: '', compactions: '', toolFailures: '', recordedCost: '', latestCost: '' }, { element: env.part('run-status'), idPrefix: '' });
139
+ const ledger = createCostLedger({ container: env.part('cost-ledger') });
140
+ const costs = env.part('cost-requests'), runDetails = env.part('run-status');
141
+ const costsChanged = () => callbacks.onCostsChange?.();
142
+ costs.addEventListener('toggle', costsChanged, { signal: abort.signal });
143
+ runDetails.addEventListener('toggle', costsChanged, { signal: abort.signal });
144
+ const notices = createCompletionNotices({ container: env.part('completion-notices'), onOpen: callbacks.onCompletionOpen, onDismiss: callbacks.onCompletionDismiss });
145
+ shell.element.addEventListener('click', event => {
146
+ const target = event.target.closest('[data-action], [data-sdk="compact"], a[data-download-path]');
147
+ if (!target || target instanceof HTMLButtonElement && target.disabled)
148
+ return;
149
+ if (target.matches('a[data-download-path]')) {
150
+ event.preventDefault();
151
+ const link = Object.freeze({ conversationId: target.dataset.downloadConversation, path: target.dataset.downloadPath });
152
+ void run(() => callbacks.onLocalFile?.(link));
153
+ return;
154
+ }
155
+ const action = target.dataset.sdk === 'compact' ? 'compact' : target.dataset.action;
156
+ if (action && ['workspace', 'resources', 'connections', 'settings'].includes(action) || action === 'compact') {
157
+ event.stopPropagation();
158
+ void run(() => callbacks.onAction?.(action));
159
+ }
160
+ }, { signal: abort.signal });
161
+ const input = shell.composer.input, form = shell.composer.element;
162
+ input.addEventListener('blur', () => callbacks.onBlur?.(), { signal: abort.signal });
163
+ 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) {
164
+ event.preventDefault();
165
+ callbacks.onImages?.(files);
166
+ } }, { signal: abort.signal });
167
+ const dropUnavailable = () => destroyed || !!composerState.disabled || !!composerState.readOnly || dropPending || env.hasModal();
168
+ form.addEventListener('dragover', event => { if (dropUnavailable())
169
+ return; event.preventDefault(); drop.update({ active: true }); }, { signal: abort.signal });
170
+ form.addEventListener('dragleave', event => { if (!form.contains(event.relatedTarget))
171
+ drop.update({ active: false }); }, { signal: abort.signal });
172
+ form.addEventListener('drop', event => {
173
+ event.preventDefault();
174
+ drop.update({ active: false });
175
+ if (dropUnavailable())
176
+ return;
177
+ const files = [...event.dataTransfer?.files || []];
178
+ 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);
179
+ const images = files.filter(isImage), uris = event.dataTransfer?.getData('text/uri-list') || '';
180
+ if (images.length)
181
+ callbacks.onImages?.(images);
182
+ if (uris || files.some(file => !isImage(file)))
183
+ callbacks.onDropReferences?.({ paths: [], uris });
184
+ }, { signal: abort.signal });
185
+ const collectFolds = () => { if (!activeId)
186
+ return; const map = new Map(); for (const item of env.part('messages').querySelectorAll('[data-tool-fold]'))
187
+ map.set(item.dataset.toolFold, item.open); folds.set(activeId, map); };
188
+ const clearImages = () => { imageGeneration++; imageData.clear(); requestedImages = new WeakSet(); for (const url of imageURLs)
189
+ URL.revokeObjectURL(url); imageURLs.clear(); };
190
+ function loadImages() {
191
+ const generation = imageGeneration, id = activeId;
192
+ for (const image of messages.images()) {
193
+ if (requestedImages.has(image))
194
+ continue;
195
+ requestedImages.add(image);
196
+ const target = Object.freeze({ conversationId: id, messageId: image.dataset.messageId, index: Number(image.dataset.imageIndex) });
197
+ const key = JSON.stringify([target.conversationId, target.messageId, target.index]);
198
+ let pending = imageData.get(key);
199
+ if (!pending) {
200
+ pending = Promise.resolve().then(() => callbacks.onLoadImage?.(target)).then(blob => {
201
+ if (!blob || !['image/png', 'image/jpeg', 'image/gif', 'image/webp'].includes(blob.type) || generation !== imageGeneration || destroyed)
202
+ return null;
203
+ const url = URL.createObjectURL(blob);
204
+ imageURLs.add(url);
205
+ return url;
206
+ }).catch(() => null);
207
+ imageData.set(key, pending);
208
+ }
209
+ void pending.then(src => {
210
+ if (!destroyed && generation === imageGeneration && id === activeId) {
211
+ if (!src) {
212
+ requestedImages.delete(image);
213
+ if (imageData.get(key) === pending)
214
+ imageData.delete(key);
215
+ }
216
+ messages.setImageState(image, src ? { status: 'ready', src } : { status: 'unavailable' });
217
+ }
218
+ });
219
+ }
220
+ }
221
+ const editorSlots = new Map();
222
+ function openEditor(kind, state, actions = {}) {
223
+ editorSlots.get(kind)?.close();
224
+ let alive = !destroyed, current = state, savedDraft = state.value, block;
225
+ const release = () => { if (!alive)
226
+ return; alive = false; savedDraft = block.getValue(); block.destroy(); sessions.delete(session); if (editorSlots.get(kind) === session)
227
+ editorSlots.delete(kind); env.notifyClose(actions.onClose); env.changed(); };
228
+ 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 });
229
+ block.control.rows = kind === 'message' ? 8 : 5;
230
+ shell.element.append(block.element);
231
+ const isOpen = () => alive && !destroyed && block.element.open;
232
+ const session = { isOpen, close: release, destroy: release, read: () => alive ? block.getValue() : savedDraft,
233
+ update(next) { if (isOpen()) {
234
+ current = next;
235
+ block.update(next);
236
+ } },
237
+ reset(value) { if (isOpen()) {
238
+ current = { ...current, value };
239
+ block.open(current);
240
+ } }, focus() { if (isOpen())
241
+ block.focus(); }, fail(message) { if (isOpen())
242
+ block.update({ ...current, error: message }); }, };
243
+ editorSlots.set(kind, session);
244
+ sessions.add(session);
245
+ if (alive) {
246
+ block.update(state);
247
+ block.open(state);
248
+ env.changed();
249
+ }
250
+ else
251
+ block.destroy();
252
+ return session;
253
+ }
254
+ let confirmation;
255
+ function openConfirmation(state, actions) {
256
+ confirmation?.close();
257
+ let alive = !destroyed, current = state, block;
258
+ const message = (value) => { const fragment = document.createDocumentFragment(); fragment.append(value.description.before); if (value.description.subject) {
259
+ const strong = document.createElement('strong');
260
+ strong.textContent = value.description.subject;
261
+ fragment.append(strong);
262
+ } fragment.append(value.description.after || ''); return fragment; };
263
+ const release = () => { if (!alive)
264
+ return; alive = false; block.destroy(); sessions.delete(session); env.notifyClose(actions.onClose); env.changed(); };
265
+ const presentation = (value) => ({ title: value.title, hint: value.hint, error: value.error, disabled: value.disabled, message: message(value), confirmLabel: value.action });
266
+ block = createConfirmDialog({ ...presentation(state), onConfirm: actions.onConfirm, onClose: release });
267
+ shell.element.append(block.element);
268
+ const session = { isOpen: () => alive && !destroyed && block.element.open, close: release, destroy: release,
269
+ update(next) { if (!session.isOpen())
270
+ return; current = next; block.update(presentation(next)); }, fail(error) { session.update({ ...current, error }); },
271
+ };
272
+ confirmation = session;
273
+ sessions.add(session);
274
+ if (alive) {
275
+ block.open();
276
+ env.changed();
277
+ }
278
+ else
279
+ block.destroy();
280
+ return session;
281
+ }
282
+ return {
283
+ updateShell: state => { if (!destroyed)
284
+ shell.update(state); },
285
+ updateComposer(state) { if (!destroyed) {
286
+ composerState = state;
287
+ shell.composer.update(state);
288
+ drop.update({ active: false, disabled: dropUnavailable() });
289
+ } },
290
+ readDraft: () => shell.composer.getValue(), resetDraft: text => { if (!destroyed)
291
+ shell.composer.reset(text); }, focusComposer: shell.composer.focus,
292
+ pickImages() { if (!dropUnavailable() && !attachmentsDisabled)
293
+ shell.composer.pickImages(); },
294
+ insertReferences(paths) {
295
+ if (dropUnavailable() || !paths.length)
296
+ return;
297
+ 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) ? ' ' + path + ' ' : path) + delimiter; }).join(' ');
298
+ const value = input.value, start = input.selectionStart, end = input.selectionEnd;
299
+ const before = value.slice(0, start), after = value.slice(end), inserted = (before && !/\s$/.test(before) ? ' ' : '') + reference + (after && !/^\s/.test(after) ? ' ' : '');
300
+ shell.composer.reset(before + inserted + after);
301
+ input.setSelectionRange(before.length + inserted.length, before.length + inserted.length);
302
+ shell.composer.focus();
303
+ callbacks.onInput?.(input.value);
304
+ },
305
+ receiveNativeDrop({ paths, x, y }) { if (dropUnavailable() || !Number.isFinite(x) || !Number.isFinite(y) || !form.contains(document.elementFromPoint(x, y)))
306
+ return; callbacks.onDropReferences?.({ paths: [...paths] }); },
307
+ setDropPending(value) { dropPending = value; if (value)
308
+ drop.update({ active: false }); },
309
+ 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)
310
+ expanded.set(active.workspace, true); navigationConversation = active?.conversation || ''; const ids = new Set(state.groups.map(group => group.id)); for (const id of expanded.keys())
311
+ if (!ids.has(id))
312
+ expanded.delete(id); if (menuTarget && !state.groups.some(group => menuTarget.kind === 'workspace' ? group.id === menuTarget.id : group.children.some(item => item.id === menuTarget.id)))
313
+ closeMenu(); renderNavigation(); },
314
+ search(value) { query = value; renderNavigation(); callbacks.onSearch?.(value); }, closeNavigationMenu: closeMenu, setSidebarOpen: shell.setSidebarOpen,
315
+ updateConversation(state) {
316
+ if (destroyed)
317
+ return;
318
+ collectFolds();
319
+ if (state.id !== activeId) {
320
+ env.closeImage();
321
+ clearImages();
322
+ costs.open = false;
323
+ ledger.clear();
324
+ }
325
+ activeId = state.id;
326
+ currentMessages = state.messages;
327
+ reader.beforeRender(state.id);
328
+ env.part('welcome').hidden = state.messages.length > 0;
329
+ env.part('messages').hidden = !state.messages.length;
330
+ messages.update({ ...state, folds: folds.get(state.id) });
331
+ loadImages();
332
+ reader.afterRender();
333
+ },
334
+ updateMessageAvailability: messages.updateActionAvailability,
335
+ pruneConversations(ids) { const keep = new Set(ids); for (const id of folds.keys())
336
+ if (!keep.has(id))
337
+ folds.delete(id); reader.prune([...ids]); },
338
+ updateWelcome(state) { if (destroyed)
339
+ return; if (logo)
340
+ logo.src = env.brandMarkSource(); welcome.update(state); }, followLatest: reader.followLatest, openFind: reader.openFind, closeFind: reader.closeFind,
341
+ updatePending: pending.update,
342
+ updateAttachments(state) { if (!destroyed) {
343
+ attachmentsDisabled = !!state.disabled;
344
+ attachments.update(state);
345
+ } },
346
+ updateImageGuidance(message) { const element = env.part('image-guidance'); element.textContent = message; element.hidden = !message; },
347
+ updatePermission: permission.update, updateApproval: approval.update, updateFailure: failure.update, updateRuntime: runtime.update, updateTiming: runtime.updateTiming, updateNotices: notices.update,
348
+ updateAvailability(state) { if (destroyed)
349
+ return; availability = state; const conversations = new Set(state.conversations), workspaces = new Set(state.workspaces); shell.updateActionAvailability(scope => !!state.global || (scope.kind === 'conversation' ? conversations.has(scope.id || '') : scope.kind === 'workspace' ? workspaces.has(scope.id || '') : scope.kind === 'active' ? !!state.active : false)); renderNavigation(); },
350
+ readCosts: () => ({ open: costs.open, runtimeOpen: runDetails.open }),
351
+ updateCosts(state) { if (destroyed)
352
+ return; costs.hidden = !state.visible; if (state.error)
353
+ ledger.setError(state.error);
354
+ else if (state.loading)
355
+ ledger.loading();
356
+ else if (state.report)
357
+ ledger.update(state.report); },
358
+ resetCosts() { costs.open = false; ledger.clear(); },
359
+ openMessageEditor: (state, actions) => openEditor('message', state, actions), openQueueEditor: (state, actions) => openEditor('queue', state, actions), openConfirmation,
360
+ openWorkspacePicker(state, actions = {}) {
361
+ let surface;
362
+ const block = createWorkspacePicker(state, { idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onPick: actions.onPick, onSelect: actions.onSelect, onSubmitted: () => surface.close(), onCancel: () => surface.close() });
363
+ surface = env.openDialog('workspace', block, actions.onClose);
364
+ block.focus();
365
+ return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) { if (surface.isOpen())
366
+ block.update(next); }, reset(path) { if (surface.isOpen())
367
+ block.reset(path); }, focus() { if (surface.isOpen())
368
+ block.focus(); } };
369
+ },
370
+ openRename(state, actions = {}) {
371
+ let surface;
372
+ const block = createRenameConversation(state, { idPrefix: env.idPrefix, onSubmit: actions.onSubmit, onSubmitted: () => surface.close(), onCancel: () => surface.close() });
373
+ surface = env.openDialog('rename', block, actions.onClose);
374
+ block.focus();
375
+ return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, read: block.read, update(next) { if (surface.isOpen())
376
+ block.update(next); }, reset(next) { if (surface.isOpen())
377
+ block.reset(next); }, focus() { if (surface.isOpen())
378
+ block.focus(); } };
379
+ },
380
+ openFullAccess(state, actions) {
381
+ let surface;
382
+ const block = createFullAccessConfirmation(state, { idPrefix: env.idPrefix, onConfirm: async () => { const result = await actions.onConfirm(); if (result.ok && surface.isOpen())
383
+ surface.close(); return result; } });
384
+ surface = env.openDialog('permissions', block, actions.onClose);
385
+ return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) { if (surface.isOpen())
386
+ block.update(next); } };
387
+ },
388
+ openHistory(state, actions = {}) {
389
+ let surface;
390
+ const block = createBranchHistory(state, { onContinue: async (id) => { const result = await actions.onContinue?.(id); if (result && !result.ok)
391
+ throw new Error(result.error); if (surface.isOpen())
392
+ surface.close(); } });
393
+ surface = env.openFeature('Conversation branches', block, actions.onClose);
394
+ return { isOpen: surface.isOpen, close: surface.close, destroy: surface.destroy, fail: surface.fail, update(next) { if (surface.isOpen())
395
+ block.update(next); } };
396
+ },
397
+ destroy() { if (destroyed)
398
+ return; destroyed = true; abort.abort(); for (const session of [...sessions])
399
+ 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(); drop.destroy(); permission.destroy(); approval.destroy(); failure.destroy(); runtime.destroy(); ledger.destroy(); notices.destroy(); },
400
+ };
401
+ }
402
+ //# 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 {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}): 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 {readonly global?: boolean; readonly active?: boolean; readonly conversations?: readonly string[]; readonly workspaces?: readonly string[]}\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 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.global || (button.hasAttribute('data-message-action') && !!availability.active), 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 => {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.global || 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 conversation'], ['history', 'Conversation branches'], ['export', 'Export conversation'], ['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.global || 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 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 = () => destroyed || !!composerState.disabled || !!composerState.readOnly || dropPending || env.hasModal();\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 (dropUnavailable()) 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) callbacks.onImages?.(images);\n if (uris || files.some(file => !isImage(file))) callbacks.onDropReferences?.({paths: [], uris});\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); 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 (!dropUnavailable() && !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) ? ' ' + 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]});},\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: messages.updateActionAvailability,\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);}},\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.global || (scope.kind === 'conversation' ? conversations.has(scope.id || '') : scope.kind === 'workspace' ? workspaces.has(scope.id || '') : scope.kind === 'active' ? !!state.active : false)); 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(); drop.destroy(); permission.destroy(); approval.destroy(); failure.destroy(); runtime.destroy(); ledger.destroy(); notices.destroy();},\n };\n}\n"]}
@@ -4,6 +4,7 @@ export interface ProviderActionsState {
4
4
  oauth: boolean;
5
5
  signedIn: boolean;
6
6
  custom: boolean;
7
+ disabled?: boolean;
7
8
  }
8
9
  export type ResourceKind = 'instructions' | 'skill' | 'template';
9
10
  export interface ResourceActionsState {
@@ -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;AACtG,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"}
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"}
@@ -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; }, destroy: release });
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) {