ugly-app 0.1.553 → 0.1.555

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/cli/version.d.ts +1 -1
  2. package/dist/cli/version.js +1 -1
  3. package/dist/client/index.d.ts +2 -0
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +1 -0
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/uploadBlob.d.ts +83 -0
  8. package/dist/client/uploadBlob.d.ts.map +1 -0
  9. package/dist/client/uploadBlob.js +109 -0
  10. package/dist/client/uploadBlob.js.map +1 -0
  11. package/dist/conversation/client/ChatContext.d.ts +6 -0
  12. package/dist/conversation/client/ChatContext.d.ts.map +1 -1
  13. package/dist/conversation/client/ChatContext.js.map +1 -1
  14. package/dist/conversation/client/ChatMarkdownInput.d.ts +6 -1
  15. package/dist/conversation/client/ChatMarkdownInput.d.ts.map +1 -1
  16. package/dist/conversation/client/ChatMarkdownInput.js +3 -3
  17. package/dist/conversation/client/ChatMarkdownInput.js.map +1 -1
  18. package/dist/conversation/client/ChatMessageBubble.d.ts.map +1 -1
  19. package/dist/conversation/client/ChatMessageBubble.js +13 -3
  20. package/dist/conversation/client/ChatMessageBubble.js.map +1 -1
  21. package/dist/conversation/client/ChatView.d.ts +3 -1
  22. package/dist/conversation/client/ChatView.d.ts.map +1 -1
  23. package/dist/conversation/client/ChatView.js +3 -1
  24. package/dist/conversation/client/ChatView.js.map +1 -1
  25. package/dist/server/adapter/workers/createWorkersApp.js +57 -0
  26. package/dist/server/adapter/workers/createWorkersApp.js.map +1 -1
  27. package/dist/three/shared/avatar/AvatarAnimations.d.ts +44 -0
  28. package/dist/three/shared/avatar/AvatarAnimations.d.ts.map +1 -0
  29. package/dist/three/shared/avatar/AvatarAnimations.js +1405 -0
  30. package/dist/three/shared/avatar/AvatarAnimations.js.map +1 -0
  31. package/dist/three/shared/avatar/AvatarDanceGroups.d.ts +14 -0
  32. package/dist/three/shared/avatar/AvatarDanceGroups.d.ts.map +1 -0
  33. package/dist/three/shared/avatar/AvatarDanceGroups.js +115 -0
  34. package/dist/three/shared/avatar/AvatarDanceGroups.js.map +1 -0
  35. package/dist/three/shared/avatar/AvatarModel.d.ts +481 -0
  36. package/dist/three/shared/avatar/AvatarModel.d.ts.map +1 -0
  37. package/dist/three/shared/avatar/AvatarModel.js +3478 -0
  38. package/dist/three/shared/avatar/AvatarModel.js.map +1 -0
  39. package/dist/three/shared/avatar/AvatarParticleSystem.d.ts +75 -0
  40. package/dist/three/shared/avatar/AvatarParticleSystem.d.ts.map +1 -0
  41. package/dist/three/shared/avatar/AvatarParticleSystem.js +351 -0
  42. package/dist/three/shared/avatar/AvatarParticleSystem.js.map +1 -0
  43. package/dist/three/shared/avatar/AvatarPostProcessing.d.ts +64 -0
  44. package/dist/three/shared/avatar/AvatarPostProcessing.d.ts.map +1 -0
  45. package/dist/three/shared/avatar/AvatarPostProcessing.js +489 -0
  46. package/dist/three/shared/avatar/AvatarPostProcessing.js.map +1 -0
  47. package/dist/three/shared/avatar/AvatarRoom.d.ts +36 -0
  48. package/dist/three/shared/avatar/AvatarRoom.d.ts.map +1 -0
  49. package/dist/three/shared/avatar/AvatarRoom.js +189 -0
  50. package/dist/three/shared/avatar/AvatarRoom.js.map +1 -0
  51. package/dist/three/shared/avatar/AvatarScene.d.ts +379 -0
  52. package/dist/three/shared/avatar/AvatarScene.d.ts.map +1 -0
  53. package/dist/three/shared/avatar/AvatarScene.js +1436 -0
  54. package/dist/three/shared/avatar/AvatarScene.js.map +1 -0
  55. package/dist/three/shared/avatar/AvatarTypes.d.ts +117 -0
  56. package/dist/three/shared/avatar/AvatarTypes.d.ts.map +1 -0
  57. package/dist/three/shared/avatar/AvatarTypes.js +10 -0
  58. package/dist/three/shared/avatar/AvatarTypes.js.map +1 -0
  59. package/dist/three/shared/avatar/DynamicCameraController.d.ts +89 -0
  60. package/dist/three/shared/avatar/DynamicCameraController.d.ts.map +1 -0
  61. package/dist/three/shared/avatar/DynamicCameraController.js +338 -0
  62. package/dist/three/shared/avatar/DynamicCameraController.js.map +1 -0
  63. package/dist/three/shared/avatar/GLTFLoader.d.ts +15 -0
  64. package/dist/three/shared/avatar/GLTFLoader.d.ts.map +1 -0
  65. package/dist/three/shared/avatar/GLTFLoader.js +3149 -0
  66. package/dist/three/shared/avatar/GLTFLoader.js.map +1 -0
  67. package/dist/three/shared/avatar/HeadlessEnvironment.d.ts +14 -0
  68. package/dist/three/shared/avatar/HeadlessEnvironment.d.ts.map +1 -0
  69. package/dist/three/shared/avatar/HeadlessEnvironment.js +14 -0
  70. package/dist/three/shared/avatar/HeadlessEnvironment.js.map +1 -0
  71. package/dist/three/shared/avatar/PodcastEasing.d.ts +46 -0
  72. package/dist/three/shared/avatar/PodcastEasing.d.ts.map +1 -0
  73. package/dist/three/shared/avatar/PodcastEasing.js +44 -0
  74. package/dist/three/shared/avatar/PodcastEasing.js.map +1 -0
  75. package/dist/three/shared/avatar/ServerDRACOLoader.d.ts +7 -0
  76. package/dist/three/shared/avatar/ServerDRACOLoader.d.ts.map +1 -0
  77. package/dist/three/shared/avatar/ServerDRACOLoader.js +10 -0
  78. package/dist/three/shared/avatar/ServerDRACOLoader.js.map +1 -0
  79. package/dist/three/shared/avatar/Texture.d.ts +3 -0
  80. package/dist/three/shared/avatar/Texture.d.ts.map +1 -0
  81. package/dist/three/shared/avatar/Texture.js +31 -0
  82. package/dist/three/shared/avatar/Texture.js.map +1 -0
  83. package/dist/three/shared/avatar/_compat.d.ts +4 -0
  84. package/dist/three/shared/avatar/_compat.d.ts.map +1 -0
  85. package/dist/three/shared/avatar/_compat.js +2 -0
  86. package/dist/three/shared/avatar/_compat.js.map +1 -0
  87. package/package.json +1 -1
  88. package/src/cli/version.ts +1 -1
  89. package/src/client/index.ts +2 -0
  90. package/src/client/uploadBlob.ts +151 -0
  91. package/src/conversation/client/ChatContext.ts +6 -0
  92. package/src/conversation/client/ChatMarkdownInput.tsx +8 -2
  93. package/src/conversation/client/ChatMessageBubble.tsx +16 -3
  94. package/src/conversation/client/ChatView.tsx +5 -0
  95. package/src/server/adapter/workers/createWorkersApp.ts +59 -0
  96. package/src/three/shared/avatar/AvatarAnimations.ts +1444 -0
  97. package/src/three/shared/avatar/AvatarDanceGroups.ts +124 -0
  98. package/src/three/shared/avatar/AvatarModel.ts +4125 -0
  99. package/src/three/shared/avatar/AvatarParticleSystem.ts +425 -0
  100. package/src/three/shared/avatar/AvatarPostProcessing.ts +559 -0
  101. package/src/three/shared/avatar/AvatarRoom.ts +232 -0
  102. package/src/three/shared/avatar/AvatarScene.ts +1959 -0
  103. package/src/three/shared/avatar/AvatarTypes.ts +150 -0
  104. package/src/three/shared/avatar/DynamicCameraController.ts +475 -0
  105. package/src/three/shared/avatar/GLTFLoader.ts +4453 -0
  106. package/src/three/shared/avatar/HeadlessEnvironment.ts +28 -0
  107. package/src/three/shared/avatar/PodcastEasing.ts +50 -0
  108. package/src/three/shared/avatar/ServerDRACOLoader.ts +9 -0
  109. package/src/three/shared/avatar/Texture.ts +34 -0
  110. package/src/three/shared/avatar/_compat.ts +15 -0
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.553";
1
+ export declare const CLI_VERSION = "0.1.555";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.553";
2
+ export const CLI_VERSION = "0.1.555";
3
3
  //# sourceMappingURL=version.js.map
