@robosystems/client 0.2.49 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/extensions/InvestorClient.d.ts +98 -0
  2. package/extensions/InvestorClient.js +223 -0
  3. package/extensions/InvestorClient.ts +508 -0
  4. package/extensions/LedgerClient.d.ts +190 -309
  5. package/extensions/LedgerClient.js +268 -587
  6. package/extensions/LedgerClient.ts +784 -903
  7. package/extensions/ReportClient.d.ts +82 -113
  8. package/extensions/ReportClient.js +124 -211
  9. package/extensions/ReportClient.ts +305 -358
  10. package/extensions/config.d.ts +19 -0
  11. package/extensions/config.js +1 -1
  12. package/extensions/config.ts +22 -2
  13. package/extensions/graphql/client.d.ts +82 -0
  14. package/extensions/graphql/client.js +149 -0
  15. package/extensions/graphql/client.ts +189 -0
  16. package/extensions/graphql/generated/graphql.d.ts +1786 -0
  17. package/extensions/graphql/generated/graphql.js +2671 -0
  18. package/extensions/graphql/generated/graphql.ts +4491 -0
  19. package/extensions/graphql/queries/investor/holdings.d.ts +8 -0
  20. package/extensions/graphql/queries/investor/holdings.js +36 -0
  21. package/extensions/graphql/queries/investor/holdings.ts +34 -0
  22. package/extensions/graphql/queries/investor/portfolio.d.ts +4 -0
  23. package/extensions/graphql/queries/investor/portfolio.js +21 -0
  24. package/extensions/graphql/queries/investor/portfolio.ts +19 -0
  25. package/extensions/graphql/queries/investor/portfolios.d.ts +4 -0
  26. package/extensions/graphql/queries/investor/portfolios.js +29 -0
  27. package/extensions/graphql/queries/investor/portfolios.ts +27 -0
  28. package/extensions/graphql/queries/investor/position.d.ts +4 -0
  29. package/extensions/graphql/queries/investor/position.js +33 -0
  30. package/extensions/graphql/queries/investor/position.ts +31 -0
  31. package/extensions/graphql/queries/investor/positions.d.ts +8 -0
  32. package/extensions/graphql/queries/investor/positions.js +57 -0
  33. package/extensions/graphql/queries/investor/positions.ts +55 -0
  34. package/extensions/graphql/queries/investor/securities.d.ts +8 -0
  35. package/extensions/graphql/queries/investor/securities.js +50 -0
  36. package/extensions/graphql/queries/investor/securities.ts +48 -0
  37. package/extensions/graphql/queries/investor/security.d.ts +4 -0
  38. package/extensions/graphql/queries/investor/security.js +26 -0
  39. package/extensions/graphql/queries/investor/security.ts +24 -0
  40. package/extensions/graphql/queries/ledger/accountRollups.d.ts +7 -0
  41. package/extensions/graphql/queries/ledger/accountRollups.js +36 -0
  42. package/extensions/graphql/queries/ledger/accountRollups.ts +34 -0
  43. package/extensions/graphql/queries/ledger/accountTree.d.ts +11 -0
  44. package/extensions/graphql/queries/ledger/accountTree.js +61 -0
  45. package/extensions/graphql/queries/ledger/accountTree.ts +59 -0
  46. package/extensions/graphql/queries/ledger/accounts.d.ts +8 -0
  47. package/extensions/graphql/queries/ledger/accounts.js +45 -0
  48. package/extensions/graphql/queries/ledger/accounts.ts +43 -0
  49. package/extensions/graphql/queries/ledger/closingBookStructures.d.ts +6 -0
  50. package/extensions/graphql/queries/ledger/closingBookStructures.js +27 -0
  51. package/extensions/graphql/queries/ledger/closingBookStructures.ts +25 -0
  52. package/extensions/graphql/queries/ledger/elements.d.ts +6 -0
  53. package/extensions/graphql/queries/ledger/elements.js +56 -0
  54. package/extensions/graphql/queries/ledger/elements.ts +54 -0
  55. package/extensions/graphql/queries/ledger/entities.d.ts +7 -0
  56. package/extensions/graphql/queries/ledger/entities.js +31 -0
  57. package/extensions/graphql/queries/ledger/entities.ts +29 -0
  58. package/extensions/graphql/queries/ledger/entity.d.ts +14 -0
  59. package/extensions/graphql/queries/ledger/entity.js +55 -0
  60. package/extensions/graphql/queries/ledger/entity.ts +54 -0
  61. package/extensions/graphql/queries/ledger/fiscalCalendar.d.ts +8 -0
  62. package/extensions/graphql/queries/ledger/fiscalCalendar.js +35 -0
  63. package/extensions/graphql/queries/ledger/fiscalCalendar.ts +33 -0
  64. package/extensions/graphql/queries/ledger/mappedTrialBalance.d.ts +9 -0
  65. package/extensions/graphql/queries/ledger/mappedTrialBalance.js +29 -0
  66. package/extensions/graphql/queries/ledger/mappedTrialBalance.ts +27 -0
  67. package/extensions/graphql/queries/ledger/mapping.d.ts +5 -0
  68. package/extensions/graphql/queries/ledger/mapping.js +35 -0
  69. package/extensions/graphql/queries/ledger/mapping.ts +33 -0
  70. package/extensions/graphql/queries/ledger/mappingCoverage.d.ts +5 -0
  71. package/extensions/graphql/queries/ledger/mappingCoverage.js +22 -0
  72. package/extensions/graphql/queries/ledger/mappingCoverage.ts +20 -0
  73. package/extensions/graphql/queries/ledger/mappings.d.ts +6 -0
  74. package/extensions/graphql/queries/ledger/mappings.js +23 -0
  75. package/extensions/graphql/queries/ledger/mappings.ts +21 -0
  76. package/extensions/graphql/queries/ledger/periodCloseStatus.d.ts +6 -0
  77. package/extensions/graphql/queries/ledger/periodCloseStatus.js +29 -0
  78. package/extensions/graphql/queries/ledger/periodCloseStatus.ts +27 -0
  79. package/extensions/graphql/queries/ledger/periodDrafts.d.ts +8 -0
  80. package/extensions/graphql/queries/ledger/periodDrafts.js +45 -0
  81. package/extensions/graphql/queries/ledger/periodDrafts.ts +43 -0
  82. package/extensions/graphql/queries/ledger/publishList.d.ts +5 -0
  83. package/extensions/graphql/queries/ledger/publishList.js +29 -0
  84. package/extensions/graphql/queries/ledger/publishList.ts +27 -0
  85. package/extensions/graphql/queries/ledger/publishLists.d.ts +5 -0
  86. package/extensions/graphql/queries/ledger/publishLists.js +29 -0
  87. package/extensions/graphql/queries/ledger/publishLists.ts +27 -0
  88. package/extensions/graphql/queries/ledger/report.d.ts +5 -0
  89. package/extensions/graphql/queries/ledger/report.js +40 -0
  90. package/extensions/graphql/queries/ledger/report.ts +38 -0
  91. package/extensions/graphql/queries/ledger/reportingTaxonomy.d.ts +6 -0
  92. package/extensions/graphql/queries/ledger/reportingTaxonomy.js +27 -0
  93. package/extensions/graphql/queries/ledger/reportingTaxonomy.ts +25 -0
  94. package/extensions/graphql/queries/ledger/reports.d.ts +8 -0
  95. package/extensions/graphql/queries/ledger/reports.js +45 -0
  96. package/extensions/graphql/queries/ledger/reports.ts +43 -0
  97. package/extensions/graphql/queries/ledger/scheduleFacts.d.ts +7 -0
  98. package/extensions/graphql/queries/ledger/scheduleFacts.js +24 -0
  99. package/extensions/graphql/queries/ledger/scheduleFacts.ts +22 -0
  100. package/extensions/graphql/queries/ledger/schedules.d.ts +6 -0
  101. package/extensions/graphql/queries/ledger/schedules.js +24 -0
  102. package/extensions/graphql/queries/ledger/schedules.ts +22 -0
  103. package/extensions/graphql/queries/ledger/statement.d.ts +9 -0
  104. package/extensions/graphql/queries/ledger/statement.js +43 -0
  105. package/extensions/graphql/queries/ledger/statement.ts +41 -0
  106. package/extensions/graphql/queries/ledger/structures.d.ts +5 -0
  107. package/extensions/graphql/queries/ledger/structures.js +22 -0
  108. package/extensions/graphql/queries/ledger/structures.ts +20 -0
  109. package/extensions/graphql/queries/ledger/summary.d.ts +7 -0
  110. package/extensions/graphql/queries/ledger/summary.js +25 -0
  111. package/extensions/graphql/queries/ledger/summary.ts +23 -0
  112. package/extensions/graphql/queries/ledger/taxonomies.d.ts +5 -0
  113. package/extensions/graphql/queries/ledger/taxonomies.js +28 -0
  114. package/extensions/graphql/queries/ledger/taxonomies.ts +26 -0
  115. package/extensions/graphql/queries/ledger/transaction.d.ts +6 -0
  116. package/extensions/graphql/queries/ledger/transaction.js +49 -0
  117. package/extensions/graphql/queries/ledger/transaction.ts +47 -0
  118. package/extensions/graphql/queries/ledger/transactions.d.ts +7 -0
  119. package/extensions/graphql/queries/ledger/transactions.js +49 -0
  120. package/extensions/graphql/queries/ledger/transactions.ts +47 -0
  121. package/extensions/graphql/queries/ledger/trialBalance.d.ts +7 -0
  122. package/extensions/graphql/queries/ledger/trialBalance.js +28 -0
  123. package/extensions/graphql/queries/ledger/trialBalance.ts +26 -0
  124. package/extensions/graphql/queries/ledger/unmappedElements.d.ts +8 -0
  125. package/extensions/graphql/queries/ledger/unmappedElements.js +29 -0
  126. package/extensions/graphql/queries/ledger/unmappedElements.ts +27 -0
  127. package/extensions/hooks.d.ts +1 -1
  128. package/extensions/index.d.ts +18 -1
  129. package/extensions/index.js +26 -1
  130. package/extensions/index.ts +49 -2
  131. package/index.ts +2 -2
  132. package/package.json +14 -5
  133. package/sdk/index.d.ts +2 -2
  134. package/sdk/index.js +38 -73
  135. package/sdk/index.ts +2 -2
  136. package/sdk/sdk.gen.d.ts +100 -325
  137. package/sdk/sdk.gen.js +228 -592
  138. package/sdk/sdk.gen.ts +193 -556
  139. package/sdk/types.gen.d.ts +4522 -7708
  140. package/sdk/types.gen.ts +4569 -7983
  141. package/sdk.gen.d.ts +100 -325
  142. package/sdk.gen.js +228 -592
  143. package/sdk.gen.ts +193 -556
  144. package/types.gen.d.ts +4522 -7708
  145. package/types.gen.ts +4569 -7983
  146. package/extensions/AgentClient.test.ts +0 -403
  147. package/extensions/LedgerClient.test.ts +0 -1655
  148. package/extensions/OperationClient.test.ts +0 -365
  149. package/extensions/QueryClient.test.ts +0 -432
  150. package/extensions/ReportClient.test.ts +0 -828
  151. package/extensions/SSEClient.test.ts +0 -375
  152. package/extensions/config.test.ts +0 -199
  153. package/extensions/hooks.test.ts +0 -373
  154. package/extensions/index.test.ts +0 -420
  155. package/sdk-extensions/AgentClient.d.ts +0 -82
  156. package/sdk-extensions/AgentClient.js +0 -218
  157. package/sdk-extensions/AgentClient.test.ts +0 -403
  158. package/sdk-extensions/AgentClient.ts +0 -321
  159. package/sdk-extensions/LedgerClient.d.ts +0 -416
  160. package/sdk-extensions/LedgerClient.js +0 -737
  161. package/sdk-extensions/LedgerClient.test.ts +0 -1655
  162. package/sdk-extensions/LedgerClient.ts +0 -1249
  163. package/sdk-extensions/OperationClient.d.ts +0 -65
  164. package/sdk-extensions/OperationClient.js +0 -251
  165. package/sdk-extensions/OperationClient.test.ts +0 -365
  166. package/sdk-extensions/OperationClient.ts +0 -324
  167. package/sdk-extensions/QueryClient.d.ts +0 -52
  168. package/sdk-extensions/QueryClient.js +0 -313
  169. package/sdk-extensions/QueryClient.test.ts +0 -432
  170. package/sdk-extensions/QueryClient.ts +0 -420
  171. package/sdk-extensions/README.md +0 -901
  172. package/sdk-extensions/ReportClient.d.ts +0 -151
  173. package/sdk-extensions/ReportClient.js +0 -278
  174. package/sdk-extensions/ReportClient.test.ts +0 -828
  175. package/sdk-extensions/ReportClient.ts +0 -486
  176. package/sdk-extensions/SSEClient.d.ts +0 -62
  177. package/sdk-extensions/SSEClient.js +0 -154
  178. package/sdk-extensions/SSEClient.test.ts +0 -375
  179. package/sdk-extensions/SSEClient.ts +0 -210
  180. package/sdk-extensions/config.d.ts +0 -57
  181. package/sdk-extensions/config.js +0 -152
  182. package/sdk-extensions/config.test.ts +0 -199
  183. package/sdk-extensions/config.ts +0 -175
  184. package/sdk-extensions/hooks.d.ts +0 -110
  185. package/sdk-extensions/hooks.js +0 -384
  186. package/sdk-extensions/hooks.test.ts +0 -373
  187. package/sdk-extensions/hooks.ts +0 -459
  188. package/sdk-extensions/index.d.ts +0 -63
  189. package/sdk-extensions/index.js +0 -164
  190. package/sdk-extensions/index.test.ts +0 -420
  191. package/sdk-extensions/index.ts +0 -203
