@hachej/boring-ui-kit 0.4.37 → 0.4.39

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 (54) hide show
  1. package/dist/native-chat.js +11 -1
  2. package/dist/shared-chat/room.js +23 -7
  3. package/dist/shared-chat/source.d.ts +3 -0
  4. package/dist/task-board.d.ts +4 -0
  5. package/package.json +2 -2
  6. package/r/agent-target.json +4 -4
  7. package/r/app-shell.json +10 -10
  8. package/r/board-viewer.json +6 -6
  9. package/r/button.json +1 -1
  10. package/r/dock.json +1 -1
  11. package/r/documents.json +12 -12
  12. package/r/feedback-preview.json +1 -1
  13. package/r/feedback.json +6 -6
  14. package/r/file-tree.json +4 -4
  15. package/r/highlights.json +3 -3
  16. package/r/html-viewer.json +3 -3
  17. package/r/looks-viewer.json +2 -2
  18. package/r/maquette-viewer.json +1 -1
  19. package/r/markdown-editor.json +3 -3
  20. package/r/mockup-viewer.json +1 -1
  21. package/r/pi-ambient.json +8 -8
  22. package/r/pi-app-kinds.json +10 -10
  23. package/r/pi-app.json +10 -10
  24. package/r/pi-artifacts.json +2 -2
  25. package/r/pi-chat-approval.json +2 -2
  26. package/r/pi-chat-attachments.json +1 -1
  27. package/r/pi-chat-markdown.json +2 -2
  28. package/r/pi-chat-mentions.json +1 -1
  29. package/r/pi-chat-pickers.json +1 -1
  30. package/r/pi-chat-plugins.json +11 -11
  31. package/r/pi-chat-question.json +2 -2
  32. package/r/pi-chat-slash.json +2 -2
  33. package/r/pi-chat-subagent.json +1 -1
  34. package/r/pi-chat-voice.json +3 -3
  35. package/r/pi-chat.json +7 -7
  36. package/r/pi-workspace.json +3 -3
  37. package/r/placed-agent.json +4 -4
  38. package/r/pm-panel.json +19 -19
  39. package/r/provider-setup.json +1 -1
  40. package/r/registry.json +183 -183
  41. package/r/requests-board.json +1 -1
  42. package/r/shared-chat.json +10 -10
  43. package/r/task-board.json +3 -3
  44. package/r/task-list-viewer.json +2 -2
  45. package/r/task-mentions.json +4 -4
  46. package/r/version-history.json +2 -2
  47. package/r/viewer-code.json +2 -2
  48. package/r/viewer-frame.json +4 -4
  49. package/r/viewer-html.json +4 -4
  50. package/r/viewer-image.json +2 -2
  51. package/r/viewer-markdown.json +5 -5
  52. package/r/viewer-pdf.json +3 -3
  53. package/r/viewers.json +6 -6
  54. package/r/windows.json +1 -1