@@ -29,6 +29,8 @@ export { useSTT } from './audio/useSTT.js';
29
29
  export { useTTS } from './audio/useTTS.js';
30
30
  export { WaveVisualizer } from './audio/WaveVisualizer.js';
31
31
  export { callImageGen, callJsonGen, callTextGen } from './callAI.js';
32
+ export { uploadBlob, promoteBlob, downscaleImage } from './uploadBlob.js';
33
+ export type { UploadedBlob, UploadBlobOptions } from './uploadBlob.js';
32
34
  export { FeedbackButton } from './components/FeedbackButton.js';
33
35
  export * from './components/index.js';
34
36
  export { createHttpClient } from './createHttpClient.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ export { useSTT } from './audio/useSTT.js';
18
18
  export { useTTS } from './audio/useTTS.js';
19
19
  export { WaveVisualizer } from './audio/WaveVisualizer.js';
20
20
  export { callImageGen, callJsonGen, callTextGen } from './callAI.js';
21
+ export { uploadBlob, promoteBlob, downscaleImage } from './uploadBlob.js';
21
22
  export { FeedbackButton } from './components/FeedbackButton.js';
22
23
  export * from './components/index.js';
23
24
  export { createHttpClient } from './createHttpClient.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEzH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,UAAU,GACX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,EACX,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO3E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAEzH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,UAAU,GACX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,EACX,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO3E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Blob upload — the framework's default pattern for user file/image uploads.
