@roj-ai/shared 0.1.8 → 0.1.10

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.
@@ -51,6 +51,7 @@ type BatchResults<T extends readonly BatchEntry<unknown>[]> = {
51
51
  export declare class RpcClient {
52
52
  private baseUrl;
53
53
  private projectId;
54
+ private authToken;
54
55
  constructor(baseUrl?: string);
55
56
  /**
56
57
  * Get the base URL for non-RPC requests.
@@ -65,11 +66,34 @@ export declare class RpcClient {
65
66
  * Get the currently configured project ID.
66
67
  */
67
68
  getProjectId(): string | null;
69
+ /**
70
+ * Set the bearer token for authenticated RPC calls. Sent as
71
+ * `Authorization: Bearer <token>` so the platform doesn't have to fall
72
+ * back to cookie auth (which requires a separate `/exchange` round-trip
73
+ * and breaks under cross-origin third-party-cookie blocking).
74
+ */
75
+ setAuthToken(token: string | null): void;
76
+ /**
77
+ * Get the currently configured bearer token.
78
+ */
79
+ getAuthToken(): string | null;
68
80
  private getRpcUrl;
81
+ private buildHeaders;
69
82
  /**
70
83
  * Call an RPC method with type-safe input and output.
71
84
  */
72
85
  call<M extends RpcMethodName>(method: M, input: RpcInput<M>): Promise<Result<RpcOutput<M>, RpcErrorInfo>>;
86
+ /**
87
+ * Low-level RPC call that bypasses the typed method registry.
88
+ *
89
+ * Same transport, headers, and auth as `call`, but with `string` method
90
+ * names and `unknown` input/output. Intended for callers that operate
91
+ * against a different method registry than the agent runtime's
92
+ * `RpcMethods` (e.g. platform/instance methods defined in
93
+ * `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
94
+ * directly from app code.
95
+ */
96
+ callUntyped(method: string, input: unknown): Promise<Result<unknown, RpcErrorInfo>>;
73
97
  /**
74
98
  * Execute multiple RPC calls as a batch.
75
99
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,YAAY;gBADnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;CAK3B;AAiBD;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,EAAE;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAGrF;AAED;;GAEG;AACH,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;;GAEG;AACH,qBAAa,SAAS;IAGT,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,SAAS,CAAsB;gBAEnB,OAAO,GAAE,MAAW;IAExC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI5C;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,SAAS;IAQjB;;OAEG;IACG,IAAI,CAAC,CAAC,SAAS,aAAa,EACjC,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAChB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAuB9C;;OAEG;IACG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,EACzD,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;CAuCjD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,YAAY;gBADnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY;CAK3B;AAiBD;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,EAAE;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,YAAY;IACxB,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAGrF;AAED;;GAEG;AACH,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;;GAEG;AACH,qBAAa,SAAS;IAIT,OAAO,CAAC,OAAO;IAH3B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAAsB;gBAEnB,OAAO,GAAE,MAAW;IAExC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI5C;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,IAAI,CAAC,CAAC,SAAS,aAAa,EACjC,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAChB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAI9C;;;;;;;;;OASG;IACG,WAAW,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IA8BzC;;OAEG;IACG,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,EACzD,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;CAuCjD"}
@@ -36,6 +36,7 @@ export class BatchBuilder {
36
36
  export class RpcClient {
37
37
  baseUrl;
38
38
  projectId = null;
39
+ authToken = null;
39
40
  constructor(baseUrl = '') {
40
41
  this.baseUrl = baseUrl;
41
42
  }
@@ -58,6 +59,21 @@ export class RpcClient {
58
59
  getProjectId() {
59
60
  return this.projectId;
60
61
  }
62
+ /**
63
+ * Set the bearer token for authenticated RPC calls. Sent as
64
+ * `Authorization: Bearer <token>` so the platform doesn't have to fall
65
+ * back to cookie auth (which requires a separate `/exchange` round-trip
66
+ * and breaks under cross-origin third-party-cookie blocking).
67
+ */
68
+ setAuthToken(token) {
69
+ this.authToken = token;
70
+ }
71
+ /**
72
+ * Get the currently configured bearer token.
73
+ */
74
+ getAuthToken() {
75
+ return this.authToken;
76
+ }
61
77
  getRpcUrl() {
62
78
  let url = `${this.baseUrl}/rpc`;
63
79
  if (this.projectId) {
@@ -65,20 +81,45 @@ export class RpcClient {
65
81
  }
66
82
  return url;
67
83
  }
84
+ buildHeaders(extra) {
85
+ if (!this.authToken)
86
+ return extra;
87
+ return { ...extra, Authorization: `Bearer ${this.authToken}` };
88
+ }
68
89
  /**
69
90
  * Call an RPC method with type-safe input and output.
70
91
  */
71
92
  async call(method, input) {
93
+ return this.callUntyped(method, input);
94
+ }
95
+ /**
96
+ * Low-level RPC call that bypasses the typed method registry.
97
+ *
98
+ * Same transport, headers, and auth as `call`, but with `string` method
99
+ * names and `unknown` input/output. Intended for callers that operate
100
+ * against a different method registry than the agent runtime's
101
+ * `RpcMethods` (e.g. platform/instance methods defined in
102
+ * `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
103
+ * directly from app code.
104
+ */
105
+ async callUntyped(method, input) {
72
106
  const response = await fetch(this.getRpcUrl(), {
73
107
  method: 'POST',
74
- headers: { 'Content-Type': 'application/json' },
108
+ headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
75
109
  body: JSON.stringify({ method, input }),
76
110
  credentials: 'include',
77
111
  });
78
- const data = (await response.json());
79
- // Transport error (non-200 for invalid JSON, missing method)
112
+ const data = (await response.json().catch(() => ({})));
113
+ // Transport error (non-200 for invalid JSON, missing method, auth failure, …).
114
+ // The instance-auth 401 body uses `{ error: { code, message } }` rather than
115
+ // `{ error: { type, message } }`; normalize it so callers always see a
116
+ // well-formed `RpcErrorInfo`.
80
117
  if (!response.ok) {
81
- return Err(data.error ?? { type: 'transport_error', message: 'Request failed' });
118
+ const raw = data.error;
119
+ if (raw && (raw.type || raw.code) && raw.message) {
120
+ return Err({ type: raw.type ?? raw.code ?? 'transport_error', message: raw.message, details: raw.details });
121
+ }
122
+ return Err({ type: 'transport_error', message: `Request failed (HTTP ${response.status})` });
82
123
  }
83
124
  // Application result
84
125
  if (data.ok) {
@@ -93,7 +134,7 @@ export class RpcClient {
93
134
  const entries = buildCalls(new BatchBuilder());
94
135
  const response = await fetch(this.getRpcUrl(), {
95
136
  method: 'POST',
96
- headers: { 'Content-Type': 'application/json' },
137
+ headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
97
138
  body: JSON.stringify({
98
139
  batch: entries.map(e => ({ method: e.method, input: e.input })),
99
140
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rpc/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roj-ai/shared",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -38,7 +38,7 @@
38
38
  "zod": "^4.1.12"
39
39
  },
40
40
  "devDependencies": {
41
- "@roj-ai/sdk": "^0.1.8",
41
+ "@roj-ai/sdk": "^0.1.10",
42
42
  "typescript": "^5.7.2"
43
43
  },
44
44
  "types": "./dist/index.d.ts"
package/src/rpc/client.ts CHANGED
@@ -79,6 +79,7 @@ type BatchResults<T extends readonly BatchEntry<unknown>[]> = {
79
79
  */
80
80
  export class RpcClient {
81
81
  private projectId: string | null = null
82
+ private authToken: string | null = null
82
83
 
83
84
  constructor(private baseUrl: string = '') {}
84
85
 
@@ -104,6 +105,23 @@ export class RpcClient {
104
105
  return this.projectId
105
106
  }
106
107
 
108
+ /**
109
+ * Set the bearer token for authenticated RPC calls. Sent as
110
+ * `Authorization: Bearer <token>` so the platform doesn't have to fall
111
+ * back to cookie auth (which requires a separate `/exchange` round-trip
112
+ * and breaks under cross-origin third-party-cookie blocking).
113
+ */
114
+ setAuthToken(token: string | null): void {
115
+ this.authToken = token
116
+ }
117
+
118
+ /**
119
+ * Get the currently configured bearer token.
120
+ */
121
+ getAuthToken(): string | null {
122
+ return this.authToken
123
+ }
124
+
107
125
  private getRpcUrl(): string {
108
126
  let url = `${this.baseUrl}/rpc`
109
127
  if (this.projectId) {
@@ -112,6 +130,11 @@ export class RpcClient {
112
130
  return url
113
131
  }
114
132
 
133
+ private buildHeaders(extra: Record<string, string>): Record<string, string> {
134
+ if (!this.authToken) return extra
135
+ return { ...extra, Authorization: `Bearer ${this.authToken}` }
136
+ }
137
+
115
138
  /**
116
139
  * Call an RPC method with type-safe input and output.
117
140
  */
@@ -119,23 +142,47 @@ export class RpcClient {
119
142
  method: M,
120
143
  input: RpcInput<M>,
121
144
  ): Promise<Result<RpcOutput<M>, RpcErrorInfo>> {
145
+ return this.callUntyped(method, input) as Promise<Result<RpcOutput<M>, RpcErrorInfo>>
146
+ }
147
+
148
+ /**
149
+ * Low-level RPC call that bypasses the typed method registry.
150
+ *
151
+ * Same transport, headers, and auth as `call`, but with `string` method
152
+ * names and `unknown` input/output. Intended for callers that operate
153
+ * against a different method registry than the agent runtime's
154
+ * `RpcMethods` (e.g. platform/instance methods defined in
155
+ * `@roj-ai/client/platform`). Build a typed wrapper on top — do not call
156
+ * directly from app code.
157
+ */
158
+ async callUntyped(
159
+ method: string,
160
+ input: unknown,
161
+ ): Promise<Result<unknown, RpcErrorInfo>> {
122
162
  const response = await fetch(this.getRpcUrl(), {
123
163
  method: 'POST',
124
- headers: { 'Content-Type': 'application/json' },
164
+ headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
125
165
  body: JSON.stringify({ method, input }),
126
166
  credentials: 'include',
127
167
  })
128
168
 
129
- const data = (await response.json()) as RpcResponse
169
+ const data = (await response.json().catch(() => ({}))) as RpcResponse
130
170
 
131
- // Transport error (non-200 for invalid JSON, missing method)
171
+ // Transport error (non-200 for invalid JSON, missing method, auth failure, …).
172
+ // The instance-auth 401 body uses `{ error: { code, message } }` rather than
173
+ // `{ error: { type, message } }`; normalize it so callers always see a
174
+ // well-formed `RpcErrorInfo`.
132
175
  if (!response.ok) {
133
- return Err(data.error ?? { type: 'transport_error', message: 'Request failed' })
176
+ const raw = data.error as { type?: string; code?: string; message?: string; details?: unknown } | undefined
177
+ if (raw && (raw.type || raw.code) && raw.message) {
178
+ return Err({ type: raw.type ?? raw.code ?? 'transport_error', message: raw.message, details: raw.details })
179
+ }
180
+ return Err({ type: 'transport_error', message: `Request failed (HTTP ${response.status})` })
134
181
  }
135
182
 
136
183
  // Application result
137
184
  if (data.ok) {
138
- return Ok(data.value as RpcOutput<M>)
185
+ return Ok(data.value)
139
186
  }
140
187
 
141
188
  return Err(data.error ?? { type: 'unknown_error', message: 'Unknown error' })
@@ -151,7 +198,7 @@ export class RpcClient {
151
198
 
152
199
  const response = await fetch(this.getRpcUrl(), {
153
200
  method: 'POST',
154
- headers: { 'Content-Type': 'application/json' },
201
+ headers: this.buildHeaders({ 'Content-Type': 'application/json' }),
155
202
  body: JSON.stringify({
156
203
  batch: entries.map(e => ({ method: e.method, input: e.input })),
157
204
  }),