@@ -0,0 +1,98 @@
1
+ import type { CreatePortfolioRequest, CreatePositionRequest, CreateSecurityRequest, UpdatePortfolioOperation, UpdatePositionOperation, UpdateSecurityOperation } from '../types.gen';
2
+ import type { TokenProvider } from './graphql/client';
3
+ import { type GetInvestorHoldingsQuery, type GetInvestorPortfolioQuery, type GetInvestorPositionQuery, type GetInvestorSecurityQuery, type ListInvestorPortfoliosQuery, type ListInvestorPositionsQuery, type ListInvestorSecuritiesQuery } from './graphql/generated/graphql';
4
+ export type InvestorPortfolioList = NonNullable<ListInvestorPortfoliosQuery['portfolios']>;
5
+ export type InvestorPortfolioSummary = InvestorPortfolioList['portfolios'][number];
6
+ export type InvestorPortfolio = NonNullable<GetInvestorPortfolioQuery['portfolio']>;
7
+ export type InvestorSecurityList = NonNullable<ListInvestorSecuritiesQuery['securities']>;
8
+ export type InvestorSecuritySummary = InvestorSecurityList['securities'][number];
9
+ export type InvestorSecurity = NonNullable<GetInvestorSecurityQuery['security']>;
10
+ export type InvestorPositionList = NonNullable<ListInvestorPositionsQuery['positions']>;
11
+ export type InvestorPositionSummary = InvestorPositionList['positions'][number];
12
+ export type InvestorPosition = NonNullable<GetInvestorPositionQuery['position']>;
13
+ export type InvestorHoldings = NonNullable<GetInvestorHoldingsQuery['holdings']>;
14
+ export type InvestorEntityHolding = InvestorHoldings['holdings'][number];
15
+ export type InvestorHeldSecurity = InvestorEntityHolding['securities'][number];
16
+ interface InvestorClientConfig {
17
+ baseUrl: string;
18
+ credentials?: 'include' | 'same-origin' | 'omit';
19
+ headers?: Record<string, string>;
20
+ /** Static credential — use `tokenProvider` instead if the JWT rotates. */
21
+ token?: string;
22
+ /**
23
+ * Dynamic credential callback. When set, invoked on every GraphQL
24
+ * request so refreshes flow through automatically.
25
+ */
26
+ tokenProvider?: TokenProvider;
27
+ }
28
+ export declare class InvestorClient {
29
+ private config;
30
+ private gql;
31
+ constructor(config: InvestorClientConfig);
32
+ /** List portfolios with pagination. */
33
+ listPortfolios(graphId: string, options?: {
34
+ limit?: number;
35
+ offset?: number;
36
+ }): Promise<InvestorPortfolioList | null>;
37
+ /** Get a single portfolio by id. Returns null if it doesn't exist. */
38
+ getPortfolio(graphId: string, portfolioId: string): Promise<InvestorPortfolio | null>;
39
+ /** Create a new portfolio. Returns the created portfolio. */
40
+ createPortfolio(graphId: string, body: CreatePortfolioRequest): Promise<InvestorPortfolio>;
41
+ /** Update a portfolio's metadata. Only provided fields are applied. */
42
+ updatePortfolio(graphId: string, portfolioId: string, updates: Omit<UpdatePortfolioOperation, 'portfolio_id'>): Promise<InvestorPortfolio>;
43
+ /**
44
+ * Delete a portfolio. Fails with 409 if the portfolio still has active
45
+ * positions — dispose those first.
46
+ */
47
+ deletePortfolio(graphId: string, portfolioId: string): Promise<{
48
+ deleted: boolean;
49
+ }>;
50
+ /** List securities with pagination and filters. */
51
+ listSecurities(graphId: string, options?: {
52
+ entityId?: string;
53
+ securityType?: string;
54
+ isActive?: boolean;
55
+ limit?: number;
56
+ offset?: number;
57
+ }): Promise<InvestorSecurityList | null>;
58
+ /** Get a single security by id. Returns null if it doesn't exist. */
59
+ getSecurity(graphId: string, securityId: string): Promise<InvestorSecurity | null>;
60
+ /**
61
+ * Create a new security. Passing `source_graph_id` auto-links to the
62
+ * matching entity in the target graph.
63
+ */
64
+ createSecurity(graphId: string, body: CreateSecurityRequest): Promise<InvestorSecurity>;
65
+ /** Update a security's metadata. Only provided fields are applied. */
66
+ updateSecurity(graphId: string, securityId: string, updates: Omit<UpdateSecurityOperation, 'security_id'>): Promise<InvestorSecurity>;
67
+ /** Soft-delete a security (sets is_active=false). */
68
+ deleteSecurity(graphId: string, securityId: string): Promise<{
69
+ deleted: boolean;
70
+ }>;
71
+ /** List positions with pagination and filters. */
72
+ listPositions(graphId: string, options?: {
73
+ portfolioId?: string;
74
+ securityId?: string;
75
+ status?: string;
76
+ limit?: number;
77
+ offset?: number;
78
+ }): Promise<InvestorPositionList | null>;
79
+ /** Get a single position by id. Returns null if it doesn't exist. */
80
+ getPosition(graphId: string, positionId: string): Promise<InvestorPosition | null>;
81
+ /** Create a new position. */
82
+ createPosition(graphId: string, body: CreatePositionRequest): Promise<InvestorPosition>;
83
+ /** Update a position. Only provided fields are applied. */
84
+ updatePosition(graphId: string, positionId: string, updates: Omit<UpdatePositionOperation, 'position_id'>): Promise<InvestorPosition>;
85
+ /** Delete (dispose) a position. */
86
+ deletePosition(graphId: string, positionId: string): Promise<{
87
+ deleted: boolean;
88
+ }>;
89
+ /**
90
+ * Get portfolio holdings grouped by entity. Returns the full list of
91
+ * securities held and aggregate cost-basis / current-value for each
92
+ * entity in the portfolio.
93
+ */
94
+ getHoldings(graphId: string, portfolioId: string): Promise<InvestorHoldings | null>;
95
+ private gqlQuery;
96
+ private callOperation;
97
+ }
98
+ export {};
@@ -0,0 +1,223 @@
1
+ 'use client';
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.InvestorClient = void 0;
5
+ const graphql_request_1 = require("graphql-request");
6
+ const sdk_gen_1 = require("../sdk.gen");
7
+ const client_1 = require("./graphql/client");
8
+ const graphql_1 = require("./graphql/generated/graphql");
9
+ class InvestorClient {
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.gql = new client_1.GraphQLClientCache(config);
13
+ }
14
+ // ── Portfolios ──────────────────────────────────────────────────────
15
+ /** List portfolios with pagination. */
16
+ async listPortfolios(graphId, options) {
17
+ return this.gqlQuery(graphId, graphql_1.ListInvestorPortfoliosDocument, {
18
+ limit: options?.limit ?? 100,
19
+ offset: options?.offset ?? 0,
20
+ }, 'List portfolios', (data) => data.portfolios);
21
+ }
22
+ /** Get a single portfolio by id. Returns null if it doesn't exist. */
23
+ async getPortfolio(graphId, portfolioId) {
24
+ return this.gqlQuery(graphId, graphql_1.GetInvestorPortfolioDocument, { portfolioId }, 'Get portfolio', (data) => data.portfolio);
25
+ }
26
+ /** Create a new portfolio. Returns the created portfolio. */
27
+ async createPortfolio(graphId, body) {
28
+ const envelope = await this.callOperation('Create portfolio', (0, sdk_gen_1.opCreatePortfolio)({ path: { graph_id: graphId }, body }));
29
+ return rawToInvestorPortfolio(envelope.result);
30
+ }
31
+ /** Update a portfolio's metadata. Only provided fields are applied. */
32
+ async updatePortfolio(graphId, portfolioId, updates) {
33
+ const envelope = await this.callOperation('Update portfolio', (0, sdk_gen_1.opUpdatePortfolio)({
34
+ path: { graph_id: graphId },
35
+ body: {
36
+ ...updates,
37
+ portfolio_id: portfolioId,
38
+ },
39
+ }));
40
+ return rawToInvestorPortfolio(envelope.result);
41
+ }
42
+ /**
43
+ * Delete a portfolio. Fails with 409 if the portfolio still has active
44
+ * positions — dispose those first.
45
+ */
46
+ async deletePortfolio(graphId, portfolioId) {
47
+ const envelope = await this.callOperation('Delete portfolio', (0, sdk_gen_1.opDeletePortfolio)({
48
+ path: { graph_id: graphId },
49
+ body: { portfolio_id: portfolioId },
50
+ }));
51
+ return (envelope.result ?? { deleted: true });
52
+ }
53
+ // ── Securities ──────────────────────────────────────────────────────
54
+ /** List securities with pagination and filters. */
55
+ async listSecurities(graphId, options) {
56
+ return this.gqlQuery(graphId, graphql_1.ListInvestorSecuritiesDocument, {
57
+ entityId: options?.entityId ?? null,
58
+ securityType: options?.securityType ?? null,
59
+ isActive: options?.isActive ?? null,
60
+ limit: options?.limit ?? 100,
61
+ offset: options?.offset ?? 0,
62
+ }, 'List securities', (data) => data.securities);
63
+ }
64
+ /** Get a single security by id. Returns null if it doesn't exist. */
65
+ async getSecurity(graphId, securityId) {
66
+ return this.gqlQuery(graphId, graphql_1.GetInvestorSecurityDocument, { securityId }, 'Get security', (data) => data.security);
67
+ }
68
+ /**
69
+ * Create a new security. Passing `source_graph_id` auto-links to the
70
+ * matching entity in the target graph.
71
+ */
72
+ async createSecurity(graphId, body) {
73
+ const envelope = await this.callOperation('Create security', (0, sdk_gen_1.opCreateSecurity)({ path: { graph_id: graphId }, body }));
74
+ return rawToInvestorSecurity(envelope.result);
75
+ }
76
+ /** Update a security's metadata. Only provided fields are applied. */
77
+ async updateSecurity(graphId, securityId, updates) {
78
+ const envelope = await this.callOperation('Update security', (0, sdk_gen_1.opUpdateSecurity)({
79
+ path: { graph_id: graphId },
80
+ body: {
81
+ ...updates,
82
+ security_id: securityId,
83
+ },
84
+ }));
85
+ return rawToInvestorSecurity(envelope.result);
86
+ }
87
+ /** Soft-delete a security (sets is_active=false). */
88
+ async deleteSecurity(graphId, securityId) {
89
+ const envelope = await this.callOperation('Delete security', (0, sdk_gen_1.opDeleteSecurity)({
90
+ path: { graph_id: graphId },
91
+ body: { security_id: securityId },
92
+ }));
93
+ return (envelope.result ?? { deleted: true });
94
+ }
95
+ // ── Positions ───────────────────────────────────────────────────────
96
+ /** List positions with pagination and filters. */
97
+ async listPositions(graphId, options) {
98
+ return this.gqlQuery(graphId, graphql_1.ListInvestorPositionsDocument, {
99
+ portfolioId: options?.portfolioId ?? null,
100
+ securityId: options?.securityId ?? null,
101
+ status: options?.status ?? null,
102
+ limit: options?.limit ?? 100,
103
+ offset: options?.offset ?? 0,
104
+ }, 'List positions', (data) => data.positions);
105
+ }
106
+ /** Get a single position by id. Returns null if it doesn't exist. */
107
+ async getPosition(graphId, positionId) {
108
+ return this.gqlQuery(graphId, graphql_1.GetInvestorPositionDocument, { positionId }, 'Get position', (data) => data.position);
109
+ }
110
+ /** Create a new position. */
111
+ async createPosition(graphId, body) {
112
+ const envelope = await this.callOperation('Create position', (0, sdk_gen_1.opCreatePosition)({ path: { graph_id: graphId }, body }));
113
+ return rawToInvestorPosition(envelope.result);
114
+ }
115
+ /** Update a position. Only provided fields are applied. */
116
+ async updatePosition(graphId, positionId, updates) {
117
+ const envelope = await this.callOperation('Update position', (0, sdk_gen_1.opUpdatePosition)({
118
+ path: { graph_id: graphId },
119
+ body: {
120
+ ...updates,
121
+ position_id: positionId,
122
+ },
123
+ }));
124
+ return rawToInvestorPosition(envelope.result);
125
+ }
126
+ /** Delete (dispose) a position. */
127
+ async deletePosition(graphId, positionId) {
128
+ const envelope = await this.callOperation('Delete position', (0, sdk_gen_1.opDeletePosition)({
129
+ path: { graph_id: graphId },
130
+ body: { position_id: positionId },
131
+ }));
132
+ return (envelope.result ?? { deleted: true });
133
+ }
134
+ // ── Holdings (aggregation) ─────────────────────────────────────────
135
+ /**
136
+ * Get portfolio holdings grouped by entity. Returns the full list of
137
+ * securities held and aggregate cost-basis / current-value for each
138
+ * entity in the portfolio.
139
+ */
140
+ async getHoldings(graphId, portfolioId) {
141
+ return this.gqlQuery(graphId, graphql_1.GetInvestorHoldingsDocument, { portfolioId }, 'Get holdings', (data) => data.holdings);
142
+ }
143
+ // ── Internal helpers ────────────────────────────────────────────────
144
+ async gqlQuery(graphId, document, variables, label, pick) {
145
+ try {
146
+ const client = this.gql.get(graphId);
147
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+ const raw = client.request;
149
+ const data = (await raw.call(client, document, variables));
150
+ return pick(data);
151
+ }
152
+ catch (err) {
153
+ if (err instanceof graphql_request_1.ClientError) {
154
+ throw new Error(`${label} failed: ${JSON.stringify(err.response.errors ?? err.message)}`);
155
+ }
156
+ throw err;
157
+ }
158
+ }
159
+ async callOperation(label, call) {
160
+ const response = await call;
161
+ if (response.error !== undefined) {
162
+ throw new Error(`${label} failed: ${JSON.stringify(response.error)}`);
163
+ }
164
+ if (response.data === undefined) {
165
+ throw new Error(`${label} failed: empty response`);
166
+ }
167
+ return response.data;
168
+ }
169
+ }
170
+ exports.InvestorClient = InvestorClient;
171
+ function rawToInvestorPortfolio(raw) {
172
+ return {
173
+ id: raw.id,
174
+ name: raw.name,
175
+ description: raw.description,
176
+ strategy: raw.strategy,
177
+ inceptionDate: raw.inception_date,
178
+ baseCurrency: raw.base_currency,
179
+ createdAt: raw.created_at,
180
+ updatedAt: raw.updated_at,
181
+ };
182
+ }
183
+ function rawToInvestorSecurity(raw) {
184
+ return {
185
+ id: raw.id,
186
+ entityId: raw.entity_id,
187
+ entityName: raw.entity_name,
188
+ sourceGraphId: raw.source_graph_id,
189
+ name: raw.name,
190
+ securityType: raw.security_type,
191
+ securitySubtype: raw.security_subtype,
192
+ terms: raw.terms,
193
+ isActive: raw.is_active,
194
+ authorizedShares: raw.authorized_shares,
195
+ outstandingShares: raw.outstanding_shares,
196
+ createdAt: raw.created_at,
197
+ updatedAt: raw.updated_at,
198
+ };
199
+ }
200
+ function rawToInvestorPosition(raw) {
201
+ return {
202
+ id: raw.id,
203
+ portfolioId: raw.portfolio_id,
204
+ securityId: raw.security_id,
205
+ securityName: raw.security_name,
206
+ entityName: raw.entity_name,
207
+ quantity: raw.quantity,
208
+ quantityType: raw.quantity_type,
209
+ costBasis: raw.cost_basis,
210
+ costBasisDollars: raw.cost_basis_dollars,
211
+ currency: raw.currency,
212
+ currentValue: raw.current_value,
213
+ currentValueDollars: raw.current_value_dollars,
214
+ valuationDate: raw.valuation_date,
215
+ valuationSource: raw.valuation_source,
216
+ acquisitionDate: raw.acquisition_date,
217
+ dispositionDate: raw.disposition_date,
218
+ status: raw.status,
219
+ notes: raw.notes,
220
+ createdAt: raw.created_at,
221
+ updatedAt: raw.updated_at,
222
+ };
223
+ }