@investment-finder/api-contract 0.4.0 → 0.6.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 (79) hide show
  1. package/dist/admin.d.ts +1305 -1
  2. package/dist/admin.d.ts.map +1 -1
  3. package/dist/admin.js +575 -1
  4. package/dist/admin.js.map +1 -1
  5. package/dist/authenticated-market.d.ts +170 -0
  6. package/dist/authenticated-market.d.ts.map +1 -0
  7. package/dist/authenticated-market.js +27 -0
  8. package/dist/authenticated-market.js.map +1 -0
  9. package/dist/broker.d.ts +89 -0
  10. package/dist/broker.d.ts.map +1 -0
  11. package/dist/broker.js +53 -0
  12. package/dist/broker.js.map +1 -0
  13. package/dist/diagnostics.d.ts +11 -29
  14. package/dist/diagnostics.d.ts.map +1 -1
  15. package/dist/diagnostics.js +6 -25
  16. package/dist/diagnostics.js.map +1 -1
  17. package/dist/discovery-flow.d.ts +945 -0
  18. package/dist/discovery-flow.d.ts.map +1 -0
  19. package/dist/discovery-flow.js +336 -0
  20. package/dist/discovery-flow.js.map +1 -0
  21. package/dist/error-catalog.en.json +322 -0
  22. package/dist/error-codes.d.ts +84 -0
  23. package/dist/error-codes.d.ts.map +1 -0
  24. package/dist/error-codes.js +87 -0
  25. package/dist/error-codes.js.map +1 -0
  26. package/dist/errors.d.ts +24 -2
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +48 -9
  29. package/dist/errors.js.map +1 -1
  30. package/dist/index.d.ts +18 -8
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +276 -4
  33. package/dist/index.js.map +1 -1
  34. package/dist/market-edition-slug.d.ts +22 -0
  35. package/dist/market-edition-slug.d.ts.map +1 -0
  36. package/dist/market-edition-slug.js +54 -0
  37. package/dist/market-edition-slug.js.map +1 -0
  38. package/dist/market.d.ts +911 -4
  39. package/dist/market.d.ts.map +1 -1
  40. package/dist/market.js +239 -4
  41. package/dist/market.js.map +1 -1
  42. package/dist/onboarding.d.ts +2 -2
  43. package/dist/portfolio-breakdown.d.ts +182 -0
  44. package/dist/portfolio-breakdown.d.ts.map +1 -0
  45. package/dist/portfolio-breakdown.js +76 -0
  46. package/dist/portfolio-breakdown.js.map +1 -0
  47. package/dist/portfolios.d.ts +456 -4
  48. package/dist/portfolios.d.ts.map +1 -1
  49. package/dist/portfolios.js +136 -4
  50. package/dist/portfolios.js.map +1 -1
  51. package/dist/proposals.d.ts +1322 -2
  52. package/dist/proposals.d.ts.map +1 -1
  53. package/dist/proposals.js +267 -5
  54. package/dist/proposals.js.map +1 -1
  55. package/dist/public-market.d.ts +314 -0
  56. package/dist/public-market.d.ts.map +1 -0
  57. package/dist/public-market.js +132 -0
  58. package/dist/public-market.js.map +1 -0
  59. package/dist/replay.d.ts +1382 -0
  60. package/dist/replay.d.ts.map +1 -0
  61. package/dist/replay.js +369 -0
  62. package/dist/replay.js.map +1 -0
  63. package/dist/settings.d.ts +79 -6
  64. package/dist/settings.d.ts.map +1 -1
  65. package/dist/settings.js +19 -1
  66. package/dist/settings.js.map +1 -1
  67. package/dist/theses.d.ts +305 -0
  68. package/dist/theses.d.ts.map +1 -0
  69. package/dist/theses.js +75 -0
  70. package/dist/theses.js.map +1 -0
  71. package/dist/universe.d.ts +117 -0
  72. package/dist/universe.d.ts.map +1 -0
  73. package/dist/universe.js +57 -0
  74. package/dist/universe.js.map +1 -0
  75. package/dist/watchlist.d.ts +105 -0
  76. package/dist/watchlist.d.ts.map +1 -1
  77. package/dist/watchlist.js +28 -1
  78. package/dist/watchlist.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,322 @@