@@ -273,7 +273,17 @@ export function createNativeChatController(options) {
273
273
  return;
274
274
  if (historySource?.id !== conversation.id)
275
275
  throw new Error('History conversation identity changed');
276
- const page = await readHistory({ maxEntryId: scan.maxEntryId }, 40, scan.cursor === undefined ? undefined : structuredClone(scan.cursor), context);
276
+ // Bound only this read, never the borrowed conversation or its running task. A late page cannot publish after timeout.
277
+ const reading = withCancel(context);
278
+ const timer = setTimeout(() => reading.cancel(new Error('Conversation history read timed out')), 15_000);
279
+ let page;
280
+ try {
281
+ page = await awaitWithContext(readHistory({ maxEntryId: scan.maxEntryId }, 40, scan.cursor === undefined ? undefined : structuredClone(scan.cursor), reading.context), reading.context);
282
+ }
283
+ finally {
284
+ clearTimeout(timer);
285
+ reading.cancel();
286
+ }
277
287
  if (!current())
278
288
  return;
279
289
  if (historySource?.id !== conversation.id)
@@ -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 === 'delta') {
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;
@@ -35,6 +35,10 @@ export interface TaskRecord {
35
35
  readonly id: string;
36
36
  readonly number?: number | string;
37
37
  readonly title: string;
38
+ /** Short host-authored display title; the original title remains the description. */
39
+ readonly display?: string;
40
+ /** Canonical host classification, never inferred from prose or an actor name. */
41
+ readonly technical?: boolean;
38
42
  readonly state: TaskState;
39
43
  /** Host wording such as “À essayer”, independent of the five board columns. */
40
44
  readonly status?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hachej/boring-ui-kit",
3
- "version": "0.4.37",
3
+ "version": "0.4.39",
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.37",
157
+ "@hachej/boring-files": "^0.4.39",
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.37",
8
- "@hachej/boring-feedback@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-feedback@^0.4.39",
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.37/r/app-shell.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/app-shell.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-ui-kit@^0.4.37",
7
+ "@hachej/boring-feedback@^0.4.39",
8
+ "@hachej/boring-ui-kit@^0.4.39",
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.37/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-plugins.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-voice.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/dock.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pm-panel.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/feedback.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json",
22
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/button.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-plugins.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-voice.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/dock.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pm-panel.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/feedback.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/utils.json",
22
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/button.json"
23
23
  ],
24
24
  "files": [
25
25
  {
@@ -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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/maquette-viewer.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/mockup-viewer.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-artifacts.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/maquette-viewer.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/mockup-viewer.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-artifacts.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/utils.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/utils.json"
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/utils.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/button.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-artifacts.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-app.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-app-kinds.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/app-shell.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/file-tree.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-frame.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-image.json",
22
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-pdf.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/utils.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/button.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-artifacts.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-app.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-app-kinds.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/app-shell.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/file-tree.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-frame.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-image.json",
22
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-pdf.json"
23
23
  ],
24
24
  "files": [
25
25
  {
@@ -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.37",
7
+ "@hachej/boring-feedback@^0.4.39",
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.37",
8
- "@hachej/boring-ui-kit@^0.4.37",
9
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-feedback@^0.4.39",
8
+ "@hachej/boring-ui-kit@^0.4.39",
9
+ "@hachej/boring-files@^0.4.39",
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.37/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-voice.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-voice.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/utils.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/version-history.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/utils.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/markdown-editor.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/button.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/mockup-viewer.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/mockup-viewer.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/diagram-viewer.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/button.json"
27
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/viewer-frame.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
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.37/r/pi-chat.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-plugins.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-question.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-artifacts.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-workspace.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/button.json"
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-plugins.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-question.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-artifacts.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-workspace.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/utils.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/pi-app.json",
8
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-markdown.json",
9
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-html.json",
10
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-image.json",
11
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-pdf.json",
12
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-code.json",
13
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/maquette-viewer.json",
14
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/diagram-viewer.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/mockup-viewer.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/record-viewer.json"
7
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-app.json",
8
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-markdown.json",
9
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-html.json",
10
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-image.json",
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-pdf.json",
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-code.json",
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/maquette-viewer.json",
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/diagram-viewer.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/mockup-viewer.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
8
- "@hachej/boring-files@^0.4.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
8
+ "@hachej/boring-files@^0.4.39",
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.37/r/pi-chat.json",
15
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-chat-plugins.json",
16
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-artifacts.json",
17
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/pi-workspace.json",
18
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/viewer-frame.json",
19
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/utils.json",
20
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/button.json",
21
- "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.37/r/file-tree.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat.json",
15
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat-plugins.json",
16
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-artifacts.json",
17
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-workspace.json",
18
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/viewer-frame.json",
19
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/utils.json",
20
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/button.json",
21
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
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.37/r/pi-chat.json"
14
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
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.37/r/pi-chat.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/pi-chat.json"
12
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37",
7
+ "@hachej/boring-ui-kit@^0.4.39",
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.37/r/pi-chat.json"
13
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/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.37/r/pi-chat.json"
11
+ "https://cdn.jsdelivr.net/npm/@hachej/boring-ui-kit@0.4.39/r/pi-chat.json"
12
12
  ],
13
13
  "files": [
14
14
  {