@ekanos/cli 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +25 -8
  2. package/dist/agents-api.d.ts +11 -2
  3. package/dist/agents-api.js +39 -3
  4. package/dist/agents-api.js.map +1 -1
  5. package/dist/apps-api.d.ts +3 -2
  6. package/dist/apps-api.js +3 -7
  7. package/dist/apps-api.js.map +1 -1
  8. package/dist/auth/ekanos-api.d.ts +16 -2
  9. package/dist/auth/ekanos-api.js +101 -15
  10. package/dist/auth/ekanos-api.js.map +1 -1
  11. package/dist/auth/host-trust.d.ts +46 -0
  12. package/dist/auth/host-trust.js +79 -0
  13. package/dist/auth/host-trust.js.map +1 -0
  14. package/dist/auth/session.d.ts +10 -1
  15. package/dist/auth/session.js +28 -28
  16. package/dist/auth/session.js.map +1 -1
  17. package/dist/commands/agents-edit.d.ts +6 -2
  18. package/dist/commands/agents-edit.js +57 -26
  19. package/dist/commands/agents-edit.js.map +1 -1
  20. package/dist/commands/agents.d.ts +13 -2
  21. package/dist/commands/agents.js +148 -36
  22. package/dist/commands/agents.js.map +1 -1
  23. package/dist/commands/apps.d.ts +15 -4
  24. package/dist/commands/apps.js +133 -51
  25. package/dist/commands/apps.js.map +1 -1
  26. package/dist/commands/catalog.js +7 -6
  27. package/dist/commands/catalog.js.map +1 -1
  28. package/dist/commands/knowledge.d.ts +56 -0
  29. package/dist/commands/knowledge.js +456 -0
  30. package/dist/commands/knowledge.js.map +1 -0
  31. package/dist/commands/login.d.ts +4 -0
  32. package/dist/commands/login.js +30 -2
  33. package/dist/commands/login.js.map +1 -1
  34. package/dist/commands/logout.d.ts +9 -1
  35. package/dist/commands/logout.js +56 -7
  36. package/dist/commands/logout.js.map +1 -1
  37. package/dist/commands/publish.js +3 -3
  38. package/dist/commands/publish.js.map +1 -1
  39. package/dist/commands/reviewers.d.ts +2 -0
  40. package/dist/commands/reviewers.js +7 -3
  41. package/dist/commands/reviewers.js.map +1 -1
  42. package/dist/commands/routes.d.ts +2 -0
  43. package/dist/commands/routes.js +42 -9
  44. package/dist/commands/routes.js.map +1 -1
  45. package/dist/commands/runs.d.ts +13 -2
  46. package/dist/commands/runs.js +96 -15
  47. package/dist/commands/runs.js.map +1 -1
  48. package/dist/commands/scope-notice.d.ts +21 -0
  49. package/dist/commands/scope-notice.js +35 -0
  50. package/dist/commands/scope-notice.js.map +1 -0
  51. package/dist/commands/skills.d.ts +7 -1
  52. package/dist/commands/skills.js +80 -24
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/sources.d.ts +4 -0
  55. package/dist/commands/sources.js +233 -5
  56. package/dist/commands/sources.js.map +1 -1
  57. package/dist/commands/status.js +5 -4
  58. package/dist/commands/status.js.map +1 -1
  59. package/dist/commands/team-agent-readiness.d.ts +59 -0
  60. package/dist/commands/team-agent-readiness.js +341 -0
  61. package/dist/commands/team-agent-readiness.js.map +1 -0
  62. package/dist/commands/team-agents-agents.d.ts +24 -3
  63. package/dist/commands/team-agents-agents.js +336 -35
  64. package/dist/commands/team-agents-agents.js.map +1 -1
  65. package/dist/commands/team-agents-mcp.js +32 -3
  66. package/dist/commands/team-agents-mcp.js.map +1 -1
  67. package/dist/commands/team-agents-triggers.js +230 -54
  68. package/dist/commands/team-agents-triggers.js.map +1 -1
  69. package/dist/commands/team-agents.d.ts +3 -1
  70. package/dist/commands/team-agents.js +27 -7
  71. package/dist/commands/team-agents.js.map +1 -1
  72. package/dist/commands/teams-channel-install.d.ts +24 -0
  73. package/dist/commands/teams-channel-install.js +94 -0
  74. package/dist/commands/teams-channel-install.js.map +1 -0
  75. package/dist/commands/teams-connect.d.ts +66 -0
  76. package/dist/commands/teams-connect.js +397 -0
  77. package/dist/commands/teams-connect.js.map +1 -0
  78. package/dist/commands/teams-events.d.ts +12 -0
  79. package/dist/commands/teams-events.js +138 -0
  80. package/dist/commands/teams-events.js.map +1 -0
  81. package/dist/commands/teams-onboard.d.ts +16 -5
  82. package/dist/commands/teams-onboard.js +61 -36
  83. package/dist/commands/teams-onboard.js.map +1 -1
  84. package/dist/commands/teams-overview.d.ts +11 -0
  85. package/dist/commands/teams-overview.js +160 -0
  86. package/dist/commands/teams-overview.js.map +1 -0
  87. package/dist/commands/teams-scope.d.ts +10 -0
  88. package/dist/commands/teams-scope.js +109 -0
  89. package/dist/commands/teams-scope.js.map +1 -0
  90. package/dist/commands/teams.d.ts +64 -7
  91. package/dist/commands/teams.js +254 -60
  92. package/dist/commands/teams.js.map +1 -1
  93. package/dist/commands/upgrade.js +12 -2
  94. package/dist/commands/upgrade.js.map +1 -1
  95. package/dist/commands/use.js +2 -2
  96. package/dist/commands/use.js.map +1 -1
  97. package/dist/commands/whoami.js +1 -1
  98. package/dist/commands/whoami.js.map +1 -1
  99. package/dist/connections-api.js +1 -1
  100. package/dist/connections-api.js.map +1 -1
  101. package/dist/delegate.js +11 -4
  102. package/dist/delegate.js.map +1 -1
  103. package/dist/harness-scaffold.js +12 -0
  104. package/dist/harness-scaffold.js.map +1 -1
  105. package/dist/index.d.ts +6 -0
  106. package/dist/index.js +724 -152
  107. package/dist/index.js.map +1 -1
  108. package/dist/knowledge-api.d.ts +175 -0
  109. package/dist/knowledge-api.js +169 -0
  110. package/dist/knowledge-api.js.map +1 -0
  111. package/dist/open-url.d.ts +16 -0
  112. package/dist/open-url.js +73 -0
  113. package/dist/open-url.js.map +1 -0
  114. package/dist/parse-argv.d.ts +2 -0
  115. package/dist/parse-argv.js.map +1 -1
  116. package/dist/publish-api.d.ts +2 -1
  117. package/dist/publish-api.js +4 -3
  118. package/dist/publish-api.js.map +1 -1
  119. package/dist/pull-write.d.ts +27 -0
  120. package/dist/pull-write.js +60 -0
  121. package/dist/pull-write.js.map +1 -0
  122. package/dist/routes-api.d.ts +3 -0
  123. package/dist/routes-api.js +9 -4
  124. package/dist/routes-api.js.map +1 -1
  125. package/dist/runs-api.d.ts +7 -1
  126. package/dist/runs-api.js +21 -6
  127. package/dist/runs-api.js.map +1 -1
  128. package/dist/safe-fs.d.ts +2 -0
  129. package/dist/safe-fs.js +12 -6
  130. package/dist/safe-fs.js.map +1 -1
  131. package/dist/secret-file.d.ts +17 -0
  132. package/dist/secret-file.js +69 -0
  133. package/dist/secret-file.js.map +1 -0
  134. package/dist/skills-api.d.ts +10 -2
  135. package/dist/skills-api.js +37 -2
  136. package/dist/skills-api.js.map +1 -1
  137. package/dist/source-products-api.d.ts +63 -0
  138. package/dist/source-products-api.js +123 -0
  139. package/dist/source-products-api.js.map +1 -0
  140. package/dist/source-target.js +2 -1
  141. package/dist/source-target.js.map +1 -1
  142. package/dist/sources-api.d.ts +2 -1
  143. package/dist/sources-api.js +3 -2
  144. package/dist/sources-api.js.map +1 -1
  145. package/dist/team-connect-api.d.ts +286 -0
  146. package/dist/team-connect-api.js +107 -0
  147. package/dist/team-connect-api.js.map +1 -0
  148. package/dist/teams-api.d.ts +42 -1
  149. package/dist/teams-api.js +98 -20
  150. package/dist/teams-api.js.map +1 -1
  151. package/dist/toolchain-api.d.ts +9 -0
  152. package/dist/toolchain-api.js +17 -2
  153. package/dist/toolchain-api.js.map +1 -1
  154. package/dist/toolchain-resolve.d.ts +3 -0
  155. package/dist/toolchain-resolve.js +15 -1
  156. package/dist/toolchain-resolve.js.map +1 -1
  157. package/dist/toolchain.d.ts +6 -0
  158. package/dist/toolchain.js +19 -0
  159. package/dist/toolchain.js.map +1 -1
  160. package/dist/update-notice.js +2 -1
  161. package/dist/update-notice.js.map +1 -1
  162. package/package.json +2 -2
  163. package/templates/AGENTS.md.tmpl +6 -1
  164. package/templates/claude-skill.md.tmpl +5 -0
  165. package/templates/package.json.tmpl +4 -4
  166. package/templates/skills/build-agent/SKILL.md +115 -16
  167. package/templates/skills/build-agent/references/agent-json.md +26 -8
  168. package/templates/skills/build-agent/references/app-setup.md +2 -1
  169. package/templates/skills/build-agent/references/rollout.md +27 -4
  170. package/templates/skills/build-agent/references/set-up-an-integration.md +74 -15
  171. package/templates/skills/build-agent/references/skills.md +20 -1
  172. package/templates/skills/build-agent/references/triggers.md +84 -20
  173. package/templates/skills/build-integration/references/widget-design.md +3 -3
  174. package/templates/skills/ekanos-platform/SKILL.md +70 -17
  175. package/templates/skills/polish-widgets/references/patterns.md +2 -2
