@openchamber/sdk 2.5.0 → 2.5.2

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.
@@ -1,5 +1,6 @@
1
1
  import type { OpenChamberManifestApiVersion } from './api-version.ts';
2
2
  import type { FileEditorContribution } from './file-editor.ts';
3
+ import { type StatusSectionSource } from './status-view.ts';
3
4
  export declare const PANEL_ID: RegExp;
4
5
  /**
5
6
  * The extension's identity on the rail, the Extensions card, and the approval
@@ -55,9 +56,15 @@ export type PageContribution = true | {
55
56
  * this section and no rail panel. `title` replaces `panel.name` on the section
56
57
  * header; `height` is the starting frame height in CSS px before the guest
57
58
  * reports its own through `setHeight`.
59
+ *
60
+ * `source` makes the host draw the section itself from the service's answers
61
+ * (`status-view.ts`), without a frame. The object form needs `entry`,
62
+ * `source`, or both: a host that knows `source` uses it, an older one loads
63
+ * `entry`.
58
64
  */
59
65
  export type StatusSectionContribution = true | {
60
- entry: string;
66
+ entry?: string;
67
+ source?: StatusSectionSource;
61
68
  title?: string;
62
69
  height?: number;
63
70
  defaultExpanded?: boolean;
@@ -241,12 +248,184 @@ export type PublicSocketBinding = {
241
248
  };
242
249
  /**
243
250
  * Host roles a service can stand in for. `browser` answers the agent's
244
- * `browser.*` actions in place of the in-app browser view; the contract is in
245
- * `service-providers.ts`. A service that provides a role needs no panel or
246
- * background entry: the host starts it on the first action.
251
+ * `browser.*` actions in place of the in-app browser view. `source-control`
252
+ * makes the extension a Git host next to GitHub, GitLab and Gitea, described
253
+ * by `contributes.sourceControl`. Both contracts are in `service-providers.ts`.
254
+ * A service that provides a role needs no panel or background entry: the host
255
+ * starts it on the first call.
247
256
  */
248
- export declare const GUEST_SERVICE_PROVIDES: readonly ['browser'];
257
+ export declare const GUEST_SERVICE_PROVIDES: readonly ['browser', 'source-control'];
249
258
  export type GuestServiceProvides = (typeof GUEST_SERVICE_PROVIDES)[number];
259
+ /**
260
+ * The host names an extension's Git host `ext-<panel.id>`, and provider ids
261
+ * are at most 32 characters, so a guest taking the role has an id of at most
262
+ * this many.
263
+ */
264
+ export declare const SOURCE_CONTROL_GUEST_ID_MAX = 28;
265
+ /** The provider id OpenChamber gives the Git host an extension provides. */
266
+ export declare const sourceControlProviderIdOf: (guestId: string) => string;
267
+ /** Default instances a Git host extension may name. */
268
+ export declare const SOURCE_CONTROL_DEFAULT_INSTANCES_MAX = 4;
269
+ /** URL templates per kind (`presentation.urls.changeRequest` / `.issue`). */
270
+ export declare const SOURCE_CONTROL_URL_TEMPLATES_MAX = 8;
271
+ /** Characters in one URL template. */
272
+ export declare const SOURCE_CONTROL_URL_TEMPLATE_MAX = 256;
273
+ /**
274
+ * The placeholders a URL template may use, each a whole path segment.
275
+ * `{namespace+}` is one or more segments (GitLab groups); `{owner}` exactly one.
276
+ */
277
+ export declare const SOURCE_CONTROL_URL_TOKENS: readonly ['{owner}', '{namespace+}', '{repo}', '{number}'];
278
+ /** `submit` is a change-based host's own merge (Gerrit's): when declared it is the only method. */
279
+ export type SourceControlMergeMethod = 'merge' | 'squash' | 'rebase' | 'submit';
280
+ /**
281
+ * What the Git host can do. A capability left out is off. `merge` lists the
282
+ * methods it offers, or is `false`. Review threads, uploads, stacks, the
283
+ * reference picker and multiple accounts are not declared: the host fixes them
284
+ * for every extension.
285
+ */
286
+ export type SourceControlCapabilities = {
287
+ projects: boolean;
288
+ issues: boolean;
289
+ changeRequests: boolean;
290
+ draftChangeRequests: boolean;
291
+ merge: false | {
292
+ methods: SourceControlMergeMethod[];
293
+ };
294
+ ci: boolean;
295
+ comments: boolean;
296
+ reviews: boolean;
297
+ state: boolean;
298
+ labels: boolean;
299
+ reviewers: boolean;
300
+ changeRequestPatch: boolean;
301
+ liveSummaries: boolean;
302
+ /**
303
+ * How a review is given. `verdict` (the default when left out): approve or
304
+ * request changes. `votes`: per-label scores, such as Code-Review -2..+2;
305
+ * the labels and their ranges come with each change request's context.
306
+ */
307
+ reviewModel?: 'verdict' | 'votes';
308
+ /**
309
+ * Whether a change request has numbered revisions (patchsets) that can be
310
+ * read one at a time: reads then may carry `revision`, a commit sha.
311
+ */
312
+ revisions?: boolean;
313
+ };
314
+ /**
315
+ * `contributes.sourceControl`: the Git host an extension with
316
+ * `service.provides: ["source-control"]` adds, declared in the manifest so
317
+ * OpenChamber can draw and route it without starting the service. The
318
+ * provider id is not declared: OpenChamber names it `ext-<panel.id>`.
319
+ */
320
+ export type SourceControlContribution = {
321
+ /** Wire version of the role's service contract; `1`. */
322
+ wire: 1;
323
+ /** The product name, shown untranslated. 1 to 64 characters. */
324
+ label: string;
325
+ /** `change` names a change-based host's unit of review (Gerrit's change). */
326
+ terminology: {
327
+ changeRequest: 'pullRequest' | 'mergeRequest' | 'change';
328
+ ci: 'checks' | 'pipeline';
329
+ };
330
+ /** `#`, `!`: what precedes a number. 1 to 4 characters. */
331
+ referencePrefix: {
332
+ changeRequest: string;
333
+ issue: string;
334
+ };
335
+ /** `owner/name`: two segments. `namespace/name`: nested groups before the name. */
336
+ repositoryPath: 'owner/name' | 'namespace/name';
337
+ instances: {
338
+ /** Up to 4 https origins offered without typing one. */
339
+ defaultInstances: string[];
340
+ /** Whether the user may add an instance outside `defaultInstances`. */
341
+ custom: boolean;
342
+ /** Whether a typed instance may be `http://` on a loopback address. */
343
+ allowLoopbackHttp: boolean;
344
+ /** Whether a typed instance may carry a port. */
345
+ allowPort: boolean;
346
+ /** Example text in the instance field. */
347
+ placeholder: string;
348
+ };
349
+ capabilities: SourceControlCapabilities;
350
+ /** How OpenChamber sends the token: which header, with which prefix. */
351
+ token: {
352
+ header: 'authorization' | 'private-token';
353
+ /**
354
+ * `bearer` → `Bearer <token>`, `token` → `token <token>`, `basic` →
355
+ * `Basic base64(<login>:<token>)`, `none` → the bare token (only with `private-token`).
356
+ */
357
+ scheme: 'bearer' | 'token' | 'basic' | 'none';
358
+ /** Settings asks for the account's username beside the token. Required with, and only with, `basic`. */
359
+ username?: boolean;
360
+ /** Scopes the Settings card asks the user to grant. */
361
+ scopes: string[];
362
+ /** Path on the instance where tokens are created, linked from Settings. */
363
+ createPath?: string;
364
+ };
365
+ /** How Git over HTTPS signs in with the stored token. */
366
+ transport: {
367
+ httpsUsername: {
368
+ kind: 'login';
369
+ } | {
370
+ kind: 'fixed';
371
+ value: string;
372
+ };
373
+ appendDotGitToHttpsClone: boolean;
374
+ };
375
+ limits: {
376
+ commentMaxLength: number;
377
+ /** How a reviewer is named in a reviewer mutation: a numeric user id or a login. */
378
+ reviewerId: 'numeric' | 'login';
379
+ labelsMax: number;
380
+ reviewersMax: number;
381
+ };
382
+ /** Pull requests and issues read in one `liveSummaries` call. */
383
+ trackedItems: {
384
+ batchLimit: number;
385
+ };
386
+ presentation: {
387
+ /** `PR`, `MR`: shown untranslated. 1 to 8 characters. */
388
+ abbreviation: string;
389
+ /** English noun for generation prompts, such as `pull request`. */
390
+ promptNoun: string;
391
+ /** Whether issues and change requests share one number sequence. */
392
+ sharedNumberSpace: boolean;
393
+ /** A 24×24 SVG path `d`, the mark drawn for the Git host. */
394
+ iconPath?: string;
395
+ /**
396
+ * Web paths of a change request and an issue on the instance, made of
397
+ * literal segments and the `SOURCE_CONTROL_URL_TOKENS` placeholders, such
398
+ * as `/{owner}/{repo}/pulls/{number}`. OpenChamber compiles them; an
399
+ * extension never supplies a regular expression.
400
+ */
401
+ urls: {
402
+ changeRequest: string[];
403
+ issue: string[];
404
+ };
405
+ /**
406
+ * Review threads are not part of the role: OpenChamber keeps starting one
407
+ * off for an extension's Git host, so there is no `startThread` here.
408
+ */
409
+ /**
410
+ * `submitRequirements`: each change request's context lists what must
411
+ * hold before it can be submitted, and the UI shows them by the Submit button.
412
+ */
413
+ features: {
414
+ authorCanReview: boolean;
415
+ issueCloseReason: boolean;
416
+ submitRequirements?: boolean;
417
+ };
418
+ /** Repository paths read as the change request template, first match wins. */
419
+ changeRequestTemplates: string[];
420
+ };
421
+ };
422
+ /** What the extension catalog and approval dialog show of the role; never a token. */
423
+ export type PublicSourceControl = {
424
+ label: string;
425
+ defaultInstances: string[];
426
+ custom: boolean;
427
+ };
428
+ export declare const toPublicSourceControl: (contribution: SourceControlContribution) => PublicSourceControl;
250
429
  export type ServiceContribution = {
251
430
  entry: string;
252
431
  runtime: 'host';
@@ -321,6 +500,8 @@ export type OpenChamberContributes = {
321
500
  tools?: GuestToolContribution[];
322
501
  /** Editors the Files view opens matching files in. */
323
502
  fileEditors?: FileEditorContribution[];
503
+ /** The Git host a `source-control` service provides; present exactly when it does. */
504
+ sourceControl?: SourceControlContribution;
324
505
  };
325
506
  /** Whether any declared action asks for a session's messages, which needs `conversation`. */
326
507
  export declare const guestActionsNeedConversation: (actions: readonly GuestActionContribution[] | undefined) => boolean;
@@ -350,6 +531,8 @@ export declare const resolvePageEntry: (contributes: Pick<OpenChamberContributes
350
531
  * has no panel page to reuse.
351
532
  */
352
533
  export declare const resolveStatusSectionEntry: (contributes: Pick<OpenChamberContributes, 'panel' | 'statusSection'>) => string | null;
534
+ /** Where the host reads a source-backed section, with the interval resolved; `null` for a frame-only section. */
535
+ export declare const resolveStatusSectionSource: (contributes: Pick<OpenChamberContributes, 'statusSection'>) => Required<StatusSectionSource> | null;
353
536
  /** Clamp a requested status section height to what the host allows. */
354
537
  export declare const clampStatusSectionHeight: (height: number) => number;
355
538
  export type OpenChamberEngines = {
package/dist/manifest.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { GUEST_STATUS_SOURCE_INTERVAL_DEFAULT } from './status-view.js';
1
2
  export const PANEL_ID = /^[a-z][a-z0-9-]*$/;
2
3
  export const GUEST_SURFACE_DOCKS = ['top', 'bottom', 'left', 'right'];
3
4
  export const GUEST_SURFACE_DOCK_DEFAULT = 'top';
@@ -87,11 +88,37 @@ export const resolveIntegrationApi = (integration) => {
87
88
  };
88
89
  /**
89
90
  * Host roles a service can stand in for. `browser` answers the agent's
90
- * `browser.*` actions in place of the in-app browser view; the contract is in
91
- * `service-providers.ts`. A service that provides a role needs no panel or
92
- * background entry: the host starts it on the first action.
91
+ * `browser.*` actions in place of the in-app browser view. `source-control`
92
+ * makes the extension a Git host next to GitHub, GitLab and Gitea, described
93
+ * by `contributes.sourceControl`. Both contracts are in `service-providers.ts`.
94
+ * A service that provides a role needs no panel or background entry: the host
95
+ * starts it on the first call.
93
96
  */
94
- export const GUEST_SERVICE_PROVIDES = ['browser'];
97
+ export const GUEST_SERVICE_PROVIDES = ['browser', 'source-control'];
98
+ /**
99
+ * The host names an extension's Git host `ext-<panel.id>`, and provider ids
100
+ * are at most 32 characters, so a guest taking the role has an id of at most
101
+ * this many.
102
+ */
103
+ export const SOURCE_CONTROL_GUEST_ID_MAX = 28;
104
+ /** The provider id OpenChamber gives the Git host an extension provides. */
105
+ export const sourceControlProviderIdOf = (guestId) => `ext-${guestId}`;
106
+ /** Default instances a Git host extension may name. */
107
+ export const SOURCE_CONTROL_DEFAULT_INSTANCES_MAX = 4;
108
+ /** URL templates per kind (`presentation.urls.changeRequest` / `.issue`). */
109
+ export const SOURCE_CONTROL_URL_TEMPLATES_MAX = 8;
110
+ /** Characters in one URL template. */
111
+ export const SOURCE_CONTROL_URL_TEMPLATE_MAX = 256;
112
+ /**
113
+ * The placeholders a URL template may use, each a whole path segment.
114
+ * `{namespace+}` is one or more segments (GitLab groups); `{owner}` exactly one.
115
+ */
116
+ export const SOURCE_CONTROL_URL_TOKENS = ['{owner}', '{namespace+}', '{repo}', '{number}'];
117
+ export const toPublicSourceControl = (contribution) => ({
118
+ label: contribution.label,
119
+ defaultInstances: [...contribution.instances.defaultInstances],
120
+ custom: contribution.instances.custom,
121
+ });
95
122
  export const serviceProvides = (service, role) => Boolean(service?.provides?.includes(role));
96
123
  /**
97
124
  * What a guest may do beyond drawing its own panel. The user approves the
@@ -187,7 +214,14 @@ export const resolveStatusSectionEntry = (contributes) => {
187
214
  const section = contributes.statusSection;
188
215
  if (!section)
189
216
  return null;
190
- return section === true ? contributes.panel.entry ?? null : section.entry;
217
+ return section === true ? contributes.panel.entry ?? null : section.entry ?? null;
218
+ };
219
+ /** Where the host reads a source-backed section, with the interval resolved; `null` for a frame-only section. */
220
+ export const resolveStatusSectionSource = (contributes) => {
221
+ const section = contributes.statusSection;
222
+ if (!section || section === true || !section.source)
223
+ return null;
224
+ return { path: section.source.path, interval: section.source.interval ?? GUEST_STATUS_SOURCE_INTERVAL_DEFAULT };
191
225
  };
192
226
  /** Clamp a requested status section height to what the host allows. */
193
227
  export const clampStatusSectionHeight = (height) => {
package/dist/parse.d.ts CHANGED
@@ -37,7 +37,11 @@ export declare const openChamberManifestSchema: z.ZodObject<{
37
37
  title: z.ZodOptional<z.ZodString>;
38
38
  }, z.core.$strip>]>>;
39
39
  statusSection: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<true>, z.ZodObject<{
40
- entry: z.ZodString;
40
+ entry: z.ZodOptional<z.ZodString>;
41
+ source: z.ZodOptional<z.ZodObject<{
42
+ path: z.ZodString;
43
+ interval: z.ZodOptional<z.ZodNumber>;
44
+ }, z.core.$strict>>;
41
45
  title: z.ZodOptional<z.ZodString>;
42
46
  height: z.ZodOptional<z.ZodNumber>;
43
47
  defaultExpanded: z.ZodOptional<z.ZodBoolean>;
@@ -114,6 +118,7 @@ export declare const openChamberManifestSchema: z.ZodObject<{
114
118
  }>>>;
115
119
  provides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
116
120
  browser: "browser";
121
+ "source-control": "source-control";
117
122
  }>>>;
118
123
  surface: z.ZodOptional<z.ZodLiteral<true>>;
119
124
  }, z.core.$strip>>;
@@ -170,6 +175,115 @@ export declare const openChamberManifestSchema: z.ZodObject<{
170
175
  text: "text";
171
176
  }>>;
172
177
  }, z.core.$strip>>>;
178
+ sourceControl: z.ZodOptional<z.ZodObject<{
179
+ wire: z.ZodLiteral<1>;
180
+ label: z.ZodString;
181
+ terminology: z.ZodObject<{
182
+ changeRequest: z.ZodEnum<{
183
+ change: "change";
184
+ mergeRequest: "mergeRequest";
185
+ pullRequest: "pullRequest";
186
+ }>;
187
+ ci: z.ZodEnum<{
188
+ checks: "checks";
189
+ pipeline: "pipeline";
190
+ }>;
191
+ }, z.core.$strict>;
192
+ referencePrefix: z.ZodObject<{
193
+ changeRequest: z.ZodString;
194
+ issue: z.ZodString;
195
+ }, z.core.$strict>;
196
+ repositoryPath: z.ZodEnum<{
197
+ "namespace/name": "namespace/name";
198
+ "owner/name": "owner/name";
199
+ }>;
200
+ instances: z.ZodObject<{
201
+ defaultInstances: z.ZodArray<z.ZodString>;
202
+ custom: z.ZodBoolean;
203
+ allowLoopbackHttp: z.ZodBoolean;
204
+ allowPort: z.ZodBoolean;
205
+ placeholder: z.ZodString;
206
+ }, z.core.$strict>;
207
+ capabilities: z.ZodObject<{
208
+ projects: z.ZodDefault<z.ZodBoolean>;
209
+ issues: z.ZodDefault<z.ZodBoolean>;
210
+ changeRequests: z.ZodDefault<z.ZodBoolean>;
211
+ draftChangeRequests: z.ZodDefault<z.ZodBoolean>;
212
+ merge: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
213
+ methods: z.ZodArray<z.ZodEnum<{
214
+ merge: "merge";
215
+ rebase: "rebase";
216
+ squash: "squash";
217
+ submit: "submit";
218
+ }>>;
219
+ }, z.core.$strict>]>>;
220
+ ci: z.ZodDefault<z.ZodBoolean>;
221
+ comments: z.ZodDefault<z.ZodBoolean>;
222
+ reviews: z.ZodDefault<z.ZodBoolean>;
223
+ state: z.ZodDefault<z.ZodBoolean>;
224
+ labels: z.ZodDefault<z.ZodBoolean>;
225
+ reviewers: z.ZodDefault<z.ZodBoolean>;
226
+ changeRequestPatch: z.ZodDefault<z.ZodBoolean>;
227
+ liveSummaries: z.ZodDefault<z.ZodBoolean>;
228
+ reviewModel: z.ZodOptional<z.ZodEnum<{
229
+ verdict: "verdict";
230
+ votes: "votes";
231
+ }>>;
232
+ revisions: z.ZodOptional<z.ZodBoolean>;
233
+ }, z.core.$strict>;
234
+ token: z.ZodObject<{
235
+ header: z.ZodEnum<{
236
+ authorization: "authorization";
237
+ "private-token": "private-token";
238
+ }>;
239
+ scheme: z.ZodEnum<{
240
+ basic: "basic";
241
+ bearer: "bearer";
242
+ none: "none";
243
+ token: "token";
244
+ }>;
245
+ username: z.ZodOptional<z.ZodBoolean>;
246
+ scopes: z.ZodArray<z.ZodString>;
247
+ createPath: z.ZodOptional<z.ZodString>;
248
+ }, z.core.$strict>;
249
+ transport: z.ZodObject<{
250
+ httpsUsername: z.ZodUnion<readonly [z.ZodObject<{
251
+ kind: z.ZodLiteral<"login">;
252
+ }, z.core.$strict>, z.ZodObject<{
253
+ kind: z.ZodLiteral<"fixed">;
254
+ value: z.ZodString;
255
+ }, z.core.$strict>]>;
256
+ appendDotGitToHttpsClone: z.ZodBoolean;
257
+ }, z.core.$strict>;
258
+ limits: z.ZodObject<{
259
+ commentMaxLength: z.ZodNumber;
260
+ reviewerId: z.ZodEnum<{
261
+ login: "login";
262
+ numeric: "numeric";
263
+ }>;
264
+ labelsMax: z.ZodNumber;
265
+ reviewersMax: z.ZodNumber;
266
+ }, z.core.$strict>;
267
+ trackedItems: z.ZodObject<{
268
+ batchLimit: z.ZodNumber;
269
+ }, z.core.$strict>;
270
+ presentation: z.ZodObject<{
271
+ abbreviation: z.ZodString;
272
+ promptNoun: z.ZodString;
273
+ sharedNumberSpace: z.ZodBoolean;
274
+ iconPath: z.ZodOptional<z.ZodString>;
275
+ urls: z.ZodObject<{
276
+ changeRequest: z.ZodArray<z.ZodString>;
277
+ issue: z.ZodArray<z.ZodString>;
278
+ }, z.core.$strict>;
279
+ features: z.ZodObject<{
280
+ authorCanReview: z.ZodDefault<z.ZodBoolean>;
281
+ issueCloseReason: z.ZodDefault<z.ZodBoolean>;
282
+ submitRequirements: z.ZodOptional<z.ZodBoolean>;
283
+ }, z.core.$strict>;
284
+ changeRequestTemplates: z.ZodArray<z.ZodString>;
285
+ }, z.core.$strict>;
286
+ }, z.core.$strict>>;
173
287
  }, z.core.$strip>;
