@xihe-lab/tapd-core 2.0.0-rc.1

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 (202) hide show
  1. package/LICENSE +190 -0
  2. package/dist/advisor/advisor.test.d.ts +2 -0
  3. package/dist/advisor/advisor.test.d.ts.map +1 -0
  4. package/dist/advisor/advisor.test.js +102 -0
  5. package/dist/advisor/advisor.test.js.map +1 -0
  6. package/dist/advisor/index.d.ts +19 -0
  7. package/dist/advisor/index.d.ts.map +1 -0
  8. package/dist/advisor/index.js +240 -0
  9. package/dist/advisor/index.js.map +1 -0
  10. package/dist/config/config.d.ts +43 -0
  11. package/dist/config/config.d.ts.map +1 -0
  12. package/dist/config/config.js +221 -0
  13. package/dist/config/config.js.map +1 -0
  14. package/dist/config/config.test.d.ts +2 -0
  15. package/dist/config/config.test.d.ts.map +1 -0
  16. package/dist/config/config.test.js +229 -0
  17. package/dist/config/config.test.js.map +1 -0
  18. package/dist/index.d.ts +11 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +10 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/registry/cli-meta.d.ts +4 -0
  23. package/dist/registry/cli-meta.d.ts.map +1 -0
  24. package/dist/registry/cli-meta.js +104 -0
  25. package/dist/registry/cli-meta.js.map +1 -0
  26. package/dist/registry/debug-commands.d.ts +2 -0
  27. package/dist/registry/debug-commands.d.ts.map +1 -0
  28. package/dist/registry/debug-commands.js +47 -0
  29. package/dist/registry/debug-commands.js.map +1 -0
  30. package/dist/registry/derive-command.d.ts +6 -0
  31. package/dist/registry/derive-command.d.ts.map +1 -0
  32. package/dist/registry/derive-command.js +69 -0
  33. package/dist/registry/derive-command.js.map +1 -0
  34. package/dist/registry/long-id-guard.d.ts +3 -0
  35. package/dist/registry/long-id-guard.d.ts.map +1 -0
  36. package/dist/registry/long-id-guard.js +39 -0
  37. package/dist/registry/long-id-guard.js.map +1 -0
  38. package/dist/registry/long-id-guard.test.d.ts +2 -0
  39. package/dist/registry/long-id-guard.test.d.ts.map +1 -0
  40. package/dist/registry/long-id-guard.test.js +224 -0
  41. package/dist/registry/long-id-guard.test.js.map +1 -0
  42. package/dist/registry/registry.d.ts +43 -0
  43. package/dist/registry/registry.d.ts.map +1 -0
  44. package/dist/registry/registry.js +131 -0
  45. package/dist/registry/registry.js.map +1 -0
  46. package/dist/registry/registry.test.d.ts +2 -0
  47. package/dist/registry/registry.test.d.ts.map +1 -0
  48. package/dist/registry/registry.test.js +220 -0
  49. package/dist/registry/registry.test.js.map +1 -0
  50. package/dist/registry/richtext-manifests.generated.d.ts +3 -0
  51. package/dist/registry/richtext-manifests.generated.d.ts.map +1 -0
  52. package/dist/registry/richtext-manifests.generated.js +98 -0
  53. package/dist/registry/richtext-manifests.generated.js.map +1 -0
  54. package/dist/registry/richtext.d.ts +6 -0
  55. package/dist/registry/richtext.d.ts.map +1 -0
  56. package/dist/registry/richtext.js +64 -0
  57. package/dist/registry/richtext.js.map +1 -0
  58. package/dist/registry/richtext.test.d.ts +2 -0
  59. package/dist/registry/richtext.test.d.ts.map +1 -0
  60. package/dist/registry/richtext.test.js +210 -0
  61. package/dist/registry/richtext.test.js.map +1 -0
  62. package/dist/registry/write-policy.d.ts +3 -0
  63. package/dist/registry/write-policy.d.ts.map +1 -0
  64. package/dist/registry/write-policy.js +5 -0
  65. package/dist/registry/write-policy.js.map +1 -0
  66. package/dist/schema/export.d.ts +12 -0
  67. package/dist/schema/export.d.ts.map +1 -0
  68. package/dist/schema/export.js +39 -0
  69. package/dist/schema/export.js.map +1 -0
  70. package/dist/schema/export.test.d.ts +2 -0
  71. package/dist/schema/export.test.d.ts.map +1 -0
  72. package/dist/schema/export.test.js +68 -0
  73. package/dist/schema/export.test.js.map +1 -0
  74. package/dist/sdk-routes.d.ts +9 -0
  75. package/dist/sdk-routes.d.ts.map +1 -0
  76. package/dist/sdk-routes.js +148 -0
  77. package/dist/sdk-routes.js.map +1 -0
  78. package/dist/tapd-client.d.ts +99 -0
  79. package/dist/tapd-client.d.ts.map +1 -0
  80. package/dist/tapd-client.js +252 -0
  81. package/dist/tapd-client.js.map +1 -0
  82. package/dist/tools/attachment.d.ts +3 -0
  83. package/dist/tools/attachment.d.ts.map +1 -0
  84. package/dist/tools/attachment.js +99 -0
  85. package/dist/tools/attachment.js.map +1 -0
  86. package/dist/tools/board.d.ts +3 -0
  87. package/dist/tools/board.d.ts.map +1 -0
  88. package/dist/tools/board.js +98 -0
  89. package/dist/tools/board.js.map +1 -0
  90. package/dist/tools/bug.d.ts +3 -0
  91. package/dist/tools/bug.d.ts.map +1 -0
  92. package/dist/tools/bug.js +619 -0
  93. package/dist/tools/bug.js.map +1 -0
  94. package/dist/tools/changes.d.ts +3 -0
  95. package/dist/tools/changes.d.ts.map +1 -0
  96. package/dist/tools/changes.js +73 -0
  97. package/dist/tools/changes.js.map +1 -0
  98. package/dist/tools/comment.d.ts +3 -0
  99. package/dist/tools/comment.d.ts.map +1 -0
  100. package/dist/tools/comment.js +93 -0
  101. package/dist/tools/comment.js.map +1 -0
  102. package/dist/tools/custom-fields.d.ts +3 -0
  103. package/dist/tools/custom-fields.d.ts.map +1 -0
  104. package/dist/tools/custom-fields.js +105 -0
  105. package/dist/tools/custom-fields.js.map +1 -0
  106. package/dist/tools/image.d.ts +3 -0
  107. package/dist/tools/image.d.ts.map +1 -0
  108. package/dist/tools/image.js +23 -0
  109. package/dist/tools/image.js.map +1 -0
  110. package/dist/tools/index.d.ts +3 -0
  111. package/dist/tools/index.d.ts.map +1 -0
  112. package/dist/tools/index.js +55 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/iteration.d.ts +3 -0
  115. package/dist/tools/iteration.d.ts.map +1 -0
  116. package/dist/tools/iteration.js +190 -0
  117. package/dist/tools/iteration.js.map +1 -0
  118. package/dist/tools/md-to-html.test.d.ts +2 -0
  119. package/dist/tools/md-to-html.test.d.ts.map +1 -0
  120. package/dist/tools/md-to-html.test.js +125 -0
  121. package/dist/tools/md-to-html.test.js.map +1 -0
  122. package/dist/tools/mini-comment.d.ts +3 -0
  123. package/dist/tools/mini-comment.d.ts.map +1 -0
  124. package/dist/tools/mini-comment.js +74 -0
  125. package/dist/tools/mini-comment.js.map +1 -0
  126. package/dist/tools/mini-item.d.ts +3 -0
  127. package/dist/tools/mini-item.d.ts.map +1 -0
  128. package/dist/tools/mini-item.js +166 -0
  129. package/dist/tools/mini-item.js.map +1 -0
  130. package/dist/tools/mini-workspace.d.ts +3 -0
  131. package/dist/tools/mini-workspace.d.ts.map +1 -0
  132. package/dist/tools/mini-workspace.js +43 -0
  133. package/dist/tools/mini-workspace.js.map +1 -0
  134. package/dist/tools/program.d.ts +3 -0
  135. package/dist/tools/program.d.ts.map +1 -0
  136. package/dist/tools/program.js +27 -0
  137. package/dist/tools/program.js.map +1 -0
  138. package/dist/tools/relations.d.ts +3 -0
  139. package/dist/tools/relations.d.ts.map +1 -0
  140. package/dist/tools/relations.js +68 -0
  141. package/dist/tools/relations.js.map +1 -0
  142. package/dist/tools/release.d.ts +3 -0
  143. package/dist/tools/release.d.ts.map +1 -0
  144. package/dist/tools/release.js +250 -0
  145. package/dist/tools/release.js.map +1 -0
  146. package/dist/tools/report.d.ts +3 -0
  147. package/dist/tools/report.d.ts.map +1 -0
  148. package/dist/tools/report.js +38 -0
  149. package/dist/tools/report.js.map +1 -0
  150. package/dist/tools/settings.d.ts +3 -0
  151. package/dist/tools/settings.d.ts.map +1 -0
  152. package/dist/tools/settings.js +409 -0
  153. package/dist/tools/settings.js.map +1 -0
  154. package/dist/tools/source.d.ts +3 -0
  155. package/dist/tools/source.d.ts.map +1 -0
  156. package/dist/tools/source.js +69 -0
  157. package/dist/tools/source.js.map +1 -0
  158. package/dist/tools/story.d.ts +3 -0
  159. package/dist/tools/story.d.ts.map +1 -0
  160. package/dist/tools/story.js +680 -0
  161. package/dist/tools/story.js.map +1 -0
  162. package/dist/tools/task.d.ts +3 -0
  163. package/dist/tools/task.d.ts.map +1 -0
  164. package/dist/tools/task.js +267 -0
  165. package/dist/tools/task.js.map +1 -0
  166. package/dist/tools/test.d.ts +3 -0
  167. package/dist/tools/test.d.ts.map +1 -0
  168. package/dist/tools/test.js +564 -0
  169. package/dist/tools/test.js.map +1 -0
  170. package/dist/tools/timesheet.d.ts +3 -0
  171. package/dist/tools/timesheet.d.ts.map +1 -0
  172. package/dist/tools/timesheet.js +118 -0
  173. package/dist/tools/timesheet.js.map +1 -0
  174. package/dist/tools/user.d.ts +3 -0
  175. package/dist/tools/user.d.ts.map +1 -0
  176. package/dist/tools/user.js +57 -0
  177. package/dist/tools/user.js.map +1 -0
  178. package/dist/tools/utility.d.ts +3 -0
  179. package/dist/tools/utility.d.ts.map +1 -0
  180. package/dist/tools/utility.js +165 -0
  181. package/dist/tools/utility.js.map +1 -0
  182. package/dist/tools/wiki.d.ts +3 -0
  183. package/dist/tools/wiki.d.ts.map +1 -0
  184. package/dist/tools/wiki.js +227 -0
  185. package/dist/tools/wiki.js.map +1 -0
  186. package/dist/tools/workflow.d.ts +3 -0
  187. package/dist/tools/workflow.d.ts.map +1 -0
  188. package/dist/tools/workflow.js +116 -0
  189. package/dist/tools/workflow.js.map +1 -0
  190. package/dist/tools/workspace.d.ts +3 -0
  191. package/dist/tools/workspace.d.ts.map +1 -0
  192. package/dist/tools/workspace.js +137 -0
  193. package/dist/tools/workspace.js.map +1 -0
  194. package/dist/tools/zz-acceptance-echo.d.ts +3 -0
  195. package/dist/tools/zz-acceptance-echo.d.ts.map +1 -0
  196. package/dist/tools/zz-acceptance-echo.js +9 -0
  197. package/dist/tools/zz-acceptance-echo.js.map +1 -0
  198. package/dist/types.d.ts +34 -0
  199. package/dist/types.d.ts.map +1 -0
  200. package/dist/types.js +2 -0
  201. package/dist/types.js.map +1 -0
  202. package/package.json +49 -0