@@ -0,0 +1,286 @@
1
+ import { z } from 'zod';
2
+ import { type TeamsApiResult } from './teams-api.js';
3
+ /**
4
+ * The CLI's client for connecting a product for a team (`ekanos teams
5
+ * connect`), for the team's Source admin.
6
+ *
7
+ * GET /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>[&as=<email>][&connection=<id>]
8
+ * → { plan }
9
+ * POST /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>
10
+ * { as?, fields?, connection? }
11
+ * → { plan, result: "activated" } fields / no-fields
12
+ * → { plan, result: "consent", authorizeUrl, expiresAt } oauth
13
+ *
14
+ * The plan's `mode`, decided by the host, says how the product is
15
+ * connected. The shapes are read here rather than from
16
+ * `@ekanos/integration-schema`, so this CLI works against a host without a
17
+ * schema release.
18
+ */
19
+ export declare const TeamConnectPlanSchema: z.ZodObject<{
20
+ source: z.ZodObject<{
21
+ id: z.ZodString;
22
+ slug: z.ZodString;
23
+ name: z.ZodNullable<z.ZodString>;
24
+ }, z.core.$strip>;
25
+ team: z.ZodObject<{
26
+ slug: z.ZodString;
27
+ name: z.ZodString;
28
+ }, z.core.$strip>;
29
+ product: z.ZodObject<{
30
+ slug: z.ZodString;
31
+ name: z.ZodString;
32
+ kind: z.ZodNullable<z.ZodEnum<{
33
+ experience: "experience";
34
+ integration: "integration";
35
+ }>>;
36
+ }, z.core.$strip>;
37
+ scope: z.ZodEnum<{
38
+ team: "team";
39
+ user: "user";
40
+ }>;
41
+ connectionId: z.ZodOptional<z.ZodString>;
42
+ mode: z.ZodEnum<{
43
+ browser: "browser";
44
+ fields: "fields";
45
+ "no-fields": "no-fields";
46
+ "not-entitled": "not-entitled";
47
+ "not-self-serve": "not-self-serve";
48
+ oauth: "oauth";
49
+ unsupported: "unsupported";
50
+ "works-as-shipped": "works-as-shipped";
51
+ }>;
52
+ reason: z.ZodNullable<z.ZodString>;
53
+ fields: z.ZodArray<z.ZodObject<{
54
+ name: z.ZodString;
55
+ label: z.ZodString;
56
+ description: z.ZodNullable<z.ZodString>;
57
+ sensitive: z.ZodBoolean;
58
+ required: z.ZodBoolean;
59
+ }, z.core.$strip>>;
60
+ teamApp: z.ZodBoolean;
61
+ member: z.ZodNullable<z.ZodObject<{
62
+ userId: z.ZodString;
63
+ email: z.ZodNullable<z.ZodString>;
64
+ isCaller: z.ZodBoolean;
65
+ }, z.core.$strip>>;
66
+ memberProblem: z.ZodNullable<z.ZodString>;
67
+ connected: z.ZodBoolean;
68
+ connectedAt: z.ZodNullable<z.ZodString>;
69
+ connectUrl: z.ZodString;
70
+ productScope: z.ZodOptional<z.ZodObject<{
71
+ state: z.ZodEnum<{
72
+ locked_out: "locked_out";
73
+ scoped: "scoped";
74
+ unscoped: "unscoped";
75
+ }>;
76
+ scopes: z.ZodArray<z.ZodString>;
77
+ hidden: z.ZodBoolean;
78
+ }, z.core.$strip>>;
79
+ }, z.core.$strip>;
80
+ export type TeamConnectPlan = z.infer<typeof TeamConnectPlanSchema>;
81
+ declare const ShowSchema: z.ZodObject<{
82
+ plan: z.ZodObject<{
83
+ source: z.ZodObject<{
84
+ id: z.ZodString;
85
+ slug: z.ZodString;
86
+ name: z.ZodNullable<z.ZodString>;
87
+ }, z.core.$strip>;
88
+ team: z.ZodObject<{
89
+ slug: z.ZodString;
90
+ name: z.ZodString;
91
+ }, z.core.$strip>;
92
+ product: z.ZodObject<{
93
+ slug: z.ZodString;
94
+ name: z.ZodString;
95
+ kind: z.ZodNullable<z.ZodEnum<{
96
+ experience: "experience";
97
+ integration: "integration";
98
+ }>>;
99
+ }, z.core.$strip>;
100
+ scope: z.ZodEnum<{
101
+ team: "team";
102
+ user: "user";
103
+ }>;
104
+ connectionId: z.ZodOptional<z.ZodString>;
105
+ mode: z.ZodEnum<{
106
+ browser: "browser";
107
+ fields: "fields";
108
+ "no-fields": "no-fields";
109
+ "not-entitled": "not-entitled";
110
+ "not-self-serve": "not-self-serve";
111
+ oauth: "oauth";
112
+ unsupported: "unsupported";
113
+ "works-as-shipped": "works-as-shipped";
114
+ }>;
115
+ reason: z.ZodNullable<z.ZodString>;
116
+ fields: z.ZodArray<z.ZodObject<{
117
+ name: z.ZodString;
118
+ label: z.ZodString;
119
+ description: z.ZodNullable<z.ZodString>;
120
+ sensitive: z.ZodBoolean;
121
+ required: z.ZodBoolean;
122
+ }, z.core.$strip>>;
123
+ teamApp: z.ZodBoolean;
124
+ member: z.ZodNullable<z.ZodObject<{
125
+ userId: z.ZodString;
126
+ email: z.ZodNullable<z.ZodString>;
127
+ isCaller: z.ZodBoolean;
128
+ }, z.core.$strip>>;
129
+ memberProblem: z.ZodNullable<z.ZodString>;
130
+ connected: z.ZodBoolean;
131
+ connectedAt: z.ZodNullable<z.ZodString>;
132
+ connectUrl: z.ZodString;
133
+ productScope: z.ZodOptional<z.ZodObject<{
134
+ state: z.ZodEnum<{
135
+ locked_out: "locked_out";
136
+ scoped: "scoped";
137
+ unscoped: "unscoped";
138
+ }>;
139
+ scopes: z.ZodArray<z.ZodString>;
140
+ hidden: z.ZodBoolean;
141
+ }, z.core.$strip>>;
142
+ }, z.core.$strip>;
143
+ }, z.core.$strip>;
144
+ declare const StartSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
145
+ plan: z.ZodObject<{
146
+ source: z.ZodObject<{
147
+ id: z.ZodString;
148
+ slug: z.ZodString;
149
+ name: z.ZodNullable<z.ZodString>;
150
+ }, z.core.$strip>;
151
+ team: z.ZodObject<{
152
+ slug: z.ZodString;
153
+ name: z.ZodString;
154
+ }, z.core.$strip>;
155
+ product: z.ZodObject<{
156
+ slug: z.ZodString;
157
+ name: z.ZodString;
158
+ kind: z.ZodNullable<z.ZodEnum<{
159
+ experience: "experience";
160
+ integration: "integration";
161
+ }>>;
162
+ }, z.core.$strip>;
163
+ scope: z.ZodEnum<{
164
+ team: "team";
165
+ user: "user";
166
+ }>;
167
+ connectionId: z.ZodOptional<z.ZodString>;
168
+ mode: z.ZodEnum<{
169
+ browser: "browser";
170
+ fields: "fields";
171
+ "no-fields": "no-fields";
172
+ "not-entitled": "not-entitled";
173
+ "not-self-serve": "not-self-serve";
174
+ oauth: "oauth";
175
+ unsupported: "unsupported";
176
+ "works-as-shipped": "works-as-shipped";
177
+ }>;
178
+ reason: z.ZodNullable<z.ZodString>;
179
+ fields: z.ZodArray<z.ZodObject<{
180
+ name: z.ZodString;
181
+ label: z.ZodString;
182
+ description: z.ZodNullable<z.ZodString>;
183
+ sensitive: z.ZodBoolean;
184
+ required: z.ZodBoolean;
185
+ }, z.core.$strip>>;
186
+ teamApp: z.ZodBoolean;
187
+ member: z.ZodNullable<z.ZodObject<{
188
+ userId: z.ZodString;
189
+ email: z.ZodNullable<z.ZodString>;
190
+ isCaller: z.ZodBoolean;
191
+ }, z.core.$strip>>;
192
+ memberProblem: z.ZodNullable<z.ZodString>;
193
+ connected: z.ZodBoolean;
194
+ connectedAt: z.ZodNullable<z.ZodString>;
195
+ connectUrl: z.ZodString;
196
+ productScope: z.ZodOptional<z.ZodObject<{
197
+ state: z.ZodEnum<{
198
+ locked_out: "locked_out";
199
+ scoped: "scoped";
200
+ unscoped: "unscoped";
201
+ }>;
202
+ scopes: z.ZodArray<z.ZodString>;
203
+ hidden: z.ZodBoolean;
204
+ }, z.core.$strip>>;
205
+ }, z.core.$strip>;
206
+ result: z.ZodLiteral<"activated">;
207
+ }, z.core.$strip>, z.ZodObject<{
208
+ plan: z.ZodObject<{
209
+ source: z.ZodObject<{
210
+ id: z.ZodString;
211
+ slug: z.ZodString;
212
+ name: z.ZodNullable<z.ZodString>;
213
+ }, z.core.$strip>;
214
+ team: z.ZodObject<{
215
+ slug: z.ZodString;
216
+ name: z.ZodString;
217
+ }, z.core.$strip>;
218
+ product: z.ZodObject<{
219
+ slug: z.ZodString;
220
+ name: z.ZodString;
221
+ kind: z.ZodNullable<z.ZodEnum<{
222
+ experience: "experience";
223
+ integration: "integration";
224
+ }>>;
225
+ }, z.core.$strip>;
226
+ scope: z.ZodEnum<{
227
+ team: "team";
228
+ user: "user";
229
+ }>;
230
+ connectionId: z.ZodOptional<z.ZodString>;
231
+ mode: z.ZodEnum<{
232
+ browser: "browser";
233
+ fields: "fields";
234
+ "no-fields": "no-fields";
235
+ "not-entitled": "not-entitled";
236
+ "not-self-serve": "not-self-serve";
237
+ oauth: "oauth";
238
+ unsupported: "unsupported";
239
+ "works-as-shipped": "works-as-shipped";
240
+ }>;
241
+ reason: z.ZodNullable<z.ZodString>;
242
+ fields: z.ZodArray<z.ZodObject<{
243
+ name: z.ZodString;
244
+ label: z.ZodString;
245
+ description: z.ZodNullable<z.ZodString>;
246
+ sensitive: z.ZodBoolean;
247
+ required: z.ZodBoolean;
248
+ }, z.core.$strip>>;
249
+ teamApp: z.ZodBoolean;
250
+ member: z.ZodNullable<z.ZodObject<{
251
+ userId: z.ZodString;
252
+ email: z.ZodNullable<z.ZodString>;
253
+ isCaller: z.ZodBoolean;
254
+ }, z.core.$strip>>;
255
+ memberProblem: z.ZodNullable<z.ZodString>;
256
+ connected: z.ZodBoolean;
257
+ connectedAt: z.ZodNullable<z.ZodString>;
258
+ connectUrl: z.ZodString;
259
+ productScope: z.ZodOptional<z.ZodObject<{
260
+ state: z.ZodEnum<{
261
+ locked_out: "locked_out";
262
+ scoped: "scoped";
263
+ unscoped: "unscoped";
264
+ }>;
265
+ scopes: z.ZodArray<z.ZodString>;
266
+ hidden: z.ZodBoolean;
267
+ }, z.core.$strip>>;
268
+ }, z.core.$strip>;
269
+ result: z.ZodLiteral<"consent">;
270
+ authorizeUrl: z.ZodString;
271
+ expiresAt: z.ZodString;
272
+ }, z.core.$strip>], "result">;
273
+ export type TeamConnectStart = z.infer<typeof StartSchema>;
274
+ interface Target {
275
+ source: string;
276
+ team: string;
277
+ product: string;
278
+ /** A named OAuth connection (`agent`); the main one when absent. */
279
+ connection?: string;
280
+ }
281
+ export declare function showTeamConnect(host: string, accessToken: string, target: Target, asEmail?: string): Promise<TeamsApiResult<z.infer<typeof ShowSchema>>>;
282
+ export declare function startTeamConnect(host: string, accessToken: string, target: Target, body: {
283
+ as?: string;
284
+ fields?: Record<string, string>;
285
+ }): Promise<TeamsApiResult<TeamConnectStart>>;
286
+ export {};
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { call } from './teams-api.js';
3
+ /**
4
+ * The CLI's client for connecting a product for a team (`ekanos teams
5
+ * connect`), for the team's Source admin.
6
+ *
7
+ * GET /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>[&as=<email>][&connection=<id>]
8
+ * → { plan }
9
+ * POST /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>
10
+ * { as?, fields?, connection? }
11
+ * → { plan, result: "activated" } fields / no-fields
12
+ * → { plan, result: "consent", authorizeUrl, expiresAt } oauth
13
+ *
14
+ * The plan's `mode`, decided by the host, says how the product is
15
+ * connected. The shapes are read here rather than from
16
+ * `@ekanos/integration-schema`, so this CLI works against a host without a
17
+ * schema release.
18
+ */
19
+ export const TeamConnectPlanSchema = z.object({
20
+ source: z.object({
21
+ id: z.string(),
22
+ slug: z.string(),
23
+ name: z.string().nullable(),
24
+ }),
25
+ team: z.object({ slug: z.string(), name: z.string() }),
26
+ product: z.object({
27
+ slug: z.string(),
28
+ name: z.string(),
29
+ kind: z.enum(['experience', 'integration']).nullable(),
30
+ }),
31
+ scope: z.enum(['team', 'user']),
32
+ /** The OAuth connection the plan is for; absent from an older host (`default`). */
33
+ connectionId: z.string().optional(),
34
+ mode: z.enum([
35
+ 'unsupported',
36
+ 'not-entitled',
37
+ 'not-self-serve',
38
+ 'works-as-shipped',
39
+ 'oauth',
40
+ 'fields',
41
+ 'no-fields',
42
+ 'browser',
43
+ ]),
44
+ reason: z.string().nullable(),
45
+ fields: z.array(z.object({
46
+ name: z.string(),
47
+ label: z.string(),
48
+ description: z.string().nullable(),
49
+ sensitive: z.boolean(),
50
+ required: z.boolean(),
51
+ })),
52
+ teamApp: z.boolean(),
53
+ member: z
54
+ .object({
55
+ userId: z.string(),
56
+ email: z.string().nullable(),
57
+ isCaller: z.boolean(),
58
+ })
59
+ .nullable(),
60
+ memberProblem: z.string().nullable(),
61
+ connected: z.boolean(),
62
+ connectedAt: z.string().nullable(),
63
+ connectUrl: z.string(),
64
+ /**
65
+ * Whether the team's product scopes hide the product from it in the app.
66
+ * Absent from an older host.
67
+ */
68
+ productScope: z
69
+ .object({
70
+ state: z.enum(['unscoped', 'scoped', 'locked_out']),
71
+ scopes: z.array(z.string()),
72
+ hidden: z.boolean(),
73
+ })
74
+ .optional(),
75
+ });
76
+ const ShowSchema = z.object({ plan: TeamConnectPlanSchema });
77
+ const StartSchema = z.discriminatedUnion('result', [
78
+ z.object({ plan: TeamConnectPlanSchema, result: z.literal('activated') }),
79
+ z.object({
80
+ plan: TeamConnectPlanSchema,
81
+ result: z.literal('consent'),
82
+ authorizeUrl: z.string(),
83
+ expiresAt: z.string(),
84
+ }),
85
+ ]);
86
+ function connectPath(target) {
87
+ return `/api/partner/teams/${encodeURIComponent(target.team)}/integrations/${encodeURIComponent(target.product)}/connect`;
88
+ }
89
+ export function showTeamConnect(host, accessToken, target, asEmail) {
90
+ // `call` puts `source` in the query; the rest ride in the path's own query.
91
+ const query = new URLSearchParams(Object.assign(Object.assign({}, (asEmail ? { as: asEmail } : {})), (target.connection ? { connection: target.connection } : {}))).toString();
92
+ const path = query ? `${connectPath(target)}?${query}` : connectPath(target);
93
+ return call(host, accessToken, ShowSchema, {
94
+ method: 'GET',
95
+ path,
96
+ source: target.source,
97
+ });
98
+ }
99
+ export function startTeamConnect(host, accessToken, target, body) {
100
+ return call(host, accessToken, StartSchema, {
101
+ method: 'POST',
102
+ path: connectPath(target),
103
+ source: target.source,
104
+ body: target.connection ? Object.assign(Object.assign({}, body), { connection: target.connection }) : body,
105
+ });
106
+ }
107
+ //# sourceMappingURL=team-connect-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-connect-api.js","sourceRoot":"","sources":["../src/team-connect-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAuB,IAAI,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC;IACF,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,mFAAmF;IACnF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACX,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,kBAAkB;QAClB,OAAO;QACP,QAAQ;QACR,WAAW;QACX,SAAS;KACV,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;KACtB,CAAC,CACH;IACD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;KACtB,CAAC;SACD,QAAQ,EAAE;IACb,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB;;;OAGG;IACH,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAGH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACjD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;IACzE,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC;CACH,CAAC,CAAC;AAWH,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;AAC5H,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,WAAmB,EACnB,MAAc,EACd,OAAgB;IAEhB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,IAAI,eAAe,iCAC5B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAChC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC/D,CAAC,QAAQ,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,WAAmB,EACnB,MAAc,EACd,IAAsD;IAEtD,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;QAC1C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,iCAAM,IAAI,KAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAG,CAAC,CAAC,IAAI;KAC5E,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { z } from 'zod';\n\nimport { type TeamsApiResult, call } from './teams-api';\n\n/**\n * The CLI's client for connecting a product for a team (`ekanos teams\n * connect`), for the team's Source admin.\n *\n * GET /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>[&as=<email>][&connection=<id>]\n * → { plan }\n * POST /api/partner/teams/<team>/integrations/<product>/connect?source=<slug>\n * { as?, fields?, connection? }\n * → { plan, result: \"activated\" } fields / no-fields\n * → { plan, result: \"consent\", authorizeUrl, expiresAt } oauth\n *\n * The plan's `mode`, decided by the host, says how the product is\n * connected. The shapes are read here rather than from\n * `@ekanos/integration-schema`, so this CLI works against a host without a\n * schema release.\n */\n\nexport const TeamConnectPlanSchema = z.object({\n source: z.object({\n id: z.string(),\n slug: z.string(),\n name: z.string().nullable(),\n }),\n team: z.object({ slug: z.string(), name: z.string() }),\n product: z.object({\n slug: z.string(),\n name: z.string(),\n kind: z.enum(['experience', 'integration']).nullable(),\n }),\n scope: z.enum(['team', 'user']),\n /** The OAuth connection the plan is for; absent from an older host (`default`). */\n connectionId: z.string().optional(),\n mode: z.enum([\n 'unsupported',\n 'not-entitled',\n 'not-self-serve',\n 'works-as-shipped',\n 'oauth',\n 'fields',\n 'no-fields',\n 'browser',\n ]),\n reason: z.string().nullable(),\n fields: z.array(\n z.object({\n name: z.string(),\n label: z.string(),\n description: z.string().nullable(),\n sensitive: z.boolean(),\n required: z.boolean(),\n }),\n ),\n teamApp: z.boolean(),\n member: z\n .object({\n userId: z.string(),\n email: z.string().nullable(),\n isCaller: z.boolean(),\n })\n .nullable(),\n memberProblem: z.string().nullable(),\n connected: z.boolean(),\n connectedAt: z.string().nullable(),\n connectUrl: z.string(),\n /**\n * Whether the team's product scopes hide the product from it in the app.\n * Absent from an older host.\n */\n productScope: z\n .object({\n state: z.enum(['unscoped', 'scoped', 'locked_out']),\n scopes: z.array(z.string()),\n hidden: z.boolean(),\n })\n .optional(),\n});\nexport type TeamConnectPlan = z.infer<typeof TeamConnectPlanSchema>;\n\nconst ShowSchema = z.object({ plan: TeamConnectPlanSchema });\nconst StartSchema = z.discriminatedUnion('result', [\n z.object({ plan: TeamConnectPlanSchema, result: z.literal('activated') }),\n z.object({\n plan: TeamConnectPlanSchema,\n result: z.literal('consent'),\n authorizeUrl: z.string(),\n expiresAt: z.string(),\n }),\n]);\nexport type TeamConnectStart = z.infer<typeof StartSchema>;\n\ninterface Target {\n source: string;\n team: string;\n product: string;\n /** A named OAuth connection (`agent`); the main one when absent. */\n connection?: string;\n}\n\nfunction connectPath(target: Target): string {\n return `/api/partner/teams/${encodeURIComponent(target.team)}/integrations/${encodeURIComponent(target.product)}/connect`;\n}\n\nexport function showTeamConnect(\n host: string,\n accessToken: string,\n target: Target,\n asEmail?: string,\n): Promise<TeamsApiResult<z.infer<typeof ShowSchema>>> {\n // `call` puts `source` in the query; the rest ride in the path's own query.\n const query = new URLSearchParams({\n ...(asEmail ? { as: asEmail } : {}),\n ...(target.connection ? { connection: target.connection } : {}),\n }).toString();\n const path = query ? `${connectPath(target)}?${query}` : connectPath(target);\n return call(host, accessToken, ShowSchema, {\n method: 'GET',\n path,\n source: target.source,\n });\n}\n\nexport function startTeamConnect(\n host: string,\n accessToken: string,\n target: Target,\n body: { as?: string; fields?: Record<string, string> },\n): Promise<TeamsApiResult<TeamConnectStart>> {\n return call(host, accessToken, StartSchema, {\n method: 'POST',\n path: connectPath(target),\n source: target.source,\n body: target.connection ? { ...body, connection: target.connection } : body,\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type TeamAppSetResult, type TeamCreateRequest, type TeamCreateResult, type TeamMemberChangeResult, type TeamMemberInviteResult, type TeamMemberList, type TeamRoles, type TeamIntegrationStatus, type TeamList, type TeamWebhookMintResult } from '@ekanos/integration-schema';
1
+ import { type ProductScopeList, type ProductScopeProductChange, type TeamScopes, type TeamScopesSetResult, type TeamAppSetResult, type TeamCreateRequest, type TeamCreateResult, type TeamDisconnectResult, type TeamMemberChangeResult, type TeamMemberInviteResult, type TeamMemberList, type TeamRenameResult, type TeamRoles, type TeamIntegrationStatus, type TeamIntegrationEventList, type TeamList, type TeamWebhookMintResult } from '@ekanos/integration-schema';
2
2
  import type { z } from 'zod';
