@hachej/boring-ui-kit 0.4.52 → 0.4.54

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 (50) hide show
  1. package/dist/chat-react-session.d.ts +6 -0
  2. package/dist/chat-react-session.js +33 -6
  3. package/dist/chat-view.js +3 -1
  4. package/package.json +2 -2
  5. package/r/agent-target.json +4 -4
  6. package/r/app-shell.json +9 -9
  7. package/r/board-viewer.json +6 -6
  8. package/r/button.json +1 -1
  9. package/r/dock.json +1 -1
  10. package/r/documents.json +12 -12
  11. package/r/drawing-viewer.json +1 -1
  12. package/r/feedback.json +6 -6
  13. package/r/file-tree.json +4 -4
  14. package/r/highlights.json +3 -3
  15. package/r/html-viewer.json +3 -3
  16. package/r/looks-viewer.json +2 -2
  17. package/r/maquette-viewer.json +1 -1
  18. package/r/markdown-editor.json +3 -3
  19. package/r/mockup-viewer.json +1 -1
  20. package/r/pi-ambient.json +8 -8
  21. package/r/pi-app-kinds.json +10 -10
  22. package/r/pi-app.json +10 -10
  23. package/r/pi-artifacts.json +2 -2
  24. package/r/pi-chat-approval.json +2 -2
  25. package/r/pi-chat-attachments.json +1 -1
  26. package/r/pi-chat-markdown.json +2 -2
  27. package/r/pi-chat-mentions.json +1 -1
  28. package/r/pi-chat-pickers.json +1 -1
  29. package/r/pi-chat-plugins.json +11 -11
  30. package/r/pi-chat-question.json +2 -2
  31. package/r/pi-chat-slash.json +2 -2
  32. package/r/pi-chat-subagent.json +1 -1
  33. package/r/pi-chat-voice.json +3 -3
  34. package/r/pi-chat.json +7 -7
  35. package/r/pi-workspace.json +3 -3
  36. package/r/placed-agent.json +4 -4
  37. package/r/provider-setup.json +1 -1
  38. package/r/registry.json +162 -162
  39. package/r/shared-chat.json +6 -6
  40. package/r/spaces.json +1 -1
  41. package/r/task-list-viewer.json +2 -2
  42. package/r/version-history.json +2 -2
  43. package/r/viewer-code.json +2 -2
  44. package/r/viewer-frame.json +4 -4
  45. package/r/viewer-html.json +4 -4
  46. package/r/viewer-image.json +2 -2
  47. package/r/viewer-markdown.json +5 -5
  48. package/r/viewer-pdf.json +3 -3
  49. package/r/viewers.json +6 -6
  50. package/r/windows.json +1 -1
@@ -74,6 +74,11 @@ export interface ChatSessionOptions<Content = unknown> extends Partial<DeriveOpt
74
74
  readonly labels: ChatSessionLabels;
75
75
  readonly actions?: {
76
76
  readonly withdraw?: ((id: QueuedMessage['id']) => Promise<unknown>) | undefined;
77
+ /** Resolves a waiting question. With it, a message typed while a question waits is that question's answer. */
78
+ readonly answer?: ((questionId: string, answer: string) => Promise<{
79
+ readonly kind: string;
80
+ readonly reason?: string | undefined;
81
+ }>) | undefined;
77
82
  } | undefined;
78
83
  readonly toolRenderers?: Readonly<Record<string, (call: ToolCall, result: ToolResultMessage | undefined) => ChatCard<Content> | undefined>> | undefined;
