@stupidcodefactory/freeagent-mcp-server 1.0.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 (226) hide show
  1. package/README.md +187 -0
  2. package/dist/api/freeagent-client.d.ts +12 -0
  3. package/dist/api/freeagent-client.d.ts.map +1 -0
  4. package/dist/api/freeagent-client.js +114 -0
  5. package/dist/api/freeagent-client.js.map +1 -0
  6. package/dist/api/index.d.ts +7 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +4 -0
  9. package/dist/api/index.js.map +1 -0
  10. package/dist/api/rate-limiter.d.ts +15 -0
  11. package/dist/api/rate-limiter.d.ts.map +1 -0
  12. package/dist/api/rate-limiter.js +62 -0
  13. package/dist/api/rate-limiter.js.map +1 -0
  14. package/dist/api/retry-handler.d.ts +14 -0
  15. package/dist/api/retry-handler.d.ts.map +1 -0
  16. package/dist/api/retry-handler.js +49 -0
  17. package/dist/api/retry-handler.js.map +1 -0
  18. package/dist/auth/index.d.ts +7 -0
  19. package/dist/auth/index.d.ts.map +1 -0
  20. package/dist/auth/index.js +4 -0
  21. package/dist/auth/index.js.map +1 -0
  22. package/dist/auth/oauth.d.ts +16 -0
  23. package/dist/auth/oauth.d.ts.map +1 -0
  24. package/dist/auth/oauth.js +64 -0
  25. package/dist/auth/oauth.js.map +1 -0
  26. package/dist/auth/token-manager.d.ts +10 -0
  27. package/dist/auth/token-manager.d.ts.map +1 -0
  28. package/dist/auth/token-manager.js +71 -0
  29. package/dist/auth/token-manager.js.map +1 -0
  30. package/dist/auth/token-store.d.ts +10 -0
  31. package/dist/auth/token-store.d.ts.map +1 -0
  32. package/dist/auth/token-store.js +84 -0
  33. package/dist/auth/token-store.js.map +1 -0
  34. package/dist/config.d.ts +73 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +46 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +44 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/prompts/cash-flow-forecast.d.ts +12 -0
  43. package/dist/prompts/cash-flow-forecast.d.ts.map +1 -0
  44. package/dist/prompts/cash-flow-forecast.js +93 -0
  45. package/dist/prompts/cash-flow-forecast.js.map +1 -0
  46. package/dist/prompts/index.d.ts +8 -0
  47. package/dist/prompts/index.d.ts.map +1 -0
  48. package/dist/prompts/index.js +8 -0
  49. package/dist/prompts/index.js.map +1 -0
  50. package/dist/prompts/invoice-from-description.d.ts +12 -0
  51. package/dist/prompts/invoice-from-description.d.ts.map +1 -0
  52. package/dist/prompts/invoice-from-description.js +49 -0
  53. package/dist/prompts/invoice-from-description.js.map +1 -0
  54. package/dist/prompts/monthly-expense-summary.d.ts +12 -0
  55. package/dist/prompts/monthly-expense-summary.d.ts.map +1 -0
  56. package/dist/prompts/monthly-expense-summary.js +84 -0
  57. package/dist/prompts/monthly-expense-summary.js.map +1 -0
  58. package/dist/prompts/overdue-invoice-followup.d.ts +12 -0
  59. package/dist/prompts/overdue-invoice-followup.d.ts.map +1 -0
  60. package/dist/prompts/overdue-invoice-followup.js +63 -0
  61. package/dist/prompts/overdue-invoice-followup.js.map +1 -0
  62. package/dist/prompts/project-profitability.d.ts +12 -0
  63. package/dist/prompts/project-profitability.d.ts.map +1 -0
  64. package/dist/prompts/project-profitability.js +103 -0
  65. package/dist/prompts/project-profitability.js.map +1 -0
  66. package/dist/prompts/quarterly-tax-estimate.d.ts +12 -0
  67. package/dist/prompts/quarterly-tax-estimate.d.ts.map +1 -0
  68. package/dist/prompts/quarterly-tax-estimate.js +132 -0
  69. package/dist/prompts/quarterly-tax-estimate.js.map +1 -0
  70. package/dist/prompts/transaction-categorization.d.ts +12 -0
  71. package/dist/prompts/transaction-categorization.d.ts.map +1 -0
  72. package/dist/prompts/transaction-categorization.js +81 -0
  73. package/dist/prompts/transaction-categorization.js.map +1 -0
  74. package/dist/resources/bank-accounts.d.ts +8 -0
  75. package/dist/resources/bank-accounts.d.ts.map +1 -0
  76. package/dist/resources/bank-accounts.js +34 -0
  77. package/dist/resources/bank-accounts.js.map +1 -0
  78. package/dist/resources/bank-transactions.d.ts +11 -0
  79. package/dist/resources/bank-transactions.d.ts.map +1 -0
  80. package/dist/resources/bank-transactions.js +34 -0
  81. package/dist/resources/bank-transactions.js.map +1 -0
  82. package/dist/resources/bills.d.ts +13 -0
  83. package/dist/resources/bills.d.ts.map +1 -0
  84. package/dist/resources/bills.js +38 -0
  85. package/dist/resources/bills.js.map +1 -0
  86. package/dist/resources/categories.d.ts +4 -0
  87. package/dist/resources/categories.d.ts.map +1 -0
  88. package/dist/resources/categories.js +21 -0
  89. package/dist/resources/categories.js.map +1 -0
  90. package/dist/resources/company.d.ts +3 -0
  91. package/dist/resources/company.d.ts.map +1 -0
  92. package/dist/resources/company.js +12 -0
  93. package/dist/resources/company.js.map +1 -0
  94. package/dist/resources/contacts.d.ts +9 -0
  95. package/dist/resources/contacts.d.ts.map +1 -0
  96. package/dist/resources/contacts.js +37 -0
  97. package/dist/resources/contacts.js.map +1 -0
  98. package/dist/resources/expenses.d.ts +12 -0
  99. package/dist/resources/expenses.d.ts.map +1 -0
  100. package/dist/resources/expenses.js +36 -0
  101. package/dist/resources/expenses.js.map +1 -0
  102. package/dist/resources/index.d.ts +20 -0
  103. package/dist/resources/index.d.ts.map +1 -0
  104. package/dist/resources/index.js +12 -0
  105. package/dist/resources/index.js.map +1 -0
  106. package/dist/resources/invoices.d.ts +14 -0
  107. package/dist/resources/invoices.d.ts.map +1 -0
  108. package/dist/resources/invoices.js +40 -0
  109. package/dist/resources/invoices.js.map +1 -0
  110. package/dist/resources/projects.d.ts +10 -0
  111. package/dist/resources/projects.d.ts.map +1 -0
  112. package/dist/resources/projects.js +39 -0
  113. package/dist/resources/projects.js.map +1 -0
  114. package/dist/resources/timeslips.d.ts +12 -0
  115. package/dist/resources/timeslips.d.ts.map +1 -0
  116. package/dist/resources/timeslips.js +36 -0
  117. package/dist/resources/timeslips.js.map +1 -0
  118. package/dist/resources/users.d.ts +5 -0
  119. package/dist/resources/users.d.ts.map +1 -0
  120. package/dist/resources/users.js +30 -0
  121. package/dist/resources/users.js.map +1 -0
  122. package/dist/server.d.ts +9 -0
  123. package/dist/server.d.ts.map +1 -0
  124. package/dist/server.js +568 -0
  125. package/dist/server.js.map +1 -0
  126. package/dist/tools/bank-tools.d.ts +112 -0
  127. package/dist/tools/bank-tools.d.ts.map +1 -0
  128. package/dist/tools/bank-tools.js +143 -0
  129. package/dist/tools/bank-tools.js.map +1 -0
  130. package/dist/tools/bill-tools.d.ts +129 -0
  131. package/dist/tools/bill-tools.d.ts.map +1 -0
  132. package/dist/tools/bill-tools.js +121 -0
  133. package/dist/tools/bill-tools.js.map +1 -0
  134. package/dist/tools/contact-tools.d.ts +147 -0
  135. package/dist/tools/contact-tools.d.ts.map +1 -0
  136. package/dist/tools/contact-tools.js +140 -0
  137. package/dist/tools/contact-tools.js.map +1 -0
  138. package/dist/tools/index.d.ts +13 -0
  139. package/dist/tools/index.d.ts.map +1 -0
  140. package/dist/tools/index.js +13 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/invoice-tools.d.ts +171 -0
  143. package/dist/tools/invoice-tools.d.ts.map +1 -0
  144. package/dist/tools/invoice-tools.js +168 -0
  145. package/dist/tools/invoice-tools.js.map +1 -0
  146. package/dist/tools/project-tools.d.ts +117 -0
  147. package/dist/tools/project-tools.d.ts.map +1 -0
  148. package/dist/tools/project-tools.js +153 -0
  149. package/dist/tools/project-tools.js.map +1 -0
  150. package/dist/tools/query-tools.d.ts +91 -0
  151. package/dist/tools/query-tools.d.ts.map +1 -0
  152. package/dist/tools/query-tools.js +127 -0
  153. package/dist/tools/query-tools.js.map +1 -0
  154. package/dist/transformers/bank-transformer.d.ts +8 -0
  155. package/dist/transformers/bank-transformer.d.ts.map +1 -0
  156. package/dist/transformers/bank-transformer.js +46 -0
  157. package/dist/transformers/bank-transformer.js.map +1 -0
  158. package/dist/transformers/bill-transformer.d.ts +6 -0
  159. package/dist/transformers/bill-transformer.d.ts.map +1 -0
  160. package/dist/transformers/bill-transformer.js +34 -0
  161. package/dist/transformers/bill-transformer.js.map +1 -0
  162. package/dist/transformers/category-transformer.d.ts +5 -0
  163. package/dist/transformers/category-transformer.d.ts.map +1 -0
  164. package/dist/transformers/category-transformer.js +14 -0
  165. package/dist/transformers/category-transformer.js.map +1 -0
  166. package/dist/transformers/common.d.ts +7 -0
  167. package/dist/transformers/common.d.ts.map +1 -0
  168. package/dist/transformers/common.js +33 -0
  169. package/dist/transformers/common.js.map +1 -0
  170. package/dist/transformers/company-transformer.d.ts +4 -0
  171. package/dist/transformers/company-transformer.d.ts.map +1 -0
  172. package/dist/transformers/company-transformer.js +10 -0
  173. package/dist/transformers/company-transformer.js.map +1 -0
  174. package/dist/transformers/contact-transformer.d.ts +5 -0
  175. package/dist/transformers/contact-transformer.d.ts.map +1 -0
  176. package/dist/transformers/contact-transformer.js +18 -0
  177. package/dist/transformers/contact-transformer.js.map +1 -0
  178. package/dist/transformers/expense-transformer.d.ts +5 -0
  179. package/dist/transformers/expense-transformer.d.ts.map +1 -0
  180. package/dist/transformers/expense-transformer.js +19 -0
  181. package/dist/transformers/expense-transformer.js.map +1 -0
  182. package/dist/transformers/index.d.ts +11 -0
  183. package/dist/transformers/index.d.ts.map +1 -0
  184. package/dist/transformers/index.js +11 -0
  185. package/dist/transformers/index.js.map +1 -0
  186. package/dist/transformers/invoice-transformer.d.ts +6 -0
  187. package/dist/transformers/invoice-transformer.d.ts.map +1 -0
  188. package/dist/transformers/invoice-transformer.js +39 -0
  189. package/dist/transformers/invoice-transformer.js.map +1 -0
  190. package/dist/transformers/project-transformer.d.ts +9 -0
  191. package/dist/transformers/project-transformer.d.ts.map +1 -0
  192. package/dist/transformers/project-transformer.js +53 -0
  193. package/dist/transformers/project-transformer.js.map +1 -0
  194. package/dist/transformers/user-transformer.d.ts +5 -0
  195. package/dist/transformers/user-transformer.d.ts.map +1 -0
  196. package/dist/transformers/user-transformer.js +14 -0
  197. package/dist/transformers/user-transformer.js.map +1 -0
  198. package/dist/types/freeagent/index.d.ts +256 -0
  199. package/dist/types/freeagent/index.d.ts.map +1 -0
  200. package/dist/types/freeagent/index.js +3 -0
  201. package/dist/types/freeagent/index.js.map +1 -0
  202. package/dist/types/llm/index.d.ts +159 -0
  203. package/dist/types/llm/index.d.ts.map +1 -0
  204. package/dist/types/llm/index.js +3 -0
  205. package/dist/types/llm/index.js.map +1 -0
  206. package/dist/utils/error-handler.d.ts +11 -0
  207. package/dist/utils/error-handler.d.ts.map +1 -0
  208. package/dist/utils/error-handler.js +57 -0
  209. package/dist/utils/error-handler.js.map +1 -0
  210. package/dist/utils/index.d.ts +5 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +5 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/sanitizer.d.ts +4 -0
  215. package/dist/utils/sanitizer.d.ts.map +1 -0
  216. package/dist/utils/sanitizer.js +42 -0
  217. package/dist/utils/sanitizer.js.map +1 -0
  218. package/dist/utils/validators.d.ts +19 -0
  219. package/dist/utils/validators.d.ts.map +1 -0
  220. package/dist/utils/validators.js +83 -0
  221. package/dist/utils/validators.js.map +1 -0
  222. package/dist/utils/zod-to-json-schema.d.ts +24 -0
  223. package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
  224. package/dist/utils/zod-to-json-schema.js +141 -0
  225. package/dist/utils/zod-to-json-schema.js.map +1 -0
  226. package/package.json +48 -0
