testeiya 0.2.0 → 0.3.9

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 (412) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -175
  3. package/dist/prompt/context.js +79 -0
  4. package/dist/prompt/context.js.map +1 -0
  5. package/dist/prompt/index.js +56 -0
  6. package/dist/prompt/index.js.map +1 -0
  7. package/dist/prompt/print.js +22 -0
  8. package/dist/prompt/print.js.map +1 -0
  9. package/dist/prompt/project-info.js +2 -0
  10. package/dist/prompt/project-info.js.map +1 -0
  11. package/{src/prompt/system-prompt.ts → dist/prompt/system-prompt.js} +24 -21
  12. package/dist/prompt/system-prompt.js.map +1 -0
  13. package/dist/prompt/testomatio.js +264 -0
  14. package/dist/prompt/testomatio.js.map +1 -0
  15. package/dist/prompt/tools.js +49 -0
  16. package/dist/prompt/tools.js.map +1 -0
  17. package/dist/prompt/vocab.js +8 -0
  18. package/dist/prompt/vocab.js.map +1 -0
  19. package/dist/src/args.js +72 -0
  20. package/dist/src/args.js.map +1 -0
  21. package/dist/src/cli.js +61 -0
  22. package/dist/src/cli.js.map +1 -0
  23. package/dist/src/env.js +69 -0
  24. package/dist/src/env.js.map +1 -0
  25. package/dist/src/mcp-extension.js +9 -0
  26. package/dist/src/mcp-extension.js.map +1 -0
  27. package/dist/src/mcp.js +139 -0
  28. package/dist/src/mcp.js.map +1 -0
  29. package/dist/src/model.js +66 -0
  30. package/dist/src/model.js.map +1 -0
  31. package/dist/src/result.js +41 -0
  32. package/dist/src/result.js.map +1 -0
  33. package/dist/src/run.js +199 -0
  34. package/dist/src/run.js.map +1 -0
  35. package/dist/src/session.js +77 -0
  36. package/dist/src/session.js.map +1 -0
  37. package/dist/vendor/mcp.js +14801 -0
  38. package/mcp-tools.json +2967 -0
  39. package/package.json +29 -41
  40. package/prompt/context.ts +101 -0
  41. package/prompt/index.ts +93 -0
  42. package/prompt/print.ts +23 -0
  43. package/prompt/project-info.ts +30 -0
  44. package/prompt/system-prompt.ts +173 -0
  45. package/{src/prompt → prompt}/testomatio.ts +119 -8
  46. package/{src/prompt → prompt}/tools.ts +30 -8
  47. package/prompt/vocab.ts +7 -0
  48. package/{skills.lock.json → skills/skills.lock.json} +11 -7
  49. package/skills/skills.yaml +34 -0
  50. package/models.catalog.json +0 -6963
  51. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -120
  52. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -158
  53. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -91
  54. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -158
  55. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -90
  56. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -234
  57. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -110
  58. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -306
  59. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -352
  60. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -472
  61. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -350
  62. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -81
  63. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -206
  64. package/skills/playwright-best-practices-skill/LICENSE.md +0 -7
  65. package/skills/playwright-best-practices-skill/README.md +0 -147
  66. package/skills/playwright-best-practices-skill/SKILL.md +0 -303
  67. package/skills/playwright-best-practices-skill/advanced/authentication-flows.md +0 -360
  68. package/skills/playwright-best-practices-skill/advanced/authentication.md +0 -871
  69. package/skills/playwright-best-practices-skill/advanced/clock-mocking.md +0 -364
  70. package/skills/playwright-best-practices-skill/advanced/mobile-testing.md +0 -409
  71. package/skills/playwright-best-practices-skill/advanced/multi-context.md +0 -288
  72. package/skills/playwright-best-practices-skill/advanced/multi-user.md +0 -393
  73. package/skills/playwright-best-practices-skill/advanced/network-advanced.md +0 -452
  74. package/skills/playwright-best-practices-skill/advanced/third-party.md +0 -464
  75. package/skills/playwright-best-practices-skill/architecture/pom-vs-fixtures.md +0 -363
  76. package/skills/playwright-best-practices-skill/architecture/test-architecture.md +0 -369
  77. package/skills/playwright-best-practices-skill/architecture/when-to-mock.md +0 -383
  78. package/skills/playwright-best-practices-skill/browser-apis/browser-apis.md +0 -391
  79. package/skills/playwright-best-practices-skill/browser-apis/iframes.md +0 -403
  80. package/skills/playwright-best-practices-skill/browser-apis/service-workers.md +0 -504
  81. package/skills/playwright-best-practices-skill/browser-apis/websockets.md +0 -403
  82. package/skills/playwright-best-practices-skill/core/annotations.md +0 -424
  83. package/skills/playwright-best-practices-skill/core/assertions-waiting.md +0 -361
  84. package/skills/playwright-best-practices-skill/core/configuration.md +0 -452
  85. package/skills/playwright-best-practices-skill/core/fixtures-hooks.md +0 -417
  86. package/skills/playwright-best-practices-skill/core/global-setup.md +0 -434
  87. package/skills/playwright-best-practices-skill/core/locators.md +0 -242
  88. package/skills/playwright-best-practices-skill/core/page-object-model.md +0 -315
  89. package/skills/playwright-best-practices-skill/core/projects-dependencies.md +0 -453
  90. package/skills/playwright-best-practices-skill/core/test-data.md +0 -492
  91. package/skills/playwright-best-practices-skill/core/test-suite-structure.md +0 -361
  92. package/skills/playwright-best-practices-skill/core/test-tags.md +0 -298
  93. package/skills/playwright-best-practices-skill/debugging/console-errors.md +0 -420
  94. package/skills/playwright-best-practices-skill/debugging/debugging.md +0 -504
  95. package/skills/playwright-best-practices-skill/debugging/error-testing.md +0 -360
  96. package/skills/playwright-best-practices-skill/debugging/flaky-tests.md +0 -496
  97. package/skills/playwright-best-practices-skill/frameworks/angular.md +0 -530
  98. package/skills/playwright-best-practices-skill/frameworks/nextjs.md +0 -469
  99. package/skills/playwright-best-practices-skill/frameworks/react.md +0 -531
  100. package/skills/playwright-best-practices-skill/frameworks/vue.md +0 -574
  101. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/ci-cd.md +0 -468
  102. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/docker.md +0 -283
  103. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/github-actions.md +0 -546
  104. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/gitlab.md +0 -397
  105. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/other-providers.md +0 -521
  106. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/parallel-sharding.md +0 -371
  107. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/performance.md +0 -453
  108. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/reporting.md +0 -424
  109. package/skills/playwright-best-practices-skill/infrastructure-ci-cd/test-coverage.md +0 -497
  110. package/skills/playwright-best-practices-skill/testing-patterns/accessibility.md +0 -359
  111. package/skills/playwright-best-practices-skill/testing-patterns/api-testing.md +0 -719
  112. package/skills/playwright-best-practices-skill/testing-patterns/browser-extensions.md +0 -506
  113. package/skills/playwright-best-practices-skill/testing-patterns/canvas-webgl.md +0 -493
  114. package/skills/playwright-best-practices-skill/testing-patterns/component-testing.md +0 -500
  115. package/skills/playwright-best-practices-skill/testing-patterns/drag-drop.md +0 -576
  116. package/skills/playwright-best-practices-skill/testing-patterns/electron.md +0 -509
  117. package/skills/playwright-best-practices-skill/testing-patterns/file-operations.md +0 -377
  118. package/skills/playwright-best-practices-skill/testing-patterns/file-upload-download.md +0 -562
  119. package/skills/playwright-best-practices-skill/testing-patterns/forms-validation.md +0 -561
  120. package/skills/playwright-best-practices-skill/testing-patterns/graphql-testing.md +0 -331
  121. package/skills/playwright-best-practices-skill/testing-patterns/i18n.md +0 -508
  122. package/skills/playwright-best-practices-skill/testing-patterns/performance-testing.md +0 -476
  123. package/skills/playwright-best-practices-skill/testing-patterns/security-testing.md +0 -430
  124. package/skills/playwright-best-practices-skill/testing-patterns/visual-regression.md +0 -634
  125. package/skills/playwright-cli/SKILL.md +0 -420
  126. package/skills/playwright-cli/references/element-attributes.md +0 -23
  127. package/skills/playwright-cli/references/playwright-tests.md +0 -39
  128. package/skills/playwright-cli/references/request-mocking.md +0 -87
  129. package/skills/playwright-cli/references/running-code.md +0 -241
  130. package/skills/playwright-cli/references/session-management.md +0 -225
  131. package/skills/playwright-cli/references/storage-state.md +0 -275
  132. package/skills/playwright-cli/references/test-generation.md +0 -433
  133. package/skills/playwright-cli/references/tracing.md +0 -139
  134. package/skills/playwright-cli/references/video-recording.md +0 -143
  135. package/skills/testeiya/README.md +0 -29
  136. package/skills/testeiya/answer-formatting/SKILL.md +0 -30
  137. package/skills/testeiya/check-cucumber/SKILL.md +0 -200
  138. package/skills/testeiya/check-tests/SKILL.md +0 -260
  139. package/skills/testeiya/manual-run-assistant/SKILL.md +0 -61
  140. package/skills/testeiya/testomatio-docs/INDEX.md +0 -175
  141. package/skills/testeiya/testomatio-docs/SKILL.md +0 -102
  142. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-agents.md +0 -144
  143. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-powered-features.md +0 -531
  144. package/skills/testeiya/testomatio-docs/docs/advanced/ai-powered-features/ai-requirements.md +0 -437
  145. package/skills/testeiya/testomatio-docs/docs/advanced/api-access/index.md +0 -191
  146. package/skills/testeiya/testomatio-docs/docs/advanced/branches-folder/index.md +0 -277
  147. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-demos.mdx +0 -39
  148. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/bulk-edit-on-suite-and-test-level.md +0 -122
  149. package/skills/testeiya/testomatio-docs/docs/advanced/bulk-edit-folder/what-is-bulk-edit.md +0 -170
  150. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/branches.md +0 -53
  151. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/index.mdx +0 -98
  152. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/jira-issue.md +0 -151
  153. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/runs-and-reports.md +0 -377
  154. package/skills/testeiya/testomatio-docs/docs/advanced/jira-plugin/work-in-jira.md +0 -267
  155. package/skills/testeiya/testomatio-docs/docs/advanced/living-doc/index.md +0 -138
  156. package/skills/testeiya/testomatio-docs/docs/advanced/milestones/index.md +0 -220
  157. package/skills/testeiya/testomatio-docs/docs/advanced/shortcuts/index.md +0 -48
  158. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/labels-and-custom-fields.md +0 -201
  159. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags-or-labels.md +0 -94
  160. package/skills/testeiya/testomatio-docs/docs/advanced/tags-labels/tags.md +0 -243
  161. package/skills/testeiya/testomatio-docs/docs/advanced/test-artifacts/index.md +0 -135
  162. package/skills/testeiya/testomatio-docs/docs/advanced/tql/index.md +0 -394
  163. package/skills/testeiya/testomatio-docs/docs/getting-started/index.md +0 -290
  164. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/azure.md +0 -96
  165. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bamboo.md +0 -94
  166. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/bitbucket.md +0 -106
  167. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/circle.md +0 -115
  168. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/github.md +0 -120
  169. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/gitlab.md +0 -88
  170. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/index.mdx +0 -151
  171. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/jenkins.md +0 -121
  172. package/skills/testeiya/testomatio-docs/docs/integrations/continuous-integration/teamcity.md +0 -96
  173. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/azure.md +0 -31
  174. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/clickup.md +0 -54
  175. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/confluence.md +0 -34
  176. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/github.md +0 -31
  177. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/gitlab.md +0 -93
  178. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/index.md +0 -131
  179. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/jira.md +0 -164
  180. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/linear.md +0 -29
  181. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/shortcut.md +0 -67
  182. package/skills/testeiya/testomatio-docs/docs/integrations/issues-management/youtrack.md +0 -94
  183. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/azure-devops.md +0 -53
  184. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/email.md +0 -71
  185. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/jira.md +0 -52
  186. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/ms-teams.md +0 -60
  187. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/rules.md +0 -267
  188. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/slack.md +0 -82
  189. package/skills/testeiya/testomatio-docs/docs/integrations/report-notifications/telegram.md +0 -73
  190. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/index.mdx +0 -207
  191. package/skills/testeiya/testomatio-docs/docs/integrations/scim-provisioning/okta.md +0 -204
  192. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/azure.md +0 -95
  193. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/google.md +0 -75
  194. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/index.mdx +0 -33
  195. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/okta.md +0 -108
  196. package/skills/testeiya/testomatio-docs/docs/integrations/single-sign-on/saml.md +0 -66
  197. package/skills/testeiya/testomatio-docs/docs/legal/compliance/gdpr.md +0 -95
  198. package/skills/testeiya/testomatio-docs/docs/legal/compliance/index.mdx +0 -94
  199. package/skills/testeiya/testomatio-docs/docs/legal/compliance/privacy.md +0 -26
  200. package/skills/testeiya/testomatio-docs/docs/legal/compliance/terms.md +0 -32
  201. package/skills/testeiya/testomatio-docs/docs/legal/security/index.mdx +0 -242
  202. package/skills/testeiya/testomatio-docs/docs/legal/security/jira.md +0 -140
  203. package/skills/testeiya/testomatio-docs/docs/legal/security/subprocessors.md +0 -76
  204. package/skills/testeiya/testomatio-docs/docs/management/company/administration.md +0 -363
  205. package/skills/testeiya/testomatio-docs/docs/management/company/audit-log.md +0 -41
  206. package/skills/testeiya/testomatio-docs/docs/management/company/plan-features-comparison.md +0 -240
  207. package/skills/testeiya/testomatio-docs/docs/management/company/subscriptions.md +0 -326
  208. package/skills/testeiya/testomatio-docs/docs/management/company/trials.md +0 -75
  209. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/accountant.md +0 -49
  210. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/index.mdx +0 -285
  211. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/read-only-user.md +0 -67
  212. package/skills/testeiya/testomatio-docs/docs/management/company/users-and-permissions/teams.md +0 -138
  213. package/skills/testeiya/testomatio-docs/docs/management/project/settings.md +0 -87
  214. package/skills/testeiya/testomatio-docs/docs/management/project/templates.md +0 -546
  215. package/skills/testeiya/testomatio-docs/docs/project/analytics/index.md +0 -326
  216. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/classical-tests-markdown-format.md +0 -386
  217. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/download-manual-tests-as-files.md +0 -378
  218. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-obsidian.md +0 -112
  219. package/skills/testeiya/testomatio-docs/docs/project/import-export/export-tests/export-to-spreadsheet.md +0 -127
  220. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/auto-import.md +0 -63
  221. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Allure-TestOps.md +0 -49
  222. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-QTest.md +0 -41
  223. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Qase.md +0 -39
  224. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-Zephyr.md +0 -37
  225. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-csv-xlsx.md +0 -117
  226. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-cucumber.md +0 -93
  227. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-qmetry.md +0 -44
  228. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-source-code.md +0 -117
  229. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testcaselabs.md +0 -44
  230. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testmo.md +0 -47
  231. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-testrail.md +0 -82
  232. package/skills/testeiya/testomatio-docs/docs/project/import-export/import/import-tests-from-xray.md +0 -55
  233. package/skills/testeiya/testomatio-docs/docs/project/plans/index.md +0 -334
  234. package/skills/testeiya/testomatio-docs/docs/project/pulse/index.md +0 -104
  235. package/skills/testeiya/testomatio-docs/docs/project/runs/archive-runs-and-groups.md +0 -176
  236. package/skills/testeiya/testomatio-docs/docs/project/runs/custom-statuses.md +0 -195
  237. package/skills/testeiya/testomatio-docs/docs/project/runs/environments.md +0 -203
  238. package/skills/testeiya/testomatio-docs/docs/project/runs/managing-runs.md +0 -455
  239. package/skills/testeiya/testomatio-docs/docs/project/runs/merge-strategies.md +0 -137
  240. package/skills/testeiya/testomatio-docs/docs/project/runs/reports.md +0 -329
  241. package/skills/testeiya/testomatio-docs/docs/project/runs/rungroups.md +0 -342
  242. package/skills/testeiya/testomatio-docs/docs/project/runs/running-automated-tests.md +0 -256
  243. package/skills/testeiya/testomatio-docs/docs/project/runs/running-manual-and-automated-tests.md +0 -331
  244. package/skills/testeiya/testomatio-docs/docs/project/runs/running-tests-manually.md +0 -633
  245. package/skills/testeiya/testomatio-docs/docs/project/runs/temporary-tests-notes.md +0 -223
  246. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/snippets.md +0 -68
  247. package/skills/testeiya/testomatio-docs/docs/project/steps-snippets/steps.md +0 -181
  248. package/skills/testeiya/testomatio-docs/docs/project/tests/bdd-test-case-editor.md +0 -98
  249. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-test-case-editor.md +0 -354
  250. package/skills/testeiya/testomatio-docs/docs/project/tests/classical-vs-bdd.md +0 -169
  251. package/skills/testeiya/testomatio-docs/docs/project/tests/copy-and-move-your-tests.md +0 -156
  252. package/skills/testeiya/testomatio-docs/docs/project/tests/other-features-for-test-case-design.md +0 -412
  253. package/skills/testeiya/testomatio-docs/docs/project/tests/test-case-creation-and-editing.md +0 -527
  254. package/skills/testeiya/testomatio-docs/docs/support/index.md +0 -75
  255. package/skills/testeiya/testomatio-docs/docs/test-reporting/artifacts.md +0 -388
  256. package/skills/testeiya/testomatio-docs/docs/test-reporting/cli.md +0 -215
  257. package/skills/testeiya/testomatio-docs/docs/test-reporting/configuration.md +0 -247
  258. package/skills/testeiya/testomatio-docs/docs/test-reporting/frameworks.md +0 -490
  259. package/skills/testeiya/testomatio-docs/docs/test-reporting/functions.md +0 -144
  260. package/skills/testeiya/testomatio-docs/docs/test-reporting/index.mdx +0 -48
  261. package/skills/testeiya/testomatio-docs/docs/test-reporting/junit.md +0 -248
  262. package/skills/testeiya/testomatio-docs/docs/test-reporting/logger.md +0 -138
  263. package/skills/testeiya/testomatio-docs/docs/test-reporting/php.md +0 -77
  264. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/bitbucket.md +0 -72
  265. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/csv.md +0 -23
  266. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/debug.md +0 -18
  267. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/github.md +0 -63
  268. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/gitlab.md +0 -29
  269. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/html.md +0 -80
  270. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/index.mdx +0 -57
  271. package/skills/testeiya/testomatio-docs/docs/test-reporting/pipes/testomatio.md +0 -331
  272. package/skills/testeiya/testomatio-docs/docs/test-reporting/python.md +0 -229
  273. package/skills/testeiya/testomatio-docs/docs/test-reporting/workflows.md +0 -325
  274. package/skills/testeiya/testomatio-docs/docs/tutorials/Interacting-via-API.md +0 -159
  275. package/skills/testeiya/testomatio-docs/docs/tutorials/Manual-Testing-Classic.md +0 -164
  276. package/skills/testeiya/testomatio-docs/docs/tutorials/Set-Up-Read-Only-Access.md +0 -85
  277. package/skills/testeiya/testomatio-docs/docs/tutorials/Using-AI-in-Testing.md +0 -163
  278. package/skills/testeiya/testomatio-docs/docs/tutorials/Working-with-Jira.md +0 -125
  279. package/skills/testeiya/testomatio-docs/docs/tutorials/java.md +0 -478
  280. package/skills/testeiya/testomatio-docs/docs/tutorials/playwright.md +0 -207
  281. package/skills/testeiya/testomatio-docs/docs/tutorials/webdriver.md +0 -218
  282. package/skills/testeiya/testomatio-docs/docs.lock.json +0 -6
  283. package/skills/testeiya/testomatio-reporter/SKILL.md +0 -307
  284. package/skills/testomatio/explorbot/explorbot-fundamentals/SKILL.md +0 -88
  285. package/skills/testomatio/explorbot/explorbot-plan/SKILL.md +0 -95
  286. package/skills/testomatio/explorbot/explorbot-setup/SKILL.md +0 -334
  287. package/skills/testomatio/test-automation/automate-manual-test-cases/CLAUDE.md +0 -56
  288. package/skills/testomatio/test-automation/automate-manual-test-cases/SKILL.md +0 -242
  289. package/skills/testomatio/test-automation/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -182
  290. package/skills/testomatio/test-automation/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -22
  291. package/skills/testomatio/test-automation/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -90
  292. package/skills/testomatio/test-automation/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -53
  293. package/skills/testomatio/test-automation/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -52
  294. package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/SKILL.md +0 -107
  295. package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -113
  296. package/skills/testomatio/test-automation/qa-automation-test-consolidation/SKILL.md +0 -29
  297. package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +0 -151
  298. package/skills/testomatio/test-automation/setup-pr-testing/SKILL.md +0 -199
  299. package/skills/testomatio/test-automation/testomat-allure-adapter/SKILL.md +0 -289
  300. package/skills/testomatio/test-management/detect-duplicate-test-cases/SKILL.md +0 -86
  301. package/skills/testomatio/test-management/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -54
  302. package/skills/testomatio/test-management/improve-test-cases/SKILL.md +0 -114
  303. package/skills/testomatio/test-management/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -66
  304. package/skills/testomatio/test-management/pull-request-diff-analyzer/SKILL.md +0 -141
  305. package/skills/testomatio/test-management/qa-e2e-tests-reporting/SKILL.md +0 -354
  306. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -82
  307. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -37
  308. package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -118
  309. package/skills/testomatio/test-management/qa-pr-requirements-analyzer/SKILL.md +0 -149
  310. package/skills/testomatio/test-management/qa-pr-requirements-analyzer/references/summary-example.md +0 -54
  311. package/skills/testomatio/test-management/qa-requirement-reviewer/SKILL.md +0 -126
  312. package/skills/testomatio/test-management/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -128
  313. package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +0 -174
  314. package/skills/testomatio/test-management/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -138
  315. package/skills/testomatio/test-management/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -65
  316. package/skills/testomatio/test-management/qa-test-code-coverage/scripts/check-coverage.mjs +0 -40
  317. package/skills/testomatio/test-management/qa-thinking/SKILL.md +0 -36
  318. package/skills/testomatio/test-management/qa-write-test-cases/SKILL.md +0 -267
  319. package/skills/testomatio/test-management/qa-write-test-cases/references/test-case-format.md +0 -387
  320. package/skills/testomatio/test-management/qa-write-test-cases/references/testomat-tms-guide.md +0 -72
  321. package/skills/testomatio/test-management/qa-write-test-cases/references/writing-rule.md +0 -159
  322. package/skills/testomatio/test-management/scan-automation-project/SKILL.md +0 -152
  323. package/skills/testomatio/test-management/sync-test-cases-with-tms/SKILL.md +0 -107
  324. package/skills/testomatio/test-management/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -140
  325. package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +0 -182
  326. package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +0 -169
  327. package/skills.yaml +0 -21
  328. package/src/ai-debug.ts +0 -188
  329. package/src/api/agent-get.ts +0 -22
  330. package/src/api/agent-start.ts +0 -384
  331. package/src/api/client-log.ts +0 -29
  332. package/src/api/context.ts +0 -332
  333. package/src/api/debug-layout.ts +0 -47
  334. package/src/api/debug-report.ts +0 -29
  335. package/src/api/debug-snapshot.ts +0 -30
  336. package/src/api/debug-stream.ts +0 -52
  337. package/src/api/files-delete.ts +0 -184
  338. package/src/api/files-read.ts +0 -41
  339. package/src/api/files-rename.ts +0 -99
  340. package/src/api/files-tree.ts +0 -292
  341. package/src/api/files-write.ts +0 -41
  342. package/src/api/mcp.ts +0 -603
  343. package/src/api/memory.ts +0 -69
  344. package/src/api/open-external.ts +0 -39
  345. package/src/api/playwright-cli.ts +0 -606
  346. package/src/api/providers.ts +0 -457
  347. package/src/api/read-env-token.ts +0 -33
  348. package/src/api/sessions.ts +0 -79
  349. package/src/api/settings.ts +0 -120
  350. package/src/api/skills.ts +0 -58
  351. package/src/api/testomatio-attachment.ts +0 -89
  352. package/src/api/testomatio-auth.ts +0 -284
  353. package/src/api/testomatio-proxy.ts +0 -197
  354. package/src/api/testomatio-run-stats.ts +0 -81
  355. package/src/api/testomatio-target.ts +0 -225
  356. package/src/api/testomatio-transcription.ts +0 -82
  357. package/src/api/workspace-search.ts +0 -96
  358. package/src/api/workspace-sync.ts +0 -151
  359. package/src/api/workspace.ts +0 -165
  360. package/src/app-server.ts +0 -556
  361. package/src/bridge.ts +0 -251
  362. package/src/check-tests.ts +0 -156
  363. package/src/cli.ts +0 -17
  364. package/src/commands.ts +0 -244
  365. package/src/config.ts +0 -183
  366. package/src/connection.ts +0 -658
  367. package/src/context-store.ts +0 -265
  368. package/src/debug-bus.ts +0 -405
  369. package/src/extensions/tool-gate.ts +0 -220
  370. package/src/extensions/webui/ask-channel.ts +0 -52
  371. package/src/extensions/webui/index.ts +0 -184
  372. package/src/extensions/webui/tools/ask-question.ts +0 -88
  373. package/src/extensions/webui/tools/query-result.ts +0 -79
  374. package/src/extensions/webui/tools/render-chart.ts +0 -53
  375. package/src/extensions/webui/tools/render-item.ts +0 -61
  376. package/src/extensions/webui/tools/render-list.ts +0 -170
  377. package/src/extensions/webui/tools/render-result.ts +0 -85
  378. package/src/extensions/webui/tools/render-tree.ts +0 -71
  379. package/src/extensions/webui/tools/ui-widget.ts +0 -54
  380. package/src/extensions/webui/tools/widget-result.ts +0 -13
  381. package/src/extensions/webui/widget-channel.ts +0 -50
  382. package/src/file-log.ts +0 -196
  383. package/src/git-tracked.ts +0 -68
  384. package/src/gitignore.ts +0 -53
  385. package/src/json-store.ts +0 -43
  386. package/src/load-env.ts +0 -70
  387. package/src/loader-style.ts +0 -96
  388. package/src/main.ts +0 -140
  389. package/src/mcp-catalog.ts +0 -96
  390. package/src/models-catalog.ts +0 -72
  391. package/src/permissions.ts +0 -120
  392. package/src/project-dir.ts +0 -189
  393. package/src/project-info.ts +0 -108
  394. package/src/prompt/app-ui.ts +0 -59
  395. package/src/prompt/browser.ts +0 -27
  396. package/src/prompt/index.ts +0 -62
  397. package/src/server-info.ts +0 -62
  398. package/src/session-factory.ts +0 -442
  399. package/src/session-store.ts +0 -115
  400. package/src/shell-env.ts +0 -45
  401. package/src/skills.ts +0 -163
  402. package/src/sync-snapshot.ts +0 -140
  403. package/src/telemetry.ts +0 -239
  404. package/src/testomatio-auth.ts +0 -299
  405. package/src/testomatio.ts +0 -98
  406. package/src/theme.ts +0 -30
  407. package/src/user-env.ts +0 -94
  408. package/src/welcome.ts +0 -127
  409. package/src/workspace/safe-path.ts +0 -85
  410. package/src/workspace/test-md.ts +0 -70
  411. package/src/workspace-model.ts +0 -440
  412. package/testeiya.config.json +0 -14