174
288
  }, z.core.$strip>;
175
289
  export declare const PACKAGE_VERSION_PATTERN: RegExp;
@@ -212,7 +326,11 @@ export declare const packageManifestSchema: z.ZodObject<{
212
326
  title: z.ZodOptional<z.ZodString>;
213
327
  }, z.core.$strip>]>>;
214
328
  statusSection: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<true>, z.ZodObject<{
215
- entry: z.ZodString;
329
+ entry: z.ZodOptional<z.ZodString>;
330
+ source: z.ZodOptional<z.ZodObject<{
331
+ path: z.ZodString;
332
+ interval: z.ZodOptional<z.ZodNumber>;
333
+ }, z.core.$strict>>;
216
334
  title: z.ZodOptional<z.ZodString>;
217
335
  height: z.ZodOptional<z.ZodNumber>;
218
336
  defaultExpanded: z.ZodOptional<z.ZodBoolean>;
@@ -289,6 +407,7 @@ export declare const packageManifestSchema: z.ZodObject<{
289
407
  }>>>;
290
408
  provides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
291
409
  browser: "browser";
410
+ "source-control": "source-control";
292
411
  }>>>;
293
412
  surface: z.ZodOptional<z.ZodLiteral<true>>;
294
413
  }, z.core.$strip>>;
