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.
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/uploadBlob.d.ts +83 -0
- package/dist/client/uploadBlob.d.ts.map +1 -0
- package/dist/client/uploadBlob.js +109 -0
- package/dist/client/uploadBlob.js.map +1 -0
- package/dist/conversation/client/ChatContext.d.ts +6 -0
- package/dist/conversation/client/ChatContext.d.ts.map +1 -1
- package/dist/conversation/client/ChatContext.js.map +1 -1
- package/dist/conversation/client/ChatMarkdownInput.d.ts +6 -1
- package/dist/conversation/client/ChatMarkdownInput.d.ts.map +1 -1
- package/dist/conversation/client/ChatMarkdownInput.js +3 -3
- package/dist/conversation/client/ChatMarkdownInput.js.map +1 -1
- package/dist/conversation/client/ChatMessageBubble.d.ts.map +1 -1
- package/dist/conversation/client/ChatMessageBubble.js +13 -3
- package/dist/conversation/client/ChatMessageBubble.js.map +1 -1
- package/dist/conversation/client/ChatView.d.ts +3 -1
- package/dist/conversation/client/ChatView.d.ts.map +1 -1
- package/dist/conversation/client/ChatView.js +3 -1
- package/dist/conversation/client/ChatView.js.map +1 -1
- package/dist/server/adapter/workers/createWorkersApp.js +57 -0
- package/dist/server/adapter/workers/createWorkersApp.js.map +1 -1
- package/dist/three/shared/avatar/AvatarAnimations.d.ts +44 -0
- package/dist/three/shared/avatar/AvatarAnimations.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarAnimations.js +1405 -0
- package/dist/three/shared/avatar/AvatarAnimations.js.map +1 -0
- package/dist/three/shared/avatar/AvatarDanceGroups.d.ts +14 -0
- package/dist/three/shared/avatar/AvatarDanceGroups.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarDanceGroups.js +115 -0
- package/dist/three/shared/avatar/AvatarDanceGroups.js.map +1 -0
- package/dist/three/shared/avatar/AvatarModel.d.ts +481 -0
- package/dist/three/shared/avatar/AvatarModel.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarModel.js +3478 -0
- package/dist/three/shared/avatar/AvatarModel.js.map +1 -0
- package/dist/three/shared/avatar/AvatarParticleSystem.d.ts +75 -0
- package/dist/three/shared/avatar/AvatarParticleSystem.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarParticleSystem.js +351 -0
- package/dist/three/shared/avatar/AvatarParticleSystem.js.map +1 -0
- package/dist/three/shared/avatar/AvatarPostProcessing.d.ts +64 -0
- package/dist/three/shared/avatar/AvatarPostProcessing.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarPostProcessing.js +489 -0
- package/dist/three/shared/avatar/AvatarPostProcessing.js.map +1 -0
- package/dist/three/shared/avatar/AvatarRoom.d.ts +36 -0
- package/dist/three/shared/avatar/AvatarRoom.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarRoom.js +189 -0
- package/dist/three/shared/avatar/AvatarRoom.js.map +1 -0
- package/dist/three/shared/avatar/AvatarScene.d.ts +379 -0
- package/dist/three/shared/avatar/AvatarScene.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarScene.js +1436 -0
- package/dist/three/shared/avatar/AvatarScene.js.map +1 -0
- package/dist/three/shared/avatar/AvatarTypes.d.ts +117 -0
- package/dist/three/shared/avatar/AvatarTypes.d.ts.map +1 -0
- package/dist/three/shared/avatar/AvatarTypes.js +10 -0
- package/dist/three/shared/avatar/AvatarTypes.js.map +1 -0
- package/dist/three/shared/avatar/DynamicCameraController.d.ts +89 -0
- package/dist/three/shared/avatar/DynamicCameraController.d.ts.map +1 -0
- package/dist/three/shared/avatar/DynamicCameraController.js +338 -0
- package/dist/three/shared/avatar/DynamicCameraController.js.map +1 -0
- package/dist/three/shared/avatar/GLTFLoader.d.ts +15 -0
- package/dist/three/shared/avatar/GLTFLoader.d.ts.map +1 -0
- package/dist/three/shared/avatar/GLTFLoader.js +3149 -0
- package/dist/three/shared/avatar/GLTFLoader.js.map +1 -0
- package/dist/three/shared/avatar/HeadlessEnvironment.d.ts +14 -0
- package/dist/three/shared/avatar/HeadlessEnvironment.d.ts.map +1 -0
- package/dist/three/shared/avatar/HeadlessEnvironment.js +14 -0
- package/dist/three/shared/avatar/HeadlessEnvironment.js.map +1 -0
- package/dist/three/shared/avatar/PodcastEasing.d.ts +46 -0
- package/dist/three/shared/avatar/PodcastEasing.d.ts.map +1 -0
- package/dist/three/shared/avatar/PodcastEasing.js +44 -0
- package/dist/three/shared/avatar/PodcastEasing.js.map +1 -0
- package/dist/three/shared/avatar/ServerDRACOLoader.d.ts +7 -0
- package/dist/three/shared/avatar/ServerDRACOLoader.d.ts.map +1 -0
- package/dist/three/shared/avatar/ServerDRACOLoader.js +10 -0
- package/dist/three/shared/avatar/ServerDRACOLoader.js.map +1 -0
- package/dist/three/shared/avatar/Texture.d.ts +3 -0
- package/dist/three/shared/avatar/Texture.d.ts.map +1 -0
- package/dist/three/shared/avatar/Texture.js +31 -0
- package/dist/three/shared/avatar/Texture.js.map +1 -0
- package/dist/three/shared/avatar/_compat.d.ts +4 -0
- package/dist/three/shared/avatar/_compat.d.ts.map +1 -0
- package/dist/three/shared/avatar/_compat.js +2 -0
- package/dist/three/shared/avatar/_compat.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/index.ts +2 -0
- package/src/client/uploadBlob.ts +151 -0
- package/src/conversation/client/ChatContext.ts +6 -0
- package/src/conversation/client/ChatMarkdownInput.tsx +8 -2
- package/src/conversation/client/ChatMessageBubble.tsx +16 -3
- package/src/conversation/client/ChatView.tsx +5 -0
- package/src/server/adapter/workers/createWorkersApp.ts +59 -0
- package/src/three/shared/avatar/AvatarAnimations.ts +1444 -0
- package/src/three/shared/avatar/AvatarDanceGroups.ts +124 -0
- package/src/three/shared/avatar/AvatarModel.ts +4125 -0
- package/src/three/shared/avatar/AvatarParticleSystem.ts +425 -0
- package/src/three/shared/avatar/AvatarPostProcessing.ts +559 -0
- package/src/three/shared/avatar/AvatarRoom.ts +232 -0
- package/src/three/shared/avatar/AvatarScene.ts +1959 -0
- package/src/three/shared/avatar/AvatarTypes.ts +150 -0
- package/src/three/shared/avatar/DynamicCameraController.ts +475 -0
- package/src/three/shared/avatar/GLTFLoader.ts +4453 -0
- package/src/three/shared/avatar/HeadlessEnvironment.ts +28 -0
- package/src/three/shared/avatar/PodcastEasing.ts +50 -0
- package/src/three/shared/avatar/ServerDRACOLoader.ts +9 -0
- package/src/three/shared/avatar/Texture.ts +34 -0
- package/src/three/shared/avatar/_compat.ts +15 -0
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.555";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/dist/client/index.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/client/index.js
CHANGED
|
@@ -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';
|
package/dist/client/index.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
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;
|
|
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: '
|
|
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:
|
|
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":";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,
|
|
1
|
+
{"version":3,"file":"ChatMessageBubble.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatMessageBubble.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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":";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;
|
|
1
|
+
{"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/conversation/client/ChatView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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);
|