appium-mcp 1.82.2 → 1.84.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 (114) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -0
  3. package/dist/create-server.d.ts.map +1 -1
  4. package/dist/create-server.js +4 -0
  5. package/dist/create-server.js.map +1 -1
  6. package/dist/server.d.ts.map +1 -1
  7. package/dist/server.js +7 -4
  8. package/dist/server.js.map +1 -1
  9. package/dist/tests/create-server.test.js +8 -0
  10. package/dist/tests/create-server.test.js.map +1 -1
  11. package/dist/tests/tools/evidence.test.d.ts +2 -0
  12. package/dist/tests/tools/evidence.test.d.ts.map +1 -0
  13. package/dist/tests/tools/evidence.test.js +158 -0
  14. package/dist/tests/tools/evidence.test.js.map +1 -0
  15. package/dist/tests/utils/paths.test.js +5 -6
  16. package/dist/tests/utils/paths.test.js.map +1 -1
  17. package/dist/tools/evidence.d.ts +82 -0
  18. package/dist/tools/evidence.d.ts.map +1 -0
  19. package/dist/tools/evidence.js +124 -0
  20. package/dist/tools/evidence.js.map +1 -0
  21. package/dist/tools/gestures/gesture.d.ts.map +1 -1
  22. package/dist/tools/gestures/gesture.js +47 -25
  23. package/dist/tools/gestures/gesture.js.map +1 -1
  24. package/dist/tools/interactions/find.d.ts.map +1 -1
  25. package/dist/tools/interactions/find.js +27 -4
  26. package/dist/tools/interactions/find.js.map +1 -1
  27. package/package.json +8 -19
  28. package/server.json +2 -2
  29. package/src/create-server.ts +4 -0
  30. package/src/server.ts +9 -4
  31. package/src/tools/evidence.ts +198 -0
  32. package/src/tools/gestures/gesture.ts +63 -26
  33. package/src/tools/interactions/find.ts +40 -6
  34. package/dist/scripts/eval-documentation-rag.d.ts +0 -50
  35. package/dist/scripts/eval-documentation-rag.d.ts.map +0 -1
  36. package/dist/scripts/eval-documentation-rag.js +0 -287
  37. package/dist/scripts/eval-documentation-rag.js.map +0 -1
  38. package/dist/scripts/generate-embeddings-cache.d.ts +0 -13
  39. package/dist/scripts/generate-embeddings-cache.d.ts.map +0 -1
  40. package/dist/scripts/generate-embeddings-cache.js +0 -24
  41. package/dist/scripts/generate-embeddings-cache.js.map +0 -1
  42. package/dist/scripts/rag-eval-dataset.json +0 -516
  43. package/dist/scripts/simple-index-documentation.d.ts +0 -21
  44. package/dist/scripts/simple-index-documentation.d.ts.map +0 -1
  45. package/dist/scripts/simple-index-documentation.js +0 -77
  46. package/dist/scripts/simple-index-documentation.js.map +0 -1
  47. package/dist/scripts/simple-query-documentation.d.ts +0 -13
  48. package/dist/scripts/simple-query-documentation.d.ts.map +0 -1
  49. package/dist/scripts/simple-query-documentation.js +0 -52
  50. package/dist/scripts/simple-query-documentation.js.map +0 -1
  51. package/dist/tests/tools/documentation/appium-skills.test.d.ts +0 -2
  52. package/dist/tests/tools/documentation/appium-skills.test.d.ts.map +0 -1
  53. package/dist/tests/tools/documentation/appium-skills.test.js +0 -106
  54. package/dist/tests/tools/documentation/appium-skills.test.js.map +0 -1
  55. package/dist/tests/tools/documentation/plugin.test.d.ts +0 -2
  56. package/dist/tests/tools/documentation/plugin.test.d.ts.map +0 -1
  57. package/dist/tests/tools/documentation/plugin.test.js +0 -34
  58. package/dist/tests/tools/documentation/plugin.test.js.map +0 -1
  59. package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts +0 -2
  60. package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts.map +0 -1
  61. package/dist/tests/tools/documentation/simple-pdf-indexer.test.js +0 -46
  62. package/dist/tests/tools/documentation/simple-pdf-indexer.test.js.map +0 -1
  63. package/dist/tools/documentation/answer-appium.d.ts +0 -8
  64. package/dist/tools/documentation/answer-appium.d.ts.map +0 -1
  65. package/dist/tools/documentation/answer-appium.js +0 -38
  66. package/dist/tools/documentation/answer-appium.js.map +0 -1
  67. package/dist/tools/documentation/appium-skills.d.ts +0 -5
  68. package/dist/tools/documentation/appium-skills.d.ts.map +0 -1
  69. package/dist/tools/documentation/appium-skills.js +0 -168
  70. package/dist/tools/documentation/appium-skills.js.map +0 -1
  71. package/dist/tools/documentation/index.d.ts +0 -29
  72. package/dist/tools/documentation/index.d.ts.map +0 -1
  73. package/dist/tools/documentation/index.js +0 -66
  74. package/dist/tools/documentation/index.js.map +0 -1
  75. package/dist/tools/documentation/markdown-header-splitter.d.ts +0 -32
  76. package/dist/tools/documentation/markdown-header-splitter.d.ts.map +0 -1
  77. package/dist/tools/documentation/markdown-header-splitter.js +0 -180
  78. package/dist/tools/documentation/markdown-header-splitter.js.map +0 -1
  79. package/dist/tools/documentation/plugin.d.ts +0 -14
  80. package/dist/tools/documentation/plugin.d.ts.map +0 -1
  81. package/dist/tools/documentation/plugin.js +0 -19
  82. package/dist/tools/documentation/plugin.js.map +0 -1
  83. package/dist/tools/documentation/reasoning-rag.d.ts +0 -89
  84. package/dist/tools/documentation/reasoning-rag.d.ts.map +0 -1
  85. package/dist/tools/documentation/reasoning-rag.js +0 -282
  86. package/dist/tools/documentation/reasoning-rag.js.map +0 -1
  87. package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +0 -40
  88. package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +0 -1
  89. package/dist/tools/documentation/sentence-transformers-embeddings.js +0 -119
  90. package/dist/tools/documentation/sentence-transformers-embeddings.js.map +0 -1
  91. package/dist/tools/documentation/simple-pdf-indexer.d.ts +0 -47
  92. package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +0 -1
  93. package/dist/tools/documentation/simple-pdf-indexer.js +0 -572
  94. package/dist/tools/documentation/simple-pdf-indexer.js.map +0 -1
  95. package/dist/tools/documentation/uploads/documents.json +0 -1
  96. package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +0 -1
  97. package/scripts/setup-submodules-sparse.sh +0 -53
  98. package/scripts/update-submodules.sh +0 -14
  99. package/scripts/zip-assets.mjs +0 -55
  100. package/src/resources/submodules.zip +0 -0
  101. package/src/scripts/eval-documentation-rag.ts +0 -433
  102. package/src/scripts/generate-embeddings-cache.ts +0 -24
  103. package/src/scripts/rag-eval-dataset.json +0 -516
  104. package/src/scripts/simple-index-documentation.ts +0 -93
  105. package/src/scripts/simple-query-documentation.ts +0 -61
  106. package/src/tools/documentation/answer-appium.ts +0 -47
  107. package/src/tools/documentation/appium-skills.ts +0 -244
  108. package/src/tools/documentation/index.ts +0 -99
  109. package/src/tools/documentation/markdown-header-splitter.ts +0 -209
  110. package/src/tools/documentation/plugin.ts +0 -21
  111. package/src/tools/documentation/reasoning-rag.ts +0 -438
  112. package/src/tools/documentation/sentence-transformers-embeddings.ts +0 -152
  113. package/src/tools/documentation/simple-pdf-indexer.ts +0 -755
  114. package/src/tools/documentation/uploads/documents.json +0 -1
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Simple Documentation Query Script
4
- *
5
- * This script is used to test the answerAppiumQuery function
6
- * by querying the indexed Markdown documentation in the in-memory vector store.
7
- *
8
- * Usage: npm run simple-query-docs "your query here"
9
- *
10
- * Example: npm run simple-query-docs "What is Appium?"
11
- */
12
- import { answerAppiumQuery } from '../tools/documentation/index.js';
13
- /**
14
- * Main function to handle the documentation query process
15
- */
16
- async function main() {
17
- console.log('Using sentence-transformers embeddings (no API key required)');
18
- console.log('Note: This script will return relevant documentation chunks without generating responses');
19
- console.log('process.argv:', process.argv);
20
- const args = process.argv.slice(2);
21
- console.log('args:', args);
22
- let query;
23
- if (args.length > 0) {
24
- query = args.join(' ');
25
- console.log(`Using provided query: "${query}"`);
26
- }
27
- else {
28
- query = 'What is Appium and how do I get started?';
29
- console.log(`No query provided, using default query: "${query}"`);
30
- }
31
- console.log(`Querying in-memory vector store with: "${query}"`);
32
- try {
33
- const result = await answerAppiumQuery({
34
- query,
35
- });
36
- console.log('\n--- ANSWER ---\n');
37
- console.log(result.answer);
38
- if (result.sources && result.sources.length > 0) {
39
- console.log('\n--- SOURCES ---\n');
40
- result.sources.forEach((source) => {
41
- console.log(`- ${source}`);
42
- });
43
- }
44
- process.exit(0);
45
- }
46
- catch (error) {
47
- console.error('Query failed:', error);
48
- process.exit(1);
49
- }
50
- }
51
- void main();
52
- //# sourceMappingURL=simple-query-documentation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-query-documentation.js","sourceRoot":"","sources":["../../src/scripts/simple-query-documentation.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CACT,0FAA0F,CAC3F,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAa,CAAC;IAElB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,0CAA0C,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=appium-skills.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appium-skills.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/appium-skills.test.ts"],"names":[],"mappings":""}
@@ -1,106 +0,0 @@
1
- import { describe, test, expect, jest } from '@jest/globals';
2
- jest.unstable_mockModule('appium-uiautomator2-driver', () => ({
3
- AndroidUiautomator2Driver: class {
4
- },
5
- }));
6
- jest.unstable_mockModule('appium-xcuitest-driver', () => ({
7
- XCUITestDriver: class {
8
- },
9
- }));
10
- jest.unstable_mockModule('webdriver', () => ({ default: {} }));
11
- await jest.unstable_mockModule('../../../logger', () => ({
12
- default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
13
- }));
14
- const { appiumSkillsTool } = await import('../../../tools/documentation/appium-skills.js');
15
- function getRegisteredTool() {
16
- return appiumSkillsTool;
17
- }
18
- async function runTool(args) {
19
- const tool = getRegisteredTool();
20
- const result = await tool.execute(args, {});
21
- expect(tool.name).toBe('appium_skills');
22
- expect(result?.content?.[0]?.type).toBe('text');
23
- return result.content[0].text;
24
- }
25
- function expectOrderedSkills(text, skills) {
26
- expect(text).toContain('Recommended skill order:');
27
- for (const [index, skill] of skills.entries()) {
28
- expect(text).toContain(`${index + 1}. ${skill}`);
29
- expect(text).toContain(`--- skills/${skill}/SKILL.md ---`);
30
- }
31
- expect(text).toContain('--- AGENTS.md ---');
32
- }
33
- describe('appium_skills tool contract', () => {
34
- test('returns Android UiAutomator2 setup skills in expected order', async () => {
35
- const text = await runTool({
36
- platform: 'android',
37
- driver: 'uiautomator2',
38
- mode: 'setup',
39
- });
40
- expectOrderedSkills(text, [
41
- 'environment-setup-node',
42
- 'environment-setup-android',
43
- 'environment-setup-uiautomator2',
44
- ]);
45
- expect(text).toContain('Prompt template:');
46
- });
47
- test('returns iOS XCUITest real-device setup skills including real-device config', async () => {
48
- const text = await runTool({
49
- platform: 'ios',
50
- driver: 'xcuitest',
51
- mode: 'setup',
52
- realDevice: true,
53
- });
54
- expectOrderedSkills(text, [
55
- 'environment-setup-node',
56
- 'environment-setup-xcuitest',
57
- 'xcuitest-real-device-config',
58
- ]);
59
- expect(text).toContain('Real device: yes');
60
- });
61
- test('returns troubleshooting flow with appium-troubleshooting skill', async () => {
62
- const text = await runTool({
63
- platform: 'android',
64
- driver: 'uiautomator2',
65
- mode: 'troubleshoot',
66
- });
67
- expectOrderedSkills(text, [
68
- 'environment-setup-node',
69
- 'environment-setup-android',
70
- 'environment-setup-uiautomator2',
71
- 'appium-troubleshooting',
72
- ]);
73
- expect(text).toContain('Prompt template:');
74
- });
75
- test('includes optional skills only when applicable and reports ignored ones', async () => {
76
- const androidText = await runTool({
77
- platform: 'android',
78
- driver: 'espresso',
79
- mode: 'setup',
80
- includeOptional: ['ffmpeg', 'bundletool'],
81
- });
82
- expectOrderedSkills(androidText, [
83
- 'environment-setup-node',
84
- 'environment-setup-android',
85
- 'environment-setup-espresso',
86
- 'environment-setup-ffmpeg',
87
- 'environment-setup-bundletool',
88
- ]);
89
- const iosText = await runTool({
90
- platform: 'ios',
91
- driver: 'xcuitest',
92
- mode: 'setup',
93
- includeOptional: ['bundletool'],
94
- });
95
- expect(iosText).toContain('Ignored optional skills: bundletool');
96
- });
97
- test('rejects unsupported troubleshooting driver path', async () => {
98
- const tool = getRegisteredTool();
99
- await expect(tool.execute({
100
- platform: 'android',
101
- driver: 'espresso',
102
- mode: 'troubleshoot',
103
- }, {})).rejects.toThrow('Troubleshooting guidance is currently scoped');
104
- });
105
- });
106
- //# sourceMappingURL=appium-skills.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appium-skills.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/appium-skills.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plugin.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/plugin.test.ts"],"names":[],"mappings":""}
@@ -1,34 +0,0 @@
1
- import { describe, expect, jest, test } from '@jest/globals';
2
- jest.unstable_mockModule('appium-uiautomator2-driver', () => ({
3
- AndroidUiautomator2Driver: class {
4
- },
5
- }));
6
- jest.unstable_mockModule('appium-xcuitest-driver', () => ({
7
- XCUITestDriver: class {
8
- },
9
- }));
10
- jest.unstable_mockModule('webdriver', () => ({ default: {} }));
11
- await jest.unstable_mockModule('../../../logger', () => ({
12
- default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
13
- }));
14
- const { AppiumDocumentation } = await import('../../../tools/documentation/plugin.js');
15
- describe('AppiumDocumentation plugin', () => {
16
- test('registers documentation query and skills tools', () => {
17
- const tools = [];
18
- const registry = {
19
- addTool(toolDef) {
20
- tools.push(toolDef);
21
- },
22
- };
23
- new AppiumDocumentation().register(registry);
24
- expect(tools.map((tool) => tool.name)).toEqual([
25
- 'appium_documentation_query',
26
- 'appium_skills',
27
- ]);
28
- expect(tools[1].annotations).toEqual({
29
- readOnlyHint: true,
30
- openWorldHint: false,
31
- });
32
- });
33
- });
34
- //# sourceMappingURL=plugin.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/plugin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE7D,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,yBAAyB,EAAE;KAAQ;CACpC,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,cAAc,EAAE;KAAQ;CACzB,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/D,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;CAC9E,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,mBAAmB,EAAE,GAC3B,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;AAOzD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG;YACf,OAAO,CAAC,OAAgB;gBACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;SACF,CAAC;QAEF,IAAI,mBAAmB,EAAE,CAAC,QAAQ,CAAC,QAAiB,CAAC,CAAC;QAEtD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,4BAA4B;YAC5B,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=simple-pdf-indexer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-pdf-indexer.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/simple-pdf-indexer.test.ts"],"names":[],"mappings":""}
@@ -1,46 +0,0 @@
1
- import { afterEach, describe, expect, jest, test } from '@jest/globals';
2
- import * as fs from 'node:fs';
3
- import * as os from 'node:os';
4
- import * as path from 'node:path';
5
- await jest.unstable_mockModule('../../../logger', () => ({
6
- default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
7
- }));
8
- const { getMarkdownFilesInDirectory } = await import('../../../tools/documentation/simple-pdf-indexer.js');
9
- const tempDirs = [];
10
- afterEach(() => {
11
- while (tempDirs.length > 0) {
12
- const dir = tempDirs.pop();
13
- if (dir) {
14
- fs.rmSync(dir, { recursive: true, force: true });
15
- }
16
- }
17
- });
18
- function makeTempDir() {
19
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'appium-mcp-markdown-'));
20
- tempDirs.push(dir);
21
- return dir;
22
- }
23
- describe('getMarkdownFilesInDirectory', () => {
24
- test('excludes markdown files under appium-skills', async () => {
25
- const root = makeTempDir();
26
- const docsDir = path.join(root, 'docs');
27
- const skillsDir = path.join(root, 'appium-skills');
28
- const nestedSkillsDir = path.join(skillsDir, 'skills');
29
- fs.mkdirSync(docsDir, { recursive: true });
30
- fs.mkdirSync(nestedSkillsDir, { recursive: true });
31
- fs.writeFileSync(path.join(root, 'README.md'), '# root');
32
- fs.writeFileSync(path.join(docsDir, 'guide.md'), '# docs');
33
- fs.writeFileSync(path.join(skillsDir, 'AGENTS.md'), '# agents');
34
- fs.writeFileSync(path.join(nestedSkillsDir, 'SKILL.md'), '# skill');
35
- const markdownFiles = await getMarkdownFilesInDirectory(root);
36
- expect(markdownFiles).toEqual(expect.arrayContaining([
37
- path.join(root, 'README.md'),
38
- path.join(docsDir, 'guide.md'),
39
- ]));
40
- expect(markdownFiles).not.toEqual(expect.arrayContaining([
41
- path.join(skillsDir, 'AGENTS.md'),
42
- path.join(nestedSkillsDir, 'SKILL.md'),
43
- ]));
44
- });
45
- });
46
- //# sourceMappingURL=simple-pdf-indexer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-pdf-indexer.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/simple-pdf-indexer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;CAC9E,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,2BAA2B,EAAE,GACnC,MAAM,MAAM,CAAC,oDAAoD,CAAC,CAAC;AAErE,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,GAAG,EAAE,CAAC;YACR,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAC3E,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEvD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QAEpE,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAE9D,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAC3B,MAAM,CAAC,eAAe,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;SAC/B,CAAC,CACH,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,OAAO,CAC/B,MAAM,CAAC,eAAe,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC;SACvC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tool to query indexed Appium documentation.
3
- */
4
- import type { FastMCP } from 'fastmcp';
5
- type ToolDef = Parameters<FastMCP['addTool']>[0];
6
- export declare const appiumDocumentationQueryTool: ToolDef;
7
- export {};
8
- //# sourceMappingURL=answer-appium.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"answer-appium.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/answer-appium.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMvC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjD,eAAO,MAAM,4BAA4B,EAAE,OAmC1C,CAAC"}
@@ -1,38 +0,0 @@
1
- import { z } from 'zod';
2
- import { answerAppiumQuery, initializeAppiumDocumentation } from './index.js';
3
- import log from '../../logger.js';
4
- import { errorResult, textResult } from '../tool-response.js';
5
- export const appiumDocumentationQueryTool = {
6
- name: 'appium_documentation_query',
7
- description: `Query Appium documentation using RAG (Retrieval-Augmented Generation).
8
- This tool searches through indexed Appium documentation to answer questions about Appium features, setup, configuration, drivers, and usage.
9
- `,
10
- parameters: z.object({
11
- query: z
12
- .string()
13
- .describe('The question or query about Appium documentation'),
14
- }),
15
- execute: async (args, _context) => {
16
- const query = args.query;
17
- if (!query) {
18
- return errorResult('Query parameter is required');
19
- }
20
- try {
21
- const result = await answerAppiumQuery({ query });
22
- return textResult(result.answer);
23
- }
24
- catch (_docError) {
25
- // If documentation query fails, try to initialize and retry once
26
- try {
27
- log.info('Documentation not initialized, initializing now...');
28
- await initializeAppiumDocumentation();
29
- const result = await answerAppiumQuery({ query });
30
- return textResult(result.answer);
31
- }
32
- catch (retryError) {
33
- return errorResult(`Error querying Appium documentation: ${retryError.message}. Please ensure the documentation is indexed first.`);
34
- }
35
- }
36
- },
37
- };
38
- //# sourceMappingURL=answer-appium.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"answer-appium.js","sourceRoot":"","sources":["../../../src/tools/documentation/answer-appium.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,CAAC,MAAM,4BAA4B,GAAY;IACnD,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE;;OAER;IACL,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,kDAAkD,CAAC;KAChE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,QAAa,EAAgB,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,6BAA6B,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,iEAAiE;YACjE,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBAC/D,MAAM,6BAA6B,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,OAAO,WAAW,CAChB,wCACG,UAAoB,CAAC,OACxB,qDAAqD,CACtD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { FastMCP } from 'fastmcp';
2
- type ToolDef = Parameters<FastMCP['addTool']>[0];
3
- export declare const appiumSkillsTool: ToolDef;
4
- export {};
5
- //# sourceMappingURL=appium-skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appium-skills.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/appium-skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUvC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAkCjD,eAAO,MAAM,gBAAgB,EAAE,OAqG9B,CAAC"}
@@ -1,168 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { z } from 'zod';
4
- import log from '../../logger.js';
5
- import { resolveAppiumResourcesPath } from '../../utils/paths.js';
6
- import { textResult } from '../tool-response.js';
7
- const ROOT = resolveAppiumResourcesPath('submodules', 'appium-skills');
8
- const AGENTS_PATH = path.join(ROOT, 'AGENTS.md');
9
- const SKILL_PATH = (name) => path.join(ROOT, 'skills', name, 'SKILL.md');
10
- const SETUP_SKILLS = {
11
- android: {
12
- uiautomator2: [
13
- 'environment-setup-node',
14
- 'environment-setup-android',
15
- 'environment-setup-uiautomator2',
16
- ],
17
- espresso: [
18
- 'environment-setup-node',
19
- 'environment-setup-android',
20
- 'environment-setup-espresso',
21
- ],
22
- },
23
- ios: {
24
- xcuitest: ['environment-setup-node', 'environment-setup-xcuitest'],
25
- },
26
- };
27
- const TEMPLATE_HEADINGS = {
28
- 'setup:uiautomator2': 'UiAutomator2',
29
- 'setup:espresso': 'Espresso',
30
- 'setup:xcuitest': 'XCUITest',
31
- 'setup:xcuitest:real': 'XCUITest Real Device',
32
- 'troubleshoot:uiautomator2': 'Troubleshooting',
33
- 'troubleshoot:xcuitest': 'Troubleshooting',
34
- };
35
- export const appiumSkillsTool = {
36
- name: 'appium_skills',
37
- description: `Return ordered Appium setup or troubleshooting skills from the vendored appium/skills repository.
38
- Use this before preparing a LOCAL Appium environment or diagnosing local prerequisite issues.`,
39
- parameters: z.object({
40
- platform: z.enum(['android', 'ios']).describe('Target local platform.'),
41
- driver: z
42
- .enum(['uiautomator2', 'espresso', 'xcuitest'])
43
- .describe('Target Appium automation driver.'),
44
- mode: z
45
- .enum(['setup', 'troubleshoot'])
46
- .optional()
47
- .default('setup')
48
- .describe('Whether to prepare an environment or troubleshoot an existing failure.'),
49
- realDevice: z
50
- .boolean()
51
- .optional()
52
- .default(false)
53
- .describe('For ios + xcuitest only: true for a physical device, false for simulator setup.'),
54
- includeOptional: z
55
- .array(z.enum(['ffmpeg', 'bundletool']))
56
- .optional()
57
- .default([])
58
- .describe('Optional shared skills to include when explicitly requested.'),
59
- }),
60
- annotations: {
61
- readOnlyHint: true,
62
- openWorldHint: false,
63
- },
64
- execute: async (rawArgs) => {
65
- const parsed = (rawArgs ?? {});
66
- const args = {
67
- platform: parsed.platform,
68
- driver: parsed.driver,
69
- mode: parsed.mode ?? 'setup',
70
- realDevice: parsed.realDevice ?? false,
71
- includeOptional: Array.isArray(parsed.includeOptional)
72
- ? parsed.includeOptional
73
- : [],
74
- };
75
- const { skillNames, ignoredOptional } = getSkillNames(args);
76
- log.info(`Loading Appium skills for ${args.platform}/${args.driver} (${args.mode}) from ${ROOT}`);
77
- const agentsMarkdown = await readMarkdown(AGENTS_PATH);
78
- const promptTemplate = getPromptTemplate(agentsMarkdown, getTemplateHeading(args.mode, args.driver, args.realDevice));
79
- const skillContents = await Promise.all(skillNames.map(async (skillName) => ({
80
- name: skillName,
81
- markdown: await readMarkdown(SKILL_PATH(skillName)),
82
- })));
83
- const lines = [
84
- `Appium skills for ${args.platform}/${args.driver}`,
85
- `Mode: ${args.mode}`,
86
- `Real device: ${args.realDevice ? 'yes' : 'no'}`,
87
- '',
88
- 'Recommended skill order:',
89
- ...skillNames.map((skillName, index) => `${index + 1}. ${skillName}`),
90
- ];
91
- if (ignoredOptional.length) {
92
- lines.push('', `Ignored optional skills: ${ignoredOptional.join(', ')}`);
93
- }
94
- lines.push('', 'Source files:', '- AGENTS.md');
95
- lines.push(...skillNames.map((skillName) => `- skills/${skillName}/SKILL.md`));
96
- if (promptTemplate) {
97
- lines.push('', 'Prompt template:', '```text', promptTemplate, '```');
98
- }
99
- lines.push('', '--- AGENTS.md ---', agentsMarkdown.trim());
100
- for (const skill of skillContents) {
101
- lines.push('', `--- skills/${skill.name}/SKILL.md ---`, skill.markdown.trim());
102
- }
103
- return textResult(lines.join('\n'));
104
- },
105
- };
106
- /**
107
- * Get the list of skill names to return based on the input arguments,
108
- * and determine which optional skills were ignored.
109
- * @param args
110
- * @returns
111
- */
112
- function getSkillNames(args) {
113
- const { platform, driver, mode, realDevice, includeOptional } = args;
114
- if (realDevice && platform !== 'ios') {
115
- throw new Error('realDevice=true is only supported for ios targets');
116
- }
117
- if (mode === 'troubleshoot' && driver === 'espresso') {
118
- throw new Error('Troubleshooting guidance is currently scoped to uiautomator2 or xcuitest, matching the upstream appium/skills repository.');
119
- }
120
- const baseSkills = SETUP_SKILLS[platform][driver];
121
- if (!baseSkills) {
122
- throw new Error(platform === 'android'
123
- ? 'xcuitest is only valid for iOS local environments'
124
- : 'Only xcuitest is valid for iOS local environments');
125
- }
126
- const skillNames = [...baseSkills];
127
- if (realDevice) {
128
- skillNames.push('xcuitest-real-device-config');
129
- }
130
- if (mode === 'troubleshoot') {
131
- skillNames.push('appium-troubleshooting');
132
- }
133
- const ignoredOptional = [];
134
- for (const optional of includeOptional) {
135
- if (optional === 'ffmpeg') {
136
- skillNames.push('environment-setup-ffmpeg');
137
- continue;
138
- }
139
- if (optional === 'bundletool' && platform === 'android') {
140
- skillNames.push('environment-setup-bundletool');
141
- continue;
142
- }
143
- ignoredOptional.push(optional);
144
- }
145
- return { skillNames, ignoredOptional };
146
- }
147
- function getTemplateHeading(mode, driver, realDevice) {
148
- return (TEMPLATE_HEADINGS[`${mode}:${driver}${realDevice && mode === 'setup' ? ':real' : ''}`] ?? null);
149
- }
150
- function getPromptTemplate(agentsMarkdown, heading) {
151
- if (!heading) {
152
- return null;
153
- }
154
- const section = agentsMarkdown.split(`### Template: ${heading}\n`)[1];
155
- if (!section) {
156
- return null;
157
- }
158
- return section.match(/```text\n([\s\S]*?)```/)?.[1]?.trim() ?? null;
159
- }
160
- async function readMarkdown(filePath) {
161
- try {
162
- return await readFile(filePath, 'utf8');
163
- }
164
- catch {
165
- throw new Error(`Failed to load ${path.relative(ROOT, filePath)}. Ensure the appium-skills submodule is initialized.`);
166
- }
167
- }
168
- //# sourceMappingURL=appium-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"appium-skills.js","sourceRoot":"","sources":["../../../src/tools/documentation/appium-skills.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- /**
2
- * Documentation tools for Appium
3
- *
4
- * This module provides tools for answering queries about Appium
5
- * by retrieving relevant information from indexed documentation.
6
- */
7
- /**
8
- * Interface for the query response
9
- */
10
- interface QueryResponse {
11
- answer: string;
12
- sources?: string[];
13
- chunks?: string[];
14
- }
15
- /**
16
- * Initialize the Appium documentation index
17
- * @param resourcesPath Path to the resources directory containing markdown files
18
- */
19
- export declare function initializeAppiumDocumentation(resourcesPath?: string): Promise<void>;
20
- /**
21
- * Answer a query about Appium using indexed documentation
22
- * @param options Query options
23
- * @returns Response with relevant chunks for the client LLM to process
24
- */
25
- export declare function answerAppiumQuery(options: {
26
- query: string;
27
- }): Promise<QueryResponse>;
28
- export {};
29
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;GAEG;AACH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CA+CzB"}
@@ -1,66 +0,0 @@
1
- /**
2
- * Documentation tools for Appium
3
- *
4
- * This module provides tools for answering queries about Appium
5
- * by retrieving relevant information from indexed documentation.
6
- */
7
- import { queryVectorStore, indexAllMarkdownFiles, } from './simple-pdf-indexer.js';
8
- import log from '../../logger.js';
9
- import { resolveAppiumResourcesPath } from '../../utils/paths.js';
10
- /**
11
- * Initialize the Appium documentation index
12
- * @param resourcesPath Path to the resources directory containing markdown files
13
- */
14
- export async function initializeAppiumDocumentation(resourcesPath) {
15
- try {
16
- // Default to submodules directory if not specified
17
- const docsPath =
18
- // Refer to the /src/resources/submodules directory where the markdown files are located.
19
- resourcesPath || resolveAppiumResourcesPath('submodules');
20
- log.info(`Initializing Appium documentation from: ${docsPath}`);
21
- await indexAllMarkdownFiles(docsPath);
22
- log.info('Appium documentation indexing completed');
23
- }
24
- catch (error) {
25
- log.error('Error initializing Appium documentation:', error);
26
- throw error;
27
- }
28
- }
29
- /**
30
- * Answer a query about Appium using indexed documentation
31
- * @param options Query options
32
- * @returns Response with relevant chunks for the client LLM to process
33
- */
34
- export async function answerAppiumQuery(options) {
35
- try {
36
- const { query } = options;
37
- log.info(`Querying vector store for: "${query}"`);
38
- const results = await queryVectorStore(query); // Get relevant chunks
39
- if (!results || results.length === 0) {
40
- return {
41
- answer: 'No relevant information found in the Appium documentation. Please try rephrasing your query.',
42
- chunks: [],
43
- };
44
- }
45
- // Extract the content from all retrieved documents
46
- const chunks = results.map((doc) => doc.pageContent);
47
- const sources = results
48
- .map((doc) => doc.metadata?.relativePath ||
49
- doc.metadata?.filename ||
50
- doc.metadata?.source)
51
- .filter((source, index, arr) => source && arr.indexOf(source) === index); // Remove duplicates
52
- log.info(`Found ${results.length} relevant chunks from ${sources.length} sources`);
53
- // Return the chunks for the client LLM to process
54
- // The client will use its own LLM to generate the final answer
55
- return {
56
- answer: `Found ${results.length} relevant documentation chunks. Here are the relevant sections:\n\n${chunks.join('\n\n---\n\n')}`,
57
- sources,
58
- chunks,
59
- };
60
- }
61
- catch (error) {
62
- log.error('Error querying Appium documentation:', error);
63
- throw error;
64
- }
65
- }
66
- //# sourceMappingURL=index.js.map