public-com-cli 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 (102) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +273 -0
  3. package/dist/api/accounts.d.ts +12 -0
  4. package/dist/api/accounts.js +5 -0
  5. package/dist/api/accounts.js.map +1 -0
  6. package/dist/api/history.d.ts +31 -0
  7. package/dist/api/history.js +29 -0
  8. package/dist/api/history.js.map +1 -0
  9. package/dist/api/index.d.ts +9 -0
  10. package/dist/api/index.js +9 -0
  11. package/dist/api/index.js.map +1 -0
  12. package/dist/api/instruments.d.ts +22 -0
  13. package/dist/api/instruments.js +46 -0
  14. package/dist/api/instruments.js.map +1 -0
  15. package/dist/api/market-data.d.ts +48 -0
  16. package/dist/api/market-data.js +20 -0
  17. package/dist/api/market-data.js.map +1 -0
  18. package/dist/api/option-details.d.ts +17 -0
  19. package/dist/api/option-details.js +9 -0
  20. package/dist/api/option-details.js.map +1 -0
  21. package/dist/api/orders.d.ts +125 -0
  22. package/dist/api/orders.js +43 -0
  23. package/dist/api/orders.js.map +1 -0
  24. package/dist/api/portfolio.d.ts +81 -0
  25. package/dist/api/portfolio.js +19 -0
  26. package/dist/api/portfolio.js.map +1 -0
  27. package/dist/api/types.d.ts +12 -0
  28. package/dist/api/types.js +2 -0
  29. package/dist/api/types.js.map +1 -0
  30. package/dist/authentication/keychain.d.ts +5 -0
  31. package/dist/authentication/keychain.js +17 -0
  32. package/dist/authentication/keychain.js.map +1 -0
  33. package/dist/authentication/token.d.ts +9 -0
  34. package/dist/authentication/token.js +35 -0
  35. package/dist/authentication/token.js.map +1 -0
  36. package/dist/commands/accounts.d.ts +3 -0
  37. package/dist/commands/accounts.js +42 -0
  38. package/dist/commands/accounts.js.map +1 -0
  39. package/dist/commands/authenticate.d.ts +3 -0
  40. package/dist/commands/authenticate.js +103 -0
  41. package/dist/commands/authenticate.js.map +1 -0
  42. package/dist/commands/completion.d.ts +3 -0
  43. package/dist/commands/completion.js +234 -0
  44. package/dist/commands/completion.js.map +1 -0
  45. package/dist/commands/config.d.ts +3 -0
  46. package/dist/commands/config.js +67 -0
  47. package/dist/commands/config.js.map +1 -0
  48. package/dist/commands/history.d.ts +3 -0
  49. package/dist/commands/history.js +91 -0
  50. package/dist/commands/history.js.map +1 -0
  51. package/dist/commands/instrument.d.ts +3 -0
  52. package/dist/commands/instrument.js +85 -0
  53. package/dist/commands/instrument.js.map +1 -0
  54. package/dist/commands/instruments.d.ts +3 -0
  55. package/dist/commands/instruments.js +118 -0
  56. package/dist/commands/instruments.js.map +1 -0
  57. package/dist/commands/option-greeks.d.ts +3 -0
  58. package/dist/commands/option-greeks.js +66 -0
  59. package/dist/commands/option-greeks.js.map +1 -0
  60. package/dist/commands/options-chain.d.ts +3 -0
  61. package/dist/commands/options-chain.js +110 -0
  62. package/dist/commands/options-chain.js.map +1 -0
  63. package/dist/commands/options-expirations.d.ts +3 -0
  64. package/dist/commands/options-expirations.js +54 -0
  65. package/dist/commands/options-expirations.js.map +1 -0
  66. package/dist/commands/order-cancel.d.ts +3 -0
  67. package/dist/commands/order-cancel.js +37 -0
  68. package/dist/commands/order-cancel.js.map +1 -0
  69. package/dist/commands/order-place.d.ts +3 -0
  70. package/dist/commands/order-place.js +104 -0
  71. package/dist/commands/order-place.js.map +1 -0
  72. package/dist/commands/order-preflight.d.ts +3 -0
  73. package/dist/commands/order-preflight.js +138 -0
  74. package/dist/commands/order-preflight.js.map +1 -0
  75. package/dist/commands/order.d.ts +3 -0
  76. package/dist/commands/order.js +108 -0
  77. package/dist/commands/order.js.map +1 -0
  78. package/dist/commands/portfolio.d.ts +3 -0
  79. package/dist/commands/portfolio.js +107 -0
  80. package/dist/commands/portfolio.js.map +1 -0
  81. package/dist/commands/quotes.d.ts +3 -0
  82. package/dist/commands/quotes.js +86 -0
  83. package/dist/commands/quotes.js.map +1 -0
  84. package/dist/helpers/api.d.ts +3 -0
  85. package/dist/helpers/api.js +5 -0
  86. package/dist/helpers/api.js.map +1 -0
  87. package/dist/helpers/config.d.ts +5 -0
  88. package/dist/helpers/config.js +40 -0
  89. package/dist/helpers/config.js.map +1 -0
  90. package/dist/helpers/fetch.d.ts +24 -0
  91. package/dist/helpers/fetch.js +202 -0
  92. package/dist/helpers/fetch.js.map +1 -0
  93. package/dist/helpers/output.d.ts +5 -0
  94. package/dist/helpers/output.js +13 -0
  95. package/dist/helpers/output.js.map +1 -0
  96. package/dist/helpers/validation.d.ts +2 -0
  97. package/dist/helpers/validation.js +14 -0
  98. package/dist/helpers/validation.js.map +1 -0
  99. package/dist/index.d.ts +3 -0
  100. package/dist/index.js +49 -0
  101. package/dist/index.js.map +1 -0
  102. package/package.json +78 -0
