foundryvtt-mcp 0.11.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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/character/manager.d.ts +92 -0
  4. package/dist/character/manager.d.ts.map +1 -0
  5. package/dist/character/manager.js +208 -0
  6. package/dist/character/manager.js.map +1 -0
  7. package/dist/combat/manager.d.ts +94 -0
  8. package/dist/combat/manager.d.ts.map +1 -0
  9. package/dist/combat/manager.js +373 -0
  10. package/dist/combat/manager.js.map +1 -0
  11. package/dist/config/index.d.ts +114 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +177 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/diagnostics/client.d.ts +193 -0
  16. package/dist/diagnostics/client.d.ts.map +1 -0
  17. package/dist/diagnostics/client.js +314 -0
  18. package/dist/diagnostics/client.js.map +1 -0
  19. package/dist/diagnostics/types.d.ts +414 -0
  20. package/dist/diagnostics/types.d.ts.map +1 -0
  21. package/dist/diagnostics/types.js +94 -0
  22. package/dist/diagnostics/types.js.map +1 -0
  23. package/dist/foundry/auth.d.ts +19 -0
  24. package/dist/foundry/auth.d.ts.map +1 -0
  25. package/dist/foundry/auth.js +135 -0
  26. package/dist/foundry/auth.js.map +1 -0
  27. package/dist/foundry/client.d.ts +95 -0
  28. package/dist/foundry/client.d.ts.map +1 -0
  29. package/dist/foundry/client.js +692 -0
  30. package/dist/foundry/client.js.map +1 -0
  31. package/dist/foundry/types.d.ts +805 -0
  32. package/dist/foundry/types.d.ts.map +1 -0
  33. package/dist/foundry/types.js +13 -0
  34. package/dist/foundry/types.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +199 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/resources/index.d.ts +3 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +93 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/tools/base.d.ts +80 -0
  44. package/dist/tools/base.d.ts.map +1 -0
  45. package/dist/tools/base.js +73 -0
  46. package/dist/tools/base.js.map +1 -0
  47. package/dist/tools/definitions.d.ts +414 -0
  48. package/dist/tools/definitions.d.ts.map +1 -0
  49. package/dist/tools/definitions.js +429 -0
  50. package/dist/tools/definitions.js.map +1 -0
  51. package/dist/tools/handlers/actors.d.ts +31 -0
  52. package/dist/tools/handlers/actors.d.ts.map +1 -0
  53. package/dist/tools/handlers/actors.js +76 -0
  54. package/dist/tools/handlers/actors.js.map +1 -0
  55. package/dist/tools/handlers/chat.d.ts +13 -0
  56. package/dist/tools/handlers/chat.d.ts.map +1 -0
  57. package/dist/tools/handlers/chat.js +38 -0
  58. package/dist/tools/handlers/chat.js.map +1 -0
  59. package/dist/tools/handlers/combat.d.ts +11 -0
  60. package/dist/tools/handlers/combat.d.ts.map +1 -0
  61. package/dist/tools/handlers/combat.js +48 -0
  62. package/dist/tools/handlers/combat.js.map +1 -0
  63. package/dist/tools/handlers/diagnostics.d.ts +64 -0
  64. package/dist/tools/handlers/diagnostics.d.ts.map +1 -0
  65. package/dist/tools/handlers/diagnostics.js +182 -0
  66. package/dist/tools/handlers/diagnostics.js.map +1 -0
  67. package/dist/tools/handlers/dice.d.ts +39 -0
  68. package/dist/tools/handlers/dice.d.ts.map +1 -0
  69. package/dist/tools/handlers/dice.js +53 -0
  70. package/dist/tools/handlers/dice.js.map +1 -0
  71. package/dist/tools/handlers/generation.d.ts +44 -0
  72. package/dist/tools/handlers/generation.d.ts.map +1 -0
  73. package/dist/tools/handlers/generation.js +205 -0
  74. package/dist/tools/handlers/generation.js.map +1 -0
  75. package/dist/tools/handlers/items.d.ts +21 -0
  76. package/dist/tools/handlers/items.d.ts.map +1 -0
  77. package/dist/tools/handlers/items.js +50 -0
  78. package/dist/tools/handlers/items.js.map +1 -0
  79. package/dist/tools/handlers/journals.d.ts +22 -0
  80. package/dist/tools/handlers/journals.d.ts.map +1 -0
  81. package/dist/tools/handlers/journals.js +62 -0
  82. package/dist/tools/handlers/journals.js.map +1 -0
  83. package/dist/tools/handlers/resources.d.ts +13 -0
  84. package/dist/tools/handlers/resources.d.ts.map +1 -0
  85. package/dist/tools/handlers/resources.js +188 -0
  86. package/dist/tools/handlers/resources.js.map +1 -0
  87. package/dist/tools/handlers/scenes.d.ts +18 -0
  88. package/dist/tools/handlers/scenes.d.ts.map +1 -0
  89. package/dist/tools/handlers/scenes.js +34 -0
  90. package/dist/tools/handlers/scenes.js.map +1 -0
  91. package/dist/tools/handlers/users.d.ts +11 -0
  92. package/dist/tools/handlers/users.d.ts.map +1 -0
  93. package/dist/tools/handlers/users.js +34 -0
  94. package/dist/tools/handlers/users.js.map +1 -0
  95. package/dist/tools/handlers/utils.d.ts +11 -0
  96. package/dist/tools/handlers/utils.d.ts.map +1 -0
  97. package/dist/tools/handlers/utils.js +24 -0
  98. package/dist/tools/handlers/utils.js.map +1 -0
  99. package/dist/tools/handlers/world.d.ts +26 -0
  100. package/dist/tools/handlers/world.d.ts.map +1 -0
  101. package/dist/tools/handlers/world.js +92 -0
  102. package/dist/tools/handlers/world.js.map +1 -0
  103. package/dist/tools/index.d.ts +19 -0
  104. package/dist/tools/index.d.ts.map +1 -0
  105. package/dist/tools/index.js +22 -0
  106. package/dist/tools/index.js.map +1 -0
  107. package/dist/tools/new-router.d.ts +29 -0
  108. package/dist/tools/new-router.d.ts.map +1 -0
  109. package/dist/tools/new-router.js +97 -0
  110. package/dist/tools/new-router.js.map +1 -0
  111. package/dist/tools/registry.d.ts +51 -0
  112. package/dist/tools/registry.d.ts.map +1 -0
  113. package/dist/tools/registry.js +79 -0
  114. package/dist/tools/registry.js.map +1 -0
  115. package/dist/tools/resources.d.ts +16 -0
  116. package/dist/tools/resources.d.ts.map +1 -0
  117. package/dist/tools/resources.js +63 -0
  118. package/dist/tools/resources.js.map +1 -0
  119. package/dist/tools/router.d.ts +22 -0
  120. package/dist/tools/router.d.ts.map +1 -0
  121. package/dist/tools/router.js +128 -0
  122. package/dist/tools/router.js.map +1 -0
  123. package/dist/utils/cache-instance.d.ts +25 -0
  124. package/dist/utils/cache-instance.d.ts.map +1 -0
  125. package/dist/utils/cache-instance.js +30 -0
  126. package/dist/utils/cache-instance.js.map +1 -0
  127. package/dist/utils/cache.d.ts +80 -0
  128. package/dist/utils/cache.d.ts.map +1 -0
  129. package/dist/utils/cache.js +205 -0
  130. package/dist/utils/cache.js.map +1 -0
  131. package/dist/utils/diagnostics.d.ts +114 -0
  132. package/dist/utils/diagnostics.d.ts.map +1 -0
  133. package/dist/utils/diagnostics.js +330 -0
  134. package/dist/utils/diagnostics.js.map +1 -0
  135. package/dist/utils/logger.d.ts +137 -0
  136. package/dist/utils/logger.d.ts.map +1 -0
  137. package/dist/utils/logger.js +158 -0
  138. package/dist/utils/logger.js.map +1 -0
  139. package/package.json +98 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @fileoverview Item management tool handlers
