pith-ui 0.1.1 → 0.1.4

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 (110) hide show
  1. package/AI.md +12 -1
  2. package/API.md +347 -192
  3. package/README.md +3 -1
  4. package/dist/composer.d.ts.map +1 -1
  5. package/dist/composer.js +37 -27
  6. package/dist/composer.js.map +1 -1
  7. package/dist/content/conversation-reader.d.ts.map +1 -1
  8. package/dist/content/conversation-reader.js +8 -1
  9. package/dist/content/conversation-reader.js.map +1 -1
  10. package/dist/content/conversation-view.d.ts.map +1 -1
  11. package/dist/content/conversation-view.js +34 -8
  12. package/dist/content/conversation-view.js.map +1 -1
  13. package/dist/content/image-viewer.d.ts.map +1 -1
  14. package/dist/content/image-viewer.js +11 -3
  15. package/dist/content/image-viewer.js.map +1 -1
  16. package/dist/content/paged-preview.d.ts +1 -1
  17. package/dist/content/paged-preview.d.ts.map +1 -1
  18. package/dist/content/paged-preview.js +4 -2
  19. package/dist/content/paged-preview.js.map +1 -1
  20. package/dist/content/views.d.ts +3 -0
  21. package/dist/content/views.d.ts.map +1 -1
  22. package/dist/content/views.js +110 -41
  23. package/dist/content/views.js.map +1 -1
  24. package/dist/content/welcome.d.ts.map +1 -1
  25. package/dist/content/welcome.js +5 -2
  26. package/dist/content/welcome.js.map +1 -1
  27. package/dist/dom.js +1 -1
  28. package/dist/dom.js.map +1 -1
  29. package/dist/files/panels.d.ts +2 -0
  30. package/dist/files/panels.d.ts.map +1 -1
  31. package/dist/files/panels.js +202 -128
  32. package/dist/files/panels.js.map +1 -1
  33. package/dist/files/systems.d.ts.map +1 -1
  34. package/dist/files/systems.js +37 -64
  35. package/dist/files/systems.js.map +1 -1
  36. package/dist/forms/actions.d.ts +23 -2
  37. package/dist/forms/actions.d.ts.map +1 -1
  38. package/dist/forms/actions.js +53 -25
  39. package/dist/forms/actions.js.map +1 -1
  40. package/dist/forms/custom-connection.d.ts.map +1 -1
  41. package/dist/forms/custom-connection.js +3 -2
  42. package/dist/forms/custom-connection.js.map +1 -1
  43. package/dist/forms/history.d.ts +1 -1
  44. package/dist/forms/history.d.ts.map +1 -1
  45. package/dist/forms/history.js +78 -15
  46. package/dist/forms/history.js.map +1 -1
  47. package/dist/forms/identity.d.ts.map +1 -1
  48. package/dist/forms/identity.js +9 -25
  49. package/dist/forms/identity.js.map +1 -1
  50. package/dist/forms/model-editor.js +3 -3
  51. package/dist/forms/model-editor.js.map +1 -1
  52. package/dist/forms/panels.d.ts +9 -2
  53. package/dist/forms/panels.d.ts.map +1 -1
  54. package/dist/forms/panels.js +79 -88
  55. package/dist/forms/panels.js.map +1 -1
  56. package/dist/forms/provider-login.d.ts.map +1 -1
  57. package/dist/forms/provider-login.js +20 -36
  58. package/dist/forms/provider-login.js.map +1 -1
  59. package/dist/forms/resource-editor.js +5 -4
  60. package/dist/forms/resource-editor.js.map +1 -1
  61. package/dist/foundations.d.ts +1 -1
  62. package/dist/foundations.d.ts.map +1 -1
  63. package/dist/foundations.js +22 -38
  64. package/dist/foundations.js.map +1 -1
  65. package/dist/navigation/context-menu.d.ts +7 -1
  66. package/dist/navigation/context-menu.d.ts.map +1 -1
  67. package/dist/navigation/context-menu.js +60 -57
  68. package/dist/navigation/context-menu.js.map +1 -1
  69. package/dist/navigation/navigation.d.ts +13 -0
  70. package/dist/navigation/navigation.d.ts.map +1 -1
  71. package/dist/navigation/navigation.js +96 -130
  72. package/dist/navigation/navigation.js.map +1 -1
  73. package/dist/operation.d.ts +12 -0
  74. package/dist/operation.d.ts.map +1 -0
  75. package/dist/operation.js +49 -0
  76. package/dist/operation.js.map +1 -0
  77. package/dist/primitives.d.ts +8 -1
  78. package/dist/primitives.d.ts.map +1 -1
  79. package/dist/primitives.js +114 -143
  80. package/dist/primitives.js.map +1 -1
  81. package/dist/reconcile.d.ts +11 -0
  82. package/dist/reconcile.d.ts.map +1 -0
  83. package/dist/reconcile.js +36 -0
  84. package/dist/reconcile.js.map +1 -0
  85. package/dist/select.d.ts +14 -0
  86. package/dist/select.d.ts.map +1 -0
  87. package/dist/select.js +304 -0
  88. package/dist/select.js.map +1 -0
  89. package/dist/styles.css +435 -369
  90. package/dist/surface.d.ts +31 -0
  91. package/dist/surface.d.ts.map +1 -1
  92. package/dist/surface.js +193 -3
  93. package/dist/surface.js.map +1 -1
  94. package/dist/tasks/approval.d.ts.map +1 -1
  95. package/dist/tasks/approval.js +83 -45
  96. package/dist/tasks/approval.js.map +1 -1
  97. package/dist/tasks/permission-element.d.ts +3 -0
  98. package/dist/tasks/permission-element.d.ts.map +1 -0
  99. package/dist/tasks/permission-element.js +10 -0
  100. package/dist/tasks/permission-element.js.map +1 -0
  101. package/dist/tasks/permission.d.ts.map +1 -1
  102. package/dist/tasks/permission.js +37 -18
  103. package/dist/tasks/permission.js.map +1 -1
  104. package/dist/tasks/runtime.d.ts.map +1 -1
  105. package/dist/tasks/runtime.js +30 -13
  106. package/dist/tasks/runtime.js.map +1 -1
  107. package/dist/workspace.d.ts.map +1 -1
  108. package/dist/workspace.js +93 -40
  109. package/dist/workspace.js.map +1 -1
  110. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"panels.js","sourceRoot":"","sources":["../../src/files/panels.ts"],"names":[],"mappings":"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","sourcesContent":["import { dialogHeading, escape, icon, uniqueId, setText } from '../dom.js';\nimport type { UIBlock } from '../core.js';\nimport { createPagedPreview, type PreviewKind } from '../content/paged-preview.js';\nimport { adoptProductParts } from '../foundations.js';\nimport { createButton } from '../primitives.js';\n\nexport interface FileActionOptions {\n kind: string; ownerId: string; path: string; preview?: boolean;\n copyMode?: 'file' | 'path' | 'none';\n onAction?: (action: 'preview' | 'open' | 'reveal' | 'copy' | 'copy-path') => void;\n}\nexport function fileActionsMarkup(options: FileActionOptions): string {\n const scope = `data-idle-action ${options.kind === 'resource' ? 'data-idle-workspace' : 'data-idle-conversation'}=\"${escape(options.ownerId)}\"`;\n const attributes = `${scope} data-file-kind=\"${escape(options.kind)}\" data-file-owner=\"${escape(options.ownerId)}\" data-file-path=\"${escape(options.path)}\"`;\n const preview = options.preview ? `<button type=\"button\" class=\"pui-secondary-button\" ${scope} data-preview-path=\"${escape(options.path)}\" data-preview-id=\"${escape(options.ownerId)}\">Preview</button>` : '';\n const copy = options.copyMode && options.copyMode !== 'none' ? `<button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"${options.copyMode === 'file' ? 'copy' : 'copy-path'}\">${options.copyMode === 'file' ? 'Copy file' : 'Copy path'}</button>` : '';\n return `<div class=\"pui-file-actions\">${preview}<button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"open\">Open</button><button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"reveal\">Reveal</button>${copy}</div>`;\n}\nexport function createFileActions(options: FileActionOptions) {\n const template = document.createElement('template');\n template.innerHTML = fileActionsMarkup(options);\n const element = template.content.firstElementChild as HTMLElement;\n const click = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>('button');\n if (target && !(target as HTMLButtonElement).disabled) options.onAction?.(target.dataset.fileAction as 'open' | 'reveal' | 'copy' | 'copy-path' || 'preview');\n };\n if (options.onAction) element.addEventListener('click', click);\n return { element, destroy(): void { element.removeEventListener('click', click); element.remove(); } };\n}\n\nexport interface ArtifactPanelState { ownerId: string; files: readonly { name: string; path: string }[]; loading: boolean; error: string; copyMode: 'file' | 'path' }\nexport interface ArtifactPanelOptions { container: HTMLElement; control: HTMLElement; toggle: HTMLElement; count: HTMLElement; headingId?: string; dismissExclusions?: readonly HTMLElement[] }\nexport function createArtifactPanel(options: ArtifactPanelOptions) {\n const { container: element, control, toggle, count } = options;\n element.innerHTML = `<div class=\"pui-artifacts-heading\"><h2${options.headingId ? ` id=\"${escape(options.headingId)}\"` : ''}>Files <span data-file-count></span></h2><button type=\"button\" class=\"pui-quiet-icon\" data-artifacts-close aria-label=\"Close files\">${icon('close')}</button></div><p class=\"pui-artifacts-status\" role=\"status\" hidden>Looking for files…</p><div class=\"pui-artifacts-content\"><div data-file-rows></div><p class=\"pui-form-error\" role=\"alert\" hidden></p></div>`;\n const total = element.querySelector<HTMLElement>('[data-file-count]')!;\n const loading = element.querySelector<HTMLElement>('[role=\"status\"]')!;\n const rows = element.querySelector<HTMLElement>('[data-file-rows]')!;\n const error = element.querySelector<HTMLElement>('[role=\"alert\"]')!;\n const parts = adoptProductParts(element);\n const entries = new Map<string, { element: HTMLElement; name: HTMLElement; copy: HTMLButtonElement }>();\n let open = false;\n let destroyed = false;\n function setOpen(value: boolean, restoreFocus = false): void {\n if (destroyed) return;\n open = value && !control.hidden;\n element.hidden = !open;\n toggle.setAttribute('aria-expanded', String(open));\n if (open) element.focus();\n else if (restoreFocus && !control.hidden) toggle.focus();\n }\n const abort = new AbortController();\n toggle.addEventListener('click', () => setOpen(!open), { signal: abort.signal });\n element.addEventListener('click', event => { if ((event.target as Element).closest('[data-artifacts-close]')) setOpen(false, true); }, { signal: abort.signal });\n const outside = (event: Event) => { const target = event.target as Node; if (open && !element.contains(target) && !control.contains(target) && !options.dismissExclusions?.some(node => node.contains(target))) setOpen(false); };\n document.addEventListener('click', outside, { signal: abort.signal });\n document.addEventListener('focusin', outside, { signal: abort.signal });\n document.addEventListener('keydown', event => { if (event.key === 'Escape' && open && !document.querySelector('dialog[open]')) { event.preventDefault(); setOpen(false, true); } }, { signal: abort.signal });\n return {\n element, setOpen, get open() { return open; },\n update(state: Readonly<ArtifactPanelState>): void {\n if (destroyed) return;\n const focused = document.activeElement;\n control.hidden = !state.ownerId || (!state.files.length && !state.error);\n if (control.hidden) setOpen(false);\n const number = `${state.files.length} ${state.files.length === 1 ? 'file' : 'files'}`;\n const label = state.error ? 'Conversation files unavailable' : `Conversation files (${number})`;\n toggle.setAttribute('aria-label', label); toggle.title = label;\n count.textContent = state.files.length ? String(state.files.length) : '!';\n total.textContent = number;\n loading.hidden = !state.loading;\n error.hidden = !state.error;\n parts.feedback(error).update({ message: state.error, tone: 'error' });\n const keep = new Set(state.files.map(file => `${state.ownerId}/${file.path}`));\n for (const [key, entry] of entries) if (!keep.has(key)) { entry.element.remove(); entries.delete(key); }\n let cursor = rows.firstElementChild;\n for (const file of state.files) {\n const key = `${state.ownerId}/${file.path}`;\n let entry = entries.get(key);\n if (!entry) {\n const article = document.createElement('article'); article.className = 'pui-file-card';\n article.innerHTML = `${icon('file')}<div class=\"pui-file-info\"><strong></strong><span class=\"pui-file-path\">${escape(file.path)}</span></div>${fileActionsMarkup({ kind: 'artifact', ownerId: state.ownerId, path: file.path, preview: true, copyMode: state.copyMode })}`;\n entry = { element: article, name: article.querySelector('strong')!, copy: article.querySelector<HTMLButtonElement>('[data-file-action=\"copy\"], [data-file-action=\"copy-path\"]')! };\n entries.set(key, entry);\n }\n setText(entry.name, file.name);\n const copyAction = state.copyMode === 'file' ? 'copy' : 'copy-path';\n if (entry.copy.dataset.fileAction !== copyAction) entry.copy.dataset.fileAction = copyAction;\n if (entry.copy.dataset.copyPending !== 'true') setText(entry.copy, state.copyMode === 'file' ? 'Copy file' : 'Copy path');\n if (entry.element !== cursor) rows.insertBefore(entry.element, cursor);\n cursor = entry.element.nextElementSibling;\n }\n if (focused instanceof HTMLElement && element.contains(focused) && document.activeElement !== focused) focused.focus({ preventScroll: true });\n },\n destroy(): void { destroyed = true; abort.abort(); parts.destroy(); entries.clear(); element.replaceChildren(); },\n };\n}\n\nexport interface ResourceDisplayEntry { name: string; path: string; description?: string; content?: string; fileActions?: Node; actions?: Node }\nexport interface ResourcesPanelState {\n instructions: readonly ResourceDisplayEntry[]; skills: readonly ResourceDisplayEntry[]; templates: readonly ResourceDisplayEntry[];\n diagnostics: readonly string[]; createInstructions?: Node; canCreateInstructions?: boolean;\n}\nexport interface ResourcesPanelOptions { container?: HTMLElement; titleId?: string; dialogId?: string; listId?: string; errorId?: string; onClose?: () => void; onRefresh?: () => void; onCreate?: (kind: 'instructions' | 'skill' | 'template') => void }\nexport function createResourcesPanel(options: ResourcesPanelOptions = {}) {\n const element = options.container || document.createElement('div');\n const ids = { titleId: options.titleId || uniqueId('pui-resources-title'), dialogId: options.dialogId || uniqueId('pui-resources-dialog'), listId: options.listId || uniqueId('pui-resources-list'), errorId: options.errorId || uniqueId('pui-resources-error') };\n const close = (event: Event) => {\n if (!(event.target as Element).closest('[data-close]')) return;\n if (options.onClose) options.onClose();\n else { const dialog = element.closest('dialog'); if (dialog?.open) dialog.close(); else element.hidden = true; }\n };\n element.addEventListener('click', close);\n let list: HTMLElement | undefined, error: HTMLElement | undefined;\n let destroyed = false;\n const parts = adoptProductParts(element);\n const buttons: ReturnType<typeof createButton>[] = [];\n const rowButtons: ReturnType<typeof createButton>[] = [];\n const createActions = new Map<ReturnType<typeof createButton>,string>(); let createDisabled = false;\n const button = (label: string, onAction: () => void, row = false, create = false) => { const block = createButton({label,appearance:'secondary',onAction,disabled:create && createDisabled}); (row ? rowButtons : buttons).push(block); if (create) createActions.set(block,label); return block.element; };\n const clearButtons = (list = buttons) => { for (const block of list.splice(0)) {createActions.delete(block); block.destroy();} };\n function row(entry: ResourceDisplayEntry, type: 'instructions' | 'skill' | 'template'): HTMLElement {\n const outer = document.createElement('article'); outer.className = type === 'instructions' ? 'pui-resource-card' : 'pui-file-card';\n const body = type === 'instructions' ? document.createElement('div') : outer;\n if (type === 'instructions') body.className = 'pui-file-card';\n body.innerHTML = `${type === 'template' ? '' : icon('file')}<div class=\"pui-file-info\"><strong>${escape(entry.name)}</strong>${type !== 'instructions' ? `<p>${escape(entry.description || '')}</p>` : ''}<span class=\"pui-file-path\">${escape(entry.path)}</span></div>`;\n if (entry.fileActions) body.append(entry.fileActions);\n if (entry.actions) body.append(entry.actions);\n if (type === 'instructions') { outer.append(body); const details = document.createElement('details'); details.className = 'pui-resource-preview'; details.innerHTML = `<summary>View instructions</summary><pre>${escape(entry.content || '')}</pre>`; outer.append(details); }\n return outer;\n }\n return {\n element,\n open(workspaceName: string, toolbar?: Node): void {\n if (destroyed) return;\n clearButtons();\n clearButtons(rowButtons);\n element.hidden = false;\n element.innerHTML = `${dialogHeading('Workspace resources', ids.titleId, ids.dialogId, workspaceName)}<p class=\"pui-modal-description\">Instructions, skills and prompt templates are loaded by Pith for each task. Edit them here or open their Markdown files.</p><div class=\"pui-feature-toolbar\" data-resources-toolbar></div><div id=\"${escape(ids.listId)}\" data-resources-list><p class=\"pui-feature-hint\">Loading workspace resources…</p></div><div id=\"${escape(ids.errorId)}\" data-resources-error class=\"pui-form-error\" role=\"alert\"></div>`;\n const actions = element.querySelector<HTMLElement>('[data-resources-toolbar]')!;\n if (toolbar) actions.append(toolbar);\n else actions.append(button('Refresh', () => options.onRefresh?.()), button('Add skill', () => options.onCreate?.('skill'),false,true), button('Add prompt template', () => options.onCreate?.('template'),false,true));\n list = element.querySelector<HTMLElement>('[data-resources-list]')!;\n error = element.querySelector<HTMLElement>('[data-resources-error]')!;\n parts.layout(actions, 'toolbar').update({});\n },\n setError(message: string): void { if (!destroyed && error) parts.feedback(error).update({ message, tone: 'error' }); },\n setCreateDisabled(disabled: boolean): void {if (destroyed) return; createDisabled = disabled; for (const [block,label] of createActions) block.update({label,appearance:'secondary',disabled});},\n update(state: Readonly<ResourcesPanelState>): void {\n if (destroyed || !list) return;\n clearButtons(rowButtons);\n list.replaceChildren();\n for (const [title, entries, type, empty] of [\n ['Instructions', state.instructions, 'instructions', 'No workspace instructions found.'],\n ['Skills', state.skills, 'skill', 'No skills found. Add .pi/skills/<skill-name>/SKILL.md in this workspace, then refresh.'],\n ['Prompt templates', state.templates, 'template', 'No prompt templates yet.'],\n ] as const) {\n const section = document.createElement('section'); section.className = 'pui-resource-section';\n const heading = document.createElement('h3'); heading.textContent = title; section.append(heading);\n if (entries.length) entries.forEach((entry) => section.append(row(entry, type)));\n else { const hint = document.createElement('p'); hint.className = 'pui-feature-hint'; hint.textContent = empty; section.append(hint); }\n if (type === 'instructions' && state.createInstructions) section.append(state.createInstructions);\n else if (type === 'instructions' && state.canCreateInstructions) section.append(button('Create AGENTS.md in this workspace', () => options.onCreate?.('instructions'),true,true));\n list.append(section);\n }\n parts.update();\n if (state.diagnostics.length) {\n const section = document.createElement('section'); section.className = 'pui-resource-section pui-resource-diagnostics';\n section.innerHTML = `<h3>Resource notes</h3>${state.diagnostics.map((note) => `<p>${escape(note)}</p>`).join('')}`;\n list.append(section);\n }\n },\n destroy(): void { destroyed = true; clearButtons(); clearButtons(rowButtons); parts.destroy(); element.removeEventListener('click', close); element.replaceChildren(); },\n };\n}\n\nexport interface FilePreviewState { kind: PreviewKind | 'image'; text?: string; imageSrc?: string; imageAlt?: string; truncated?: boolean; error?: string }\nexport interface FilePreviewOptions { container?: HTMLElement; titleId?: string; dialogId?: string; bodyId?: string; onClose?: () => void }\nexport function createFilePreview(options: FilePreviewOptions = {}) {\n const element = options.container || document.createElement('div');\n const ids = { titleId: options.titleId || uniqueId('pui-preview-title'), dialogId: options.dialogId || uniqueId('pui-preview-dialog'), bodyId: options.bodyId || uniqueId('pui-preview-body') };\n const close = (event: Event) => {\n if (!(event.target as Element).closest('[data-close]')) return;\n if (options.onClose) options.onClose();\n else { const dialog = element.closest('dialog'); if (dialog?.open) dialog.close(); else element.hidden = true; }\n };\n element.addEventListener('click', close);\n let body: HTMLElement | undefined;\n let page: UIBlock<{ text: string; kind: PreviewKind }> | undefined;\n let destroyed = false;\n function clear(): void { page?.destroy(); page = undefined; element.replaceChildren(); body = undefined; }\n return {\n element, clear,\n open(input: { name: string; path: string; actions: Node }): void {\n if (destroyed) return;\n clear();\n element.hidden = false;\n element.innerHTML = `${dialogHeading(input.name, ids.titleId, ids.dialogId, 'File preview')}<p class=\"pui-file-preview-path\">${escape(input.path)}</p><div id=\"${escape(ids.bodyId)}\" data-file-preview-body class=\"pui-file-preview-body\" aria-live=\"polite\">Loading preview…</div><div class=\"pui-file-preview-actions\"></div>`;\n element.querySelector('.pui-file-preview-actions')!.append(input.actions);\n body = element.querySelector<HTMLElement>('[data-file-preview-body]')!;\n },\n update(state: Readonly<FilePreviewState>): void {\n if (destroyed || !body) return;\n page?.destroy(); page = undefined; body.replaceChildren();\n if (state.error) body.textContent = state.error;\n else if (state.kind === 'image') {\n const image = document.createElement('img'); image.className = 'pui-file-preview-image';\n image.src = state.imageSrc || ''; image.alt = state.imageAlt || '';\n image.setAttribute('role', 'button'); image.tabIndex = 0; image.title = 'Click to enlarge'; body.append(image);\n } else page = createPagedPreview({ container: body, text: state.text || '', kind: state.kind });\n if (state.truncated) { const note = document.createElement('p'); note.className = 'pui-preview-note'; note.textContent = 'Showing the first 8 MiB. Use Open for the complete file.'; body.append(note); }\n },\n destroy(): void { if (destroyed) return; clear(); element.removeEventListener('click', close); destroyed = true; },\n };\n}\n"]}