@@ -0,0 +1,108 @@
1
+ import { Command } from 'commander';
2
+ import { getOrder, ApiError, AuthenticationError, RateLimitError, NotFoundError, } from '../helpers/api.js';
3
+ import { error, success } from '../helpers/output.js';
4
+ function formatCurrency(value) {
5
+ if (!value)
6
+ return 'N/A';
7
+ const num = parseFloat(value);
8
+ if (isNaN(num))
9
+ return value;
10
+ return new Intl.NumberFormat('en-US', {
11
+ style: 'currency',
12
+ currency: 'USD',
13
+ }).format(num);
14
+ }
15
+ function formatStatus(status) {
16
+ switch (status) {
17
+ case 'NEW':
18
+ return 'New';
19
+ case 'PENDING':
20
+ return 'Pending';
21
+ case 'OPEN':
22
+ return 'Open';
23
+ case 'FILLED':
24
+ return 'Filled';
25
+ case 'PARTIALLY_FILLED':
26
+ return 'Partially Filled';
27
+ case 'CANCELLED':
28
+ return 'Cancelled';
29
+ case 'REJECTED':
30
+ return 'Rejected';
31
+ case 'EXPIRED':
32
+ return 'Expired';
33
+ default:
34
+ return status;
35
+ }
36
+ }
37
+ export function createOrderCommand() {
38
+ const order = new Command('order')
39
+ .description('Get order details')
40
+ .argument('<accountId>', 'The account ID')
41
+ .argument('<orderId>', 'The order ID (UUID)')
42
+ .action(async (accountId, orderId) => {
43
+ try {
44
+ const details = await getOrder(accountId, orderId);
45
+ success(`\nOrder Details:\n`);
46
+ console.log(` Order ID: ${details.orderId}`);
47
+ console.log(` Symbol: ${details.instrument.symbol} (${details.instrument.type})`);
48
+ console.log(` Side: ${details.side}`);
49
+ console.log(` Type: ${details.type}`);
50
+ console.log(` Status: ${formatStatus(details.status)}`);
51
+ if (details.quantity) {
52
+ console.log(` Quantity: ${details.quantity}`);
53
+ }
54
+ if (details.notionalValue) {
55
+ console.log(` Notional: ${formatCurrency(details.notionalValue)}`);
56
+ }
57
+ if (details.limitPrice) {
58
+ console.log(` Limit Price: ${formatCurrency(details.limitPrice)}`);
59
+ }
60
+ if (details.stopPrice) {
61
+ console.log(` Stop Price: ${formatCurrency(details.stopPrice)}`);
62
+ }
63
+ console.log(` Time in Force: ${details.expiration.timeInForce}`);
64
+ console.log(` Created: ${new Date(details.createdAt).toLocaleString()}`);
65
+ if (details.filledQuantity && details.filledQuantity !== '0') {
66
+ console.log(`\n Execution:`);
67
+ console.log(` Filled Qty: ${details.filledQuantity}`);
68
+ console.log(` Avg Price: ${formatCurrency(details.averagePrice)}`);
69
+ }
70
+ if (details.closedAt) {
71
+ console.log(` Closed: ${new Date(details.closedAt).toLocaleString()}`);
72
+ }
73
+ if (details.rejectReason) {
74
+ console.log(` Reject Reason: ${details.rejectReason}`);
75
+ }
76
+ if (details.legs && details.legs.length > 0) {
77
+ console.log('\n Legs:');
78
+ for (const leg of details.legs) {
79
+ console.log(` ${leg.side} ${leg.instrument.symbol} (${leg.instrument.type})`);
80
+ if (leg.ratioQuantity) {
81
+ console.log(` Ratio: ${leg.ratioQuantity}`);
82
+ }
83
+ }
84
+ }
85
+ console.log();
86
+ }
87
+ catch (err) {
88
+ if (err instanceof NotFoundError) {
89
+ error(err.message);
90
+ }
91
+ else if (err instanceof AuthenticationError) {
92
+ error(err.message);
93
+ }
94
+ else if (err instanceof RateLimitError) {
95
+ error('Too many requests. Please try again later.');
96
+ }
97
+ else if (err instanceof ApiError) {
98
+ error(`Failed to get order: ${err.message}`);
99
+ }
100
+ else {
101
+ error(`Failed to get order: ${err instanceof Error ? err.message : 'Unknown error'}`);
102
+ }
103
+ process.exit(1);
104
+ }
105
+ });
106
+ return order;
107
+ }
108
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/commands/order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createPortfolioCommand(): Command;
3
+ //# sourceMappingURL=portfolio.d.ts.map
@@ -0,0 +1,107 @@
1
+ import { Command } from 'commander';
2
+ import { getPortfolio, ApiError, AuthenticationError, RateLimitError, NotFoundError, } from '../helpers/api.js';
3
+ import { error } from '../helpers/output.js';
4
+ function formatCurrency(value) {
5
+ const num = parseFloat(value);
6
+ if (isNaN(num))
7
+ return value;
8
+ return new Intl.NumberFormat('en-US', {
9
+ style: 'currency',
10
+ currency: 'USD',
11
+ }).format(num);
12
+ }
13
+ function formatPercent(value) {
14
+ const num = parseFloat(value);
15
+ if (isNaN(num))
16
+ return value;
17
+ return `${num >= 0 ? '+' : ''}${num.toFixed(2)}%`;
18
+ }
19
+ function formatGain(value, percentage) {
20
+ const numValue = parseFloat(value);
21
+ const prefix = numValue >= 0 ? '+' : '';
22
+ return `${prefix}${formatCurrency(value)} (${formatPercent(percentage)})`;
23
+ }
24
+ export function createPortfolioCommand() {
25
+ const portfolio = new Command('portfolio')
26
+ .description('View portfolio for an account')
27
+ .argument('<accountId>', 'The account ID')
28
+ .action(async (accountId) => {
29
+ try {
30
+ const data = await getPortfolio(accountId);
31
+ console.log(`\nAccount: ${data.accountId} (${data.accountType})\n`);
32
+ console.log('Buying Power:');
33
+ console.log(` Cash Only: ${formatCurrency(data.buyingPower.cashOnlyBuyingPower)}`);
34
+ console.log(` Total: ${formatCurrency(data.buyingPower.buyingPower)}`);
35
+ console.log(` Options: ${formatCurrency(data.buyingPower.optionsBuyingPower)}`);
36
+ if (data.equity.length > 0) {
37
+ console.log('\nEquity:');
38
+ for (const eq of data.equity) {
39
+ console.log(` ${eq.type}: ${formatCurrency(eq.value)} (${formatPercent(eq.percentageOfPortfolio)} of portfolio)`);
40
+ }
41
+ }
42
+ if (data.positions.length > 0) {
43
+ console.log('\nPositions:');
44
+ for (const pos of data.positions) {
45
+ console.log(`\n ${pos.instrument.symbol} - ${pos.instrument.name || pos.instrument.type}`);
46
+ console.log(` Quantity: ${pos.quantity}`);
47
+ console.log(` Current Value: ${formatCurrency(pos.currentValue)}`);
48
+ console.log(` Last Price: ${formatCurrency(pos.lastPrice.lastPrice)}`);
49
+ console.log(` Cost Basis: ${formatCurrency(pos.costBasis.totalCost)} (${formatCurrency(pos.costBasis.unitCost)}/share)`);
50
+ console.log(` Total Gain: ${formatGain(pos.instrumentGain.gainValue, pos.instrumentGain.gainPercentage)}`);
51
+ console.log(` Daily Gain: ${formatGain(pos.positionDailyGain.gainValue, pos.positionDailyGain.gainPercentage)}`);
52
+ console.log(` % of Portfolio: ${formatPercent(pos.percentOfPortfolio)}`);
53
+ }
54
+ }
55
+ else {
56
+ console.log('\nNo positions.');
57
+ }
58
+ if (data.orders.length > 0) {
59
+ console.log('\nOpen Orders:');
60
+ for (const order of data.orders) {
61
+ console.log(`\n ${order.side} ${order.quantity} ${order.instrument.symbol}`);
62
+ console.log(` Order ID: ${order.orderId}`);
63
+ console.log(` Type: ${order.type}`);
64
+ console.log(` Status: ${order.status}`);
65
+ if (order.limitPrice) {
66
+ console.log(` Limit: ${formatCurrency(order.limitPrice)}`);
67
+ }
68
+ if (order.stopPrice) {
69
+ console.log(` Stop: ${formatCurrency(order.stopPrice)}`);
70
+ }
71
+ console.log(` Expiration: ${order.expiration.timeInForce}`);
72
+ console.log(` Created: ${new Date(order.createdAt).toLocaleString()}`);
73
+ if (order.filledQuantity && order.filledQuantity !== '0') {
74
+ console.log(` Filled: ${order.filledQuantity} @ ${formatCurrency(order.averagePrice)}`);
75
+ }
76
+ if (order.rejectReason) {
77
+ console.log(` Rejected: ${order.rejectReason}`);
78
+ }
79
+ }
80
+ }
81
+ else {
82
+ console.log('\nNo open orders.');
83
+ }
84
+ console.log();
85
+ }
86
+ catch (err) {
87
+ if (err instanceof NotFoundError) {
88
+ error(err.message);
89
+ }
90
+ else if (err instanceof AuthenticationError) {
91
+ error(err.message);
92
+ }
93
+ else if (err instanceof RateLimitError) {
94
+ error('Too many requests. Please try again later.');
95
+ }
96
+ else if (err instanceof ApiError) {
97
+ error(`Failed to fetch portfolio: ${err.message}`);
98
+ }
99
+ else {
100
+ error(`Failed to fetch portfolio: ${err instanceof Error ? err.message : 'Unknown error'}`);
101
+ }
102
+ process.exit(1);
103
+ }
104
+ });
105
+ return portfolio;
106
+ }
107
+ //# sourceMappingURL=portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/commands/portfolio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createQuotesCommand(): Command;
3
+ //# sourceMappingURL=quotes.d.ts.map
@@ -0,0 +1,86 @@
1
+ import { Command } from 'commander';
2
+ import { getQuotes, ApiError, AuthenticationError, RateLimitError, } from '../helpers/api.js';
3
+ import { error, success } from '../helpers/output.js';
4
+ const VALID_QUOTE_TYPES = [
5
+ 'EQUITY',
6
+ 'OPTION',
7
+ 'CRYPTO',
8
+ 'INDEX',
9
+ ];
10
+ function formatCurrency(value) {
11
+ if (!value)
12
+ return 'N/A';
13
+ const num = parseFloat(value);
14
+ if (isNaN(num))
15
+ return value;
16
+ return new Intl.NumberFormat('en-US', {
17
+ style: 'currency',
18
+ currency: 'USD',
19
+ }).format(num);
20
+ }
21
+ function formatNumber(value) {
22
+ if (value === undefined || value === null)
23
+ return 'N/A';
24
+ return new Intl.NumberFormat('en-US').format(value);
25
+ }
26
+ export function createQuotesCommand() {
27
+ const quotes = new Command('quotes')
28
+ .description('Get quotes for one or more instruments')
29
+ .argument('<accountId>', 'The account ID')
30
+ .argument('<symbols...>', 'Symbols to get quotes for (e.g., AAPL TSLA BTC)')
31
+ .option('-t, --type <type>', `Security type for all symbols (${VALID_QUOTE_TYPES.join(', ')})`, 'EQUITY')
32
+ .action(async (accountId, symbols, options) => {
33
+ try {
34
+ const type = options.type.toUpperCase();
35
+ if (!VALID_QUOTE_TYPES.includes(type)) {
36
+ error(`Invalid security type: ${type}. Valid types: ${VALID_QUOTE_TYPES.join(', ')}`);
37
+ process.exit(1);
38
+ }
39
+ const instruments = symbols.map((symbol) => ({
40
+ symbol: symbol.toUpperCase(),
41
+ type,
42
+ }));
43
+ const response = await getQuotes(accountId, instruments);
44
+ if (response.quotes.length === 0) {
45
+ console.log('\nNo quotes returned.');
46
+ return;
47
+ }
48
+ success(`\nQuotes:\n`);
49
+ for (const quote of response.quotes) {
50
+ if (quote.outcome !== 'SUCCESS') {
51
+ console.log(` ${quote.instrument.symbol}: Failed to get quote`);
52
+ continue;
53
+ }
54
+ console.log(` ${quote.instrument.symbol} (${quote.instrument.type})`);
55
+ console.log(` Last: ${formatCurrency(quote.last)}`);
56
+ console.log(` Bid: ${formatCurrency(quote.bid)} x ${formatNumber(quote.bidSize)}`);
57
+ console.log(` Ask: ${formatCurrency(quote.ask)} x ${formatNumber(quote.askSize)}`);
58
+ console.log(` Volume: ${formatNumber(quote.volume)}`);
59
+ if (quote.openInterest !== undefined) {
60
+ console.log(` Open Int: ${formatNumber(quote.openInterest)}`);
61
+ }
62
+ if (quote.lastTimestamp) {
63
+ console.log(` As of: ${new Date(quote.lastTimestamp).toLocaleString()}`);
64
+ }
65
+ console.log();
66
+ }
67
+ }
68
+ catch (err) {
69
+ if (err instanceof AuthenticationError) {
70
+ error(err.message);
71
+ }
72
+ else if (err instanceof RateLimitError) {
73
+ error('Too many requests. Please try again later.');
74
+ }
75
+ else if (err instanceof ApiError) {
76
+ error(`Failed to fetch quotes: ${err.message}`);
77
+ }
78
+ else {
79
+ error(`Failed to fetch quotes: ${err instanceof Error ? err.message : 'Unknown error'}`);
80
+ }
81
+ process.exit(1);
82
+ }
83
+ });
84
+ return quotes;
85
+ }
86
+ //# sourceMappingURL=quotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/commands/quotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from '../api/index.js';
2
+ export { validateApiKey, clearTokens, ApiError, AuthenticationError, RateLimitError, } from './fetch.js';
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1,5 @@
1
+ // Re-export everything from the api module for backwards compatibility
2
+ export * from '../api/index.js';
3
+ // Re-export auth helpers from fetch
4
+ export { validateApiKey, clearTokens, ApiError, AuthenticationError, RateLimitError, } from './fetch.js';
5
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/helpers/api.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,cAAc,iBAAiB,CAAC;AAEhC,oCAAoC;AACpC,OAAO,EACL,cAAc,EACd,WAAW,EACX,QAAQ,EACR,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function getEndpoint(): Promise<string>;
2
+ export declare function setEndpoint(endpoint: string): Promise<void>;
3
+ export declare function resetEndpoint(): Promise<void>;
4
+ export declare function getDefaultEndpoint(): string;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ const CONFIG_DIR = join(homedir(), '.public-cli');
5
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ const DEFAULT_ENDPOINT = 'https://api.public.com/';
7
+ async function ensureConfigDir() {
8
+ await mkdir(CONFIG_DIR, { recursive: true });
9
+ }
10
+ async function readConfig() {
11
+ try {
12
+ const content = await readFile(CONFIG_FILE, 'utf-8');
13
+ return JSON.parse(content);
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ async function writeConfig(config) {
20
+ await ensureConfigDir();
21
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
22
+ }
23
+ export async function getEndpoint() {
24
+ const config = await readConfig();
25
+ return config.endpoint ?? DEFAULT_ENDPOINT;
26
+ }
27
+ export async function setEndpoint(endpoint) {
28
+ const config = await readConfig();
29
+ config.endpoint = endpoint;
30
+ await writeConfig(config);
31
+ }
32
+ export async function resetEndpoint() {
33
+ const config = await readConfig();
34
+ delete config.endpoint;
35
+ await writeConfig(config);
36
+ }
37
+ export function getDefaultEndpoint() {
38
+ return DEFAULT_ENDPOINT;
39
+ }
40
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/helpers/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAMnD,KAAK,UAAU,eAAe;IAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAc;IACvC,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC;IACvB,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare function setRetryEnabled(enabled: boolean): void;
2
+ export declare function isRetryEnabled(): boolean;
3
+ export declare class ApiError extends Error {
4
+ statusCode?: number | undefined;
5
+ retryable: boolean;
6
+ constructor(message: string, statusCode?: number | undefined, retryable?: boolean);
7
+ }
8
+ export declare class RateLimitError extends ApiError {
9
+ retryAfterMs?: number | undefined;
10
+ constructor(message: string, retryAfterMs?: number | undefined);
11
+ }
12
+ export declare class AuthenticationError extends ApiError {
13
+ constructor(message: string);
14
+ }
15
+ export declare function validateApiKey(apiKey: string): Promise<string>;
16
+ export declare function clearTokens(): Promise<void>;
17
+ export interface FetchOptions {
18
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
19
+ body?: unknown;
20
+ headers?: Record<string, string>;
21
+ skipRetry?: boolean;
22
+ }
23
+ export declare function authenticatedFetch<T>(path: string, options?: FetchOptions): Promise<T>;
24
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1,202 @@
1
+ import { getEndpoint } from './config.js';
2
+ import { getApiKey } from '../authentication/keychain.js';
3
+ import { getToken, storeToken, isTokenExpired, deleteToken, } from '../authentication/token.js';
4
+ const TOKEN_VALIDITY_MINUTES = 120;
5
+ const MAX_RETRIES = 3;
6
+ const BASE_DELAY_MS = 2000;
7
+ const MAX_TOTAL_RETRY_TIME_MS = 30000;
8
+ let globalRetryEnabled = true;
9
+ export function setRetryEnabled(enabled) {
10
+ globalRetryEnabled = enabled;
11
+ }
12
+ export function isRetryEnabled() {
13
+ return globalRetryEnabled;
14
+ }
15
+ export class ApiError extends Error {
16
+ statusCode;
17
+ retryable;
18
+ constructor(message, statusCode, retryable = false) {
19
+ super(message);
20
+ this.statusCode = statusCode;
21
+ this.retryable = retryable;
22
+ this.name = 'ApiError';
23
+ }
24
+ }
25
+ export class RateLimitError extends ApiError {
26
+ retryAfterMs;
27
+ constructor(message, retryAfterMs) {
28
+ super(message, 429, true);
29
+ this.retryAfterMs = retryAfterMs;
30
+ this.name = 'RateLimitError';
31
+ }
32
+ }
33
+ export class AuthenticationError extends ApiError {
34
+ constructor(message) {
35
+ super(message, 401, false);
36
+ this.name = 'AuthenticationError';
37
+ }
38
+ }
39
+ async function sleep(ms) {
40
+ return new Promise((resolve) => setTimeout(resolve, ms));
41
+ }
42
+ function calculateBackoffDelay(attempt) {
43
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
44
+ const jitter = Math.random() * 1000;
45
+ return Math.min(delay + jitter, MAX_TOTAL_RETRY_TIME_MS / 2);
46
+ }
47
+ async function fetchAccessToken(endpoint, secret) {
48
+ const url = new URL('userapiauthservice/personal/access-tokens', endpoint).toString();
49
+ const response = await fetch(url, {
50
+ method: 'POST',
51
+ headers: {
52
+ 'Content-Type': 'application/json',
53
+ },
54
+ body: JSON.stringify({
55
+ validityInMinutes: TOKEN_VALIDITY_MINUTES,
56
+ secret,
57
+ }),
58
+ });
59
+ if (!response.ok) {
60
+ let errorMessage = `HTTP ${response.status}`;
61
+ try {
62
+ const errorBody = (await response.json());
63
+ errorMessage = errorBody.message || errorBody.error || errorMessage;
64
+ }
65
+ catch {
66
+ // Ignore JSON parse errors
67
+ }
68
+ if (response.status === 401 || response.status === 403) {
69
+ throw new AuthenticationError('Invalid API key');
70
+ }
71
+ if (response.status === 429) {
72
+ const retryAfter = response.headers.get('Retry-After');
73
+ const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 5000;
74
+ throw new RateLimitError('Rate limited while fetching token', retryAfterMs);
75
+ }
76
+ if (response.status >= 500) {
77
+ throw new ApiError(`Server error while fetching token: ${errorMessage}`, response.status, true);
78
+ }
79
+ throw new ApiError(`Failed to get access token: ${errorMessage}`, response.status);
80
+ }
81
+ const data = (await response.json());
82
+ return data.accessToken;
83
+ }
84
+ async function getValidAccessToken(forceRefresh = false) {
85
+ const apiKey = await getApiKey();
86
+ if (!apiKey) {
87
+ throw new AuthenticationError('No API key configured. Run "public-cli auth login" first.');
88
+ }
89
+ if (!forceRefresh) {
90
+ const existingToken = await getToken();
91
+ if (existingToken && !isTokenExpired(existingToken.expiresAt)) {
92
+ return existingToken.accessToken;
93
+ }
94
+ }
95
+ const endpoint = await getEndpoint();
96
+ const accessToken = await fetchAccessToken(endpoint, apiKey);
97
+ await storeToken(accessToken, TOKEN_VALIDITY_MINUTES);
98
+ return accessToken;
99
+ }
100
+ export async function validateApiKey(apiKey) {
101
+ const endpoint = await getEndpoint();
102
+ const accessToken = await fetchAccessToken(endpoint, apiKey);
103
+ await storeToken(accessToken, TOKEN_VALIDITY_MINUTES);
104
+ return accessToken;
105
+ }
106
+ export async function clearTokens() {
107
+ await deleteToken();
108
+ }
109
+ export async function authenticatedFetch(path, options = {}) {
110
+ const { method = 'GET', body, headers = {}, skipRetry = false } = options;
111
+ const endpoint = await getEndpoint();
112
+ const url = new URL(path, endpoint).toString();
113
+ const shouldRetry = globalRetryEnabled && !skipRetry;
114
+ let lastError = null;
115
+ let tokenRefreshed = false;
116
+ for (let attempt = 0; attempt <= (shouldRetry ? MAX_RETRIES : 0); attempt++) {
117
+ try {
118
+ const accessToken = await getValidAccessToken(tokenRefreshed);
119
+ const requestHeaders = {
120
+ 'Content-Type': 'application/json',
121
+ Authorization: `Bearer ${accessToken}`,
122
+ ...headers,
123
+ };
124
+ const requestOptions = {
125
+ method,
126
+ headers: requestHeaders,
127
+ };
128
+ if (body !== undefined) {
129
+ requestOptions.body = JSON.stringify(body);
130
+ }
131
+ const response = await fetch(url, requestOptions);
132
+ if (response.ok) {
133
+ return (await response.json());
134
+ }
135
+ let errorMessage = `HTTP ${response.status}`;
136
+ try {
137
+ const errorBody = (await response.json());
138
+ errorMessage = errorBody.message || errorBody.error || errorMessage;
139
+ }
140
+ catch {
141
+ // Ignore JSON parse errors
142
+ }
143
+ if (response.status === 401) {
144
+ if (!tokenRefreshed) {
145
+ await clearTokens();
146
+ tokenRefreshed = true;
147
+ continue;
148
+ }
149
+ throw new AuthenticationError('Authentication failed. Please run "public-cli auth login" again.');
150
+ }
151
+ if (response.status === 429) {
152
+ const retryAfter = response.headers.get('Retry-After');
153
+ const retryAfterMs = retryAfter
154
+ ? parseInt(retryAfter, 10) * 1000
155
+ : calculateBackoffDelay(attempt);
156
+ if (shouldRetry && attempt < MAX_RETRIES) {
157
+ await sleep(retryAfterMs);
158
+ continue;
159
+ }
160
+ throw new RateLimitError('Too many requests. Please try again later.', retryAfterMs);
161
+ }
162
+ if (response.status >= 500) {
163
+ const error = new ApiError(`Server error: ${errorMessage}`, response.status, true);
164
+ if (shouldRetry && attempt < MAX_RETRIES) {
165
+ lastError = error;
166
+ const delay = calculateBackoffDelay(attempt);
167
+ await sleep(delay);
168
+ continue;
169
+ }
170
+ throw error;
171
+ }
172
+ throw new ApiError(errorMessage, response.status);
173
+ }
174
+ catch (err) {
175
+ if (err instanceof AuthenticationError ||
176
+ err instanceof RateLimitError ||
177
+ (err instanceof ApiError && !err.retryable)) {
178
+ throw err;
179
+ }
180
+ if (err instanceof ApiError && err.retryable) {
181
+ lastError = err;
182
+ if (shouldRetry && attempt < MAX_RETRIES) {
183
+ const delay = calculateBackoffDelay(attempt);
184
+ await sleep(delay);
185
+ continue;
186
+ }
187
+ throw err;
188
+ }
189
+ if (err instanceof Error) {
190
+ lastError = err;
191
+ if (shouldRetry && attempt < MAX_RETRIES) {
192
+ const delay = calculateBackoffDelay(attempt);
193
+ await sleep(delay);
194
+ continue;
195
+ }
196
+ }
197
+ throw err;
198
+ }
199
+ }
200
+ throw lastError || new ApiError('Request failed after retries');
201
+ }
202
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/helpers/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EACL,QAAQ,EACR,UAAU,EACV,cAAc,EACd,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC,IAAI,kBAAkB,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,kBAAkB,GAAG,OAAO,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IACA;IAHT,YACE,OAAe,EACR,UAAmB,EACnB,YAAqB,KAAK;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAS;QACnB,cAAS,GAAT,SAAS,CAAiB;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAGjC;IAFT,YACE,OAAe,EACR,YAAqB;QAE5B,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAFnB,iBAAY,GAAZ,YAAY,CAAS;QAG5B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAWD,KAAK,UAAU,KAAK,CAAC,EAAU;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,uBAAuB,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,2CAA2C,EAC3C,QAAQ,CACT,CAAC,QAAQ,EAAE,CAAC;IAEb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,sBAAsB;YACzC,MAAM;SACP,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAC1D,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,IAAI,YAAY,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,MAAM,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,IAAI,cAAc,CACtB,mCAAmC,EACnC,YAAY,CACb,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAChB,sCAAsC,YAAY,EAAE,EACpD,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,QAAQ,CAChB,+BAA+B,YAAY,EAAE,EAC7C,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;IACtD,OAAO,IAAI,CAAC,WAAW,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,YAAY,GAAG,KAAK;IACrD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,mBAAmB,CAC3B,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,MAAM,QAAQ,EAAE,CAAC;QACvC,IAAI,aAAa,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,OAAO,aAAa,CAAC,WAAW,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,UAAU,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAEtD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc;IACjD,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,UAAU,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACtD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,UAAwB,EAAE;IAE1B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1E,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE/C,MAAM,WAAW,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC;IACrD,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAE9D,MAAM,cAAc,GAA2B;gBAC7C,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,GAAG,OAAO;aACX,CAAC;YAEF,MAAM,cAAc,GAAgB;gBAClC,MAAM;gBACN,OAAO,EAAE,cAAc;aACxB,CAAC;YAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAElD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YACtC,CAAC;YAED,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;gBAC1D,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,IAAI,YAAY,CAAC;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,WAAW,EAAE,CAAC;oBACpB,cAAc,GAAG,IAAI,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,mBAAmB,CAC3B,kEAAkE,CACnE,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,UAAU;oBAC7B,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI;oBACjC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBAEnC,IAAI,WAAW,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBACzC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,cAAc,CACtB,4CAA4C,EAC5C,YAAY,CACb,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,IAAI,QAAQ,CACxB,iBAAiB,YAAY,EAAE,EAC/B,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;gBAEF,IAAI,WAAW,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBACzC,SAAS,GAAG,KAAK,CAAC;oBAClB,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;oBAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IACE,GAAG,YAAY,mBAAmB;gBAClC,GAAG,YAAY,cAAc;gBAC7B,CAAC,GAAG,YAAY,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAC3C,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC7C,SAAS,GAAG,GAAG,CAAC;gBAChB,IAAI,WAAW,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;oBAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACzB,SAAS,GAAG,GAAG,CAAC;gBAChB,IAAI,WAAW,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;oBAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;YACH,CAAC;YAED,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,QAAQ,CAAC,8BAA8B,CAAC,CAAC;AAClE,CAAC"}