79
84
  readonly artifacts?: (NonNullable<DeriveOptions<Content>['artifacts']> & {
@@ -129,6 +134,7 @@ export declare function useChatSession<Content = unknown>(options: ChatSessionOp
129
134
  queueActions: QueueActions | undefined;
130
135
  working: boolean;
131
136
  waitingForAnswer: boolean;
137
+ answersQuestion: boolean;
132
138
  connected: boolean;
133
139
  sendBlocked: boolean;
134
140
  error: string | null;
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
3
- import { derive, isFileBlock, object, queuedMessages, waitingForAnswer as waitsForAnswer } from './chat-view.js';
3
+ import { derive, isFileBlock, object, queuedMessages, waitingPart } from './chat-view.js';
4
4
  import { appendToDraft, displayName, kindMentionDraft, looksLikeMarkdown, mentionKind, mentionToken, pieces, prependToDraft, withoutKindMentions, writeKindMentionDraft } from './chat-text.js';
5
5
  /** Headless session over the public native controller snapshot/commands. Borrows it; cleanup only aborts this hook's uploads. */
6
6
  /**
@@ -158,11 +158,38 @@ export function useChatSession(options) {
158
158
  // Working from the moment of sending: the status shows before the server has taken the message.
159
159
  const sending = Boolean(echo?.some(item => item.state === 'sending'));
160
160
  const working = Boolean(run) || sending;
161
- const waitingForAnswer = waitsForAnswer(derived.rows);
161
+ const delivering = useRef(Promise.resolve());
162
+ const settledQuestion = useRef(undefined);
163
+ const waitingFor = waitingPart(derived.rows);
164
+ const waitingForAnswer = waitingFor !== undefined;
165
+ // The run waits for this answer, so a message queued behind it would never go: what the person types answers the question.
166
+ const question = waitingFor?.kind === 'question' ? waitingFor.questionId : undefined;
167
+ const answersQuestion = question !== undefined && actions?.answer !== undefined && (state.draft.text.trim() !== '' || state.draft.attachments.length > 0);
168
+ /**
169
+ * Answers the waiting question with this message. A picture cannot be part of an answer, so it follows as its own message. A question that
170
+ * cannot take the message (options only, too long, not started) is superseded: the run that holds it stops, or the message would wait behind it.
171
+ * One at a time and once per question: a second message goes after the first, as an ordinary message, and stops nothing.
172
+ */
173
+ const deliver = (text, images, restore) => {
174
+ const turn = delivering.current.catch(() => { }).then(async () => {
175
+ if (question !== undefined && actions?.answer && settledQuestion.current !== question) {
176
+ const outcome = await actions.answer(question, text.trim() || images.map(image => image.name).join(', '));
177
+ settledQuestion.current = question;
178
+ if (outcome.kind === 'answered')
179
+ return images.length ? await controller.send('followUp', { text: '', attachments: images, restore: { text: '', attachments: images } }) ?? true : true;
180
+ if ((outcome.kind === 'denied' || outcome.kind === 'unknown-question') && run)
181
+ await controller.stop();
182
+ }
183
+ return controller.send('followUp', { text, attachments: images, restore });
184
+ });
185
+ delivering.current = turn;
186
+ return turn;
187
+ };
162
188
  const send = () => {
163
189
  if (sendBlocked || !current())
164
190
  return;
165
- const attach = feedback && feedback.count > 0 ? feedback.attach : undefined;
191
+ // An answer is what the person typed, shown on the card as is: pending feedback stays for their next message.
192
+ const attach = feedback && feedback.count > 0 && !answersQuestion ? feedback.attach : undefined;
166
193
  if (attach) {
167
194
  // The pending feedback goes with this message: the host attaches it to the text, then the native send reads the draft.
168
195
  act(async () => {
@@ -202,12 +229,12 @@ export function useChatSession(options) {
202
229
  }
203
230
  const typed = controller.getSnapshot().draft;
204
231
  const words = withoutKindMentions(typed.text, mentions);
205
- if (words !== typed.text) {
232
+ if (words !== typed.text || answersQuestion) {
206
233
  controller.setText('');
207
234
  controller.setAttachments([]);
208
235
  act(async () => {
209
236
  try {
210
- await controller.send('followUp', { text: typed.text, attachments: typed.attachments, restore: { text: words, attachments: typed.attachments } });
237
+ await deliver(typed.text, typed.attachments, { text: words, attachments: typed.attachments });
211
238
  }
212
239
  catch (cause) {
213
240
  putBack(words, typed.attachments);
@@ -398,7 +425,7 @@ export function useChatSession(options) {
398
425
  };
399
426
  const empty = connected && !state.view?.entries.length && !rows.length;
400
427
  const loading = (state.connection.kind === 'idle' || state.connection.kind === 'connecting') && !state.view && !echo?.length;
401
- return { state, derived, rows, queued, queueActions, working, waitingForAnswer, connected, sendBlocked, error, setError, report, act, current,
428
+ return { state, derived, rows, queued, queueActions, working, waitingForAnswer, answersQuestion, connected, sendBlocked, error, setError, report, act, current,
402
429
  files, empty, loading, developer, natural, sending, send, putBack, upload, pasteText, picked, pending, uploading, activateMention,
403
430
  pickMention: (path) => setPicked(value => value.includes(path) ? value : [...value, path]),
404
431
  dismissUpload: (id) => setPending(items => items.filter(item => item.id !== id)),
package/dist/chat-view.js CHANGED
@@ -124,8 +124,10 @@ export function derive(view, options) {
124
124
  const status = (result) => result ? (result.isError ? 'failed' : 'completed') : run ? 'running' : 'unfinished';
125
125
  function toolPart(call, key, committed) {
126
126
  const result = results.get(call);
127
+ // A question that failed (stopped, refused arguments) has nothing a reader can act on, and its result is harness text with the model's arguments.
128
+ // Nor has a call with no question: still being written, or about to be refused, since `ask_user` requires one even for a form. Only missing or empty: Pi coerces `0` to text and accepts it.
127
129
  if (call.name === ASK_USER_TOOL)
128
- return { kind: 'question', key, call, result, live: !committed, questionId: questionIds.get(call) };
130
+ return natural && (result?.isError || !result && (call.arguments?.['question'] ?? '') === '') ? undefined : { kind: 'question', key, call, result, live: !committed, questionId: questionIds.get(call) };
129
131
  // A call gated by `requireApproval` identifies itself: it publishes its summary under APPROVAL_DETAILS before it asks.
130
132
  const slotDetails = result ? undefined : (Array.isArray(live?.['tools']) ? live['tools'] : []).map(object).find(slot => slot?.['callId'] === call.id)?.['details'];
131
133
  const record = approvalRecord(result ? result.details : slotDetails);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hachej/boring-ui-kit",
3
- "version": "0.4.52",
3
+ "version": "0.4.54",
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.52",
157
+ "@hachej/boring-files": "^0.4.54",
158
158
  "@earendil-works/pi-durable": "~1.4.0",
159
159
  "react": "^19.0.0",
160
160
  "react-dom": "^19.0.0",
@@ -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.52",
8
- "@hachej/boring-feedback@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-feedback@^0.4.54",
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.52/r/app-shell.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/app-shell.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
16
16
  ],
17
17
  "files": [
18
18
  {
package/r/app-shell.json CHANGED
@@ -4,21 +4,21 @@
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.52",
8
- "@hachej/boring-ui-kit@^0.4.52",
7
+ "@hachej/boring-feedback@^0.4.54",
8
+ "@hachej/boring-ui-kit@^0.4.54",
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.52/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-plugins.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-voice.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/dock.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/feedback.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/button.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-plugins.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-voice.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/dock.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/feedback.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json"
22
22
  ],
23
23
  "files": [
24
24
  {
@@ -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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/maquette-viewer.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/mockup-viewer.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-artifacts.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/maquette-viewer.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/mockup-viewer.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-artifacts.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json"
18
18
  ],
19
19
  "files": [
20
20
  {
package/r/button.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "lucide-react@^1.51.0"
10
10
  ],
11
11
  "registryDependencies": [
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json"
13
13
  ],
14
14
  "files": [
15
15
  {
package/r/dock.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "react@^19.0.0"
8
8
  ],
9
9
  "registryDependencies": [
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json"
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json"
11
11
  ],
12
12
  "files": [
13
13
  {
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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/utils.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/button.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-artifacts.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-app.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-app-kinds.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/app-shell.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/file-tree.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-frame.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-image.json",
22
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-pdf.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-artifacts.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-app.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-app-kinds.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/app-shell.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/file-tree.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-frame.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-image.json",
22
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-pdf.json"
23
23
  ],
24
24
  "files": [
25
25
  {
@@ -4,7 +4,7 @@
4
4
  "title": "Drawing viewer",
5
5
  "description": "DrawingViewer, drawingKind and describeDrawing: an Excalidraw (.excalidraw) or draw.io (.drawio) file, read-only, drawn by the tool's own renderer on a white page fitted to the shapes: Excalidraw's exportToSvg (its fonts served by the app, never its CDN) and the official diagrams.net viewer, vendored in the kit (@hachej/boring-ui-kit/drawio-viewer), in a sandboxed frame without network. Shown as an image, so nothing in the file runs; an unreadable file shows an inline error. onRead hands the shapes and arrows the renderer read (kind, place, size, label, colours, from and to). Each renderer loads the first time a drawing of its format opens; the kind is not in the pi-app-kinds default list, so apps without drawings install nothing.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
8
  "react@^19.0.0",
9
9
  "lucide-react@^1.51.0",
10
10
  "@excalidraw/excalidraw@0.18.1"
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.52",
8
- "@hachej/boring-ui-kit@^0.4.52",
9
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-feedback@^0.4.54",
8
+ "@hachej/boring-ui-kit@^0.4.54",
9
+ "@hachej/boring-files@^0.4.54",
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.52/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-voice.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-voice.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/utils.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/version-history.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/markdown-editor.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/markdown-editor.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/button.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -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.52/r/mockup-viewer.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/mockup-viewer.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,7 +8,7 @@
8
8
  "lucide-react@^1.51.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/diagram-viewer.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/diagram-viewer.json"
12
12
  ],
13
13
  "files": [
14
14
  {
@@ -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.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
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.52/r/button.json"
27
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json"
28
28
  ],
29
29
  "files": [
30
30
  {
@@ -10,7 +10,7 @@
10
10
  "zod@^4.6.5"
11
11
  ],
12
12
  "registryDependencies": [
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-frame.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-frame.json"
14
14
  ],
15
15
  "files": [
16
16
  {
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.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
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.52/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-plugins.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-question.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-artifacts.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-workspace.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/button.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-plugins.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-question.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-artifacts.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-workspace.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json"
22
22
  ],
23
23
  "files": [
24
24
  {
@@ -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.52/r/pi-app.json",
8
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-markdown.json",
9
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-html.json",
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-image.json",
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-pdf.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-code.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/maquette-viewer.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/diagram-viewer.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/mockup-viewer.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/record-viewer.json"
7
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-app.json",
8
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-markdown.json",
9
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-html.json",
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-image.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-pdf.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-code.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/maquette-viewer.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/diagram-viewer.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/mockup-viewer.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/record-viewer.json"
17
17
  ],
18
18
  "files": [
19
19
  {
package/r/pi-app.json CHANGED
@@ -4,21 +4,21 @@
4
4
  "title": "Pi agent app",
5
5
  "description": "AgentWorkspace: a whole agent page in one component. Left: the sessions pane (search, New, rename, archive, delete; collapsible, a drawer on a narrow screen). Center: PiChat. Right: the artifact panel (versions, file viewer, auto-open of new artifacts) in the ArtifactWorkspace panel, a full-screen sheet on a phone; it draws files with the kinds the app passes in artifactKinds (defaultKinds of the pi-app-kinds item is the default list). layout=\"embedded\" drops the left column for one compact top bar (title, History, Library, New) that joins an app-shell screen header. Props are data and callbacks; hooks for the conversations handler (useConversations), the chat transport (useRemoteChat) and saved resources (useSaved).",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.52",
8
- "@hachej/boring-files@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
+ "@hachej/boring-files@^0.4.54",
9
9
  "react@^19.0.0",
10
10
  "react-dom@^19.0.0",
11
11
  "lucide-react@^1.51.0"
12
12
  ],
13
13
  "registryDependencies": [
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat-plugins.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-artifacts.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-workspace.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/viewer-frame.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/utils.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/button.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/file-tree.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat-plugins.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-artifacts.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-workspace.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/viewer-frame.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/utils.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/button.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/file-tree.json"
22
22
  ],
23
23
  "files": [
24
24
  {
@@ -4,14 +4,14 @@
4
4
  "title": "Pi artifacts",
5
5
  "description": "Artifact descriptors, kinds and the artifact card that opens generated content in the host's panel. Plug it in with `artifacts={{ ...artifactCards, open, isOpen, kinds }}`; without it pi-chat offers no artifact. pi-app and the viewers import their artifact kinds and types from it.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
8
  "react@^19.0.0",
9
9
  "lucide-react@^1.51.0",
10
10
  "@earendil-works/pi-ai@~1.4.0",
11
11
  "@earendil-works/pi-durable@~1.4.0"
12
12
  ],
13
13
  "registryDependencies": [
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -4,13 +4,13 @@
4
4
  "title": "Pi chat approval card",
5
5
  "description": "The Approve / Deny card for host tools wrapped with `requireApproval`. Plug it in with `cards={{ approval: ApprovalCard }}`; without it pi-chat shows a \"waiting for your answer\" notice with no answer UI.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
8
  "react@^19.0.0",
9
9
  "lucide-react@^1.51.0",
10
10
  "@earendil-works/pi-ai@~1.4.0"
11
11
  ],
12
12
  "registryDependencies": [
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -9,7 +9,7 @@
9
9
  "lucide-react@^1.51.0"
10
10
  ],
11
11
  "registryDependencies": [
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -4,13 +4,13 @@
4
4
  "title": "Pi chat Markdown",
5
5
  "description": "Markdown for the chat's assistant replies: safe token-by-token rendering (raw HTML shown as text, no images fetched, http(s) links only), code blocks, tables, task lists and /command buttons. Plug it in with `renderText={markdownText}`; without it pi-chat shows replies as plain text.",
6
6
  "dependencies": [
7
- "@hachej/boring-ui-kit@^0.4.52",
7
+ "@hachej/boring-ui-kit@^0.4.54",
8
8
  "react@^19.0.0",
9
9
  "marked@^17.0.6",
10
10
  "entities@^8.1.0"
11
11
  ],
12
12
  "registryDependencies": [
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,7 +8,7 @@
8
8
  "lucide-react@^1.51.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
12
12
  ],
13
13
  "files": [
14
14
  {
@@ -8,7 +8,7 @@
8
8
  "lucide-react@^1.51.0"
9
9
  ],
10
10
  "registryDependencies": [
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.52/r/pi-chat.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.54/r/pi-chat.json"
12
12
  ],
13
13
  "files": [
14
14
  {