1
+ {"version":3,"file":"panels.js","sourceRoot":"","sources":["../../src/files/panels.ts"],"names":[],"mappings":"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","sourcesContent":["import { dialogHeading, escape, icon, uniqueId, setText } from '../dom.js';\nimport type { UIBlock } from '../core.js';\nimport { createPagedPreview, type PreviewKind } from '../content/paged-preview.js';\nimport { adoptProductParts } from '../foundations.js';\nimport { createButton } from '../primitives.js';\nimport { bindContentClose, installAnchoredSurface } from '../surface.js';\nimport { reconcileKeyed } from '../reconcile.js';\n\nexport interface FileActionOptions {\n kind: string; ownerId: string; path: string; preview?: boolean;\n copyMode?: 'file' | 'path' | 'none';\n onAction?: (action: 'preview' | 'open' | 'reveal' | 'copy' | 'copy-path') => void;\n}\nexport function fileActionsMarkup(options: FileActionOptions): string {\n const scope = `data-idle-action ${options.kind === 'resource' ? 'data-idle-workspace' : 'data-idle-conversation'}=\"${escape(options.ownerId)}\"`;\n const attributes = `${scope} data-file-kind=\"${escape(options.kind)}\" data-file-owner=\"${escape(options.ownerId)}\" data-file-path=\"${escape(options.path)}\"`;\n const preview = options.preview ? `<button type=\"button\" class=\"pui-secondary-button\" ${scope} data-preview-path=\"${escape(options.path)}\" data-preview-id=\"${escape(options.ownerId)}\">Preview</button>` : '';\n const copy = options.copyMode && options.copyMode !== 'none' ? `<button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"${options.copyMode === 'file' ? 'copy' : 'copy-path'}\">${options.copyMode === 'file' ? 'Copy file' : 'Copy path'}</button>` : '';\n return `<div class=\"pui-file-actions\">${preview}<button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"open\">Open</button><button type=\"button\" class=\"pui-secondary-button\" ${attributes} data-file-action=\"reveal\">Reveal</button>${copy}</div>`;\n}\nexport function createFileActions(options: FileActionOptions) {\n const template = document.createElement('template');\n template.innerHTML = fileActionsMarkup(options);\n const element = template.content.firstElementChild as HTMLElement;\n const parts = adoptProductParts(element);\n let destroyed = false;\n const click = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>('button');\n if (target && element.contains(target) && !(target as HTMLButtonElement).disabled) {\n event.stopPropagation(); options.onAction?.(target.dataset.fileAction as 'open' | 'reveal' | 'copy' | 'copy-path' || 'preview');\n }\n };\n if (options.onAction) element.addEventListener('click', click);\n return {\n element,\n setDisabled(disabled: boolean): void { if (!destroyed) for (const button of element.querySelectorAll('button')) parts.action(button).update({disabled}); },\n destroy(): void { if (destroyed) return; destroyed = true; parts.destroy(); element.removeEventListener('click', click); element.remove(); },\n };\n}\n\nexport interface ArtifactPanelState { ownerId: string; files: readonly { name: string; path: string }[]; loading: boolean; error: string; copyMode: 'file' | 'path' }\nexport interface ArtifactPanelOptions { container: HTMLElement; control: HTMLElement; toggle: HTMLElement; count: HTMLElement; headingId?: string; dismissExclusions?: readonly HTMLElement[] }\nexport function createArtifactPanel(options: ArtifactPanelOptions) {\n const { container: element, control, toggle, count } = options;\n element.innerHTML = `<div class=\"pui-artifacts-heading\"><h2${options.headingId ? ` id=\"${escape(options.headingId)}\"` : ''}>Files <span data-file-count></span></h2><button type=\"button\" class=\"pui-quiet-icon\" data-artifacts-close aria-label=\"Close files\">${icon('close')}</button></div><p class=\"pui-artifacts-status\" role=\"status\" hidden>Looking for files…</p><div class=\"pui-artifacts-content\"><div data-file-rows></div><p class=\"pui-form-error\" role=\"alert\" hidden></p></div>`;\n const total = element.querySelector<HTMLElement>('[data-file-count]')!;\n const loading = element.querySelector<HTMLElement>('[role=\"status\"]')!;\n const rows = element.querySelector<HTMLElement>('[data-file-rows]')!;\n const error = element.querySelector<HTMLElement>('[role=\"alert\"]')!;\n const parts = adoptProductParts(element);\n const entries = new Map<string, { element: HTMLElement; name: HTMLElement; copy: HTMLButtonElement }>();\n let destroyed = false;\n const surface = installAnchoredSurface({\n trigger: toggle,\n panel: element,\n position: false,\n closeOnFocusOut: true,\n exclusions: [control, ...(options.dismissExclusions ?? [])],\n canOpen: () => !control.hidden,\n canEscape: () => !document.querySelector('dialog[open]'),\n onToggle(open) { if (open) element.focus(); },\n });\n function setOpen(value: boolean, restoreFocus = false): void {\n if (destroyed) return;\n if (value) surface.open();\n else surface.close(restoreFocus && !control.hidden);\n }\n const abort = new AbortController();\n toggle.addEventListener('click', () => setOpen(!surface.isOpen()), { signal: abort.signal });\n element.addEventListener('click', event => { if ((event.target as Element).closest('[data-artifacts-close]')) setOpen(false, true); }, { signal: abort.signal });\n return {\n element, setOpen, get open() { return surface.isOpen(); },\n update(state: Readonly<ArtifactPanelState>): void {\n if (destroyed) return;\n control.hidden = !state.ownerId || (!state.files.length && !state.error);\n if (control.hidden) setOpen(false);\n const number = `${state.files.length} ${state.files.length === 1 ? 'file' : 'files'}`;\n const label = state.error ? 'Conversation files unavailable' : `Conversation files (${number})`;\n toggle.setAttribute('aria-label', label); toggle.title = label;\n count.textContent = state.files.length ? String(state.files.length) : '!';\n total.textContent = number;\n loading.hidden = !state.loading;\n error.hidden = !state.error;\n parts.feedback(error).update({ message: state.error, tone: 'error' });\n reconcileKeyed(rows, entries, state.files, {\n key: file => `${state.ownerId}/${file.path}`,\n element: entry => entry.element,\n create(file) {\n const article = document.createElement('article'); article.className = 'pui-file-card';\n article.innerHTML = `${icon('file')}<div class=\"pui-file-info\"><strong></strong><span class=\"pui-file-path\">${escape(file.path)}</span></div>${fileActionsMarkup({ kind: 'artifact', ownerId: state.ownerId, path: file.path, preview: true, copyMode: state.copyMode })}`;\n return { element: article, name: article.querySelector('strong')!, copy: article.querySelector<HTMLButtonElement>('[data-file-action=\"copy\"], [data-file-action=\"copy-path\"]')! };\n },\n update(entry, file) {\n setText(entry.name, file.name);\n const copyAction = state.copyMode === 'file' ? 'copy' : 'copy-path';\n if (entry.copy.dataset.fileAction !== copyAction) entry.copy.dataset.fileAction = copyAction;\n if (entry.copy.dataset.copyPending !== 'true') setText(entry.copy, state.copyMode === 'file' ? 'Copy file' : 'Copy path');\n },\n destroy() {},\n });\n parts.update();\n },\n destroy(): void { destroyed = true; surface.destroy(); abort.abort(); parts.destroy(); entries.clear(); element.replaceChildren(); },\n };\n}\n\nexport interface ResourceDisplayEntry { name: string; path: string; description?: string; content?: string; fileActions?: Node; actions?: Node }\nexport interface ResourcesPanelState {\n instructions: readonly ResourceDisplayEntry[]; skills: readonly ResourceDisplayEntry[]; templates: readonly ResourceDisplayEntry[];\n diagnostics: readonly string[]; createInstructions?: Node; canCreateInstructions?: boolean;\n}\nexport interface ResourcesPanelOptions { container?: HTMLElement; titleId?: string; dialogId?: string; listId?: string; errorId?: string; onClose?: () => void; onRefresh?: () => void; onCreate?: (kind: 'instructions' | 'skill' | 'template') => void }\nexport function createResourcesPanel(options: ResourcesPanelOptions = {}) {\n const element = options.container || document.createElement('div');\n const ids = { titleId: options.titleId || uniqueId('pui-resources-title'), dialogId: options.dialogId || uniqueId('pui-resources-dialog'), listId: options.listId || uniqueId('pui-resources-list'), errorId: options.errorId || uniqueId('pui-resources-error') };\n const close = bindContentClose(element, { dialogId: ids.dialogId, onClose: options.onClose });\n let list: HTMLElement | undefined, error: HTMLElement | undefined;\n let destroyed = false;\n const parts = adoptProductParts(element);\n const buttons: ReturnType<typeof createButton>[] = [];\n const rowButtons: ReturnType<typeof createButton>[] = [];\n type Slot = { source?: Node; nodes: ChildNode[] };\n type ResourceRow = { element: HTMLElement; body?: HTMLElement; name?: HTMLElement; description?: HTMLElement; path?: HTMLElement; content?: HTMLElement; slots?: [Slot, Slot] };\n type Section = { element: HTMLElement; rows: Map<string, ResourceRow>; create: Slot };\n const sections = new Map<string, Section>();\n let diagnostics: Section | undefined;\n let instructionButton: ReturnType<typeof createButton> | undefined;\n const createActions = new Map<ReturnType<typeof createButton>,string>(); let createDisabled = false;\n const button = (label: string, onAction: () => void, row = false, create = false) => { const block = createButton({label,appearance:'secondary',onAction,disabled:create && createDisabled}); (row ? rowButtons : buttons).push(block); if (create) createActions.set(block,label); return block.element; };\n const clearButtons = (list = buttons) => { for (const block of list.splice(0)) {createActions.delete(block); block.destroy();} };\n function updateSlot(parent: HTMLElement, slot: Slot, source?: Node): void {\n if (slot.source === source) return;\n for (const node of slot.nodes) if (node.parentNode === parent) node.remove();\n slot.source = source;\n slot.nodes = source ? source instanceof DocumentFragment ? [...source.childNodes] : [source as ChildNode] : [];\n }\n function row(type: 'instructions' | 'skill' | 'template'): ResourceRow {\n const outer = document.createElement('article'); outer.className = type === 'instructions' ? 'pui-resource-card' : 'pui-file-card';\n const body = type === 'instructions' ? document.createElement('div') : outer;\n if (type === 'instructions') body.className = 'pui-file-card';\n body.innerHTML = `${type === 'template' ? '' : icon('file')}<div class=\"pui-file-info\"><strong></strong>${type !== 'instructions' ? '<p></p>' : ''}<span class=\"pui-file-path\"></span></div>`;\n let content: HTMLElement | undefined;\n if (type === 'instructions') { outer.append(body); const details = document.createElement('details'); details.className = 'pui-resource-preview'; details.innerHTML = '<summary>View instructions</summary><pre></pre>'; outer.append(details); content = details.querySelector('pre')!; }\n return { element: outer, body, name: body.querySelector('strong')!, description: body.querySelector('p') || undefined, path: body.querySelector<HTMLElement>('.pui-file-path')!, content, slots: [{nodes:[]}, {nodes:[]}] };\n }\n function updateRow(row: ResourceRow, entry: ResourceDisplayEntry): void {\n setText(row.name!, entry.name); setText(row.path!, entry.path);\n if (row.description) setText(row.description, entry.description || '');\n if (row.content) setText(row.content, entry.content || '');\n updateSlot(row.body!, row.slots![0], entry.fileActions); updateSlot(row.body!, row.slots![1], entry.actions);\n let cursor = row.body!.querySelector('.pui-file-info')!.nextSibling;\n for (const node of row.slots!.flatMap(slot => slot.nodes)) {\n if (node !== cursor) row.body!.insertBefore(node, cursor);\n cursor = node.nextSibling;\n }\n }\n function section(): Section {\n const element = document.createElement('section'); element.className = 'pui-resource-section';\n return {element, rows:new Map(), create:{nodes:[]}};\n }\n return {\n element,\n open(workspaceName: string, toolbar?: Node): void {\n if (destroyed) return;\n clearButtons();\n clearButtons(rowButtons);\n instructionButton = undefined; sections.clear(); diagnostics = undefined;\n element.hidden = false;\n element.innerHTML = `${dialogHeading('Workspace resources', ids.titleId, ids.dialogId, workspaceName)}<p class=\"pui-modal-description\">Instructions, skills and prompt templates are loaded by Pith for each task. Edit them here or open their Markdown files.</p><div class=\"pui-feature-toolbar\" data-resources-toolbar></div><div id=\"${escape(ids.listId)}\" data-resources-list><p class=\"pui-feature-hint\">Loading workspace resources…</p></div><div id=\"${escape(ids.errorId)}\" data-resources-error class=\"pui-form-error\" role=\"alert\"></div>`;\n const actions = element.querySelector<HTMLElement>('[data-resources-toolbar]')!;\n if (toolbar) actions.append(toolbar);\n else actions.append(button('Refresh', () => options.onRefresh?.()), button('Add skill', () => options.onCreate?.('skill'),false,true), button('Add prompt template', () => options.onCreate?.('template'),false,true));\n list = element.querySelector<HTMLElement>('[data-resources-list]')!;\n error = element.querySelector<HTMLElement>('[data-resources-error]')!;\n parts.layout(actions, 'toolbar').update({});\n },\n setError(message: string): void { if (!destroyed && error) parts.feedback(error).update({ message, tone: 'error' }); },\n setCreateDisabled(disabled: boolean): void {if (destroyed) return; createDisabled = disabled; for (const [block,label] of createActions) block.update({label,appearance:'secondary',disabled});},\n update(state: Readonly<ResourcesPanelState>): void {\n if (destroyed || !list) return;\n if (!sections.size) list.replaceChildren();\n for (const [title, entries, type, empty] of [\n ['Instructions', state.instructions, 'instructions', 'No workspace instructions found.'],\n ['Skills', state.skills, 'skill', 'No skills found. Add .pi/skills/<skill-name>/SKILL.md in this workspace, then refresh.'],\n ['Prompt templates', state.templates, 'template', 'No prompt templates yet.'],\n ] as const) {\n let current = sections.get(type);\n if (!current) { current = section(); sections.set(type, current); list.append(current.element); }\n type Item = { key: string; kind: 'heading' | 'empty' | 'entry'; entry?: ResourceDisplayEntry };\n const items: Item[] = [{key:'heading', kind:'heading'}, ...entries.map(entry => ({key:`entry:${entry.path}`, kind:'entry' as const, entry}))];\n if (!entries.length) items.push({key:'empty', kind:'empty'});\n reconcileKeyed(current.element, current.rows, items, {\n key: item => item.key, element: row => row.element,\n create(item) {\n if (item.kind === 'entry') return row(type);\n const element = document.createElement(item.kind === 'heading' ? 'h3' : 'p');\n if (item.kind === 'empty') element.className = 'pui-feature-hint';\n return {element};\n },\n update(row, item) { if (item.entry) updateRow(row, item.entry); else setText(row.element, item.kind === 'heading' ? title : empty); },\n destroy() {},\n });\n if (type === 'instructions') {\n let create = state.createInstructions;\n if (!create && state.canCreateInstructions) {\n if (!instructionButton) {\n const element = button('Create AGENTS.md in this workspace', () => options.onCreate?.('instructions'), true, true);\n instructionButton = rowButtons.find(block => block.element === element)!;\n }\n create = instructionButton.element;\n }\n updateSlot(current.element, current.create, create);\n for (const node of current.create.nodes) if (node.parentNode !== current.element) current.element.append(node);\n }\n }\n if (state.diagnostics.length) {\n if (!diagnostics) { diagnostics = section(); diagnostics.element.classList.add('pui-resource-diagnostics'); list.append(diagnostics.element); }\n reconcileKeyed(diagnostics.element, diagnostics.rows, [{key:'heading', text:'Resource notes'}, ...state.diagnostics.map((text,index) => ({key:`note:${index}`, text}))], {\n key: value => value.key, element: row => row.element,\n create(value) { return {element:document.createElement(value.key === 'heading' ? 'h3' : 'p')}; },\n update(row, value) {setText(row.element, value.text);}, destroy() {},\n });\n } else if (diagnostics) { diagnostics.element.remove(); diagnostics = undefined; }\n parts.update();\n },\n destroy(): void { if (destroyed) return; destroyed = true; clearButtons(); clearButtons(rowButtons); sections.clear(); diagnostics = undefined; parts.destroy(); close.destroy(); element.replaceChildren(); },\n };\n}\n\nexport interface FilePreviewState { kind: PreviewKind | 'image'; text?: string; imageSrc?: string; imageAlt?: string; truncated?: boolean; error?: string }\nexport interface FilePreviewOptions { container?: HTMLElement; titleId?: string; dialogId?: string; bodyId?: string; onClose?: () => void; onCopyCode?: (text: string, button: HTMLButtonElement) => void }\nexport function createFilePreview(options: FilePreviewOptions = {}) {\n const element = options.container || document.createElement('div');\n const ids = { titleId: options.titleId || uniqueId('pui-preview-title'), dialogId: options.dialogId || uniqueId('pui-preview-dialog'), bodyId: options.bodyId || uniqueId('pui-preview-body') };\n const close = bindContentClose(element, { dialogId: ids.dialogId, onClose: options.onClose });\n let body: HTMLElement | undefined;\n let page: UIBlock<{ text: string; kind: PreviewKind }> | undefined;\n let image: HTMLImageElement | undefined;\n let note: HTMLElement | undefined;\n let mode: FilePreviewState['kind'] | 'error' | undefined;\n let destroyed = false;\n function clear(): void {\n if (destroyed) return;\n page?.destroy(); page = undefined; image = undefined; note = undefined; mode = undefined;\n element.replaceChildren(); body = undefined;\n }\n return {\n element, clear,\n open(input: { name: string; path: string; actions: Node }): void {\n if (destroyed) return;\n clear();\n element.hidden = false;\n element.innerHTML = `${dialogHeading(input.name, ids.titleId, ids.dialogId, 'File preview')}<p class=\"pui-file-preview-path\">${escape(input.path)}</p><div id=\"${escape(ids.bodyId)}\" data-file-preview-body class=\"pui-file-preview-body\" aria-live=\"polite\">Loading preview…</div><div class=\"pui-file-preview-actions\"></div>`;\n element.querySelector('.pui-file-preview-actions')!.append(input.actions);\n body = element.querySelector<HTMLElement>('[data-file-preview-body]')!;\n },\n update(state: Readonly<FilePreviewState>): void {\n if (destroyed || !body) return;\n const nextMode = state.error ? 'error' : state.kind;\n if (mode !== nextMode) {\n page?.destroy(); page = undefined; image = undefined; note = undefined;\n body.replaceChildren(); mode = nextMode;\n }\n if (state.error) setText(body, state.error);\n else if (state.kind === 'image') {\n if (!image) {\n image = document.createElement('img'); image.className = 'pui-file-preview-image';\n image.setAttribute('role', 'button'); image.tabIndex = 0; image.title = 'Click to enlarge'; body.append(image);\n }\n if (image.getAttribute('src') !== (state.imageSrc || '')) image.src = state.imageSrc || '';\n if (image.alt !== (state.imageAlt || '')) image.alt = state.imageAlt || '';\n } else if (page) page.update({ text: state.text || '', kind: state.kind });\n else page = createPagedPreview({ container: body, text: state.text || '', kind: state.kind, onCopyCode: options.onCopyCode });\n if (state.truncated) {\n if (!note) { note = document.createElement('p'); note.className = 'pui-preview-note'; note.textContent = 'Showing the first 8 MiB. Use Open for the complete file.'; }\n if (note.parentElement !== body) body.append(note);\n } else { note?.remove(); note = undefined; }\n },\n destroy(): void { if (destroyed) return; clear(); close.destroy(); destroyed = true; },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"systems.d.ts","sourceRoot":"","sources":["../../src/files/systems.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"systems.d.ts","sourceRoot":"","sources":["../../src/files/systems.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,WAAW,kBAAkB;IAAG,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC9L,wBAAgB,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,EAAE,UAAU,UAAQ,GAAG,MAAM,CAO3F;AACD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IACxH,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAC7D,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAC9H;AACD,MAAM,WAAW,eAAe;IAAG,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAAA;CAAE;AAC5G,wBAAgB,gBAAgB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAA;CAAO;;aAuB7D,IAAI;eACF,IAAI;sBACG,MAAM,GAAG,IAAI;mBAChB,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI;eAuBpC,IAAI;EAElB;AAED,MAAM,WAAW,gBAAgB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACnJ,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CAAO;;kBA2B7H,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI;sBAC7B,OAAO,GAAG,IAAI;oBAChB,MAAM,YAAW;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GAAQ,IAAI;eAC/D,IAAI;EAElB;AAED,MAAM,WAAW,uBAAuB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACxG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAK9F;AACD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAAG,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAoClM;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE;iBAkBnI,iBAAiB,UAAU,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;eAmB5F,IAAI;EAElB"}
@@ -1,5 +1,6 @@
1
1
  import { icon, setText } from '../dom.js';
2
2
  import { adoptAction, adoptFeedback, adoptProductParts } from '../foundations.js';
3
+ import { reconcileKeyed } from '../reconcile.js';
3
4
  const currency = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 6 });
