@hachej/boring-ui-kit 0.4.36 → 0.4.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/experience-document-viewer.js +1 -1
- package/dist/file-tree-view.d.ts +0 -1
- package/dist/file-tree-view.js +3 -5
- package/dist/file-tree.js +2 -2
- package/dist/html-viewer.js +1 -1
- package/dist/shared-chat/room.js +23 -7
- package/dist/shared-chat/source.d.ts +3 -0
- package/dist/text-buffer.js +1 -1
- package/package.json +2 -2
- package/r/agent-target.json +4 -4
- package/r/app-shell.json +10 -10
- package/r/board-viewer.json +6 -6
- package/r/button.json +1 -1
- package/r/dock.json +1 -1
- package/r/documents.json +12 -12
- package/r/feedback-preview.json +1 -1
- package/r/feedback.json +6 -6
- package/r/file-tree.json +4 -4
- package/r/highlights.json +3 -3
- package/r/html-viewer.json +3 -3
- package/r/looks-viewer.json +2 -2
- package/r/maquette-viewer.json +1 -1
- package/r/markdown-editor.json +3 -3
- package/r/mockup-viewer.json +1 -1
- package/r/pi-ambient.json +8 -8
- package/r/pi-app-kinds.json +10 -10
- package/r/pi-app.json +10 -10
- package/r/pi-artifacts.json +2 -2
- package/r/pi-chat-approval.json +2 -2
- package/r/pi-chat-attachments.json +1 -1
- package/r/pi-chat-markdown.json +2 -2
- package/r/pi-chat-mentions.json +1 -1
- package/r/pi-chat-pickers.json +1 -1
- package/r/pi-chat-plugins.json +11 -11
- package/r/pi-chat-question.json +1 -1
- package/r/pi-chat-slash.json +2 -2
- package/r/pi-chat-subagent.json +1 -1
- package/r/pi-chat-voice.json +3 -3
- package/r/pi-chat.json +5 -5
- package/r/pi-workspace.json +3 -3
- package/r/placed-agent.json +4 -4
- package/r/pm-panel.json +16 -16
- package/r/provider-setup.json +1 -1
- package/r/registry.json +183 -183
- package/r/requests-board.json +1 -1
- package/r/shared-chat.json +9 -9
- package/r/task-board.json +2 -2
- package/r/task-list-viewer.json +2 -2
- package/r/task-mentions.json +4 -4
- package/r/version-history.json +2 -2
- package/r/viewer-code.json +2 -2
- package/r/viewer-frame.json +4 -4
- package/r/viewer-html.json +4 -4
- package/r/viewer-image.json +2 -2
- package/r/viewer-markdown.json +5 -5
- package/r/viewer-pdf.json +3 -3
- package/r/viewers.json +6 -6
- package/r/windows.json +1 -1
|
@@ -25,7 +25,7 @@ function MountedDocument({ controller, cells, canView, onRegenerate, title = 'Ex
|
|
|
25
25
|
setError('The layout operation failed. The draft has been retained.'); });
|
|
26
26
|
};
|
|
27
27
|
const status = disposed ? 'Viewer disposed' : state.readOnly ? 'Read only' : pending ? 'Keeping selected layout' : unknown ? 'Keep unconfirmed. Reconcile before keeping again.'
|
|
28
|
-
: state.save.kind === 'settled' && state.save.result.kind !== 'saved' ? state.save.result.
|
|
28
|
+
: state.save.kind === 'settled' && state.save.result.kind !== 'saved' ? state.save.result.reason
|
|
29
29
|
: state.dirty ? 'Layout not kept' : 'Layout kept';
|
|
30
30
|
return _jsxs("section", { "data-boring": "experience-document", className: className, "aria-label": title, children: [_jsxs("header", { children: [_jsx("strong", { children: title }), _jsx("span", { role: "status", children: status })] }), _jsxs("div", { role: "toolbar", "aria-label": "Layout document controls", children: [_jsx(Control, { type: "button", disabled: disposed || state.readOnly || !state.dirty || !state.descriptor || pending || unknown, onClick: () => { const selection = controller.actions.selection(); perform(() => controller.flush(selection)); }, children: "Keep this layout" }), _jsx(Control, { type: "button", disabled: disposed || pending || unknown, onClick: () => perform(controller.actions.refresh), children: "Refresh layout" }), _jsx(Control, { type: "button", disabled: disposed || !unknown, onClick: () => perform(controller.actions.reconcile), children: "Reconcile keep" }), _jsx(Control, { type: "button", disabled: disposed || pending || unknown || state.remote === null, onClick: () => perform(controller.actions.discardToRemote), children: "Discard local layout" }), state.pin && _jsx(Control, { type: "button", disabled: disposed || state.readOnly || pending || unknown, onClick: () => {
|
|
31
31
|
const pin = state.pin;
|
package/dist/file-tree-view.d.ts
CHANGED
package/dist/file-tree-view.js
CHANGED
|
@@ -44,7 +44,6 @@ export const defaultFileTreeLabels = {
|
|
|
44
44
|
binaryFile: (mediaType) => `Binary file (${mediaType})`,
|
|
45
45
|
uploading: 'Uploading…',
|
|
46
46
|
saved: 'Saved',
|
|
47
|
-
unconfirmed: 'Unconfirmed',
|
|
48
47
|
checkUpload: 'Check upload status',
|
|
49
48
|
uploadStatusUnavailable: 'Upload status unavailable',
|
|
50
49
|
uploadFailed: (name) => `${name}: upload failed`,
|
|
@@ -110,7 +109,6 @@ export const frenchFileTreeLabels = {
|
|
|
110
109
|
binaryFile: mediaType => `Fichier binaire (${mediaType})`,
|
|
111
110
|
uploading: 'Import en cours…',
|
|
112
111
|
saved: 'Enregistré',
|
|
113
|
-
unconfirmed: 'Non confirmé',
|
|
114
112
|
checkUpload: 'Vérifier l’import',
|
|
115
113
|
uploadStatusUnavailable: 'État de l’import indisponible',
|
|
116
114
|
uploadFailed: name => `${name} : échec de l’import`,
|
|
@@ -279,7 +277,7 @@ export function FileTreeView({ components, controller, onOpen, selectedPath, cla
|
|
|
279
277
|
uploadRows.delete(item.path);
|
|
280
278
|
else
|
|
281
279
|
uploadRows.set(item.path, { kind: 'failed', size: item.size,
|
|
282
|
-
reason: item.state.result.
|
|
280
|
+
reason: item.state.result.reason,
|
|
283
281
|
retryLabel: item.state.result.kind === 'unknown' ? labels.checkUpload : labels.retry,
|
|
284
282
|
retry: () => { void controller.retry(item.operationId).catch(error => setUploadError(error instanceof Error ? error.message : labels.uploadStatusUnavailable)); } });
|
|
285
283
|
}
|
|
@@ -293,7 +291,7 @@ export function FileTreeView({ components, controller, onOpen, selectedPath, cla
|
|
|
293
291
|
mutationRows.set(item.path, item);
|
|
294
292
|
const mutationReason = (item) => item.state.kind === 'pending' ? labels.changing
|
|
295
293
|
: item.state.result.kind === 'committed' ? item.kind === 'delete' ? labels.deleted : labels.renamed(item.to ?? '')
|
|
296
|
-
: item.state.result.kind === 'conflict' ? labels.changedSince : item.state.result.
|
|
294
|
+
: item.state.result.kind === 'conflict' ? labels.changedSince : item.state.result.reason;
|
|
297
295
|
// A refusal of the name itself (empty, `..`, the same name) keeps the input open with the reason; anything else is the row's.
|
|
298
296
|
const refused = (path) => (error) => {
|
|
299
297
|
if (error instanceof TypeError)
|
|
@@ -537,7 +535,7 @@ export function FileTreeView({ components, controller, onOpen, selectedPath, cla
|
|
|
537
535
|
} }), dropping && _jsx("div", { className: "file-tree-drop", role: "status", children: _jsx(Empty, { icon: _jsx(Upload, { "aria-hidden": "true" }), title: labels.dropFiles }) }), uploadError && _jsx("p", { role: "alert", children: uploadError }), blobUploads.size > 0 && _jsx("ul", { "aria-label": labels.uploads, className: "file-tree-blob-uploads", children: [...blobUploads].map(([key, item]) => {
|
|
538
536
|
const percent = item.progress && item.progress.total > 0 ? Math.min(100, Math.round(item.progress.loaded / item.progress.total * 100)) : null;
|
|
539
537
|
return _jsxs("li", { "data-blob-upload": item.name, "data-progress": percent ?? undefined, className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: item.name }), Progress ? _jsx("span", { className: "w-24 shrink-0", children: _jsx(Progress, { value: percent, "aria-label": labels.uploadProgress(item.name) }) }) : _jsx("span", { role: "status", children: percent === null ? labels.uploading : `${percent}%` }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", "data-blob-upload-cancel": true, "aria-label": labels.cancelUpload(item.name), title: labels.cancelUpload(item.name), onClick: () => item.abort.abort(), children: _jsx(X, { "aria-hidden": "true" }) })] }, key);
|
|
540
|
-
}) }), _jsxs(SidebarMenu, { ref: tree, role: "tree", "aria-label": labels.tree, className: "file-tree-menu", children: [state.query ? _jsxs(_Fragment, { children: [state.search.entries.map(entry => renderEntry(entry, 1)), listingStatus(state.search, '', true)] }) : renderEntries('', 1), temporaryEntries.map(entry => renderEntry(entry, 1))] }), _jsxs("ul", { "aria-label": labels.uploads, "aria-live": "polite", "aria-relevant": "additions text", className: "file-tree-announcements", children: [state.uploads.map(upload => _jsxs("li", { "data-operation": upload.operationId, children: [upload.path, ": ", upload.state.kind === 'pending' ? labels.uploading : upload.state.result.kind === 'committed' ? labels.saved : upload.state.result.
|
|
538
|
+
}) }), _jsxs(SidebarMenu, { ref: tree, role: "tree", "aria-label": labels.tree, className: "file-tree-menu", children: [state.query ? _jsxs(_Fragment, { children: [state.search.entries.map(entry => renderEntry(entry, 1)), listingStatus(state.search, '', true)] }) : renderEntries('', 1), temporaryEntries.map(entry => renderEntry(entry, 1))] }), _jsxs("ul", { "aria-label": labels.uploads, "aria-live": "polite", "aria-relevant": "additions text", className: "file-tree-announcements", children: [state.uploads.map(upload => _jsxs("li", { "data-operation": upload.operationId, children: [upload.path, ": ", upload.state.kind === 'pending' ? labels.uploading : upload.state.result.kind === 'committed' ? labels.saved : upload.state.result.reason] }, upload.operationId)), [...localFailures].map(([path, failure]) => _jsxs("li", { children: [path, ": ", failure.reason] }, path)), state.mutations.map(item => _jsxs("li", { "data-operation": item.operationId, children: [item.path, ": ", mutationReason(item)] }, item.operationId))] }), Dialog && _jsx(Dialog, { open: asking !== undefined, onOpenChange: open => { if (!open)
|
|
541
539
|
closeAsking(); }, title: asking?.kind === 'move' ? labels.moveTitle(baseName(dialogPath)) : labels.deleteTitle(baseName(dialogPath)), description: asking?.kind === 'move' ? labels.moveDescription : dialogIsFolder ? labels.deleteFolderDescription : labels.deleteDescription, footer: asking?.kind === 'delete' ? _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", variant: "outline", "data-confirm": "cancel", onClick: closeAsking, children: labels.cancel }), _jsxs(Button, { type: "button", variant: "destructive", "data-confirm": "delete", onClick: () => {
|
|
542
540
|
const path = dialogPath;
|
|
543
541
|
setAsking(undefined);
|
package/dist/file-tree.js
CHANGED
|
@@ -100,7 +100,7 @@ export function createFileTreeController({ revisionProvider }) {
|
|
|
100
100
|
catch {
|
|
101
101
|
return unknown(operationId, 'The upload acknowledgement was invalid; check its status');
|
|
102
102
|
}
|
|
103
|
-
if (result.kind === '
|
|
103
|
+
if (result.kind === 'unknown' && result.operationId !== operationId)
|
|
104
104
|
return unknown(operationId, 'The upload acknowledgement did not match its operation');
|
|
105
105
|
if (result.kind !== 'committed')
|
|
106
106
|
return result;
|
|
@@ -164,7 +164,7 @@ export function createFileTreeController({ revisionProvider }) {
|
|
|
164
164
|
catch {
|
|
165
165
|
result = unknown(operationId, 'The acknowledgement was invalid; read the folder again before retrying');
|
|
166
166
|
}
|
|
167
|
-
if (result.kind === '
|
|
167
|
+
if (result.kind === 'unknown' && result.operationId !== operationId)
|
|
168
168
|
result = unknown(operationId, 'The acknowledgement did not match its operation');
|
|
169
169
|
}
|
|
170
170
|
}
|
package/dist/html-viewer.js
CHANGED
|
@@ -56,7 +56,7 @@ function MountedHtmlViewer({ components, controller, title = 'HTML document', cl
|
|
|
56
56
|
setError('The document operation failed. Your source has been retained.'); });
|
|
57
57
|
};
|
|
58
58
|
const status = disposed ? 'Viewer disposed' : snapshot.readOnly ? 'Read only' : pending ? 'Saving selected source' : unknown ? 'Save unconfirmed. Reconcile before saving again.' : snapshot.save.kind === 'settled' && snapshot.save.result.kind !== 'saved'
|
|
59
|
-
? snapshot.save.result.
|
|
59
|
+
? snapshot.save.result.reason
|
|
60
60
|
: snapshot.dirty ? 'Unsaved changes' : 'Saved';
|
|
61
61
|
return _jsxs("section", { "data-boring": "html-viewer", className: ['boring-html-viewer', className].filter(Boolean).join(' '), "aria-label": title, children: [header && _jsxs("header", { children: [_jsx("strong", { children: title }), _jsx("span", { role: "status", children: status })] }), header && _jsxs("div", { role: "toolbar", "aria-label": "HTML document controls", children: [_jsx(Control, { type: "button", "aria-pressed": mode === 'preview', onClick: () => setMode('preview'), children: "HTML preview" }), _jsx(Control, { type: "button", "aria-pressed": mode === 'source', onClick: () => setMode('source'), children: "HTML source" }), _jsx(Control, { type: "button", disabled: disposed || snapshot.readOnly || !snapshot.dirty || pending || unknown, onClick: () => { const selection = controller.actions.selection(); perform(() => controller.flush(selection)); }, children: "Save" }), _jsx(Control, { type: "button", disabled: disposed || pending || unknown, onClick: () => perform(controller.actions.refresh), children: "Refresh" }), _jsx(Control, { type: "button", disabled: disposed || !unknown, onClick: () => perform(controller.actions.reconcile), children: "Reconcile save" }), _jsx(Control, { type: "button", disabled: disposed || !unknown, onClick: () => perform(controller.actions.abandon), children: "Abandon and refresh, keeping my draft" }), _jsx(Control, { type: "button", disabled: disposed || pending || unknown || snapshot.remote === null, onClick: () => perform(controller.actions.discardToRemote), children: "Discard local edits" })] }), _jsx(TextDraftControls, { components: components, recovery: snapshot.recovery, actions: controller.actions, readOnly: snapshot.readOnly, blocked: snapshot.lifecycle !== 'active' || snapshot.save.kind === 'pending' || (snapshot.save.kind === 'settled' && snapshot.save.result.kind === 'unknown') }), error && _jsx("p", { role: "alert", children: error }), mode === 'source'
|
|
62
62
|
? _jsx(Source, { className: "boring-html-viewer__source", "aria-label": "HTML source", readOnly: snapshot.readOnly || disposed, value: snapshot.text, onChange: event => { if (!snapshot.readOnly && !disposed)
|
package/dist/shared-chat/room.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parsePresentedArtifact } from '../chat-artifacts.js';
|
|
1
2
|
import { randomUUID } from '@hachej/boring-files/platform';
|
|
2
3
|
import { ChannelRequestError } from './error.js';
|
|
3
4
|
const words = {
|
|
@@ -10,6 +11,16 @@ const list = (value) => Array.isArray(value) ? value : [];
|
|
|
10
11
|
const strings = (value) => list(value).filter((item) => typeof item === 'string');
|
|
11
12
|
const id = (value) => typeof value === 'number' && Number.isSafeInteger(value) ? value : undefined;
|
|
12
13
|
const stepStatus = (value) => value === 'running' || value === 'failed' ? value : 'done';
|
|
14
|
+
const descriptorKey = (artifact) => JSON.stringify(artifact.type === 'task' ? artifact.subject : [artifact.target, artifact.revision]);
|
|
15
|
+
const descriptors = (raw) => {
|
|
16
|
+
const found = new Map();
|
|
17
|
+
for (const value of list(raw)) {
|
|
18
|
+
const artifact = parsePresentedArtifact(value);
|
|
19
|
+
if (artifact)
|
|
20
|
+
found.set(descriptorKey(artifact), artifact);
|
|
21
|
+
}
|
|
22
|
+
return [...found.values()];
|
|
23
|
+
};
|
|
13
24
|
function member(raw) {
|
|
14
25
|
if (!isObject(raw) || typeof raw.id !== 'string')
|
|
15
26
|
return undefined;
|
|
@@ -149,6 +160,7 @@ export async function createRoomSource(options) {
|
|
|
149
160
|
return { ...base, author: 'platform:room', kind: 'system', text: str(item.text) };
|
|
150
161
|
return { ...base, author: speaker, ...(typeof item.via === 'string' ? { via: item.via } : {}),
|
|
151
162
|
...(gone ? { removed: { by: '', at } } : { text: str(item.text) }), mentions: strings(item.mentions), ...(id(item.replyTo) !== undefined ? { replyTo: String(item.replyTo) } : {}),
|
|
163
|
+
...(gone || !Array.isArray(item.artifacts) ? {} : { artifacts: descriptors(item.artifacts) }),
|
|
152
164
|
...(gone ? {} : { attachments: list(item.attachments).filter(isObject).filter(file => typeof file.path === 'string').map(file => ({ path: str(file.path) })) }),
|
|
153
165
|
...(gone ? {} : { steps: list(item.steps).filter(isObject).map((step) => ({ label: str(step.label), status: stepStatus(step.status) })) }),
|
|
154
166
|
...(mine ? { clientId: mine } : {}) };
|
|
@@ -159,7 +171,7 @@ export async function createRoomSource(options) {
|
|
|
159
171
|
return { ...base, author, card: { requestId: `pin:${entry}`, kind: 'pin', title: str(item.title), line: str(item.line) } };
|
|
160
172
|
if (item.kind === 'question') {
|
|
161
173
|
const options = strings(item.options);
|
|
162
|
-
return { ...base, author, text: str(item.prompt), question: { callId: str(item.callId), prompt: str(item.prompt), options, allowFreeText: item.allowFreeText !== false || options.length === 0, answered: item.answered === true } };
|
|
174
|
+
return { ...base, author, text: str(item.prompt), question: { callId: str(item.callId), prompt: str(item.prompt), options, allowFreeText: item.allowFreeText !== false || options.length === 0, answered: item.answered === true }, ...(Array.isArray(item.artifacts) ? { artifacts: descriptors(item.artifacts) } : {}) };
|
|
163
175
|
}
|
|
164
176
|
if (item.kind === 'card') {
|
|
165
177
|
const card = item.card;
|
|
@@ -194,7 +206,7 @@ export async function createRoomSource(options) {
|
|
|
194
206
|
const found = c.list[index];
|
|
195
207
|
if (!found || found.removed)
|
|
196
208
|
return undefined;
|
|
197
|
-
const { text: _text, attachments: _attachments, steps: _steps, card: _card, question: _question, ...rest } = found;
|
|
209
|
+
const { text: _text, attachments: _attachments, artifacts: _artifacts, steps: _steps, card: _card, question: _question, ...rest } = found;
|
|
198
210
|
c.list[index] = { ...rest, removed: { by: '', at: found.at } };
|
|
199
211
|
return c.list[index];
|
|
200
212
|
}
|
|
@@ -212,7 +224,7 @@ export async function createRoomSource(options) {
|
|
|
212
224
|
// ---- the writing state: an open wake draws the agent's message, in place, until its answer lands ----
|
|
213
225
|
const clientIdOf = (w) => `wake:${w.wake.id}#${w.segment}`;
|
|
214
226
|
const placeholder = (w) => ({ id: `wake:${w.wake.id}`, conversationId: w.wake.conversation, author: w.wake.agent, at: w.at, streaming: true, clientId: clientIdOf(w),
|
|
215
|
-
...(w.stalled ? { card: { requestId: `wake:${w.wake.id}`, kind: 'request', title: text.stalled, line: '', actions: [{ id: 'retry', label: text.retry }] } } : { text: w.text }), steps: w.steps.map(step => ({ ...step })) });
|
|
227
|
+
...(w.stalled ? { card: { requestId: `wake:${w.wake.id}`, kind: 'request', title: text.stalled, line: '', actions: [{ id: 'retry', label: text.retry }] } } : { text: w.text }), steps: w.steps.map(step => ({ ...step })), ...(w.artifacts.length ? { artifacts: structuredClone(w.artifacts) } : {}) });
|
|
216
228
|
function arm(w) {
|
|
217
229
|
clearTimeout(w.timer);
|
|
218
230
|
w.timer = setTimeout(() => {
|
|
@@ -230,7 +242,7 @@ export async function createRoomSource(options) {
|
|
|
230
242
|
const found = c.writing.get(raw.id) ?? c.waiting.get(raw.id);
|
|
231
243
|
if (found)
|
|
232
244
|
return found;
|
|
233
|
-
const w = { wake: { id: raw.id, agent: raw.agent, conversation: name }, segment: 0, text: '', steps: [], stalled: false, timer: undefined, at: after() };
|
|
245
|
+
const w = { wake: { id: raw.id, agent: raw.agent, conversation: name }, segment: 0, text: '', steps: [], artifacts: [], stalled: false, timer: undefined, at: after() };
|
|
234
246
|
c.writing.set(raw.id, w);
|
|
235
247
|
arm(w);
|
|
236
248
|
if (shown)
|
|
@@ -251,7 +263,11 @@ export async function createRoomSource(options) {
|
|
|
251
263
|
const wasStalled = w.stalled;
|
|
252
264
|
w.stalled = false;
|
|
253
265
|
arm(w);
|
|
254
|
-
if (raw.type === '
|
|
266
|
+
if (raw.type === 'artifact') {
|
|
267
|
+
w.artifacts = descriptors([...w.artifacts, raw.artifact]);
|
|
268
|
+
emit(name, { type: 'message', message: placeholder(w) });
|
|
269
|
+
}
|
|
270
|
+
else if (raw.type === 'delta') {
|
|
255
271
|
const piece = str(raw.text);
|
|
256
272
|
w.text += piece;
|
|
257
273
|
emit(name, wasStalled ? { type: 'message', message: placeholder(w) } : { type: 'delta', messageId: placeholder(w).id, conversationId: name, text: piece });
|
|
@@ -406,7 +422,7 @@ export async function createRoomSource(options) {
|
|
|
406
422
|
noteReply(c, name, stored);
|
|
407
423
|
resume(c, stored);
|
|
408
424
|
}
|
|
409
|
-
else if (raw.type === 'delta' || raw.type === 'step')
|
|
425
|
+
else if (raw.type === 'delta' || raw.type === 'step' || raw.type === 'artifact')
|
|
410
426
|
frame(raw);
|
|
411
427
|
else if (raw.type === 'wake') {
|
|
412
428
|
const name = str(raw.conversationId, 'main');
|
|
@@ -541,7 +557,7 @@ export async function createRoomSource(options) {
|
|
|
541
557
|
clientIds.set(entryId, input.clientId);
|
|
542
558
|
owner.set(entryId, name);
|
|
543
559
|
const c = conv(name);
|
|
544
|
-
const message = convert(name, { kind: 'message', id: entryId, author: data.author, via: data.via, text: data.text, mentions: data.mentions, replyTo: data.replyTo, attachments: data.attachments, steps: data.steps, mine: true, removed: false });
|
|
560
|
+
const message = convert(name, { kind: 'message', id: entryId, author: data.author, via: data.via, text: data.text, mentions: data.mentions, replyTo: data.replyTo, attachments: data.attachments, artifacts: data.artifacts, steps: data.steps, mine: true, removed: false });
|
|
545
561
|
if (!message || 'retract' in message)
|
|
546
562
|
throw new ChannelRequestError('invalid-response', 'Room send returned an invalid response', false);
|
|
547
563
|
const stored = put(c, { ...message, clientId: input.clientId });
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { PresentedArtifact } from '../chat-artifacts.js';
|
|
2
|
+
export type { PresentedArtifact } from '../chat-artifacts.js';
|
|
1
3
|
/** `roleLabel` is the host's own line beside the author (« the coach »); without it the view derives one from `kind` and `role`. */
|
|
2
4
|
export type Member = {
|
|
3
5
|
id: string;
|
|
@@ -68,6 +70,7 @@ export type ChannelMessage = {
|
|
|
68
70
|
question?: Question;
|
|
69
71
|
mentions?: string[];
|
|
70
72
|
replyTo?: string;
|
|
73
|
+
artifacts?: PresentedArtifact[];
|
|
71
74
|
attachments?: {
|
|
72
75
|
path: string;
|
|
73
76
|
title?: string;
|
package/dist/text-buffer.js
CHANGED
|
@@ -88,7 +88,7 @@ export function createTextBuffer(options) {
|
|
|
88
88
|
catch {
|
|
89
89
|
outcome = unknown(current, 'Publication returned a malformed acknowledgement');
|
|
90
90
|
}
|
|
91
|
-
if (outcome.kind === '
|
|
91
|
+
if (outcome.kind === 'unknown' && outcome.operationId !== current.request.operationId) {
|
|
92
92
|
outcome = unknown(current, 'Publication returned an outcome for a different operation or atomicity');
|
|
93
93
|
}
|
|
94
94
|
let result;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hachej/boring-ui-kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.38",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
}
|
|
155
155
|
},
|
|
156
156
|
"peerDependencies": {
|
|
157
|
-
"@hachej/boring-files": "^0.4.
|
|
157
|
+
"@hachej/boring-files": "^0.4.38",
|
|
158
158
|
"@earendil-works/pi-durable": "~1.4.0",
|
|
159
159
|
"react": "^19.0.0",
|
|
160
160
|
"react-dom": "^19.0.0",
|
package/r/agent-target.json
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
"title": "Point and dictate on app data",
|
|
5
5
|
"description": "Tap explicitly marked JSON app context, dictate once and show the same app agent’s native reply without opening chat. Host-controlled presentation; no feedback report or second controller.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-feedback@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-feedback@^0.4.38",
|
|
9
9
|
"@earendil-works/pi-durable@~1.4.0",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0"
|
|
12
12
|
],
|
|
13
13
|
"registryDependencies": [
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/app-shell.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat.json"
|
|
16
16
|
],
|
|
17
17
|
"files": [
|
|
18
18
|
{
|
package/r/app-shell.json
CHANGED
|
@@ -4,22 +4,22 @@
|
|
|
4
4
|
"title": "App shell: layouts, list/detail and agent layer",
|
|
5
5
|
"description": "AppShell with three layouts. B \"workspace\" puts a ListDetail on a screen (phone: the list, then the detail as a stack step with Back; wide: a 20rem list and the detail side by side, sidebar as an icon rail). C \"chat\" wraps the app's own AgentWorkspace (untouched, passed as the nav item's render; install the pi-app item yourself) in the same sidebar, account menu and header; it takes no shell agent. A \"screen\": one screen at a time, every screen kept mounted. On a phone bottom tabs (at most four; more give three plus a « Plus » sheet) and an avatar button that opens the account sheet; on a wide screen the shadcn sidebar (icon rail, NavUser). One header per screen through useScreenHeader (title, subtitle, back, up to two actions, the rest behind « … »). The account menu holds « Améliorer l'app » (the improve agent), the app's own entries and sign out. AppSheet is the one bottom sheet (one open at a time, Back closes it). It mounts the AgentLayer: one agent's PiChat above the app (phone: a drawer with peek, half and full snap points; wide: a right panel), the improve agent in the same layer, optional push-to-talk and point mode. Also useAgentContext and readAgentContext (the screen on show travels as `context` with each submit) and useBackLayer, the one Back manager. Built on explicitly pinned Base UI drawer and dropdown-menu recipes, plus the sidebar and avatar of the host's own shadcn style.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-feedback@^0.4.
|
|
8
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
7
|
+
"@hachej/boring-feedback@^0.4.38",
|
|
8
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
9
9
|
"@base-ui/react@^1.9.0",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0",
|
|
12
12
|
"lucide-react@^1.51.0"
|
|
13
13
|
],
|
|
14
14
|
"registryDependencies": [
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
18
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
19
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
20
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
21
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
22
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat-plugins.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat-voice.json",
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/dock.json",
|
|
19
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pm-panel.json",
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/feedback.json",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json",
|
|
22
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/button.json"
|
|
23
23
|
],
|
|
24
24
|
"files": [
|
|
25
25
|
{
|
package/r/board-viewer.json
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
"title": "Board viewer",
|
|
5
5
|
"description": "A board@1 artifact kind for *.board.json. Lazy native tldraw projection of maquette screens, sandboxed HTML mock-ups, goto arrows and notes. Conditional board-file autosave; phone viewing without accidental frame edits. Hosts supply their resource client, asset URLs and license key.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@1.51.0",
|
|
11
11
|
"tldraw@5.5.2"
|
|
12
12
|
],
|
|
13
13
|
"registryDependencies": [
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/maquette-viewer.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/mockup-viewer.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-artifacts.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
package/r/button.json
CHANGED
package/r/dock.json
CHANGED
package/r/documents.json
CHANGED
|
@@ -4,22 +4,22 @@
|
|
|
4
4
|
"title": "Documents: the Library, a file and its revisions",
|
|
5
5
|
"description": "The workspace's Library as the list, the chosen file in its viewer and its retained revisions beside it (an older one opens read-only). DocumentSheet opens one document over the app for a host's « Voir la fiche », with an optional « Toutes les fiches ». Every read goes through one revisionProvider binding.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@^1.51.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
18
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
19
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
20
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
21
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
22
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json",
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/button.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-artifacts.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-app.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-app-kinds.json",
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/app-shell.json",
|
|
19
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/file-tree.json",
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-frame.json",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-image.json",
|
|
22
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-pdf.json"
|
|
23
23
|
],
|
|
24
24
|
"files": [
|
|
25
25
|
{
|
package/r/feedback-preview.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"title": "Feedback preview",
|
|
5
5
|
"description": "PreviewBanner: a live, reversible preview of a change in the page (Approve / Discard) over `@hachej/boring-feedback/preview`, whose subagent calls models through a host gateway. Separate from `feedback` so annotation-only apps do not install the model SDK; install `feedback` first (its styles cover the banner).",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-feedback@^0.4.
|
|
7
|
+
"@hachej/boring-feedback@^0.4.38",
|
|
8
8
|
"@earendil-works/pi-ai@~1.4.0",
|
|
9
9
|
"react@^19.0.0"
|
|
10
10
|
],
|
package/r/feedback.json
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
"title": "Feedback",
|
|
5
5
|
"description": "Feedback from the chat composer: one Feedback button starts feedback mode on the application page (hover, click to pin a numbered note, hold ⌥ to use the app, optional voice), and one chip carries the notes to the next message. FeedbackBar, NoteBubble, FeedbackChip with its review, useComposerFeedback for the pi-chat composer, and PickerOverlay styles. Optional, not mounted by default: PointButton, AnnotateSheet, FeedbackList and FeedbackReport. Picking, masking, anchoring and placement stay in @hachej/boring-feedback/page and /ui, so restyling cannot weaken them.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-feedback@^0.4.
|
|
8
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
9
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-feedback@^0.4.38",
|
|
8
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
9
|
+
"@hachej/boring-files@^0.4.38",
|
|
10
10
|
"react@^19.0.0",
|
|
11
11
|
"react-dom@^19.0.0",
|
|
12
12
|
"lucide-react@^1.51.0"
|
|
13
13
|
],
|
|
14
14
|
"registryDependencies": [
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat-voice.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json"
|
|
18
18
|
],
|
|
19
19
|
"files": [
|
|
20
20
|
{
|
package/r/file-tree.json
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"title": "File tree",
|
|
5
5
|
"description": "Browse, search, upload, rename, move, delete and inspect retained versions through one revisionProvider binding. Uses the consumer's shadcn Button, dropdown-menu and dialog with shared version-history rows; Base UI style only.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"lucide-react@^1.51.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json",
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/version-history.json"
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
{
|
package/r/highlights.json
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"title": "Anchored highlights",
|
|
5
5
|
"description": "Exact Markdown highlights and comments in a conditional workspace sidecar.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/markdown-editor.json"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
package/r/html-viewer.json
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"title": "HTML source and passive preview",
|
|
5
5
|
"description": "Exact HTML source editing with a reconstructed passive preview and borrowed controller. Browser security qualification remains separate.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0"
|
|
11
11
|
],
|
|
12
12
|
"registryDependencies": [
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/button.json"
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
{
|
package/r/looks-viewer.json
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"lucide-react@^1.51.0"
|
|
9
9
|
],
|
|
10
10
|
"registryDependencies": [
|
|
11
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
12
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
11
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/mockup-viewer.json",
|
|
12
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json"
|
|
13
13
|
],
|
|
14
14
|
"files": [
|
|
15
15
|
{
|
package/r/maquette-viewer.json
CHANGED
package/r/markdown-editor.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"title": "Markdown editor",
|
|
5
5
|
"description": "A host-owned styled wrapper over the concrete borrowed Markdown controller.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
8
|
-
"@hachej/boring-files@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
|
+
"@hachej/boring-files@^0.4.38",
|
|
9
9
|
"react@^19.0.0",
|
|
10
10
|
"react-dom@^19.0.0",
|
|
11
11
|
"marked@^17.0.6",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"lucide-react@^1.51.0"
|
|
25
25
|
],
|
|
26
26
|
"registryDependencies": [
|
|
27
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
27
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/button.json"
|
|
28
28
|
],
|
|
29
29
|
"files": [
|
|
30
30
|
{
|
package/r/mockup-viewer.json
CHANGED
package/r/pi-ambient.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"title": "Pi ambient agent",
|
|
5
5
|
"description": "AmbientChat, a compact floating agent bar that grows into a chat window over an existing page, and AgentNotifications, toasts over the kit's shared chat-react run notifications (with the one guarded browser Notification helper). A block over the pi-chat item; its in-window artifact panel uses the pi-workspace layout.",
|
|
6
6
|
"dependencies": [
|
|
7
|
-
"@hachej/boring-ui-kit@^0.4.
|
|
7
|
+
"@hachej/boring-ui-kit@^0.4.38",
|
|
8
8
|
"react@^19.0.0",
|
|
9
9
|
"react-dom@^19.0.0",
|
|
10
10
|
"@earendil-works/pi-durable@~1.4.0",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"lucide-react@^1.51.0"
|
|
13
13
|
],
|
|
14
14
|
"registryDependencies": [
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
17
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
18
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
19
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
20
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
21
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat-plugins.json",
|
|
17
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-chat-question.json",
|
|
18
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-artifacts.json",
|
|
19
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-workspace.json",
|
|
20
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/utils.json",
|
|
21
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/button.json"
|
|
22
22
|
],
|
|
23
23
|
"files": [
|
|
24
24
|
{
|
package/r/pi-app-kinds.json
CHANGED
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
"title": "Pi agent app default kinds",
|
|
5
5
|
"description": "defaultKinds({ locale, comments }): the artifact kinds the pi-app item draws with by default, in order: maquette, diagram, mock-up and records, then Markdown, HTML, SVG, CSV, image and PDF (documentKinds). Pass it as AgentWorkspace's artifactKinds (or ViewerOptions.kinds), with an app's own kinds before it. Each kind loads its viewer on first open.",
|
|
6
6
|
"registryDependencies": [
|
|
7
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
8
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
9
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
10
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
11
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
12
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
13
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
14
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
15
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
16
|
-
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.
|
|
7
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/pi-app.json",
|
|
8
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-markdown.json",
|
|
9
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-html.json",
|
|
10
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-image.json",
|
|
11
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-pdf.json",
|
|
12
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/viewer-code.json",
|
|
13
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/maquette-viewer.json",
|
|
14
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/diagram-viewer.json",
|
|
15
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/mockup-viewer.json",
|
|
16
|
+
"https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.38/r/record-viewer.json"
|
|
17
17
|
],
|
|
18
18
|
"files": [
|
|
19
19
|
{
|