@anchrd/colab-sdk 0.1.26 → 0.1.27

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.
@@ -87,6 +87,87 @@ export declare const mcpCatalog: readonly [{
87
87
  readonly dynamicRegistration: true;
88
88
  readonly color: "#111111";
89
89
  readonly initials: "N";
90
+ }, {
91
+ readonly id: "linear";
92
+ readonly name: "Linear";
93
+ readonly url: "https://mcp.linear.app/mcp";
94
+ readonly auth: "oauth";
95
+ readonly signIn: "Linear";
96
+ readonly dynamicRegistration: true;
97
+ readonly color: "#5e6ad2";
98
+ readonly initials: "Li";
99
+ }, {
100
+ readonly id: "atlassian";
101
+ readonly name: "Atlassian";
102
+ readonly url: "https://mcp.atlassian.com/v1/mcp";
103
+ readonly auth: "oauth";
104
+ readonly signIn: "Atlassian";
105
+ readonly dynamicRegistration: true;
106
+ readonly color: "#0c66e4";
107
+ readonly initials: "At";
108
+ }, {
109
+ readonly id: "asana";
110
+ readonly name: "Asana";
111
+ readonly url: "https://mcp.asana.com/v2/mcp";
112
+ readonly auth: "oauth";
113
+ readonly signIn: "Asana";
114
+ readonly dynamicRegistration: true;
115
+ readonly color: "#e8384f";
116
+ readonly initials: "As";
117
+ }, {
118
+ readonly id: "sentry";
119
+ readonly name: "Sentry";
120
+ readonly url: "https://mcp.sentry.dev/mcp";
121
+ readonly auth: "oauth";
122
+ readonly signIn: "Sentry";
123
+ readonly dynamicRegistration: true;
124
+ readonly color: "#362d59";
125
+ readonly initials: "Se";
126
+ }, {
127
+ readonly id: "zapier";
128
+ readonly name: "Zapier";
129
+ readonly url: "https://mcp.zapier.com/api/mcp/mcp";
130
+ readonly auth: "oauth";
131
+ readonly signIn: "Zapier";
132
+ readonly dynamicRegistration: true;
133
+ readonly color: "#ff4a00";
134
+ readonly initials: "Z";
135
+ }, {
136
+ readonly id: "canva";
137
+ readonly name: "Canva";
138
+ readonly url: "https://mcp.canva.com/mcp";
139
+ readonly auth: "oauth";
140
+ readonly signIn: "Canva";
141
+ readonly dynamicRegistration: true;
142
+ readonly color: "#7d2ae8";
143
+ readonly initials: "Ca";
144
+ }, {
145
+ readonly id: "miro";
146
+ readonly name: "Miro";
147
+ readonly url: "https://mcp.miro.com/";
148
+ readonly auth: "oauth";
149
+ readonly signIn: "Miro";
150
+ readonly dynamicRegistration: true;
151
+ readonly color: "#b8860b";
152
+ readonly initials: "Mi";
153
+ }, {
154
+ readonly id: "clickup";
155
+ readonly name: "ClickUp";
156
+ readonly url: "https://mcp.clickup.com/mcp";
157
+ readonly auth: "oauth";
158
+ readonly signIn: "ClickUp";
159
+ readonly dynamicRegistration: true;
160
+ readonly color: "#7b68ee";
161
+ readonly initials: "Cu";
162
+ }, {
163
+ readonly id: "webflow";
164
+ readonly name: "Webflow";
165
+ readonly url: "https://mcp.webflow.com/mcp";
166
+ readonly auth: "oauth";
167
+ readonly signIn: "Webflow";
168
+ readonly dynamicRegistration: true;
169
+ readonly color: "#146ef5";
170
+ readonly initials: "W";
90
171
  }];
91
172
  export type McpCatalogEntry = (typeof mcpCatalog)[number];