1
+ {
2
+ "VALIDATION_FAILED": {
3
+ "status": 400,
4
+ "message": "Request validation failed"
5
+ },
6
+ "INTERNAL_ERROR": {
7
+ "status": 500,
8
+ "message": "Internal server error"
9
+ },
10
+ "UNMAPPED_ERROR": {
11
+ "status": 400,
12
+ "message": "{message}"
13
+ },
14
+ "RESOURCE_ACCESS_DENIED": {
15
+ "status": 403,
16
+ "message": "Access denied"
17
+ },
18
+ "AUTH_MISSING_BEARER_TOKEN": {
19
+ "status": 401,
20
+ "message": "Missing bearer token"
21
+ },
22
+ "AUTH_MISSING_SESSION_USER": {
23
+ "status": 401,
24
+ "message": "Missing session user"
25
+ },
26
+ "AUTH_INVALID_OR_EXPIRED_SESSION": {
27
+ "status": 401,
28
+ "message": "Invalid or expired session"
29
+ },
30
+ "AUTH_SESSION_SECRET_NOT_CONFIGURED": {
31
+ "status": 401,
32
+ "message": "Session secret is not configured"
33
+ },
34
+ "AUTH_OWNER_CHAT_ID_NOT_CONFIGURED": {
35
+ "status": 403,
36
+ "message": "Owner chat id is not configured"
37
+ },
38
+ "AUTH_OWNER_ACCESS_REQUIRED": {
39
+ "status": 403,
40
+ "message": "Owner access required"
41
+ },
42
+ "AUTH_TOO_MANY_LOGIN_CODE_REQUESTS": {
43
+ "status": 400,
44
+ "message": "Too many login code requests"
45
+ },
46
+ "AUTH_NO_ACCOUNT_FOR_CHAT_ID": {
47
+ "status": 404,
48
+ "message": "No account found for this Telegram chat id"
49
+ },
50
+ "AUTH_TOO_MANY_VERIFICATION_ATTEMPTS": {
51
+ "status": 400,
52
+ "message": "Too many verification attempts"
53
+ },
54
+ "AUTH_LOGIN_CODE_EXPIRED_OR_MISSING": {
55
+ "status": 401,
56
+ "message": "Login code expired or missing"
57
+ },
58
+ "AUTH_INVALID_LOGIN_CODE": {
59
+ "status": 401,
60
+ "message": "Invalid login code"
61
+ },
62
+ "AUTH_SESSION_USER_NOT_FOUND": {
63
+ "status": 401,
64
+ "message": "Session user not found"
65
+ },
66
+ "AUTH_INVALID_CHAT_ID": {
67
+ "status": 400,
68
+ "message": "Invalid chat id"
69
+ },
70
+ "ONBOARDING_GATE_BLOCKED": {
71
+ "status": 403,
72
+ "message": "Onboarding gate blocked"
73
+ },
74
+ "PROPOSAL_PORTFOLIO_ID_REQUIRED": {
75
+ "status": 400,
76
+ "message": "portfolioId is required when scope is mine"
77
+ },
78
+ "PROPOSAL_NOT_FOUND": {
79
+ "status": 404,
80
+ "message": "Proposal {proposalId} not found"
81
+ },
82
+ "PROPOSAL_UNEXPECTED_STATE": {
83
+ "status": 409,
84
+ "message": "Proposal {proposalId} is {state}; expected {expectedState}"
85
+ },
86
+ "PROPOSAL_ARM_FAILED": {
87
+ "status": 409,
88
+ "message": "Could not arm proposal #{proposalId}: {reason}"
89
+ },
90
+ "PROPOSAL_CRISIS_MODE_BLOCKED": {
91
+ "status": 403,
92
+ "message": "System is in CRISIS mode; execution is blocked"
93
+ },
94
+ "PROPOSAL_SHORTS_DISABLED": {
95
+ "status": 403,
96
+ "message": "Short positions are disabled"
97
+ },
98
+ "PROPOSAL_INVALID_STATE": {
99
+ "status": 409,
100
+ "message": "Invalid state transition for proposal {proposalId}: {fromState} -> {toState}"
101
+ },
102
+ "PROPOSAL_FIT_EXECUTED_STICKY": {
103
+ "status": 409,
104
+ "message": "Proposal {proposalId} already executed for portfolio {portfolioId}"
105
+ },
106
+ "PROPOSAL_PORTFOLIO_PAUSED": {
107
+ "status": 403,
108
+ "message": "Transition to {attemptedState} blocked: portfolio paused"
109
+ },
110
+ "PROPOSAL_SCALE_ORDERS_NOT_FOUND": {
111
+ "status": 404,
112
+ "message": "No working scale orders for proposal {proposalId} in portfolio {portfolioId}"
113
+ },
114
+ "PORTFOLIO_NOT_FOUND": {
115
+ "status": 404,
116
+ "message": "Portfolio {portfolioId} not found"
117
+ },
118
+ "PORTFOLIO_MUST_BE_USER": {
119
+ "status": 403,
120
+ "message": "Portfolio must be a USER portfolio"
121
+ },
122
+ "PORTFOLIO_ARCHIVED": {
123
+ "status": 403,
124
+ "message": "Portfolio is archived"
125
+ },
126
+ "PORTFOLIO_LINKED_READ_ONLY_EXECUTE": {
127
+ "status": 400,
128
+ "message": "Linked brokerage portfolios are read-only; execute into a managed portfolio instead"
129
+ },
130
+ "PORTFOLIO_LINKED_READ_ONLY_WRITES": {
131
+ "status": 400,
132
+ "message": "Linked brokerage portfolios are read-only; seed, cash edits, and local writes are not allowed"
133
+ },
134
+ "PORTFOLIO_LINKED_READ_ONLY_COPY": {
135
+ "status": 400,
136
+ "message": "Linked brokerage portfolios are read-only; copy into a managed portfolio instead"
137
+ },
138
+ "PORTFOLIO_SYSTEM_MUTATION_FORBIDDEN": {
139
+ "status": 403,
140
+ "message": "SYSTEM book positions cannot be mutated via user portfolio APIs"
141
+ },
142
+ "PORTFOLIO_MARGIN_DISABLED": {
143
+ "status": 403,
144
+ "message": "Margin is disabled"
145
+ },
146
+ "PORTFOLIO_POSITION_ALREADY_OPEN": {
147
+ "status": 400,
148
+ "message": "Open position already exists for {ticker}"
149
+ },
150
+ "PORTFOLIO_CLOSE_SHARES_EXCEED": {
151
+ "status": 400,
152
+ "message": "shares ({shares}) exceeds open size ({size})"
153
+ },
154
+ "PORTFOLIO_OPEN_POSITION_NOT_FOUND": {
155
+ "status": 404,
156
+ "message": "Open position {positionId} not found in portfolio {portfolioId}"
157
+ },
158
+ "PORTFOLIO_POSITION_NOT_FOUND": {
159
+ "status": 404,
160
+ "message": "Position {positionId} not found"
161
+ },
162
+ "PORTFOLIO_NO_LIVE_QUOTE": {
163
+ "status": 400,
164
+ "message": "No live quote available for {ticker}"
165
+ },
166
+ "PORTFOLIO_NO_ACTIVE_USER": {
167
+ "status": 400,
168
+ "message": "No active USER portfolio found"
169
+ },
170
+ "PORTFOLIO_NAME_EMPTY": {
171
+ "status": 400,
172
+ "message": "Portfolio name cannot be empty"
173
+ },
174
+ "PORTFOLIO_NAME_TOO_LONG": {
175
+ "status": 400,
176
+ "message": "Portfolio name must be 60 characters or fewer"
177
+ },
178
+ "PORTFOLIO_NAME_DUPLICATE": {
179
+ "status": 400,
180
+ "message": "You already have an active portfolio named {name}"
181
+ },
182
+ "PORTFOLIO_ARCHIVED_DEFAULT": {
183
+ "status": 400,
184
+ "message": "Cannot set an archived portfolio as default. Unarchive it first."
185
+ },
186
+ "PORTFOLIO_SYSTEM_KIND_EDIT": {
187
+ "status": 400,
188
+ "message": "Portfolio {portfolioId} is a SYSTEM portfolio and cannot be edited"
189
+ },
190
+ "POSITION_ALREADY_OPEN": {
191
+ "status": 409,
192
+ "message": "Position for {ticker} is already OPEN"
193
+ },
194
+ "POSITION_NO_CURRENT_PRICE": {
195
+ "status": 409,
196
+ "message": "No current market price available for {ticker}"
197
+ },
198
+ "MARKET_QUOTE_NOT_FOUND": {
199
+ "status": 404,
200
+ "message": "Could not fetch quote for {ticker}"
201
+ },
202
+ "MARKET_TICKER_REQUIRED": {
203
+ "status": 404,
204
+ "message": "Ticker is required"
205
+ },
206
+ "MARKET_BRIEF_NO_PAYLOAD": {
207
+ "status": 404,
208
+ "message": "Brief {slug} has no renderable payload"
209
+ },
210
+ "MARKET_NEWSLETTER_NO_PAYLOAD": {
211
+ "status": 404,
212
+ "message": "Newsletter {slug} has no renderable payload"
213
+ },
214
+ "MARKET_BRIEF_NOT_FOUND": {
215
+ "status": 404,
216
+ "message": "Brief {slug} not found"
217
+ },
218
+ "MARKET_NEWSLETTER_NOT_FOUND": {
219
+ "status": 404,
220
+ "message": "Newsletter {slug} not found"
221
+ },
222
+ "MARKET_INVALID_SLUG": {
223
+ "status": 400,
224
+ "message": "Invalid {kind} slug: {slug}"
225
+ },
226
+ "MARKET_NEWSLETTER_BRIEF_NOT_READY": {
227
+ "status": 400,
228
+ "message": "Newsletter build skipped — underlying brief is not ready."
229
+ },
230
+ "SYSTEM_PORTFOLIO_VALIDATION": {
231
+ "status": 400,
232
+ "message": "SYSTEM book request is invalid"
233
+ },
234
+ "WATCHLIST_TICKER_EMPTY": {
235
+ "status": 400,
236
+ "message": "Ticker cannot be empty"
237
+ },
238
+ "WATCHLIST_TICKER_UNVERIFIED": {
239
+ "status": 400,
240
+ "message": "Could not verify ticker {ticker}"
241
+ },
242
+ "WATCHLIST_ITEM_NOT_FOUND": {
243
+ "status": 404,
244
+ "message": "Watchlist item {ticker} not found"
245
+ },
246
+ "DISCOVERY_CANDIDATE_NOT_FOUND": {
247
+ "status": 404,
248
+ "message": "Discovery candidate {candidateId} not found"
249
+ },
250
+ "DISCOVERY_UNKNOWN_FACTORY_STATION": {
251
+ "status": 400,
252
+ "message": "Unknown factory station {station}"
253
+ },
254
+ "BROKER_CONNECTION_NOT_FOUND": {
255
+ "status": 404,
256
+ "message": "Broker connection not found"
257
+ },
258
+ "BROKER_ACCOUNT_NOT_FOUND": {
259
+ "status": 404,
260
+ "message": "Brokerage account not found"
261
+ },
262
+ "BROKER_ACCOUNT_ALREADY_LINKED": {
263
+ "status": 400,
264
+ "message": "That brokerage account is already linked"
265
+ },
266
+ "SECTOR_THESIS_NOT_FOUND": {
267
+ "status": 404,
268
+ "message": "Sector thesis {thesisId} not found"
269
+ },
270
+ "SECTOR_THESIS_ALREADY_CLOSED": {
271
+ "status": 400,
272
+ "message": "Sector thesis {thesisId} is already closed"
273
+ },
274
+ "THESIS_CANDIDATE_NOT_FOUND": {
275
+ "status": 404,
276
+ "message": "Thesis candidate {candidateId} not found"
277
+ },
278
+ "HOLD_THESIS_NOT_FOUND": {
279
+ "status": 404,
280
+ "message": "Hold thesis {thesisId} not found"
281
+ },
282
+ "HOLD_THESIS_ALREADY_CLOSED": {
283
+ "status": 400,
284
+ "message": "Hold thesis {thesisId} is already closed"
285
+ },
286
+ "REPLAY_RUN_NOT_FOUND": {
287
+ "status": 404,
288
+ "message": "Replay run {runKey} not found"
289
+ },
290
+ "REPLAY_RUN_BUSY": {
291
+ "status": 409,
292
+ "message": "A replay walk is already in progress for {inFlightRunKey}"
293
+ },
294
+ "REPLAY_DAY_NOT_FOUND": {
295
+ "status": 404,
296
+ "message": "Replay day {sessionDate} not found for run {runKey}"
297
+ },
298
+ "REPLAY_LIVE_LLM_REFUSED": {
299
+ "status": 400,
300
+ "message": "Default replay refuses live model and prompt comparison. Turn on a spend-capped live experiment."
301
+ },
302
+ "TUNE_JOB_NOT_FOUND": {
303
+ "status": 404,
304
+ "message": "Tune job {jobKey} not found"
305
+ },
306
+ "TUNE_JOB_NOT_READY": {
307
+ "status": 409,
308
+ "message": "Tune job {jobKey} is not ready to apply"
309
+ },
310
+ "TUNE_JOB_ALREADY_APPLIED": {
311
+ "status": 409,
312
+ "message": "Tune job {jobKey} was already applied"
313
+ },
314
+ "TUNE_JOB_BUSY": {
315
+ "status": 409,
316
+ "message": "A Goal Run is already in progress for {inFlightJobKey}"
317
+ },
318
+ "TUNE_CATALOG_TOO_SMALL": {
319
+ "status": 400,
320
+ "message": "The market-time catalog is empty. Archive SPY/QQQ bars first."
321
+ }
322
+ }
@@ -0,0 +1,84 @@
1
+ export declare enum ApiErrorCodeEnum {
2
+ VALIDATION_FAILED = "VALIDATION_FAILED",
3
+ INTERNAL_ERROR = "INTERNAL_ERROR",
4
+ UNMAPPED_ERROR = "UNMAPPED_ERROR",
5
+ RESOURCE_ACCESS_DENIED = "RESOURCE_ACCESS_DENIED",
6
+ AUTH_MISSING_BEARER_TOKEN = "AUTH_MISSING_BEARER_TOKEN",
7
+ AUTH_MISSING_SESSION_USER = "AUTH_MISSING_SESSION_USER",
8
+ AUTH_INVALID_OR_EXPIRED_SESSION = "AUTH_INVALID_OR_EXPIRED_SESSION",
9
+ AUTH_SESSION_SECRET_NOT_CONFIGURED = "AUTH_SESSION_SECRET_NOT_CONFIGURED",
10
+ AUTH_OWNER_CHAT_ID_NOT_CONFIGURED = "AUTH_OWNER_CHAT_ID_NOT_CONFIGURED",
11
+ AUTH_OWNER_ACCESS_REQUIRED = "AUTH_OWNER_ACCESS_REQUIRED",
12
+ AUTH_TOO_MANY_LOGIN_CODE_REQUESTS = "AUTH_TOO_MANY_LOGIN_CODE_REQUESTS",
13
+ AUTH_NO_ACCOUNT_FOR_CHAT_ID = "AUTH_NO_ACCOUNT_FOR_CHAT_ID",
14
+ AUTH_TOO_MANY_VERIFICATION_ATTEMPTS = "AUTH_TOO_MANY_VERIFICATION_ATTEMPTS",
15
+ AUTH_LOGIN_CODE_EXPIRED_OR_MISSING = "AUTH_LOGIN_CODE_EXPIRED_OR_MISSING",
16
+ AUTH_INVALID_LOGIN_CODE = "AUTH_INVALID_LOGIN_CODE",
17
+ AUTH_SESSION_USER_NOT_FOUND = "AUTH_SESSION_USER_NOT_FOUND",
18
+ AUTH_INVALID_CHAT_ID = "AUTH_INVALID_CHAT_ID",
19
+ ONBOARDING_GATE_BLOCKED = "ONBOARDING_GATE_BLOCKED",
20
+ PROPOSAL_PORTFOLIO_ID_REQUIRED = "PROPOSAL_PORTFOLIO_ID_REQUIRED",
21
+ PROPOSAL_NOT_FOUND = "PROPOSAL_NOT_FOUND",
22
+ PROPOSAL_UNEXPECTED_STATE = "PROPOSAL_UNEXPECTED_STATE",
23
+ PROPOSAL_ARM_FAILED = "PROPOSAL_ARM_FAILED",
24
+ PROPOSAL_CRISIS_MODE_BLOCKED = "PROPOSAL_CRISIS_MODE_BLOCKED",
25
+ PROPOSAL_SHORTS_DISABLED = "PROPOSAL_SHORTS_DISABLED",
26
+ PROPOSAL_INVALID_STATE = "PROPOSAL_INVALID_STATE",
27
+ PROPOSAL_FIT_EXECUTED_STICKY = "PROPOSAL_FIT_EXECUTED_STICKY",
28
+ PROPOSAL_PORTFOLIO_PAUSED = "PROPOSAL_PORTFOLIO_PAUSED",
29
+ PROPOSAL_SCALE_ORDERS_NOT_FOUND = "PROPOSAL_SCALE_ORDERS_NOT_FOUND",
30
+ PORTFOLIO_NOT_FOUND = "PORTFOLIO_NOT_FOUND",
31
+ PORTFOLIO_MUST_BE_USER = "PORTFOLIO_MUST_BE_USER",
32
+ PORTFOLIO_ARCHIVED = "PORTFOLIO_ARCHIVED",
33
+ PORTFOLIO_LINKED_READ_ONLY_EXECUTE = "PORTFOLIO_LINKED_READ_ONLY_EXECUTE",
34
+ PORTFOLIO_LINKED_READ_ONLY_WRITES = "PORTFOLIO_LINKED_READ_ONLY_WRITES",
35
+ PORTFOLIO_LINKED_READ_ONLY_COPY = "PORTFOLIO_LINKED_READ_ONLY_COPY",
36
+ PORTFOLIO_SYSTEM_MUTATION_FORBIDDEN = "PORTFOLIO_SYSTEM_MUTATION_FORBIDDEN",
37
+ PORTFOLIO_MARGIN_DISABLED = "PORTFOLIO_MARGIN_DISABLED",
38
+ PORTFOLIO_POSITION_ALREADY_OPEN = "PORTFOLIO_POSITION_ALREADY_OPEN",
39
+ PORTFOLIO_CLOSE_SHARES_EXCEED = "PORTFOLIO_CLOSE_SHARES_EXCEED",
40
+ PORTFOLIO_OPEN_POSITION_NOT_FOUND = "PORTFOLIO_OPEN_POSITION_NOT_FOUND",
41
+ PORTFOLIO_POSITION_NOT_FOUND = "PORTFOLIO_POSITION_NOT_FOUND",
42
+ PORTFOLIO_NO_LIVE_QUOTE = "PORTFOLIO_NO_LIVE_QUOTE",
43
+ PORTFOLIO_NO_ACTIVE_USER = "PORTFOLIO_NO_ACTIVE_USER",
44
+ PORTFOLIO_NAME_EMPTY = "PORTFOLIO_NAME_EMPTY",
45
+ PORTFOLIO_NAME_TOO_LONG = "PORTFOLIO_NAME_TOO_LONG",
46
+ PORTFOLIO_NAME_DUPLICATE = "PORTFOLIO_NAME_DUPLICATE",
47
+ PORTFOLIO_ARCHIVED_DEFAULT = "PORTFOLIO_ARCHIVED_DEFAULT",
48
+ PORTFOLIO_SYSTEM_KIND_EDIT = "PORTFOLIO_SYSTEM_KIND_EDIT",
49
+ POSITION_ALREADY_OPEN = "POSITION_ALREADY_OPEN",
50
+ POSITION_NO_CURRENT_PRICE = "POSITION_NO_CURRENT_PRICE",
51
+ MARKET_QUOTE_NOT_FOUND = "MARKET_QUOTE_NOT_FOUND",
52
+ MARKET_TICKER_REQUIRED = "MARKET_TICKER_REQUIRED",
53
+ MARKET_BRIEF_NO_PAYLOAD = "MARKET_BRIEF_NO_PAYLOAD",
54
+ MARKET_NEWSLETTER_NO_PAYLOAD = "MARKET_NEWSLETTER_NO_PAYLOAD",
55
+ MARKET_BRIEF_NOT_FOUND = "MARKET_BRIEF_NOT_FOUND",
56
+ MARKET_NEWSLETTER_NOT_FOUND = "MARKET_NEWSLETTER_NOT_FOUND",
57
+ MARKET_INVALID_SLUG = "MARKET_INVALID_SLUG",
58
+ MARKET_NEWSLETTER_BRIEF_NOT_READY = "MARKET_NEWSLETTER_BRIEF_NOT_READY",
59
+ SYSTEM_PORTFOLIO_VALIDATION = "SYSTEM_PORTFOLIO_VALIDATION",
60
+ WATCHLIST_TICKER_EMPTY = "WATCHLIST_TICKER_EMPTY",
61
+ WATCHLIST_TICKER_UNVERIFIED = "WATCHLIST_TICKER_UNVERIFIED",
62
+ WATCHLIST_ITEM_NOT_FOUND = "WATCHLIST_ITEM_NOT_FOUND",
63
+ DISCOVERY_CANDIDATE_NOT_FOUND = "DISCOVERY_CANDIDATE_NOT_FOUND",
64
+ DISCOVERY_UNKNOWN_FACTORY_STATION = "DISCOVERY_UNKNOWN_FACTORY_STATION",
65
+ BROKER_CONNECTION_NOT_FOUND = "BROKER_CONNECTION_NOT_FOUND",
66
+ BROKER_ACCOUNT_NOT_FOUND = "BROKER_ACCOUNT_NOT_FOUND",
67
+ BROKER_ACCOUNT_ALREADY_LINKED = "BROKER_ACCOUNT_ALREADY_LINKED",
68
+ SECTOR_THESIS_NOT_FOUND = "SECTOR_THESIS_NOT_FOUND",
69
+ SECTOR_THESIS_ALREADY_CLOSED = "SECTOR_THESIS_ALREADY_CLOSED",
70
+ THESIS_CANDIDATE_NOT_FOUND = "THESIS_CANDIDATE_NOT_FOUND",
71
+ HOLD_THESIS_NOT_FOUND = "HOLD_THESIS_NOT_FOUND",
72
+ HOLD_THESIS_ALREADY_CLOSED = "HOLD_THESIS_ALREADY_CLOSED",
73
+ REPLAY_RUN_NOT_FOUND = "REPLAY_RUN_NOT_FOUND",
74
+ REPLAY_RUN_BUSY = "REPLAY_RUN_BUSY",
75
+ REPLAY_DAY_NOT_FOUND = "REPLAY_DAY_NOT_FOUND",
76
+ REPLAY_LIVE_LLM_REFUSED = "REPLAY_LIVE_LLM_REFUSED",
77
+ TUNE_JOB_NOT_FOUND = "TUNE_JOB_NOT_FOUND",
78
+ TUNE_JOB_NOT_READY = "TUNE_JOB_NOT_READY",
79
+ TUNE_JOB_ALREADY_APPLIED = "TUNE_JOB_ALREADY_APPLIED",
80
+ TUNE_JOB_BUSY = "TUNE_JOB_BUSY",
81
+ TUNE_CATALOG_TOO_SMALL = "TUNE_CATALOG_TOO_SMALL"
82
+ }
83
+ export type IApiErrorParams = Record<string, string | number | boolean>;
84
+ //# sourceMappingURL=error-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../src/error-codes.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,sBAAsB,2BAA2B;IAEjD,yBAAyB,8BAA8B;IACvD,yBAAyB,8BAA8B;IACvD,+BAA+B,oCAAoC;IACnE,kCAAkC,uCAAuC;IACzE,iCAAiC,sCAAsC;IACvE,0BAA0B,+BAA+B;IACzD,iCAAiC,sCAAsC;IACvE,2BAA2B,gCAAgC;IAC3D,mCAAmC,wCAAwC;IAC3E,kCAAkC,uCAAuC;IACzE,uBAAuB,4BAA4B;IACnD,2BAA2B,gCAAgC;IAC3D,oBAAoB,yBAAyB;IAE7C,uBAAuB,4BAA4B;IAEnD,8BAA8B,mCAAmC;IACjE,kBAAkB,uBAAuB;IACzC,yBAAyB,8BAA8B;IACvD,mBAAmB,wBAAwB;IAC3C,4BAA4B,iCAAiC;IAC7D,wBAAwB,6BAA6B;IACrD,sBAAsB,2BAA2B;IACjD,4BAA4B,iCAAiC;IAC7D,yBAAyB,8BAA8B;IACvD,+BAA+B,oCAAoC;IAEnE,mBAAmB,wBAAwB;IAC3C,sBAAsB,2BAA2B;IACjD,kBAAkB,uBAAuB;IACzC,kCAAkC,uCAAuC;IACzE,iCAAiC,sCAAsC;IACvE,+BAA+B,oCAAoC;IACnE,mCAAmC,wCAAwC;IAC3E,yBAAyB,8BAA8B;IACvD,+BAA+B,oCAAoC;IACnE,6BAA6B,kCAAkC;IAC/D,iCAAiC,sCAAsC;IACvE,4BAA4B,iCAAiC;IAC7D,uBAAuB,4BAA4B;IACnD,wBAAwB,6BAA6B;IACrD,oBAAoB,yBAAyB;IAC7C,uBAAuB,4BAA4B;IACnD,wBAAwB,6BAA6B;IACrD,0BAA0B,+BAA+B;IACzD,0BAA0B,+BAA+B;IAEzD,qBAAqB,0BAA0B;IAC/C,yBAAyB,8BAA8B;IAEvD,sBAAsB,2BAA2B;IACjD,sBAAsB,2BAA2B;IACjD,uBAAuB,4BAA4B;IACnD,4BAA4B,iCAAiC;IAC7D,sBAAsB,2BAA2B;IACjD,2BAA2B,gCAAgC;IAC3D,mBAAmB,wBAAwB;IAC3C,iCAAiC,sCAAsC;IACvE,2BAA2B,gCAAgC;IAE3D,sBAAsB,2BAA2B;IACjD,2BAA2B,gCAAgC;IAC3D,wBAAwB,6BAA6B;IAErD,6BAA6B,kCAAkC;IAC/D,iCAAiC,sCAAsC;IAEvE,2BAA2B,gCAAgC;IAC3D,wBAAwB,6BAA6B;IACrD,6BAA6B,kCAAkC;IAE/D,uBAAuB,4BAA4B;IACnD,4BAA4B,iCAAiC;IAC7D,0BAA0B,+BAA+B;IACzD,qBAAqB,0BAA0B;IAC/C,0BAA0B,+BAA+B;IAEzD,oBAAoB,yBAAyB;IAC7C,eAAe,oBAAoB;IACnC,oBAAoB,yBAAyB;IAC7C,uBAAuB,4BAA4B;IAEnD,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,wBAAwB,6BAA6B;IACrD,aAAa,kBAAkB;IAC/B,sBAAsB,2BAA2B;CAClD;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiErrorCodeEnum = void 0;
4
+ var ApiErrorCodeEnum;
5
+ (function (ApiErrorCodeEnum) {
6
+ ApiErrorCodeEnum["VALIDATION_FAILED"] = "VALIDATION_FAILED";
7
+ ApiErrorCodeEnum["INTERNAL_ERROR"] = "INTERNAL_ERROR";
8
+ ApiErrorCodeEnum["UNMAPPED_ERROR"] = "UNMAPPED_ERROR";
9
+ ApiErrorCodeEnum["RESOURCE_ACCESS_DENIED"] = "RESOURCE_ACCESS_DENIED";
10
+ ApiErrorCodeEnum["AUTH_MISSING_BEARER_TOKEN"] = "AUTH_MISSING_BEARER_TOKEN";
11
+ ApiErrorCodeEnum["AUTH_MISSING_SESSION_USER"] = "AUTH_MISSING_SESSION_USER";
12
+ ApiErrorCodeEnum["AUTH_INVALID_OR_EXPIRED_SESSION"] = "AUTH_INVALID_OR_EXPIRED_SESSION";
13
+ ApiErrorCodeEnum["AUTH_SESSION_SECRET_NOT_CONFIGURED"] = "AUTH_SESSION_SECRET_NOT_CONFIGURED";
14
+ ApiErrorCodeEnum["AUTH_OWNER_CHAT_ID_NOT_CONFIGURED"] = "AUTH_OWNER_CHAT_ID_NOT_CONFIGURED";
15
+ ApiErrorCodeEnum["AUTH_OWNER_ACCESS_REQUIRED"] = "AUTH_OWNER_ACCESS_REQUIRED";
16
+ ApiErrorCodeEnum["AUTH_TOO_MANY_LOGIN_CODE_REQUESTS"] = "AUTH_TOO_MANY_LOGIN_CODE_REQUESTS";
17
+ ApiErrorCodeEnum["AUTH_NO_ACCOUNT_FOR_CHAT_ID"] = "AUTH_NO_ACCOUNT_FOR_CHAT_ID";
18
+ ApiErrorCodeEnum["AUTH_TOO_MANY_VERIFICATION_ATTEMPTS"] = "AUTH_TOO_MANY_VERIFICATION_ATTEMPTS";
19
+ ApiErrorCodeEnum["AUTH_LOGIN_CODE_EXPIRED_OR_MISSING"] = "AUTH_LOGIN_CODE_EXPIRED_OR_MISSING";
20
+ ApiErrorCodeEnum["AUTH_INVALID_LOGIN_CODE"] = "AUTH_INVALID_LOGIN_CODE";
21
+ ApiErrorCodeEnum["AUTH_SESSION_USER_NOT_FOUND"] = "AUTH_SESSION_USER_NOT_FOUND";
22
+ ApiErrorCodeEnum["AUTH_INVALID_CHAT_ID"] = "AUTH_INVALID_CHAT_ID";
23
+ ApiErrorCodeEnum["ONBOARDING_GATE_BLOCKED"] = "ONBOARDING_GATE_BLOCKED";
24
+ ApiErrorCodeEnum["PROPOSAL_PORTFOLIO_ID_REQUIRED"] = "PROPOSAL_PORTFOLIO_ID_REQUIRED";
25
+ ApiErrorCodeEnum["PROPOSAL_NOT_FOUND"] = "PROPOSAL_NOT_FOUND";
26
+ ApiErrorCodeEnum["PROPOSAL_UNEXPECTED_STATE"] = "PROPOSAL_UNEXPECTED_STATE";
27
+ ApiErrorCodeEnum["PROPOSAL_ARM_FAILED"] = "PROPOSAL_ARM_FAILED";
28
+ ApiErrorCodeEnum["PROPOSAL_CRISIS_MODE_BLOCKED"] = "PROPOSAL_CRISIS_MODE_BLOCKED";
29
+ ApiErrorCodeEnum["PROPOSAL_SHORTS_DISABLED"] = "PROPOSAL_SHORTS_DISABLED";
30
+ ApiErrorCodeEnum["PROPOSAL_INVALID_STATE"] = "PROPOSAL_INVALID_STATE";
31
+ ApiErrorCodeEnum["PROPOSAL_FIT_EXECUTED_STICKY"] = "PROPOSAL_FIT_EXECUTED_STICKY";
32
+ ApiErrorCodeEnum["PROPOSAL_PORTFOLIO_PAUSED"] = "PROPOSAL_PORTFOLIO_PAUSED";
33
+ ApiErrorCodeEnum["PROPOSAL_SCALE_ORDERS_NOT_FOUND"] = "PROPOSAL_SCALE_ORDERS_NOT_FOUND";
34
+ ApiErrorCodeEnum["PORTFOLIO_NOT_FOUND"] = "PORTFOLIO_NOT_FOUND";
35
+ ApiErrorCodeEnum["PORTFOLIO_MUST_BE_USER"] = "PORTFOLIO_MUST_BE_USER";
36
+ ApiErrorCodeEnum["PORTFOLIO_ARCHIVED"] = "PORTFOLIO_ARCHIVED";
37
+ ApiErrorCodeEnum["PORTFOLIO_LINKED_READ_ONLY_EXECUTE"] = "PORTFOLIO_LINKED_READ_ONLY_EXECUTE";
38
+ ApiErrorCodeEnum["PORTFOLIO_LINKED_READ_ONLY_WRITES"] = "PORTFOLIO_LINKED_READ_ONLY_WRITES";
39
+ ApiErrorCodeEnum["PORTFOLIO_LINKED_READ_ONLY_COPY"] = "PORTFOLIO_LINKED_READ_ONLY_COPY";
40
+ ApiErrorCodeEnum["PORTFOLIO_SYSTEM_MUTATION_FORBIDDEN"] = "PORTFOLIO_SYSTEM_MUTATION_FORBIDDEN";
41
+ ApiErrorCodeEnum["PORTFOLIO_MARGIN_DISABLED"] = "PORTFOLIO_MARGIN_DISABLED";
42
+ ApiErrorCodeEnum["PORTFOLIO_POSITION_ALREADY_OPEN"] = "PORTFOLIO_POSITION_ALREADY_OPEN";
43
+ ApiErrorCodeEnum["PORTFOLIO_CLOSE_SHARES_EXCEED"] = "PORTFOLIO_CLOSE_SHARES_EXCEED";
44
+ ApiErrorCodeEnum["PORTFOLIO_OPEN_POSITION_NOT_FOUND"] = "PORTFOLIO_OPEN_POSITION_NOT_FOUND";
45
+ ApiErrorCodeEnum["PORTFOLIO_POSITION_NOT_FOUND"] = "PORTFOLIO_POSITION_NOT_FOUND";
46
+ ApiErrorCodeEnum["PORTFOLIO_NO_LIVE_QUOTE"] = "PORTFOLIO_NO_LIVE_QUOTE";
47
+ ApiErrorCodeEnum["PORTFOLIO_NO_ACTIVE_USER"] = "PORTFOLIO_NO_ACTIVE_USER";
48
+ ApiErrorCodeEnum["PORTFOLIO_NAME_EMPTY"] = "PORTFOLIO_NAME_EMPTY";
49
+ ApiErrorCodeEnum["PORTFOLIO_NAME_TOO_LONG"] = "PORTFOLIO_NAME_TOO_LONG";
50
+ ApiErrorCodeEnum["PORTFOLIO_NAME_DUPLICATE"] = "PORTFOLIO_NAME_DUPLICATE";
51
+ ApiErrorCodeEnum["PORTFOLIO_ARCHIVED_DEFAULT"] = "PORTFOLIO_ARCHIVED_DEFAULT";
52
+ ApiErrorCodeEnum["PORTFOLIO_SYSTEM_KIND_EDIT"] = "PORTFOLIO_SYSTEM_KIND_EDIT";
53
+ ApiErrorCodeEnum["POSITION_ALREADY_OPEN"] = "POSITION_ALREADY_OPEN";
54
+ ApiErrorCodeEnum["POSITION_NO_CURRENT_PRICE"] = "POSITION_NO_CURRENT_PRICE";
55
+ ApiErrorCodeEnum["MARKET_QUOTE_NOT_FOUND"] = "MARKET_QUOTE_NOT_FOUND";
56
+ ApiErrorCodeEnum["MARKET_TICKER_REQUIRED"] = "MARKET_TICKER_REQUIRED";
57
+ ApiErrorCodeEnum["MARKET_BRIEF_NO_PAYLOAD"] = "MARKET_BRIEF_NO_PAYLOAD";
58
+ ApiErrorCodeEnum["MARKET_NEWSLETTER_NO_PAYLOAD"] = "MARKET_NEWSLETTER_NO_PAYLOAD";
59
+ ApiErrorCodeEnum["MARKET_BRIEF_NOT_FOUND"] = "MARKET_BRIEF_NOT_FOUND";
60
+ ApiErrorCodeEnum["MARKET_NEWSLETTER_NOT_FOUND"] = "MARKET_NEWSLETTER_NOT_FOUND";
61
+ ApiErrorCodeEnum["MARKET_INVALID_SLUG"] = "MARKET_INVALID_SLUG";
62
+ ApiErrorCodeEnum["MARKET_NEWSLETTER_BRIEF_NOT_READY"] = "MARKET_NEWSLETTER_BRIEF_NOT_READY";
63
+ ApiErrorCodeEnum["SYSTEM_PORTFOLIO_VALIDATION"] = "SYSTEM_PORTFOLIO_VALIDATION";
64
+ ApiErrorCodeEnum["WATCHLIST_TICKER_EMPTY"] = "WATCHLIST_TICKER_EMPTY";
65
+ ApiErrorCodeEnum["WATCHLIST_TICKER_UNVERIFIED"] = "WATCHLIST_TICKER_UNVERIFIED";
66
+ ApiErrorCodeEnum["WATCHLIST_ITEM_NOT_FOUND"] = "WATCHLIST_ITEM_NOT_FOUND";
67
+ ApiErrorCodeEnum["DISCOVERY_CANDIDATE_NOT_FOUND"] = "DISCOVERY_CANDIDATE_NOT_FOUND";
68
+ ApiErrorCodeEnum["DISCOVERY_UNKNOWN_FACTORY_STATION"] = "DISCOVERY_UNKNOWN_FACTORY_STATION";
69
+ ApiErrorCodeEnum["BROKER_CONNECTION_NOT_FOUND"] = "BROKER_CONNECTION_NOT_FOUND";
70
+ ApiErrorCodeEnum["BROKER_ACCOUNT_NOT_FOUND"] = "BROKER_ACCOUNT_NOT_FOUND";
71
+ ApiErrorCodeEnum["BROKER_ACCOUNT_ALREADY_LINKED"] = "BROKER_ACCOUNT_ALREADY_LINKED";
72
+ ApiErrorCodeEnum["SECTOR_THESIS_NOT_FOUND"] = "SECTOR_THESIS_NOT_FOUND";
73
+ ApiErrorCodeEnum["SECTOR_THESIS_ALREADY_CLOSED"] = "SECTOR_THESIS_ALREADY_CLOSED";
74
+ ApiErrorCodeEnum["THESIS_CANDIDATE_NOT_FOUND"] = "THESIS_CANDIDATE_NOT_FOUND";
75
+ ApiErrorCodeEnum["HOLD_THESIS_NOT_FOUND"] = "HOLD_THESIS_NOT_FOUND";
76
+ ApiErrorCodeEnum["HOLD_THESIS_ALREADY_CLOSED"] = "HOLD_THESIS_ALREADY_CLOSED";
77
+ ApiErrorCodeEnum["REPLAY_RUN_NOT_FOUND"] = "REPLAY_RUN_NOT_FOUND";
78
+ ApiErrorCodeEnum["REPLAY_RUN_BUSY"] = "REPLAY_RUN_BUSY";
79
+ ApiErrorCodeEnum["REPLAY_DAY_NOT_FOUND"] = "REPLAY_DAY_NOT_FOUND";
80
+ ApiErrorCodeEnum["REPLAY_LIVE_LLM_REFUSED"] = "REPLAY_LIVE_LLM_REFUSED";
81
+ ApiErrorCodeEnum["TUNE_JOB_NOT_FOUND"] = "TUNE_JOB_NOT_FOUND";
82
+ ApiErrorCodeEnum["TUNE_JOB_NOT_READY"] = "TUNE_JOB_NOT_READY";
83
+ ApiErrorCodeEnum["TUNE_JOB_ALREADY_APPLIED"] = "TUNE_JOB_ALREADY_APPLIED";
84
+ ApiErrorCodeEnum["TUNE_JOB_BUSY"] = "TUNE_JOB_BUSY";
85
+ ApiErrorCodeEnum["TUNE_CATALOG_TOO_SMALL"] = "TUNE_CATALOG_TOO_SMALL";
86
+ })(ApiErrorCodeEnum || (exports.ApiErrorCodeEnum = ApiErrorCodeEnum = {}));
87
+ //# sourceMappingURL=error-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-codes.js","sourceRoot":"","sources":["../src/error-codes.ts"],"names":[],"mappings":";;;AAAA,IAAY,gBA6FX;AA7FD,WAAY,gBAAgB;IAC1B,2DAAuC,CAAA;IACvC,qDAAiC,CAAA;IACjC,qDAAiC,CAAA;IACjC,qEAAiD,CAAA;IAEjD,2EAAuD,CAAA;IACvD,2EAAuD,CAAA;IACvD,uFAAmE,CAAA;IACnE,6FAAyE,CAAA;IACzE,2FAAuE,CAAA;IACvE,6EAAyD,CAAA;IACzD,2FAAuE,CAAA;IACvE,+EAA2D,CAAA;IAC3D,+FAA2E,CAAA;IAC3E,6FAAyE,CAAA;IACzE,uEAAmD,CAAA;IACnD,+EAA2D,CAAA;IAC3D,iEAA6C,CAAA;IAE7C,uEAAmD,CAAA;IAEnD,qFAAiE,CAAA;IACjE,6DAAyC,CAAA;IACzC,2EAAuD,CAAA;IACvD,+DAA2C,CAAA;IAC3C,iFAA6D,CAAA;IAC7D,yEAAqD,CAAA;IACrD,qEAAiD,CAAA;IACjD,iFAA6D,CAAA;IAC7D,2EAAuD,CAAA;IACvD,uFAAmE,CAAA;IAEnE,+DAA2C,CAAA;IAC3C,qEAAiD,CAAA;IACjD,6DAAyC,CAAA;IACzC,6FAAyE,CAAA;IACzE,2FAAuE,CAAA;IACvE,uFAAmE,CAAA;IACnE,+FAA2E,CAAA;IAC3E,2EAAuD,CAAA;IACvD,uFAAmE,CAAA;IACnE,mFAA+D,CAAA;IAC/D,2FAAuE,CAAA;IACvE,iFAA6D,CAAA;IAC7D,uEAAmD,CAAA;IACnD,yEAAqD,CAAA;IACrD,iEAA6C,CAAA;IAC7C,uEAAmD,CAAA;IACnD,yEAAqD,CAAA;IACrD,6EAAyD,CAAA;IACzD,6EAAyD,CAAA;IAEzD,mEAA+C,CAAA;IAC/C,2EAAuD,CAAA;IAEvD,qEAAiD,CAAA;IACjD,qEAAiD,CAAA;IACjD,uEAAmD,CAAA;IACnD,iFAA6D,CAAA;IAC7D,qEAAiD,CAAA;IACjD,+EAA2D,CAAA;IAC3D,+DAA2C,CAAA;IAC3C,2FAAuE,CAAA;IACvE,+EAA2D,CAAA;IAE3D,qEAAiD,CAAA;IACjD,+EAA2D,CAAA;IAC3D,yEAAqD,CAAA;IAErD,mFAA+D,CAAA;IAC/D,2FAAuE,CAAA;IAEvE,+EAA2D,CAAA;IAC3D,yEAAqD,CAAA;IACrD,mFAA+D,CAAA;IAE/D,uEAAmD,CAAA;IACnD,iFAA6D,CAAA;IAC7D,6EAAyD,CAAA;IACzD,mEAA+C,CAAA;IAC/C,6EAAyD,CAAA;IAEzD,iEAA6C,CAAA;IAC7C,uDAAmC,CAAA;IACnC,iEAA6C,CAAA;IAC7C,uEAAmD,CAAA;IAEnD,6DAAyC,CAAA;IACzC,6DAAyC,CAAA;IACzC,yEAAqD,CAAA;IACrD,mDAA+B,CAAA;IAC/B,qEAAiD,CAAA;AACnD,CAAC,EA7FW,gBAAgB,gCAAhB,gBAAgB,QA6F3B"}
package/dist/errors.d.ts CHANGED
@@ -1,7 +1,29 @@
1
1
  import { z } from 'zod';
