@infamousendeavors/lunchmoney-mcp 0.3.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 (80) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +288 -0
  3. package/SECURITY.md +130 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +82 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/auth-provider.d.ts +47 -0
  9. package/dist/auth-provider.d.ts.map +1 -0
  10. package/dist/auth-provider.js +111 -0
  11. package/dist/auth-provider.js.map +1 -0
  12. package/dist/cli.d.ts +13 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +103 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/credential-store.d.ts +25 -0
  17. package/dist/credential-store.d.ts.map +1 -0
  18. package/dist/credential-store.js +90 -0
  19. package/dist/credential-store.js.map +1 -0
  20. package/dist/index.d.ts +11 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +8 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/schemas/index.d.ts +189 -0
  25. package/dist/schemas/index.d.ts.map +1 -0
  26. package/dist/schemas/index.js +178 -0
  27. package/dist/schemas/index.js.map +1 -0
  28. package/dist/server.d.ts +32 -0
  29. package/dist/server.d.ts.map +1 -0
  30. package/dist/server.js +116 -0
  31. package/dist/server.js.map +1 -0
  32. package/dist/session-store.d.ts +28 -0
  33. package/dist/session-store.d.ts.map +1 -0
  34. package/dist/session-store.js +50 -0
  35. package/dist/session-store.js.map +1 -0
  36. package/dist/setup.d.ts +21 -0
  37. package/dist/setup.d.ts.map +1 -0
  38. package/dist/setup.js +104 -0
  39. package/dist/setup.js.map +1 -0
  40. package/dist/tools/assets.d.ts +4 -0
  41. package/dist/tools/assets.d.ts.map +1 -0
  42. package/dist/tools/assets.js +63 -0
  43. package/dist/tools/assets.js.map +1 -0
  44. package/dist/tools/budgets.d.ts +4 -0
  45. package/dist/tools/budgets.d.ts.map +1 -0
  46. package/dist/tools/budgets.js +63 -0
  47. package/dist/tools/budgets.js.map +1 -0
  48. package/dist/tools/categories.d.ts +4 -0
  49. package/dist/tools/categories.d.ts.map +1 -0
  50. package/dist/tools/categories.js +105 -0
  51. package/dist/tools/categories.js.map +1 -0
  52. package/dist/tools/plaid.d.ts +4 -0
  53. package/dist/tools/plaid.d.ts.map +1 -0
  54. package/dist/tools/plaid.js +33 -0
  55. package/dist/tools/plaid.js.map +1 -0
  56. package/dist/tools/recurring.d.ts +4 -0
  57. package/dist/tools/recurring.d.ts.map +1 -0
  58. package/dist/tools/recurring.js +63 -0
  59. package/dist/tools/recurring.js.map +1 -0
  60. package/dist/tools/tags.d.ts +4 -0
  61. package/dist/tools/tags.d.ts.map +1 -0
  62. package/dist/tools/tags.js +63 -0
  63. package/dist/tools/tags.js.map +1 -0
  64. package/dist/tools/transactions.d.ts +4 -0
  65. package/dist/tools/transactions.d.ts.map +1 -0
  66. package/dist/tools/transactions.js +146 -0
  67. package/dist/tools/transactions.js.map +1 -0
  68. package/dist/tools/user.d.ts +4 -0
  69. package/dist/tools/user.d.ts.map +1 -0
  70. package/dist/tools/user.js +19 -0
  71. package/dist/tools/user.js.map +1 -0
  72. package/dist/types/index.d.ts +164 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +2 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/errors.d.ts +8 -0
  77. package/dist/utils/errors.d.ts.map +1 -0
  78. package/dist/utils/errors.js +29 -0
  79. package/dist/utils/errors.js.map +1 -0
  80. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/tools/assets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAG7B,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,MAAwB;IAExB,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,kCAAkC;QAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,SAAS,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,KAAK,EAAE,IAAuC,EAAE,EAAE;YACzD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,SAAS,EAAE,IAAI,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sEAAsE;QACnF,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,IAAkE,EAAE,EAAE;YACpF,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAC5B,WAAW,EAAE,EAAE,EACf,UAAU,CACX,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,uBAAuB;QACpC,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,KAAK,EAAE,IAA8B,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,OAAO,SAAS,IAAI,CAAC,EAAE,uBAAuB,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerBudgetTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=budgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.d.ts","sourceRoot":"","sources":["../../src/tools/budgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AASpD,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,gBAAgB,QAgE3B"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ import { createBudgetSchema, updateBudgetSchema, idSchema, } from "../schemas/index.js";