@@ -0,0 +1,127 @@
1
+ import { z } from 'zod';
2
+ import { getInvoices } from '../resources/invoices.js';
3
+ import { getBankAccounts, buildBankAccountNameLookup } from '../resources/bank-accounts.js';
4
+ import { getBankTransactions } from '../resources/bank-transactions.js';
5
+ import { handleToolError } from '../utils/error-handler.js';
6
+ // List unpaid invoices schema
7
+ export const listUnpaidInvoicesSchema = z.object({
8
+ contact_id: z.string().optional(),
9
+ include_overdue_only: z.boolean().default(false),
10
+ from_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
11
+ });
12
+ export async function listUnpaidInvoices(client, input, contactNameLookup) {
13
+ try {
14
+ const validated = listUnpaidInvoicesSchema.parse(input);
15
+ const filters = {
16
+ view: 'recent_open_or_overdue',
17
+ };
18
+ if (validated.contact_id)
19
+ filters.contact = validated.contact_id;
20
+ if (validated.from_date)
21
+ filters.fromDate = validated.from_date;
22
+ let invoices = await getInvoices(client, filters, contactNameLookup);
23
+ if (validated.include_overdue_only) {
24
+ invoices = invoices.filter((inv) => inv.status === 'Overdue');
25
+ }
26
+ else {
27
+ invoices = invoices.filter((inv) => inv.status === 'Open' || inv.status === 'Overdue');
28
+ }
29
+ const overdueInvoices = invoices.filter((inv) => inv.status === 'Overdue');
30
+ const currency = invoices.length > 0 ? invoices[0].currency : 'GBP';
31
+ return {
32
+ invoices,
33
+ totalCount: invoices.length,
34
+ totalDue: invoices.reduce((sum, inv) => sum + inv.dueValue, 0),
35
+ totalOverdue: overdueInvoices.reduce((sum, inv) => sum + inv.dueValue, 0),
36
+ overdueCount: overdueInvoices.length,
37
+ currency,
38
+ };
39
+ }
40
+ catch (error) {
41
+ handleToolError(error, 'list_unpaid_invoices');
42
+ }
43
+ }
44
+ // Get bank summary schema
45
+ export const getBankSummarySchema = z.object({
46
+ view: z.enum(['all', 'standard', 'paypal_accounts', 'credit_card_accounts']).default('all'),
47
+ });
48
+ export async function getBankSummary(client, input) {
49
+ try {
50
+ const validated = getBankSummarySchema.parse(input);
51
+ const accounts = await getBankAccounts(client, { view: validated.view });
52
+ const activeAccounts = accounts.filter((acc) => acc.status === 'Active');
53
+ // Group by currency
54
+ const gbpAccounts = activeAccounts.filter((acc) => acc.currency === 'GBP');
55
+ const totalGbp = gbpAccounts.reduce((sum, acc) => sum + acc.currentBalance, 0);
56
+ return {
57
+ accounts: activeAccounts,
58
+ totalBalance: totalGbp,
59
+ currency: 'GBP',
60
+ accountCount: activeAccounts.length,
61
+ };
62
+ }
63
+ catch (error) {
64
+ handleToolError(error, 'get_bank_summary');
65
+ }
66
+ }
67
+ // Search transactions schema
68
+ export const searchTransactionsSchema = z.object({
69
+ bank_account_id: z.string().min(1),
70
+ query: z.string().min(1),
71
+ from_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
72
+ to_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
73
+ unexplained_only: z.boolean().default(false),
74
+ });
75
+ export async function searchTransactions(client, input) {
76
+ try {
77
+ const validated = searchTransactionsSchema.parse(input);
78
+ const bankAccountNameLookup = await buildBankAccountNameLookup(client);
79
+ const transactions = await getBankTransactions(client, {
80
+ bankAccount: validated.bank_account_id,
81
+ fromDate: validated.from_date,
82
+ toDate: validated.to_date,
83
+ view: validated.unexplained_only ? 'unexplained' : 'all',
84
+ }, bankAccountNameLookup);
85
+ // Simple text search on description
86
+ const queryLower = validated.query.toLowerCase();
87
+ const filtered = transactions.filter((tx) => tx.description?.toLowerCase().includes(queryLower));
88
+ return {
89
+ transactions: filtered,
90
+ matchCount: filtered.length,
91
+ searchQuery: validated.query,
92
+ };
93
+ }
94
+ catch (error) {
95
+ handleToolError(error, 'search_transactions');
96
+ }
97
+ }
98
+ // Get unexplained transactions schema
99
+ export const getUnexplainedTransactionsSchema = z.object({
100
+ bank_account_id: z.string().min(1),
101
+ from_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
102
+ to_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
103
+ limit: z.number().int().positive().default(50),
104
+ });
105
+ export async function getUnexplainedTransactions(client, input) {
106
+ try {
107
+ const validated = getUnexplainedTransactionsSchema.parse(input);
108
+ const bankAccountNameLookup = await buildBankAccountNameLookup(client);
109
+ const transactions = await getBankTransactions(client, {
110
+ bankAccount: validated.bank_account_id,
111
+ fromDate: validated.from_date,
112
+ toDate: validated.to_date,
113
+ view: 'unexplained',
114
+ }, bankAccountNameLookup);
115
+ const limited = transactions.slice(0, validated.limit);
116
+ const totalUnexplained = limited.reduce((sum, tx) => sum + Math.abs(tx.unexplainedAmount), 0);
117
+ return {
118
+ transactions: limited,
119
+ count: limited.length,
120
+ totalUnexplainedAmount: totalUnexplained,
121
+ };
122
+ }
123
+ catch (error) {
124
+ handleToolError(error, 'get_unexplained_transactions');
125
+ }
126
+ }
127
+ //# sourceMappingURL=query-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-tools.js","sourceRoot":"","sources":["../../src/tools/query-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FreeAgentBankAccount, FreeAgentBankTransaction, FreeAgentBankTransactionExplanation } from '../types/freeagent/index.js';
2
+ import type { LLMBankAccount, LLMBankTransaction, LLMBankTransactionExplanation } from '../types/llm/index.js';
3
+ export declare function transformBankAccount(account: FreeAgentBankAccount): LLMBankAccount;
4
+ export declare function transformBankAccounts(accounts: FreeAgentBankAccount[]): LLMBankAccount[];
5
+ export declare function transformBankTransactionExplanation(explanation: FreeAgentBankTransactionExplanation): LLMBankTransactionExplanation;
6
+ export declare function transformBankTransaction(transaction: FreeAgentBankTransaction, bankAccountNameLookup?: Map<string, string>): LLMBankTransaction;
7
+ export declare function transformBankTransactions(transactions: FreeAgentBankTransaction[], bankAccountNameLookup?: Map<string, string>): LLMBankTransaction[];
8
+ //# sourceMappingURL=bank-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/bank-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACxB,mCAAmC,EACpC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,uBAAuB,CAAC;AAG/B,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAYlF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,cAAc,EAAE,CAExF;AAED,wBAAgB,mCAAmC,CACjD,WAAW,EAAE,mCAAmC,GAC/C,6BAA6B,CAQ/B;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,wBAAwB,EACrC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,kBAAkB,CAmBpB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,wBAAwB,EAAE,EACxC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1C,kBAAkB,EAAE,CAEtB"}
@@ -0,0 +1,46 @@
1
+ import { extractId, parseNumericString } from './common.js';
2
+ export function transformBankAccount(account) {
3
+ return {
4
+ id: extractId(account.url),
5
+ name: account.name,
6
+ type: account.type,
7
+ currency: account.currency,
8
+ currentBalance: parseNumericString(account.current_balance),
9
+ openingBalance: parseNumericString(account.opening_balance),
10
+ status: account.status,
11
+ isPrimary: account.is_primary,
12
+ latestActivityDate: account.latest_activity_date,
13
+ };
14
+ }
15
+ export function transformBankAccounts(accounts) {
16
+ return accounts.map(transformBankAccount);
17
+ }
18
+ export function transformBankTransactionExplanation(explanation) {
19
+ return {
20
+ category: explanation.category ? extractId(explanation.category) : undefined,
21
+ description: explanation.description,
22
+ matchedInvoiceId: explanation.paid_invoice ? extractId(explanation.paid_invoice) : undefined,
23
+ matchedBillId: explanation.paid_bill ? extractId(explanation.paid_bill) : undefined,
24
+ value: parseNumericString(explanation.gross_value),
25
+ };
26
+ }
27
+ export function transformBankTransaction(transaction, bankAccountNameLookup) {
28
+ const bankAccountId = extractId(transaction.bank_account);
29
+ const bankAccountName = bankAccountNameLookup?.get(transaction.bank_account) ?? bankAccountId;
30
+ const explanations = transaction.bank_transaction_explanations?.map(transformBankTransactionExplanation);
31
+ return {
32
+ id: extractId(transaction.url),
33
+ bankAccountId,
34
+ bankAccountName,
35
+ datedOn: transaction.dated_on,
36
+ amount: parseNumericString(transaction.amount),
37
+ description: transaction.description,
38
+ isExplained: parseNumericString(transaction.unexplained_amount) === 0,
39
+ unexplainedAmount: parseNumericString(transaction.unexplained_amount),
40
+ explanations,
41
+ };
42
+ }
43
+ export function transformBankTransactions(transactions, bankAccountNameLookup) {
44
+ return transactions.map((tx) => transformBankTransaction(tx, bankAccountNameLookup));
45
+ }
46
+ //# sourceMappingURL=bank-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bank-transformer.js","sourceRoot":"","sources":["../../src/transformers/bank-transformer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC3D,cAAc,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC3D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,UAAU;QAC7B,kBAAkB,EAAE,OAAO,CAAC,oBAAoB;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgC;IACpE,OAAO,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,WAAgD;IAEhD,OAAO;QACL,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5F,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACnF,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,WAAW,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,WAAqC,EACrC,qBAA2C;IAE3C,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,qBAAqB,EAAE,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC;IAE9F,MAAM,YAAY,GAAG,WAAW,CAAC,6BAA6B,EAAE,GAAG,CACjE,mCAAmC,CACpC,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;QAC9B,aAAa;QACb,eAAe;QACf,OAAO,EAAE,WAAW,CAAC,QAAQ;QAC7B,MAAM,EAAE,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC;QAC9C,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC;QACrE,iBAAiB,EAAE,kBAAkB,CAAC,WAAW,CAAC,kBAAkB,CAAC;QACrE,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,YAAwC,EACxC,qBAA2C;IAE3C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FreeAgentBill, FreeAgentBillItem } from '../types/freeagent/index.js';
2
+ import type { LLMBill, LLMBillItem } from '../types/llm/index.js';
3
+ export declare function transformBillItem(item: FreeAgentBillItem): LLMBillItem;
4
+ export declare function transformBill(bill: FreeAgentBill, contactNameLookup?: Map<string, string>): LLMBill;
5
+ export declare function transformBills(bills: FreeAgentBill[], contactNameLookup?: Map<string, string>): LLMBill[];
6
+ //# sourceMappingURL=bill-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bill-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/bill-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGlE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,CAQtE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAoBT;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EAAE,EACtB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,EAAE,CAEX"}
@@ -0,0 +1,34 @@
1
+ import { extractId, parseNumericString } from './common.js';
2
+ export function transformBillItem(item) {
3
+ return {
4
+ category: extractId(item.category),
5
+ description: item.description,
6
+ totalValue: parseNumericString(item.total_value),
7
+ salesTaxRate: item.sales_tax_rate ? parseNumericString(item.sales_tax_rate) : undefined,
8
+ projectId: item.project ? extractId(item.project) : undefined,
9
+ };
10
+ }
11
+ export function transformBill(bill, contactNameLookup) {
12
+ const contactId = extractId(bill.contact);
13
+ const contactName = contactNameLookup?.get(bill.contact) ?? contactId;
14
+ return {
15
+ id: extractId(bill.url),
16
+ contactId,
17
+ contactName,
18
+ reference: bill.reference,
19
+ datedOn: bill.dated_on,
20
+ dueOn: bill.due_on,
21
+ currency: bill.currency,
22
+ totalValue: parseNumericString(bill.total_value),
23
+ salesTaxValue: parseNumericString(bill.sales_tax_value),
24
+ paidValue: parseNumericString(bill.paid_value),
25
+ dueValue: parseNumericString(bill.due_value),
26
+ status: bill.status,
27
+ items: bill.bill_items?.map(transformBillItem),
28
+ comments: bill.comments,
29
+ };
30
+ }
31
+ export function transformBills(bills, contactNameLookup) {
32
+ return bills.map((bill) => transformBill(bill, contactNameLookup));
33
+ }
34
+ //# sourceMappingURL=bill-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bill-transformer.js","sourceRoot":"","sources":["../../src/transformers/bill-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,UAAU,iBAAiB,CAAC,IAAuB;IACvD,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;QAChD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QACvF,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAmB,EACnB,iBAAuC;IAEvC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAEtE,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB,SAAS;QACT,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;QAChD,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC;QACvD,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;QAC9C,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5C,MAAM,EAAE,IAAI,CAAC,MAA2B;QACxC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,iBAAiB,CAAC;QAC9C,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAsB,EACtB,iBAAuC;IAEvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FreeAgentCategory } from '../types/freeagent/index.js';
2
+ import type { LLMCategory } from '../types/llm/index.js';
3
+ export declare function transformCategory(category: FreeAgentCategory): LLMCategory;
4
+ export declare function transformCategories(categories: FreeAgentCategory[]): LLMCategory[];
5
+ //# sourceMappingURL=category-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/category-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,WAAW,CAQ1E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,WAAW,EAAE,CAElF"}
@@ -0,0 +1,14 @@
1
+ import { extractId } from './common.js';
2
+ export function transformCategory(category) {
3
+ return {
4
+ id: extractId(category.url),
5
+ description: category.description,
6
+ nominalCode: category.nominal_code,
7
+ groupDescription: category.group_description,
8
+ allowableForTax: category.allowable_for_tax,
9
+ };
10
+ }
11
+ export function transformCategories(categories) {
12
+ return categories.map(transformCategory);
13
+ }
14
+ //# sourceMappingURL=category-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-transformer.js","sourceRoot":"","sources":["../../src/transformers/category-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,WAAW,EAAE,QAAQ,CAAC,YAAY;QAClC,gBAAgB,EAAE,QAAQ,CAAC,iBAAiB;QAC5C,eAAe,EAAE,QAAQ,CAAC,iBAAiB;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAA+B;IACjE,OAAO,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { extractId, parseNumericString } from '../utils/validators.js';
2
+ export { extractId, parseNumericString };
3
+ export declare function computeDaysOverdue(dueDate: string, status: string): number | undefined;
4
+ export declare function computeFullName(firstName?: string, lastName?: string, organisationName?: string): string;
5
+ export declare function parseDate(dateString: string | undefined | null): string | undefined;
6
+ export declare function computeLineTotal(quantity: string, price: string): number;
7
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/transformers/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAEzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActF;AAED,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAKxG;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAMnF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxE"}
@@ -0,0 +1,33 @@
1
+ import { extractId, parseNumericString } from '../utils/validators.js';
2
+ export { extractId, parseNumericString };
3
+ export function computeDaysOverdue(dueDate, status) {
4
+ if (status !== 'Overdue') {
5
+ return undefined;
6
+ }
7
+ const due = new Date(dueDate);
8
+ const today = new Date();
9
+ today.setHours(0, 0, 0, 0);
10
+ due.setHours(0, 0, 0, 0);
11
+ const diffTime = today.getTime() - due.getTime();
12
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
13
+ return diffDays > 0 ? diffDays : undefined;
14
+ }
15
+ export function computeFullName(firstName, lastName, organisationName) {
16
+ if (firstName || lastName) {
17
+ return [firstName, lastName].filter(Boolean).join(' ');
18
+ }
19
+ return organisationName ?? 'Unknown';
20
+ }
21
+ export function parseDate(dateString) {
22
+ if (!dateString) {
23
+ return undefined;
24
+ }
25
+ // FreeAgent dates are already in YYYY-MM-DD format
26
+ return dateString;
27
+ }
28
+ export function computeLineTotal(quantity, price) {
29
+ const qty = parseNumericString(quantity);
30
+ const prc = parseNumericString(price);
31
+ return Math.round(qty * prc * 100) / 100;
32
+ }
33
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/transformers/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAc;IAChE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAE7D,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAkB,EAAE,QAAiB,EAAE,gBAAyB;IAC9F,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,gBAAgB,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAqC;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,mDAAmD;IACnD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,KAAa;IAC9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FreeAgentCompany } from '../types/freeagent/index.js';
2
+ import type { LLMCompany } from '../types/llm/index.js';
3
+ export declare function transformCompany(company: FreeAgentCompany): LLMCompany;
4
+ //# sourceMappingURL=company-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/company-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAQtE"}
@@ -0,0 +1,10 @@
1
+ export function transformCompany(company) {
2
+ return {
3
+ name: company.name,
4
+ currency: company.currency,
5
+ type: company.type,
6
+ startDate: company.company_start_date,
7
+ salesTaxRegistered: company.sales_tax_registration_status === 'Registered',
8
+ };
9
+ }
10
+ //# sourceMappingURL=company-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-transformer.js","sourceRoot":"","sources":["../../src/transformers/company-transformer.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,kBAAkB;QACrC,kBAAkB,EAAE,OAAO,CAAC,6BAA6B,KAAK,YAAY;KAC3E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FreeAgentContact } from '../types/freeagent/index.js';
2
+ import type { LLMContact } from '../types/llm/index.js';
3
+ export declare function transformContact(contact: FreeAgentContact): LLMContact;
4
+ export declare function transformContacts(contacts: FreeAgentContact[]): LLMContact[];
5
+ //# sourceMappingURL=contact-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/contact-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAYtE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,CAE5E"}
@@ -0,0 +1,18 @@
1
+ import { extractId, parseNumericString, computeFullName } from './common.js';
2
+ export function transformContact(contact) {
3
+ return {
4
+ id: extractId(contact.url),
5
+ name: computeFullName(contact.first_name, contact.last_name, contact.organisation_name),
6
+ organisationName: contact.organisation_name,
7
+ email: contact.email,
8
+ phoneNumber: contact.phone_number,
9
+ accountBalance: parseNumericString(contact.account_balance),
10
+ status: contact.status,
11
+ activeProjectsCount: contact.active_projects_count,
12
+ paymentTermsDays: contact.default_payment_terms_in_days,
13
+ };
14
+ }
15
+ export function transformContacts(contacts) {
16
+ return contacts.map(transformContact);
17
+ }
18
+ //# sourceMappingURL=contact-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-transformer.js","sourceRoot":"","sources":["../../src/transformers/contact-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,iBAAiB,CAAC;QACvF,gBAAgB,EAAE,OAAO,CAAC,iBAAiB;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,YAAY;QACjC,cAAc,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC;QAC3D,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,mBAAmB,EAAE,OAAO,CAAC,qBAAqB;QAClD,gBAAgB,EAAE,OAAO,CAAC,6BAA6B;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA4B;IAC5D,OAAO,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FreeAgentExpense } from '../types/freeagent/index.js';
2
+ import type { LLMExpense } from '../types/llm/index.js';
3
+ export declare function transformExpense(expense: FreeAgentExpense): LLMExpense;
4
+ export declare function transformExpenses(expenses: FreeAgentExpense[]): LLMExpense[];
5
+ //# sourceMappingURL=expense-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expense-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/expense-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAatE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,CAE5E"}
@@ -0,0 +1,19 @@
1
+ import { extractId, parseNumericString } from './common.js';
2
+ export function transformExpense(expense) {
3
+ return {
4
+ id: extractId(expense.url),
5
+ userId: extractId(expense.user),
6
+ category: extractId(expense.category),
7
+ datedOn: expense.dated_on,
8
+ currency: expense.currency,
9
+ grossValue: parseNumericString(expense.gross_value),
10
+ salesTaxValue: expense.sales_tax_value ? parseNumericString(expense.sales_tax_value) : undefined,
11
+ description: expense.description,
12
+ projectId: expense.project ? extractId(expense.project) : undefined,
13
+ status: expense.status,
14
+ };
15
+ }
16
+ export function transformExpenses(expenses) {
17
+ return expenses.map(transformExpense);
18
+ }
19
+ //# sourceMappingURL=expense-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expense-transformer.js","sourceRoot":"","sources":["../../src/transformers/expense-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC,QAAQ;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;QACnD,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;QAChG,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QACnE,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA4B;IAC5D,OAAO,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { extractId, parseNumericString, computeDaysOverdue, computeFullName, parseDate, computeLineTotal } from './common.js';
2
+ export { transformCompany } from './company-transformer.js';
3
+ export { transformContact, transformContacts } from './contact-transformer.js';
4
+ export { transformInvoice, transformInvoices, transformInvoiceItem } from './invoice-transformer.js';
5
+ export { transformBill, transformBills, transformBillItem } from './bill-transformer.js';
6
+ export { transformBankAccount, transformBankAccounts, transformBankTransaction, transformBankTransactions } from './bank-transformer.js';
7
+ export { transformProject, transformProjects, transformTask, transformTasks, transformTimeslip, transformTimeslips } from './project-transformer.js';
8
+ export { transformExpense, transformExpenses } from './expense-transformer.js';
9
+ export { transformCategory, transformCategories } from './category-transformer.js';
10
+ export { transformUser, transformUsers } from './user-transformer.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9H,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACzI,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACrJ,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { extractId, parseNumericString, computeDaysOverdue, computeFullName, parseDate, computeLineTotal } from './common.js';
2
+ export { transformCompany } from './company-transformer.js';
3
+ export { transformContact, transformContacts } from './contact-transformer.js';
4
+ export { transformInvoice, transformInvoices, transformInvoiceItem } from './invoice-transformer.js';
5
+ export { transformBill, transformBills, transformBillItem } from './bill-transformer.js';
6
+ export { transformBankAccount, transformBankAccounts, transformBankTransaction, transformBankTransactions } from './bank-transformer.js';
7
+ export { transformProject, transformProjects, transformTask, transformTasks, transformTimeslip, transformTimeslips } from './project-transformer.js';
8
+ export { transformExpense, transformExpenses } from './expense-transformer.js';
9
+ export { transformCategory, transformCategories } from './category-transformer.js';
10
+ export { transformUser, transformUsers } from './user-transformer.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9H,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACzI,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACrJ,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FreeAgentInvoice, FreeAgentInvoiceItem } from '../types/freeagent/index.js';
2
+ import type { LLMInvoice, LLMInvoiceItem } from '../types/llm/index.js';
3
+ export declare function transformInvoiceItem(item: FreeAgentInvoiceItem): LLMInvoiceItem;
4
+ export declare function transformInvoice(invoice: FreeAgentInvoice, contactNameLookup?: Map<string, string>): LLMInvoice;
5
+ export declare function transformInvoices(invoices: FreeAgentInvoice[], contactNameLookup?: Map<string, string>): LLMInvoice[];
6
+ //# sourceMappingURL=invoice-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/invoice-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGxE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,cAAc,CAS/E;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,UAAU,CAwBZ;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,UAAU,EAAE,CAEd"}
@@ -0,0 +1,39 @@
1
+ import { extractId, parseNumericString, computeDaysOverdue, computeLineTotal } from './common.js';
2
+ export function transformInvoiceItem(item) {
3
+ return {
4
+ description: item.description ?? '',
5
+ itemType: item.item_type,
6
+ quantity: parseNumericString(item.quantity),
7
+ price: parseNumericString(item.price),
8
+ salesTaxRate: item.sales_tax_rate ? parseNumericString(item.sales_tax_rate) : undefined,
9
+ lineTotal: computeLineTotal(item.quantity, item.price),
10
+ };
11
+ }
12
+ export function transformInvoice(invoice, contactNameLookup) {
13
+ const contactId = extractId(invoice.contact);
14
+ const contactName = contactNameLookup?.get(invoice.contact) ?? contactId;
15
+ return {
16
+ id: extractId(invoice.url),
17
+ reference: invoice.reference,
18
+ contactId,
19
+ contactName,
20
+ projectId: invoice.project ? extractId(invoice.project) : undefined,
21
+ datedOn: invoice.dated_on,
22
+ dueOn: invoice.due_on,
23
+ currency: invoice.currency,
24
+ netValue: parseNumericString(invoice.net_value),
25
+ taxValue: parseNumericString(invoice.sales_tax_value),
26
+ totalValue: parseNumericString(invoice.total_value),
27
+ paidValue: parseNumericString(invoice.paid_value),
28
+ dueValue: parseNumericString(invoice.due_value),
29
+ status: invoice.status,
30
+ daysOverdue: computeDaysOverdue(invoice.due_on, invoice.status),
31
+ items: invoice.invoice_items.map(transformInvoiceItem),
32
+ comments: invoice.comments,
33
+ paymentTermsDays: invoice.payment_terms_in_days,
34
+ };
35
+ }
36
+ export function transformInvoices(invoices, contactNameLookup) {
37
+ return invoices.map((inv) => transformInvoice(inv, contactNameLookup));
38
+ }
39
+ //# sourceMappingURL=invoice-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-transformer.js","sourceRoot":"","sources":["../../src/transformers/invoice-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,UAAU,oBAAoB,CAAC,IAA0B;IAC7D,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3C,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QACrC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QACvF,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAyB,EACzB,iBAAuC;IAEvC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAEzE,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;QACT,WAAW;QACX,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QACnE,OAAO,EAAE,OAAO,CAAC,QAAQ;QACzB,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/C,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC;QACrD,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;QACnD,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;QACjD,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/C,MAAM,EAAE,OAAO,CAAC,MAA8B;QAC9C,WAAW,EAAE,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;QAC/D,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACtD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,OAAO,CAAC,qBAAqB;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,iBAAuC;IAEvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FreeAgentProject, FreeAgentTask, FreeAgentTimeslip } from '../types/freeagent/index.js';
2
+ import type { LLMProject, LLMTask, LLMTimeslip } from '../types/llm/index.js';
3
+ export declare function transformProject(project: FreeAgentProject, contactNameLookup?: Map<string, string>): LLMProject;
4
+ export declare function transformProjects(projects: FreeAgentProject[], contactNameLookup?: Map<string, string>): LLMProject[];
5
+ export declare function transformTask(task: FreeAgentTask): LLMTask;
6
+ export declare function transformTasks(tasks: FreeAgentTask[]): LLMTask[];
7
+ export declare function transformTimeslip(timeslip: FreeAgentTimeslip): LLMTimeslip;
8
+ export declare function transformTimeslips(timeslips: FreeAgentTimeslip[]): LLMTimeslip[];
9
+ //# sourceMappingURL=project-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-transformer.d.ts","sourceRoot":"","sources":["../../src/transformers/project-transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACtG,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG9E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,UAAU,CAkBZ;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,UAAU,EAAE,CAEd;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAU1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,WAAW,CAY1E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,WAAW,EAAE,CAEhF"}
@@ -0,0 +1,53 @@
1
+ import { extractId, parseNumericString } from './common.js';
2
+ export function transformProject(project, contactNameLookup) {
3
+ const contactId = extractId(project.contact);
4
+ const contactName = contactNameLookup?.get(project.contact) ?? contactId;
5
+ return {
6
+ id: extractId(project.url),
7
+ name: project.name,
8
+ contactId,
9
+ contactName,
10
+ status: project.status,
11
+ currency: project.currency,
12
+ budget: parseNumericString(project.budget),
13
+ budgetUnits: project.budget_units,
14
+ billingRate: project.normal_billing_rate ? parseNumericString(project.normal_billing_rate) : undefined,
15
+ isIR35: project.is_ir35,
16
+ startsOn: project.starts_on,
17
+ endsOn: project.ends_on,
18
+ };
19
+ }
20
+ export function transformProjects(projects, contactNameLookup) {
21
+ return projects.map((p) => transformProject(p, contactNameLookup));
22
+ }
23
+ export function transformTask(task) {
24
+ return {
25
+ id: extractId(task.url),
26
+ projectId: extractId(task.project),
27
+ name: task.name,
28
+ status: task.status,
29
+ isBillable: task.is_billable,
30
+ billingRate: task.billing_rate ? parseNumericString(task.billing_rate) : undefined,
31
+ budget: task.budget ? parseNumericString(task.budget) : undefined,
32
+ };
33
+ }
34
+ export function transformTasks(tasks) {
35
+ return tasks.map(transformTask);
36
+ }
37
+ export function transformTimeslip(timeslip) {
38
+ return {
39
+ id: extractId(timeslip.url),
40
+ userId: extractId(timeslip.user),
41
+ projectId: extractId(timeslip.project),
42
+ taskId: extractId(timeslip.task),
43
+ datedOn: timeslip.dated_on,
44
+ hours: parseNumericString(timeslip.hours),
45
+ comment: timeslip.comment,
46
+ status: timeslip.status,
47
+ billedOnInvoiceId: timeslip.billed_on_invoice ? extractId(timeslip.billed_on_invoice) : undefined,
48
+ };
49
+ }
50
+ export function transformTimeslips(timeslips) {
51
+ return timeslips.map(transformTimeslip);
52
+ }
53
+ //# sourceMappingURL=project-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-transformer.js","sourceRoot":"","sources":["../../src/transformers/project-transformer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAC9B,OAAyB,EACzB,iBAAuC;IAEvC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAEzE,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS;QACT,WAAW;QACX,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,YAAY;QACjC,WAAW,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS;QACtG,MAAM,EAAE,OAAO,CAAC,OAAO;QACvB,QAAQ,EAAE,OAAO,CAAC,SAAS;QAC3B,MAAM,EAAE,OAAO,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,iBAAuC;IAEvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QAClF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC3B,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC,OAAO,EAAE,QAAQ,CAAC,QAAQ;QAC1B,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS;KAClG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAA8B;IAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FreeAgentUser } from '../types/freeagent/index.js';
2
+ import type { LLMUser } from '../types/llm/index.js';
3
+ export declare function transformUser(user: FreeAgentUser): LLMUser;
4
+ export declare function transformUsers(users: FreeAgentUser[]): LLMUser[];
5
+ //# sourceMappingURL=user-transformer.d.ts.map