3
+ *
4
+ * Two-phase, by design:
5
+ *
6
+ * 1. `uploadBlob(file)` streams the bytes to `PUT /_upload`, which stages them
7
+ * in the **temp** R2 bucket under `temp/<userId>/<uuid>-<name>`. Temp
8
+ * objects auto-expire after **7 days** (a bucket lifecycle rule), so an
9
+ * upload the user never commits to costs nothing long-term.
10
+ * 2. When the user actually commits (sends the message, saves the form, …),
11
+ * call the `promoteUpload` request with the returned `key` — `promoteBlob`
12
+ * below wraps it — to copy the object into the permanent **public** bucket
13
+ * at `public/<userId>/…` and get its durable URL.
14
+ *
15
+ * Every blob is stored under a `<userId>/` folder so per-user storage limits and
16
+ * cleanup are a simple prefix scan, and a user can only ever promote a blob from
17
+ * their own folder (enforced server-side).
18
+ *
19
+ * Preview before promotion with `URL.createObjectURL(file)` — the temp object is
20
+ * intentionally NOT served publicly; only promoted (public) blobs are.
21
+ *
22
+ * @example Minimal image attach + send
23
+ * ```tsx
24
+ * const [pending, setPending] = useState<{ key: string; preview: string; name: string }[]>([]);
25
+ *
26
+ * async function onPickFile(file: File) {
27
+ * const preview = URL.createObjectURL(file); // instant local preview
28
+ * const small = await downscaleImage(file, 1600); // optional client-side processing
29
+ * const { key } = await uploadBlob(small, { name: file.name });
30
+ * setPending((p) => [...p, { key, preview, name: file.name }]);
31
+ * }
32
+ *
33
+ * async function onSend(text: string) {
34
+ * // Promote every staged blob to a permanent URL, then reference them.
35
+ * const urls = await Promise.all(pending.map((p) => promoteBlob(socket, p.key)));
36
+ * const markdown = [text, ...urls.map((u, i) => `![${pending[i].name}](${u})`)].join('\n\n');
37
+ * await socket.request('conversationMessageCreate', { conversationId, message: { markdown, text } });
38
+ * pending.forEach((p) => URL.revokeObjectURL(p.preview));
39
+ * setPending([]);
40
+ * }
41
+ * ```
42
+ */
43
+ export interface UploadedBlob {
44
+ /**
45
+ * Temp key under the caller's user folder: `<userId>/<uuid>-<name>`. Pass this
46
+ * to `promoteBlob` / the `promoteUpload` request to make the blob permanent.
47
+ */
48
+ key: string;
49
+ /**
50
+ * Same-origin URL of the staged (temp) object. Temp objects are NOT served
51
+ * publicly by default — use `URL.createObjectURL(file)` for previews and rely
52
+ * on the promoted URL for anything durable.
53
+ */
54
+ url: string;
55
+ size: number;
56
+ contentType: string;
57
+ }
58
+ export interface UploadBlobOptions {
59
+ /** Override the filename recorded in the key (defaults to `file.name`). */
60
+ name?: string;
61
+ /** Abort the in-flight upload. */
62
+ signal?: AbortSignal;
63
+ }
64
+ /** Stage a file/blob in the temp bucket. Auth travels via the session cookie. */
65
+ export declare function uploadBlob(file: File | Blob, opts?: UploadBlobOptions): Promise<UploadedBlob>;
66
+ interface PromoteCapableSocket {
67
+ request: (name: string, input: unknown) => Promise<unknown>;
68
+ }
69
+ /**
70
+ * Promote a staged temp blob to the permanent public bucket and return its
71
+ * durable URL. Thin wrapper over the `promoteUpload` request.
72
+ */
73
+ export declare function promoteBlob(socket: PromoteCapableSocket, key: string): Promise<string>;
74
+ /**
75
+ * Optional client-side "processing": downscale a raster image to `maxDim` on its
76
+ * longest edge (re-encoding to the same type, or webp if the source isn't a
77
+ * common raster). Returns the original untouched if it's already small, not an
78
+ * image, or canvas isn't available (e.g. SSR). Node-canvas isn't available on
79
+ * Workers, so resizing belongs on the client — this is the recommended path.
80
+ */
81
+ export declare function downscaleImage(file: File, maxDim?: number, quality?: number): Promise<File>;
82
+ export {};
83
+ //# sourceMappingURL=uploadBlob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadBlob.d.ts","sourceRoot":"","sources":["../../src/client/uploadBlob.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,iFAAiF;AACjF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAiBvB;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,MAAM,SAAO,EACb,OAAO,SAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Blob upload — the framework's default pattern for user file/image uploads.
3
+ *
4
+ * Two-phase, by design:
5
+ *
6
+ * 1. `uploadBlob(file)` streams the bytes to `PUT /_upload`, which stages them
7
+ * in the **temp** R2 bucket under `temp/<userId>/<uuid>-<name>`. Temp
8
+ * objects auto-expire after **7 days** (a bucket lifecycle rule), so an
9
+ * upload the user never commits to costs nothing long-term.
10
+ * 2. When the user actually commits (sends the message, saves the form, …),
11
+ * call the `promoteUpload` request with the returned `key` — `promoteBlob`
12
+ * below wraps it — to copy the object into the permanent **public** bucket
13
+ * at `public/<userId>/…` and get its durable URL.
14
+ *
15
+ * Every blob is stored under a `<userId>/` folder so per-user storage limits and
16
+ * cleanup are a simple prefix scan, and a user can only ever promote a blob from
17
+ * their own folder (enforced server-side).
18
+ *
19
+ * Preview before promotion with `URL.createObjectURL(file)` — the temp object is
20
+ * intentionally NOT served publicly; only promoted (public) blobs are.
21
+ *
22
+ * @example Minimal image attach + send
23
+ * ```tsx
24
+ * const [pending, setPending] = useState<{ key: string; preview: string; name: string }[]>([]);
25
+ *
26
+ * async function onPickFile(file: File) {
27
+ * const preview = URL.createObjectURL(file); // instant local preview
28
+ * const small = await downscaleImage(file, 1600); // optional client-side processing
29
+ * const { key } = await uploadBlob(small, { name: file.name });
30
+ * setPending((p) => [...p, { key, preview, name: file.name }]);
31
+ * }
32
+ *
33
+ * async function onSend(text: string) {
34
+ * // Promote every staged blob to a permanent URL, then reference them.
35
+ * const urls = await Promise.all(pending.map((p) => promoteBlob(socket, p.key)));
36
+ * const markdown = [text, ...urls.map((u, i) => `![${pending[i].name}](${u})`)].join('\n\n');
37
+ * await socket.request('conversationMessageCreate', { conversationId, message: { markdown, text } });
38
+ * pending.forEach((p) => URL.revokeObjectURL(p.preview));
39
+ * setPending([]);
40
+ * }
41
+ * ```
42
+ */
43
+ /** Stage a file/blob in the temp bucket. Auth travels via the session cookie. */
44
+ export async function uploadBlob(file, opts = {}) {
45
+ const name = opts.name ?? (typeof File !== 'undefined' && file instanceof File ? file.name : 'file');
46
+ const res = await fetch(`/_upload?name=${encodeURIComponent(name)}`, {
47
+ method: 'PUT',
48
+ credentials: 'include',
49
+ headers: { 'content-type': file.type || 'application/octet-stream' },
50
+ body: file,
51
+ ...(opts.signal ? { signal: opts.signal } : {}),
52
+ });
53
+ if (!res.ok) {
54
+ const msg = await res.text().catch(() => '');
55
+ throw new Error(`uploadBlob failed (${res.status})${msg ? `: ${msg.slice(0, 200)}` : ''}`);
56
+ }
57
+ return (await res.json());
58
+ }
59
+ /**
60
+ * Promote a staged temp blob to the permanent public bucket and return its
61
+ * durable URL. Thin wrapper over the `promoteUpload` request.
62
+ */
63
+ export async function promoteBlob(socket, key) {
64
+ const res = (await socket.request('promoteUpload', { key }));
65
+ return res.url;
66
+ }
67
+ /**
68
+ * Optional client-side "processing": downscale a raster image to `maxDim` on its
69
+ * longest edge (re-encoding to the same type, or webp if the source isn't a
70
+ * common raster). Returns the original untouched if it's already small, not an
71
+ * image, or canvas isn't available (e.g. SSR). Node-canvas isn't available on
72
+ * Workers, so resizing belongs on the client — this is the recommended path.
73
+ */
74
+ export async function downscaleImage(file, maxDim = 2048, quality = 0.85) {
75
+ if (typeof document === 'undefined' ||
76
+ typeof createImageBitmap === 'undefined' ||
77
+ !file.type.startsWith('image/') ||
78
+ file.type === 'image/gif' // don't flatten animations
79
+ ) {
80
+ return file;
81
+ }
82
+ try {
83
+ const bitmap = await createImageBitmap(file);
84
+ const scale = Math.min(1, maxDim / Math.max(bitmap.width, bitmap.height));
85
+ if (scale >= 1) {
86
+ bitmap.close();
87
+ return file;
88
+ }
89
+ const w = Math.round(bitmap.width * scale);
90
+ const h = Math.round(bitmap.height * scale);
91
+ const canvas = document.createElement('canvas');
92
+ canvas.width = w;
93
+ canvas.height = h;
94
+ const cx = canvas.getContext('2d');
95
+ if (!cx)
96
+ return file;
97
+ cx.drawImage(bitmap, 0, 0, w, h);
98
+ bitmap.close();
99
+ const outType = file.type === 'image/png' ? 'image/png' : 'image/jpeg';
100
+ const blob = await new Promise((resolve) => canvas.toBlob(resolve, outType, quality));
101
+ if (!blob)
102
+ return file;
103
+ return new File([blob], file.name, { type: outType });
104
+ }
105
+ catch {
106
+ return file; // any failure → upload the original
107
+ }
108
+ }
109
+ //# sourceMappingURL=uploadBlob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadBlob.js","sourceRoot":"","sources":["../../src/client/uploadBlob.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,12 @@ export interface ChatContextValue {
15
15
  renderContent?: (message: ChatMessage, width: number) => ReactNode;
