@roj-ai/client 0.1.13 → 0.1.14

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.
@@ -10,11 +10,21 @@ type BatchResults<T extends readonly BatchEntry<unknown>[]> = {
10
10
  export interface ApiClient {
11
11
  call<M extends RpcMethodName>(method: M, input: RpcInput<M>): Promise<Result<RpcOutput<M>, RpcErrorInfo>>;
12
12
  batch<const T extends readonly BatchEntry<unknown>[]>(buildCalls: (b: BatchBuilder) => T): Promise<Result<BatchResults<T>, RpcErrorInfo>>;
13
+ /** Synchronous upload — server blocks until preprocessing finishes. Kept for backwards compat. */
13
14
  uploadFile(sessionId: string, file: File): Promise<{
14
15
  uploadId: string;
15
16
  status: 'ready' | 'failed';
16
17
  extractedContent?: string;
17
18
  }>;
19
+ /**
20
+ * Async upload — returns as soon as the file lands on disk. Caller listens
21
+ * for `uploads.uploadStatusChanged` notifications (or polls
22
+ * `uploads.listPending`) to learn when preprocessing finishes.
23
+ */
24
+ uploadFileAsync(sessionId: string, file: File): Promise<{
25
+ uploadId: string;
26
+ status: 'processing';
27
+ }>;
18
28
  }
19
29
  /**
20
30
  * Typed RPC client for instance-scoped platform methods (sandbox lifecycle,
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAA;AAExC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC5D,CAAA;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;IACzG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,EACnD,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;IACjD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/H;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,eAAe,EAC5C,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;CAClE;AA6CD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUrD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAW,GAAG,SAAS,CAG/D;AAED,eAAO,MAAM,GAAG,EAAE,SAAmD,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,iBAA6D,CAAA;AAEvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQzD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAA;AAExC,KAAK,YAAY,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC5D,CAAA;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;IACzG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,EACnD,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;IACjD,kGAAkG;IAClG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/H;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,CAAA;CACnG;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,eAAe,EAC5C,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;CAClE;AAwDD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAUrD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAW,GAAG,SAAS,CAG/D;AAED,eAAO,MAAM,GAAG,EAAE,SAAmD,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,iBAA6D,CAAA;AAEvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQzD"}
@@ -9,32 +9,37 @@ function createApiClientFromRpc(getClient) {
9
9
  return {
10
10
  call: (method, input) => getClient().call(method, input),
11
11
  batch: (buildCalls) => getClient().batch(buildCalls),
12
- async uploadFile(sessionId, file) {
13
- const formData = new FormData();
14
- formData.append('file', file);
15
- const client = getClient();
16
- const baseUrl = client.getBaseUrl();
17
- const projectId = client.getProjectId();
18
- const authToken = client.getAuthToken();
19
- let url = `${baseUrl}/sessions/${sessionId}/upload`;
20
- if (projectId) {
21
- url += `?project=${encodeURIComponent(projectId)}`;
22
- }
23
- const headers = authToken ? { Authorization: `Bearer ${authToken}` } : {};
24
- const response = await fetch(url, {
25
- method: 'POST',
26
- body: formData,
27
- headers,
28
- credentials: 'include',
29
- });
30
- if (!response.ok) {
31
- const error = await response.json();
32
- throw new Error(error.error?.message || 'Upload failed');
33
- }
34
- return response.json();
12
+ uploadFile(sessionId, file) {
13
+ return postUpload(getClient(), sessionId, file, 'upload');
14
+ },
15
+ uploadFileAsync(sessionId, file) {
16
+ return postUpload(getClient(), sessionId, file, 'upload-async');
35
17
  },
36
18
  };
37
19
  }
20
+ async function postUpload(client, sessionId, file, pathSuffix) {
21
+ const formData = new FormData();
22
+ formData.append('file', file);
23
+ const baseUrl = client.getBaseUrl();
24
+ const projectId = client.getProjectId();
25
+ const authToken = client.getAuthToken();
26
+ let url = `${baseUrl}/sessions/${sessionId}/${pathSuffix}`;
27
+ if (projectId) {
28
+ url += `?project=${encodeURIComponent(projectId)}`;
29
+ }
30
+ const headers = authToken ? { Authorization: `Bearer ${authToken}` } : {};
31
+ const response = await fetch(url, {
32
+ method: 'POST',
33
+ body: formData,
34
+ headers,
35
+ credentials: 'include',
36
+ });
37
+ if (!response.ok) {
38
+ const error = await response.json();
39
+ throw new Error(error.error?.message || 'Upload failed');
40
+ }
41
+ return response.json();
42
+ }
38
43
  let rpcClient = new RpcClient('');
39
44
  export function configureApiBaseUrl(url) {
40
45
  const projectId = rpcClient.getProjectId();
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roj-ai/client",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -40,7 +40,7 @@
40
40
  "type-check": "tsc --noEmit"
41
41
  },
42
42
  "dependencies": {
43
- "@roj-ai/shared": "^0.1.13"
43
+ "@roj-ai/shared": "^0.1.14"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "5.9.3"
package/src/api/client.ts CHANGED
@@ -15,7 +15,14 @@ export interface ApiClient {
15
15
  batch<const T extends readonly BatchEntry<unknown>[]>(
16
16
  buildCalls: (b: BatchBuilder) => T,
17
17
  ): Promise<Result<BatchResults<T>, RpcErrorInfo>>
18
+ /** Synchronous upload — server blocks until preprocessing finishes. Kept for backwards compat. */
18
19
  uploadFile(sessionId: string, file: File): Promise<{ uploadId: string; status: 'ready' | 'failed'; extractedContent?: string }>
20
+ /**
21
+ * Async upload — returns as soon as the file lands on disk. Caller listens
22
+ * for `uploads.uploadStatusChanged` notifications (or polls
23
+ * `uploads.listPending`) to learn when preprocessing finishes.
24
+ */
25
+ uploadFileAsync(sessionId: string, file: File): Promise<{ uploadId: string; status: 'processing' }>
19
26
  }