@@ -345,6 +464,115 @@ export declare const packageManifestSchema: z.ZodObject<{
345
464
  text: "text";
346
465
  }>>;
347
466
  }, z.core.$strip>>>;
467
+ sourceControl: z.ZodOptional<z.ZodObject<{
468
+ wire: z.ZodLiteral<1>;
469
+ label: z.ZodString;
470
+ terminology: z.ZodObject<{
471
+ changeRequest: z.ZodEnum<{
472
+ change: "change";
473
+ mergeRequest: "mergeRequest";
474
+ pullRequest: "pullRequest";
475
+ }>;
476
+ ci: z.ZodEnum<{
477
+ checks: "checks";
478
+ pipeline: "pipeline";
479
+ }>;
480
+ }, z.core.$strict>;
481
+ referencePrefix: z.ZodObject<{
482
+ changeRequest: z.ZodString;
483
+ issue: z.ZodString;
484
+ }, z.core.$strict>;
485
+ repositoryPath: z.ZodEnum<{
486
+ "namespace/name": "namespace/name";
487
+ "owner/name": "owner/name";
488
+ }>;
489
+ instances: z.ZodObject<{
490
+ defaultInstances: z.ZodArray<z.ZodString>;
491
+ custom: z.ZodBoolean;
492
+ allowLoopbackHttp: z.ZodBoolean;
493
+ allowPort: z.ZodBoolean;
494
+ placeholder: z.ZodString;
495
+ }, z.core.$strict>;
496
+ capabilities: z.ZodObject<{
497
+ projects: z.ZodDefault<z.ZodBoolean>;
498
+ issues: z.ZodDefault<z.ZodBoolean>;
499
+ changeRequests: z.ZodDefault<z.ZodBoolean>;
500
+ draftChangeRequests: z.ZodDefault<z.ZodBoolean>;
501
+ merge: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
502
+ methods: z.ZodArray<z.ZodEnum<{
503
+ merge: "merge";
504
+ rebase: "rebase";
505
+ squash: "squash";
506
+ submit: "submit";
507
+ }>>;
508
+ }, z.core.$strict>]>>;
509
+ ci: z.ZodDefault<z.ZodBoolean>;
510
+ comments: z.ZodDefault<z.ZodBoolean>;
511
+ reviews: z.ZodDefault<z.ZodBoolean>;
512
+ state: z.ZodDefault<z.ZodBoolean>;
513
+ labels: z.ZodDefault<z.ZodBoolean>;
514
+ reviewers: z.ZodDefault<z.ZodBoolean>;
515
+ changeRequestPatch: z.ZodDefault<z.ZodBoolean>;
516
+ liveSummaries: z.ZodDefault<z.ZodBoolean>;
517
+ reviewModel: z.ZodOptional<z.ZodEnum<{
518
+ verdict: "verdict";
519
+ votes: "votes";
520
+ }>>;
521
+ revisions: z.ZodOptional<z.ZodBoolean>;
522
+ }, z.core.$strict>;
523
+ token: z.ZodObject<{
524
+ header: z.ZodEnum<{
525
+ authorization: "authorization";
526
+ "private-token": "private-token";
527
+ }>;
528
+ scheme: z.ZodEnum<{
529
+ basic: "basic";
530
+ bearer: "bearer";
531
+ none: "none";
532
+ token: "token";
533
+ }>;
534
+ username: z.ZodOptional<z.ZodBoolean>;
535
+ scopes: z.ZodArray<z.ZodString>;
536
+ createPath: z.ZodOptional<z.ZodString>;
537
+ }, z.core.$strict>;
538
+ transport: z.ZodObject<{
539
+ httpsUsername: z.ZodUnion<readonly [z.ZodObject<{
540
+ kind: z.ZodLiteral<"login">;
541
+ }, z.core.$strict>, z.ZodObject<{
542
+ kind: z.ZodLiteral<"fixed">;
543
+ value: z.ZodString;
544
+ }, z.core.$strict>]>;
545
+ appendDotGitToHttpsClone: z.ZodBoolean;
546
+ }, z.core.$strict>;
547
+ limits: z.ZodObject<{
548
+ commentMaxLength: z.ZodNumber;
549
+ reviewerId: z.ZodEnum<{
550
+ login: "login";
551
+ numeric: "numeric";
552
+ }>;
553
+ labelsMax: z.ZodNumber;
554
+ reviewersMax: z.ZodNumber;
555
+ }, z.core.$strict>;
556
+ trackedItems: z.ZodObject<{
557
+ batchLimit: z.ZodNumber;
558
+ }, z.core.$strict>;
559
+ presentation: z.ZodObject<{
560
+ abbreviation: z.ZodString;
561
+ promptNoun: z.ZodString;
562
+ sharedNumberSpace: z.ZodBoolean;
563
+ iconPath: z.ZodOptional<z.ZodString>;
564
+ urls: z.ZodObject<{
565
+ changeRequest: z.ZodArray<z.ZodString>;
566
+ issue: z.ZodArray<z.ZodString>;
567
+ }, z.core.$strict>;
568
+ features: z.ZodObject<{
569
+ authorCanReview: z.ZodDefault<z.ZodBoolean>;
570
+ issueCloseReason: z.ZodDefault<z.ZodBoolean>;
571
+ submitRequirements: z.ZodOptional<z.ZodBoolean>;
572
+ }, z.core.$strict>;
573
+ changeRequestTemplates: z.ZodArray<z.ZodString>;
574
+ }, z.core.$strict>;
575
+ }, z.core.$strict>>;
348
576
  }, z.core.$strip>;
349
577
  }, z.core.$strip>;
350
578
  }, z.core.$strip>;