16
16
  renderMessage?: (message: ChatMessage, defaultRender: () => ReactNode) => ReactNode;
17
17
  getMessageActions?: (message: ChatMessage) => ChatMessageAction[];
18
+ /**
19
+ * When the conversation is rendered over an image background, sender names
20
+ * (which sit directly on the backdrop, not inside a bubble) switch to white
21
+ * with a drop shadow so they stay legible — matching ugly.bot.
22
+ */
23
+ onImageBackground?: boolean;
18
24
  selectedMessageId: string | null;
19
25
  setSelectedMessageId: (id: string | null) => void;
20
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,KAAK,SAAS,CAAC;IACpF,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,iBAAiB,EAAE,CAAC;IAClE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACnD;AAED,eAAO,MAAM,WAAW,kDAA+C,CAAC;AAExE,wBAAgB,cAAc,IAAI,gBAAgB,CAIjD"}
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,KAAK,SAAS,CAAC;IACpF,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,iBAAiB,EAAE,CAAC;IAClE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACnD;AAED,eAAO,MAAM,WAAW,kDAA+C,CAAC;AAExE,wBAAgB,cAAc,IAAI,gBAAgB,CAIjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AA6BlD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAExE,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"ChatContext.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAmClD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAExE,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -12,6 +12,11 @@ export interface ChatMarkdownInputProps {
12
12
  onSend?: (text: string) => void;
