@yigemo/choosefire 0.1.0

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 (62) hide show
  1. package/README.md +83 -0
  2. package/contracts/choosefire-family-wealth/v2/capability-matrix.v1.json +464 -0
  3. package/contracts/choosefire-family-wealth/v2/golden/performance.v1.json +79 -0
  4. package/contracts/choosefire-family-wealth/v2/golden/r2-contract.v1.json +1070 -0
  5. package/contracts/choosefire-family-wealth/v2/golden/scenarios.v1.json +241 -0
  6. package/contracts/choosefire-family-wealth/v2/golden/transport.v1.json +207 -0
  7. package/contracts/choosefire-family-wealth/v2/manifest.json +58 -0
  8. package/contracts/choosefire-family-wealth/v2/openapi.generated.json +2605 -0
  9. package/contracts/choosefire-family-wealth/v2/runtime-schemas/family-wealth.v2.schema.json +2127 -0
  10. package/contracts/choosefire-family-wealth/v2/taxonomies/account-types.v1.json +41 -0
  11. package/contracts/choosefire-family-wealth/v2/taxonomies/asset-classes.v1.json +45 -0
  12. package/contracts/choosefire-family-wealth/v2/taxonomies/transaction-types.v1.json +57 -0
  13. package/contracts/choosefire-financial-workspace/v1/field-registry.generated.json +137 -0
  14. package/contracts/choosefire-financial-workspace/v1/field-registry.manifest.json +11 -0
  15. package/contracts/choosefire-financial-workspace/v1/golden/commands.invalid.json +583 -0
  16. package/contracts/choosefire-financial-workspace/v1/golden/commands.valid.json +201 -0
  17. package/contracts/choosefire-financial-workspace/v1/golden/cursors.invalid.json +82 -0
  18. package/contracts/choosefire-financial-workspace/v1/golden/errors.invalid.json +191 -0
  19. package/contracts/choosefire-financial-workspace/v1/golden/errors.valid.json +298 -0
  20. package/contracts/choosefire-financial-workspace/v1/golden/fingerprints.json +105 -0
  21. package/contracts/choosefire-financial-workspace/v1/golden/projections.invalid.json +3543 -0
  22. package/contracts/choosefire-financial-workspace/v1/golden/projections.valid.json +2953 -0
  23. package/contracts/choosefire-financial-workspace/v1/manifest.json +69 -0
  24. package/contracts/choosefire-financial-workspace/v1/openapi.generated.json +1987 -0
  25. package/contracts/choosefire-financial-workspace/v1/runtime-schemas/financial-workspace.v1.schema.json +1496 -0
  26. package/dist/args.d.ts +5 -0
  27. package/dist/args.js +60 -0
  28. package/dist/args.js.map +1 -0
  29. package/dist/auth.d.ts +55 -0
  30. package/dist/auth.js +480 -0
  31. package/dist/auth.js.map +1 -0
  32. package/dist/commands.d.ts +4 -0
  33. package/dist/commands.js +637 -0
  34. package/dist/commands.js.map +1 -0
  35. package/dist/config.d.ts +10 -0
  36. package/dist/config.js +74 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/family-wealth-v2-contracts.d.ts +276 -0
  39. package/dist/family-wealth-v2-contracts.js +77 -0
  40. package/dist/family-wealth-v2-contracts.js.map +1 -0
  41. package/dist/family-wealth-v2-http.d.ts +65 -0
  42. package/dist/family-wealth-v2-http.js +340 -0
  43. package/dist/family-wealth-v2-http.js.map +1 -0
  44. package/dist/financial-workspace-contracts.d.ts +191 -0
  45. package/dist/financial-workspace-contracts.js +282 -0
  46. package/dist/financial-workspace-contracts.js.map +1 -0
  47. package/dist/http.d.ts +76 -0
  48. package/dist/http.js +446 -0
  49. package/dist/http.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +50 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/output.d.ts +18 -0
  54. package/dist/output.js +111 -0
  55. package/dist/output.js.map +1 -0
  56. package/dist/token-store.d.ts +27 -0
  57. package/dist/token-store.js +408 -0
  58. package/dist/token-store.js.map +1 -0
  59. package/dist/types.d.ts +65 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Stats } from 'node:fs';
2
+ import type { LegacyCredential, StoredAuth } from './types.js';
3
+ export type TokenStoreFs = {
4
+ closeSync: (fd: number) => void;
5
+ fchmodSync: (fd: number, mode: number) => void;
6
+ fstatSync: (fd: number) => Stats;
7
+ fsyncSync: (fd: number) => void;
8
+ lstatSync: (path: string) => Stats;
9
+ mkdirSync: (path: string, options: {
10
+ mode: number;
11
+ }) => string | undefined;
12
+ openSync: (path: string, flags: number, mode?: number) => number;
13
+ readFileSync: (fd: number, encoding: BufferEncoding) => string;
14
+ renameSync: (oldPath: string, newPath: string) => void;
15
+ unlinkSync: (path: string) => void;
16
+ writeFileSync: (fd: number, data: string, encoding: BufferEncoding) => void;
17
+ };
18
+ export type TokenStoreOptions = {
19
+ path?: string;
20
+ fs?: Partial<TokenStoreFs>;
21
+ };
22
+ export declare function getConfigPath(): string;
23
+ export declare function readStoredAuth(pathOrOptions?: string | TokenStoreOptions): StoredAuth | null;
24
+ export declare function writeStoredAuth(auth: StoredAuth | LegacyCredential, pathOrOptions?: string | TokenStoreOptions): void;
25
+ export declare function clearWorkspaceAuth(pathOrOptions?: string | TokenStoreOptions): void;
26
+ export declare function clearStoredAuth(pathOrOptions?: string | TokenStoreOptions): void;
27
+ export declare function parseStoredAuth(contents: string): StoredAuth;
@@ -0,0 +1,408 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { basename, dirname, join } from 'node:path';
5
+ import { WORKSPACE_AUDIENCE, WORKSPACE_CREDENTIAL_KIND } from './types.js';
6
+ const CONFIG_PATH = join(homedir(), '.choosefire', 'config.json');
7
+ const DIRECTORY_MODE = 0o700;
8
+ const FILE_MODE = 0o600;
9
+ const defaultFs = {
10
+ closeSync,
11
+ fchmodSync,
12
+ fstatSync,
13
+ fsyncSync,
14
+ lstatSync,
15
+ mkdirSync,
16
+ openSync,
17
+ readFileSync,
18
+ renameSync,
19
+ unlinkSync,
20
+ writeFileSync,
21
+ };
22
+ export function getConfigPath() {
23
+ return CONFIG_PATH;
24
+ }
25
+ export function readStoredAuth(pathOrOptions) {
26
+ const { path, fs } = resolveOptions(pathOrOptions);
27
+ const directory = dirname(path);
28
+ if (!validateDirectory(directory, fs, false))
29
+ return null;
30
+ let descriptor;
31
+ try {
32
+ const before = fs.lstatSync(path);
33
+ validateSecretStat(before);
34
+ descriptor = fs.openSync(path, constants.O_RDONLY | noFollowFlag());
35
+ const opened = fs.fstatSync(descriptor);
36
+ validateSecretStat(opened);
37
+ if (before.dev !== opened.dev || before.ino !== opened.ino) {
38
+ throw new Error('ChooseFIRE credential file changed while opening');
39
+ }
40
+ const contents = fs.readFileSync(descriptor, 'utf8');
41
+ return parseStoredAuth(contents);
42
+ }
43
+ catch (error) {
44
+ if (isMissing(error))
45
+ return null;
46
+ throw credentialError(error);
47
+ }
48
+ finally {
49
+ if (descriptor !== undefined)
50
+ fs.closeSync(descriptor);
51
+ }
52
+ }
53
+ export function writeStoredAuth(auth, pathOrOptions) {
54
+ const normalized = normalizeStoredAuth(auth);
55
+ const { path, fs } = resolveOptions(pathOrOptions);
56
+ const directory = dirname(path);
57
+ validateDirectory(directory, fs, true);
58
+ // Existing malformed or insecure state must never be silently replaced.
59
+ readStoredAuth({ path, fs });
60
+ const temporaryPath = join(directory, `.${basename(path)}.tmp-${process.pid}-${randomBytes(12).toString('hex')}`);
61
+ let descriptor;
62
+ let renamed = false;
63
+ try {
64
+ descriptor = fs.openSync(temporaryPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | noFollowFlag(), FILE_MODE);
65
+ fs.fchmodSync(descriptor, FILE_MODE);
66
+ fs.writeFileSync(descriptor, `${JSON.stringify(normalized, null, 2)}\n`, 'utf8');
67
+ fs.fsyncSync(descriptor);
68
+ fs.closeSync(descriptor);
69
+ descriptor = undefined;
70
+ fs.renameSync(temporaryPath, path);
71
+ renamed = true;
72
+ fsyncDirectory(directory, fs);
73
+ }
74
+ catch (error) {
75
+ if (descriptor !== undefined) {
76
+ try {
77
+ fs.closeSync(descriptor);
78
+ }
79
+ catch {
80
+ // Preserve the original failure.
81
+ }
82
+ }
83
+ if (!renamed) {
84
+ try {
85
+ fs.unlinkSync(temporaryPath);
86
+ }
87
+ catch (cleanupError) {
88
+ if (!isMissing(cleanupError)) {
89
+ throw new Error('ChooseFIRE credential write failed and temporary cleanup failed');
90
+ }
91
+ }
92
+ }
93
+ throw credentialError(error);
94
+ }
95
+ }
96
+ export function clearWorkspaceAuth(pathOrOptions) {
97
+ const options = resolveOptions(pathOrOptions);
98
+ const stored = readStoredAuth(options);
99
+ if (!stored?.workspace)
100
+ return;
101
+ if (stored.legacy) {
102
+ writeStoredAuth({ version: 2, legacy: stored.legacy }, options);
103
+ return;
104
+ }
105
+ clearStoredAuth(options);
106
+ }
107
+ export function clearStoredAuth(pathOrOptions) {
108
+ const { path, fs } = resolveOptions(pathOrOptions);
109
+ const directory = dirname(path);
110
+ if (!validateDirectory(directory, fs, false))
111
+ return;
112
+ // Validate before unlinking so logout cannot be redirected through a symlink.
113
+ const stored = readStoredAuth({ path, fs });
114
+ if (!stored)
115
+ return;
116
+ try {
117
+ fs.unlinkSync(path);
118
+ fsyncDirectory(directory, fs);
119
+ }
120
+ catch (error) {
121
+ throw credentialError(error);
122
+ }
123
+ }
124
+ export function parseStoredAuth(contents) {
125
+ let parsed;
126
+ try {
127
+ parsed = JSON.parse(contents);
128
+ }
129
+ catch {
130
+ throw new Error('ChooseFIRE credential file is malformed');
131
+ }
132
+ return normalizeStoredAuth(parsed);
133
+ }
134
+ function normalizeStoredAuth(value) {
135
+ if (!isRecord(value))
136
+ throw new Error('ChooseFIRE credential file is malformed');
137
+ if (value.version === 2) {
138
+ assertExactKeys(value, ['version', 'legacy', 'workspace']);
139
+ const legacy = value.legacy === undefined ? undefined : parseLegacyCredential(value.legacy);
140
+ const workspace = value.workspace === undefined ? undefined : parseWorkspaceCredential(value.workspace);
141
+ if (!legacy && !workspace)
142
+ throw new Error('ChooseFIRE credential file is empty');
143
+ return { version: 2, legacy, workspace };
144
+ }
145
+ // Version 1 was the legacy credential object itself. Normalize in memory and
146
+ // persist v2 only on the next legitimate write.
147
+ return { version: 2, legacy: parseLegacyCredential(value) };
148
+ }
149
+ function parseLegacyCredential(value) {
150
+ if (!isRecord(value))
151
+ throw new Error('ChooseFIRE legacy credential is malformed');
152
+ assertExactKeys(value, [
153
+ 'apiBaseUrl',
154
+ 'accessToken',
155
+ 'tokenType',
156
+ 'expiresIn',
157
+ 'savedAt',
158
+ 'user',
159
+ 'accountsLogoutUrl',
160
+ ]);
161
+ requireNonEmptyString(value.apiBaseUrl, 'legacy apiBaseUrl');
162
+ requireNonEmptyString(value.accessToken, 'legacy accessToken');
163
+ requireIsoDate(value.savedAt, 'legacy savedAt');
164
+ if (value.tokenType !== undefined && typeof value.tokenType !== 'string')
165
+ invalid();
166
+ if (value.expiresIn !== undefined &&
167
+ typeof value.expiresIn !== 'string' &&
168
+ typeof value.expiresIn !== 'number') {
169
+ invalid();
170
+ }
171
+ if (value.accountsLogoutUrl !== undefined && typeof value.accountsLogoutUrl !== 'string') {
172
+ invalid();
173
+ }
174
+ const credential = {
175
+ apiBaseUrl: value.apiBaseUrl,
176
+ accessToken: value.accessToken,
177
+ savedAt: value.savedAt,
178
+ };
179
+ if (value.tokenType !== undefined)
180
+ credential.tokenType = value.tokenType;
181
+ if (value.expiresIn !== undefined)
182
+ credential.expiresIn = value.expiresIn;
183
+ if (value.user !== undefined)
184
+ credential.user = projectCompatibleUser(value.user);
185
+ if (value.accountsLogoutUrl !== undefined) {
186
+ credential.accountsLogoutUrl = value.accountsLogoutUrl;
187
+ }
188
+ return credential;
189
+ }
190
+ function parseWorkspaceCredential(value) {
191
+ if (!isRecord(value))
192
+ throw new Error('ChooseFIRE workspace credential is malformed');
193
+ assertExactKeys(value, [
194
+ 'kind',
195
+ 'accessToken',
196
+ 'tokenType',
197
+ 'accessExpiresAt',
198
+ 'refreshToken',
199
+ 'refreshExpiresAt',
200
+ 'audience',
201
+ 'registeredClientId',
202
+ 'scopes',
203
+ 'apiOrigin',
204
+ 'issuer',
205
+ ]);
206
+ if (value.kind !== WORKSPACE_CREDENTIAL_KIND || value.tokenType !== 'Bearer')
207
+ invalid();
208
+ if (value.audience !== WORKSPACE_AUDIENCE)
209
+ invalid();
210
+ if (value.registeredClientId !== 'choosefire-cli')
211
+ invalid();
212
+ if (typeof value.accessToken !== 'string' ||
213
+ value.accessToken.length === 0 ||
214
+ value.accessToken.length > 8192 ||
215
+ !/^[A-Za-z0-9._~-]+$/.test(value.accessToken)) {
216
+ invalid();
217
+ }
218
+ if (typeof value.refreshToken !== 'string' || !/^[A-Za-z0-9_-]{43}$/.test(value.refreshToken)) {
219
+ invalid();
220
+ }
221
+ requireIsoDate(value.accessExpiresAt, 'workspace accessExpiresAt');
222
+ requireIsoDate(value.refreshExpiresAt, 'workspace refreshExpiresAt');
223
+ if (value.accessExpiresAt > value.refreshExpiresAt)
224
+ invalid();
225
+ requireNormalizedOrigin(value.apiOrigin);
226
+ requireNormalizedOrigin(value.issuer);
227
+ if (!isCanonicalScopes(value.scopes))
228
+ invalid();
229
+ return value;
230
+ }
231
+ function validateDirectory(directory, fs, create) {
232
+ try {
233
+ const stat = fs.lstatSync(directory);
234
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
235
+ throw new Error('ChooseFIRE credential directory must be a regular directory');
236
+ }
237
+ validateOwnerAndMode(stat.uid, stat.mode, DIRECTORY_MODE, 'directory');
238
+ return true;
239
+ }
240
+ catch (error) {
241
+ if (!isMissing(error))
242
+ throw credentialError(error);
243
+ if (!create)
244
+ return false;
245
+ }
246
+ try {
247
+ fs.mkdirSync(directory, { mode: DIRECTORY_MODE });
248
+ const stat = fs.lstatSync(directory);
249
+ if (!stat.isDirectory() || stat.isSymbolicLink())
250
+ invalid();
251
+ validateOwnerAndMode(stat.uid, stat.mode, DIRECTORY_MODE, 'directory');
252
+ return true;
253
+ }
254
+ catch (error) {
255
+ throw credentialError(error);
256
+ }
257
+ }
258
+ function validateSecretStat(stat) {
259
+ if (!stat.isFile() || stat.isSymbolicLink()) {
260
+ throw new Error('ChooseFIRE credential path must be a regular file');
261
+ }
262
+ validateOwnerAndMode(stat.uid, stat.mode, FILE_MODE, 'file');
263
+ }
264
+ function validateOwnerAndMode(uid, mode, expectedMode, label) {
265
+ const effectiveUid = process.geteuid?.();
266
+ if (effectiveUid !== undefined && uid !== effectiveUid) {
267
+ throw new Error(`ChooseFIRE credential ${label} has the wrong owner`);
268
+ }
269
+ if ((mode & 0o7777) !== expectedMode) {
270
+ throw new Error(`ChooseFIRE credential ${label} has unsafe permissions`);
271
+ }
272
+ }
273
+ function fsyncDirectory(directory, fs) {
274
+ let descriptor;
275
+ try {
276
+ descriptor = fs.openSync(directory, constants.O_RDONLY | directoryFlag() | noFollowFlag());
277
+ const stat = fs.fstatSync(descriptor);
278
+ if (!stat.isDirectory())
279
+ invalid();
280
+ validateOwnerAndMode(stat.uid, stat.mode, DIRECTORY_MODE, 'directory');
281
+ fs.fsyncSync(descriptor);
282
+ }
283
+ finally {
284
+ if (descriptor !== undefined)
285
+ fs.closeSync(descriptor);
286
+ }
287
+ }
288
+ function resolveOptions(pathOrOptions) {
289
+ const options = typeof pathOrOptions === 'string' ? { path: pathOrOptions } : pathOrOptions ?? {};
290
+ const fs = { ...defaultFs, ...options.fs };
291
+ return {
292
+ path: options.path ?? CONFIG_PATH,
293
+ fs,
294
+ };
295
+ }
296
+ function assertExactKeys(value, allowed) {
297
+ const allowedKeys = new Set(allowed);
298
+ if (Object.keys(value).some((key) => !allowedKeys.has(key)))
299
+ invalid();
300
+ }
301
+ function requireNonEmptyString(value, _label) {
302
+ if (typeof value !== 'string' || value.length === 0)
303
+ invalid();
304
+ }
305
+ function requireIsoDate(value, _label) {
306
+ requireNonEmptyString(value, _label);
307
+ const parsed = new Date(value);
308
+ if (!Number.isFinite(parsed.getTime()) || parsed.toISOString() !== value)
309
+ invalid();
310
+ }
311
+ function requireNormalizedOrigin(value) {
312
+ requireNonEmptyString(value, 'origin');
313
+ let url;
314
+ try {
315
+ url = new URL(value);
316
+ }
317
+ catch {
318
+ invalid();
319
+ }
320
+ const localhost = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';
321
+ if (url.origin !== value ||
322
+ url.username ||
323
+ url.password ||
324
+ url.pathname !== '/' ||
325
+ url.search ||
326
+ url.hash ||
327
+ (url.protocol !== 'https:' && !(url.protocol === 'http:' && localhost))) {
328
+ invalid();
329
+ }
330
+ }
331
+ function isCanonicalScopes(value) {
332
+ const canonical = [
333
+ 'workspace:read',
334
+ 'workspace:initialize',
335
+ 'workspace:write:fact',
336
+ ];
337
+ if (!Array.isArray(value) || value.length === 0 || value.length > canonical.length)
338
+ return false;
339
+ let previousIndex = -1;
340
+ for (const scope of value) {
341
+ const index = canonical.indexOf(scope);
342
+ if (index <= previousIndex)
343
+ return false;
344
+ previousIndex = index;
345
+ }
346
+ return true;
347
+ }
348
+ function projectCompatibleUser(value) {
349
+ if (!isRecord(value))
350
+ invalid();
351
+ const validId = (typeof value.id === 'string' && value.id.length > 0 && value.id.length <= 200) ||
352
+ (typeof value.id === 'number' && Number.isSafeInteger(value.id) && value.id > 0);
353
+ if (!validId ||
354
+ !isOptionalNullableString(value.email, 320) ||
355
+ (value.emailVerified !== undefined && typeof value.emailVerified !== 'boolean') ||
356
+ !isOptionalNullableString(value.name, 300) ||
357
+ !isOptionalNullableString(value.picture, 2048) ||
358
+ !isOptionalString(value.status, 100) ||
359
+ !isOptionalNullableString(value.lastLoginAt, 100) ||
360
+ !isOptionalNullableString(value.createdAt, 100)) {
361
+ invalid();
362
+ }
363
+ const user = { id: value.id };
364
+ if (value.email !== undefined)
365
+ user.email = value.email;
366
+ if (value.emailVerified !== undefined)
367
+ user.emailVerified = value.emailVerified;
368
+ if (value.name !== undefined)
369
+ user.name = value.name;
370
+ if (value.picture !== undefined)
371
+ user.picture = value.picture;
372
+ if (value.status !== undefined)
373
+ user.status = value.status;
374
+ if (value.lastLoginAt !== undefined)
375
+ user.lastLoginAt = value.lastLoginAt;
376
+ if (value.createdAt !== undefined)
377
+ user.createdAt = value.createdAt;
378
+ return user;
379
+ }
380
+ function isOptionalNullableString(value, maximumLength) {
381
+ return value === undefined || value === null ||
382
+ (typeof value === 'string' && value.length <= maximumLength);
383
+ }
384
+ function isOptionalString(value, maximumLength) {
385
+ return value === undefined ||
386
+ (typeof value === 'string' && value.length <= maximumLength);
387
+ }
388
+ function isRecord(value) {
389
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
390
+ }
391
+ function invalid() {
392
+ throw new Error('ChooseFIRE credential file is malformed');
393
+ }
394
+ function credentialError(error) {
395
+ if (error instanceof Error && error.message.startsWith('ChooseFIRE credential'))
396
+ return error;
397
+ return new Error('ChooseFIRE credential store operation failed');
398
+ }
399
+ function isMissing(error) {
400
+ return isRecord(error) && error.code === 'ENOENT';
401
+ }
402
+ function noFollowFlag() {
403
+ return constants.O_NOFOLLOW ?? 0;
404
+ }
405
+ function directoryFlag() {
406
+ return constants.O_DIRECTORY ?? 0;
407
+ }
408
+ //# sourceMappingURL=token-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export type CliConfig = {
5
+ apiBaseUrl: string;
6
+ accessToken: string | null;
7
+ accountsIssuer: string;
8
+ oidcClientId: string;
9
+ workspaceEnabled: boolean;
10
+ familyWealthV2Enabled?: boolean;
11
+ workspaceOidcClientId: 'choosefire-cli';
12
+ workspaceCredential: WorkspaceCredential | null;
13
+ };
14
+ export type ChooseFireUser = {
15
+ id: string | number;
16
+ email?: string | null;
17
+ emailVerified?: boolean;
18
+ name?: string | null;
19
+ picture?: string | null;
20
+ status?: string;
21
+ lastLoginAt?: string | null;
22
+ createdAt?: string | null;
23
+ };
24
+ export type LegacyCredential = {
25
+ apiBaseUrl: string;
26
+ accessToken: string;
27
+ tokenType?: string;
28
+ expiresIn?: string | number;
29
+ savedAt: string;
30
+ user?: ChooseFireUser;
31
+ accountsLogoutUrl?: string;
32
+ };
33
+ export declare const WORKSPACE_AUDIENCE: "choosefire-workspace";
34
+ export declare const WORKSPACE_CREDENTIAL_KIND: "choosefire_workspace_credential.v1";
35
+ export declare const WORKSPACE_REFRESH_KIND: "choosefire_workspace_refresh.v1";
36
+ export declare const WORKSPACE_LOGOUT_KIND: "choosefire_workspace_logout.v1";
37
+ export type WorkspaceScope = 'workspace:read' | 'workspace:initialize' | 'workspace:write:fact';
38
+ export type WorkspaceCredential = {
39
+ kind: typeof WORKSPACE_CREDENTIAL_KIND;
40
+ accessToken: string;
41
+ tokenType: 'Bearer';
42
+ accessExpiresAt: string;
43
+ refreshToken: string;
44
+ refreshExpiresAt: string;
45
+ audience: typeof WORKSPACE_AUDIENCE;
46
+ registeredClientId: 'choosefire-cli';
47
+ scopes: WorkspaceScope[];
48
+ apiOrigin: string;
49
+ issuer: string;
50
+ };
51
+ export type StoredAuth = {
52
+ version: 2;
53
+ legacy?: LegacyCredential;
54
+ workspace?: WorkspaceCredential;
55
+ };
56
+ export type ParsedArgs = {
57
+ positionals: string[];
58
+ flags: Record<string, string | boolean | string[]>;
59
+ };
60
+ export type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';
61
+ export type RequestOptions = {
62
+ method?: HttpMethod;
63
+ body?: unknown;
64
+ source?: 'cli' | 'mcp' | 'web_bff' | 'admin' | 'import' | 'system';
65
+ };
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ export const WORKSPACE_AUDIENCE = 'choosefire-workspace';
2
+ export const WORKSPACE_CREDENTIAL_KIND = 'choosefire_workspace_credential.v1';
3
+ export const WORKSPACE_REFRESH_KIND = 'choosefire_workspace_refresh.v1';
4
+ export const WORKSPACE_LOGOUT_KIND = 'choosefire_workspace_logout.v1';
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwCA,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAA+B,CAAC;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,oCAA6C,CAAC;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,iCAA0C,CAAC;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,gCAAyC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@yigemo/choosefire",
3
+ "version": "0.1.0",
4
+ "description": "Command-line tools for ChooseFIRE data operations.",
5
+ "type": "module",
6
+ "bin": {
7
+ "choosefire": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "contracts",
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "batch5a4:closure:build": "node scripts/build-batch5a4-execution-closure.mjs",
19
+ "build": "tsc -p tsconfig.json && node --input-type=module --eval \"import { chmodSync } from 'node:fs'; chmodSync('dist/index.js', 0o755)\"",
20
+ "contract:choosefire-workspace:check": "tsx scripts/check-choosefire-workspace-contract.ts",
21
+ "contract:choosefire-workspace:sync": "tsx scripts/sync-choosefire-workspace-contract.ts",
22
+ "contract:choosefire-family-wealth:check": "tsx scripts/check-choosefire-family-wealth-contract.ts",
23
+ "contract:choosefire-family-wealth:sync": "tsx scripts/check-choosefire-family-wealth-contract.ts --sync-from",
24
+ "dev": "tsx src/index.ts",
25
+ "prepack": "npm run build",
26
+ "test": "tsx --test test/*.test.ts",
27
+ "test:batch5a4:closure": "tsx --test test/batch5a4-execution-closure-builder.test.ts",
28
+ "typecheck": "tsc -p tsconfig.json --noEmit",
29
+ "start": "node dist/index.js"
30
+ },
31
+ "engines": {
32
+ "node": ">=20"
33
+ },
34
+ "dependencies": {
35
+ "ajv": "8.18.0",
36
+ "ajv-formats": "2.1.1"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.17.2",
40
+ "tsx": "^4.20.6",
41
+ "typescript": "^5.9.2"
42
+ }
43
+ }