20
27
 
21
28
  /**
@@ -45,36 +52,47 @@ function createApiClientFromRpc(getClient: () => RpcClient): ApiClient {
45
52
  return {
46
53
  call: (method, input) => getClient().call(method, input),
47
54
  batch: (buildCalls) => getClient().batch(buildCalls),
48
- async uploadFile(sessionId, file) {
49
- const formData = new FormData()
50
- formData.append('file', file)
51
-
52
- const client = getClient()
53
- const baseUrl = client.getBaseUrl()
54
- const projectId = client.getProjectId()
55
- const authToken = client.getAuthToken()
56
- let url = `${baseUrl}/sessions/${sessionId}/upload`
57
- if (projectId) {
58
- url += `?project=${encodeURIComponent(projectId)}`
59
- }
60
- const headers: Record<string, string> = authToken ? { Authorization: `Bearer ${authToken}` } : {}
61
- const response = await fetch(url, {
62
- method: 'POST',
63
- body: formData,
64
- headers,
65
- credentials: 'include',
66
- })
67
-
68
- if (!response.ok) {
69
- const error = await response.json() as { error?: { message?: string } }
70
- throw new Error(error.error?.message || 'Upload failed')
71
- }
72
-
73
- return response.json()
55
+ uploadFile(sessionId, file) {
56
+ return postUpload(getClient(), sessionId, file, 'upload')
57
+ },
58
+ uploadFileAsync(sessionId, file) {
59
+ return postUpload(getClient(), sessionId, file, 'upload-async')
74
60
  },
75
61
  }
76
62
  }
77
63
 
64
+ async function postUpload<T>(
65
+ client: RpcClient,
66
+ sessionId: string,
67
+ file: File,
68
+ pathSuffix: 'upload' | 'upload-async',
69
+ ): Promise<T> {
70
+ const formData = new FormData()
71
+ formData.append('file', file)
72
+
73
+ const baseUrl = client.getBaseUrl()
74
+ const projectId = client.getProjectId()
75
+ const authToken = client.getAuthToken()
76
+ let url = `${baseUrl}/sessions/${sessionId}/${pathSuffix}`
77
+ if (projectId) {
78
+ url += `?project=${encodeURIComponent(projectId)}`
79
+ }
80
+ const headers: Record<string, string> = authToken ? { Authorization: `Bearer ${authToken}` } : {}
81
+ const response = await fetch(url, {
82
+ method: 'POST',
83
+ body: formData,
84
+ headers,
85
+ credentials: 'include',
86
+ })
87
+
88
+ if (!response.ok) {
89
+ const error = await response.json() as { error?: { message?: string } }
90
+ throw new Error(error.error?.message || 'Upload failed')
91
+ }
92
+
93
+ return response.json()
94
+ }
95
+
78
96
  let rpcClient = new RpcClient('')
79
97
 
80
98
  export function configureApiBaseUrl(url: string): void {