13
13
  /** Hide the built-in send button (e.g. when the app supplies its own). */
14
14
  hideSendButton?: boolean;
15
+ /**
16
+ * Allow sending with empty text — e.g. when the app has staged an attachment
17
+ * and the message body is optional. Defaults to false (text required).
18
+ */
19
+ allowEmpty?: boolean;
15
20
  }
16
- export declare function ChatMarkdownInput({ placeholder, disabled, autoFocus, width, leftActions, rightActions, onSend, hideSendButton, }: ChatMarkdownInputProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function ChatMarkdownInput({ placeholder, disabled, autoFocus, width, leftActions, rightActions, onSend, hideSendButton, allowEmpty, }: ChatMarkdownInputProps): import("react/jsx-runtime").JSX.Element;
17
22
  //# sourceMappingURL=ChatMarkdownInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMarkdownInput.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMarkdownInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsD,SAAS,EAAE,MAAM,OAAO,CAAC;AAM3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wEAAwE;IACxE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAwCD,wBAAgB,iBAAiB,CAAC,EAChC,WAAiC,EACjC,QAAgB,EAChB,SAAiB,EACjB,KAAW,EACX,WAAW,EACX,YAAY,EACZ,MAAM,EACN,cAAsB,GACvB,EAAE,sBAAsB,2CA8DxB"}
1
+ {"version":3,"file":"ChatMarkdownInput.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMarkdownInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsD,SAAS,EAAE,MAAM,OAAO,CAAC;AAM3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,wEAAwE;IACxE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAwCD,wBAAgB,iBAAiB,CAAC,EAChC,WAAiC,EACjC,QAAgB,EAChB,SAAiB,EACjB,KAAW,EACX,WAAW,EACX,YAAY,EACZ,MAAM,EACN,cAAsB,EACtB,UAAkB,GACnB,EAAE,sBAAsB,2CA8DxB"}
@@ -31,18 +31,18 @@ const sendButtonStyle = {
31
31
  function SendGlyph() {
32
32
  return (_jsxs("svg", { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("path", { d: "m22 2-7 20-4-9-9-4Z" }), _jsx("path", { d: "M22 2 11 13" })] }));
33
33
  }
34
- export function ChatMarkdownInput({ placeholder = 'Type a message...', disabled = false, autoFocus = false, width = 600, leftActions, rightActions, onSend, hideSendButton = false, }) {
34
+ export function ChatMarkdownInput({ placeholder = 'Type a message...', disabled = false, autoFocus = false, width = 600, leftActions, rightActions, onSend, hideSendButton = false, allowEmpty = false, }) {
35
35
  const ctx = useChatContext();
36
36
  const editorRef = useRef(null);
37
37
  const [value, setValue] = useState('');
38
38
  const handleSend = useCallback(() => {
39
39
  const text = value.trim();
40
- if (!text)
40
+ if (!text && !allowEmpty)
41
41
  return;
42
42
  (onSend ?? ctx.onSend)(text);
43
43
  setValue('');
44
44
  editorRef.current?.setValue('');
45
- }, [value, ctx, onSend]);
45
+ }, [value, ctx, onSend, allowEmpty]);
46
46
  const handleValueChanged = useCallback((newValue) => {
47
47
  setValue(newValue);
48
48
  ctx.onTypingStart?.();
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMarkdownInput.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMarkdownInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatMarkdownInput.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMarkdownInput.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAwGD,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAoD/E"}
1
+ {"version":3,"file":"ChatMessageBubble.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmHD,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAsD/E"}
@@ -6,11 +6,14 @@ const rowStyle = {
6
6
  flexDirection: 'row',
7
7
  alignItems: 'flex-start',
8
8
  gap: 8,
9
- padding: '1px 14px',
9
+ padding: '0 14px',
10
10
  };
11
+ // A new sender block gets a little air above it to separate it from the
12
+ // previous speaker; grouped (same-sender, consecutive) rows stay flush so a
13
+ // burst of messages reads as one dense block, not a spaced-out list.
11
14
  const rowWithHeaderStyle = {
12
15
  ...rowStyle,
13
- paddingTop: 6,
16
+ paddingTop: 4,
14
17
  };
15
18
  const AVATAR_SIZE = 24;
16
19
  // Inline lucide "bot" glyph — the framework has no lucide dependency, and a
@@ -52,6 +55,13 @@ const nameStyle = {
52
55
  fontSize: 13,
53
56
  color: 'var(--app-foreground)',
54
57
  };
58
+ // Over an image background the name sits directly on the backdrop, so switch to
59
+ // white with a shadow for legibility (ugly.bot does the same).
60
+ const nameOnImageStyle = {
61
+ ...nameStyle,
62
+ color: '#fff',
63
+ textShadow: '0 1px 3px rgba(0,0,0,0.7), 0 0 2px rgba(0,0,0,0.5)',
64
+ };
55
65
  const bodyStyle = {
56
66
  fontSize: 14,
57
67
  lineHeight: '1.45',
@@ -86,6 +96,6 @@ export function ChatMessageBubble({ message, isGrouped }) {
86
96
  const content = ctx.renderMessage
87
97
  ? ctx.renderMessage(message, defaultRender)
88
98
  : defaultRender();
89
- return (_jsxs("div", { "data-message-id": message.id, style: isGrouped ? rowStyle : rowWithHeaderStyle, onClick: handleClick, children: [isGrouped ? (_jsx("div", { style: avatarPlaceholderStyle })) : user?.avatarUrl ? (_jsx("img", { src: user.avatarUrl, alt: "", style: { ...avatarStyle, objectFit: 'cover' } })) : (_jsx("div", { style: { ...avatarStyle, backgroundColor: avatarColor(message.userId) }, children: initial })), _jsxs("div", { style: contentColumnStyle, children: [!isGrouped && (_jsxs("div", { style: headerStyle, children: [_jsx("span", { style: nameStyle, children: displayName }), user?.isBot ? _jsx(BotMark, {}) : null] })), content] })] }));
99
+ return (_jsxs("div", { "data-message-id": message.id, style: isGrouped ? rowStyle : rowWithHeaderStyle, onClick: handleClick, children: [isGrouped ? (_jsx("div", { style: avatarPlaceholderStyle })) : user?.avatarUrl ? (_jsx("img", { src: user.avatarUrl, alt: "", style: { ...avatarStyle, objectFit: 'cover' } })) : (_jsx("div", { style: { ...avatarStyle, backgroundColor: avatarColor(message.userId) }, children: initial })), _jsxs("div", { style: contentColumnStyle, children: [!isGrouped && (_jsxs("div", { style: headerStyle, children: [_jsx("span", { style: ctx.onImageBackground ? nameOnImageStyle : nameStyle, children: displayName }), user?.isBot ? _jsx(BotMark, {}) : null] })), content] })] }));
90
100
  }
91
101
  //# sourceMappingURL=ChatMessageBubble.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageBubble.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatMessageBubble.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAOvD,MAAM,QAAQ,GAAkB;IAC9B,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,wEAAwE;AACxE,4EAA4E;AAC5E,qEAAqE;AACrE,MAAM,kBAAkB,GAAkB;IACxC,GAAG,QAAQ;IACX,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,4EAA4E;AAC5E,4EAA4E;AAC5E,4DAA4D;AAC5D,SAAS,OAAO;IACd,OAAO,CACL,eACE,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,CAAC,EACd,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,KAAK,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,gBAC5D,KAAK,aAEhB,eAAM,CAAC,EAAC,WAAW,GAAG,EACtB,eAAM,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAI,EAClD,eAAM,CAAC,EAAC,SAAS,GAAG,EACpB,eAAM,CAAC,EAAC,UAAU,GAAG,EACrB,eAAM,CAAC,EAAC,UAAU,GAAG,EACrB,eAAM,CAAC,EAAC,SAAS,GAAG,IAChB,CACP,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAkB;IACjC,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,WAAW;IACnB,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,sBAAsB,GAAkB;IAC5C,KAAK,EAAE,WAAW;IAClB,UAAU,EAAE,CAAC;CACd,CAAC;AAEF,MAAM,kBAAkB,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,WAAW,GAAkB;IACjC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,YAAY,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,SAAS,GAAkB;IAC/B,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,uBAAuB;CAC/B,CAAC;AAEF,gFAAgF;AAChF,+DAA+D;AAC/D,MAAM,gBAAgB,GAAkB;IACtC,GAAG,SAAS;IACZ,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,oDAAoD;CACjE,CAAC;AAEF,MAAM,SAAS,GAAkB;IAC/B,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,uBAAuB;CAC/B,CAAC;AAEF,MAAM,QAAQ,GAAkC;IAC9C,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE;IACvC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,EAAE;CACtD,CAAC;AAEF,oDAAoD;AACpD,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAClF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAA0B;IAC9E,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEpD,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,GAAG,CAAC,oBAAoB,CACtB,GAAG,CAAC,iBAAiB,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CACzD,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAC1B,cAAK,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,UAAU,EAAE,YACxC,GAAG,CAAC,aAAa;YAChB,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC;YACjC,CAAC,CAAC,KAAC,eAAe,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,GAAI,GAC7C,CACP,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa;QAC/B,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC;QAC3C,CAAC,CAAC,aAAa,EAAE,CAAC;IAEpB,OAAO,CACL,kCACmB,OAAO,CAAC,EAAE,EAC3B,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,EAChD,OAAO,EAAE,WAAW,aAEnB,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,KAAK,EAAE,sBAAsB,GAAI,CACvC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CACpB,cAAK,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAC,EAAE,EAAC,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,GAAI,CACnF,CAAC,CAAC,CAAC,CACF,cAAK,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YACzE,OAAO,GACJ,CACP,EACD,eAAK,KAAK,EAAE,kBAAkB,aAC3B,CAAC,SAAS,IAAI,CACb,eAAK,KAAK,EAAE,WAAW,aACrB,eAAM,KAAK,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,YAC9D,WAAW,GACP,EACN,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAC,OAAO,KAAG,CAAC,CAAC,CAAC,IAAI,IAC7B,CACP,EACA,OAAO,IACJ,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -15,7 +15,9 @@ export interface ChatViewProps {
15
15
  renderContent?: (message: ChatMessage, width: number) => ReactNode;
16
16
  renderMessage?: (message: ChatMessage, defaultRender: () => ReactNode) => ReactNode;
17
17
  getMessageActions?: (message: ChatMessage) => ChatMessageAction[];
18
+ /** Render sender names as white+shadow for legibility over an image backdrop. */
19
+ onImageBackground?: boolean;
18
20
  children?: ReactNode;
19
21
  }
20
- export declare function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact, typingEntries, onTypingStart, getUser, hasMore, onLoadMore, renderContent, renderMessage, getMessageActions, children, }: ChatViewProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact, typingEntries, onTypingStart, getUser, hasMore, onLoadMore, renderContent, renderMessage, getMessageActions, onImageBackground, children, }: ChatViewProps): import("react/jsx-runtime").JSX.Element;
21
23
  //# sourceMappingURL=ChatView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatView.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,QAAQ,EACT,MAAM,oBAAoB,CAAC;AA+E5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,KAAK,SAAS,CAAC;IACpF,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,iBAAiB,EAAE,CAAC;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAID,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,OAAO,EACP,OAAO,EACP,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,QAAQ,GACT,EAAE,aAAa,2CAoIf"}