2
+ import { ApiErrorCodeEnum, type IApiErrorParams } from './error-codes.js';
3
+ export interface IApiErrorCatalogEntry {
4
+ status: number;
5
+ message: string;
6
+ }
7
+ /**
8
+ * Returns the English catalog row for an API error code.
9
+ */
10
+ export declare function getApiErrorCatalogEntry(code: ApiErrorCodeEnum): IApiErrorCatalogEntry;
11
+ /**
12
+ * HTTP status from the English catalog for an API error code.
13
+ */
14
+ export declare function getApiErrorStatus(code: ApiErrorCodeEnum): number;
15
+ /**
16
+ * Interpolates the English catalog template for logs and the API `message` field.
17
+ */
18
+ export declare function formatApiErrorMessage(code: ApiErrorCodeEnum, params?: IApiErrorParams): string;
19
+ export declare const ApiErrorParamsSchema: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
2
20
  export declare const ApiErrorBodySchema: z.ZodObject<{
3
- error: z.ZodOptional<z.ZodString>;
4
- message: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>;
21
+ errorCode: z.ZodEnum<typeof ApiErrorCodeEnum>;
22
+ message: z.ZodString;
23
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
24
+ statusCode: z.ZodOptional<z.ZodNumber>;
25
+ timestamp: z.ZodOptional<z.ZodString>;
26
+ path: z.ZodOptional<z.ZodString>;
5
27
  }, z.core.$strip>;
