@jami-studio/core 0.92.30 → 0.92.32

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 (33) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +20 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/production-agent.ts +7360 -7302
  5. package/corpus/core/src/deploy/build.ts +4193 -4127
  6. package/corpus/core/src/file-upload/types.ts +9 -0
  7. package/corpus/templates/analytics/changelog/2026-07-11-tracking-and-session-replay-ingest-endpoints-are-reachable-f.md +6 -0
  8. package/corpus/templates/analytics/package.json +9 -0
  9. package/corpus/templates/clips/actions/create-recording.ts +16 -1
  10. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +60 -14
  11. package/corpus/templates/clips/app/routes/record.tsx +35 -9
  12. package/corpus/templates/clips/changelog/2026-07-11-uploads-now-stream-straight-to-s3-compatible-storage-r2-s3-m.md +6 -0
  13. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +256 -0
  14. package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +9 -3
  15. package/corpus/templates/clips/server/lib/upload-chunk-limits.ts +19 -0
  16. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +15 -4
  17. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +49 -1
  18. package/dist/agent/production-agent.d.ts +15 -1
  19. package/dist/agent/production-agent.d.ts.map +1 -1
  20. package/dist/agent/production-agent.js +61 -15
  21. package/dist/agent/production-agent.js.map +1 -1
  22. package/dist/collab/routes.d.ts +1 -1
  23. package/dist/deploy/build.d.ts +21 -1
  24. package/dist/deploy/build.d.ts.map +1 -1
  25. package/dist/deploy/build.js +736 -676
  26. package/dist/deploy/build.js.map +1 -1
  27. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  28. package/dist/file-upload/types.d.ts +9 -0
  29. package/dist/file-upload/types.d.ts.map +1 -1
  30. package/dist/file-upload/types.js.map +1 -1
  31. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  32. package/dist/resources/handlers.d.ts +2 -2
  33. package/package.json +1 -1
@@ -17,12 +17,12 @@ declare const _default: import("../../action.js").ActionDefinition<{
17
17
  id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
+ error?: undefined;
20
21
  configured?: undefined;
21
22
  connectPath?: undefined;
22
23
  url: string;
23
24
  id: string;
24
25
  provider: string;
25
- error?: undefined;
26
26
  }>;
27
27
  export default _default;
28
28
  //# sourceMappingURL=upload-image.d.ts.map