1
+ {"version":3,"file":"ChatView.d.ts","sourceRoot":"","sources":["../../../src/conversation/client/ChatView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,QAAQ,EACT,MAAM,oBAAoB,CAAC;AA+E5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,KAAK,SAAS,CAAC;IACpF,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,iBAAiB,EAAE,CAAC;IAClE,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAID,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,OAAO,EACP,OAAO,EACP,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,GACT,EAAE,aAAa,2CAsIf"}
@@ -64,7 +64,7 @@ const loadMoreButtonStyle = {
64
64
  padding: '4px 12px',
65
65
  };
66
66
  // ─── Component ──────────────────────────────────────────────────────────────
67
- export function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact, typingEntries, onTypingStart, getUser, hasMore, onLoadMore, renderContent, renderMessage, getMessageActions, children, }) {
67
+ export function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact, typingEntries, onTypingStart, getUser, hasMore, onLoadMore, renderContent, renderMessage, getMessageActions, onImageBackground, children, }) {
68
68
  const scrollRef = useRef(null);
69
69
  const [selectedMessageId, setSelectedMessageId] = useState(null);
70
70
  const [showScrollButton, setShowScrollButton] = useState(false);
@@ -86,6 +86,7 @@ export function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact,
86
86
  renderContent,
87
87
  renderMessage,
88
88
  getMessageActions,
89
+ onImageBackground,
89
90
  selectedMessageId,
90
91
  setSelectedMessageId,
91
92
  }), [
@@ -103,6 +104,7 @@ export function ChatView({ messages, userId, onSend, onDelete, onEdit, onReact,
103
104
  renderContent,
104
105
  renderMessage,
105
106
  getMessageActions,
107
+ onImageBackground,
106
108
  selectedMessageId,
107
109
  ]);
108
110
  // ─── Scroll handling ──────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatView.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AASf,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,+EAA+E;AAE/E,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAEzD,SAAS,mBAAmB,CAAC,EAAU;IACrC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GACX,CAAC,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE;QAC7B,CAAC,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE;QAC/B,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACrC,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACpE,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,oBAAoB,GAAkB;IAC1C,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,SAAS,EAAE,MAAM;CAClB,CAAC;AAEF,MAAM,cAAc,GAAkB;IACpC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,uBAAuB;IAC9B,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,aAAa,GAAkB;IACnC,OAAO,EAAE,MAAM;IACf,cAAc,EAAE,QAAQ;IACxB,OAAO,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,mBAAmB,GAAkB;IACzC,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,oBAAoB;IAC3B,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,UAAU;CACpB,CAAC;AAwBF,+EAA+E;AAE/E,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,OAAO,EACP,OAAO,EACP,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,GACM;IACd,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpD,2EAA2E;IAE3E,MAAM,QAAQ,GAAqB,OAAO,CACxC,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ;QACR,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,OAAO;QACP,aAAa;QACb,aAAa;QACb,OAAO;QACP,OAAO;QACP,UAAU;QACV,aAAa;QACb,aAAa;QACb,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;QACjB,oBAAoB;KACrB,CAAC,EACF;QACE,QAAQ;QACR,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,OAAO;QACP,aAAa;QACb,aAAa;QACb,OAAO;QACP,OAAO;QACP,UAAU;QACV,aAAa;QACb,aAAa;QACb,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;KAClB,CACF,CAAC;IAEF,yEAAyE;IAEzE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;QAC7B,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC;QACjC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,kBAAkB,GAAG,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC;QAC5E,MAAM,QAAQ,GAAG,kBAAkB,GAAG,EAAE,CAAC;QACzC,aAAa,CAAC,OAAO,GAAG,QAAQ,CAAC;QACjC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,8BAA8B;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3E,cAAc,EAAE,CAAC;QACnB,CAAC;QACD,mBAAmB,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChD,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAEtC,iBAAiB;IACjB,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,0EAA0E;IAE1E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;QACxB,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE5C,qBAAqB;YACrB,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,qBAAqB,EAAE,CAAC;gBAC/D,MAAM,CAAC,IAAI,CACT,cAA2B,KAAK,EAAE,cAAc,YAC7C,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IADzB,OAAO,GAAG,CAAC,EAAE,EAAE,CAEnB,CACP,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI;gBACtB,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;gBAC1B,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,qBAAqB,CAAC;YAEtD,MAAM,CAAC,IAAI,CACT,KAAC,iBAAiB,IAAc,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,IAA1C,GAAG,CAAC,EAAE,CAAwC,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,YACnC,eAAK,KAAK,EAAE,UAAU,aACpB,cACE,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,YAAY,iBACV,+BAA+B,YAE3C,8BAAiB,oBAAoB,EAAC,KAAK,EAAE,UAAU,aACpD,OAAO,IAAI,UAAU,IAAI,CACxB,cAAK,KAAK,EAAE,aAAa,YACvB,iBAAQ,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,0BAE9C,GACL,CACP,EACA,IAAI,IACD,GACF,EACN,KAAC,mBAAmB,KAAG,EACvB,KAAC,gBAAgB,IAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAI,EACvE,QAAQ,IACL,GACe,CACxB,CAAC;AACJ,CAAC"}
@@ -629,6 +629,24 @@ export function createWorkersApp(optsOrRegistry, handlersArg, appDefsArg, config
629
629
  avatarUri: avatar?.image?.uri ?? avatar?.uri ?? null,
630
630
  };
631
631
  },