6
28
  export type ApiErrorBody = z.infer<typeof ApiErrorBodySchema>;
7
29
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;iBAO3B,CAAC;AAEL,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,gBAAgB,GACrB,qBAAqB,CAOvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,MAAM,CAAC,EAAE,eAAe,GACvB,MAAM,CAUR;AAED,eAAO,MAAM,oBAAoB,yFAGhC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;iBAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
package/dist/errors.js CHANGED
@@ -1,14 +1,53 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiErrorBodySchema = void 0;
6
+ exports.ApiErrorBodySchema = exports.ApiErrorParamsSchema = void 0;
7
+ exports.getApiErrorCatalogEntry = getApiErrorCatalogEntry;
8
+ exports.getApiErrorStatus = getApiErrorStatus;
9
+ exports.formatApiErrorMessage = formatApiErrorMessage;
4
10
  const zod_1 = require("zod");
5
- const NEST_ERROR_MESSAGE_SCHEMA = zod_1.z.union([zod_1.z.string(), zod_1.z.array(zod_1.z.string())]);
6
- exports.ApiErrorBodySchema = zod_1.z
7
- .object({
8
- error: zod_1.z.string().optional(),
9
- message: NEST_ERROR_MESSAGE_SCHEMA.optional(),
10
- })
11
- .refine((body) => body.error !== undefined || body.message !== undefined, {
12
- message: 'error or message is required',
11
+ const error_codes_js_1 = require("./error-codes.js");
12
+ const error_catalog_en_json_1 = __importDefault(require("./error-catalog.en.json"));
13
+ const CATALOG_PARAM_PATTERN = /\{([a-zA-Z0-9_]+)\}/g;
14
+ const catalog = error_catalog_en_json_1.default;
15
+ /**
16
+ * Returns the English catalog row for an API error code.
17
+ */
18
+ function getApiErrorCatalogEntry(code) {
19
+ const entry = catalog[code];
20
+ if (entry === undefined) {
21
+ throw new Error(`Missing API error catalog entry for ${code}`);
22
+ }
23
+ return entry;
24
+ }
25
+ /**
26
+ * HTTP status from the English catalog for an API error code.
27
+ */
28
+ function getApiErrorStatus(code) {
29
+ return getApiErrorCatalogEntry(code).status;
30
+ }
31
+ /**
32
+ * Interpolates the English catalog template for logs and the API `message` field.
33
+ */
34
+ function formatApiErrorMessage(code, params) {
35
+ const template = getApiErrorCatalogEntry(code).message;
36
+ if (params === undefined) {
37
+ return template;
38
+ }
39
+ return template.replace(CATALOG_PARAM_PATTERN, (placeholder, key) => {
40
+ const value = params[key];
41
+ return value === undefined ? placeholder : String(value);
42
+ });
43
+ }
44
+ exports.ApiErrorParamsSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean()]));
45
+ exports.ApiErrorBodySchema = zod_1.z.object({
46
+ errorCode: zod_1.z.enum(error_codes_js_1.ApiErrorCodeEnum),
47
+ message: zod_1.z.string(),
48
+ params: exports.ApiErrorParamsSchema.optional(),
49
+ statusCode: zod_1.z.number().optional(),
50
+ timestamp: zod_1.z.string().optional(),
51
+ path: zod_1.z.string().optional(),
13
52
  });
14
53
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,MAAM,yBAAyB,GAAG,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhE,QAAA,kBAAkB,GAAG,OAAC;KAChC,MAAM,CAAC;IACN,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE;CAC9C,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;IACxE,OAAO,EAAE,8BAA8B;CACxC,CAAC,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;;;;AAiBA,0DASC;AAKD,8CAEC;AAKD,sDAaC;AAnDD,6BAAwB;AAExB,qDAA0E;AAC1E,oFAAuD;AAOvD,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,+BAAyD,CAAC;AAE1E;;GAEG;AACH,SAAgB,uBAAuB,CACrC,IAAsB;IAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAsB;IACtD,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,IAAsB,EACtB,MAAwB;IAExB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IACvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,WAAW,EAAE,GAAW,EAAE,EAAE;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAC1C,OAAC,CAAC,MAAM,EAAE,EACV,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC/C,CAAC;AAEW,QAAA,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,SAAS,EAAE,OAAC,CAAC,IAAI,CAAC,iCAAgB,CAAC;IACnC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,4BAAoB,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC"}