@@ -62,6 +62,15 @@ export interface FileUploadProvider {
62
62
  * during recording instead of assembling the full blob after stop().
63
63
  */
64
64
  resumable?: {
65
+ /**
66
+ * Provider-preferred chunk size in bytes. Servers surface this to upload
67
+ * clients so each relayed chunk maps to one provider part. S3-compatible
68
+ * multipart uploads require every part except the last to be >= 5 MiB
69
+ * (and R2 additionally requires uniform part sizes), so an S3-backed
70
+ * provider sets 5 MiB here while GCS-style providers can omit it and
71
+ * accept the client default.
72
+ */
73
+ preferredChunkBytes?: number;
65
74
  startSession(filename: string, mimeType: string, maxBytes: number): Promise<ResumableUploadSession>;
66
75
  relayChunk(session: ResumableUploadSession, contentRange: string, bytes: Uint8Array, options?: {
67
76
  mimeType?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/file-upload/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;qFAEqF;AACrF,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf;uEACmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,wDAAwD;IACxD,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9D;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACnC,UAAU,CACR,OAAO,EAAE,sBAAsB,EAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACjC,eAAe,CACb,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE,GACvD,OAAO,CAAC,MAAM,CAAC,CAAC;KACpB,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/file-upload/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;qFAEqF;AACrF,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf;uEACmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,wDAAwD;IACxD,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9D;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV;;;;;;;WAOG;QACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACnC,UAAU,CACR,OAAO,EAAE,sBAAsB,EAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACjC,eAAe,CACb,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE,GACvD,OAAO,CAAC,MAAM,CAAC,CAAC;KACpB,CAAC;CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/file-upload/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG","sourcesContent":["/**\r\n * File upload framework primitive.\r\n *\r\n * Templates call `uploadFile()` to upload a file and get back a URL.\r\n * The framework dispatches to whichever provider is registered (Builder.io\r\n * built-in, or a user-supplied one). If no provider is active, it falls back\r\n * to the SQL resources store — fine for dev, not recommended for production.\r\n */\r\n\r\nexport interface FileUploadInput {\r\n /** File contents. */\r\n data: Uint8Array | Buffer;\r\n /** Original filename, used for extension/display. */\r\n filename?: string;\r\n /** MIME type, e.g. \"image/png\". */\r\n mimeType?: string;\r\n /** Optional owner email for per-user scoping in fallback storage. */\r\n ownerEmail?: string;\r\n /** Builder.io upload hint: return one stable URL while compression finishes asynchronously. */\r\n stableUrl?: boolean;\r\n /** Builder.io upload hint: set false for internal artifacts that should not appear in the asset library. */\r\n recordAsset?: boolean;\r\n}\r\n\r\nexport interface FileUploadResult {\r\n /** Public URL where the file can be fetched. */\r\n url: string;\r\n /** Optional provider-specific id (e.g. resource id, Builder asset id). */\r\n id?: string;\r\n /** The provider that handled the upload. */\r\n provider: string;\r\n}\r\n\r\n/** Opaque session handle returned by {@link FileUploadProvider.resumable.startSession}.\r\n * `sessionId` is provider-specific (GCS Location URI, S3 UploadId, etc.).\r\n * `meta` holds any provider state needed for subsequent relay and complete calls. */\r\nexport interface ResumableUploadSession {\r\n sessionId: string;\r\n meta: Record<string, unknown>;\r\n}\r\n\r\nexport interface ResumableChunkResult {\r\n ok: boolean;\r\n status: number;\r\n /** Providers that need per-chunk state (e.g. S3 ETags) return updated meta\r\n * here; the chunk route merges it back into the stored session. */\r\n updatedMeta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface FileUploadProvider {\r\n /** Unique id, e.g. \"builder\", \"s3\". */\r\n id: string;\r\n /** Human-readable name. */\r\n name: string;\r\n /** Returns true if this provider is configured from synchronous runtime state. */\r\n isConfigured: () => boolean;\r\n /**\r\n * Returns true if this provider is configured for the active request.\r\n * Use for DB-backed user/org/workspace secrets that require request context.\r\n */\r\n isConfiguredForRequest?: () => Promise<boolean>;\r\n /** Upload a file and return a URL. Throw on failure. */\r\n upload: (input: FileUploadInput) => Promise<FileUploadResult>;\r\n /**\r\n * Optional resumable/streaming upload capability.\r\n * When present, create-recording will initialise a session and stream chunks\r\n * during recording instead of assembling the full blob after stop().\r\n */\r\n resumable?: {\r\n startSession(\r\n filename: string,\r\n mimeType: string,\r\n maxBytes: number,\r\n ): Promise<ResumableUploadSession>;\r\n relayChunk(\r\n session: ResumableUploadSession,\r\n contentRange: string,\r\n bytes: Uint8Array,\r\n options?: { mimeType?: string },\r\n ): Promise<ResumableChunkResult>;\r\n completeSession(\r\n session: ResumableUploadSession,\r\n filename: string,\r\n options?: { stableUrl?: boolean; recordAsset?: boolean },\r\n ): Promise<string>;\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/file-upload/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG","sourcesContent":["/**\r\n * File upload framework primitive.\r\n *\r\n * Templates call `uploadFile()` to upload a file and get back a URL.\r\n * The framework dispatches to whichever provider is registered (Builder.io\r\n * built-in, or a user-supplied one). If no provider is active, it falls back\r\n * to the SQL resources store — fine for dev, not recommended for production.\r\n */\r\n\r\nexport interface FileUploadInput {\r\n /** File contents. */\r\n data: Uint8Array | Buffer;\r\n /** Original filename, used for extension/display. */\r\n filename?: string;\r\n /** MIME type, e.g. \"image/png\". */\r\n mimeType?: string;\r\n /** Optional owner email for per-user scoping in fallback storage. */\r\n ownerEmail?: string;\r\n /** Builder.io upload hint: return one stable URL while compression finishes asynchronously. */\r\n stableUrl?: boolean;\r\n /** Builder.io upload hint: set false for internal artifacts that should not appear in the asset library. */\r\n recordAsset?: boolean;\r\n}\r\n\r\nexport interface FileUploadResult {\r\n /** Public URL where the file can be fetched. */\r\n url: string;\r\n /** Optional provider-specific id (e.g. resource id, Builder asset id). */\r\n id?: string;\r\n /** The provider that handled the upload. */\r\n provider: string;\r\n}\r\n\r\n/** Opaque session handle returned by {@link FileUploadProvider.resumable.startSession}.\r\n * `sessionId` is provider-specific (GCS Location URI, S3 UploadId, etc.).\r\n * `meta` holds any provider state needed for subsequent relay and complete calls. */\r\nexport interface ResumableUploadSession {\r\n sessionId: string;\r\n meta: Record<string, unknown>;\r\n}\r\n\r\nexport interface ResumableChunkResult {\r\n ok: boolean;\r\n status: number;\r\n /** Providers that need per-chunk state (e.g. S3 ETags) return updated meta\r\n * here; the chunk route merges it back into the stored session. */\r\n updatedMeta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface FileUploadProvider {\r\n /** Unique id, e.g. \"builder\", \"s3\". */\r\n id: string;\r\n /** Human-readable name. */\r\n name: string;\r\n /** Returns true if this provider is configured from synchronous runtime state. */\r\n isConfigured: () => boolean;\r\n /**\r\n * Returns true if this provider is configured for the active request.\r\n * Use for DB-backed user/org/workspace secrets that require request context.\r\n */\r\n isConfiguredForRequest?: () => Promise<boolean>;\r\n /** Upload a file and return a URL. Throw on failure. */\r\n upload: (input: FileUploadInput) => Promise<FileUploadResult>;\r\n /**\r\n * Optional resumable/streaming upload capability.\r\n * When present, create-recording will initialise a session and stream chunks\r\n * during recording instead of assembling the full blob after stop().\r\n */\r\n resumable?: {\r\n /**\r\n * Provider-preferred chunk size in bytes. Servers surface this to upload\r\n * clients so each relayed chunk maps to one provider part. S3-compatible\r\n * multipart uploads require every part except the last to be >= 5 MiB\r\n * (and R2 additionally requires uniform part sizes), so an S3-backed\r\n * provider sets 5 MiB here while GCS-style providers can omit it and\r\n * accept the client default.\r\n */\r\n preferredChunkBytes?: number;\r\n startSession(\r\n filename: string,\r\n mimeType: string,\r\n maxBytes: number,\r\n ): Promise<ResumableUploadSession>;\r\n relayChunk(\r\n session: ResumableUploadSession,\r\n contentRange: string,\r\n bytes: Uint8Array,\r\n options?: { mimeType?: string },\r\n ): Promise<ResumableChunkResult>;\r\n completeSession(\r\n session: ResumableUploadSession,\r\n filename: string,\r\n options?: { stableUrl?: boolean; recordAsset?: boolean },\r\n ): Promise<string>;\r\n };\r\n}\r\n"]}
@@ -73,6 +73,7 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
73
73
  offset?: unknown;
74
74
  limit?: unknown;
75
75
  }, {
76
+ deleted?: undefined;
76
77
  jobs: {
77
78
  id: string;
78
79
  name: string;
@@ -83,7 +84,6 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
83
84
  updatedAt: string;
84
85
  }[];
85
86
  total: number;
86
- deleted?: undefined;
87
87
  jobId?: undefined;
88
88
  } | {
89
89
  jobs?: undefined;
@@ -91,9 +91,9 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
91
91
  deleted: boolean;
92
92
  jobId: string;
93
93
  } | {
94
+ deleted?: undefined;
94
95
  jobs?: undefined;
95
96
  total?: undefined;
96
- deleted?: undefined;
97
97
  jobId?: undefined;
98
98
  hits: Record<string, unknown>[];
99
99
  offset: number;
@@ -52,8 +52,8 @@ export declare function handleDeleteResource(event: any): Promise<{
52
52
  error: string;
53
53
  ok?: undefined;
54
54
  } | {
55
- ok: boolean;
56
55
  error?: undefined;
56
+ ok: boolean;
57
57
  }>;
58
58
  /** POST /_agent-native/resources/upload — upload a file as a resource */
59
59
  export declare function handleUploadResource(event: any): Promise<import("./store.js").Resource | {
@@ -74,10 +74,10 @@ export declare function handleUploadResource(event: any): Promise<import("./stor
74
74
  runId: string | null;
75
75
  expiresAt: number | null;
76
76
  metadata: string | null;
77
+ error?: undefined;
77
78
  url: string;
78
79
  provider: string;
79
80
  storageSetupRequired?: undefined;
80
- error?: undefined;
81
81
  } | {
82
82
  error: string;
83
83
  storageSetupRequired: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jami-studio/core",
3
- "version": "0.92.30",
3
+ "version": "0.92.32",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/studio-jami/jami-studio#readme",
6
6
  "bugs": {