@@ -0,0 +1,104 @@
1
+ const STORY_COLUMNS = ['id', 'name', 'priority_label', 'owner', 'status'];
2
+ const BUG_COLUMNS = ['id', 'title', 'severity', 'current_owner', 'status'];
3
+ const TASK_COLUMNS = ['id', 'name', 'owner', 'status'];
4
+ const ITERATION_COLUMNS = ['id', 'name', 'startdate', 'enddate', 'status'];
5
+ const WIKI_COLUMNS = ['id', 'title', 'owner', 'created'];
6
+ export const MANUAL_CLI_META = {
7
+ // story
8
+ tapd_get_stories: { resource: 'story', action: 'list', outputFormat: 'table', columns: STORY_COLUMNS },
9
+ tapd_create_story: { resource: 'story', action: 'create' },
10
+ tapd_update_story: { resource: 'story', action: 'update', positional: 'id' },
11
+ tapd_get_story_count: { resource: 'story', action: 'count' },
12
+ tapd_copy_story: { resource: 'story', action: 'copy', positional: 'id' },
13
+ tapd_batch_update_stories: { resource: 'story', action: 'batch-update' },
14
+ tapd_get_story_categories: { resource: 'story-category', action: 'list', outputFormat: 'table' },
15
+ tapd_get_story_categories_count: { resource: 'story-category', action: 'count' },
16
+ tapd_add_story_category: { resource: 'story-category', action: 'create' },
17
+ tapd_update_story_category: { resource: 'story-category', action: 'update', positional: 'id' },
18
+ tapd_get_workitem_types: { resource: 'workitem-type', action: 'list', outputFormat: 'table' },
19
+ tapd_change_workitem_type: { resource: 'story', action: 'set-type', positional: 'id' },
20
+ tapd_get_story_fields_info: { resource: 'story', action: 'fields-info' },
21
+ tapd_get_story_fields_lable: { resource: 'story', action: 'fields-lable' },
22
+ tapd_get_story_template_list: { resource: 'story', action: 'template-list', outputFormat: 'table' },
23
+ tapd_get_default_story_template: { resource: 'story', action: 'default-template' },
24
+ tapd_get_story_related_bugs: { resource: 'story', action: 'related-bugs', outputFormat: 'table', columns: BUG_COLUMNS },
25
+ tapd_create_story_bug: { resource: 'story-bug-relation', action: 'create' },
26
+ tapd_remove_story_bug_relations: { resource: 'story-bug-relation', action: 'delete' },
27
+ tapd_get_story_tcase: { resource: 'story-tcase-relation', action: 'list', outputFormat: 'table' },
28
+ tapd_create_story_tcase: { resource: 'story-tcase-relation', action: 'create' },
29
+ tapd_get_time_relative_stories: { resource: 'story-relation', action: 'list', outputFormat: 'table' },
30
+ tapd_save_time_relations: { resource: 'story-relation', action: 'save' },
31
+ tapd_delete_time_relations: { resource: 'story-relation', action: 'delete' },
32
+ tapd_get_removed_stories: { resource: 'story', action: 'list-removed', outputFormat: 'table', columns: STORY_COLUMNS },
33
+ tapd_update_story_parent: { resource: 'story', action: 'set-parent', positional: 'id' },
34
+ tapd_get_stories_by_view_conf_id: { resource: 'story', action: 'list-by-view', outputFormat: 'table', columns: STORY_COLUMNS },
35
+ tapd_get_story_steps: { resource: 'story', action: 'steps' },
36
+ // bug
37
+ tapd_get_bugs: { resource: 'bug', action: 'list', outputFormat: 'table', columns: BUG_COLUMNS },
38
+ tapd_create_bug: { resource: 'bug', action: 'create' },
39
+ tapd_update_bug: { resource: 'bug', action: 'update', positional: 'id' },
40
+ tapd_get_bug_count: { resource: 'bug', action: 'count' },
41
+ tapd_get_bug_changes: { resource: 'bug', action: 'changes', outputFormat: 'table' },
42
+ tapd_get_bug_changes_count: { resource: 'bug', action: 'changes-count' },
43
+ tapd_get_bug_custom_fields_settings: { resource: 'bug', action: 'custom-fields-settings' },
44
+ tapd_get_bug_fields_info: { resource: 'bug', action: 'fields-info' },
45
+ tapd_get_bug_fields_lable: { resource: 'bug', action: 'fields-lable' },
46
+ tapd_get_bug_template_list: { resource: 'bug', action: 'template-list', outputFormat: 'table' },
47
+ tapd_get_default_bug_template: { resource: 'bug', action: 'default-template' },
48
+ tapd_batch_update_bugs: { resource: 'bug', action: 'batch-update' },
49
+ tapd_copy_bug: { resource: 'bug', action: 'copy', positional: 'id' },
50
+ tapd_get_link_bugs: { resource: 'bug', action: 'list-links', outputFormat: 'table' },
51
+ tapd_link_bugs: { resource: 'bug', action: 'link' },
52
+ tapd_delete_link_bugs: { resource: 'bug', action: 'delete-link' },
53
+ tapd_get_related_stories: { resource: 'bug', action: 'related-stories', outputFormat: 'table', columns: STORY_COLUMNS },
54
+ tapd_get_bugs_by_view_conf_id: { resource: 'bug', action: 'list-by-view', outputFormat: 'table', columns: BUG_COLUMNS },
55
+ tapd_get_removed_bugs: { resource: 'bug', action: 'list-removed', outputFormat: 'table', columns: BUG_COLUMNS },
56
+ tapd_bug_ids_to_query_token: { resource: 'bug', action: 'ids-to-query-token' },
57
+ // task
58
+ tapd_get_tasks: { resource: 'task', action: 'list', outputFormat: 'table', columns: TASK_COLUMNS },
59
+ tapd_create_task: { resource: 'task', action: 'create' },
60
+ tapd_update_task: { resource: 'task', action: 'update', positional: 'id' },
61
+ tapd_get_task_count: { resource: 'task', action: 'count' },
62
+ tapd_batch_update_tasks: { resource: 'task', action: 'batch-update' },
63
+ tapd_get_removed_tasks: { resource: 'task', action: 'list-removed', outputFormat: 'table', columns: TASK_COLUMNS },
64
+ tapd_get_tasks_by_view_conf_id: { resource: 'task', action: 'list-by-view', outputFormat: 'table', columns: TASK_COLUMNS },
65
+ // iteration
66
+ tapd_get_iterations: { resource: 'iteration', action: 'list', outputFormat: 'table', columns: ITERATION_COLUMNS },
67
+ tapd_create_iteration: { resource: 'iteration', action: 'create' },
68
+ tapd_update_iteration: { resource: 'iteration', action: 'update', positional: 'id' },
69
+ tapd_get_iteration_count: { resource: 'iteration', action: 'count' },
70
+ tapd_get_iteration_changes: { resource: 'iteration', action: 'changes', outputFormat: 'table' },
71
+ tapd_lock_iteration: { resource: 'iteration', action: 'lock', positional: 'id' },
72
+ tapd_unlock_iteration: { resource: 'iteration', action: 'unlock', positional: 'id' },
73
+ // wiki
74
+ tapd_get_wikis: { resource: 'wiki', action: 'list', outputFormat: 'table', columns: WIKI_COLUMNS },
75
+ tapd_create_wiki: { resource: 'wiki', action: 'create' },
76
+ tapd_update_wiki: { resource: 'wiki', action: 'update', positional: 'id' },
77
+ tapd_get_wiki_count: { resource: 'wiki', action: 'count' },
78
+ tapd_get_wiki_attachments_count: { resource: 'wiki', action: 'attachments-count' },
79
+ tapd_get_wiki_drawios: { resource: 'wiki', action: 'drawios' },
80
+ tapd_get_wiki_entity_permissions: { resource: 'wiki', action: 'entity-permissions' },
81
+ tapd_get_wiki_followers: { resource: 'wiki', action: 'followers', outputFormat: 'table' },
82
+ tapd_get_wiki_followers_count: { resource: 'wiki', action: 'followers-count' },
83
+ tapd_get_wiki_tags: { resource: 'wiki', action: 'tags', outputFormat: 'table' },
84
+ tapd_get_wiki_tags_count: { resource: 'wiki', action: 'tags-count' },
85
+ // exceptions (FSD 4.1.3)
86
+ tapd_short_to_long_id: { resource: 'id', action: 'to-long' },
87
+ tapd_get_current_user: { resource: 'auth', action: 'whoami' },
88
+ tapd_get_image_url: { resource: 'image', action: 'get-url' },
89
+ tapd_md_to_html: { resource: 'md', action: 'to-html' },
90
+ tapd_html_to_md: { resource: 'md', action: 'to-md' },
91
+ tapd_create_comment: { resource: 'story', action: 'comment', defaults: { entry_type: 'story' } },
92
+ tapd_get_comments: { resource: 'comment', action: 'list' },
93
+ tapd_update_comment: { resource: 'comment', action: 'update', positional: 'id' },
94
+ tapd_get_comments_count: { resource: 'comment', action: 'count' },
95
+ tapd_execute_tcase_instance: { resource: 'test', action: 'execute-instance' },
96
+ // extra exceptions: auto-derivation produces broken resource names (review finding)
97
+ tapd_add_custom_field_config: { resource: 'custom-field-config', action: 'create' },
98
+ tapd_update_cascade_field_options: { resource: 'custom-field-config', action: 'update-cascade-options' },
99
+ tapd_program_relate_workspace: { resource: 'program', action: 'relate-workspace' },
100
+ tapd_program_bind_entities: { resource: 'program', action: 'bind-entities' },
101
+ tapd_get_attachment: { resource: 'attachment', action: 'get', positional: 'id' },
102
+ };
103
+ export const EXPLICIT_WRITE = new Set(['tapd_change_workitem_type']);
104
+ //# sourceMappingURL=cli-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-meta.js","sourceRoot":"","sources":["../../src/registry/cli-meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=debug-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-commands.d.ts","sourceRoot":"","sources":["../../src/registry/debug-commands.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { allTools } from '../tools/index.js';
2
+ import { ToolRegistry } from './registry.js';
3
+ const outPath = process.argv[2];
4
+ const registry = new ToolRegistry();
5
+ registry.register(allTools);
6
+ const commands = registry.commands();
7
+ const writeCount = commands.filter(c => c.write).length;
8
+ const rows = commands.map(c => ({
9
+ tool: c.tool,
10
+ command: `tapd ${c.resource} ${c.action}`,
11
+ write: c.write ? 'Y' : '',
12
+ hidden: c.hidden ? 'Y' : '',
13
+ }));
14
+ const width = (header, get) => Math.max(header.length, ...rows.map(r => get(r).length));
15
+ const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
16
+ const tw = width('TOOL', r => r.tool);
17
+ const cw = width('COMMAND', r => r.command);
18
+ const lines = [
19
+ `total: ${commands.length} tools, write: ${writeCount}, read: ${commands.length - writeCount}`,
20
+ '',
21
+ pad('TOOL', tw) + ' ' + pad('COMMAND', cw) + ' WRITE HIDDEN',
22
+ ...rows.map(r => pad(r.tool, tw) + ' ' + pad(r.command, cw) + ' ' + pad(r.write, 5) + ' ' + r.hidden),
23
+ ];
24
+ const seen = new Map();
25
+ for (const c of commands) {
26
+ const key = `${c.resource} ${c.action}`;
27
+ const list = seen.get(key) ?? [];
28
+ list.push(c.tool);
29
+ seen.set(key, list);
30
+ }
31
+ const collisions = [...seen.entries()].filter(([, tools]) => tools.length > 1);
32
+ if (collisions.length > 0) {
33
+ lines.push('', 'COLLISIONS (same command, multiple tools):');
34
+ for (const [key, tools] of collisions) {
35
+ lines.push(` tapd ${key} <- ${tools.join(', ')}`);
36
+ }
37
+ }
38
+ const output = lines.join('\n');
39
+ if (outPath) {
40
+ const { writeFileSync } = await import('node:fs');
41
+ writeFileSync(outPath, output + '\n');
42
+ console.error(`written to ${outPath}`);
43
+ }
44
+ else {
45
+ console.log(output);
46
+ }
47
+ //# sourceMappingURL=debug-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-commands.js","sourceRoot":"","sources":["../../src/registry/debug-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface DerivedCommandParts {
2
+ resource: string;
3
+ action: string;
4
+ }
5
+ export declare function deriveCommand(name: string): DerivedCommandParts;
6
+ //# sourceMappingURL=derive-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-command.d.ts","sourceRoot":"","sources":["../../src/registry/derive-command.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAsC/D"}
@@ -0,0 +1,69 @@
1
+ const PLURAL_TO_SINGULAR = {
2
+ stories: 'story',
3
+ bugs: 'bug',
4
+ tasks: 'task',
5
+ iterations: 'iteration',
6
+ wikis: 'wiki',
7
+ comments: 'comment',
8
+ timesheets: 'timesheet',
9
+ workspaces: 'workspace',
10
+ items: 'item',
11
+ categories: 'category',
12
+ plans: 'plan',
13
+ cards: 'card',
14
+ projects: 'project',
15
+ modules: 'module',
16
+ versions: 'version',
17
+ features: 'feature',
18
+ baselines: 'baseline',
19
+ workflows: 'workflow',
20
+ roles: 'role',
21
+ releases: 'release',
22
+ attachments: 'attachment',
23
+ };
24
+ const VERB_MAP = {
25
+ get: 'list',
26
+ add: 'create',
27
+ remove: 'delete',
28
+ };
29
+ function singularize(word) {
30
+ return PLURAL_TO_SINGULAR[word] ?? word;
31
+ }
32
+ function kebab(words) {
33
+ return words.filter(Boolean).map(w => w.replace(/_/g, '-')).join('-');
34
+ }
35
+ export function deriveCommand(name) {
36
+ let segments = name.replace(/^tapd_/, '').split('_');
37
+ let prefix = '';
38
+ if (segments[0] === 'mini') {
39
+ prefix = 'mini';
40
+ segments = segments.slice(1);
41
+ }
42
+ let verb = segments[0] ?? '';
43
+ let rest = segments.slice(1);
44
+ if (verb === 'batch' && rest.length > 0) {
45
+ verb = `batch_${rest[0]}`;
46
+ rest = rest.slice(1);
47
+ }
48
+ if (rest.length === 0) {
49
+ return { resource: kebab([prefix, verb]), action: 'run' };
50
+ }
51
+ if (rest.length === 1) {
52
+ return {
53
+ resource: kebab([prefix, singularize(rest[0])]),
54
+ action: VERB_MAP[verb] ?? verb.replace(/_/g, '-'),
55
+ };
56
+ }
57
+ const lastWord = rest[rest.length - 1];
58
+ if (PLURAL_TO_SINGULAR[lastWord]) {
59
+ return {
60
+ resource: kebab([prefix, ...rest.map(singularize)]),
61
+ action: VERB_MAP[verb] ?? verb.replace(/_/g, '-'),
62
+ };
63
+ }
64
+ const resource = kebab([prefix, singularize(rest[0])]);
65
+ const tail = kebab(rest.slice(1));
66
+ const headVerb = verb === 'get' ? '' : (VERB_MAP[verb] ?? verb.replace(/_/g, '-'));
67
+ return { resource, action: kebab([headVerb, tail]) };
68
+ }
69
+ //# sourceMappingURL=derive-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-command.js","sourceRoot":"","sources":["../../src/registry/derive-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { z } from 'zod';
2
+ export declare function guardLongIdSchema(schema: z.ZodTypeAny): z.ZodTypeAny;
3
+ //# sourceMappingURL=long-id-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-id-guard.d.ts","sourceRoot":"","sources":["../../src/registry/long-id-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAWpE"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ const LONG_ID_PARAM = /^(id|ids)$|^([a-z_]+_ids?)$/;
3
+ function wrapLongIdField(field, key) {
4
+ const wrap = (inner) => z.preprocess(v => {
5
+ if (typeof v !== 'number')
6
+ return v;
7
+ if (Number.isSafeInteger(v))
8
+ return String(v);
9
+ throw new Error(`参数 ${key} 的值超出 JS 安全整数范围(精度丢失),请以字符串(带引号)重传`);
10
+ }, inner);
11
+ if (field instanceof z.ZodString) {
12
+ const core = wrap(field);
13
+ return field.description ? core.describe(field.description) : core;
14
+ }
15
+ if (field instanceof z.ZodOptional || field instanceof z.ZodNullable) {
16
+ const inner = field._def.innerType;
17
+ if (!(inner instanceof z.ZodString))
18
+ return null;
19
+ const core = wrap(inner);
20
+ const rebuilt = field instanceof z.ZodOptional ? core.optional() : core.nullable();
21
+ return field.description ? rebuilt.describe(field.description) : rebuilt;
22
+ }
23
+ return null;
24
+ }
25
+ export function guardLongIdSchema(schema) {
26
+ if (!(schema instanceof z.ZodObject))
27
+ return schema;
28
+ const shape = schema.shape;
29
+ const next = {};
30
+ let touched = false;
31
+ for (const [key, field] of Object.entries(shape)) {
32
+ const wrapped = LONG_ID_PARAM.test(key) ? wrapLongIdField(field, key) : null;
33
+ next[key] = wrapped ?? field;
34
+ if (wrapped)
35
+ touched = true;
36
+ }
37
+ return touched ? z.object(next) : schema;
38
+ }
39
+ //# sourceMappingURL=long-id-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-id-guard.js","sourceRoot":"","sources":["../../src/registry/long-id-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAEpD,SAAS,eAAe,CAAC,KAAmB,EAAE,GAAW;IACvD,MAAM,IAAI,GAAG,CAAC,KAAkB,EAAE,EAAE,CAClC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;QACf,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,oCAAoC,CAAC,CAAC;IACjE,CAAC,EAAE,KAAK,CAAC,CAAC;IAEZ,IAAI,KAAK,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,YAAY,CAAC,CAAC,WAAW,IAAI,KAAK,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnF,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAqC,CAAC;IAC3D,MAAM,IAAI,GAAiC,EAAE,CAAC;IAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC;QAC7B,IAAI,OAAO;YAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=long-id-guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-id-guard.test.d.ts","sourceRoot":"","sources":["../../src/registry/long-id-guard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,224 @@
1
+ import assert from 'node:assert/strict';
2
+ import { z } from 'zod';
3
+ import { workflowTools } from '../tools/workflow.js';
4
+ import { ToolRegistry } from './registry.js';
5
+ function makeTool(overrides) {
6
+ return {
7
+ description: 'test tool',
8
+ inputSchema: z.object({}),
9
+ handler: () => Promise.resolve({ done: true }),
10
+ ...overrides,
11
+ };
12
+ }
13
+ const fakeFactory = () => ({});
14
+ const checks = [
15
+ ['safe integer number id is coerced to string', async () => {
16
+ const registry = new ToolRegistry();
17
+ let received;
18
+ registry.register([
19
+ makeTool({
20
+ name: 'tapd_get_story',
21
+ inputSchema: z.object({ id: z.string(), workspace_id: z.number().optional() }),
22
+ handler: (_c, params) => {
23
+ received = params;
24
+ return Promise.resolve(params);
25
+ },
26
+ }),
27
+ ]);
28
+ const result = await registry.exec('tapd_get_story', { id: 39814312 }, { entry: 'mcp' }, fakeFactory);
29
+ assert.equal(result.ok, true);
30
+ assert.deepEqual(received, { id: '39814312' });
31
+ }],
32
+ ['unsafe integer number id throws precise error via exec INVALID_ARGS', async () => {
33
+ const registry = new ToolRegistry();
34
+ const codes = [];
35
+ const audit = (e) => codes.push(e.errorCode);
36
+ registry.register([
37
+ makeTool({ name: 'tapd_get_story', inputSchema: z.object({ id: z.string() }) }),
38
+ ]);
39
+ const result = await registry.exec('tapd_get_story', { id: Number('1139814312001001410') }, { entry: 'cli', onAudit: audit }, fakeFactory);
40
+ assert.equal(result.ok, false);
41
+ assert.equal(result.error?.code, 'INVALID_ARGS');
42
+ assert.match(result.error?.message ?? '', /超出 JS 安全整数范围/);
43
+ assert.match(result.error?.message ?? '', /字符串(带引号)重传/);
44
+ assert.equal(codes.at(-1), 'INVALID_ARGS');
45
+ }],
46
+ ['optional id field wrapped: safe number rescued, missing stays optional', async () => {
47
+ const registry = new ToolRegistry();
48
+ let received;
49
+ registry.register([
50
+ makeTool({
51
+ name: 'tapd_get_stories',
52
+ inputSchema: z.object({
53
+ ids: z.string().optional(),
54
+ workspace_id: z.number().optional(),
55
+ }),
56
+ handler: (_c, params) => {
57
+ received = params;
58
+ return Promise.resolve(params);
59
+ },
60
+ }),
61
+ ]);
62
+ const rescued = await registry.exec('tapd_get_stories', { ids: 123 }, { entry: 'mcp' }, fakeFactory);
63
+ assert.equal(rescued.ok, true);
64
+ assert.deepEqual(received, { ids: '123' });
65
+ const omitted = await registry.exec('tapd_get_stories', {}, { entry: 'mcp' }, fakeFactory);
66
+ assert.equal(omitted.ok, true);
67
+ }],
68
+ ['nullable id field wrapped', async () => {
69
+ const registry = new ToolRegistry();
70
+ let received;
71
+ registry.register([
72
+ makeTool({
73
+ name: 'tapd_nullable_id',
74
+ inputSchema: z.object({ id: z.string().nullable() }),
75
+ handler: (_c, params) => {
76
+ received = params;
77
+ return Promise.resolve(params);
78
+ },
79
+ }),
80
+ ]);
81
+ const rescued = await registry.exec('tapd_nullable_id', { id: 456 }, { entry: 'mcp' }, fakeFactory);
82
+ assert.equal(rescued.ok, true);
83
+ assert.deepEqual(received, { id: '456' });
84
+ const nulled = await registry.exec('tapd_nullable_id', { id: null }, { entry: 'mcp' }, fakeFactory);
85
+ assert.equal(nulled.ok, true);
86
+ assert.deepEqual(received, { id: null });
87
+ }],
88
+ ['wrapped ids preserve describe guide for CLI help and MCP JSONSchema', () => {
89
+ const guide = '必须以字符串(带引号)传递,禁止传数值';
90
+ const registry = new ToolRegistry();
91
+ registry.register([
92
+ makeTool({
93
+ name: 'tapd_get_story',
94
+ inputSchema: z.object({
95
+ id: z.string().describe(`需求ID;${guide}`),
96
+ ids: z.string().optional().describe(`需求IDs;${guide}`),
97
+ }),
98
+ }),
99
+ ]);
100
+ const shape = registry.get('tapd_get_story').inputSchema.shape;
101
+ assert.equal(shape.id?.description, `需求ID;${guide}`);
102
+ assert.equal(shape.ids?.description, `需求IDs;${guide}`);
103
+ }],
104
+ ['non-id fields untouched: workspace_id stays number, name stays string', async () => {
105
+ const registry = new ToolRegistry();
106
+ let received;
107
+ registry.register([
108
+ makeTool({
109
+ name: 'tapd_get_stories',
110
+ inputSchema: z.object({
111
+ workspace_id: z.number().optional(),
112
+ name: z.string().optional(),
113
+ status: z.string().optional(),
114
+ }),
115
+ handler: (_c, params) => {
116
+ received = params;
117
+ return Promise.resolve(params);
118
+ },
119
+ }),
120
+ ]);
121
+ const result = await registry.exec('tapd_get_stories', { workspace_id: 39814312, name: 'test' }, { entry: 'mcp' }, fakeFactory);
122
+ assert.equal(result.ok, true);
123
+ assert.deepEqual(received, { workspace_id: 39814312, name: 'test' });
124
+ const schema = registry.get('tapd_get_stories').inputSchema;
125
+ const inner = schema.shape.workspace_id._def.innerType;
126
+ assert.ok(inner instanceof z.ZodNumber);
127
+ }],
128
+ ['string id passes through unchanged', async () => {
129
+ const registry = new ToolRegistry();
130
+ let received;
131
+ registry.register([
132
+ makeTool({
133
+ name: 'tapd_get_story',
134
+ inputSchema: z.object({ id: z.string() }),
135
+ handler: (_c, params) => {
136
+ received = params;
137
+ return Promise.resolve(params);
138
+ },
139
+ }),
140
+ ]);
141
+ const result = await registry.exec('tapd_get_story', { id: '1139814312001001410' }, { entry: 'mcp' }, fakeFactory);
142
+ assert.equal(result.ok, true);
143
+ assert.deepEqual(received, { id: '1139814312001001410' });
144
+ }],
145
+ ['list() exposes guarded schema so MCP SDK registration gets the guard', () => {
146
+ const registry = new ToolRegistry();
147
+ registry.register([
148
+ makeTool({
149
+ name: 'tapd_get_story',
150
+ inputSchema: z.object({ id: z.string().optional() }),
151
+ }),
152
+ ]);
153
+ const tool = registry.list()[0];
154
+ const shape = tool.inputSchema.shape;
155
+ assert.equal(shape.id.constructor.name, 'ZodOptional');
156
+ const inner = shape.id._def.innerType;
157
+ assert.equal(inner.constructor.name, 'ZodEffects');
158
+ }],
159
+ ['real workflow status_map: unsafe number workitem_type_id rejected with INVALID_ARGS', async () => {
160
+ const registry = new ToolRegistry();
161
+ registry.register(workflowTools);
162
+ const result = await registry.exec('tapd_get_workflow_status_map', { workspace_id: 39814312, system: 'story', workitem_type_id: Number('1139814312001001410') }, { entry: 'mcp' }, fakeFactory);
163
+ assert.equal(result.ok, false);
164
+ assert.equal(result.error?.code, 'INVALID_ARGS');
165
+ assert.match(result.error?.message ?? '', /workitem_type_id/);
166
+ assert.match(result.error?.message ?? '', /超出 JS 安全整数范围/);
167
+ assert.match(result.error?.message ?? '', /字符串(带引号)重传/);
168
+ }],
169
+ ['real workflow status_map: string workitem_type_id reaches handler as string', async () => {
170
+ const registry = new ToolRegistry();
171
+ let receivedPath = '';
172
+ let receivedParams = {};
173
+ const stub = {
174
+ get: (path, params) => {
175
+ receivedPath = path;
176
+ receivedParams = params;
177
+ return Promise.resolve({ data: [] });
178
+ },
179
+ };
180
+ registry.register(workflowTools);
181
+ const result = await registry.exec('tapd_get_workflow_status_map', { workspace_id: 39814312, system: 'story', workitem_type_id: '1139814312001001410' }, { entry: 'mcp' }, () => stub);
182
+ assert.equal(result.ok, true);
183
+ assert.equal(receivedPath, '/workflows/status_map');
184
+ assert.equal(receivedParams.workitem_type_id, '1139814312001001410');
185
+ }],
186
+ ['real workflow step_map: unsafe number rejected, safe number rescued to string', async () => {
187
+ const registry = new ToolRegistry();
188
+ let receivedParams = {};
189
+ const stub = {
190
+ get: (_path, params) => {
191
+ receivedParams = params;
192
+ return Promise.resolve({ data: [] });
193
+ },
194
+ };
195
+ registry.register(workflowTools);
196
+ const rejected = await registry.exec('tapd_get_workflow_step_map', { workspace_id: 39814312, system: 'story', workitem_type_id: Number('12345678901234567890') }, { entry: 'mcp' }, fakeFactory);
197
+ assert.equal(rejected.ok, false);
198
+ assert.equal(rejected.error?.code, 'INVALID_ARGS');
199
+ assert.match(rejected.error?.message ?? '', /超出 JS 安全整数范围/);
200
+ const rescued = await registry.exec('tapd_get_workflow_step_map', { workspace_id: 39814312, system: 'story', workitem_type_id: 12345678901 }, { entry: 'mcp' }, () => stub);
201
+ assert.equal(rescued.ok, true);
202
+ assert.equal(receivedParams.workitem_type_id, '12345678901');
203
+ }],
204
+ ];
205
+ let failed = 0;
206
+ for (const [name, check] of checks) {
207
+ try {
208
+ await check();
209
+ console.log(`PASS ${name}`);
210
+ }
211
+ catch (error) {
212
+ failed++;
213
+ console.error(`FAIL ${name}`);
214
+ console.error(` ${error instanceof Error ? error.message : String(error)}`);
215
+ }
216
+ }
217
+ if (failed > 0) {
218
+ console.error(`\n${failed}/${checks.length} failed`);
219
+ process.exitCode = 1;
220
+ }
221
+ else {
222
+ console.log(`\n${checks.length}/${checks.length} passed`);
223
+ }
224
+ //# sourceMappingURL=long-id-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-id-guard.test.js","sourceRoot":"","sources":["../../src/registry/long-id-guard.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,SAAS,QAAQ,CAAC,SAA8C;IAC9D,OAAO;QACL,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9C,GAAG,SAAS;KACF,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAe,CAAC;AAE7C,MAAM,MAAM,GAA2C;IACrD,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAiB,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC9E,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;wBACtB,QAAQ,GAAG,MAAM,CAAC;wBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;YACtG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC;IAEF,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,MAAM,KAAK,GAAiC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;aAChF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAChC,gBAAgB,EAChB,EAAE,EAAE,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,EACrC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAChC,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC7C,CAAC,CAAC;IAEF,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAiB,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;wBACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;wBAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBACpC,CAAC;oBACF,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;wBACtB,QAAQ,GAAG,MAAM,CAAC;wBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;YACrG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3F,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;IAEF,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAiB,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACpD,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;wBACtB,QAAQ,GAAG,MAAM,CAAC;wBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;YACpG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;YACpG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC;IAEF,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC3E,MAAM,KAAK,GAAG,qBAAqB,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;wBACpB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,EAAE,CAAC;wBACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,EAAE,CAAC;qBACtD,CAAC;iBACH,CAAC;aACH,CAAC,CAAC;YACH,MAAM,KAAK,GAAI,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAE,CAAC,WAE7C,CAAC,KAAK,CAAC;YACT,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC;IACF,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAiB,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,kBAAkB;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;wBACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;wBACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;wBAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC9B,CAAC;oBACF,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;wBACtB,QAAQ,GAAG,MAAM,CAAC;wBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAChC,kBAAkB,EAClB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EACxC,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAE,CAAC,WAEhD,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC,CAAC;IAEF,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAiB,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;oBACzC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;wBACtB,QAAQ,GAAG,MAAM,CAAC;wBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjC,CAAC;iBACF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAChC,gBAAgB,EAChB,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC;IAEF,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC5E,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,QAAQ,CAAC,QAAQ,CAAC;gBAChB,QAAQ,CAAC;oBACP,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;iBACrD,CAAC;aACH,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,KAAK,GAAI,IAAI,CAAC,WAAkE,CAAC,KAAK,CAAC;YAC7F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACvD,MAAM,KAAK,GAAI,KAAK,CAAC,EAAkC,CAAC,IAAI,CAAC,SAAS,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC;IAEF,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;YACjG,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAChC,8BAA8B,EAC9B,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAC5F,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC,CAAC;IAEF,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,cAAc,GAA4B,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG;gBACX,GAAG,EAAE,CAAC,IAAY,EAAE,MAA+B,EAAE,EAAE;oBACrD,YAAY,GAAG,IAAI,CAAC;oBACpB,cAAc,GAAG,MAAM,CAAC;oBACxB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvC,CAAC;aACF,CAAC;YACF,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAChC,8BAA8B,EAC9B,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,EACpF,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,GAAG,EAAE,CAAC,IAA6B,CACpC,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;QACvE,CAAC,CAAC;IAEF,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;YAC3F,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,cAAc,GAA4B,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG;gBACX,GAAG,EAAE,CAAC,KAAa,EAAE,MAA+B,EAAE,EAAE;oBACtD,cAAc,GAAG,MAAM,CAAC;oBACxB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvC,CAAC;aACF,CAAC;YACF,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAClC,4BAA4B,EAC5B,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAC7F,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;YAE5D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CACjC,4BAA4B,EAC5B,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAC1E,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,GAAG,EAAE,CAAC,IAA6B,CACpC,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC/D,CAAC,CAAC;CACH,CAAC;AAEF,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { ToolDef } from '../types.js';
2
+ import type { TapdClient } from '../tapd-client.js';
3
+ export type Entry = 'cli' | 'mcp';
4
+ export interface ExecContext {
5
+ entry: Entry;
6
+ readOnly?: boolean;
7
+ timeoutMs?: number;
8
+ onAudit?: (event: AuditEvent) => void;
9
+ }
10
+ export interface AuditEvent {
11
+ ts: string;
12
+ entry: Entry;
13
+ tool: string;
14
+ args: Record<string, unknown>;
15
+ ok: boolean;
16
+ errorCode?: CliErrorCode;
17
+ durationMs: number;
18
+ }
19
+ export type CliErrorCode = 'TOOL_NOT_FOUND' | 'INVALID_ARGS' | 'READ_ONLY_BLOCKED' | 'AUTH_MISSING' | 'API_ERROR' | 'TIMEOUT';
20
+ export interface ExecResult<T = unknown> {
21
+ ok: boolean;
22
+ data?: T;
23
+ error?: {
24
+ code: CliErrorCode;
25
+ message: string;
26
+ };
27
+ }
28
+ export interface DerivedCommand {
29
+ tool: string;
30
+ resource: string;
31
+ action: string;
32
+ write: boolean;
33
+ hidden: boolean;
34
+ }
35
+ export declare class ToolRegistry {
36
+ private tools;
37
+ register(tools: ToolDef[]): void;
38
+ get(name: string): ToolDef | undefined;
39
+ list(): ToolDef[];
40
+ commands(): DerivedCommand[];
41
+ exec<T = unknown>(name: string, args: unknown, ctx: ExecContext, clientFactory?: () => TapdClient): Promise<ExecResult<T>>;
42
+ }
43
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAiCD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA8B;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAchC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,IAAI,IAAI,OAAO,EAAE;IAIjB,QAAQ,IAAI,cAAc,EAAE;IAatB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,aAAa,CAAC,EAAE,MAAM,UAAU,GAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAmE1B"}