3
+ *
4
+ * Handles searching for items and retrieving detailed item information.
5
+ */
6
+ import { withToolError } from './utils.js';
7
+ /**
8
+ * Handles item search requests
9
+ */
10
+ export async function handleSearchItems(args, foundryClient) {
11
+ const { query, type, rarity, limit = 10 } = args;
12
+ return withToolError('search items', async () => {
13
+ const searchParams = {
14
+ query: query || '',
15
+ limit,
16
+ };
17
+ if (type) {
18
+ searchParams.type = type;
19
+ }
20
+ if (rarity) {
21
+ searchParams.rarity = rarity;
22
+ }
23
+ const result = await foundryClient.searchItems(searchParams);
24
+ const itemList = result.items
25
+ .map((item) => {
26
+ const price = item.price
27
+ ? `${item.price.value} ${item.price.denomination}`
28
+ : 'Unknown price';
29
+ return `- **${item.name}** (${item.type}) - ${item.rarity || 'Common'} - ${price}`;
30
+ })
31
+ .join('\n');
32
+ return {
33
+ content: [
34
+ {
35
+ type: 'text',
36
+ text: `⚔️ **Item Search Results**
37
+ **Query:** ${query || 'All items'}
38
+ **Type Filter:** ${type || 'All types'}
39
+ **Rarity Filter:** ${rarity || 'All rarities'}
40
+ **Results:** ${result.items.length}/${result.total} total
41
+
42
+ ${itemList || 'No items found matching the criteria.'}
43
+
44
+ **Page:** ${result.page} | **Limit:** ${result.limit}`,
45
+ },
46
+ ],
47
+ };
48
+ });
49
+ }
50
+ //# sourceMappingURL=items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/tools/handlers/items.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAKC,EACD,aAA4B;IAE5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAEjD,OAAO,aAAa,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,YAAY,GAAqE;YACrF,KAAK,EAAE,KAAK,IAAI,EAAE;YAClB,KAAK;SACN,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK;aAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;gBACtB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;gBAClD,CAAC,CAAC,eAAe,CAAC;YACpB,OAAO,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,MAAM,KAAK,EAAE,CAAC;QACrF,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;aACH,KAAK,IAAI,WAAW;mBACd,IAAI,IAAI,WAAW;qBACjB,MAAM,IAAI,cAAc;eAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK;;EAEhD,QAAQ,IAAI,uCAAuC;;YAEzC,MAAM,CAAC,IAAI,iBAAiB,MAAM,CAAC,KAAK,EAAE;iBAC7C;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Journal entry tool handlers
3
+ */
4
+ import type { FoundryClient } from '../../foundry/client.js';
5
+ export declare function handleSearchJournals(args: {
6
+ query: string;
7
+ limit?: number;
8
+ }, foundryClient: FoundryClient): Promise<{
9
+ content: {
10
+ type: string;
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ export declare function handleGetJournal(args: {
15
+ journalId: string;
16
+ }, foundryClient: FoundryClient): Promise<{
17
+ content: {
18
+ type: string;
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ //# sourceMappingURL=journals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journals.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/journals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACvC,aAAa,EAAE,aAAa;;;;;GAkC7B;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,aAAa,EAAE,aAAa;;;;;GA6B/F"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Journal entry tool handlers
3
+ */
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { withToolError } from './utils.js';
6
+ export async function handleSearchJournals(args, foundryClient) {
7
+ return withToolError('search journals', async () => {
8
+ const results = foundryClient.searchJournals(args.query);
9
+ const limit = args.limit || 10;
10
+ const limited = results.slice(0, limit);
11
+ if (limited.length === 0) {
12
+ return {
13
+ content: [
14
+ {
15
+ type: 'text',
16
+ text: `No journals found matching "${args.query}".`,
17
+ },
18
+ ],
19
+ };
20
+ }
21
+ const formatted = limited
22
+ .map((j) => {
23
+ const pageCount = j.pages?.length || 0;
24
+ return `- **${j.name}** (${pageCount} page${pageCount !== 1 ? 's' : ''}) — ID: ${j._id}`;
25
+ })
26
+ .join('\n');
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: `**Journal Search** — "${args.query}" (${results.length} results)\n\n${formatted}`,
32
+ },
33
+ ],
34
+ };
35
+ });
36
+ }
37
+ export async function handleGetJournal(args, foundryClient) {
38
+ return withToolError('get journal', async () => {
39
+ const journal = foundryClient.getJournal(args.journalId);
40
+ if (!journal) {
41
+ throw new McpError(ErrorCode.InvalidParams, `Journal not found: ${args.journalId}`);
42
+ }
43
+ const pages = journal.pages
44
+ ?.map((p) => {
45
+ const content = p.text?.content
46
+ ?.replace(/<[^>]+>/g, '')
47
+ .trim()
48
+ .slice(0, 500) || '';
49
+ return `### ${p.name}\n${content}${content.length >= 500 ? '...' : ''}`;
50
+ })
51
+ .join('\n\n') || 'No pages.';
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: `**Journal: ${journal.name}**\nID: ${journal._id}\n\n${pages}`,
57
+ },
58
+ ],
59
+ };
60
+ });
61
+ }
62
+ //# sourceMappingURL=journals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journals.js","sourceRoot":"","sources":["../../../src/tools/handlers/journals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAuC,EACvC,aAA4B;IAE5B,OAAO,aAAa,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,IAAI,CAAC,KAAK,IAAI;qBACpD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,OAAO;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;YACvC,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3F,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,gBAAgB,SAAS,EAAE;iBACzF;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA2B,EAAE,aAA4B;IAC9F,OAAO,aAAa,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,sBAAsB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;YACX,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,OAAO,GACX,CAAC,CAAC,IAAI,EAAE,OAAO;gBACb,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACxB,IAAI,EAAE;iBACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1E,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC;QAEjC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,cAAc,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,GAAG,OAAO,KAAK,EAAE;iBACrE;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Resource access handlers
3
+ */
4
+ import type { DiagnosticsClient } from '../../diagnostics/client.js';
5
+ import type { FoundryClient } from '../../foundry/client.js';
6
+ export declare function handleReadResource(uri: string, foundryClient: FoundryClient, diagnosticsClient: DiagnosticsClient): Promise<{
7
+ contents: {
8
+ uri: string;
9
+ mimeType: string;
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB;;;;;;GAmCrC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Resource access handlers
3
+ */
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ import { withToolError } from './utils.js';
7
+ export async function handleReadResource(uri, foundryClient, diagnosticsClient) {
8
+ return withToolError('read resource', async () => {
9
+ switch (uri) {
10
+ case 'foundry://actors':
11
+ return await getActorsResource(foundryClient);
12
+ case 'foundry://items':
13
+ return await getItemsResource(foundryClient);
14
+ case 'foundry://scenes':
15
+ return await getScenesResource(foundryClient);
16
+ case 'foundry://scenes/current':
17
+ return await getCurrentSceneResource(foundryClient);
18
+ case 'foundry://world/settings':
19
+ return await getWorldSettingsResource(foundryClient);
20
+ case 'foundry://journals':
21
+ return await getJournalsResource(foundryClient);
22
+ case 'foundry://users':
23
+ return await getUsersResource(foundryClient);
24
+ case 'foundry://combat':
25
+ return await getCombatResource(foundryClient);
26
+ case 'foundry://system/diagnostics':
27
+ return await getSystemDiagnosticsResource(diagnosticsClient);
28
+ default:
29
+ throw new McpError(ErrorCode.InvalidParams, `Unknown resource URI: ${uri}`);
30
+ }
31
+ });
32
+ }
33
+ async function getActorsResource(foundryClient) {
34
+ const result = await foundryClient.searchActors({ limit: 100 });
35
+ return {
36
+ contents: [
37
+ {
38
+ uri: 'foundry://actors',
39
+ mimeType: 'application/json',
40
+ text: JSON.stringify({ actors: result.actors, total: result.total, lastUpdated: new Date().toISOString() }, null, 2),
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ async function getItemsResource(foundryClient) {
46
+ const result = await foundryClient.searchItems({ limit: 100 });
47
+ return {
48
+ contents: [
49
+ {
50
+ uri: 'foundry://items',
51
+ mimeType: 'application/json',
52
+ text: JSON.stringify({ items: result.items, total: result.total, lastUpdated: new Date().toISOString() }, null, 2),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ async function getScenesResource(foundryClient) {
58
+ const scenes = foundryClient.getScenes();
59
+ return {
60
+ contents: [
61
+ {
62
+ uri: 'foundry://scenes',
63
+ mimeType: 'application/json',
64
+ text: JSON.stringify({
65
+ scenes: scenes.map((s) => ({ _id: s._id, name: s.name, active: s.active })),
66
+ total: scenes.length,
67
+ lastUpdated: new Date().toISOString(),
68
+ }, null, 2),
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ async function getCurrentSceneResource(foundryClient) {
74
+ try {
75
+ const scene = await foundryClient.getCurrentScene();
76
+ return {
77
+ contents: [
78
+ {
79
+ uri: 'foundry://scenes/current',
80
+ mimeType: 'application/json',
81
+ text: JSON.stringify({ currentScene: scene, lastUpdated: new Date().toISOString() }, null, 2),
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ catch (error) {
87
+ logger.debug('getCurrentSceneResource: no active scene', { error });
88
+ return {
89
+ contents: [
90
+ {
91
+ uri: 'foundry://scenes/current',
92
+ mimeType: 'application/json',
93
+ text: JSON.stringify({
94
+ currentScene: null,
95
+ message: 'No active scene',
96
+ lastUpdated: new Date().toISOString(),
97
+ }, null, 2),
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ }
103
+ async function getWorldSettingsResource(foundryClient) {
104
+ const world = await foundryClient.getWorldInfo();
105
+ return {
106
+ contents: [
107
+ {
108
+ uri: 'foundry://world/settings',
109
+ mimeType: 'application/json',
110
+ text: JSON.stringify({ world, lastUpdated: new Date().toISOString() }, null, 2),
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ async function getJournalsResource(foundryClient) {
116
+ const journals = foundryClient.getJournals();
117
+ return {
118
+ contents: [
119
+ {
120
+ uri: 'foundry://journals',
121
+ mimeType: 'application/json',
122
+ text: JSON.stringify({
123
+ journals: journals.map((j) => ({
124
+ _id: j._id,
125
+ name: j.name,
126
+ pages: j.pages?.length || 0,
127
+ })),
128
+ total: journals.length,
129
+ lastUpdated: new Date().toISOString(),
130
+ }, null, 2),
131
+ },
132
+ ],
133
+ };
134
+ }
135
+ async function getUsersResource(foundryClient) {
136
+ const { users, activeUsers } = foundryClient.getUsers();
137
+ return {
138
+ contents: [
139
+ {
140
+ uri: 'foundry://users',
141
+ mimeType: 'application/json',
142
+ text: JSON.stringify({ users, activeUsers, lastUpdated: new Date().toISOString() }, null, 2),
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ async function getCombatResource(foundryClient) {
148
+ const combat = foundryClient.getCombatState();
149
+ return {
150
+ contents: [
151
+ {
152
+ uri: 'foundry://combat',
153
+ mimeType: 'application/json',
154
+ text: JSON.stringify({ combat, lastUpdated: new Date().toISOString() }, null, 2),
155
+ },
156
+ ],
157
+ };
158
+ }
159
+ async function getSystemDiagnosticsResource(diagnosticsClient) {
160
+ try {
161
+ const health = await diagnosticsClient.getSystemHealth();
162
+ return {
163
+ contents: [
164
+ {
165
+ uri: 'foundry://system/diagnostics',
166
+ mimeType: 'application/json',
167
+ text: JSON.stringify({ systemHealth: health, lastUpdated: new Date().toISOString() }, null, 2),
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ catch (error) {
173
+ logger.debug('getSystemDiagnosticsResource: diagnostics unavailable', { error });
174
+ return {
175
+ contents: [
176
+ {
177
+ uri: 'foundry://system/diagnostics',
178
+ mimeType: 'application/json',
179
+ text: JSON.stringify({
180
+ message: 'Diagnostics require REST API module',
181
+ lastUpdated: new Date().toISOString(),
182
+ }, null, 2),
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ }
188
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/tools/handlers/resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,aAA4B,EAC5B,iBAAoC;IAEpC,OAAO,aAAa,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC/C,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,kBAAkB;gBACrB,OAAO,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEhD,KAAK,iBAAiB;gBACpB,OAAO,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAE/C,KAAK,kBAAkB;gBACrB,OAAO,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEhD,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,uBAAuB,CAAC,aAAa,CAAC,CAAC;YAEtD,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;YAEvD,KAAK,oBAAoB;gBACvB,OAAO,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAElD,KAAK,iBAAiB;gBACpB,OAAO,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAE/C,KAAK,kBAAkB;gBACrB,OAAO,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEhD,KAAK,8BAA8B;gBACjC,OAAO,MAAM,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;YAE/D;gBACE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,aAA4B;IAC3D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,kBAAkB;gBACvB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EACrF,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,aAA4B;IAC1D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,iBAAiB;gBACtB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EACnF,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,aAA4B;IAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;IACzC,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,kBAAkB;gBACvB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC3E,KAAK,EAAE,MAAM,CAAC,MAAM;oBACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACtC,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,aAA4B;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,0BAA0B;oBAC/B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAC9D,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,0BAA0B;oBAC/B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,YAAY,EAAE,IAAI;wBAClB,OAAO,EAAE,iBAAiB;wBAC1B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACtC,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,aAA4B;IAClE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,CAAC;IACjD,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,0BAA0B;gBAC/B,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAChF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,aAA4B;IAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,oBAAoB;gBACzB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC7B,GAAG,EAAE,CAAC,CAAC,GAAG;wBACV,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;qBAC5B,CAAC,CAAC;oBACH,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACtC,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,aAA4B;IAC1D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IACxD,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,iBAAiB;gBACtB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAC7D,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,aAA4B;IAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC;IAC9C,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,kBAAkB;gBACvB,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACjF;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,iBAAoC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,eAAe,EAAE,CAAC;QACzD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,8BAA8B;oBACnC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAC/D,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,uDAAuD,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,8BAA8B;oBACnC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,OAAO,EAAE,qCAAqC;wBAC9C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACtC,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview Scene management tool handlers
3
+ *
4
+ * Handles scene information retrieval and management.
5
+ */
6
+ import type { FoundryClient } from '../../foundry/client.js';
7
+ /**
8
+ * Handles scene information requests
9
+ */
10
+ export declare function handleGetSceneInfo(args: {
11
+ sceneId?: string;
12
+ }, foundryClient: FoundryClient): Promise<{
13
+ content: {
14
+ type: string;
15
+ text: string;
16
+ }[];
17
+ }>;
18
+ //# sourceMappingURL=scenes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/scenes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IACJ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,aAAa,EAAE,aAAa;;;;;GA0B7B"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview Scene management tool handlers
3
+ *
4
+ * Handles scene information retrieval and management.
5
+ */
6
+ import { withToolError } from './utils.js';
7
+ /**
8
+ * Handles scene information requests
9
+ */
10
+ export async function handleGetSceneInfo(args, foundryClient) {
11
+ const { sceneId } = args;
12
+ return withToolError('get scene info', async () => {
13
+ const scene = await foundryClient.getCurrentScene(sceneId);
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: `🗺️ **Scene Information**
19
+ **Name:** ${scene.name}
20
+ **ID:** ${scene._id}
21
+ **Active:** ${scene.active ? 'Yes' : 'No'}
22
+ **Navigation:** ${scene.navigation ? 'Enabled' : 'Disabled'}
23
+ **Dimensions:** ${scene.width} x ${scene.height} pixels
24
+ **Padding:** ${scene.padding * 100}%
25
+ **Global Light:** ${scene.globalLight ? 'Enabled' : 'Disabled'}
26
+ **Darkness Level:** ${scene.darkness * 100}%
27
+
28
+ **Description:** ${scene.description || 'No description available.'}`,
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ }
34
+ //# sourceMappingURL=scenes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../../src/tools/handlers/scenes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAEC,EACD,aAA4B;IAE5B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzB,OAAO,aAAa,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;YACJ,KAAK,CAAC,IAAI;UACZ,KAAK,CAAC,GAAG;cACL,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;kBACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;kBACzC,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM;eAChC,KAAK,CAAC,OAAO,GAAG,GAAG;oBACd,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;sBACxC,KAAK,CAAC,QAAQ,GAAG,GAAG;;mBAEvB,KAAK,CAAC,WAAW,IAAI,2BAA2B,EAAE;iBAC5D;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * User management tool handler
3
+ */
4
+ import type { FoundryClient } from '../../foundry/client.js';
5
+ export declare function handleGetUsers(_args: Record<string, unknown>, foundryClient: FoundryClient): Promise<{
6
+ content: {
7
+ type: string;
8
+ text: string;
9
+ }[];
10
+ }>;
11
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/users.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAW7D,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,aAAa;;;;;GAwBhG"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * User management tool handler
3
+ */
4
+ import { withToolError } from './utils.js';
5
+ const ROLE_NAMES = {
6
+ 0: 'None',
7
+ 1: 'Player',
8
+ 2: 'Trusted Player',
9
+ 3: 'Assistant GM',
10
+ 4: 'Game Master',
11
+ };
12
+ export async function handleGetUsers(_args, foundryClient) {
13
+ return withToolError('get users', async () => {
14
+ const { users, activeUsers } = foundryClient.getUsers();
15
+ const activeSet = new Set(activeUsers);
16
+ const formatted = users
17
+ .map((u) => {
18
+ const online = activeSet.has(u._id) ? 'Online' : 'Offline';
19
+ const role = ROLE_NAMES[u.role] || `Role ${u.role}`;
20
+ return `- **${u.name}** (${role}) — ${online}`;
21
+ })
22
+ .join('\n');
23
+ const onlineCount = users.filter((u) => activeSet.has(u._id)).length;
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: `**Users** (${onlineCount}/${users.length} online)\n\n${formatted}`,
29
+ },
30
+ ],
31
+ };
32
+ });
33
+ }
34
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/tools/handlers/users.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,GAA2B;IACzC,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,cAAc;IACjB,CAAC,EAAE,aAAa;CACjB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA8B,EAAE,aAA4B;IAC/F,OAAO,aAAa,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,KAAK;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,IAAI,OAAO,MAAM,EAAE,CAAC;QACjD,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAErE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,cAAc,WAAW,IAAI,KAAK,CAAC,MAAM,eAAe,SAAS,EAAE;iBAC1E;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared utilities for tool handlers
3
+ */
4
+ /**
5
+ * Wraps an async handler function with standard error logging and McpError conversion.
6
+ *
7
+ * @param toolName - Label used in error log messages (e.g. 'search actors')
8
+ * @param fn - Async function containing the handler logic
9
+ */
10
+ export declare function withToolError<T>(toolName: string, fn: () => Promise<T>): Promise<T>;
11
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAazF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared utilities for tool handlers
3
+ */
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ /**
7
+ * Wraps an async handler function with standard error logging and McpError conversion.
8
+ *
9
+ * @param toolName - Label used in error log messages (e.g. 'search actors')
10
+ * @param fn - Async function containing the handler logic
11
+ */
12
+ export async function withToolError(toolName, fn) {
13
+ try {
14
+ return await fn();
15
+ }
16
+ catch (error) {
17
+ if (error instanceof McpError) {
18
+ throw error;
19
+ }
20
+ logger.error(`Failed to ${toolName}:`, error);
21
+ throw new McpError(ErrorCode.InternalError, `Failed to ${toolName}: ${error instanceof Error ? error.message : 'Unknown error'}`);
22
+ }
23
+ }
24
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tools/handlers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,QAAgB,EAAE,EAAoB;IAC3E,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,aAAa,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACrF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * World-level tool handlers: cross-collection search, summary, refresh
3
+ */
4
+ import type { FoundryClient } from '../../foundry/client.js';
5
+ export declare function handleSearchWorld(args: {
6
+ query: string;
7
+ limit?: number;
8
+ }, foundryClient: FoundryClient): Promise<{
9
+ content: {
10
+ type: string;
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ export declare function handleGetWorldSummary(_args: Record<string, unknown>, foundryClient: FoundryClient): Promise<{
15
+ content: {
16
+ type: string;
17
+ text: string;
18
+ }[];
19
+ }>;
20
+ export declare function handleRefreshWorldData(_args: Record<string, unknown>, foundryClient: FoundryClient): Promise<{
21
+ content: {
22
+ type: string;
23
+ text: string;
24
+ }[];
25
+ }>;
26
+ //# sourceMappingURL=world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/world.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACvC,aAAa,EAAE,aAAa;;;;;GAoD7B;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,aAAa,EAAE,aAAa;;;;;GAwB7B;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,aAAa,EAAE,aAAa;;;;;GAmB7B"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * World-level tool handlers: cross-collection search, summary, refresh
3
+ */
4
+ import { withToolError } from './utils.js';
5
+ export async function handleSearchWorld(args, foundryClient) {
6
+ return withToolError('search world', async () => {
7
+ const results = foundryClient.searchWorld(args.query);
8
+ const limit = args.limit || 5;
9
+ const sections = [];
10
+ if (results.actors.length > 0) {
11
+ const items = results.actors
12
+ .slice(0, limit)
13
+ .map((a) => ` - ${a.name} (${a.type})`)
14
+ .join('\n');
15
+ sections.push(`**Actors** (${results.actors.length})\n${items}`);
16
+ }
17
+ if (results.items.length > 0) {
18
+ const items = results.items
19
+ .slice(0, limit)
20
+ .map((i) => ` - ${i.name} (${i.type})`)
21
+ .join('\n');
22
+ sections.push(`**Items** (${results.items.length})\n${items}`);
23
+ }
24
+ if (results.scenes.length > 0) {
25
+ const items = results.scenes
26
+ .slice(0, limit)
27
+ .map((s) => ` - ${s.name}${s.active ? ' [ACTIVE]' : ''}`)
28
+ .join('\n');
29
+ sections.push(`**Scenes** (${results.scenes.length})\n${items}`);
30
+ }
31
+ if (results.journals.length > 0) {
32
+ const items = results.journals
33
+ .slice(0, limit)
34
+ .map((j) => ` - ${j.name}`)
35
+ .join('\n');
36
+ sections.push(`**Journals** (${results.journals.length})\n${items}`);
37
+ }
38
+ if (sections.length === 0) {
39
+ return {
40
+ content: [{ type: 'text', text: `No results found for "${args.query}".` }],
41
+ };
42
+ }
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: `**World Search** — "${args.query}"\n\n${sections.join('\n\n')}`,
48
+ },
49
+ ],
50
+ };
51
+ });
52
+ }
53
+ export async function handleGetWorldSummary(_args, foundryClient) {
54
+ return withToolError('get world summary', async () => {
55
+ const worldInfo = await foundryClient.getWorldInfo();
56
+ const counts = foundryClient.getWorldSummary();
57
+ const countLines = Object.entries(counts)
58
+ .map(([key, count]) => `- **${key}**: ${count}`)
59
+ .join('\n');
60
+ return {
61
+ content: [
62
+ {
63
+ type: 'text',
64
+ text: `**World: ${worldInfo.title}**
65
+ **System:** ${worldInfo.system} (${worldInfo.systemVersion})
66
+ **Core Version:** ${worldInfo.coreVersion}
67
+
68
+ **Collection Counts:**
69
+ ${countLines || 'No data available — not connected.'}`,
70
+ },
71
+ ],
72
+ };
73
+ });
74
+ }
75
+ export async function handleRefreshWorldData(_args, foundryClient) {
76
+ return withToolError('refresh world data', async () => {
77
+ await foundryClient.refreshWorldData();
78
+ const counts = foundryClient.getWorldSummary();
79
+ const countLines = Object.entries(counts)
80
+ .map(([key, count]) => `- **${key}**: ${count}`)
81
+ .join('\n');
82
+ return {
83
+ content: [
84
+ {
85
+ type: 'text',
86
+ text: `World data refreshed successfully.\n\n**Collection Counts:**\n${countLines}`,
87
+ },
88
+ ],
89
+ };
90
+ });
91
+ }
92
+ //# sourceMappingURL=world.js.map