4
5
  const numbers = new Intl.NumberFormat();
5
6
  export function formatCost(cost, latestTask = false) {
@@ -53,47 +54,30 @@ export function createCostLedger(options = {}) {
53
54
  update(report) {
54
55
  if (destroyed)
55
56
  return;
56
- const focused = document.activeElement;
57
57
  ensure();
58
58
  setText(note, `USD estimates for recorded requests, not a provider bill. Prices are saved per request; retries and context summaries are included when usage is reported. ${report.unknownRequests ? `${report.unknownRequests} request(s) have unknown prices or usage and are excluded. ` : ''}Older requests made before recording began are not reconstructed.`);
59
59
  const requests = report.requests || [];
60
- const keep = new Set(requests.map(request => request.id));
61
- for (const [id, row] of rows)
62
- if (!keep.has(id)) {
63
- row.element.remove();
64
- rows.delete(id);
65
- }
66
- if (!requests.length) {
67
- if (!empty.parentElement)
68
- table.append(empty);
69
- return;
70
- }
71
60
  empty.remove();
72
- let cursor = table.firstElementChild;
73
61
  const n = (value) => numbers.format(value || 0);
74
- for (const request of requests) {
75
- let row = rows.get(request.id);
76
- if (!row) {
77
- row = makeRow(request.id);
78
- rows.set(request.id, row);
79
- }
80
- setText(row.purpose, `${request.purpose} · ${request.status}`);
81
- setText(row.identity, `${request.providerName || request.provider} / ${request.modelName || request.model}`);
82
- setText(row.time, request.time);
83
- setText(row.source, request.source);
84
- setText(row.price, JSON.stringify(request.price, null, 2));
85
- row.reasoning.hidden = request.usage.reasoning == null;
86
- setText(row.reasoning, request.usage.reasoning == null ? '' : `Reasoning tokens: ${n(request.usage.reasoning)} (included in output)`);
87
- setText(row.cells[1], n(request.usage.input));
88
- setText(row.cells[2], n(request.usage.output));
89
- setText(row.cells[3], `${n(request.usage.cacheRead)} / ${n(request.usage.cacheWrite)}`);
90
- setText(row.cells[4], request.known ? currency.format(request.usage.cost.total) : 'Unknown');
91
- if (row.element !== cursor)
92
- table.insertBefore(row.element, cursor);
93
- cursor = row.element.nextElementSibling;
94
- }
95
- if (focused instanceof HTMLElement && element.contains(focused) && document.activeElement !== focused)
96
- focused.focus({ preventScroll: true });
62
+ reconcileKeyed(table, rows, requests, {
63
+ key: request => request.id, element: row => row.element, create: request => makeRow(request.id),
64
+ update(row, request) {
65
+ setText(row.purpose, `${request.purpose} · ${request.status}`);
66
+ setText(row.identity, `${request.providerName || request.provider} / ${request.modelName || request.model}`);
67
+ setText(row.time, request.time);
68
+ setText(row.source, request.source);
69
+ setText(row.price, JSON.stringify(request.price, null, 2));
70
+ row.reasoning.hidden = request.usage.reasoning == null;
71
+ setText(row.reasoning, request.usage.reasoning == null ? '' : `Reasoning tokens: ${n(request.usage.reasoning)} (included in output)`);
72
+ setText(row.cells[1], n(request.usage.input));
73
+ setText(row.cells[2], n(request.usage.output));
74
+ setText(row.cells[3], `${n(request.usage.cacheRead)} / ${n(request.usage.cacheWrite)}`);
75
+ setText(row.cells[4], request.known ? currency.format(request.usage.cost.total) : 'Unknown');
76
+ },
77
+ destroy() { },
78
+ });
79
+ if (!requests.length)
80
+ table.append(empty);
97
81
  },
98
82
  destroy() { if (!destroyed)
99
83
  clear(); destroyed = true; },
@@ -130,7 +114,7 @@ export function createUpdatePanel(options = {}) {
130
114
  const busy = ['checking', 'installing', 'restarting'].includes(state.phase);
131
115
  parts.action(check).update({ disabled: !state.enabled || (busy && !retryCheck), pending });
132
116
  install.hidden = !state.availableVersion;
133
- parts.action(install).update({ disabled: busy, pending, label: 'Update and restart' });
117
+ parts.action(install).update({ disabled: !state.enabled || busy, pending, label: 'Update and restart' });
134
118
  progress.hidden = state.phase !== 'installing';
135
119
  progress.value = state.progress;
136
120
  }
@@ -177,37 +161,26 @@ export function createCompletionNotices(options = {}) {
177
161
  update(notices) {
178
162
  if (destroyed)
179
163
  return;
180
- const focused = document.activeElement;
181
- const keep = new Set(notices.map(notice => notice.runID));
182
- for (const [id, entry] of entries)
183
- if (!keep.has(id)) {
184
- entry.element.remove();
185
- entries.delete(id);
186
- }
187
- let cursor = element.firstElementChild;
188
- for (const notice of notices) {
189
- let entry = entries.get(notice.runID);
190
- if (!entry) {
164
+ reconcileKeyed(element, entries, notices, {
165
+ key: notice => notice.runID, element: entry => entry.element,
166
+ create() {
191
167
  const article = document.createElement('article');
192
168
  article.className = 'pui-completion-notice';
193
169
  article.innerHTML = `<span class="pui-completion-check" aria-hidden="true">${icon('check')}</span><div class="pui-completion-content"><strong>Task completed</strong><p></p><button class="pui-text-button" type="button" data-conversation>Open conversation</button></div><button class="pui-quiet-icon pui-completion-dismiss" type="button" data-dismiss-completion aria-label="Dismiss completion notification">${icon('close')}</button>`;
194
- entry = { element: article, text: article.querySelector('p'), open: article.querySelector('[data-conversation]'), dismiss: article.querySelector('[data-dismiss-completion]') };
195
- entries.set(notice.runID, entry);
196
- }
197
- setText(entry.text, `${notice.workspace} · ${notice.title}`);
198
- parts.action(entry.open).update({ label: 'Open conversation' });
199
- parts.action(entry.dismiss).update({ label: 'Dismiss completion notification' });
200
- if (entry.open.dataset.conversation !== notice.id)
201
- entry.open.dataset.conversation = notice.id;
202
- if (entry.dismiss.dataset.dismissCompletion !== notice.runID)
203
- entry.dismiss.dataset.dismissCompletion = notice.runID;
204
- if (entry.element !== cursor)
205
- element.insertBefore(entry.element, cursor);
206
- cursor = entry.element.nextElementSibling;
207
- }
170
+ return { element: article, text: article.querySelector('p'), open: article.querySelector('[data-conversation]'), dismiss: article.querySelector('[data-dismiss-completion]') };
171
+ },
172
+ update(entry, notice) {
173
+ setText(entry.text, `${notice.workspace} · ${notice.title}`);
174
+ parts.action(entry.open).update({ label: 'Open conversation' });
175
+ parts.action(entry.dismiss).update({ label: 'Dismiss completion notification' });
176
+ if (entry.open.dataset.conversation !== notice.id)
177
+ entry.open.dataset.conversation = notice.id;
178
+ if (entry.dismiss.dataset.dismissCompletion !== notice.runID)
179
+ entry.dismiss.dataset.dismissCompletion = notice.runID;
180
+ },
181
+ destroy() { },
182
+ });
208
183
  parts.update();
209
- if (focused instanceof HTMLElement && element.contains(focused) && document.activeElement !== focused)
210
- focused.focus({ preventScroll: true });
211
184
  },
212
185
  destroy() { if (destroyed)
213
186
  return; destroyed = true; parts.destroy(); entries.clear(); element.removeEventListener?.('click', click); element.replaceChildren(); },
@@ -1 +1 @@
1
- {"version":3,"file":"systems.js","sourceRoot":"","sources":["../../src/files/systems.ts"],"names":[],"mappings":"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","sourcesContent":["import { icon, setText } from '../dom.js';\nimport type { UIBlock } from '../core.js';\nimport { adoptAction, adoptFeedback, adoptProductParts } from '../foundations.js';\nimport type { ActionController } from '../foundations.js';\n\nconst currency = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 6 });\nconst numbers = new Intl.NumberFormat();\nexport interface CostSummaryDisplay { unavailable?: boolean; requestCount: number; unknownRequests: number; runRequests: number; runUnknownRequests: number; total: number; runTotal: number }\nexport function formatCost(cost: CostSummaryDisplay | undefined, latestTask = false): string {\n if (cost?.unavailable) return 'Unavailable';\n const count = latestTask ? cost?.runRequests : cost?.requestCount;\n const unknown = (latestTask ? cost?.runUnknownRequests : cost?.unknownRequests) || 0;\n if (!count) return 'Not recorded';\n if (count === unknown) return 'Unknown';\n return `~${currency.format((latestTask ? cost?.runTotal : cost?.total) || 0)}${unknown ? ' (partial)' : ''}`;\n}\nexport interface CostRequestDisplay {\n id: string; purpose: string; status: string; provider: string; providerName?: string; model: string; modelName?: string;\n time: string; source: string; price: unknown; known: boolean;\n usage: { input: number; output: number; cacheRead: number; cacheWrite: number; reasoning?: number; cost: { total: number } };\n}\nexport interface CostLedgerState { unknownRequests: number; requests: readonly CostRequestDisplay[] | null }\nexport function createCostLedger(options: { container?: HTMLElement } = {}) {\n const element = options.container || document.createElement('div');\n type Row = { element: HTMLTableRowElement; purpose: HTMLElement; identity: HTMLElement; time: HTMLElement; details: HTMLDetailsElement; source: HTMLElement; price: HTMLElement; reasoning: HTMLElement; cells: HTMLTableCellElement[] };\n const rows = new Map<string, Row>();\n let table: HTMLTableSectionElement | undefined;\n let note: HTMLElement | undefined;\n let empty: HTMLTableRowElement | undefined;\n let destroyed = false;\n function clear(): void { rows.clear(); table = undefined; note = undefined; empty = undefined; element.replaceChildren(); }\n function ensure(): void {\n if (table) return;\n element.innerHTML = '<p class=\"pui-cost-note\"></p><div class=\"pui-cost-table\"><table><thead><tr><th>Request</th><th>Input</th><th>Output</th><th>Cache read / write</th><th>Estimate</th></tr></thead><tbody></tbody></table></div>';\n table = element.querySelector('tbody')!; note = element.querySelector<HTMLElement>('.pui-cost-note')!;\n empty = document.createElement('tr'); const cell = document.createElement('td'); cell.colSpan = 5; cell.textContent = 'No recorded requests yet.'; empty.append(cell);\n }\n function makeRow(id: string): Row {\n const row = document.createElement('tr');\n row.innerHTML = '<td><strong data-purpose></strong><br><span data-identity></span><br><small data-time></small><details><summary>Price source and rates (USD / million tokens)</summary><p data-source></p><pre data-price></pre><p data-reasoning hidden></p></details></td><td></td><td></td><td></td><td></td>';\n const details = row.querySelector('details')!; details.dataset.costId = id;\n return { element: row, purpose: row.querySelector('[data-purpose]')!, identity: row.querySelector('[data-identity]')!, time: row.querySelector('[data-time]')!, details, source: row.querySelector('[data-source]')!, price: row.querySelector('[data-price]')!, reasoning: row.querySelector('[data-reasoning]')!, cells: [...row.querySelectorAll('td')] };\n }\n return {\n element,\n clear(): void { if (!destroyed) clear(); },\n loading(): void { if (!destroyed && !element.childElementCount) element.textContent = 'Loading request breakdown…'; },\n setError(message: string): void { if (!destroyed) { clear(); element.textContent = message; } },\n update(report: Readonly<CostLedgerState>): void {\n if (destroyed) return;\n const focused = document.activeElement;\n ensure();\n setText(note!, `USD estimates for recorded requests, not a provider bill. Prices are saved per request; retries and context summaries are included when usage is reported. ${report.unknownRequests ? `${report.unknownRequests} request(s) have unknown prices or usage and are excluded. ` : ''}Older requests made before recording began are not reconstructed.`);\n const requests = report.requests || [];\n const keep = new Set(requests.map(request => request.id));\n for (const [id, row] of rows) if (!keep.has(id)) { row.element.remove(); rows.delete(id); }\n if (!requests.length) { if (!empty!.parentElement) table!.append(empty!); return; }\n empty!.remove();\n let cursor = table!.firstElementChild;\n const n = (value: number) => numbers.format(value || 0);\n for (const request of requests) {\n let row = rows.get(request.id);\n if (!row) { row = makeRow(request.id); rows.set(request.id, row); }\n setText(row.purpose, `${request.purpose} · ${request.status}`);\n setText(row.identity, `${request.providerName || request.provider} / ${request.modelName || request.model}`);\n setText(row.time, request.time); setText(row.source, request.source); setText(row.price, JSON.stringify(request.price, null, 2));\n row.reasoning.hidden = request.usage.reasoning == null;\n setText(row.reasoning, request.usage.reasoning == null ? '' : `Reasoning tokens: ${n(request.usage.reasoning)} (included in output)`);\n setText(row.cells[1]!, n(request.usage.input)); setText(row.cells[2]!, n(request.usage.output));\n setText(row.cells[3]!, `${n(request.usage.cacheRead)} / ${n(request.usage.cacheWrite)}`);\n setText(row.cells[4]!, request.known ? currency.format(request.usage.cost.total) : 'Unknown');\n if (row.element !== cursor) table!.insertBefore(row.element, cursor);\n cursor = row.element.nextElementSibling;\n }\n if (focused instanceof HTMLElement && element.contains(focused) && document.activeElement !== focused) focused.focus({ preventScroll: true });\n },\n destroy(): void { if (!destroyed) clear(); destroyed = true; },\n };\n}\n\nexport interface UpdatePanelState { version: string; enabled: boolean; phase: string; availableVersion: string; progress: number; message: string }\nexport function createUpdatePanel(options: { container?: HTMLElement; productName?: string; onCheck?: () => void; onInstall?: () => void } = {}) {\n const element = options.container || document.createElement('section');\n if (!element.querySelector('[data-update-version]')) element.innerHTML = '<p data-update-version></p><p data-update-message role=\"status\"></p><div class=\"pui-feature-toolbar\"><button type=\"button\" class=\"pui-secondary-button\" data-update-check>Check for updates</button><button type=\"button\" class=\"pui-secondary-button\" data-update-install hidden>Update and restart</button></div><progress max=\"100\" hidden></progress>';\n const version = element.querySelector<HTMLElement>('[data-update-version]')!;\n const message = element.querySelector<HTMLElement>('[data-update-message]')!;\n const check = element.querySelector<HTMLButtonElement>('[data-update-check]')!;\n const install = element.querySelector<HTMLButtonElement>('[data-update-install]')!;\n const progress = element.querySelector<HTMLProgressElement>('progress')!;\n const parts = adoptProductParts(element);\n let state: Readonly<UpdatePanelState> | undefined;\n let pending = false, destroyed = false;\n let error = '';\n let retryCheck = false;\n const checkAction = () => options.onCheck?.(), installAction = () => options.onInstall?.();\n check.addEventListener('click', checkAction); install.addEventListener('click', installAction);\n function render(): void {\n if (destroyed) return;\n if (!state) { parts.action(check).update({pending}); parts.action(install).update({pending}); parts.feedback(message).update({message:error,tone:'info'}); return; }\n version.textContent = `${options.productName || 'Application'} ${state.version}`;\n parts.feedback(message).update({message:error || state.message,tone:'info'});\n const busy = ['checking', 'installing', 'restarting'].includes(state.phase);\n parts.action(check).update({disabled:!state.enabled || (busy && !retryCheck),pending});\n install.hidden = !state.availableVersion; parts.action(install).update({disabled:busy,pending,label:'Update and restart'});\n progress.hidden = state.phase !== 'installing'; progress.value = state.progress;\n }\n return {\n element,\n update(value: Readonly<UpdatePanelState>): void { state = value; error = ''; retryCheck = false; render(); },\n setPending(value: boolean): void { pending = value; render(); },\n setError(value: string, options: { allowCheckRetry?: boolean } = {}): void { if (!destroyed) { error = value; retryCheck = !!options.allowCheckRetry; render(); } },\n destroy(): void { if (destroyed) return; destroyed = true; parts.destroy(); check.removeEventListener('click', checkAction); install.removeEventListener('click', installAction); },\n };\n}\n\nexport interface CompletionNoticeDisplay { id: string; runID: string; title: string; workspace: string }\nexport function historyStatusMarkup(status: 'approval' | 'running' | 'unread' | 'idle'): string {\n if (status === 'approval') return '<span class=\"pui-history-status pui-needs-approval\" role=\"img\" aria-label=\"Waiting for approval\" title=\"Waiting for approval\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v6m0 4h.01\"/></svg></span>';\n if (status === 'running') return '<span class=\"pui-history-status\" role=\"img\" aria-label=\"Running\" title=\"Running\"><i class=\"pui-history-spinner\" aria-hidden=\"true\"></i></span>';\n if (status === 'unread') return '<span class=\"pui-history-status\" role=\"img\" aria-label=\"Completed, unread\" title=\"Completed, unread\"><i class=\"pui-history-unread\" aria-hidden=\"true\"></i></span>';\n return '<span class=\"pui-history-status\" aria-hidden=\"true\"></span>';\n}\nexport function createCompletionNotices(options: { container?: HTMLElement; onOpen?: (id: string) => void; onDismiss?: (runID: string) => void } = {}): UIBlock<readonly CompletionNoticeDisplay[]> {\n const element = options.container || document.createElement('div');\n const parts = adoptProductParts(element);\n const entries = new Map<string, { element: HTMLElement; text: HTMLElement; open: HTMLButtonElement; dismiss: HTMLButtonElement }>();\n let destroyed = false;\n const click = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>('[data-conversation], [data-dismiss-completion]');\n if (!target || !element.contains(target)) return;\n if (target.dataset.conversation) options.onOpen?.(target.dataset.conversation);\n else if (target.dataset.dismissCompletion) options.onDismiss?.(target.dataset.dismissCompletion);\n };\n if (options.onOpen || options.onDismiss) element.addEventListener('click', click);\n return {\n element,\n update(notices): void {\n if (destroyed) return;\n const focused = document.activeElement;\n const keep = new Set(notices.map(notice => notice.runID));\n for (const [id, entry] of entries) if (!keep.has(id)) { entry.element.remove(); entries.delete(id); }\n let cursor = element.firstElementChild;\n for (const notice of notices) {\n let entry = entries.get(notice.runID);\n if (!entry) {\n const article = document.createElement('article'); article.className = 'pui-completion-notice';\n article.innerHTML = `<span class=\"pui-completion-check\" aria-hidden=\"true\">${icon('check')}</span><div class=\"pui-completion-content\"><strong>Task completed</strong><p></p><button class=\"pui-text-button\" type=\"button\" data-conversation>Open conversation</button></div><button class=\"pui-quiet-icon pui-completion-dismiss\" type=\"button\" data-dismiss-completion aria-label=\"Dismiss completion notification\">${icon('close')}</button>`;\n entry = { element: article, text: article.querySelector('p')!, open: article.querySelector('[data-conversation]')!, dismiss: article.querySelector('[data-dismiss-completion]')! };\n entries.set(notice.runID, entry);\n }\n setText(entry.text, `${notice.workspace} · ${notice.title}`);\n parts.action(entry.open).update({label:'Open conversation'});\n parts.action(entry.dismiss).update({label:'Dismiss completion notification'});\n if (entry.open.dataset.conversation !== notice.id) entry.open.dataset.conversation = notice.id;\n if (entry.dismiss.dataset.dismissCompletion !== notice.runID) entry.dismiss.dataset.dismissCompletion = notice.runID;\n if (entry.element !== cursor) element.insertBefore(entry.element, cursor);\n cursor = entry.element.nextElementSibling;\n }\n parts.update();\n if (focused instanceof HTMLElement && element.contains(focused) && document.activeElement !== focused) focused.focus({ preventScroll: true });\n },\n destroy(): void { if (destroyed) return; destroyed = true; parts.destroy(); entries.clear(); element.removeEventListener?.('click', click); element.replaceChildren(); },\n };\n}\n\nexport function createCopyFeedback(options: { status: HTMLElement; isDisabled: (button: HTMLButtonElement) => boolean; onError: (error: unknown) => void }) {\n let destroyed = false;\n const notice = adoptFeedback(options.status, {presentation:'inline',autoHide:false});\n type CopyEntry = { controller: ActionController; original: ChildNode[]; label: string | null; title: string; displayed: boolean; timer?: ReturnType<typeof setTimeout> };\n const entries = new Map<HTMLButtonElement, CopyEntry>();\n const release = (button: HTMLButtonElement, entry: CopyEntry): void => {\n if (entry.timer) clearTimeout(entry.timer);\n if (entry.displayed && button.isConnected) {\n button.replaceChildren(...entry.original);\n if (entry.label === null) button.removeAttribute('aria-label'); else button.setAttribute('aria-label', entry.label);\n button.title = entry.title;\n }\n delete button.dataset.copyPending;\n entry.controller.update({disabled:options.isDisabled(button)});\n entry.controller.destroy();\n entries.delete(button);\n };\n return {\n async copy(button: HTMLButtonElement, action: () => Promise<void>, announcement: string): Promise<void> {\n if (destroyed || button.dataset.copyPending === 'true') return;\n const entry: CopyEntry = { controller:adoptAction(button), original:[...button.childNodes], label:button.getAttribute('aria-label'), title:button.title, displayed:false };\n entries.set(button, entry);\n notice.update({message:'',tone:'info'}); button.dataset.copyPending = 'true'; entry.controller.update({disabled:options.isDisabled(button)});\n try {\n await action();\n if (destroyed) return;\n notice.update({message:announcement,tone:'info'});\n if (!button.isConnected) { release(button, entry); return; }\n button.innerHTML = button.classList.contains('pui-message-action') ? icon('check') : 'Copied';\n button.setAttribute('aria-label', announcement); button.title = announcement;\n entry.displayed = true;\n entry.timer = setTimeout(() => { if (!destroyed && entries.get(button) === entry) release(button, entry); }, 1500);\n } catch (error) {\n if (destroyed) return;\n release(button, entry); options.onError(error);\n }\n },\n destroy(): void { if (destroyed) return; destroyed = true; for (const [button, entry] of entries) release(button, entry); notice.destroy(); },\n };\n}\n"]}
1
+ {"version":3,"file":"systems.js","sourceRoot":"","sources":["../../src/files/systems.ts"],"names":[],"mappings":"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","sourcesContent":["import { icon, setText } from '../dom.js';\nimport type { UIBlock } from '../core.js';\nimport { adoptAction, adoptFeedback, adoptProductParts } from '../foundations.js';\nimport type { ActionController } from '../foundations.js';\nimport { reconcileKeyed } from '../reconcile.js';\n\nconst currency = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 6 });\nconst numbers = new Intl.NumberFormat();\nexport interface CostSummaryDisplay { unavailable?: boolean; requestCount: number; unknownRequests: number; runRequests: number; runUnknownRequests: number; total: number; runTotal: number }\nexport function formatCost(cost: CostSummaryDisplay | undefined, latestTask = false): string {\n if (cost?.unavailable) return 'Unavailable';\n const count = latestTask ? cost?.runRequests : cost?.requestCount;\n const unknown = (latestTask ? cost?.runUnknownRequests : cost?.unknownRequests) || 0;\n if (!count) return 'Not recorded';\n if (count === unknown) return 'Unknown';\n return `~${currency.format((latestTask ? cost?.runTotal : cost?.total) || 0)}${unknown ? ' (partial)' : ''}`;\n}\nexport interface CostRequestDisplay {\n id: string; purpose: string; status: string; provider: string; providerName?: string; model: string; modelName?: string;\n time: string; source: string; price: unknown; known: boolean;\n usage: { input: number; output: number; cacheRead: number; cacheWrite: number; reasoning?: number; cost: { total: number } };\n}\nexport interface CostLedgerState { unknownRequests: number; requests: readonly CostRequestDisplay[] | null }\nexport function createCostLedger(options: { container?: HTMLElement } = {}) {\n const element = options.container || document.createElement('div');\n type Row = { element: HTMLTableRowElement; purpose: HTMLElement; identity: HTMLElement; time: HTMLElement; details: HTMLDetailsElement; source: HTMLElement; price: HTMLElement; reasoning: HTMLElement; cells: HTMLTableCellElement[] };\n const rows = new Map<string, Row>();\n let table: HTMLTableSectionElement | undefined;\n let note: HTMLElement | undefined;\n let empty: HTMLTableRowElement | undefined;\n let destroyed = false;\n function clear(): void { rows.clear(); table = undefined; note = undefined; empty = undefined; element.replaceChildren(); }\n function ensure(): void {\n if (table) return;\n element.innerHTML = '<p class=\"pui-cost-note\"></p><div class=\"pui-cost-table\"><table><thead><tr><th>Request</th><th>Input</th><th>Output</th><th>Cache read / write</th><th>Estimate</th></tr></thead><tbody></tbody></table></div>';\n table = element.querySelector('tbody')!; note = element.querySelector<HTMLElement>('.pui-cost-note')!;\n empty = document.createElement('tr'); const cell = document.createElement('td'); cell.colSpan = 5; cell.textContent = 'No recorded requests yet.'; empty.append(cell);\n }\n function makeRow(id: string): Row {\n const row = document.createElement('tr');\n row.innerHTML = '<td><strong data-purpose></strong><br><span data-identity></span><br><small data-time></small><details><summary>Price source and rates (USD / million tokens)</summary><p data-source></p><pre data-price></pre><p data-reasoning hidden></p></details></td><td></td><td></td><td></td><td></td>';\n const details = row.querySelector('details')!; details.dataset.costId = id;\n return { element: row, purpose: row.querySelector('[data-purpose]')!, identity: row.querySelector('[data-identity]')!, time: row.querySelector('[data-time]')!, details, source: row.querySelector('[data-source]')!, price: row.querySelector('[data-price]')!, reasoning: row.querySelector('[data-reasoning]')!, cells: [...row.querySelectorAll('td')] };\n }\n return {\n element,\n clear(): void { if (!destroyed) clear(); },\n loading(): void { if (!destroyed && !element.childElementCount) element.textContent = 'Loading request breakdown…'; },\n setError(message: string): void { if (!destroyed) { clear(); element.textContent = message; } },\n update(report: Readonly<CostLedgerState>): void {\n if (destroyed) return;\n ensure();\n setText(note!, `USD estimates for recorded requests, not a provider bill. Prices are saved per request; retries and context summaries are included when usage is reported. ${report.unknownRequests ? `${report.unknownRequests} request(s) have unknown prices or usage and are excluded. ` : ''}Older requests made before recording began are not reconstructed.`);\n const requests = report.requests || [];\n empty!.remove();\n const n = (value: number) => numbers.format(value || 0);\n reconcileKeyed(table!, rows, requests, {\n key: request => request.id, element: row => row.element, create: request => makeRow(request.id),\n update(row, request) {\n setText(row.purpose, `${request.purpose} · ${request.status}`);\n setText(row.identity, `${request.providerName || request.provider} / ${request.modelName || request.model}`);\n setText(row.time, request.time); setText(row.source, request.source); setText(row.price, JSON.stringify(request.price, null, 2));\n row.reasoning.hidden = request.usage.reasoning == null;\n setText(row.reasoning, request.usage.reasoning == null ? '' : `Reasoning tokens: ${n(request.usage.reasoning)} (included in output)`);\n setText(row.cells[1]!, n(request.usage.input)); setText(row.cells[2]!, n(request.usage.output));\n setText(row.cells[3]!, `${n(request.usage.cacheRead)} / ${n(request.usage.cacheWrite)}`);\n setText(row.cells[4]!, request.known ? currency.format(request.usage.cost.total) : 'Unknown');\n },\n destroy() {},\n });\n if (!requests.length) table!.append(empty!);\n },\n destroy(): void { if (!destroyed) clear(); destroyed = true; },\n };\n}\n\nexport interface UpdatePanelState { version: string; enabled: boolean; phase: string; availableVersion: string; progress: number; message: string }\nexport function createUpdatePanel(options: { container?: HTMLElement; productName?: string; onCheck?: () => void; onInstall?: () => void } = {}) {\n const element = options.container || document.createElement('section');\n if (!element.querySelector('[data-update-version]')) element.innerHTML = '<p data-update-version></p><p data-update-message role=\"status\"></p><div class=\"pui-feature-toolbar\"><button type=\"button\" class=\"pui-secondary-button\" data-update-check>Check for updates</button><button type=\"button\" class=\"pui-secondary-button\" data-update-install hidden>Update and restart</button></div><progress max=\"100\" hidden></progress>';\n const version = element.querySelector<HTMLElement>('[data-update-version]')!;\n const message = element.querySelector<HTMLElement>('[data-update-message]')!;\n const check = element.querySelector<HTMLButtonElement>('[data-update-check]')!;\n const install = element.querySelector<HTMLButtonElement>('[data-update-install]')!;\n const progress = element.querySelector<HTMLProgressElement>('progress')!;\n const parts = adoptProductParts(element);\n let state: Readonly<UpdatePanelState> | undefined;\n let pending = false, destroyed = false;\n let error = '';\n let retryCheck = false;\n const checkAction = () => options.onCheck?.(), installAction = () => options.onInstall?.();\n check.addEventListener('click', checkAction); install.addEventListener('click', installAction);\n function render(): void {\n if (destroyed) return;\n if (!state) { parts.action(check).update({pending}); parts.action(install).update({pending}); parts.feedback(message).update({message:error,tone:'info'}); return; }\n version.textContent = `${options.productName || 'Application'} ${state.version}`;\n parts.feedback(message).update({message:error || state.message,tone:'info'});\n const busy = ['checking', 'installing', 'restarting'].includes(state.phase);\n parts.action(check).update({disabled:!state.enabled || (busy && !retryCheck),pending});\n install.hidden = !state.availableVersion; parts.action(install).update({disabled:!state.enabled || busy,pending,label:'Update and restart'});\n progress.hidden = state.phase !== 'installing'; progress.value = state.progress;\n }\n return {\n element,\n update(value: Readonly<UpdatePanelState>): void { state = value; error = ''; retryCheck = false; render(); },\n setPending(value: boolean): void { pending = value; render(); },\n setError(value: string, options: { allowCheckRetry?: boolean } = {}): void { if (!destroyed) { error = value; retryCheck = !!options.allowCheckRetry; render(); } },\n destroy(): void { if (destroyed) return; destroyed = true; parts.destroy(); check.removeEventListener('click', checkAction); install.removeEventListener('click', installAction); },\n };\n}\n\nexport interface CompletionNoticeDisplay { id: string; runID: string; title: string; workspace: string }\nexport function historyStatusMarkup(status: 'approval' | 'running' | 'unread' | 'idle'): string {\n if (status === 'approval') return '<span class=\"pui-history-status pui-needs-approval\" role=\"img\" aria-label=\"Waiting for approval\" title=\"Waiting for approval\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v6m0 4h.01\"/></svg></span>';\n if (status === 'running') return '<span class=\"pui-history-status\" role=\"img\" aria-label=\"Running\" title=\"Running\"><i class=\"pui-history-spinner\" aria-hidden=\"true\"></i></span>';\n if (status === 'unread') return '<span class=\"pui-history-status\" role=\"img\" aria-label=\"Completed, unread\" title=\"Completed, unread\"><i class=\"pui-history-unread\" aria-hidden=\"true\"></i></span>';\n return '<span class=\"pui-history-status\" aria-hidden=\"true\"></span>';\n}\nexport function createCompletionNotices(options: { container?: HTMLElement; onOpen?: (id: string) => void; onDismiss?: (runID: string) => void } = {}): UIBlock<readonly CompletionNoticeDisplay[]> {\n const element = options.container || document.createElement('div');\n const parts = adoptProductParts(element);\n const entries = new Map<string, { element: HTMLElement; text: HTMLElement; open: HTMLButtonElement; dismiss: HTMLButtonElement }>();\n let destroyed = false;\n const click = (event: Event) => {\n const target = (event.target as Element).closest<HTMLElement>('[data-conversation], [data-dismiss-completion]');\n if (!target || !element.contains(target)) return;\n if (target.dataset.conversation) options.onOpen?.(target.dataset.conversation);\n else if (target.dataset.dismissCompletion) options.onDismiss?.(target.dataset.dismissCompletion);\n };\n if (options.onOpen || options.onDismiss) element.addEventListener('click', click);\n return {\n element,\n update(notices): void {\n if (destroyed) return;\n reconcileKeyed(element, entries, notices, {\n key: notice => notice.runID, element: entry => entry.element,\n create() {\n const article = document.createElement('article'); article.className = 'pui-completion-notice';\n article.innerHTML = `<span class=\"pui-completion-check\" aria-hidden=\"true\">${icon('check')}</span><div class=\"pui-completion-content\"><strong>Task completed</strong><p></p><button class=\"pui-text-button\" type=\"button\" data-conversation>Open conversation</button></div><button class=\"pui-quiet-icon pui-completion-dismiss\" type=\"button\" data-dismiss-completion aria-label=\"Dismiss completion notification\">${icon('close')}</button>`;\n return { element: article, text: article.querySelector('p')!, open: article.querySelector<HTMLButtonElement>('[data-conversation]')!, dismiss: article.querySelector<HTMLButtonElement>('[data-dismiss-completion]')! };\n },\n update(entry, notice) {\n setText(entry.text, `${notice.workspace} · ${notice.title}`);\n parts.action(entry.open).update({label:'Open conversation'});\n parts.action(entry.dismiss).update({label:'Dismiss completion notification'});\n if (entry.open.dataset.conversation !== notice.id) entry.open.dataset.conversation = notice.id;\n if (entry.dismiss.dataset.dismissCompletion !== notice.runID) entry.dismiss.dataset.dismissCompletion = notice.runID;\n },\n destroy() {},\n });\n parts.update();\n },\n destroy(): void { if (destroyed) return; destroyed = true; parts.destroy(); entries.clear(); element.removeEventListener?.('click', click); element.replaceChildren(); },\n };\n}\n\nexport function createCopyFeedback(options: { status: HTMLElement; isDisabled: (button: HTMLButtonElement) => boolean; onError: (error: unknown) => void }) {\n let destroyed = false;\n const notice = adoptFeedback(options.status, {presentation:'inline',autoHide:false});\n type CopyEntry = { controller: ActionController; original: ChildNode[]; label: string | null; title: string; displayed: boolean; timer?: ReturnType<typeof setTimeout> };\n const entries = new Map<HTMLButtonElement, CopyEntry>();\n const release = (button: HTMLButtonElement, entry: CopyEntry): void => {\n if (entry.timer) clearTimeout(entry.timer);\n if (entry.displayed && button.isConnected) {\n button.replaceChildren(...entry.original);\n if (entry.label === null) button.removeAttribute('aria-label'); else button.setAttribute('aria-label', entry.label);\n button.title = entry.title;\n }\n delete button.dataset.copyPending;\n entry.controller.update({disabled:options.isDisabled(button)});\n entry.controller.destroy();\n entries.delete(button);\n };\n return {\n async copy(button: HTMLButtonElement, action: () => Promise<void>, announcement: string): Promise<void> {\n if (destroyed || button.dataset.copyPending === 'true') return;\n const entry: CopyEntry = { controller:adoptAction(button), original:[...button.childNodes], label:button.getAttribute('aria-label'), title:button.title, displayed:false };\n entries.set(button, entry);\n notice.update({message:'',tone:'info'}); button.dataset.copyPending = 'true'; entry.controller.update({disabled:options.isDisabled(button)});\n try {\n await action();\n if (destroyed) return;\n notice.update({message:announcement,tone:'info'});\n if (!button.isConnected) { release(button, entry); return; }\n button.innerHTML = button.classList.contains('pui-message-action') ? icon('check') : 'Copied';\n button.setAttribute('aria-label', announcement); button.title = announcement;\n entry.displayed = true;\n entry.timer = setTimeout(() => { if (!destroyed && entries.get(button) === entry) release(button, entry); }, 1500);\n } catch (error) {\n if (destroyed) return;\n release(button, entry); options.onError(error);\n }\n },\n destroy(): void { if (destroyed) return; destroyed = true; for (const [button, entry] of entries) release(button, entry); notice.destroy(); },\n };\n}\n"]}
@@ -5,6 +5,7 @@ export interface ProviderActionsState {
5
5
  signedIn: boolean;
6
6
  custom: boolean;
7
7
  }
8
+ export type ResourceKind = 'instructions' | 'skill' | 'template';
8
9
  export interface ResourceActionsState {
9
10
  kind: string;
10
11
  resource: {
@@ -13,6 +14,20 @@ export interface ResourceActionsState {
13
14
  };
14
15
  workspaceId: string;
15
16
  }
17
+ export type ProviderAction = 'login' | 'logout' | 'custom' | 'remove-connection';
18
+ export type ResourceAction = 'use-resource' | 'resource';
19
+ export interface ProviderActionTarget {
20
+ readonly id: string;
21
+ }
22
+ export interface ResourceActionTarget {
23
+ readonly workspaceId: string;
24
+ readonly kind: string;
25
+ readonly resource: {
26
+ readonly name: string;
27
+ readonly path: string;
28
+ };
29
+ readonly command?: string;
30
+ }
16
31
  export declare function providerActionsMarkup(provider: ProviderActionsState): string;
17
32
  export declare function resourceActionsMarkup(kind: string, resource: {
18
33
  name: string;
@@ -22,6 +37,12 @@ export interface FeatureActionOptions {
22
37
  onAction?: (action: string, target: DOMStringMap) => ReturnType<UIAction>;
23
38
  onError?: (message: string) => void;
24
39
  }
25
- export declare function createProviderActions(state: ProviderActionsState, options?: FeatureActionOptions): UIBlock<ProviderActionsState>;
26
- export declare function createResourceActions(state: ResourceActionsState, options?: FeatureActionOptions): UIBlock<ResourceActionsState>;
40
+ export interface ProviderActionOptions extends FeatureActionOptions {
41
+ onProviderAction?: (action: ProviderAction, target: ProviderActionTarget) => ReturnType<UIAction>;
42
+ }
43
+ export interface ResourceActionOptions extends FeatureActionOptions {
44
+ onResourceAction?: (action: ResourceAction, target: ResourceActionTarget) => ReturnType<UIAction>;
45
+ }
46
+ export declare function createProviderActions(state: ProviderActionsState, options?: ProviderActionOptions): UIBlock<ProviderActionsState>;
47
+ export declare function createResourceActions(state: ResourceActionsState, options?: ResourceActionOptions): UIBlock<ResourceActionsState>;
27
48
  //# sourceMappingURL=actions.d.ts.map
@@ -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;AAGpD,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,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,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAA+lB;AAC5qB,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,CAGvH;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;AAiBtJ,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAyD;AAC9L,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAmH"}
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"}