package/src/connection.ts DELETED
@@ -1,658 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { mkdirSync, writeFileSync, readFileSync } from "node:fs";
3
- import { join } from "node:path";
4
- import { log } from "evlog";
5
- import { PROJECT_DIR } from "./project-dir.js";
6
- import { createTesteiyaSession } from "./session-factory.js";
7
- import { transformEvent } from "./bridge.js";
8
- import { attachAiDebug } from "./ai-debug.js";
9
- import { getSession } from "./session-store.js";
10
- import { resolveSessionShellEnv } from "./api/testomatio-target.js";
11
- import { dedupeSkillsByName, loadBundledSkills, loadCustomSkills } from "./skills.js";
12
- import { browserStateNotice } from "./api/playwright-cli.js";
13
- import {
14
- contextStamp,
15
- contextUpdateNotice,
16
- listContext,
17
- listContextFolders,
18
- } from "./context-store.js";
19
-
20
- // Bundled skills are static for the process; load once. Custom skills are
21
- // re-read per prompt (cheap dir scan) so a freshly dropped-in skill is
22
- // mentionable without a restart. Custom last — it overrides by name, matching
23
- // session-factory. Each entry has name + description + filePath (see skills.ts).
24
- let bundledSkillsCache: ReturnType<typeof loadBundledSkills> | null = null;
25
- function getSkills(cwd: string) {
26
- if (!bundledSkillsCache) bundledSkillsCache = loadBundledSkills();
27
- return dedupeSkillsByName([...bundledSkillsCache, ...loadCustomSkills(cwd)]);
28
- }
29
-
30
- /** The server emits a lightweight `ping` every HEARTBEAT_MS for the whole
31
- * life of the connection. It lets the client's stall watchdog tell "alive but
32
- * quiet" (long tool calls, an ask_question waiting for the user's answer, SDK
33
- * continuations that outlive session.prompt()) apart from a genuinely dropped
34
- * socket, so legitimate silence never surfaces a false "connection lost". */
35
- const HEARTBEAT_MS = 15000;
36
-
37
- /** Max rate for forwarding a running tool's streamed output tail (per tool). */
38
- const PARTIAL_THROTTLE_MS = 250;
39
-
40
- /** Transport-agnostic sender — `ws.send(JSON.stringify(...))` for either the
41
- * `ws` library or Bun's native ServerWebSocket. */
42
- export type Send = (data: Record<string, any>) => void;
43
-
44
- export interface Connection {
45
- /** Feed one raw text frame from the socket. */
46
- handleRaw(raw: string): Promise<void>;
47
- /** Tear down the agent subscription when the socket closes. */
48
- close(): void;
49
- }
50
-
51
- /**
52
- * Per-connection agent driver. Holds the session/subscription state in a
53
- * closure so it can back any WebSocket transport — used by the unified Bun
54
- * app-server's WS upgrade.
55
- */
56
- export function createConnection(
57
- storedSessionId: string | null,
58
- send: Send
59
- ): Connection {
60
- let session: any = null;
61
- let askChannel: any = null;
62
- let widgetChannel: any = null;
63
- let unsubscribe: (() => void) | null = null;
64
- let aiDebugUnsub: (() => void) | null = null;
65
- let messageId = "";
66
- let lastTurnError: string | null = null;
67
- let promptStartedAt = 0;
68
- let promptCalls = 0;
69
- let promptOutTok = 0;
70
- let promptPeakCtx = 0;
71
- let promptRetries = 0;
72
- let sessionModel = "";
73
- let conversationId: string | null = null;
74
- let sessionCwd = process.cwd();
75
- // The workspace-context stamp the agent last saw (system prompt at session
76
- // creation, or the last update notice). A change between prompts — the Add
77
- // to Workspace UI ran, or a pull seeded manual-tests — appends a refresh
78
- // notice to the next prompt.
79
- let contextSeenStamp = "";
80
- const heartbeat = setInterval(() => send({ type: "ping" }), HEARTBEAT_MS);
81
- let resumeConversationId: string | null = null;
82
- // `tool-output-partial` coalescing: the SDK streams a tool's full output tail
83
- // on every chunk (up to 50KB each), so forwarding raw would flood the socket.
84
- // Leading-edge send + one trailing flush per PARTIAL_THROTTLE_MS, per tool.
85
- const partialTimers = new Map<string, ReturnType<typeof setTimeout>>();
86
- const pendingPartials = new Map<string, Record<string, any>>();
87
-
88
- function queuePartial(msg: Record<string, any>): void {
89
- const id = msg.toolCallId as string;
90
- if (partialTimers.has(id)) {
91
- pendingPartials.set(id, msg);
92
- return;
93
- }
94
- send(msg);
95
- partialTimers.set(
96
- id,
97
- setTimeout(() => {
98
- partialTimers.delete(id);
99
- const pending = pendingPartials.get(id);
100
- if (!pending) return;
101
- pendingPartials.delete(id);
102
- queuePartial(pending);
103
- }, PARTIAL_THROTTLE_MS)
104
- );
105
- }
106
-
107
- function dropPartial(id: string): void {
108
- const timer = partialTimers.get(id);
109
- if (timer) clearTimeout(timer);
110
- partialTimers.delete(id);
111
- pendingPartials.delete(id);
112
- }
113
-
114
- async function handleMessage(msg: any): Promise<void> {
115
- switch (msg.type) {
116
- case "prompt": {
117
- try {
118
- // Create session on first prompt
119
- if (!session) {
120
- const { type: _, message: __, ...sessionParams } = msg;
121
-
122
- // Merge stored session config if a session ID was provided
123
- if (storedSessionId) {
124
- const stored = getSession(storedSessionId);
125
- if (stored) {
126
- sessionParams.cwd = stored.cwd;
127
- sessionParams.promptContext = stored.promptContext;
128
- sessionParams.backendUrl = stored.backendUrl;
129
- sessionParams.tokens = stored.tokens;
130
- sessionParams.projects = stored.projects;
131
- sessionParams.trusted = stored.trusted;
132
- }
133
- }
134
-
135
- sessionCwd = sessionParams.cwd || process.cwd();
136
- if (sessionParams.backendUrl) {
137
- process.env.TESTOMATIO_URL = sessionParams.backendUrl;
138
- }
139
- const tokenEntries = sessionParams.tokens
140
- ? Object.entries(sessionParams.tokens)
141
- : [];
142
- // NOTE: process.env is process-GLOBAL and the unified server is one
143
- // process serving many WS connections, so concurrent sessions share
144
- // the last-set token (accepted: desktop and single-user web are the
145
- // real deployments; per-session isolation needs an SDK env hook).
146
- // The shell-env.ts patch overlays these live values onto the SDK's
147
- // otherwise frozen-after-first-use shell env, so whatever is set
148
- // here is what every agent bash command actually sees.
149
- let tokenSource = "none";
150
- if (tokenEntries.length === 1) {
151
- process.env.TESTOMATIO = tokenEntries[0][1] as string;
152
- tokenSource = "managed";
153
- } else if (tokenEntries.length > 1) {
154
- // A single global TESTOMATIO would be wrong for all but one
155
- // project — unset it; the agent uses per-project MCP / app Sync.
156
- delete process.env.TESTOMATIO;
157
- tokenSource = "managed-multi";
158
- } else {
159
- const resolved = await resolveSessionShellEnv(
160
- {
161
- tokens: sessionParams.tokens,
162
- backendUrl: sessionParams.backendUrl,
163
- projects: sessionParams.projects ?? [],
164
- },
165
- sessionCwd
166
- );
167
- if (resolved) {
168
- Object.assign(process.env, resolved.env);
169
- tokenSource = resolved.source;
170
- sessionParams.connection = {
171
- tokenAvailable: true,
172
- projectId: resolved.projectId,
173
- title: resolved.title,
174
- };
175
- } else {
176
- delete process.env.TESTOMATIO;
177
- delete process.env.TESTOMATIO_PROJECT_ID;
178
- sessionParams.connection = { tokenAvailable: false };
179
- }
180
- }
181
-
182
- console.log(
183
- "[session] cwd:", sessionParams.cwd || `default (${process.cwd()})`,
184
- "| promptContext:", sessionParams.promptContext ? "yes" : "no",
185
- "| TESTOMATIO:", process.env.TESTOMATIO ? "set" : "unset",
186
- `(${tokenSource})`,
187
- "| TESTOMATIO_URL:", process.env.TESTOMATIO_URL || "default"
188
- );
189
- const result = await createTesteiyaSession({
190
- ...sessionParams,
191
- mode: "web",
192
- resumeConversationId: resumeConversationId ?? undefined,
193
- });
194
- session = result.session;
195
- sessionModel = `${result.model.provider}/${result.model.id}`;
196
- conversationId = (result as any).conversationId ?? null;
197
- contextSeenStamp = contextStamp(sessionCwd);
198
- aiDebugUnsub = attachAiDebug(session, conversationId);
199
- askChannel = (result as any).askChannel ?? null;
200
- widgetChannel = (result as any).widgetChannel ?? null;
201
-
202
- const mcpManager = (result as any).mcpManager;
203
- let mcpTools: string[] = [];
204
- const mcpServerStatus: Record<string, string> = {};
205
- try {
206
- if (mcpManager) {
207
- const tools = mcpManager.getTools?.() ?? [];
208
- mcpTools = tools.map((t: any) => t.name ?? String(t));
209
- const connections = mcpManager.getConnections?.() ?? [];
210
- for (const name of Object.keys(connections)) {
211
- mcpServerStatus[name] = mcpManager.getConnectionStatus?.(name) ?? "unknown";
212
- }
213
- }
214
- } catch (e) {
215
- console.warn("[session] failed to enumerate MCP tools:", e);
216
- }
217
-
218
- // Enumerate ALL tools available to the agent (including custom tools like render_list).
219
- try {
220
- const sessionTools = (session as any)?.tools;
221
- if (sessionTools instanceof Map) {
222
- const allNames = Array.from(sessionTools.keys() as Iterable<string>);
223
- console.log(`[session] all tools (${allNames.length}):`, allNames.filter((n) => !n.startsWith("mcp_")).join(", "));
224
- } else if (sessionTools && typeof sessionTools === "object") {
225
- console.log(`[session] tools keys:`, Object.keys(sessionTools).slice(0, 30).join(", "));
226
- }
227
- } catch (e) {
228
- console.warn("[session] tool enumeration error:", e);
229
- }
230
-
231
- console.log(
232
- `[session] created | mcp servers: ${Object.keys(mcpServerStatus).length} | mcp tools: ${mcpTools.length}`
233
- );
234
- if (Object.keys(mcpServerStatus).length > 0) {
235
- console.log(" mcp server status:", mcpServerStatus);
236
- }
237
- if (mcpTools.length) {
238
- console.log(" mcp tools:", mcpTools.join(", "));
239
- } else if (mcpManager) {
240
- console.log(" (mcpManager present but no tools returned — server may have failed to start; check stderr)");
241
- } else {
242
- console.log(" (mcpManager is undefined — enableMCP may be false or discovery found no configs)");
243
- }
244
-
245
- send({
246
- type: "session_created",
247
- model: sessionModel,
248
- cwd: sessionParams.cwd || process.cwd(),
249
- conversationId,
250
- mcpTools,
251
- mcpServers: mcpServerStatus,
252
- });
253
- }
254
-
255
- // Clean up previous subscription
256
- unsubscribe?.();
257
-
258
- // New message ID per prompt
259
- messageId = `msg_${randomUUID().slice(0, 12)}`;
260
- lastTurnError = null;
261
- promptStartedAt = Date.now();
262
- promptCalls = 0;
263
- promptOutTok = 0;
264
- promptPeakCtx = 0;
265
- promptRetries = 0;
266
-
267
- // Subscribe to agent events and bridge them
268
- unsubscribe = session.subscribe((event: any) => {
269
- // The agent can re-enter its loop within one prompt (auto-retry on
270
- // overload, TTSR/todo continuations) — each re-entry emits a fresh
271
- // `agent_start`. Give every run its own id so the UI renders a
272
- // distinct message instead of two with the same React key.
273
- if (event.type === "agent_start") {
274
- messageId = `msg_${randomUUID().slice(0, 12)}`;
275
- }
276
- // A failed model turn is otherwise buried behind a plain `finish`
277
- // (see ai-debug.ts). turn_end(error) fires on every failed retry
278
- // attempt, so remember only the latest and surface it when the SDK
279
- // has finally given up — retries exhausted, or the run ends still
280
- // in error. A recovered retry clears it.
281
- if (event.type === "turn_end") {
282
- lastTurnError =
283
- event.message?.stopReason === "error"
284
- ? event.message?.errorMessage || "The model request failed."
285
- : null;
286
- if (event.message?.role === "assistant") {
287
- promptCalls++;
288
- promptOutTok += event.message.usage?.output ?? 0;
289
- const ctx = event.message.usage?.totalTokens ?? 0;
290
- if (ctx > promptPeakCtx) promptPeakCtx = ctx;
291
- }
292
- }
293
- if (event.type === "auto_retry_start") {
294
- promptRetries++;
295
- }
296
- if (event.type === "auto_retry_end" && event.success) {
297
- lastTurnError = null;
298
- }
299
- if (event.type === "auto_retry_end" && !event.success) {
300
- const err = event.finalError || lastTurnError || "The model request failed.";
301
- send({ type: "error", error: err });
302
- lastTurnError = null;
303
- }
304
- const transformed = transformEvent(event, messageId);
305
- if (transformed?.type === "tool-output-partial") {
306
- queuePartial(transformed);
307
- } else if (transformed) {
308
- // The final output supersedes any queued partial — drop it so a
309
- // trailing flush can't arrive after (and visually stomp) the result.
310
- if (transformed.type === "tool-output-available") {
311
- dropPartial(transformed.toolCallId);
312
- }
313
- send(transformed);
314
- }
315
- if (event.type === "agent_end") {
316
- const promptError = lastTurnError;
317
- if (lastTurnError) {
318
- send({ type: "error", error: lastTurnError });
319
- lastTurnError = null;
320
- }
321
- if (promptCalls > 0) {
322
- const durationMs = Date.now() - promptStartedAt;
323
- console.log(
324
- `[ai] prompt done — ${promptCalls} calls · ${(durationMs / 1000).toFixed(1)}s · out=${promptOutTok} tok · peak ctx=${promptPeakCtx} tok`
325
- );
326
- // One queryable wide event per prompt in the NDJSON app log.
327
- const wide: Record<string, unknown> = {
328
- channel: "prompt",
329
- model: sessionModel,
330
- session: conversationId,
331
- calls: promptCalls,
332
- retries: promptRetries,
333
- durationMs,
334
- outputTokens: promptOutTok,
335
- peakContext: promptPeakCtx,
336
- };
337
- if (promptError) {
338
- wide.error = promptError;
339
- log.error(wide);
340
- } else {
341
- log.info(wide);
342
- }
343
- promptCalls = 0;
344
- promptOutTok = 0;
345
- promptPeakCtx = 0;
346
- promptRetries = 0;
347
- }
348
- send({ type: "done" });
349
- }
350
- });
351
-
352
- // Append a live browser-state notice (if a browser is open) so the
353
- // agent knows a session is running and what it shows. Best-effort.
354
- const browserNotice = await browserStateNotice(sessionCwd);
355
-
356
- // User-added context that changed since the system prompt was built.
357
- let contextNotice: string | null = null;
358
- const currentContextStamp = contextStamp(sessionCwd);
359
- if (currentContextStamp !== contextSeenStamp) {
360
- contextSeenStamp = currentContextStamp;
361
- contextNotice = contextUpdateNotice(
362
- listContext(sessionCwd),
363
- listContextFolders(sessionCwd)
364
- );
365
- }
366
-
367
- // The client serializes the widget the user is currently viewing (id +
368
- // its declared actions) into `<active_widget>`; append it per-message
369
- // so the agent can drive it via the `ui_widget` tool.
370
- const widgetNotice =
371
- typeof msg.activeWidget === "string" && msg.activeWidget.trim()
372
- ? msg.activeWidget
373
- : null;
374
-
375
- // A leading `/<skill-name>` expands the skill's content into the
376
- // prompt (the model receives the workflow, the UI keeps showing the
377
- // short command). Announce it so the UI can render a "using skill"
378
- // banner on the agent's reply.
379
- const skills = getSkills(sessionCwd);
380
- const skill = matchSkillCommand(msg.message, skills);
381
- if (skill) {
382
- send({
383
- type: "skill",
384
- name: skill.entry.name,
385
- description: skill.entry.description ?? "",
386
- });
387
- await session.prompt(
388
- withActiveWidget(
389
- widgetNotice,
390
- withBrowserState(
391
- browserNotice,
392
- withContextUpdate(contextNotice, buildSkillPrompt(skill.entry, skill.args))
393
- )
394
- )
395
- );
396
- break;
397
- }
398
-
399
- // `/<skill-name>` mentioned anywhere else in the message keeps the
400
- // user's text intact and appends each mentioned skill's instructions.
401
- const mentioned = matchSkillMentions(msg.message, skills);
402
- for (const entry of mentioned) {
403
- send({
404
- type: "skill",
405
- name: entry.name,
406
- description: entry.description ?? "",
407
- });
408
- }
409
-
410
- // Images go to the model natively; other files are written into the
411
- // workspace so the agent can read them with its file tools.
412
- const { text, images } = prepareAttachments(
413
- msg.message,
414
- msg.files,
415
- sessionCwd,
416
- messageId
417
- );
418
- await session.prompt(
419
- withActiveWidget(
420
- widgetNotice,
421
- withBrowserState(
422
- browserNotice,
423
- withContextUpdate(contextNotice, withSkillMentions(text, mentioned))
424
- )
425
- ),
426
- images.length > 0 ? { images } : undefined
427
- );
428
- } catch (err: any) {
429
- console.error("[session] prompt error:", err?.message || err);
430
- send({ type: "error", error: err.message || String(err) });
431
- }
432
- break;
433
- }
434
-
435
- case "answer": {
436
- if (askChannel && typeof msg.toolCallId === "string") {
437
- askChannel.answer(msg.toolCallId, String(msg.value ?? ""));
438
- }
439
- break;
440
- }
441
-
442
- case "widget_result": {
443
- if (widgetChannel && typeof msg.toolCallId === "string") {
444
- const value =
445
- typeof msg.result === "string" ? msg.result : JSON.stringify(msg.result ?? "");
446
- widgetChannel.respond(msg.toolCallId, value);
447
- }
448
- break;
449
- }
450
-
451
- case "abort": {
452
- if (session) {
453
- try {
454
- askChannel?.cancelAll();
455
- widgetChannel?.cancelAll();
456
- await session.abort();
457
- send({ type: "abort" });
458
- } catch (err: any) {
459
- send({ type: "error", error: err.message || String(err) });
460
- }
461
- }
462
- break;
463
- }
464
-
465
- case "new_session": {
466
- unsubscribe?.();
467
- aiDebugUnsub?.();
468
- aiDebugUnsub = null;
469
- askChannel?.cancelAll();
470
- widgetChannel?.cancelAll();
471
- session = null;
472
- askChannel = null;
473
- widgetChannel = null;
474
- resumeConversationId = null;
475
- send({ type: "session_cleared" });
476
- break;
477
- }
478
-
479
- case "open_conversation": {
480
- unsubscribe?.();
481
- aiDebugUnsub?.();
482
- aiDebugUnsub = null;
483
- askChannel?.cancelAll();
484
- widgetChannel?.cancelAll();
485
- session = null;
486
- askChannel = null;
487
- widgetChannel = null;
488
- resumeConversationId =
489
- typeof msg.conversationId === "string" ? msg.conversationId : null;
490
- send({ type: "conversation_opened", conversationId: resumeConversationId });
491
- break;
492
- }
493
-
494
- default:
495
- send({ type: "error", error: `Unknown message type: ${msg.type}` });
496
- }
497
- }
498
-
499
- return {
500
- async handleRaw(raw: string): Promise<void> {
501
- let msg: any;
502
- try {
503
- msg = JSON.parse(raw);
504
- } catch {
505
- send({ type: "error", error: "Invalid JSON" });
506
- return;
507
- }
508
- await handleMessage(msg);
509
- },
510
- close(): void {
511
- clearInterval(heartbeat);
512
- for (const timer of partialTimers.values()) clearTimeout(timer);
513
- partialTimers.clear();
514
- pendingPartials.clear();
515
- askChannel?.cancelAll();
516
- widgetChannel?.cancelAll();
517
- unsubscribe?.();
518
- aiDebugUnsub?.();
519
- },
520
- };
521
- }
522
-
523
- /**
524
- * Split prompt attachments into model-native images and written-to-disk files.
525
- * Each attachment is a base64 data URL. Images become `ImageContent` passed to
526
- * the model directly; everything else is written under `<cwd>/.testeiya/uploads/
527
- * <messageId>/` and referenced by relative path so the agent can `read` it.
528
- */
529
- function prepareAttachments(
530
- message: string,
531
- files: PromptFile[] | undefined,
532
- cwd: string,
533
- messageId: string
534
- ): { text: string; images: ImageContent[] } {
535
- const images: ImageContent[] = [];
536
- if (!files || files.length === 0) return { text: message, images };
537
-
538
- const savedPaths: string[] = [];
539
- let uploadDir = "";
540
- for (const file of files) {
541
- const match = /^data:([^;]+);base64,(.*)$/s.exec(file.dataUrl);
542
- if (!match) continue;
543
- const mimeType = file.mediaType || match[1];
544
- const base64 = match[2];
545
- if (mimeType.startsWith("image/")) {
546
- images.push({ type: "image", data: base64, mimeType });
547
- continue;
548
- }
549
- if (!uploadDir) {
550
- uploadDir = join(cwd, PROJECT_DIR, "uploads", messageId);
551
- mkdirSync(uploadDir, { recursive: true });
552
- }
553
- const safeName = file.filename.replace(/[/\\]/g, "_");
554
- writeFileSync(join(uploadDir, safeName), Buffer.from(base64, "base64"));
555
- savedPaths.push(join(PROJECT_DIR, "uploads", messageId, safeName));
556
- }
557
-
558
- if (savedPaths.length === 0) {
559
- // A bare image with no text leaves an empty text block, which some
560
- // providers reject — give it a minimal caption.
561
- if (images.length > 0 && !message.trim()) {
562
- return { text: "(see attached image)", images };
563
- }
564
- return { text: message, images };
565
- }
566
-
567
- const note = savedPaths.map((p) => `- ${p}`).join("\n");
568
- const base = message.trim() ? message : "(see attached files)";
569
- const text = `${base}\n\nAttached files saved into the workspace (read them as needed):\n${note}`;
570
- return { text, images };
571
- }
572
-
573
- type SkillEntry = ReturnType<typeof loadBundledSkills>[number];
574
-
575
- /** Match a leading `/<skill-name>` against the loaded skills; null if none. */
576
- function matchSkillCommand(
577
- message: string,
578
- skills: SkillEntry[]
579
- ): { entry: SkillEntry; args: string } | null {
580
- const text = (message ?? "").trimStart();
581
- if (!text.startsWith("/")) return null;
582
- const match = /^\/([^\s]+)\s*([\s\S]*)$/.exec(text);
583
- if (!match) return null;
584
- const name = match[1].toLowerCase();
585
- const entry = skills.find((s) => s.name.toLowerCase() === name);
586
- if (!entry) return null;
587
- return { entry, args: match[2].trim() };
588
- }
589
-
590
- /** Collect every `/<skill-name>` at a word boundary anywhere in the message. */
591
- function matchSkillMentions(message: string, skills: SkillEntry[]): SkillEntry[] {
592
- const found = new Map<string, SkillEntry>();
593
- for (const match of (message ?? "").matchAll(/(?:^|\s)\/([a-z0-9][a-z0-9-]*)/gi)) {
594
- const name = match[1].toLowerCase();
595
- if (found.has(name)) continue;
596
- const entry = skills.find((s) => s.name.toLowerCase() === name);
597
- if (entry) found.set(name, entry);
598
- }
599
- return [...found.values()];
600
- }
601
-
602
- /** Append each mentioned skill's instructions after the user's message. */
603
- function withSkillMentions(text: string, entries: SkillEntry[]): string {
604
- if (entries.length === 0) return text;
605
- const blocks = entries.map(
606
- (entry) => `<skill name="${entry.name}">\n${readSkillBody(entry)}\n</skill>`
607
- );
608
- return `${text}\n\nThe /<name> tokens in the message above reference skills. Follow each referenced skill's instructions for this request:\n\n${blocks.join("\n\n")}`;
609
- }
610
-
611
- /** Append the `<browser_state>` notice (when present) to a prompt. */
612
- function withBrowserState(notice: string | null, text: string): string {
613
- if (!notice) return text;
614
- return `${text}\n\n${notice}`;
615
- }
616
-
617
- /** Append the `<active_widget>` notice (when present) to a prompt. */
618
- function withActiveWidget(notice: string | null, text: string): string {
619
- if (!notice) return text;
620
- return `${text}\n\n${notice}`;
621
- }
622
-
623
- /** Append the `<workspace-context-update>` notice (when present) to a prompt. */
624
- function withContextUpdate(notice: string | null, text: string): string {
625
- if (!notice) return text;
626
- return `${text}\n\n${notice}`;
627
- }
628
-
629
- /** Expand a skill into a prompt: its workflow content plus any user args. */
630
- function buildSkillPrompt(entry: SkillEntry, args: string): string {
631
- const parts = [readSkillBody(entry)];
632
- if (args) parts.push(`---\n\nUser request: ${args}`);
633
- return parts.join("\n\n");
634
- }
635
-
636
- /** The skill's SKILL.md content with the YAML frontmatter stripped. */
637
- function readSkillBody(entry: SkillEntry): string {
638
- let content = "";
639
- try {
640
- content = readFileSync(entry.filePath, "utf8");
641
- } catch {
642
- content = "";
643
- }
644
- const body = content.replace(/^---\n[\s\S]*?\n---\n?/, "").trim();
645
- return body || `Apply the "${entry.name}" skill.`;
646
- }
647
-
648
- interface PromptFile {
649
- filename: string;
650
- mediaType: string;
651
- dataUrl: string;
652
- }
653
-
654
- interface ImageContent {
655
- type: "image";
656
- data: string;
657
- mimeType: string;
658
- }