@arbium/enterprise-agent-connect 0.2.0 → 0.2.1-dev.7b4e802

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 (68) hide show
  1. package/README.md +10 -3
  2. package/dist/connectors/adestra/connector.json +336 -0
  3. package/dist/connectors/adobe-admin-console/connector.json +212 -0
  4. package/dist/connectors/argo-cd/connector.json +210 -0
  5. package/dist/connectors/automox/connector.json +376 -0
  6. package/dist/connectors/churnzero/connector.json +238 -0
  7. package/dist/connectors/confluence/connector.json +168 -0
  8. package/dist/connectors/cvent/connector.json +287 -0
  9. package/dist/connectors/datadog/connector.json +188 -0
  10. package/dist/connectors/drata/connector.json +447 -0
  11. package/dist/connectors/druva/connector.json +258 -0
  12. package/dist/connectors/forsta-decipher/connector.json +164 -0
  13. package/dist/connectors/gitlab/connector.json +263 -0
  14. package/dist/connectors/grafana/connector.json +162 -0
  15. package/dist/connectors/http/index.d.ts +5 -1
  16. package/dist/connectors/http/index.js +62 -8
  17. package/dist/connectors/http/index.js.map +1 -1
  18. package/dist/connectors/http/openapi.d.ts +62 -0
  19. package/dist/connectors/http/openapi.js +342 -0
  20. package/dist/connectors/http/openapi.js.map +1 -0
  21. package/dist/connectors/intercom/connector.json +249 -0
  22. package/dist/connectors/lusha/connector.json +59 -0
  23. package/dist/connectors/lusha/index.d.ts +8 -0
  24. package/dist/connectors/lusha/index.js +7 -0
  25. package/dist/connectors/lusha/index.js.map +1 -0
  26. package/dist/connectors/lusha/tools.d.ts +2 -0
  27. package/dist/connectors/lusha/tools.js +113 -0
  28. package/dist/connectors/lusha/tools.js.map +1 -0
  29. package/dist/connectors/lusha/vendor.d.ts +4 -0
  30. package/dist/connectors/lusha/vendor.js +72 -0
  31. package/dist/connectors/lusha/vendor.js.map +1 -0
  32. package/dist/connectors/odata/index.js +12 -5
  33. package/dist/connectors/odata/index.js.map +1 -1
  34. package/dist/connectors/pagerduty/connector.json +247 -0
  35. package/dist/connectors/qualys/connector.json +271 -0
  36. package/dist/connectors/safebase/connector.json +221 -0
  37. package/dist/connectors/soap/index.js +4 -3
  38. package/dist/connectors/soap/index.js.map +1 -1
  39. package/dist/connectors/sonarqube/connector.json +165 -0
  40. package/dist/connectors/sprout-social/connector.json +158 -0
  41. package/dist/connectors/synthesia/connector.json +113 -0
  42. package/dist/connectors/wordpress/connector.json +203 -0
  43. package/dist/connectors/zephyr/connector.json +192 -0
  44. package/dist/packages/connector-kit/src/connector.d.ts +45 -7
  45. package/dist/packages/connector-kit/src/connector.js +113 -10
  46. package/dist/packages/connector-kit/src/connector.js.map +1 -1
  47. package/dist/packages/connector-kit/src/oauth.d.ts +2 -0
  48. package/dist/packages/connector-kit/src/oauth.js +12 -4
  49. package/dist/packages/connector-kit/src/oauth.js.map +1 -1
  50. package/dist/packages/server/migrations/0008_internal_apps.sql +16 -0
  51. package/dist/packages/server/migrations/rollback/to-legacy.sql +2 -0
  52. package/dist/packages/server/src/api.d.ts +2490 -277
  53. package/dist/packages/server/src/api.js +82 -1
  54. package/dist/packages/server/src/api.js.map +1 -1
  55. package/dist/packages/server/src/app.js +26 -1
  56. package/dist/packages/server/src/app.js.map +1 -1
  57. package/dist/packages/server/src/builtin.d.ts +3 -0
  58. package/dist/packages/server/src/builtin.js +32 -0
  59. package/dist/packages/server/src/builtin.js.map +1 -1
  60. package/dist/packages/server/src/index.js +27 -18
  61. package/dist/packages/server/src/index.js.map +1 -1
  62. package/dist/packages/server/src/service.d.ts +1113 -0
  63. package/dist/packages/server/src/service.js +257 -19
  64. package/dist/packages/server/src/service.js.map +1 -1
  65. package/dist/packages/server/src/store.d.ts +41 -1
  66. package/dist/packages/server/src/store.js +79 -0
  67. package/dist/packages/server/src/store.js.map +1 -1
  68. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ {
2
+ "id": "synthesia",
3
+ "name": "Synthesia",
4
+ "description": "Let agents find your Synthesia videos and templates: each video's status, length, thumbnail and download link, so campaigns can point to finished videos. Read-only.",
5
+ "logo": "/brand/registry/synthesia.svg",
6
+ "identity": "A Synthesia API key. It acts as the person who created it, with their access to videos in the workspace.",
7
+ "accountKey": "host",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create an API key",
12
+ "body": "Your Synthesia plan decides whether you can create API keys. The key needs the Legacy (v2) scope, which the video API asks for. Synthesia shows the key only once.",
13
+ "link": {
14
+ "label": "Synthesia: create an API key",
15
+ "href": "https://docs.synthesia.io/docs/developers"
16
+ },
17
+ "click": [
18
+ "In Synthesia, select Developers in the sidebar, then the API keys tab.",
19
+ "Select New API key, name it Agents, grant the Legacy (v2) scope and choose when it expires.",
20
+ "Select Create API key and copy the key."
21
+ ]
22
+ }
23
+ ],
24
+ "afterConnect": [],
25
+ "fields": [
26
+ {
27
+ "id": "api_key",
28
+ "label": "API key",
29
+ "secret": true
30
+ }
31
+ ],
32
+ "capabilities": [
33
+ {
34
+ "id": "read",
35
+ "label": "Read videos and templates",
36
+ "description": "List videos and templates, and read one video: its status, length, thumbnail, captions and download link.",
37
+ "required": true,
38
+ "note": "Reaches the videos the key's owner can see in the workspace. Read-only.",
39
+ "scopes": ["Legacy (v2)"],
40
+ "permissions": [],
41
+ "tools": ["synthesia_list_videos", "synthesia_get_video", "synthesia_list_templates"]
42
+ }
43
+ ],
44
+ "limits": [],
45
+ "verify": {
46
+ "method": "GET",
47
+ "path": "/videos?limit=5",
48
+ "label": "Synthesia videos",
49
+ "show": "videos[].title"
50
+ },
51
+ "revoke": "In Synthesia, select Developers, then API keys, and disable or delete the key. Agents lose access to Synthesia at once.",
52
+ "http": {
53
+ "baseUrl": "https://api.synthesia.io/v2",
54
+ "auth": { "type": "header", "header": "Authorization", "value": "api_key" },
55
+ "tools": [
56
+ {
57
+ "name": "synthesia_list_videos",
58
+ "description": "List videos with their status (in progress, complete) and titles.",
59
+ "method": "GET",
60
+ "path": "/videos",
61
+ "params": {
62
+ "limit": { "type": "integer", "description": "Videos per page, up to 100", "in": "query", "default": 20 },
63
+ "offset": { "type": "integer", "description": "Where the page starts, from the previous answer", "in": "query", "required": false },
64
+ "source": {
65
+ "type": "array",
66
+ "items": "string",
67
+ "description": "Where to look",
68
+ "in": "query",
69
+ "enum": ["workspace", "shared_with_me", "my_videos"],
70
+ "required": false
71
+ }
72
+ },
73
+ "result": {
74
+ "items": "videos",
75
+ "fields": ["id", "title", "description", "status", "duration", "visibility", "createdAt", "lastUpdatedAt", "download", "thumbnail.image"]
76
+ },
77
+ "paging": { "param": "offset", "body": "nextOffset" }
78
+ },
79
+ {
80
+ "name": "synthesia_get_video",
81
+ "description": "Read one video: status, length, thumbnail, captions and its download link.",
82
+ "method": "GET",
83
+ "path": "/videos/{video_id}",
84
+ "params": {
85
+ "video_id": { "type": "string", "description": "The video id", "in": "path" }
86
+ },
87
+ "result": {
88
+ "fields": ["id", "title", "description", "status", "duration", "visibility", "createdAt", "lastUpdatedAt", "download", "thumbnail", "captions"]
89
+ }
90
+ },
91
+ {
92
+ "name": "synthesia_list_templates",
93
+ "description": "List video templates, with the variables each one fills in.",
94
+ "method": "GET",
95
+ "path": "/templates",
96
+ "params": {
97
+ "limit": { "type": "integer", "description": "Templates per page, up to 100", "in": "query", "default": 20 },
98
+ "offset": { "type": "integer", "description": "Where the page starts, from the previous answer", "in": "query", "required": false },
99
+ "source": {
100
+ "type": "array",
101
+ "items": "string",
102
+ "description": "Your workspace's templates, Synthesia's, or both",
103
+ "in": "query",
104
+ "enum": ["workspace", "synthesia"],
105
+ "required": false
106
+ }
107
+ },
108
+ "result": { "items": "templates", "fields": ["id", "title", "description", "variables", "duration"] },
109
+ "paging": { "param": "offset", "body": "nextOffset" }
110
+ }
111
+ ]
112
+ }
113
+ }
@@ -0,0 +1,203 @@
1
+ {
2
+ "id": "wordpress",
3
+ "name": "WordPress",
4
+ "description": "Let agents draft posts on your WordPress site for an editor to review: find and read posts, create drafts or posts waiting for review and, if you allow it, edit posts. Agents never publish.",
5
+ "logo": "/brand/registry/wordpress.svg",
6
+ "identity": "An application password of a WordPress user. Agents act as that user, so make one with the Author or Contributor role.",
7
+ "accountKey": "host",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create a user for agents",
12
+ "body": "Make a WordPress user for agents with the Contributor role (writes posts for review) or Author. Agents can only ever save drafts or posts pending review, whatever the role.",
13
+ "click": ["In WordPress admin, go to Users, then Add New User, and create a user named Agents with the Contributor role."]
14
+ },
15
+ {
16
+ "title": "Create an application password",
17
+ "body": "Application passwords work over https only and need WordPress 5.6 or later. WordPress shows the password once.",
18
+ "link": {
19
+ "label": "WordPress: application passwords",
20
+ "href": "https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/"
21
+ },
22
+ "click": [
23
+ "In WordPress admin, go to Users, then edit the Agents user.",
24
+ "Under Application Passwords, enter the name Agents and select Add New Application Password.",
25
+ "Copy the password."
26
+ ]
27
+ }
28
+ ],
29
+ "afterConnect": [],
30
+ "fields": [
31
+ {
32
+ "id": "host",
33
+ "label": "Site address",
34
+ "help": "Your site's host name, without https:// or a path.",
35
+ "placeholder": "blog.example.com",
36
+ "secret": false
37
+ },
38
+ {
39
+ "id": "username",
40
+ "label": "Username",
41
+ "help": "The agents' WordPress user.",
42
+ "secret": false
43
+ },
44
+ {
45
+ "id": "app_password",
46
+ "label": "Application password",
47
+ "secret": true
48
+ }
49
+ ],
50
+ "capabilities": [
51
+ {
52
+ "id": "read",
53
+ "label": "Read posts",
54
+ "description": "Find posts by text or status, read one post, and list categories and tags.",
55
+ "required": true,
56
+ "scopes": [],
57
+ "permissions": [],
58
+ "tools": ["wordpress_list_posts", "wordpress_get_post", "wordpress_list_categories", "wordpress_list_tags"]
59
+ },
60
+ {
61
+ "id": "draft",
62
+ "label": "Write drafts",
63
+ "description": "Create posts as drafts or pending review. Nothing is published.",
64
+ "scopes": [],
65
+ "permissions": [],
66
+ "tools": ["wordpress_create_draft"]
67
+ },
68
+ {
69
+ "id": "edit",
70
+ "label": "Edit posts",
71
+ "description": "Change a post's title, content, excerpt, categories or tags, or set it back to draft or pending review.",
72
+ "destructive": true,
73
+ "note": "Edits to a published post show on the site at once, and setting one to draft takes it down. A Contributor can edit only their own unpublished posts, so give agents that role if they should never touch live posts.",
74
+ "scopes": [],
75
+ "permissions": [],
76
+ "tools": ["wordpress_update_post"]
77
+ }
78
+ ],
79
+ "limits": [],
80
+ "verify": {
81
+ "method": "GET",
82
+ "path": "/users/me",
83
+ "label": "WordPress user",
84
+ "show": "name"
85
+ },
86
+ "revoke": "In WordPress admin, edit the Agents user and revoke the application password under Application Passwords. Agents lose access to the site at once.",
87
+ "http": {
88
+ "baseUrl": "https://{host}/wp-json/wp/v2",
89
+ "auth": { "type": "basic", "username": "username", "password": "app_password" },
90
+ "tools": [
91
+ {
92
+ "name": "wordpress_list_posts",
93
+ "description": "Find posts, newest first, by text or status.",
94
+ "method": "GET",
95
+ "path": "/posts",
96
+ "params": {
97
+ "search": { "type": "string", "description": "Text to look for", "in": "query", "required": false },
98
+ "status": {
99
+ "type": "array",
100
+ "items": "string",
101
+ "description": "Statuses to include",
102
+ "in": "query",
103
+ "join": ",",
104
+ "enum": ["draft", "pending", "future", "publish", "private"],
105
+ "required": false
106
+ },
107
+ "per_page": { "type": "integer", "description": "Posts per page, up to 100", "in": "query", "default": 20 },
108
+ "page": { "type": "integer", "description": "The page, from the previous answer", "in": "query", "required": false }
109
+ },
110
+ "result": { "fields": ["id", "date", "modified", "status", "title.rendered", "excerpt.rendered", "link", "author", "categories", "tags"] },
111
+ "paging": { "param": "page", "link": true }
112
+ },
113
+ {
114
+ "name": "wordpress_get_post",
115
+ "description": "Read one post, with its content.",
116
+ "method": "GET",
117
+ "path": "/posts/{id}",
118
+ "params": {
119
+ "id": { "type": "integer", "description": "The post id", "in": "path" },
120
+ "context": {
121
+ "type": "string",
122
+ "description": "view shows the post as readers see it; edit also gives the content as written, to change it, and works only on posts the agents' user may edit",
123
+ "in": "query",
124
+ "enum": ["view", "edit"],
125
+ "default": "view"
126
+ }
127
+ },
128
+ "result": {
129
+ "fields": [
130
+ "id",
131
+ "date",
132
+ "modified",
133
+ "status",
134
+ "title.rendered",
135
+ "title.raw",
136
+ "content.rendered",
137
+ "content.raw",
138
+ "excerpt.rendered",
139
+ "excerpt.raw",
140
+ "link",
141
+ "author",
142
+ "categories",
143
+ "tags"
144
+ ]
145
+ }
146
+ },
147
+ {
148
+ "name": "wordpress_list_categories",
149
+ "description": "List categories, by name.",
150
+ "method": "GET",
151
+ "path": "/categories",
152
+ "params": {
153
+ "search": { "type": "string", "description": "Text to look for", "in": "query", "required": false },
154
+ "per_page": { "type": "integer", "description": "Categories per page, up to 100", "in": "query", "default": 100 }
155
+ },
156
+ "result": { "fields": ["id", "name", "slug", "parent", "count"] }
157
+ },
158
+ {
159
+ "name": "wordpress_list_tags",
160
+ "description": "List tags, by name.",
161
+ "method": "GET",
162
+ "path": "/tags",
163
+ "params": {
164
+ "search": { "type": "string", "description": "Text to look for", "in": "query", "required": false },
165
+ "per_page": { "type": "integer", "description": "Tags per page, up to 100", "in": "query", "default": 100 }
166
+ },
167
+ "result": { "fields": ["id", "name", "slug", "count"] }
168
+ },
169
+ {
170
+ "name": "wordpress_create_draft",
171
+ "description": "Create a post as a draft, or pending review for an editor.",
172
+ "method": "POST",
173
+ "path": "/posts",
174
+ "params": {
175
+ "title": { "type": "string", "description": "The title", "in": "body" },
176
+ "content": { "type": "string", "description": "The content, as HTML or block markup", "in": "body" },
177
+ "excerpt": { "type": "string", "description": "A short summary", "in": "body", "required": false },
178
+ "categories": { "type": "array", "items": "integer", "description": "Category ids", "in": "body", "required": false },
179
+ "tags": { "type": "array", "items": "integer", "description": "Tag ids", "in": "body", "required": false },
180
+ "status": { "type": "string", "description": "Draft, or pending review", "in": "body", "enum": ["draft", "pending"], "default": "draft" }
181
+ },
182
+ "result": { "fields": ["id", "status", "link", "title.raw"] }
183
+ },
184
+ {
185
+ "name": "wordpress_update_post",
186
+ "description": "Edit a post. Only the fields you send change. Edits to a published post show on the site at once.",
187
+ "method": "POST",
188
+ "path": "/posts/{id}",
189
+ "destructive": true,
190
+ "params": {
191
+ "id": { "type": "integer", "description": "The post id", "in": "path" },
192
+ "title": { "type": "string", "description": "The title", "in": "body", "required": false },
193
+ "content": { "type": "string", "description": "The content, as HTML or block markup", "in": "body", "required": false },
194
+ "excerpt": { "type": "string", "description": "A short summary", "in": "body", "required": false },
195
+ "categories": { "type": "array", "items": "integer", "description": "Category ids", "in": "body", "required": false },
196
+ "tags": { "type": "array", "items": "integer", "description": "Tag ids", "in": "body", "required": false },
197
+ "status": { "type": "string", "description": "Set it to draft or pending review (leave out to keep its status)", "in": "body", "enum": ["draft", "pending"], "required": false }
198
+ },
199
+ "result": { "fields": ["id", "status", "link", "title.raw"] }
200
+ }
201
+ ]
202
+ }
203
+ }
@@ -0,0 +1,192 @@
1
+ {
2
+ "id": "zephyr",
3
+ "name": "Zephyr",
4
+ "description": "Let agents read test cases, test cycles and test results in Zephyr (Zephyr Scale for Jira Cloud), and record test results. For running regression cycles and triaging failures into Jira defects.",
5
+ "logo": "/brand/registry/zephyr.svg",
6
+ "identity": "A Zephyr API access token. It acts as the Jira user who created it, with that user's access to Jira projects, so create it as a user made for agents.",
7
+ "accountKey": "host",
8
+ "connectionKind": "guided",
9
+ "setup": [
10
+ {
11
+ "title": "Create a Jira user for agents",
12
+ "body": "Zephyr tokens belong to the Jira user who creates them and reach every project that user can see. Make a user for agents and give it access only to the projects whose tests agents should read or run.",
13
+ "click": [
14
+ "In Atlassian Administration, invite a user named AI agents and give it Jira access.",
15
+ "In each Jira project agents should work in, add AI agents to a role that can browse the project."
16
+ ]
17
+ },
18
+ {
19
+ "title": "Create a Zephyr API access token",
20
+ "body": "Sign in to Jira as the agents' user and create the token. Zephyr shows it only once. You can test it with the command below: it lists your Zephyr projects and changes nothing.",
21
+ "link": {
22
+ "label": "Zephyr: API access tokens",
23
+ "href": "https://support.smartbear.com/zephyr/docs/en/rest-api/api-access-tokens-management.html"
24
+ },
25
+ "click": [
26
+ "In Jira, select your profile picture, then Zephyr API Access Tokens.",
27
+ "Select Create access token and copy it."
28
+ ],
29
+ "copy": [
30
+ "curl -s -H \"Authorization: Bearer $ZEPHYR_TOKEN\" \"https://api.zephyrscale.smartbear.com/v2/projects?maxResults=5\""
31
+ ],
32
+ "shell": "bash"
33
+ }
34
+ ],
35
+ "afterConnect": [],
36
+ "fields": [
37
+ {
38
+ "id": "host",
39
+ "label": "API address",
40
+ "help": "api.zephyrscale.smartbear.com, or for data kept in another region eu.api.zephyrscale.smartbear.com, au.api.zephyrscale.smartbear.com or de.api.zephyrscale.smartbear.com.",
41
+ "placeholder": "api.zephyrscale.smartbear.com",
42
+ "secret": false
43
+ },
44
+ { "id": "token", "label": "API access token", "secret": true }
45
+ ],
46
+ "capabilities": [
47
+ {
48
+ "id": "read",
49
+ "label": "Read tests and results",
50
+ "description": "List a project's test cases, test cycles and test executions, filtered by cycle, test case or Jira version, and the status names behind their status ids.",
51
+ "required": true,
52
+ "note": "Read-only. Reaches every project the token's user can see unless you keep a key to chosen projects.",
53
+ "scopes": [],
54
+ "permissions": [],
55
+ "tools": [
56
+ "zephyr_list_test_cases",
57
+ "zephyr_list_test_cycles",
58
+ "zephyr_list_test_executions",
59
+ "zephyr_list_statuses"
60
+ ]
61
+ },
62
+ {
63
+ "id": "record",
64
+ "label": "Record test results",
65
+ "description": "Record the result of running a test case in a test cycle, such as Pass or Fail, with a comment.",
66
+ "scopes": [],
67
+ "permissions": [],
68
+ "tools": ["zephyr_create_test_execution"]
69
+ }
70
+ ],
71
+ "limits": [
72
+ {
73
+ "id": "projects",
74
+ "label": "Jira projects",
75
+ "help": "Optional: only these Jira projects, by key, such as QA. Leave empty for every project the token's user can see.",
76
+ "kind": "list",
77
+ "required": false,
78
+ "pattern": "^[A-Z][A-Z0-9_]+$"
79
+ }
80
+ ],
81
+ "verify": {
82
+ "method": "GET",
83
+ "path": "/projects?maxResults=50",
84
+ "label": "Zephyr projects",
85
+ "show": "values[].key"
86
+ },
87
+ "discover": {
88
+ "method": "GET",
89
+ "path": "/projects?maxResults=1000",
90
+ "label": "Zephyr projects",
91
+ "show": "values[].key"
92
+ },
93
+ "revoke": "Sign in to Jira as the agents' user, select the profile picture, then Zephyr API Access Tokens, and revoke the token. Agents lose access to Zephyr at once.",
94
+ "http": {
95
+ "baseUrl": "https://{host}/v2",
96
+ "allowedHosts": ["api.zephyrscale.smartbear.com", "*.api.zephyrscale.smartbear.com"],
97
+ "auth": { "type": "bearer", "token": "token" },
98
+ "tools": [
99
+ {
100
+ "name": "zephyr_list_test_cases",
101
+ "description": "List a project's test cases. Pass start_at to read further pages; isLast in the answer says whether there are more.",
102
+ "method": "GET",
103
+ "path": "/testcases",
104
+ "params": {
105
+ "project_key": { "type": "string", "description": "The Jira project key", "in": "query", "name": "projectKey", "limit": "projects" },
106
+ "folder_id": { "type": "integer", "description": "Only test cases in this folder", "in": "query", "name": "folderId", "required": false },
107
+ "max_results": { "type": "integer", "description": "How many per page", "in": "query", "name": "maxResults", "default": 50 },
108
+ "start_at": { "type": "integer", "description": "How many to skip", "in": "query", "name": "startAt", "default": 0 }
109
+ },
110
+ "result": {
111
+ "fields": ["isLast", "values.key", "values.name", "values.objective", "values.status.id", "values.priority.id", "values.labels", "values.folder.id"]
112
+ }
113
+ },
114
+ {
115
+ "name": "zephyr_list_test_cycles",
116
+ "description": "List a project's test cycles, optionally for one Jira version. Pass start_at to read further pages.",
117
+ "method": "GET",
118
+ "path": "/testcycles",
119
+ "params": {
120
+ "project_key": { "type": "string", "description": "The Jira project key", "in": "query", "name": "projectKey", "limit": "projects" },
121
+ "jira_version_id": { "type": "integer", "description": "Only cycles for this Jira version (release) id", "in": "query", "name": "jiraProjectVersionId", "required": false },
122
+ "max_results": { "type": "integer", "description": "How many per page", "in": "query", "name": "maxResults", "default": 50 },
123
+ "start_at": { "type": "integer", "description": "How many to skip", "in": "query", "name": "startAt", "default": 0 }
124
+ },
125
+ "result": {
126
+ "fields": ["isLast", "values.key", "values.name", "values.status.id", "values.plannedStartDate", "values.plannedEndDate", "values.jiraProjectVersion.id"]
127
+ }
128
+ },
129
+ {
130
+ "name": "zephyr_list_test_executions",
131
+ "description": "List test results, filtered by test cycle, test case or Jira version, such as every failure in a regression cycle. Pass start_at to read further pages.",
132
+ "method": "GET",
133
+ "path": "/testexecutions",
134
+ "params": {
135
+ "project_key": { "type": "string", "description": "The Jira project key", "in": "query", "name": "projectKey", "limit": "projects" },
136
+ "test_cycle": { "type": "string", "description": "Only this test cycle, by key such as QA-R12", "in": "query", "name": "testCycle", "required": false },
137
+ "test_case": { "type": "string", "description": "Only this test case, by key such as QA-T40", "in": "query", "name": "testCase", "required": false },
138
+ "only_last": { "type": "boolean", "description": "Only the latest result of each test case", "in": "query", "name": "onlyLastExecutions", "required": false },
139
+ "max_results": { "type": "integer", "description": "How many per page", "in": "query", "name": "maxResults", "default": 50 },
140
+ "start_at": { "type": "integer", "description": "How many to skip", "in": "query", "name": "startAt", "default": 0 }
141
+ },
142
+ "result": {
143
+ "fields": [
144
+ "isLast",
145
+ "values.key",
146
+ "values.testCase.self",
147
+ "values.testCycle.id",
148
+ "values.testExecutionStatus.id",
149
+ "values.actualEndDate",
150
+ "values.executedById",
151
+ "values.comment",
152
+ "values.links.issues"
153
+ ]
154
+ }
155
+ },
156
+ {
157
+ "name": "zephyr_list_statuses",
158
+ "description": "List a project's statuses with their ids and names, such as Pass and Fail for test executions, to read the status ids in other answers.",
159
+ "method": "GET",
160
+ "path": "/statuses",
161
+ "params": {
162
+ "project_key": { "type": "string", "description": "The Jira project key", "in": "query", "name": "projectKey", "limit": "projects" },
163
+ "status_type": {
164
+ "type": "string",
165
+ "enum": ["TEST_CASE", "TEST_PLAN", "TEST_CYCLE", "TEST_EXECUTION"],
166
+ "description": "Which kind of status",
167
+ "in": "query",
168
+ "name": "statusType",
169
+ "default": "TEST_EXECUTION"
170
+ },
171
+ "max_results": { "type": "integer", "description": "How many per page", "in": "query", "name": "maxResults", "default": 100 }
172
+ },
173
+ "result": { "fields": ["isLast", "values.id", "values.name", "values.archived"] }
174
+ },
175
+ {
176
+ "name": "zephyr_create_test_execution",
177
+ "description": "Record a test result: a test case run in a test cycle, with its status name, such as Pass or Fail, and a comment.",
178
+ "method": "POST",
179
+ "path": "/testexecutions",
180
+ "params": {
181
+ "project_key": { "type": "string", "description": "The Jira project key", "in": "body", "name": "projectKey", "limit": "projects" },
182
+ "test_case_key": { "type": "string", "description": "The test case key, such as QA-T40", "in": "body", "name": "testCaseKey" },
183
+ "test_cycle_key": { "type": "string", "description": "The test cycle key, such as QA-R12", "in": "body", "name": "testCycleKey" },
184
+ "status_name": { "type": "string", "description": "The result's status name in Zephyr, such as Pass, Fail or Blocked", "in": "body", "name": "statusName" },
185
+ "comment": { "type": "string", "description": "What happened, such as the failure seen", "in": "body", "required": false },
186
+ "environment_name": { "type": "string", "description": "The environment it ran in, as named in Zephyr", "in": "body", "name": "environmentName", "required": false },
187
+ "actual_end_date": { "type": "string", "description": "When it finished, such as 2026-10-01T13:15:13Z", "in": "body", "name": "actualEndDate", "required": false }
188
+ }
189
+ }
190
+ ]
191
+ }
192
+ }
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import type { Toolset } from "./common.js";
3
- import type { Vendor } from "./types.js";
3
+ import { type Vendor } from "./types.js";
4
4
  declare const settingSchema: z.ZodObject<{
5
5
  id: z.ZodString;
6
6
  label: z.ZodString;
@@ -62,6 +62,13 @@ declare const probeSchema: z.ZodUnion<readonly [z.ZodObject<{
62
62
  ifEmpty: z.ZodOptional<z.ZodString>;
63
63
  }, z.core.$strict>]>;
64
64
  export type Probe = z.infer<typeof probeSchema>;
65
+ /** The connect form fields an address's placeholders name. */
66
+ export declare function addressFields(address: string): string[];
67
+ /** Refuses a filled-in address whose host is not one of `allowed` (when there is a list). */
68
+ export declare function checkHost(url: URL, allowed: string[] | undefined): void;
69
+ /** The address filled with the connection's values; a value that does not fit its place is
70
+ * refused, so it can never move the call to another host or path. */
71
+ export declare function fillAddress(address: string, config: Record<string, string>, label?: (id: string) => string): string;
65
72
  declare const httpAuthSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
66
73
  type: z.ZodLiteral<"header">;
67
74
  header: z.ZodString;
@@ -80,6 +87,11 @@ declare const httpAuthSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
80
87
  clientId: z.ZodString;
81
88
  clientSecret: z.ZodString;
82
89
  scope: z.ZodOptional<z.ZodString>;
90
+ clientAuth: z.ZodOptional<z.ZodEnum<{
91
+ body: "body";
92
+ basic: "basic";
93
+ }>>;
94
+ audience: z.ZodOptional<z.ZodString>;
83
95
  }, z.core.$strict>, z.ZodObject<{
84
96
  type: z.ZodLiteral<"query">;
85
97
  param: z.ZodString;
@@ -87,7 +99,8 @@ declare const httpAuthSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
87
99
  }, z.core.$strict>], "type">;