632
+ // Promote a previously-uploaded TEMP blob (from `PUT /_upload`) into the
633
+ // permanent `public/` bucket. Temp objects auto-expire after 7 days, so
634
+ // only blobs the user actually commits to (sends) become durable. The key
635
+ // must live under the caller's own `<userId>/` folder — this both scopes
636
+ // storage per-user and stops a client from promoting/overwriting someone
637
+ // else's staged upload by guessing a key.
638
+ promoteUpload: async (userId, rawInput) => {
639
+ if (!userId)
640
+ throw new Error('Authentication required');
641
+ const { key } = (rawInput ?? {});
642
+ if (!key)
643
+ throw new Error('promoteUpload requires { key }');
644
+ if (!key.startsWith(`${userId}/`) || key.includes('..')) {
645
+ throw new Error('Cannot promote a blob outside your own user folder');
646
+ }
647
+ const url = await getAdapter().storage.moveToPublic(key, key);
648
+ return { url };
649
+ },
632
650
  };
633
651
  // User-supplied builtins win over the framework's defaults; most
634
652
  // apps won't override these.
@@ -743,6 +761,45 @@ export function createWorkersApp(optsOrRegistry, handlersArg, appDefsArg, config
743
761
  c.header('Set-Cookie', buildCookie('', { clear: true }));
744
762
  return c.json({ ok: true });
745
763
  });