4
+ export function registerBudgetTools(server, client) {
5
+ server.addTool({
6
+ name: "getBudgets",
7
+ description: "List all budgets with their category assignments and date ranges",
8
+ parameters: z.object({}),
9
+ execute: async () => {
10
+ try {
11
+ const response = await client.get("/budgets");
12
+ return JSON.stringify(response, null, 2);
13
+ }
14
+ catch (error) {
15
+ return formatErrorForMCP(error);
16
+ }
17
+ },
18
+ });
19
+ server.addTool({
20
+ name: "createBudget",
21
+ description: "Create a new budget for a category with amount and date range",
22
+ parameters: createBudgetSchema,
23
+ execute: async (args) => {
24
+ try {
25
+ const budget = await client.post("/budgets", args);
26
+ return JSON.stringify(budget, null, 2);
27
+ }
28
+ catch (error) {
29
+ return formatErrorForMCP(error);
30
+ }
31
+ },
32
+ });
33
+ server.addTool({
34
+ name: "updateBudget",
35
+ description: "Update an existing budget's amount, category, or date range",
36
+ parameters: idSchema.merge(updateBudgetSchema),
37
+ execute: async (args) => {
38
+ try {
39
+ const { id, ...updateData } = args;
40
+ const budget = await client.put(`/budgets/${id}`, updateData);
41
+ return JSON.stringify(budget, null, 2);
42
+ }
43
+ catch (error) {
44
+ return formatErrorForMCP(error);
45
+ }
46
+ },
47
+ });
48
+ server.addTool({
49
+ name: "deleteBudget",
50
+ description: "Delete a budget by ID",
51
+ parameters: idSchema,
52
+ execute: async (args) => {
53
+ try {
54
+ await client.delete(`/budgets/${args.id}`);
55
+ return `Budget ${args.id} deleted successfully`;
56
+ }
57
+ catch (error) {
58
+ return formatErrorForMCP(error);
59
+ }
60
+ },
61
+ });
62
+ }
63
+ //# sourceMappingURL=budgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budgets.js","sourceRoot":"","sources":["../../src/tools/budgets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,GACX,MAAM,qBAAqB,CAAC;AAG7B,MAAM,UAAU,mBAAmB,CAC/B,MAAe,EACf,MAAwB;IAExB,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,kEAAkE;QAC/E,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,UAAU,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,+DAA+D;QAC5E,UAAU,EAAE,kBAAkB;QAC9B,OAAO,EAAE,KAAK,EAAE,IAAwC,EAAE,EAAE;YACxD,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,UAAU,EACV,IAAI,CACP,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,6DAA6D;QAC1E,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,IAAmE,EAAE,EAAE;YACnF,IAAI,CAAC;gBACD,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,YAAY,EAAE,EAAE,EAChB,UAAU,CACb,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,uBAAuB;QACpC,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,KAAK,EAAE,IAA8B,EAAE,EAAE;YAC9C,IAAI,CAAC;gBACD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,OAAO,UAAU,IAAI,CAAC,EAAE,uBAAuB,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerCategoryTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../src/tools/categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAWpD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,gBAAgB,QAkHzB"}
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ import { createCategorySchema, updateCategorySchema, createCategoryGroupSchema, addToGroupSchema, idSchema, } from "../schemas/index.js";
4
+ export function registerCategoryTools(server, client) {
5
+ server.addTool({
6
+ name: "getCategories",
7
+ description: "List all categories including category groups and parent categories",
8
+ parameters: z.object({}),
9
+ execute: async () => {
10
+ try {
11
+ const response = await client.get("/categories");
12
+ return JSON.stringify(response, null, 2);
13
+ }
14
+ catch (error) {
15
+ return formatErrorForMCP(error);
16
+ }
17
+ },
18
+ });
19
+ server.addTool({
20
+ name: "createCategory",
21
+ description: "Create a new spending or income category",
22
+ parameters: createCategorySchema,
23
+ execute: async (args) => {
24
+ try {
25
+ const category = await client.post("/categories", args);
26
+ return JSON.stringify(category, null, 2);
27
+ }
28
+ catch (error) {
29
+ return formatErrorForMCP(error);
30
+ }
31
+ },
32
+ });
33
+ server.addTool({
34
+ name: "updateCategory",
35
+ description: "Update an existing category's properties",
36
+ parameters: idSchema.merge(updateCategorySchema),
37
+ execute: async (args) => {
38
+ try {
39
+ const { id, ...updateData } = args;
40
+ const category = await client.put(`/categories/${id}`, updateData);
41
+ return JSON.stringify(category, null, 2);
42
+ }
43
+ catch (error) {
44
+ return formatErrorForMCP(error);
45
+ }
46
+ },
47
+ });
48
+ server.addTool({
49
+ name: "deleteCategory",
50
+ description: "Delete a category by ID",
51
+ parameters: idSchema,
52
+ execute: async (args) => {
53
+ try {
54
+ await client.delete(`/categories/${args.id}`);
55
+ return `Category ${args.id} deleted successfully`;
56
+ }
57
+ catch (error) {
58
+ return formatErrorForMCP(error);
59
+ }
60
+ },
61
+ });
62
+ server.addTool({
63
+ name: "getCategory",
64
+ description: "Get a single category by ID",
65
+ parameters: idSchema,
66
+ execute: async (args) => {
67
+ try {
68
+ const category = await client.get(`/categories/${args.id}`);
69
+ return JSON.stringify(category, null, 2);
70
+ }
71
+ catch (error) {
72
+ return formatErrorForMCP(error);
73
+ }
74
+ },
75
+ });
76
+ server.addTool({
77
+ name: "createCategoryGroup",
78
+ description: "Create a new category group with an optional list of category IDs",
79
+ parameters: createCategoryGroupSchema,
80
+ execute: async (args) => {
81
+ try {
82
+ const response = await client.post("/categories/group", args);
83
+ return JSON.stringify(response, null, 2);
84
+ }
85
+ catch (error) {
86
+ return formatErrorForMCP(error);
87
+ }
88
+ },
89
+ });
90
+ server.addTool({
91
+ name: "addToGroup",
92
+ description: "Add existing categories to a category group",
93
+ parameters: addToGroupSchema,
94
+ execute: async (args) => {
95
+ try {
96
+ const response = await client.post(`/categories/group/${args.group_id}/add`, { category_ids: args.category_ids });
97
+ return JSON.stringify(response, null, 2);
98
+ }
99
+ catch (error) {
100
+ return formatErrorForMCP(error);
101
+ }
102
+ },
103
+ });
104
+ }
105
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/tools/categories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerPlaidTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=plaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plaid.d.ts","sourceRoot":"","sources":["../../src/tools/plaid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,gBAAgB,QA8BzB"}
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ export function registerPlaidTools(server, client) {
4
+ server.addTool({
5
+ name: "getPlaidAccounts",
6
+ description: "List all Plaid-connected accounts with balances",
7
+ parameters: z.object({}),
8
+ execute: async () => {
9
+ try {
10
+ const response = await client.get("/plaid_accounts");
11
+ return JSON.stringify(response, null, 2);
12
+ }
13
+ catch (error) {
14
+ return formatErrorForMCP(error);
15
+ }
16
+ },
17
+ });
18
+ server.addTool({
19
+ name: "fetchPlaidAccounts",
20
+ description: "Trigger a Plaid sync to update account balances",
21
+ parameters: z.object({}),
22
+ execute: async () => {
23
+ try {
24
+ const response = await client.post("/plaid_accounts/fetch");
25
+ return JSON.stringify(response, null, 2);
26
+ }
27
+ catch (error) {
28
+ return formatErrorForMCP(error);
29
+ }
30
+ },
31
+ });
32
+ }
33
+ //# sourceMappingURL=plaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plaid.js","sourceRoot":"","sources":["../../src/tools/plaid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,MAAwB;IAExB,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iDAAiD;QAC9D,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GACZ,MAAM,MAAM,CAAC,GAAG,CAAwB,iBAAiB,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,iDAAiD;QAC9D,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,uBAAuB,CAAC,CAAC;gBACrE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerRecurringTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=recurring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurring.d.ts","sourceRoot":"","sources":["../../src/tools/recurring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AASpD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,gBAAgB,QAkEzB"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ import { createRecurringItemSchema, updateRecurringItemSchema, idSchema, } from "../schemas/index.js";
4
+ export function registerRecurringTools(server, client) {
5
+ server.addTool({
6
+ name: "getRecurringItems",
7
+ description: "List all recurring expense and income items",
8
+ parameters: z.object({}),
9
+ execute: async () => {
10
+ try {
11
+ const response = await client.get("/recurring_expenses");
12
+ return JSON.stringify(response, null, 2);
13
+ }
14
+ catch (error) {
15
+ return formatErrorForMCP(error);
16
+ }
17
+ },
18
+ });
19
+ server.addTool({
20
+ name: "createRecurringItem",
21
+ description: "Create a new recurring expense or income item",
22
+ parameters: createRecurringItemSchema,
23
+ execute: async (args) => {
24
+ try {
25
+ const item = await client.post("/recurring_expenses", args);
26
+ return JSON.stringify(item, null, 2);
27
+ }
28
+ catch (error) {
29
+ return formatErrorForMCP(error);
30
+ }
31
+ },
32
+ });
33
+ server.addTool({
34
+ name: "updateRecurringItem",
35
+ description: "Update an existing recurring item's properties",
36
+ parameters: idSchema.merge(updateRecurringItemSchema),
37
+ execute: async (args) => {
38
+ try {
39
+ const { id, ...updateData } = args;
40
+ const item = await client.put(`/recurring_expenses/${id}`, updateData);
41
+ return JSON.stringify(item, null, 2);
42
+ }
43
+ catch (error) {
44
+ return formatErrorForMCP(error);
45
+ }
46
+ },
47
+ });
48
+ server.addTool({
49
+ name: "deleteRecurringItem",
50
+ description: "Delete a recurring item by ID",
51
+ parameters: idSchema,
52
+ execute: async (args) => {
53
+ try {
54
+ await client.delete(`/recurring_expenses/${args.id}`);
55
+ return `Recurring item ${args.id} deleted successfully`;
56
+ }
57
+ catch (error) {
58
+ return formatErrorForMCP(error);
59
+ }
60
+ },
61
+ });
62
+ }
63
+ //# sourceMappingURL=recurring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recurring.js","sourceRoot":"","sources":["../../src/tools/recurring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAG7B,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,MAAwB;IAExB,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,6CAA6C;QAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,qBAAqB,CACtB,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,+CAA+C;QAC5D,UAAU,EAAE,yBAAyB;QACrC,OAAO,EAAE,KAAK,EAAE,IAA+C,EAAE,EAAE;YACjE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,qBAAqB,EACrB,IAAI,CACL,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,gDAAgD;QAC7D,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,yBAAyB,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,IAA0E,EAAE,EAAE;YAC5F,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,uBAAuB,EAAE,EAAE,EAC3B,UAAU,CACX,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,+BAA+B;QAC5C,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,KAAK,EAAE,IAA8B,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtD,OAAO,kBAAkB,IAAI,CAAC,EAAE,uBAAuB,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerTagTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AASpD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,QA4DzE"}
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ import { createTagSchema, updateTagSchema, idSchema, } from "../schemas/index.js";
4
+ export function registerTagTools(server, client) {
5
+ server.addTool({
6
+ name: "getTags",
7
+ description: "List all transaction tags",
8
+ parameters: z.object({}),
9
+ execute: async () => {
10
+ try {
11
+ const response = await client.get("/tags");
12
+ return JSON.stringify(response, null, 2);
13
+ }
14
+ catch (error) {
15
+ return formatErrorForMCP(error);
16
+ }
17
+ },
18
+ });
19
+ server.addTool({
20
+ name: "createTag",
21
+ description: "Create a new tag for categorizing transactions",
22
+ parameters: createTagSchema,
23
+ execute: async (args) => {
24
+ try {
25
+ const tag = await client.post("/tags", args);
26
+ return JSON.stringify(tag, null, 2);
27
+ }
28
+ catch (error) {
29
+ return formatErrorForMCP(error);
30
+ }
31
+ },
32
+ });
33
+ server.addTool({
34
+ name: "updateTag",
35
+ description: "Update an existing tag's name",
36
+ parameters: idSchema.merge(updateTagSchema),
37
+ execute: async (args) => {
38
+ try {
39
+ const { id, ...updateData } = args;
40
+ const tag = await client.put(`/tags/${id}`, updateData);
41
+ return JSON.stringify(tag, null, 2);
42
+ }
43
+ catch (error) {
44
+ return formatErrorForMCP(error);
45
+ }
46
+ },
47
+ });
48
+ server.addTool({
49
+ name: "deleteTag",
50
+ description: "Delete a tag by ID",
51
+ parameters: idSchema,
52
+ execute: async (args) => {
53
+ try {
54
+ await client.delete(`/tags/${args.id}`);
55
+ return `Tag ${args.id} deleted successfully`;
56
+ }
57
+ catch (error) {
58
+ return formatErrorForMCP(error);
59
+ }
60
+ },
61
+ });
62
+ }
63
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/tools/tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAG7B,MAAM,UAAU,gBAAgB,CAAC,MAAe,EAAE,MAAwB;IACxE,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,2BAA2B;QACxC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,OAAO,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,gDAAgD;QAC7D,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAqC,EAAE,EAAE;YACvD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAe,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,+BAA+B;QAC5C,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,IAAgE,EAAE,EAAE;YAClF,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;gBACnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,SAAS,EAAE,EAAE,EACb,UAAU,CACX,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,oBAAoB;QACjC,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,KAAK,EAAE,IAA8B,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,OAAO,OAAO,IAAI,CAAC,EAAE,uBAAuB,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerTransactionTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/tools/transactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAapD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,gBAAgB,QAuKzB"}
@@ -0,0 +1,146 @@
1
+ import { formatErrorForMCP } from "../utils/errors.js";
2
+ import { transactionFilterSchema, createTransactionSchema, updateTransactionSchema, bulkUpdateTransactionsSchema, createTransactionGroupSchema, unsplitTransactionsSchema, idSchema, } from "../schemas/index.js";
3
+ export function registerTransactionTools(server, client) {
4
+ server.addTool({
5
+ name: "getTransactions",
6
+ description: "List transactions with advanced filtering options including date range, category, tags, account, and status",
7
+ parameters: transactionFilterSchema,
8
+ execute: async (args) => {
9
+ try {
10
+ const response = await client.get("/transactions", args);
11
+ return JSON.stringify(response, null, 2);
12
+ }
13
+ catch (error) {
14
+ return formatErrorForMCP(error);
15
+ }
16
+ },
17
+ });
18
+ server.addTool({
19
+ name: "getTransaction",
20
+ description: "Get a single transaction by ID",
21
+ parameters: idSchema,
22
+ execute: async (args) => {
23
+ try {
24
+ const response = await client.get(`/transactions/${args.id}`);
25
+ return JSON.stringify(response, null, 2);
26
+ }
27
+ catch (error) {
28
+ return formatErrorForMCP(error);
29
+ }
30
+ },
31
+ });
32
+ server.addTool({
33
+ name: "createTransaction",
34
+ description: "Create a new transaction (expense, income, or transfer)",
35
+ parameters: createTransactionSchema,
36
+ execute: async (args) => {
37
+ try {
38
+ const transaction = await client.post("/transactions", args);
39
+ return JSON.stringify(transaction, null, 2);
40
+ }
41
+ catch (error) {
42
+ return formatErrorForMCP(error);
43
+ }
44
+ },
45
+ });
46
+ server.addTool({
47
+ name: "updateTransaction",
48
+ description: "Update an existing transaction's properties",
49
+ parameters: idSchema.merge(updateTransactionSchema),
50
+ execute: async (args) => {
51
+ try {
52
+ const { id, ...updateData } = args;
53
+ const transaction = await client.put(`/transactions/${id}`, updateData);
54
+ return JSON.stringify(transaction, null, 2);
55
+ }
56
+ catch (error) {
57
+ return formatErrorForMCP(error);
58
+ }
59
+ },
60
+ });
61
+ server.addTool({
62
+ name: "deleteTransaction",
63
+ description: "Delete a transaction by ID",
64
+ parameters: idSchema,
65
+ execute: async (args) => {
66
+ try {
67
+ await client.delete(`/transactions/${args.id}`);
68
+ return `Transaction ${args.id} deleted successfully`;
69
+ }
70
+ catch (error) {
71
+ return formatErrorForMCP(error);
72
+ }
73
+ },
74
+ });
75
+ server.addTool({
76
+ name: "bulkUpdateTransactions",
77
+ description: "Bulk update multiple transactions with the same changes (category, tags, notes, status)",
78
+ parameters: bulkUpdateTransactionsSchema,
79
+ execute: async (args) => {
80
+ try {
81
+ const result = await client.post("/transactions/bulk", args);
82
+ return JSON.stringify(result, null, 2);
83
+ }
84
+ catch (error) {
85
+ return formatErrorForMCP(error);
86
+ }
87
+ },
88
+ });
89
+ server.addTool({
90
+ name: "getTransactionGroup",
91
+ description: "Retrieve a transaction group with all child transactions",
92
+ parameters: idSchema,
93
+ execute: async (args) => {
94
+ try {
95
+ const response = await client.get("/transactions/group", { transaction_id: args.id });
96
+ return JSON.stringify(response, null, 2);
97
+ }
98
+ catch (error) {
99
+ return formatErrorForMCP(error);
100
+ }
101
+ },
102
+ });
103
+ server.addTool({
104
+ name: "createTransactionGroup",
105
+ description: "Group multiple transaction IDs under a single parent transaction",
106
+ parameters: createTransactionGroupSchema,
107
+ execute: async (args) => {
108
+ try {
109
+ const response = await client.post("/transactions/group", args);
110
+ return JSON.stringify(response, null, 2);
111
+ }
112
+ catch (error) {
113
+ return formatErrorForMCP(error);
114
+ }
115
+ },
116
+ });
117
+ server.addTool({
118
+ name: "deleteTransactionGroup",
119
+ description: "Delete a transaction group, restoring individual transactions",
120
+ parameters: idSchema,
121
+ execute: async (args) => {
122
+ try {
123
+ await client.delete(`/transactions/group/${args.id}`);
124
+ return `Transaction group ${args.id} deleted successfully`;
125
+ }
126
+ catch (error) {
127
+ return formatErrorForMCP(error);
128
+ }
129
+ },
130
+ });
131
+ server.addTool({
132
+ name: "unsplitTransactions",
133
+ description: "Reverse a split, merging child transactions back into parent",
134
+ parameters: unsplitTransactionsSchema,
135
+ execute: async (args) => {
136
+ try {
137
+ const response = await client.post("/transactions/unsplit", args);
138
+ return JSON.stringify(response, null, 2);
139
+ }
140
+ catch (error) {
141
+ return formatErrorForMCP(error);
142
+ }
143
+ },
144
+ });
145
+ }
146
+ //# sourceMappingURL=transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/tools/transactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { FastMCP } from "fastmcp";
2
+ import { LunchMoneyClient } from "../api/client.js";
3
+ export declare function registerUserTools(server: FastMCP, client: LunchMoneyClient): void;
4
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/tools/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,QAc1E"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import { formatErrorForMCP } from "../utils/errors.js";
3
+ export function registerUserTools(server, client) {
4
+ server.addTool({
5
+ name: "getUser",
6
+ description: "Get the current user's account details including email, name, currency preferences, and settings",
7
+ parameters: z.object({}),
8
+ execute: async () => {
9
+ try {
10
+ const user = await client.get("/me");
11
+ return JSON.stringify(user, null, 2);
12
+ }
13
+ catch (error) {
14
+ return formatErrorForMCP(error);
15
+ }
16
+ },
17
+ });
18
+ }
19
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/tools/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,UAAU,iBAAiB,CAAC,MAAe,EAAE,MAAwB;IACvE,MAAM,CAAC,OAAO,CAAC;QACX,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,kGAAkG;QAC/G,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAO,KAAK,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}