88
100
  export type HttpAuth = z.infer<typeof httpAuthSchema>;
89
101
  declare const httpSchema: z.ZodObject<{
90
- baseUrl: z.ZodURL;
102
+ baseUrl: z.ZodString;
103
+ allowedHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
91
104
  auth: z.ZodDiscriminatedUnion<[z.ZodObject<{
92
105
  type: z.ZodLiteral<"header">;
93
106
  header: z.ZodString;
@@ -106,12 +119,18 @@ declare const httpSchema: z.ZodObject<{
106
119
  clientId: z.ZodString;
107
120
  clientSecret: z.ZodString;
108
121
  scope: z.ZodOptional<z.ZodString>;
122
+ clientAuth: z.ZodOptional<z.ZodEnum<{
123
+ body: "body";
124
+ basic: "basic";
125
+ }>>;
126
+ audience: z.ZodOptional<z.ZodString>;
109
127
  }, z.core.$strict>, z.ZodObject<{
110
128
  type: z.ZodLiteral<"query">;
111
129
  param: z.ZodString;
112
130
  value: z.ZodString;
113
131
  }, z.core.$strict>], "type">;
114
132
  headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
133
+ fieldHeaders: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
115
134
  tools: z.ZodArray<z.ZodObject<{
116
135
  name: z.ZodString;
117
136
  description: z.ZodString;
@@ -174,7 +193,7 @@ declare const httpSchema: z.ZodObject<{
174
193
  }, z.core.$strict>;
175
194
  export type HttpApp = z.infer<typeof httpSchema>;
176
195
  declare const soapSchema: z.ZodObject<{
177
- endpoint: z.ZodURL;
196
+ endpoint: z.ZodString;
178
197
  version: z.ZodDefault<z.ZodEnum<{
179
198
  1.1: "1.1";
180
199
  1.2: "1.2";
@@ -234,7 +253,8 @@ declare const soapSchema: z.ZodObject<{
234
253
  export type SoapApp = z.infer<typeof soapSchema>;
235
254
  export type SoapTool = SoapApp["tools"][number];
236
255
  declare const odataSchema: z.ZodObject<{
237
- serviceRoot: z.ZodURL;
256
+ serviceRoot: z.ZodString;
257
+ allowedHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
238
258
  version: z.ZodEnum<{
239
259
  2: "2";
240
260
  4: "4";
@@ -257,6 +277,11 @@ declare const odataSchema: z.ZodObject<{
257
277
  clientId: z.ZodString;
258
278
  clientSecret: z.ZodString;
259
279
  scope: z.ZodOptional<z.ZodString>;
280
+ clientAuth: z.ZodOptional<z.ZodEnum<{
281
+ body: "body";
282
+ basic: "basic";
283
+ }>>;
284
+ audience: z.ZodOptional<z.ZodString>;
260
285
  }, z.core.$strict>, z.ZodObject<{
261
286
  type: z.ZodLiteral<"query">;
262
287
  param: z.ZodString;
@@ -765,7 +790,8 @@ export declare const connectorSchema: z.ZodObject<{
765
790
  }, z.core.$strict>]>>;
766
791
  revoke: z.ZodString;
767
792
  http: z.ZodOptional<z.ZodObject<{
768
- baseUrl: z.ZodURL;
793
+ baseUrl: z.ZodString;
794
+ allowedHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
769
795
  auth: z.ZodDiscriminatedUnion<[z.ZodObject<{
770
796
  type: z.ZodLiteral<"header">;
771
797
  header: z.ZodString;
@@ -784,12 +810,18 @@ export declare const connectorSchema: z.ZodObject<{
784
810
  clientId: z.ZodString;
785
811
  clientSecret: z.ZodString;
786
812
  scope: z.ZodOptional<z.ZodString>;
813
+ clientAuth: z.ZodOptional<z.ZodEnum<{
814
+ body: "body";
815
+ basic: "basic";
816
+ }>>;
817
+ audience: z.ZodOptional<z.ZodString>;
787
818
  }, z.core.$strict>, z.ZodObject<{
788
819
  type: z.ZodLiteral<"query">;
789
820
  param: z.ZodString;
790
821
  value: z.ZodString;
791
822
  }, z.core.$strict>], "type">;
792
823
  headers: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
824
+ fieldHeaders: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
793
825
  tools: z.ZodArray<z.ZodObject<{
794
826
  name: z.ZodString;
795
827
  description: z.ZodString;
@@ -851,7 +883,7 @@ export declare const connectorSchema: z.ZodObject<{
851
883
  allowInsecureHttp: z.ZodDefault<z.ZodBoolean>;
852
884
  }, z.core.$strict>>;
853
885
  soap: z.ZodOptional<z.ZodObject<{
854
- endpoint: z.ZodURL;
886
+ endpoint: z.ZodString;
855
887
  version: z.ZodDefault<z.ZodEnum<{
856
888
  1.1: "1.1";
857
889
  1.2: "1.2";
@@ -909,7 +941,8 @@ export declare const connectorSchema: z.ZodObject<{
909
941
  allowInsecureHttp: z.ZodDefault<z.ZodBoolean>;
910
942
  }, z.core.$strict>>;
911
943
  odata: z.ZodOptional<z.ZodObject<{
912
- serviceRoot: z.ZodURL;
944
+ serviceRoot: z.ZodString;
945
+ allowedHosts: z.ZodOptional<z.ZodArray<z.ZodString>>;
913
946
  version: z.ZodEnum<{
914
947
  2: "2";
915
948
  4: "4";
@@ -932,6 +965,11 @@ export declare const connectorSchema: z.ZodObject<{
932
965
  clientId: z.ZodString;
933
966
  clientSecret: z.ZodString;
934
967
  scope: z.ZodOptional<z.ZodString>;
968
+ clientAuth: z.ZodOptional<z.ZodEnum<{
969
+ body: "body";
970
+ basic: "basic";
971
+ }>>;
972
+ audience: z.ZodOptional<z.ZodString>;
935
973
  }, z.core.$strict>, z.ZodObject<{
936
974
  type: z.ZodLiteral<"query">;
937
975
  param: z.ZodString;