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.
Files changed (41) hide show
  1. package/AI.md +21 -7
  2. package/API.md +263 -262
  3. package/APP-API.md +2023 -0
  4. package/APP.md +141 -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 +283 -0
  29. package/dist/app/settings.js.map +1 -0
  30. package/dist/app/workspace.d.ts +232 -0
  31. package/dist/app/workspace.d.ts.map +1 -0
  32. package/dist/app/workspace.js +413 -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,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"]}
@@ -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) {