@nimbase/cli 0.1.0 → 0.1.1

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.
@@ -1,100 +1,5 @@
1
- // src/credentials.ts
2
- import { homedir } from "os";
3
- import { join } from "path";
4
- import { z as z2 } from "zod/v4";
5
-
6
- // src/env.ts
7
- import { createEnv } from "@t3-oss/env-core";
8
- import { z } from "zod/v4";
9
- var env = createEnv({
10
- server: {
11
- HOME: z.string().optional(),
12
- NIMBASE_API_URL: z.url().default("https://api.nimbase.ai"),
13
- XDG_CONFIG_HOME: z.string().optional()
14
- },
15
- runtimeEnv: process.env,
16
- emptyStringAsUndefined: true
17
- });
18
-
19
- // src/private-json-file.ts
20
- import { randomUUID } from "crypto";
21
- import {
22
- chmod,
23
- mkdir,
24
- readFile,
25
- rename,
26
- rm,
27
- writeFile
28
- } from "fs/promises";
29
- import { dirname } from "path";
30
- async function readValidatedJsonFile(path, schema, description) {
31
- let contents;
32
- try {
33
- contents = await readFile(path, "utf8");
34
- } catch (error) {
35
- if (isMissingFile(error)) return null;
36
- throw new Error(`Could not read ${description} at ${path}`, {
37
- cause: error
38
- });
39
- }
40
- try {
41
- return schema.parse(JSON.parse(contents));
42
- } catch {
43
- await removePrivateFile(path);
44
- return null;
45
- }
46
- }
47
- async function writePrivateJsonFile(path, value) {
48
- const directory = dirname(path);
49
- const temporaryPath = `${path}.${randomUUID()}.tmp`;
50
- await mkdir(directory, { recursive: true, mode: 448 });
51
- await chmod(directory, 448);
52
- try {
53
- await writeFile(temporaryPath, `${JSON.stringify(value)}
54
- `, {
55
- flag: "wx",
56
- mode: 384
57
- });
58
- await chmod(temporaryPath, 384);
59
- await rename(temporaryPath, path);
60
- } catch (error) {
61
- await rm(temporaryPath, { force: true }).catch(() => void 0);
62
- throw error;
63
- }
64
- }
65
- async function removePrivateFile(path) {
66
- await rm(path, { force: true });
67
- }
68
- function isMissingFile(error) {
69
- return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
70
- }
71
-
72
- // src/credentials.ts
73
- var credentialsSchema = z2.object({ token: z2.string().min(1) });
74
- function credentialsPath(environment = env) {
75
- const configRoot = environment.XDG_CONFIG_HOME ?? join(environment.HOME ?? homedir(), ".config");
76
- return join(configRoot, "nimbase", "credentials.json");
77
- }
78
- async function readToken(path = credentialsPath()) {
79
- const credentials = await readValidatedJsonFile(
80
- path,
81
- credentialsSchema,
82
- "CLI credentials"
83
- );
84
- return credentials?.token ?? null;
85
- }
86
- async function writeToken(token, path = credentialsPath()) {
87
- await writePrivateJsonFile(path, credentialsSchema.parse({ token }));
88
- }
89
- async function clearToken(path = credentialsPath()) {
90
- await removePrivateFile(path);
91
- }
92
-
93
- // src/base-command.ts
94
- import { Command } from "@oclif/core";
95
-
96
1
  // ../../packages/sdk/src/contracts.ts
97
- import { z as z3 } from "zod/v4";
2
+ import { z } from "zod/v4";
98
3
 
99
4
  // ../../packages/knowledge/src/model.ts
100
5
  var toKnowledgeItemId = (value) => value;
@@ -106,36 +11,36 @@ var toSourceId = (value) => value;
106
11
  var toWorkspaceId = (value) => value;
107
12
 
108
13
  // ../../packages/sdk/src/contracts.ts