92
173
  export declare const McpCatalogId: z.ZodEnum<{
package/dist/mcps/mcps.js CHANGED
@@ -26,9 +26,11 @@ export const McpState = z.enum(["running", "expired", "unreachable", "pending"])
26
26
  //
27
27
  // `dynamicRegistration`: the provider lets Colab register itself as an OAuth client at the sign-in
28
28
  // (RFC 7591), so "Verbinden" works without an app registered at the provider. Checked against the
29
- // providers on 2026-10-29 (#855): only Notion offers it. Google answers no OAuth metadata at all, and
30
- // Slack, Microsoft and HubSpot name no `registration_endpoint`; they need an app an admin sets up,
31
- // with client id and secret, which Colab cannot hold yet. Such an entry is shown, not started.
29
+ // providers on 2026-10-29 (#855, #875): Notion, Linear, Atlassian, Asana, Sentry, Zapier, Canva, Miro,
30
+ // ClickUp and Webflow offer it (each answers 401 at its address and names a `registration_endpoint`).
31
+ // Google answers no OAuth metadata at all, and Slack, Microsoft and HubSpot name none; they need an
32
+ // app an admin sets up, with client id and secret, which Colab cannot hold yet. Such an entry is
33
+ // shown, not started.
32
34
  export const mcpCatalog = [
33
35
  {
34
36
  id: "gmail",
@@ -110,6 +112,96 @@ export const mcpCatalog = [
110
112
  color: "#111111",
111
113
  initials: "N",
112
114
  },
115
+ {
116
+ id: "linear",
117
+ name: "Linear",
118
+ url: "https://mcp.linear.app/mcp",
119
+ auth: "oauth",
120
+ signIn: "Linear",
121
+ dynamicRegistration: true,
122
+ color: "#5e6ad2",
123
+ initials: "Li",
124
+ },
125
+ {
126
+ id: "atlassian",
127
+ name: "Atlassian",
128
+ url: "https://mcp.atlassian.com/v1/mcp",
129
+ auth: "oauth",
130
+ signIn: "Atlassian",
131
+ dynamicRegistration: true,
132
+ color: "#0c66e4",
133
+ initials: "At",
134
+ },
135
+ {
136
+ id: "asana",
137
+ name: "Asana",
138
+ url: "https://mcp.asana.com/v2/mcp",
139
+ auth: "oauth",
140
+ signIn: "Asana",
141
+ dynamicRegistration: true,
142
+ color: "#e8384f",
143
+ initials: "As",
144
+ },
145
+ {
146
+ id: "sentry",
147
+ name: "Sentry",
148
+ url: "https://mcp.sentry.dev/mcp",
149
+ auth: "oauth",
150
+ signIn: "Sentry",
151
+ dynamicRegistration: true,
152
+ color: "#362d59",
153
+ initials: "Se",
154
+ },
155
+ {
156
+ id: "zapier",
157
+ name: "Zapier",
158
+ url: "https://mcp.zapier.com/api/mcp/mcp",
159
+ auth: "oauth",
160
+ signIn: "Zapier",
161
+ dynamicRegistration: true,
162
+ color: "#ff4a00",
163
+ initials: "Z",
164
+ },
165
+ {
166
+ id: "canva",
167
+ name: "Canva",
168
+ url: "https://mcp.canva.com/mcp",
169
+ auth: "oauth",
170
+ signIn: "Canva",
171
+ dynamicRegistration: true,
172
+ color: "#7d2ae8",
173
+ initials: "Ca",
174
+ },
175
+ {
176
+ id: "miro",
177
+ name: "Miro",
178
+ url: "https://mcp.miro.com/",
179
+ auth: "oauth",
180
+ signIn: "Miro",
181
+ dynamicRegistration: true,
182
+ color: "#b8860b",
183
+ initials: "Mi",
184
+ },
185
+ {
186
+ id: "clickup",
187
+ name: "ClickUp",
188
+ url: "https://mcp.clickup.com/mcp",
189
+ auth: "oauth",
190
+ signIn: "ClickUp",
191
+ dynamicRegistration: true,
192
+ color: "#7b68ee",
193
+ initials: "Cu",
194
+ },
195
+ {
196
+ id: "webflow",
197
+ name: "Webflow",
198
+ url: "https://mcp.webflow.com/mcp",
199
+ auth: "oauth",
200
+ signIn: "Webflow",
201
+ dynamicRegistration: true,
202
+ color: "#146ef5",
203
+ initials: "W",
204
+ },
113
205
  ];
114
206
  export const McpCatalogId = z.enum(mcpCatalog.map((entry) => entry.id));
115
207
  const McpName = z.string().trim().min(1).max(64);
@@ -147,7 +239,7 @@ export const McpGetInput = z.strictObject({ mcpId: McpId });
147
239
  // the person signs in at (`authorizeUrl`).
148
240
  export const McpCreateInput = z
149
241
  .strictObject({
150
- catalogId: McpCatalogId.optional().describe("A prepared MCP of the catalog (gmail, calendar, drive, slack, teams, outlook, hubspot, notion). Only notion connects today; the others need an app registered at their provider and answer unavailable. Leave name, url and auth out then."),
242
+ catalogId: McpCatalogId.optional().describe("A prepared MCP of the catalog (gmail, calendar, drive, slack, teams, outlook, hubspot, notion, linear, atlassian, asana, sentry, zapier, canva, miro, clickup, webflow). Notion, linear, atlassian, asana, sentry, zapier, canva, miro, clickup and webflow connect without an app; the others need an app registered at their provider and answer unavailable. Leave name, url and auth out then."),
151
243
  name: McpName.optional(),
152
244
  url: McpUrl.optional(),
153
245
  auth: McpAuth.optional(),
@@ -61,7 +61,7 @@ export declare const SkillPoint: z.ZodObject<{
61
61
  reason: z.ZodNullable<z.ZodString>;
62
62
  }, z.core.$strip>;
63
63
  export type SkillPoint = z.infer<typeof SkillPoint>;
64
- export declare const skillCaseStatuses: readonly ["passed", "failed", "missing"];
64
+ export declare const skillCaseStatuses: readonly ["passed", "failed", "missing", "running"];
65
65
  export declare const SkillTokens: z.ZodObject<{
66
66
  input: z.ZodInt;
67
67
  output: z.ZodInt;
@@ -71,6 +71,7 @@ export declare const SkillCaseResult: z.ZodObject<{
71
71
  name: z.ZodString;
72
72
  status: z.ZodEnum<{
73
73
  failed: "failed";
74
+ running: "running";
74
75
  passed: "passed";
75
76
  missing: "missing";
76
77
  }>;
@@ -99,6 +100,8 @@ export declare const SkillCaseResult: z.ZodObject<{
99
100
  input: z.ZodInt;
100
101
  output: z.ZodInt;
101
102
  }, z.core.$strip>>;
103
+ durationMs: z.ZodOptional<z.ZodInt>;
104
+ problem: z.ZodOptional<z.ZodNullable<z.ZodString>>;
102
105
  runId: z.ZodNullable<z.ZodTemplateLiteral<`run_${string}`>>;
103
106
  }, z.core.$strip>;
104
107
  export type SkillCaseResult = z.infer<typeof SkillCaseResult>;
@@ -113,6 +116,8 @@ export declare const SkillTriggerHit: z.ZodObject<{
113
116
  }, z.core.$strip>;
114
117
  export type SkillTriggerHit = z.infer<typeof SkillTriggerHit>;
115
118
  export declare const SkillTestReport: z.ZodObject<{
119
+ testId: z.ZodOptional<z.ZodString>;
120
+ running: z.ZodOptional<z.ZodBoolean>;
116
121
  version: z.ZodInt;
117
122
  at: z.ZodISODateTime;
118
123
  by: z.ZodObject<{
@@ -150,11 +155,15 @@ export declare const SkillTestReport: z.ZodObject<{
150
155
  input: z.ZodInt;
151
156
  output: z.ZodInt;
152
157
  }, z.core.$strip>>;
158
+ running: z.ZodOptional<z.ZodBoolean>;
159
+ durationMs: z.ZodOptional<z.ZodInt>;
160
+ problem: z.ZodOptional<z.ZodNullable<z.ZodString>>;
153
161
  }, z.core.$strip>>;
154
162
  cases: z.ZodArray<z.ZodObject<{
155
163
  name: z.ZodString;
156
164
  status: z.ZodEnum<{
157
165
  failed: "failed";
166
+ running: "running";
158
167
  passed: "passed";
159
168
  missing: "missing";
160
169
  }>;
@@ -183,6 +192,8 @@ export declare const SkillTestReport: z.ZodObject<{
183
192
  input: z.ZodInt;
184
193
  output: z.ZodInt;
185
194
  }, z.core.$strip>>;
195
+ durationMs: z.ZodOptional<z.ZodInt>;
196
+ problem: z.ZodOptional<z.ZodNullable<z.ZodString>>;
186
197
  runId: z.ZodNullable<z.ZodTemplateLiteral<`run_${string}`>>;
187
198
  }, z.core.$strip>>;
188
199
  problem: z.ZodNullable<z.ZodString>;
@@ -216,6 +227,8 @@ export declare const SkillDetail: z.ZodObject<{
216
227
  content: z.ZodString;
217
228
  }, z.core.$strip>>>;
218
229
  test: z.ZodNullable<z.ZodObject<{
230
+ testId: z.ZodOptional<z.ZodString>;
231
+ running: z.ZodOptional<z.ZodBoolean>;
219
232
  version: z.ZodInt;
220
233
  at: z.ZodISODateTime;
221
234
  by: z.ZodObject<{
@@ -253,11 +266,15 @@ export declare const SkillDetail: z.ZodObject<{
253
266
  input: z.ZodInt;
254
267
  output: z.ZodInt;
255
268
  }, z.core.$strip>>;
269
+ running: z.ZodOptional<z.ZodBoolean>;
270
+ durationMs: z.ZodOptional<z.ZodInt>;
271
+ problem: z.ZodOptional<z.ZodNullable<z.ZodString>>;
256
272
  }, z.core.$strip>>;
257
273
  cases: z.ZodArray<z.ZodObject<{
258
274
  name: z.ZodString;
259
275
  status: z.ZodEnum<{
260
276
  failed: "failed";
277
+ running: "running";
261
278
  passed: "passed";
262
279
  missing: "missing";
263
280
  }>;
@@ -286,6 +303,8 @@ export declare const SkillDetail: z.ZodObject<{
286
303
  input: z.ZodInt;
287
304
  output: z.ZodInt;
288
305
  }, z.core.$strip>>;
306
+ durationMs: z.ZodOptional<z.ZodInt>;
307
+ problem: z.ZodOptional<z.ZodNullable<z.ZodString>>;
289
308
  runId: z.ZodNullable<z.ZodTemplateLiteral<`run_${string}`>>;
290
309
  }, z.core.$strip>>;
291
310
  problem: z.ZodNullable<z.ZodString>;
@@ -93,13 +93,16 @@ export const SkillPoint = z.object({
93
93
  // Why it failed, as the grading model read the trace and the result; null when it passed.
94
94
  reason: z.string().nullable(),
95
95
  });
96
- export const skillCaseStatuses = ["passed", "failed", "missing"];
96
+ // `running` (#873): the case's probe runs of the Operator are under way; it turns into one of the
97
+ // other three once the last of them is graded. A report from before #873 knows only those three.
98
+ export const skillCaseStatuses = ["passed", "failed", "missing", "running"];
97
99
  // What the model read and wrote in a step of the tests, in tokens (#835, E146).
98
100
  export const SkillTokens = z.object({ input: z.int(), output: z.int() });
99
101
  export const SkillCaseResult = z.object({
100
102
  name: z.string(),
101
103
  // passed: every run passed every point; failed: one did not; missing: a tool without a recording
102
- // was called, so the case stopped before it ran it. Not a fault of the skill.
104
+ // was called, so the case stopped before it ran it. Not a fault of the skill. running: its probe
105
+ // runs are under way (#873).
103
106
  status: z.enum(skillCaseStatuses),
104
107
  // When the case's data was recorded, with which version; null where evals.yaml does not say.
105
108
  recordedAt: z.string().nullable(),
@@ -114,6 +117,11 @@ export const SkillCaseResult = z.object({
114
117
  costUsd: z.number(),
115
118
  // The model's tokens over every run of the case (#835); absent in a report from before.
116
119
  tokens: SkillTokens.optional(),
120
+ // How long its probe runs and their grading took together (#873); absent in a report from before.
121
+ durationMs: z.int().optional(),
122
+ // A probe run that ended without a result (the provider, the time, the container), a sentence; the
123
+ // case then fails without a fault of the skill (#873). Absent or null otherwise.
124
+ problem: z.string().nullable().optional(),
117
125
  // The probe run of the case's last attempt, its trace in the log.
118
126
  runId: RunId.nullable(),
119
127
  });
@@ -125,6 +133,11 @@ export const SkillTriggerHit = z.object({
125
133
  ok: z.boolean(),
126
134
  });
127
135
  export const SkillTestReport = z.object({
136
+ // The test run this report belongs to (#873): a probe run of an earlier one changes it no more.
137
+ // Absent in a report from before.
138
+ testId: z.string().optional(),
139
+ // Its probe runs are under way (#873): cases or the trigger still `running`. Absent means no.
140
+ running: z.boolean().optional(),
128
141
  version: z.int(),
129
142
  at: z.iso.datetime(),
130
143
  by: NodePerson,
@@ -140,6 +153,10 @@ export const SkillTestReport = z.object({
140
153
  hits: z.array(SkillTriggerHit),
141
154
  costUsd: z.number(),
142
155
  tokens: SkillTokens.optional(),
156
+ // Its probe run is under way (#873); the hits come with its end.
157
+ running: z.boolean().optional(),
158
+ durationMs: z.int().optional(),
159
+ problem: z.string().nullable().optional(),
143
160
  })
144
161
  .nullable(),
145
162
  cases: z.array(SkillCaseResult),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anchrd/colab-sdk",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "description": "Types, Zod schemas and the service client of Colab, the contract between its UI, backends and outside services.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",