3
3
  /**
4
4
  * The CLI's client for a Source's teams and their integration setup — the
@@ -9,12 +9,21 @@ import type { z } from 'zod';
9
9
  * PUT …/integrations/<product>/app?source=<slug> { connectionId?, fields }
10
10
  * → TeamAppSetResult
11
11
  * POST …/integrations/<product>/webhooks/<id>?source=<slug> → TeamWebhookMintResult
12
+ * DELETE /api/partner/teams/<team>/integrations/<product>?source=<slug> → TeamDisconnectResult
12
13
  * POST /api/partner/teams?source=<slug> { name, slug?, ownerEmail? } → TeamCreateResult
14
+ * PATCH /api/partner/teams/<team>?source=<slug> { name } → TeamRenameResult
13
15
  * GET /api/partner/teams/<team>/members?source=<slug> → TeamMemberList
14
16
  * POST …/<team>/members?source=<slug> { email, role } → TeamMemberInviteResult
15
17
  * PATCH …/<team>/members/<email>?source=<slug> { role } → TeamMemberChangeResult
16
18
  * DELETE …/<team>/members/<email>?source=<slug> → TeamMemberChangeResult
17
19
  * GET /api/partner/teams/<team>/roles?source=<slug> → TeamRoles
20
+ * GET /api/partner/teams/<team>/events?source=<slug>[&product=<slug>]
21
+ * [&since=<iso>][&limit=<n>] → TeamIntegrationEventList
22
+ * GET /api/partner/scopes?source=<slug> → ProductScopeList
23
+ * PUT | DELETE /api/partner/scopes/<scope>/products/<product>?source=<slug>
24
+ * → ProductScopeProductChange
25
+ * GET /api/partner/teams/<team>/scopes?source=<slug> → TeamScopes
26
+ * PUT /api/partner/teams/<team>/scopes?source=<slug> { scopes } → TeamScopesSetResult
18
27
  *
19
28
  * → 401 / 3xx refresh once and retry
20
29
  * → 403 { code: "SOURCE_ADMIN_REQUIRED" | "MFA_REQUIRED" | "FORBIDDEN" }
@@ -44,13 +53,23 @@ export declare function setTeamApp(host: string, accessToken: string, target: {
44
53
  }, body: {
45
54
  connectionId?: string;
46
55
  fields: Record<string, string>;
56
+ clear?: string[];
47
57
  }): Promise<TeamsApiResult<TeamAppSetResult>>;
48
58
  export declare function mintTeamWebhook(host: string, accessToken: string, target: {
49
59
  source: string;
50
60
  team: string;
51
61
  product: string;
52
62
  }, webhookId: string): Promise<TeamsApiResult<TeamWebhookMintResult>>;
63
+ export declare function disconnectTeamIntegration(host: string, accessToken: string, target: {
64
+ source: string;
65
+ team: string;
66
+ product: string;
67
+ }): Promise<TeamsApiResult<TeamDisconnectResult>>;
53
68
  export declare function createTeam(host: string, accessToken: string, source: string, body: TeamCreateRequest): Promise<TeamsApiResult<TeamCreateResult>>;
69
+ export declare function renameTeam(host: string, accessToken: string, target: {
70
+ source: string;
71
+ team: string;
72
+ }, name: string): Promise<TeamsApiResult<TeamRenameResult>>;
54
73
  export declare function listTeamMembers(host: string, accessToken: string, target: {
55
74
  source: string;
56
75
  team: string;
@@ -72,10 +91,32 @@ export declare function removeTeamMember(host: string, accessToken: string, targ
72
91
  team: string;
73
92
  email: string;
74
93
  }): Promise<TeamsApiResult<TeamMemberChangeResult>>;
94
+ export declare function listProductScopes(host: string, accessToken: string, source: string): Promise<TeamsApiResult<ProductScopeList>>;
95
+ export declare function setScopeProduct(host: string, accessToken: string, target: {
96
+ source: string;
97
+ scope: string;
98
+ product: string;
99
+ }, included: boolean): Promise<TeamsApiResult<ProductScopeProductChange>>;
100
+ export declare function showTeamScopes(host: string, accessToken: string, target: {
101
+ source: string;
102
+ team: string;
103
+ }): Promise<TeamsApiResult<TeamScopes>>;
104
+ export declare function setTeamScopes(host: string, accessToken: string, target: {
105
+ source: string;
106
+ team: string;
107
+ }, scopes: string[]): Promise<TeamsApiResult<TeamScopesSetResult>>;
75
108
  export declare function listTeamRoles(host: string, accessToken: string, target: {
76
109
  source: string;
77
110
  team: string;
78
111
  }): Promise<TeamsApiResult<TeamRoles>>;
112
+ export declare function listTeamEvents(host: string, accessToken: string, target: {
113
+ source: string;
114
+ team: string;
115
+ }, filters: {
116
+ product?: string;
117
+ since?: string;
118
+ limit?: number;
119
+ }): Promise<TeamsApiResult<TeamIntegrationEventList>>;
79
120
  /** One partner teams call; shared by the team-agent clients (`team-agents-api.ts`). */
80
121
  export declare function call<T>(host: string, accessToken: string, schema: z.ZodType<T>, init: {
81
122
  method: 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE';