@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.
- package/README.md +83 -0
- package/contracts/choosefire-family-wealth/v2/capability-matrix.v1.json +464 -0
- package/contracts/choosefire-family-wealth/v2/golden/performance.v1.json +79 -0
- package/contracts/choosefire-family-wealth/v2/golden/r2-contract.v1.json +1070 -0
- package/contracts/choosefire-family-wealth/v2/golden/scenarios.v1.json +241 -0
- package/contracts/choosefire-family-wealth/v2/golden/transport.v1.json +207 -0
- package/contracts/choosefire-family-wealth/v2/manifest.json +58 -0
- package/contracts/choosefire-family-wealth/v2/openapi.generated.json +2605 -0
- package/contracts/choosefire-family-wealth/v2/runtime-schemas/family-wealth.v2.schema.json +2127 -0
- package/contracts/choosefire-family-wealth/v2/taxonomies/account-types.v1.json +41 -0
- package/contracts/choosefire-family-wealth/v2/taxonomies/asset-classes.v1.json +45 -0
- package/contracts/choosefire-family-wealth/v2/taxonomies/transaction-types.v1.json +57 -0
- package/contracts/choosefire-financial-workspace/v1/field-registry.generated.json +137 -0
- package/contracts/choosefire-financial-workspace/v1/field-registry.manifest.json +11 -0
- package/contracts/choosefire-financial-workspace/v1/golden/commands.invalid.json +583 -0
- package/contracts/choosefire-financial-workspace/v1/golden/commands.valid.json +201 -0
- package/contracts/choosefire-financial-workspace/v1/golden/cursors.invalid.json +82 -0
- package/contracts/choosefire-financial-workspace/v1/golden/errors.invalid.json +191 -0
- package/contracts/choosefire-financial-workspace/v1/golden/errors.valid.json +298 -0
- package/contracts/choosefire-financial-workspace/v1/golden/fingerprints.json +105 -0
- package/contracts/choosefire-financial-workspace/v1/golden/projections.invalid.json +3543 -0
- package/contracts/choosefire-financial-workspace/v1/golden/projections.valid.json +2953 -0
- package/contracts/choosefire-financial-workspace/v1/manifest.json +69 -0
- package/contracts/choosefire-financial-workspace/v1/openapi.generated.json +1987 -0
- package/contracts/choosefire-financial-workspace/v1/runtime-schemas/financial-workspace.v1.schema.json +1496 -0
- package/dist/args.d.ts +5 -0
- package/dist/args.js +60 -0
- package/dist/args.js.map +1 -0
- package/dist/auth.d.ts +55 -0
- package/dist/auth.js +480 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands.d.ts +4 -0
- package/dist/commands.js +637 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/family-wealth-v2-contracts.d.ts +276 -0
- package/dist/family-wealth-v2-contracts.js +77 -0
- package/dist/family-wealth-v2-contracts.js.map +1 -0
- package/dist/family-wealth-v2-http.d.ts +65 -0
- package/dist/family-wealth-v2-http.js +340 -0
- package/dist/family-wealth-v2-http.js.map +1 -0
- package/dist/financial-workspace-contracts.d.ts +191 -0
- package/dist/financial-workspace-contracts.js +282 -0
- package/dist/financial-workspace-contracts.js.map +1 -0
- package/dist/http.d.ts +76 -0
- package/dist/http.js +446 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +18 -0
- package/dist/output.js +111 -0
- package/dist/output.js.map +1 -0
- package/dist/token-store.d.ts +27 -0
- package/dist/token-store.js +408 -0
- package/dist/token-store.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/dist/http.js
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import { AccountFinancialWorkspaceRemoteResponseInvalidError, normalizeAccountFinancialWorkspaceCommand, parseAccountFinancialWorkspaceHttpResponse, validateAccountFinancialWorkspaceSchema, } from './financial-workspace-contracts.js';
|
|
2
|
+
import { WORKSPACE_AUDIENCE } from './types.js';
|
|
3
|
+
const FINANCIAL_WORKSPACE_PATH = '/choosefire/financial-workspace';
|
|
4
|
+
const MAX_WORKSPACE_REQUEST_BODY_BYTES = 65_536;
|
|
5
|
+
const MAX_WORKSPACE_RESPONSE_BODY_BYTES = 1024 * 1024;
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
7
|
+
const SNAPSHOT_STATUSES = [200, 400, 401, 403, 404, 503];
|
|
8
|
+
const INITIALIZE_STATUSES = [200, 400, 401, 403, 409, 413, 415, 503];
|
|
9
|
+
const SUMMARY_STATUSES = [200, 400, 401, 403, 404, 503];
|
|
10
|
+
const ACTIVITY_STATUSES = [200, 400, 401, 403, 404, 409, 410, 503];
|
|
11
|
+
const FACT_STATUSES = [200, 400, 401, 403, 404, 409, 413, 415, 503];
|
|
12
|
+
export class ChooseFireHttpError extends Error {
|
|
13
|
+
status;
|
|
14
|
+
payload;
|
|
15
|
+
code;
|
|
16
|
+
constructor(message, status, payload, code = 'REMOTE_REQUEST_FAILED') {
|
|
17
|
+
super(message);
|
|
18
|
+
this.status = status;
|
|
19
|
+
this.payload = payload;
|
|
20
|
+
this.name = 'ChooseFireHttpError';
|
|
21
|
+
this.code = code;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class AccountFinancialWorkspaceDisabledError extends Error {
|
|
25
|
+
code = 'ACCOUNT_WORKSPACE_DISABLED';
|
|
26
|
+
constructor() {
|
|
27
|
+
super('The account financial workspace is disabled.');
|
|
28
|
+
this.name = 'AccountFinancialWorkspaceDisabledError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class AccountFinancialWorkspaceAuthRequiredError extends Error {
|
|
32
|
+
recovery;
|
|
33
|
+
code = 'AUTH_REQUIRED';
|
|
34
|
+
constructor(recovery) {
|
|
35
|
+
super('ChooseFIRE workspace authentication is required.');
|
|
36
|
+
this.recovery = recovery;
|
|
37
|
+
this.name = 'AccountFinancialWorkspaceAuthRequiredError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class AccountFinancialWorkspaceScopeRequiredError extends Error {
|
|
41
|
+
requiredScope;
|
|
42
|
+
recovery;
|
|
43
|
+
code = 'ACCOUNT_SCOPE_REQUIRED';
|
|
44
|
+
constructor(requiredScope, recovery) {
|
|
45
|
+
super('The required ChooseFIRE workspace scope is missing.');
|
|
46
|
+
this.requiredScope = requiredScope;
|
|
47
|
+
this.recovery = recovery;
|
|
48
|
+
this.name = 'AccountFinancialWorkspaceScopeRequiredError';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class AccountFinancialWorkspaceHttpError extends Error {
|
|
52
|
+
status;
|
|
53
|
+
code;
|
|
54
|
+
data;
|
|
55
|
+
requestId;
|
|
56
|
+
recovery;
|
|
57
|
+
name = 'AccountFinancialWorkspaceHttpError';
|
|
58
|
+
constructor(status, code, data, requestId, recovery) {
|
|
59
|
+
super('The account financial workspace request failed.');
|
|
60
|
+
this.status = status;
|
|
61
|
+
this.code = code;
|
|
62
|
+
this.data = data;
|
|
63
|
+
this.requestId = requestId;
|
|
64
|
+
this.recovery = recovery;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class AccountFinancialWorkspaceRemoteUnavailableError extends Error {
|
|
68
|
+
code = 'REMOTE_UNAVAILABLE';
|
|
69
|
+
constructor() {
|
|
70
|
+
super('The account financial workspace is unavailable.');
|
|
71
|
+
this.name = 'AccountFinancialWorkspaceRemoteUnavailableError';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class AccountFinancialWorkspaceRemoteResponseInvalidClientError extends Error {
|
|
75
|
+
validationErrors;
|
|
76
|
+
recovery;
|
|
77
|
+
code = 'REMOTE_RESPONSE_INVALID';
|
|
78
|
+
constructor(validationErrors, recovery) {
|
|
79
|
+
super('The account financial workspace response does not match the approved contract.');
|
|
80
|
+
this.validationErrors = validationErrors;
|
|
81
|
+
this.recovery = recovery;
|
|
82
|
+
this.name = 'AccountFinancialWorkspaceRemoteResponseInvalidClientError';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class AccountFinancialWorkspaceRemoteOutcomeUnknownError extends Error {
|
|
86
|
+
recovery;
|
|
87
|
+
code = 'REMOTE_OUTCOME_UNKNOWN';
|
|
88
|
+
command;
|
|
89
|
+
idempotencyKey;
|
|
90
|
+
serializedBody;
|
|
91
|
+
constructor(recovery) {
|
|
92
|
+
super('The account financial workspace mutation outcome is unknown.');
|
|
93
|
+
this.recovery = recovery;
|
|
94
|
+
this.name = 'AccountFinancialWorkspaceRemoteOutcomeUnknownError';
|
|
95
|
+
this.command = structuredClone(recovery.command);
|
|
96
|
+
this.idempotencyKey = recovery.idempotencyKey;
|
|
97
|
+
this.serializedBody = recovery.serializedBody;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function requestChooseFire(config, path, options = {}) {
|
|
101
|
+
if (!config.accessToken) {
|
|
102
|
+
throw new ChooseFireHttpError('ChooseFIRE legacy authentication is required.', 401, { code: 'MISSING_ACCESS_TOKEN' }, 'MISSING_ACCESS_TOKEN');
|
|
103
|
+
}
|
|
104
|
+
let response;
|
|
105
|
+
try {
|
|
106
|
+
response = await fetch(`${config.apiBaseUrl}${path}`, {
|
|
107
|
+
method: options.method || 'GET',
|
|
108
|
+
redirect: 'error',
|
|
109
|
+
headers: {
|
|
110
|
+
accept: 'application/json',
|
|
111
|
+
authorization: `Bearer ${config.accessToken}`,
|
|
112
|
+
...(options.body === undefined ? {} : { 'content-type': 'application/json' }),
|
|
113
|
+
},
|
|
114
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new ChooseFireHttpError('The ChooseFIRE legacy request failed.', 503, { code: 'REMOTE_UNAVAILABLE' }, 'REMOTE_UNAVAILABLE');
|
|
119
|
+
}
|
|
120
|
+
const text = await response.text();
|
|
121
|
+
const payload = text ? parseJson(text) : null;
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
throw new ChooseFireHttpError(`The ChooseFIRE legacy request failed (HTTP ${response.status}).`, response.status, payload);
|
|
124
|
+
}
|
|
125
|
+
return payload;
|
|
126
|
+
}
|
|
127
|
+
export function initializeAccountFinancialWorkspace(config, command, options) {
|
|
128
|
+
const normalized = normalizeAccountFinancialWorkspaceCommand('InitializeFinancialWorkspaceCommandV1', command);
|
|
129
|
+
return requestWorkspaceMutation(config, 'initialize', normalized, options);
|
|
130
|
+
}
|
|
131
|
+
export function getAccountFinancialWorkspaceSnapshot(config, options) {
|
|
132
|
+
return requestWorkspaceRead(config, 'snapshot', undefined, options);
|
|
133
|
+
}
|
|
134
|
+
export function getAccountFinancialWorkspaceSummary(config, options) {
|
|
135
|
+
return requestWorkspaceRead(config, 'summary', undefined, options);
|
|
136
|
+
}
|
|
137
|
+
export function getAccountFinancialWorkspaceActivity(config, query, options) {
|
|
138
|
+
const validation = validateAccountFinancialWorkspaceSchema('FinancialWorkspaceActivityQueryV1', query);
|
|
139
|
+
if (!validation.valid)
|
|
140
|
+
throw new TypeError(validation.errors.join('; '));
|
|
141
|
+
return requestWorkspaceRead(config, 'activity', structuredClone(query), options);
|
|
142
|
+
}
|
|
143
|
+
export function recordAccountFinancialWorkspaceFact(config, command, options) {
|
|
144
|
+
const normalized = normalizeAccountFinancialWorkspaceCommand('FinancialWorkspaceFactRecordCommandV1', command);
|
|
145
|
+
const canonical = {
|
|
146
|
+
kind: normalized.kind,
|
|
147
|
+
expectedVersion: normalized.expectedVersion,
|
|
148
|
+
idempotencyKey: normalized.idempotencyKey,
|
|
149
|
+
field: normalized.field,
|
|
150
|
+
value: normalized.value,
|
|
151
|
+
status: normalized.status,
|
|
152
|
+
...(normalized.asOf === null ? {} : { asOf: normalized.asOf }),
|
|
153
|
+
};
|
|
154
|
+
return requestWorkspaceMutation(config, 'fact-record', canonical, options);
|
|
155
|
+
}
|
|
156
|
+
const OPERATIONS = {
|
|
157
|
+
snapshot: {
|
|
158
|
+
method: 'GET',
|
|
159
|
+
path: FINANCIAL_WORKSPACE_PATH,
|
|
160
|
+
scope: 'workspace:read',
|
|
161
|
+
successSchema: 'SuccessEnvelopeFinancialWorkspaceSnapshotV1',
|
|
162
|
+
statuses: SNAPSHOT_STATUSES,
|
|
163
|
+
},
|
|
164
|
+
initialize: {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
path: FINANCIAL_WORKSPACE_PATH,
|
|
167
|
+
scope: 'workspace:initialize',
|
|
168
|
+
successSchema: 'SuccessEnvelopeFinancialWorkspaceCommandReceiptV1',
|
|
169
|
+
statuses: INITIALIZE_STATUSES,
|
|
170
|
+
},
|
|
171
|
+
summary: {
|
|
172
|
+
method: 'GET',
|
|
173
|
+
path: `${FINANCIAL_WORKSPACE_PATH}/summary`,
|
|
174
|
+
scope: 'workspace:read',
|
|
175
|
+
successSchema: 'SuccessEnvelopeFinancialWorkspaceSummaryV1',
|
|
176
|
+
statuses: SUMMARY_STATUSES,
|
|
177
|
+
},
|
|
178
|
+
activity: {
|
|
179
|
+
method: 'GET',
|
|
180
|
+
path: `${FINANCIAL_WORKSPACE_PATH}/activity`,
|
|
181
|
+
scope: 'workspace:read',
|
|
182
|
+
successSchema: 'SuccessEnvelopeFinancialWorkspaceActivityPageV1',
|
|
183
|
+
statuses: ACTIVITY_STATUSES,
|
|
184
|
+
},
|
|
185
|
+
'fact-record': {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
path: `${FINANCIAL_WORKSPACE_PATH}/facts`,
|
|
188
|
+
scope: 'workspace:write:fact',
|
|
189
|
+
successSchema: 'SuccessEnvelopeFinancialWorkspaceCommandReceiptV1',
|
|
190
|
+
statuses: FACT_STATUSES,
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
async function requestWorkspaceRead(config, operation, query, options = {}) {
|
|
194
|
+
const definition = OPERATIONS[operation];
|
|
195
|
+
const credential = requireWorkspaceCredential(config, definition.scope, options.now);
|
|
196
|
+
const path = query ? `${definition.path}?${activitySearch(query)}` : definition.path;
|
|
197
|
+
try {
|
|
198
|
+
return await dispatchWorkspaceRequest(config.apiBaseUrl, path, definition, credential.accessToken, undefined, options);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (error instanceof WorkspaceTransportFailure || error instanceof WorkspaceBodyTransportFailure) {
|
|
202
|
+
throw new AccountFinancialWorkspaceRemoteUnavailableError();
|
|
203
|
+
}
|
|
204
|
+
throw normalizeResponseError(error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function requestWorkspaceMutation(config, operation, command, options = {}) {
|
|
208
|
+
const definition = OPERATIONS[operation];
|
|
209
|
+
const serializedBody = JSON.stringify(command);
|
|
210
|
+
if (Buffer.byteLength(serializedBody, 'utf8') > MAX_WORKSPACE_REQUEST_BODY_BYTES) {
|
|
211
|
+
throw new TypeError('Financial workspace command exceeds 65536 bytes');
|
|
212
|
+
}
|
|
213
|
+
const recovery = {
|
|
214
|
+
kind: 'financial_workspace_mutation_recovery.v1',
|
|
215
|
+
action: 'retry_exact_command',
|
|
216
|
+
guidance: 'Read the latest snapshot, then explicitly retry the exact serialized body with the original idempotency key. Do not generate a new key.',
|
|
217
|
+
path: definition.path,
|
|
218
|
+
command: structuredClone(command),
|
|
219
|
+
idempotencyKey: command.idempotencyKey,
|
|
220
|
+
serializedBody,
|
|
221
|
+
};
|
|
222
|
+
let credential;
|
|
223
|
+
try {
|
|
224
|
+
credential = requireWorkspaceCredential(config, definition.scope, options.now);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
if (error instanceof AccountFinancialWorkspaceAuthRequiredError) {
|
|
228
|
+
throw new AccountFinancialWorkspaceAuthRequiredError(recovery);
|
|
229
|
+
}
|
|
230
|
+
if (error instanceof AccountFinancialWorkspaceScopeRequiredError) {
|
|
231
|
+
throw new AccountFinancialWorkspaceScopeRequiredError(error.requiredScope, recovery);
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
return await dispatchWorkspaceRequest(config.apiBaseUrl, definition.path, definition, credential.accessToken, serializedBody, options);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
if (error instanceof WorkspaceTransportFailure ||
|
|
240
|
+
error instanceof WorkspaceBodyTransportFailure ||
|
|
241
|
+
error instanceof WorkspaceResponseBoundaryInvalid) {
|
|
242
|
+
throw new AccountFinancialWorkspaceRemoteOutcomeUnknownError(recovery);
|
|
243
|
+
}
|
|
244
|
+
const normalized = normalizeResponseError(error, recovery);
|
|
245
|
+
if (normalized instanceof AccountFinancialWorkspaceHttpError) {
|
|
246
|
+
throw new AccountFinancialWorkspaceHttpError(normalized.status, normalized.code, normalized.data, normalized.requestId, recovery);
|
|
247
|
+
}
|
|
248
|
+
if (normalized instanceof AccountFinancialWorkspaceRemoteResponseInvalidClientError) {
|
|
249
|
+
throw new AccountFinancialWorkspaceRemoteOutcomeUnknownError(recovery);
|
|
250
|
+
}
|
|
251
|
+
throw normalized;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async function dispatchWorkspaceRequest(apiOrigin, path, definition, accessToken, serializedBody, options) {
|
|
255
|
+
const fetchImplementation = options.fetch ?? fetch;
|
|
256
|
+
const timeoutMs = normalizeTimeout(options.timeoutMs);
|
|
257
|
+
const controller = new AbortController();
|
|
258
|
+
let timeout;
|
|
259
|
+
const timeoutFailure = new Promise((_resolve, reject) => {
|
|
260
|
+
timeout = setTimeout(() => {
|
|
261
|
+
controller.abort();
|
|
262
|
+
reject(new WorkspaceTransportFailure());
|
|
263
|
+
}, timeoutMs);
|
|
264
|
+
});
|
|
265
|
+
try {
|
|
266
|
+
return await Promise.race([
|
|
267
|
+
(async () => {
|
|
268
|
+
let response;
|
|
269
|
+
try {
|
|
270
|
+
response = await fetchImplementation(`${apiOrigin}${path}`, {
|
|
271
|
+
method: definition.method,
|
|
272
|
+
redirect: 'error',
|
|
273
|
+
signal: controller.signal,
|
|
274
|
+
headers: {
|
|
275
|
+
accept: 'application/json',
|
|
276
|
+
authorization: `Bearer ${accessToken}`,
|
|
277
|
+
...(serializedBody === undefined ? {} : { 'content-type': 'application/json' }),
|
|
278
|
+
},
|
|
279
|
+
body: serializedBody,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
throw new WorkspaceTransportFailure();
|
|
284
|
+
}
|
|
285
|
+
return parseWorkspaceResponse(response, definition);
|
|
286
|
+
})(),
|
|
287
|
+
timeoutFailure,
|
|
288
|
+
]);
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
if (timeout !== undefined)
|
|
292
|
+
clearTimeout(timeout);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async function parseWorkspaceResponse(response, definition) {
|
|
296
|
+
if (getMediaType(response.headers.get('content-type')) !== 'application/json') {
|
|
297
|
+
throw new AccountFinancialWorkspaceRemoteResponseInvalidClientError([
|
|
298
|
+
'response media type must be application/json',
|
|
299
|
+
]);
|
|
300
|
+
}
|
|
301
|
+
if (!definition.statuses.includes(response.status)) {
|
|
302
|
+
throw new AccountFinancialWorkspaceRemoteResponseInvalidClientError([
|
|
303
|
+
`HTTP ${response.status} is not allowed for this financial workspace operation`,
|
|
304
|
+
]);
|
|
305
|
+
}
|
|
306
|
+
const bytes = await readBoundedResponse(response, MAX_WORKSPACE_RESPONSE_BODY_BYTES);
|
|
307
|
+
let payload;
|
|
308
|
+
try {
|
|
309
|
+
payload = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
throw new AccountFinancialWorkspaceRemoteResponseInvalidClientError([
|
|
313
|
+
'response body must be valid UTF-8 JSON',
|
|
314
|
+
]);
|
|
315
|
+
}
|
|
316
|
+
if (response.status === 200) {
|
|
317
|
+
try {
|
|
318
|
+
const envelope = parseAccountFinancialWorkspaceHttpResponse(200, payload, definition.successSchema);
|
|
319
|
+
return envelope.data;
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
throw normalizeResponseError(error);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
try {
|
|
326
|
+
const envelope = parseAccountFinancialWorkspaceHttpResponse(response.status, payload);
|
|
327
|
+
throw new AccountFinancialWorkspaceHttpError(response.status, envelope.code, envelope.error.data, envelope.error.requestId);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
if (error instanceof AccountFinancialWorkspaceHttpError)
|
|
331
|
+
throw error;
|
|
332
|
+
throw normalizeResponseError(error);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
async function readBoundedResponse(response, maximumBytes) {
|
|
336
|
+
const declaredLength = response.headers.get('content-length');
|
|
337
|
+
const contentEncoding = response.headers.get('content-encoding')?.trim().toLowerCase();
|
|
338
|
+
const decodedFromCompressed = Boolean(contentEncoding && contentEncoding !== 'identity');
|
|
339
|
+
let expectedLength;
|
|
340
|
+
if (declaredLength !== null) {
|
|
341
|
+
if (!/^\d+$/.test(declaredLength))
|
|
342
|
+
throw new WorkspaceResponseBoundaryInvalid();
|
|
343
|
+
expectedLength = Number(declaredLength);
|
|
344
|
+
if (!Number.isSafeInteger(expectedLength) ||
|
|
345
|
+
(!decodedFromCompressed && expectedLength > maximumBytes)) {
|
|
346
|
+
throw new WorkspaceResponseBoundaryInvalid();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (!response.body)
|
|
350
|
+
throw new WorkspaceResponseBoundaryInvalid();
|
|
351
|
+
const reader = response.body.getReader();
|
|
352
|
+
const chunks = [];
|
|
353
|
+
let total = 0;
|
|
354
|
+
try {
|
|
355
|
+
while (true) {
|
|
356
|
+
const { done, value } = await reader.read();
|
|
357
|
+
if (done)
|
|
358
|
+
break;
|
|
359
|
+
total += value.byteLength;
|
|
360
|
+
if (total > maximumBytes) {
|
|
361
|
+
await reader.cancel().catch(() => undefined);
|
|
362
|
+
throw new WorkspaceResponseBoundaryInvalid();
|
|
363
|
+
}
|
|
364
|
+
chunks.push(value);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
if (error instanceof WorkspaceResponseBoundaryInvalid)
|
|
369
|
+
throw error;
|
|
370
|
+
throw new WorkspaceBodyTransportFailure();
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
reader.releaseLock();
|
|
374
|
+
}
|
|
375
|
+
if (expectedLength !== undefined && !decodedFromCompressed && expectedLength !== total) {
|
|
376
|
+
throw new WorkspaceResponseBoundaryInvalid();
|
|
377
|
+
}
|
|
378
|
+
const bytes = new Uint8Array(total);
|
|
379
|
+
let offset = 0;
|
|
380
|
+
for (const chunk of chunks) {
|
|
381
|
+
bytes.set(chunk, offset);
|
|
382
|
+
offset += chunk.byteLength;
|
|
383
|
+
}
|
|
384
|
+
return bytes;
|
|
385
|
+
}
|
|
386
|
+
function requireWorkspaceCredential(config, requiredScope, now) {
|
|
387
|
+
if (!config.workspaceEnabled)
|
|
388
|
+
throw new AccountFinancialWorkspaceDisabledError();
|
|
389
|
+
const credential = config.workspaceCredential;
|
|
390
|
+
const currentTime = (now ?? Date.now)();
|
|
391
|
+
const expiresAt = credential ? Date.parse(credential.accessExpiresAt) : Number.NaN;
|
|
392
|
+
if (!credential ||
|
|
393
|
+
credential.apiOrigin !== config.apiBaseUrl ||
|
|
394
|
+
credential.issuer !== config.accountsIssuer ||
|
|
395
|
+
credential.audience !== WORKSPACE_AUDIENCE ||
|
|
396
|
+
credential.registeredClientId !== 'choosefire-cli' ||
|
|
397
|
+
!Number.isFinite(expiresAt) ||
|
|
398
|
+
expiresAt <= currentTime) {
|
|
399
|
+
throw new AccountFinancialWorkspaceAuthRequiredError();
|
|
400
|
+
}
|
|
401
|
+
if (!credential.scopes.includes(requiredScope)) {
|
|
402
|
+
throw new AccountFinancialWorkspaceScopeRequiredError(requiredScope);
|
|
403
|
+
}
|
|
404
|
+
return credential;
|
|
405
|
+
}
|
|
406
|
+
function normalizeResponseError(error, recovery) {
|
|
407
|
+
if (error instanceof AccountFinancialWorkspaceHttpError ||
|
|
408
|
+
error instanceof AccountFinancialWorkspaceRemoteResponseInvalidClientError) {
|
|
409
|
+
return error;
|
|
410
|
+
}
|
|
411
|
+
if (error instanceof AccountFinancialWorkspaceRemoteResponseInvalidError) {
|
|
412
|
+
return new AccountFinancialWorkspaceRemoteResponseInvalidClientError(error.validationErrors, recovery);
|
|
413
|
+
}
|
|
414
|
+
return new AccountFinancialWorkspaceRemoteResponseInvalidClientError(['response validation failed'], recovery);
|
|
415
|
+
}
|
|
416
|
+
function activitySearch(query) {
|
|
417
|
+
const search = new URLSearchParams({ limit: String(query.limit) });
|
|
418
|
+
if (query.cursor !== undefined)
|
|
419
|
+
search.set('cursor', query.cursor);
|
|
420
|
+
return search.toString();
|
|
421
|
+
}
|
|
422
|
+
function normalizeTimeout(value) {
|
|
423
|
+
const timeout = value ?? DEFAULT_TIMEOUT_MS;
|
|
424
|
+
if (!Number.isSafeInteger(timeout) || timeout <= 0 || timeout > 30_000) {
|
|
425
|
+
throw new TypeError('Workspace timeout must be an integer from 1 to 30000 milliseconds');
|
|
426
|
+
}
|
|
427
|
+
return timeout;
|
|
428
|
+
}
|
|
429
|
+
function parseJson(text) {
|
|
430
|
+
try {
|
|
431
|
+
return JSON.parse(text);
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
return text;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
function getMediaType(contentType) {
|
|
438
|
+
return contentType?.split(';', 1)[0]?.trim().toLowerCase();
|
|
439
|
+
}
|
|
440
|
+
class WorkspaceTransportFailure extends Error {
|
|
441
|
+
}
|
|
442
|
+
class WorkspaceBodyTransportFailure extends Error {
|
|
443
|
+
}
|
|
444
|
+
class WorkspaceResponseBoundaryInvalid extends Error {
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from './args.js';
|
|
3
|
+
import { runCommand } from './commands.js';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
import { AccountFinancialWorkspaceHttpError, AccountFinancialWorkspaceRemoteOutcomeUnknownError, AccountFinancialWorkspaceRemoteResponseInvalidClientError, ChooseFireHttpError, } from './http.js';
|
|
6
|
+
import { fail, legacyHttpErrorDetails, writeJson, writeText } from './output.js';
|
|
7
|
+
async function main() {
|
|
8
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
9
|
+
const result = await runCommand(loadConfig(), parsed);
|
|
10
|
+
if (parsed.flags.json !== true && typeof result === 'string') {
|
|
11
|
+
writeText(String(result));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
writeJson(result);
|
|
15
|
+
}
|
|
16
|
+
main().catch((error) => {
|
|
17
|
+
if (error instanceof AccountFinancialWorkspaceRemoteOutcomeUnknownError) {
|
|
18
|
+
fail(error.code, error.message, { recovery: error.recovery });
|
|
19
|
+
}
|
|
20
|
+
if (error instanceof AccountFinancialWorkspaceHttpError) {
|
|
21
|
+
fail(error.code, error.message, {
|
|
22
|
+
status: error.status,
|
|
23
|
+
data: error.data,
|
|
24
|
+
...(error.requestId === undefined ? {} : { requestId: error.requestId }),
|
|
25
|
+
...(error.recovery === undefined ? {} : { recovery: error.recovery }),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (error instanceof AccountFinancialWorkspaceRemoteResponseInvalidClientError) {
|
|
29
|
+
fail(error.code, error.message, {
|
|
30
|
+
validationErrors: error.validationErrors,
|
|
31
|
+
...(error.recovery === undefined ? {} : { recovery: error.recovery }),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (error instanceof ChooseFireHttpError) {
|
|
35
|
+
fail(error.code, error.message, legacyHttpErrorDetails(error.status, error.payload));
|
|
36
|
+
}
|
|
37
|
+
if (hasStringCode(error)) {
|
|
38
|
+
const details = error;
|
|
39
|
+
fail(error.code, error instanceof Error ? error.message : 'ChooseFIRE command failed.', {
|
|
40
|
+
...(details.requiredScope === undefined ? {} : { requiredScope: details.requiredScope }),
|
|
41
|
+
...(details.recovery === undefined ? {} : { recovery: details.recovery }),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
fail('CLI_ERROR', error instanceof Error ? error.message : 'Unknown error');
|
|
45
|
+
});
|
|
46
|
+
function hasStringCode(error) {
|
|
47
|
+
return typeof error === 'object' && error !== null &&
|
|
48
|
+
typeof error.code === 'string';
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CliErrorEnvelope = {
|
|
2
|
+
kind: 'choosefire_cli_error.v1';
|
|
3
|
+
code: string;
|
|
4
|
+
success: false;
|
|
5
|
+
status: 'error';
|
|
6
|
+
error: {
|
|
7
|
+
message: string;
|
|
8
|
+
data: unknown;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare function writeJson(value: unknown): void;
|
|
12
|
+
export declare function writeText(value: string): void;
|
|
13
|
+
export declare function formatCliError(code: string, message: string, data?: unknown): CliErrorEnvelope;
|
|
14
|
+
export declare function fail(code: string, message: string, data?: unknown): never;
|
|
15
|
+
export declare function legacyHttpErrorDetails(status: number, _untrustedPayload: unknown): {
|
|
16
|
+
status: number;
|
|
17
|
+
};
|
|
18
|
+
export declare function redactSecrets(value: unknown): unknown;
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const REDACTED = '[REDACTED]';
|
|
2
|
+
export function writeJson(value) {
|
|
3
|
+
process.stdout.write(`${JSON.stringify(redactSecrets(value), null, 2)}\n`);
|
|
4
|
+
}
|
|
5
|
+
export function writeText(value) {
|
|
6
|
+
process.stdout.write(`${redactString(value)}\n`);
|
|
7
|
+
}
|
|
8
|
+
export function formatCliError(code, message, data = {}) {
|
|
9
|
+
return redactSecrets({
|
|
10
|
+
kind: 'choosefire_cli_error.v1',
|
|
11
|
+
code,
|
|
12
|
+
success: false,
|
|
13
|
+
status: 'error',
|
|
14
|
+
error: { message, data },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function fail(code, message, data = {}) {
|
|
18
|
+
writeJson(formatCliError(code, message, data));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
export function legacyHttpErrorDetails(status, _untrustedPayload) {
|
|
22
|
+
return { status };
|
|
23
|
+
}
|
|
24
|
+
export function redactSecrets(value) {
|
|
25
|
+
return redactValue(value, new WeakSet());
|
|
26
|
+
}
|
|
27
|
+
function redactValue(value, seen) {
|
|
28
|
+
if (typeof value === 'string')
|
|
29
|
+
return redactString(value);
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
if (seen.has(value))
|
|
32
|
+
return '[CIRCULAR]';
|
|
33
|
+
seen.add(value);
|
|
34
|
+
return value.map((item) => redactValue(item, seen));
|
|
35
|
+
}
|
|
36
|
+
if (!value || typeof value !== 'object')
|
|
37
|
+
return value;
|
|
38
|
+
if (seen.has(value))
|
|
39
|
+
return '[CIRCULAR]';
|
|
40
|
+
seen.add(value);
|
|
41
|
+
return Object.fromEntries(Object.entries(value).map(([key, nested]) => [
|
|
42
|
+
key,
|
|
43
|
+
isSensitiveKey(key) ? REDACTED : redactValue(nested, seen),
|
|
44
|
+
]));
|
|
45
|
+
}
|
|
46
|
+
function isSensitiveKey(key) {
|
|
47
|
+
const normalized = key.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
48
|
+
if (normalized === 'tokensource' || normalized === 'idempotencykey')
|
|
49
|
+
return false;
|
|
50
|
+
return normalized === 'authorization' ||
|
|
51
|
+
normalized === 'headers' ||
|
|
52
|
+
normalized === 'cookie' ||
|
|
53
|
+
normalized === 'setcookie' ||
|
|
54
|
+
normalized === 'codeverifier' ||
|
|
55
|
+
normalized === 'authorizationcode' ||
|
|
56
|
+
normalized === 'nonce' ||
|
|
57
|
+
normalized.includes('password') ||
|
|
58
|
+
normalized.includes('secret') ||
|
|
59
|
+
normalized.endsWith('token');
|
|
60
|
+
}
|
|
61
|
+
function redactString(value) {
|
|
62
|
+
const json = redactJsonString(value);
|
|
63
|
+
if (json !== undefined)
|
|
64
|
+
return json;
|
|
65
|
+
let redacted = redactUrl(value);
|
|
66
|
+
redacted = redacted.replace(/\bBearer\s+[^\s,;]+/gi, `Bearer ${REDACTED}`);
|
|
67
|
+
redacted = redacted.replace(/\b(access_token|refresh_token|id_token|token|password|secret|code_verifier)=([^\s&#]+)/gi, (_match, name) => `${name}=${REDACTED}`);
|
|
68
|
+
return redacted;
|
|
69
|
+
}
|
|
70
|
+
function redactJsonString(value) {
|
|
71
|
+
const trimmed = value.trim();
|
|
72
|
+
if (!trimmed || (trimmed[0] !== '{' && trimmed[0] !== '['))
|
|
73
|
+
return undefined;
|
|
74
|
+
try {
|
|
75
|
+
const parsed = JSON.parse(value);
|
|
76
|
+
const redacted = redactSecrets(parsed);
|
|
77
|
+
return JSON.stringify(parsed) === JSON.stringify(redacted)
|
|
78
|
+
? value
|
|
79
|
+
: JSON.stringify(redacted);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function redactUrl(value) {
|
|
86
|
+
let url;
|
|
87
|
+
try {
|
|
88
|
+
url = new URL(value);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
let changed = false;
|
|
94
|
+
for (const key of [...url.searchParams.keys()]) {
|
|
95
|
+
if (!isSensitiveKey(key) && !isSensitiveQueryKey(key))
|
|
96
|
+
continue;
|
|
97
|
+
url.searchParams.set(key, REDACTED);
|
|
98
|
+
changed = true;
|
|
99
|
+
}
|
|
100
|
+
if (url.username || url.password) {
|
|
101
|
+
url.username = REDACTED;
|
|
102
|
+
url.password = REDACTED;
|
|
103
|
+
changed = true;
|
|
104
|
+
}
|
|
105
|
+
return changed ? url.toString() : value;
|
|
106
|
+
}
|
|
107
|
+
function isSensitiveQueryKey(key) {
|
|
108
|
+
const normalized = key.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
109
|
+
return normalized === 'code' || normalized === 'state';
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=output.js.map
|