764
+ // PUT /_upload?name=<filename> — authenticated binary upload to the TEMP
765
+ // bucket under the caller's user_id folder. R2's binding can't mint presigned
766
+ // URLs without pulling in the AWS SDK, so uploads stream through the Worker.
767
+ //
768
+ // The object lands at `temp/<userId>/<uuid>-<name>` (7-day lifecycle — see
769
+ // cloudflare.ts `setStagingLifecycle`); abandoned uploads auto-expire. Call
770
+ // the `promoteUpload` request to copy it into the permanent `public/<userId>/`
771
+ // bucket once the user commits (e.g. sends the message). Defaulting every blob
772
+ // to a `<userId>/` prefix makes per-user storage accounting + cleanup trivial.
773
+ hono.put('/_upload', async (c) => {
774
+ ensureAdapter(c.env);
775
+ const auth = c.req.header('Authorization') ?? '';
776
+ const token = (auth.startsWith('Bearer ') ? auth.slice(7) : '') ||
777
+ getAuthCookie(c) ||
778
+ '';
779
+ let userId = null;
780
+ if (token) {
781
+ try {
782
+ userId = await ctx.verifyToken(token);
783
+ }
784
+ catch {
785
+ userId = null;
786
+ }
787
+ }
788
+ if (!userId)
789
+ return c.json({ error: 'Authentication required' }, 401);
790
+ const rawName = c.req.query('name') ?? 'file';
791
+ // Keep only safe chars; cap length; never let a name escape the user folder.
792
+ const safeName = rawName.replace(/[^A-Za-z0-9._-]/g, '_').replace(/^\.+/, '').slice(-80) ||
793
+ 'file';
794
+ const contentType = c.req.header('Content-Type') || 'application/octet-stream';
795
+ const body = await c.req.arrayBuffer();
796
+ if (!body || body.byteLength === 0) {
797
+ return c.json({ error: 'Empty body' }, 400);
798
+ }
799
+ const key = `${userId}/${crypto.randomUUID()}-${safeName}`;
800
+ const url = await getAdapter().storage.put('temp', key, body, contentType);
801
+ return c.json({ key, url, size: body.byteLength, contentType });
802
+ });
746
803
  // POST /api/:name — runtime-neutral request dispatch.
747
804
  hono.post('/api/:name', async (c) => {
748
805
  ensureAdapter(c.env);