109
- var userSchema = z3.object({
110
- id: z3.string(),
111
- name: z3.string(),
112
- email: z3.string()
14
+ var userSchema = z.object({
15
+ id: z.string(),
16
+ name: z.string(),
17
+ email: z.string()
113
18
  });
114
- var sessionSchema = z3.object({ user: userSchema });
115
- var workspaceSchema = z3.object({
116
- id: z3.uuid(),
117
- name: z3.string(),
118
- slug: z3.string()
19
+ var sessionSchema = z.object({ user: userSchema });
20
+ var workspaceSchema = z.object({
21
+ id: z.uuid(),
22
+ name: z.string(),
23
+ slug: z.string()
119
24
  }).transform((workspace) => ({
120
25
  ...workspace,
121
26
  id: toWorkspaceId(workspace.id)
122
27
  }));
123
- var workspaceListSchema = z3.object({
124
- workspaces: z3.array(workspaceSchema)
28
+ var workspaceListSchema = z.object({
29
+ workspaces: z.array(workspaceSchema)
125
30
  });
126
- var workspaceCreatedSchema = z3.object({ workspace: workspaceSchema });
127
- var retrievalResponseSchema = z3.object({
128
- kind: z3.literal("success"),
129
- evidence: z3.array(
130
- z3.object({
131
- excerpt: z3.string(),
132
- provenance: z3.object({
133
- workspaceId: z3.uuid(),
134
- knowledgeItemId: z3.uuid(),
135
- sourceId: z3.uuid(),
136
- sourceExternalId: z3.string(),
137
- sourceRevisionKey: z3.string(),
138
- observedAt: z3.iso.datetime()
31
+ var workspaceCreatedSchema = z.object({ workspace: workspaceSchema });
32
+ var retrievalResponseSchema = z.object({
33
+ kind: z.literal("success"),
34
+ evidence: z.array(
35
+ z.object({
36
+ excerpt: z.string(),
37
+ provenance: z.object({
38
+ workspaceId: z.uuid(),
39
+ knowledgeItemId: z.uuid(),
40
+ sourceId: z.uuid(),
41
+ sourceExternalId: z.string(),
42
+ sourceRevisionKey: z.string(),
43
+ observedAt: z.iso.datetime()
139
44
  }).transform((provenance) => ({
140
45
  ...provenance,
141
46
  workspaceId: toWorkspaceId(provenance.workspaceId),
@@ -145,7 +50,7 @@ var retrievalResponseSchema = z3.object({
145
50
  }))
146
51
  })
147
52
  ),
148
- retrievedAt: z3.iso.datetime().transform((value) => new Date(value))
53
+ retrievedAt: z.iso.datetime().transform((value) => new Date(value))
149
54
  });
150
55
 
151
56
  // ../../packages/sdk/src/client.ts
@@ -261,7 +166,100 @@ async function apiError(response, fallback) {
261
166
  return new ApiError(fallback, response.status);
262
167
  }
263
168
 
169
+ // src/credentials.ts
170
+ import { homedir } from "os";
171
+ import { join } from "path";
172
+ import { z as z3 } from "zod/v4";
173
+
174
+ // src/env.ts
175
+ import { createEnv } from "@t3-oss/env-core";
176
+ import { z as z2 } from "zod/v4";
177
+ var env = createEnv({
178
+ server: {
179
+ HOME: z2.string().optional(),
180
+ NIMBASE_API_URL: z2.url().default("https://api.nimbase.ai"),
181
+ XDG_CONFIG_HOME: z2.string().optional()
182
+ },
183
+ runtimeEnv: process.env,
184
+ emptyStringAsUndefined: true
185
+ });
186
+
187
+ // src/private-json-file.ts
188
+ import { randomUUID } from "crypto";
189
+ import {
190
+ chmod,
191
+ mkdir,
192
+ readFile,
193
+ rename,
194
+ rm,
195
+ writeFile
196
+ } from "fs/promises";
197
+ import { dirname } from "path";
198
+ async function readValidatedJsonFile(path, schema, description) {
199
+ let contents;
200
+ try {
201
+ contents = await readFile(path, "utf8");
202
+ } catch (error) {
203
+ if (isMissingFile(error)) return null;
204
+ throw new Error(`Could not read ${description} at ${path}`, {
205
+ cause: error
206
+ });
207
+ }
208
+ try {
209
+ return schema.parse(JSON.parse(contents));
210
+ } catch {
211
+ await removePrivateFile(path);
212
+ return null;
213
+ }
214
+ }
215
+ async function writePrivateJsonFile(path, value) {
216
+ const directory = dirname(path);
217
+ const temporaryPath = `${path}.${randomUUID()}.tmp`;
218
+ await mkdir(directory, { recursive: true, mode: 448 });
219
+ await chmod(directory, 448);
220
+ try {
221
+ await writeFile(temporaryPath, `${JSON.stringify(value)}
222
+ `, {
223
+ flag: "wx",
224
+ mode: 384
225
+ });
226
+ await chmod(temporaryPath, 384);
227
+ await rename(temporaryPath, path);
228
+ } catch (error) {
229
+ await rm(temporaryPath, { force: true }).catch(() => void 0);
230
+ throw error;
231
+ }
232
+ }
233
+ async function removePrivateFile(path) {
234
+ await rm(path, { force: true });
235
+ }
236
+ function isMissingFile(error) {
237
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
238
+ }
239
+
240
+ // src/credentials.ts
241
+ var credentialsSchema = z3.object({ token: z3.string().min(1) });
242
+ function credentialsPath(environment = env) {
243
+ const configRoot = environment.XDG_CONFIG_HOME ?? join(environment.HOME ?? homedir(), ".config");
244
+ return join(configRoot, "nimbase", "credentials.json");
245
+ }
246
+ async function readToken(path = credentialsPath()) {
247
+ const credentials = await readValidatedJsonFile(
248
+ path,
249
+ credentialsSchema,
250
+ "CLI credentials"
251
+ );
252
+ return credentials?.token ?? null;
253
+ }
254
+ async function writeToken(token, path = credentialsPath()) {
255
+ await writePrivateJsonFile(path, credentialsSchema.parse({ token }));
256
+ }
257
+ async function clearToken(path = credentialsPath()) {
258
+ await removePrivateFile(path);
259
+ }
260
+
264
261
  // src/base-command.ts
262
+ import { Command } from "@oclif/core";
265
263
  var NimbaseCommand = class extends Command {
266
264
  api = new NimbaseApi(env.NIMBASE_API_URL);
267
265
  async requireToken() {
@@ -281,6 +279,7 @@ var NimbaseCommand = class extends Command {
281
279
  };
282
280
 
283
281
  export {
282
+ ApiError,
284
283
  readValidatedJsonFile,
285
284
  writePrivateJsonFile,
286
285
  removePrivateFile,
@@ -290,4 +289,4 @@ export {
290
289
  clearToken,
291
290
  NimbaseCommand
292
291
  };
293
- //# sourceMappingURL=chunk-YQIGSGD4.js.map
292
+ //# sourceMappingURL=chunk-47FIFCKS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/sdk/src/contracts.ts","../../../packages/knowledge/src/model.ts","../../../packages/sources/src/model.ts","../../../packages/tenancy/src/index.ts","../../../packages/sdk/src/client.ts","../src/credentials.ts","../src/env.ts","../src/private-json-file.ts","../src/base-command.ts"],"sourcesContent":["import { z } from \"zod/v4\";\n\nimport { toKnowledgeItemId } from \"@nimbase/knowledge\";\nimport { toSourceId } from \"@nimbase/sources\";\nimport { toWorkspaceId } from \"@nimbase/tenancy\";\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string(),\n});\n\nexport const sessionSchema = z.object({ user: userSchema });\n\nexport const workspaceSchema = z\n .object({\n id: z.uuid(),\n name: z.string(),\n slug: z.string(),\n })\n .transform((workspace) => ({\n ...workspace,\n id: toWorkspaceId(workspace.id),\n }));\n\nexport const workspaceListSchema = z.object({\n workspaces: z.array(workspaceSchema),\n});\n\nexport const workspaceCreatedSchema = z.object({ workspace: workspaceSchema });\n\nexport const retrievalResponseSchema = z.object({\n kind: z.literal(\"success\"),\n evidence: z.array(\n z.object({\n excerpt: z.string(),\n provenance: z\n .object({\n workspaceId: z.uuid(),\n knowledgeItemId: z.uuid(),\n sourceId: z.uuid(),\n sourceExternalId: z.string(),\n sourceRevisionKey: z.string(),\n observedAt: z.iso.datetime(),\n })\n .transform((provenance) => ({\n ...provenance,\n workspaceId: toWorkspaceId(provenance.workspaceId),\n knowledgeItemId: toKnowledgeItemId(provenance.knowledgeItemId),\n sourceId: toSourceId(provenance.sourceId),\n observedAt: new Date(provenance.observedAt),\n })),\n }),\n ),\n retrievedAt: z.iso.datetime().transform((value) => new Date(value)),\n});\n\nexport type User = z.infer<typeof userSchema>;\nexport type Workspace = z.infer<typeof workspaceSchema>;\nexport type RetrievalResult = z.infer<typeof retrievalResponseSchema>;\n","import type { SourceId } from \"@nimbase/sources\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\ndeclare const knowledgeItemIdBrand: unique symbol;\n\nexport type KnowledgeItemId = string & {\n readonly [knowledgeItemIdBrand]: \"KnowledgeItemId\";\n};\n\nexport const toKnowledgeItemId = (value: string) => value as KnowledgeItemId;\n\nexport type JsonValue =\n | boolean\n | number\n | string\n | null\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nexport type KnowledgeMetadata = Readonly<Record<string, JsonValue>>;\n\nexport interface KnowledgeContent {\n mediaType: string;\n text: string;\n}\n\nexport interface KnowledgeProvenance {\n sourceId: SourceId;\n externalId: string;\n revisionKey: string;\n observedAt: Date;\n}\n\nexport interface KnowledgeItem {\n id: KnowledgeItemId;\n workspaceId: WorkspaceId;\n type: string;\n content: KnowledgeContent;\n provenance: KnowledgeProvenance;\n metadata: KnowledgeMetadata;\n createdAt: Date;\n updatedAt: Date;\n}\n","import type { ActorId } from \"@nimbase/access\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\nimport type { ConnectorConnectionId } from \"./connector\";\n\ndeclare const sourceIdBrand: unique symbol;\n\nexport type SourceId = string & {\n readonly [sourceIdBrand]: \"SourceId\";\n};\n\nexport const toSourceId = (value: string) => value as SourceId;\n\nexport interface Source {\n id: SourceId;\n workspaceId: WorkspaceId;\n connectionId?: ConnectorConnectionId;\n createdByActorId: ActorId;\n provider: string;\n externalId: string;\n name: string;\n createdAt: Date;\n updatedAt: Date;\n}\n","declare const workspaceIdBrand: unique symbol;\n\nexport type WorkspaceId = string & {\n readonly [workspaceIdBrand]: \"WorkspaceId\";\n};\n\nexport const toWorkspaceId = (value: string) => value as WorkspaceId;\n\nexport interface Workspace {\n id: WorkspaceId;\n slug: string;\n name: string;\n}\n","import type { RetrievalResult, User, Workspace } from \"./contracts\";\nimport {\n retrievalResponseSchema,\n sessionSchema,\n workspaceCreatedSchema,\n workspaceListSchema,\n} from \"./contracts\";\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NimbaseApi {\n private readonly origin: string;\n\n constructor(\n private readonly baseUrl: string,\n private readonly request: typeof fetch = fetch,\n private readonly createRequestId: () => string = () => crypto.randomUUID(),\n ) {\n this.origin = new URL(baseUrl).origin;\n }\n\n async signIn(email: string, password: string): Promise<string> {\n const response = await this.request(this.url(\"/api/auth/sign-in/email\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ email, password }),\n });\n if (!response.ok) throw await apiError(response, \"Sign-in failed.\");\n\n const token = response.headers.get(\"set-auth-token\");\n if (!token) {\n throw new Error(\"The server did not issue a CLI session token.\");\n }\n return token;\n }\n\n async getUser(token: string): Promise<User> {\n const response = await this.request(this.url(\"/api/auth/get-session\"), {\n headers: authorization(token),\n });\n if (!response.ok) throw await apiError(response, \"Session expired.\");\n const session = sessionSchema.safeParse(await response.json());\n if (!session.success) throw new ApiError(\"Session expired.\", 401);\n return session.data.user;\n }\n\n async signOut(token: string): Promise<void> {\n const response = await this.request(this.url(\"/api/auth/sign-out\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: \"{}\",\n });\n if (!response.ok) throw await apiError(response, \"Sign-out failed.\");\n }\n\n async listWorkspaces(token: string): Promise<Workspace[]> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n headers: authorization(token),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not load workspaces.\");\n }\n return workspaceListSchema.parse(await response.json()).workspaces;\n }\n\n async createWorkspace(token: string, name: string): Promise<Workspace> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ requestId: this.createRequestId(), name }),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not create the workspace.\");\n }\n return workspaceCreatedSchema.parse(await response.json()).workspace;\n }\n\n async retrieve(\n token: string,\n workspaceId: string,\n query: string,\n limit = 10,\n ): Promise<RetrievalResult> {\n const response = await this.request(\n this.url(`/api/workspaces/${encodeURIComponent(workspaceId)}/retrieval`),\n {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ query, limit }),\n },\n );\n if (!response.ok) {\n throw await apiError(response, \"Could not retrieve workspace memory.\");\n }\n return retrievalResponseSchema.parse(await response.json());\n }\n\n private url(path: string): URL {\n return new URL(path, this.baseUrl);\n }\n}\n\nfunction authorization(token: string): Record<string, string> {\n return { Authorization: `Bearer ${token}` };\n}\n\nasync function apiError(\n response: Response,\n fallback: string,\n): Promise<ApiError> {\n const value: unknown = await response.json().catch(() => null);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"message\" in value &&\n typeof value.message === \"string\"\n ) {\n return new ApiError(value.message, response.status);\n }\n return new ApiError(fallback, response.status);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod/v4\";\n\nimport { env } from \"./env.js\";\nimport {\n readValidatedJsonFile,\n removePrivateFile,\n writePrivateJsonFile,\n} from \"./private-json-file.js\";\n\nconst credentialsSchema = z.object({ token: z.string().min(1) });\n\ninterface ConfigEnvironment {\n HOME?: string;\n XDG_CONFIG_HOME?: string;\n}\n\nexport function credentialsPath(environment: ConfigEnvironment = env) {\n const configRoot =\n environment.XDG_CONFIG_HOME ??\n join(environment.HOME ?? homedir(), \".config\");\n return join(configRoot, \"nimbase\", \"credentials.json\");\n}\n\nexport async function readToken(\n path = credentialsPath(),\n): Promise<string | null> {\n const credentials = await readValidatedJsonFile(\n path,\n credentialsSchema,\n \"CLI credentials\",\n );\n return credentials?.token ?? null;\n}\n\nexport async function writeToken(\n token: string,\n path = credentialsPath(),\n): Promise<void> {\n await writePrivateJsonFile(path, credentialsSchema.parse({ token }));\n}\n\nexport async function clearToken(path = credentialsPath()): Promise<void> {\n await removePrivateFile(path);\n}\n","import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod/v4\";\n\nexport const env = createEnv({\n server: {\n HOME: z.string().optional(),\n NIMBASE_API_URL: z.url().default(\"https://api.nimbase.ai\"),\n XDG_CONFIG_HOME: z.string().optional(),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n});\n","import { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ZodType } from \"zod/v4\";\n\nexport async function readValidatedJsonFile<T>(\n path: string,\n schema: ZodType<T>,\n description: string,\n): Promise<T | null> {\n let contents: string;\n try {\n contents = await readFile(path, \"utf8\");\n } catch (error) {\n if (isMissingFile(error)) return null;\n throw new Error(`Could not read ${description} at ${path}`, {\n cause: error,\n });\n }\n\n try {\n return schema.parse(JSON.parse(contents));\n } catch {\n await removePrivateFile(path);\n return null;\n }\n}\n\nexport async function writePrivateJsonFile(\n path: string,\n value: unknown,\n): Promise<void> {\n const directory = dirname(path);\n const temporaryPath = `${path}.${randomUUID()}.tmp`;\n await mkdir(directory, { recursive: true, mode: 0o700 });\n await chmod(directory, 0o700);\n try {\n await writeFile(temporaryPath, `${JSON.stringify(value)}\\n`, {\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, path);\n } catch (error) {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function removePrivateFile(path: string): Promise<void> {\n await rm(path, { force: true });\n}\n\nfunction isMissingFile(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n","import { Command } from \"@oclif/core\";\n\nimport { ApiError, NimbaseApi } from \"@nimbase/sdk\";\n\nimport { clearToken, readToken } from \"./credentials.js\";\nimport { env } from \"./env.js\";\n\nexport abstract class NimbaseCommand extends Command {\n protected readonly api = new NimbaseApi(env.NIMBASE_API_URL);\n\n protected async requireToken(): Promise<string> {\n const token = await readToken();\n if (!token) this.error(\"You are not signed in. Run `nimbase auth login`.\");\n return token;\n }\n\n protected async handleError(error: unknown): Promise<never> {\n if (error instanceof ApiError && error.status === 401) {\n await clearToken();\n this.error(\"Your session has expired. Run `nimbase auth login` again.\");\n }\n this.error(\n error instanceof Error ? error.message : \"Something went wrong.\",\n );\n }\n}\n"],"mappings":"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","names":["z","z","z"]}
@@ -3,7 +3,7 @@ import {
3
3
  readValidatedJsonFile,
4
4
  removePrivateFile,
5
5
  writePrivateJsonFile
6
- } from "./chunk-YQIGSGD4.js";
6
+ } from "./chunk-47FIFCKS.js";
7
7
 
8
8
  // src/preferences.ts
9
9
  import { dirname, join } from "path";
@@ -32,4 +32,4 @@ export {
32
32
  writeWorkspaceId,
33
33
  clearWorkspaceId
34
34
  };
35
- //# sourceMappingURL=chunk-Z6XCOT3K.js.map
35
+ //# sourceMappingURL=chunk-O5PHWVZD.js.map
@@ -1,10 +1,14 @@
1
1
  import {
2
+ ApiError,
2
3
  NimbaseCommand,
3
4
  writeToken
4
- } from "../../chunk-YQIGSGD4.js";
5
+ } from "../../chunk-47FIFCKS.js";
5
6
 
6
7
  // src/commands/auth/login.ts
7
- import { password as passwordPrompt } from "@inquirer/prompts";
8
+ import {
9
+ input as inputPrompt,
10
+ password as passwordPrompt
11
+ } from "@inquirer/prompts";
8
12
  import { Flags } from "@oclif/core";
9
13
  var Login = class _Login extends NimbaseCommand {
10
14
  static description = "Sign in to Nimbase";
@@ -14,8 +18,7 @@ var Login = class _Login extends NimbaseCommand {
14
18
  static flags = {
15
19
  email: Flags.string({
16
20
  char: "e",
17
- description: "account email",
18
- required: true
21
+ description: "account email"
19
22
  }),
20
23
  password: Flags.string({
21
24
  description: "account password (prefer the prompt)"
@@ -23,15 +26,24 @@ var Login = class _Login extends NimbaseCommand {
23
26
  };
24
27
  async run() {
25
28
  const { flags } = await this.parse(_Login);
29
+ const email = flags.email?.trim() ?? await inputPrompt({
30
+ message: "Email",
31
+ validate: (value) => value.trim().length > 0 || "Enter your email."
32
+ });
26
33
  const password = flags.password ?? await passwordPrompt({ message: "Password", mask: "*" });
27
34
  let token = null;
28
35
  try {
29
- token = await this.api.signIn(flags.email.trim(), password);
36
+ token = await this.api.signIn(email.trim(), password);
30
37
  const user = await this.api.getUser(token);
31
38
  await writeToken(token);
32
39
  this.log(`Signed in as ${user.email}.`);
33
40
  } catch (error) {
34
41
  if (token) await this.api.signOut(token).catch(() => void 0);
42
+ if (error instanceof ApiError && error.status === 401) {
43
+ this.error(
44
+ "Invalid email or password. Create an account at https://app.nimbase.ai first."
45
+ );
46
+ }
35
47
  await this.handleError(error);
36
48
  }
37
49
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/auth/login.ts"],"sourcesContent":["import { password as passwordPrompt } from \"@inquirer/prompts\";\nimport { Flags } from \"@oclif/core\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { writeToken } from \"../../credentials.js\";\n\nexport default class Login extends NimbaseCommand {\n static description = \"Sign in to Nimbase\";\n static examples = [\n \"<%= config.bin %> <%= command.id %> --email you@example.com\",\n ];\n static flags = {\n email: Flags.string({\n char: \"e\",\n description: \"account email\",\n required: true,\n }),\n password: Flags.string({\n description: \"account password (prefer the prompt)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Login);\n const password =\n flags.password ??\n (await passwordPrompt({ message: \"Password\", mask: \"*\" }));\n let token: string | null = null;\n try {\n token = await this.api.signIn(flags.email.trim(), password);\n const user = await this.api.getUser(token);\n await writeToken(token);\n this.log(`Signed in as ${user.email}.`);\n } catch (error) {\n if (token) await this.api.signOut(token).catch(() => undefined);\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY,sBAAsB;AAC3C,SAAS,aAAa;AAKtB,IAAqB,QAArB,MAAqB,eAAc,eAAe;AAAA,EAChD,OAAO,cAAc;AAAA,EACrB,OAAO,WAAW;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO,QAAQ;AAAA,IACb,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,UAAU,MAAM,OAAO;AAAA,MACrB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AACxC,UAAM,WACJ,MAAM,YACL,MAAM,eAAe,EAAE,SAAS,YAAY,MAAM,IAAI,CAAC;AAC1D,QAAI,QAAuB;AAC3B,QAAI;AACF,cAAQ,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,KAAK,GAAG,QAAQ;AAC1D,YAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,KAAK;AACzC,YAAM,WAAW,KAAK;AACtB,WAAK,IAAI,gBAAgB,KAAK,KAAK,GAAG;AAAA,IACxC,SAAS,OAAO;AACd,UAAI,MAAO,OAAM,KAAK,IAAI,QAAQ,KAAK,EAAE,MAAM,MAAM,MAAS;AAC9D,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/commands/auth/login.ts"],"sourcesContent":["import {\n input as inputPrompt,\n password as passwordPrompt,\n} from \"@inquirer/prompts\";\nimport { Flags } from \"@oclif/core\";\n\nimport { ApiError } from \"@nimbase/sdk\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { writeToken } from \"../../credentials.js\";\n\nexport default class Login extends NimbaseCommand {\n static description = \"Sign in to Nimbase\";\n static examples = [\n \"<%= config.bin %> <%= command.id %> --email you@example.com\",\n ];\n static flags = {\n email: Flags.string({\n char: \"e\",\n description: \"account email\",\n }),\n password: Flags.string({\n description: \"account password (prefer the prompt)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Login);\n const email =\n flags.email?.trim() ??\n (await inputPrompt({\n message: \"Email\",\n validate: (value) => value.trim().length > 0 || \"Enter your email.\",\n }));\n const password =\n flags.password ??\n (await passwordPrompt({ message: \"Password\", mask: \"*\" }));\n let token: string | null = null;\n try {\n token = await this.api.signIn(email.trim(), password);\n const user = await this.api.getUser(token);\n await writeToken(token);\n this.log(`Signed in as ${user.email}.`);\n } catch (error) {\n if (token) await this.api.signOut(token).catch(() => undefined);\n if (error instanceof ApiError && error.status === 401) {\n this.error(\n \"Invalid email or password. Create an account at https://app.nimbase.ai first.\",\n );\n }\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;;AAAA;AAAA,EACE,SAAS;AAAA,EACT,YAAY;AAAA,OACP;AACP,SAAS,aAAa;AAOtB,IAAqB,QAArB,MAAqB,eAAc,eAAe;AAAA,EAChD,OAAO,cAAc;AAAA,EACrB,OAAO,WAAW;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO,QAAQ;AAAA,IACb,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,UAAU,MAAM,OAAO;AAAA,MACrB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AACxC,UAAM,QACJ,MAAM,OAAO,KAAK,KACjB,MAAM,YAAY;AAAA,MACjB,SAAS;AAAA,MACT,UAAU,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,KAAK;AAAA,IAClD,CAAC;AACH,UAAM,WACJ,MAAM,YACL,MAAM,eAAe,EAAE,SAAS,YAAY,MAAM,IAAI,CAAC;AAC1D,QAAI,QAAuB;AAC3B,QAAI;AACF,cAAQ,MAAM,KAAK,IAAI,OAAO,MAAM,KAAK,GAAG,QAAQ;AACpD,YAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,KAAK;AACzC,YAAM,WAAW,KAAK;AACtB,WAAK,IAAI,gBAAgB,KAAK,KAAK,GAAG;AAAA,IACxC,SAAS,OAAO;AACd,UAAI,MAAO,OAAM,KAAK,IAAI,QAAQ,KAAK,EAAE,MAAM,MAAM,MAAS;AAC9D,UAAI,iBAAiB,YAAY,MAAM,WAAW,KAAK;AACrD,aAAK;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  clearWorkspaceId
3
- } from "../../chunk-Z6XCOT3K.js";
3
+ } from "../../chunk-O5PHWVZD.js";
4
4
  import {
5
5
  NimbaseCommand,
6
6
  clearToken,
7
7
  readToken
8
- } from "../../chunk-YQIGSGD4.js";
8
+ } from "../../chunk-47FIFCKS.js";
9
9
 
10
10
  // src/commands/auth/logout.ts
11
11
  var Logout = class _Logout extends NimbaseCommand {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NimbaseCommand
3
- } from "../../chunk-YQIGSGD4.js";
3
+ } from "../../chunk-47FIFCKS.js";
4
4
 
5
5
  // src/commands/auth/status.ts
6
6
  var Status = class _Status extends NimbaseCommand {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  writeWorkspaceId
3
- } from "../../chunk-Z6XCOT3K.js";
3
+ } from "../../chunk-O5PHWVZD.js";
4
4
  import {
5
5
  NimbaseCommand
6
- } from "../../chunk-YQIGSGD4.js";
6
+ } from "../../chunk-47FIFCKS.js";
7
7
 
8
8
  // src/commands/workspace/create.ts
9
9
  import { Args, Flags } from "@oclif/core";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  readWorkspaceId
3
- } from "../../chunk-Z6XCOT3K.js";
3
+ } from "../../chunk-O5PHWVZD.js";
4
4
  import {
5
5
  NimbaseCommand
6
- } from "../../chunk-YQIGSGD4.js";
6
+ } from "../../chunk-47FIFCKS.js";
7
7
 
8
8
  // src/commands/workspace/current.ts
9
9
  var Current = class _Current extends NimbaseCommand {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  readWorkspaceId
3
- } from "../../chunk-Z6XCOT3K.js";
3
+ } from "../../chunk-O5PHWVZD.js";
4
4
  import {
5
5
  NimbaseCommand
6
- } from "../../chunk-YQIGSGD4.js";
6
+ } from "../../chunk-47FIFCKS.js";
7
7
 
8
8
  // src/commands/workspace/list.ts
9
9
  import { Flags } from "@oclif/core";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  writeWorkspaceId
3
- } from "../../chunk-Z6XCOT3K.js";
3
+ } from "../../chunk-O5PHWVZD.js";
4
4
  import {
5
5
  NimbaseCommand
6
- } from "../../chunk-YQIGSGD4.js";
6
+ } from "../../chunk-47FIFCKS.js";
7
7
 
8
8
  // src/commands/workspace/select.ts
9
9
  import { Args } from "@oclif/core";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nimbase/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Command-line client for Nimbase company memory",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/credentials.ts","../src/env.ts","../src/private-json-file.ts","../src/base-command.ts","../../../packages/sdk/src/contracts.ts","../../../packages/knowledge/src/model.ts","../../../packages/sources/src/model.ts","../../../packages/tenancy/src/index.ts","../../../packages/sdk/src/client.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod/v4\";\n\nimport { env } from \"./env.js\";\nimport {\n readValidatedJsonFile,\n removePrivateFile,\n writePrivateJsonFile,\n} from \"./private-json-file.js\";\n\nconst credentialsSchema = z.object({ token: z.string().min(1) });\n\ninterface ConfigEnvironment {\n HOME?: string;\n XDG_CONFIG_HOME?: string;\n}\n\nexport function credentialsPath(environment: ConfigEnvironment = env) {\n const configRoot =\n environment.XDG_CONFIG_HOME ??\n join(environment.HOME ?? homedir(), \".config\");\n return join(configRoot, \"nimbase\", \"credentials.json\");\n}\n\nexport async function readToken(\n path = credentialsPath(),\n): Promise<string | null> {\n const credentials = await readValidatedJsonFile(\n path,\n credentialsSchema,\n \"CLI credentials\",\n );\n return credentials?.token ?? null;\n}\n\nexport async function writeToken(\n token: string,\n path = credentialsPath(),\n): Promise<void> {\n await writePrivateJsonFile(path, credentialsSchema.parse({ token }));\n}\n\nexport async function clearToken(path = credentialsPath()): Promise<void> {\n await removePrivateFile(path);\n}\n","import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod/v4\";\n\nexport const env = createEnv({\n server: {\n HOME: z.string().optional(),\n NIMBASE_API_URL: z.url().default(\"https://api.nimbase.ai\"),\n XDG_CONFIG_HOME: z.string().optional(),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n});\n","import { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ZodType } from \"zod/v4\";\n\nexport async function readValidatedJsonFile<T>(\n path: string,\n schema: ZodType<T>,\n description: string,\n): Promise<T | null> {\n let contents: string;\n try {\n contents = await readFile(path, \"utf8\");\n } catch (error) {\n if (isMissingFile(error)) return null;\n throw new Error(`Could not read ${description} at ${path}`, {\n cause: error,\n });\n }\n\n try {\n return schema.parse(JSON.parse(contents));\n } catch {\n await removePrivateFile(path);\n return null;\n }\n}\n\nexport async function writePrivateJsonFile(\n path: string,\n value: unknown,\n): Promise<void> {\n const directory = dirname(path);\n const temporaryPath = `${path}.${randomUUID()}.tmp`;\n await mkdir(directory, { recursive: true, mode: 0o700 });\n await chmod(directory, 0o700);\n try {\n await writeFile(temporaryPath, `${JSON.stringify(value)}\\n`, {\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, path);\n } catch (error) {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function removePrivateFile(path: string): Promise<void> {\n await rm(path, { force: true });\n}\n\nfunction isMissingFile(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n","import { Command } from \"@oclif/core\";\n\nimport { ApiError, NimbaseApi } from \"@nimbase/sdk\";\n\nimport { clearToken, readToken } from \"./credentials.js\";\nimport { env } from \"./env.js\";\n\nexport abstract class NimbaseCommand extends Command {\n protected readonly api = new NimbaseApi(env.NIMBASE_API_URL);\n\n protected async requireToken(): Promise<string> {\n const token = await readToken();\n if (!token) this.error(\"You are not signed in. Run `nimbase auth login`.\");\n return token;\n }\n\n protected async handleError(error: unknown): Promise<never> {\n if (error instanceof ApiError && error.status === 401) {\n await clearToken();\n this.error(\"Your session has expired. Run `nimbase auth login` again.\");\n }\n this.error(\n error instanceof Error ? error.message : \"Something went wrong.\",\n );\n }\n}\n","import { z } from \"zod/v4\";\n\nimport { toKnowledgeItemId } from \"@nimbase/knowledge\";\nimport { toSourceId } from \"@nimbase/sources\";\nimport { toWorkspaceId } from \"@nimbase/tenancy\";\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string(),\n});\n\nexport const sessionSchema = z.object({ user: userSchema });\n\nexport const workspaceSchema = z\n .object({\n id: z.uuid(),\n name: z.string(),\n slug: z.string(),\n })\n .transform((workspace) => ({\n ...workspace,\n id: toWorkspaceId(workspace.id),\n }));\n\nexport const workspaceListSchema = z.object({\n workspaces: z.array(workspaceSchema),\n});\n\nexport const workspaceCreatedSchema = z.object({ workspace: workspaceSchema });\n\nexport const retrievalResponseSchema = z.object({\n kind: z.literal(\"success\"),\n evidence: z.array(\n z.object({\n excerpt: z.string(),\n provenance: z\n .object({\n workspaceId: z.uuid(),\n knowledgeItemId: z.uuid(),\n sourceId: z.uuid(),\n sourceExternalId: z.string(),\n sourceRevisionKey: z.string(),\n observedAt: z.iso.datetime(),\n })\n .transform((provenance) => ({\n ...provenance,\n workspaceId: toWorkspaceId(provenance.workspaceId),\n knowledgeItemId: toKnowledgeItemId(provenance.knowledgeItemId),\n sourceId: toSourceId(provenance.sourceId),\n observedAt: new Date(provenance.observedAt),\n })),\n }),\n ),\n retrievedAt: z.iso.datetime().transform((value) => new Date(value)),\n});\n\nexport type User = z.infer<typeof userSchema>;\nexport type Workspace = z.infer<typeof workspaceSchema>;\nexport type RetrievalResult = z.infer<typeof retrievalResponseSchema>;\n","import type { SourceId } from \"@nimbase/sources\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\ndeclare const knowledgeItemIdBrand: unique symbol;\n\nexport type KnowledgeItemId = string & {\n readonly [knowledgeItemIdBrand]: \"KnowledgeItemId\";\n};\n\nexport const toKnowledgeItemId = (value: string) => value as KnowledgeItemId;\n\nexport type JsonValue =\n | boolean\n | number\n | string\n | null\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nexport type KnowledgeMetadata = Readonly<Record<string, JsonValue>>;\n\nexport interface KnowledgeContent {\n mediaType: string;\n text: string;\n}\n\nexport interface KnowledgeProvenance {\n sourceId: SourceId;\n externalId: string;\n revisionKey: string;\n observedAt: Date;\n}\n\nexport interface KnowledgeItem {\n id: KnowledgeItemId;\n workspaceId: WorkspaceId;\n type: string;\n content: KnowledgeContent;\n provenance: KnowledgeProvenance;\n metadata: KnowledgeMetadata;\n createdAt: Date;\n updatedAt: Date;\n}\n","import type { ActorId } from \"@nimbase/access\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\nimport type { ConnectorConnectionId } from \"./connector\";\n\ndeclare const sourceIdBrand: unique symbol;\n\nexport type SourceId = string & {\n readonly [sourceIdBrand]: \"SourceId\";\n};\n\nexport const toSourceId = (value: string) => value as SourceId;\n\nexport interface Source {\n id: SourceId;\n workspaceId: WorkspaceId;\n connectionId?: ConnectorConnectionId;\n createdByActorId: ActorId;\n provider: string;\n externalId: string;\n name: string;\n createdAt: Date;\n updatedAt: Date;\n}\n","declare const workspaceIdBrand: unique symbol;\n\nexport type WorkspaceId = string & {\n readonly [workspaceIdBrand]: \"WorkspaceId\";\n};\n\nexport const toWorkspaceId = (value: string) => value as WorkspaceId;\n\nexport interface Workspace {\n id: WorkspaceId;\n slug: string;\n name: string;\n}\n","import type { RetrievalResult, User, Workspace } from \"./contracts\";\nimport {\n retrievalResponseSchema,\n sessionSchema,\n workspaceCreatedSchema,\n workspaceListSchema,\n} from \"./contracts\";\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NimbaseApi {\n private readonly origin: string;\n\n constructor(\n private readonly baseUrl: string,\n private readonly request: typeof fetch = fetch,\n private readonly createRequestId: () => string = () => crypto.randomUUID(),\n ) {\n this.origin = new URL(baseUrl).origin;\n }\n\n async signIn(email: string, password: string): Promise<string> {\n const response = await this.request(this.url(\"/api/auth/sign-in/email\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ email, password }),\n });\n if (!response.ok) throw await apiError(response, \"Sign-in failed.\");\n\n const token = response.headers.get(\"set-auth-token\");\n if (!token) {\n throw new Error(\"The server did not issue a CLI session token.\");\n }\n return token;\n }\n\n async getUser(token: string): Promise<User> {\n const response = await this.request(this.url(\"/api/auth/get-session\"), {\n headers: authorization(token),\n });\n if (!response.ok) throw await apiError(response, \"Session expired.\");\n const session = sessionSchema.safeParse(await response.json());\n if (!session.success) throw new ApiError(\"Session expired.\", 401);\n return session.data.user;\n }\n\n async signOut(token: string): Promise<void> {\n const response = await this.request(this.url(\"/api/auth/sign-out\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: \"{}\",\n });\n if (!response.ok) throw await apiError(response, \"Sign-out failed.\");\n }\n\n async listWorkspaces(token: string): Promise<Workspace[]> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n headers: authorization(token),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not load workspaces.\");\n }\n return workspaceListSchema.parse(await response.json()).workspaces;\n }\n\n async createWorkspace(token: string, name: string): Promise<Workspace> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ requestId: this.createRequestId(), name }),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not create the workspace.\");\n }\n return workspaceCreatedSchema.parse(await response.json()).workspace;\n }\n\n async retrieve(\n token: string,\n workspaceId: string,\n query: string,\n limit = 10,\n ): Promise<RetrievalResult> {\n const response = await this.request(\n this.url(`/api/workspaces/${encodeURIComponent(workspaceId)}/retrieval`),\n {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ query, limit }),\n },\n );\n if (!response.ok) {\n throw await apiError(response, \"Could not retrieve workspace memory.\");\n }\n return retrievalResponseSchema.parse(await response.json());\n }\n\n private url(path: string): URL {\n return new URL(path, this.baseUrl);\n }\n}\n\nfunction authorization(token: string): Record<string, string> {\n return { Authorization: `Bearer ${token}` };\n}\n\nasync function apiError(\n response: Response,\n fallback: string,\n): Promise<ApiError> {\n const value: unknown = await response.json().catch(() => null);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"message\" in value &&\n typeof value.message === \"string\"\n ) {\n return new ApiError(value.message, response.status);\n }\n return new ApiError(fallback, response.status);\n}\n"],"mappings":"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","names":["z","z","z","z"]}