@jami-studio/core 0.92.31 → 0.92.33
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/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/deploy/build.ts +4234 -4127
- package/corpus/core/src/file-upload/types.ts +9 -0
- package/corpus/core/src/shared/global-scope.ts +32 -0
- package/corpus/core/src/shared/workspace-app-audience.ts +14 -3
- package/corpus/templates/analytics/changelog/2026-07-11-tracking-and-session-replay-ingest-endpoints-are-reachable-f.md +6 -0
- package/corpus/templates/analytics/package.json +9 -0
- package/corpus/templates/clips/actions/create-recording.ts +16 -1
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +60 -14
- package/corpus/templates/clips/app/routes/record.tsx +35 -9
- package/corpus/templates/clips/changelog/2026-07-11-uploads-now-stream-straight-to-s3-compatible-storage-r2-s3-m.md +6 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +256 -0
- package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +9 -3
- package/corpus/templates/clips/server/lib/upload-chunk-limits.ts +19 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +15 -4
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +49 -1
- package/dist/deploy/build.d.ts +37 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +769 -676
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/types.d.ts +9 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/shared/global-scope.d.ts +4 -0
- package/dist/shared/global-scope.d.ts.map +1 -1
- package/dist/shared/global-scope.js +27 -0
- package/dist/shared/global-scope.js.map +1 -1
- package/dist/shared/workspace-app-audience.d.ts.map +1 -1
- package/dist/shared/workspace-app-audience.js +12 -3
- package/dist/shared/workspace-app-audience.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { enabledFlag } from "./env-flags.js";
|
|
2
|
+
import { requiresConfiguredVideoStorage } from "./video-storage.js";
|
|
2
3
|
|
|
3
4
|
// Streaming resumable uploads are deployment opt-in while the provider/finalize
|
|
4
|
-
// path hardens
|
|
5
|
-
//
|
|
5
|
+
// path hardens — EXCEPT when the deployment cannot buffer chunks in SQL at all
|
|
6
|
+
// (production / remote database), where streaming to the provider is the only
|
|
7
|
+
// viable upload path and gating it behind the opt-in flag guarantees every
|
|
8
|
+
// upload dies with a 409. Set CLIPS_ENABLE_STREAMING_UPLOAD=1 to opt in on
|
|
9
|
+
// SQL-scratch-capable deployments; CLIPS_DISABLE_STREAMING_UPLOAD=1 still
|
|
10
|
+
// forces the buffered fallback everywhere.
|
|
6
11
|
export function isStreamingUploadDisabled(): boolean {
|
|
7
12
|
return enabledFlag(process.env.CLIPS_DISABLE_STREAMING_UPLOAD);
|
|
8
13
|
}
|
|
@@ -12,7 +17,8 @@ export function shouldEnableStreamingUpload(args: {
|
|
|
12
17
|
mimeType?: string | null;
|
|
13
18
|
}): boolean {
|
|
14
19
|
if (isStreamingUploadDisabled()) return false;
|
|
15
|
-
|
|
20
|
+
const optedIn = enabledFlag(process.env.CLIPS_ENABLE_STREAMING_UPLOAD);
|
|
21
|
+
if (!optedIn && !requiresConfiguredVideoStorage()) return false;
|
|
16
22
|
|
|
17
23
|
const mimeType = (args.mimeType ?? "").split(";")[0]?.trim().toLowerCase();
|
|
18
24
|
return !mimeType || mimeType.startsWith("video/");
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-aware per-request chunk upload cap.
|
|
3
|
+
*
|
|
4
|
+
* Netlify functions buffer request bodies with a 6 MB cap, and binary bodies
|
|
5
|
+
* are base64-encoded by the gateway (effective cap ~4.5 MB) — so Netlify
|
|
6
|
+
* deployments must keep chunks at 4 MiB. Every other runtime (local dev,
|
|
7
|
+
* Cloudflare workerd, Vercel) accepts larger bodies, and S3-compatible
|
|
8
|
+
* multipart uploads NEED 5 MiB parts (see s3-upload-provider), so the cap is
|
|
9
|
+
* lifted to 5 MiB + slack there.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const NETLIFY_MAX_CHUNK_BYTES = 4 * 1024 * 1024;
|
|
13
|
+
const DEFAULT_MAX_CHUNK_BYTES = 5 * 1024 * 1024 + 256 * 1024;
|
|
14
|
+
|
|
15
|
+
export function maxChunkUploadBytes(): number {
|
|
16
|
+
return process.env.NETLIFY
|
|
17
|
+
? NETLIFY_MAX_CHUNK_BYTES
|
|
18
|
+
: DEFAULT_MAX_CHUNK_BYTES;
|
|
19
|
+
}
|
|
@@ -57,13 +57,14 @@ import {
|
|
|
57
57
|
shouldRejectVideoUploadWithoutStorage,
|
|
58
58
|
STORAGE_SETUP_REQUIRED_REASON,
|
|
59
59
|
} from "../../../../lib/video-storage.js";
|
|
60
|
+
import { maxChunkUploadBytes } from "../../../../lib/upload-chunk-limits.js";
|
|
60
61
|
|
|
61
62
|
const RECORDING_TOO_LARGE_REASON = `Recording exceeds the ${Math.round(MAX_RECORDING_UPLOAD_BYTES / (1024 * 1024))} MB size limit. Please record a shorter clip.`;
|
|
62
63
|
|
|
63
|
-
// Netlify
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
const MAX_CHUNK_BYTES =
|
|
64
|
+
// Platform-aware: Netlify's buffered-request gateway caps chunks at 4 MiB;
|
|
65
|
+
// other runtimes allow the 5 MiB parts S3-compatible multipart needs. See
|
|
66
|
+
// server/lib/upload-chunk-limits.ts.
|
|
67
|
+
const MAX_CHUNK_BYTES = maxChunkUploadBytes();
|
|
67
68
|
|
|
68
69
|
const ALLOWED_RECORDING_MIME_TYPES = new Set([
|
|
69
70
|
"video/webm",
|
|
@@ -760,6 +761,16 @@ async function handleResumableChunk(
|
|
|
760
761
|
};
|
|
761
762
|
}
|
|
762
763
|
} else {
|
|
764
|
+
// Enforce the recording size ceiling server-side — the provider session
|
|
765
|
+
// was opened with this budget but S3-style multipart uploads do not
|
|
766
|
+
// enforce it themselves.
|
|
767
|
+
if (
|
|
768
|
+
session.bytesUploaded + bytes.byteLength >
|
|
769
|
+
MAX_RECORDING_UPLOAD_BYTES
|
|
770
|
+
) {
|
|
771
|
+
setResponseStatus(event, 413);
|
|
772
|
+
return { ok: false, error: RECORDING_TOO_LARGE_REASON };
|
|
773
|
+
}
|
|
763
774
|
// Forward the data chunk to the provider and advance offsets only after
|
|
764
775
|
// the provider confirms receipt (308 Resume Incomplete for non-final, 2xx for final).
|
|
765
776
|
const start = session.bytesUploaded;
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
writeAppState,
|
|
29
29
|
deleteAppStateByPrefix,
|
|
30
30
|
} from "@agent-native/core/application-state";
|
|
31
|
+
import { getActiveFileUploadProviderForRequest } from "@agent-native/core/file-upload";
|
|
31
32
|
import { runWithRequestContext } from "@agent-native/core/server";
|
|
32
33
|
import { MAX_UPLOAD_BYTES as MAX_RECORDING_UPLOAD_BYTES } from "@shared/upload-limits.js";
|
|
33
34
|
import { and, eq } from "drizzle-orm";
|
|
@@ -44,7 +45,12 @@ import {
|
|
|
44
45
|
getEventOwnerContext,
|
|
45
46
|
ownerEmailMatches,
|
|
46
47
|
} from "../../../../lib/recordings.js";
|
|
47
|
-
import {
|
|
48
|
+
import {
|
|
49
|
+
deleteResumableSession,
|
|
50
|
+
setResumableSession,
|
|
51
|
+
} from "../../../../lib/resumable-session.js";
|
|
52
|
+
import { shouldEnableStreamingUpload } from "../../../../lib/streaming-upload-mode.js";
|
|
53
|
+
import { maxChunkUploadBytes } from "../../../../lib/upload-chunk-limits.js";
|
|
48
54
|
|
|
49
55
|
interface CompressionMeta {
|
|
50
56
|
originalBytes?: number;
|
|
@@ -77,6 +83,7 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
77
83
|
const { userEmail: ownerEmail, orgId } = await getEventOwnerContext(event);
|
|
78
84
|
const body = (await readBody(event).catch(() => null)) as {
|
|
79
85
|
compression?: CompressionMeta | null;
|
|
86
|
+
mimeType?: string;
|
|
80
87
|
} | null;
|
|
81
88
|
|
|
82
89
|
// Sanitize compression metadata. The recorder is the only client we trust
|
|
@@ -117,6 +124,45 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
117
124
|
// accidentally route through handleResumableChunk with stale offsets.
|
|
118
125
|
await deleteResumableSession(recordingId).catch(() => {});
|
|
119
126
|
|
|
127
|
+
// Re-initialize a fresh streaming session for the re-upload when the
|
|
128
|
+
// deployment streams to the provider (production / remote DB, where SQL
|
|
129
|
+
// chunk scratch is unavailable). Without this, the post-compression
|
|
130
|
+
// re-upload would fall into the buffered path and 409.
|
|
131
|
+
let uploadMode: "streaming" | "buffered" = "buffered";
|
|
132
|
+
let uploadChunkBytes: number | undefined;
|
|
133
|
+
const reuploadMimeType =
|
|
134
|
+
compression?.outputMimeType || body?.mimeType || "video/webm";
|
|
135
|
+
const uploadProvider = await getActiveFileUploadProviderForRequest();
|
|
136
|
+
const providerChunkBytes = uploadProvider?.resumable?.preferredChunkBytes;
|
|
137
|
+
if (
|
|
138
|
+
uploadProvider?.resumable &&
|
|
139
|
+
shouldEnableStreamingUpload({ mimeType: reuploadMimeType }) &&
|
|
140
|
+
(!providerChunkBytes || providerChunkBytes <= maxChunkUploadBytes())
|
|
141
|
+
) {
|
|
142
|
+
try {
|
|
143
|
+
const ext = /mp4|quicktime/i.test(reuploadMimeType) ? "mp4" : "webm";
|
|
144
|
+
const session = await uploadProvider.resumable.startSession(
|
|
145
|
+
`${recordingId}.${ext}`,
|
|
146
|
+
reuploadMimeType.split(";")[0]?.trim() || "video/webm",
|
|
147
|
+
MAX_RECORDING_UPLOAD_BYTES,
|
|
148
|
+
);
|
|
149
|
+
await setResumableSession(recordingId, {
|
|
150
|
+
providerId: uploadProvider.id,
|
|
151
|
+
sessionId: session.sessionId,
|
|
152
|
+
meta: { ...session.meta, stableUrl: true, recordAsset: false },
|
|
153
|
+
bytesUploaded: 0,
|
|
154
|
+
lastCommittedIndex: -1,
|
|
155
|
+
});
|
|
156
|
+
uploadMode = "streaming";
|
|
157
|
+
uploadChunkBytes = providerChunkBytes;
|
|
158
|
+
} catch (err) {
|
|
159
|
+
console.warn(
|
|
160
|
+
`[reset-chunks] resumable session re-init failed, falling back to buffered:`,
|
|
161
|
+
err instanceof Error ? err.message : String(err),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
120
166
|
// Reset the per-recording upload progress so the UI poller sees the
|
|
121
167
|
// re-upload restart from 0 and doesn't briefly show "100% then
|
|
122
168
|
// re-running" on the post-compression chunked upload pass.
|
|
@@ -158,6 +204,8 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
158
204
|
recordingId,
|
|
159
205
|
chunksCleared: cleared,
|
|
160
206
|
compressionRecorded: !!compression,
|
|
207
|
+
uploadMode,
|
|
208
|
+
...(uploadChunkBytes ? { uploadChunkBytes } : {}),
|
|
161
209
|
};
|
|
162
210
|
});
|
|
163
211
|
});
|
package/dist/deploy/build.d.ts
CHANGED
|
@@ -47,8 +47,44 @@ export interface GenerateWorkerEntryOptions {
|
|
|
47
47
|
* unified workspace deployments. Must stay dependency-free beyond core's
|
|
48
48
|
* lean `global-scope` subpath so nothing registry-touching evaluates before
|
|
49
49
|
* the scope id is set (ESM evaluates imports depth-first in order).
|
|
50
|
+
*
|
|
51
|
+
* Two kinds of baked env, split deliberately (issue-49 regression lesson):
|
|
52
|
+
*
|
|
53
|
+
* - `envDefaults` — workspace-IDENTICAL keys (the workspace-apps manifest,
|
|
54
|
+
* the workspace flag). These are safe as `process.env` DEFAULTS even
|
|
55
|
+
* though the unified worker shares one `process.env` across all apps,
|
|
56
|
+
* because every app bakes the same value. Runtime bindings still win
|
|
57
|
+
* (defaults only fill absent keys; the per-request bindings copy assigns
|
|
58
|
+
* binding keys on top).
|
|
59
|
+
*
|
|
60
|
+
* - `moduleGraphEnvDefaults` — PER-APP keys (app id, base path, audience,
|
|
61
|
+
* public/protected route lists). These must NEVER touch the shared
|
|
62
|
+
* `process.env`: the first app's scope-init would win and poison every
|
|
63
|
+
* sibling (observed live: all apps stripped paths against dispatch's
|
|
64
|
+
* base path and 401'd framework routes). They are stored per module
|
|
65
|
+
* graph via `setModuleGraphEnvDefaults`, and env readers fall back to
|
|
66
|
+
* `getModuleGraphEnvDefault`.
|
|
67
|
+
*
|
|
68
|
+
* workerd has no filesystem and no ambient build env, so without this the
|
|
69
|
+
* runtime falls back as if the app were standalone — agent discovery
|
|
70
|
+
* targets builtin hosted prod URLs (ask_app "internal error") and per-app
|
|
71
|
+
* route access/audience declarations never apply. The Netlify preset bakes
|
|
72
|
+
* the same keys in its generated function entry (`setBasePathEnv`), where
|
|
73
|
+
* per-function isolation makes plain env safe.
|
|
74
|
+
*/
|
|
75
|
+
export declare function generateScopeInitSource(appScopeId: string, envDefaults?: Record<string, string>, moduleGraphEnvDefaults?: Record<string, string>): string;
|
|
76
|
+
/**
|
|
77
|
+
* Snapshot the workspace-IDENTICAL env keys that must survive into the edge
|
|
78
|
+
* runtime as shared `process.env` defaults. Per-app keys deliberately live
|
|
79
|
+
* in `workspaceAppModuleGraphEnvDefaultsFromBuildEnv` instead — see
|
|
80
|
+
* `generateScopeInitSource`.
|
|
81
|
+
*/
|
|
82
|
+
export declare function workspaceEnvDefaultsFromBuildEnv(env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
83
|
+
/**
|
|
84
|
+
* Snapshot the PER-APP workspace env keys for this app's module graph.
|
|
85
|
+
* Delivered via `setModuleGraphEnvDefaults` (never shared `process.env`).
|
|
50
86
|
*/
|
|
51
|
-
export declare function
|
|
87
|
+
export declare function workspaceAppModuleGraphEnvDefaultsFromBuildEnv(env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
52
88
|
/**
|
|
53
89
|
* Derive the workspace app id from a mounted app base path ("/assets" →
|
|
54
90
|
* "assets"). Returns null for unmounted (root) builds.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAmCH,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAI7B,eAAO,MAAM,6BAA6B,UAiBzC,CAAC;AAEF,eAAO,MAAM,mCAAmC,UAiB/C,CAAC;AACF,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuIjE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,UAUnC,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAoCD,eAAO,MAAM,2CAA2C,EAAE,MAAM,CAC9D,MAAM,EACN,MAAM,CAmSP,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
|