@taiga-ai/mcp-server 0.36.0-rc.778 → 0.36.0-rc.800

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 (2) hide show
  1. package/dist/index.js +638 -34
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -505,6 +505,7 @@ function hide(inst, key, value) {
505
505
  return own$5(inst, key, value, false);
506
506
  }
507
507
  /** Adds members a table derives from the instance: each builds on first read and shadows as own data, and assignment shadows the same way, as when these were own properties. */
508
+ /* @__NO_SIDE_EFFECTS__ */
508
509
  function derived(computes, table) {
509
510
  for (const key in computes) {
510
511
  const compute = computes[key];
@@ -658,6 +659,7 @@ function newError(Definition) {
658
659
  }
659
660
  return new Definition();
660
661
  }
662
+ /* @__NO_SIDE_EFFECTS__ */
661
663
  function $constructor(name, initializer, proto, params) {
662
664
  const zodProto = {};
663
665
  function Internals(def) {
@@ -788,8 +790,7 @@ const initializer$1 = (inst, def) => {
788
790
  });
789
791
  }
790
792
  };
791
- const $ZodError = $constructor("$ZodError", initializer$1);
792
- $constructor("$ZodError", initializer$1, void 0, { Parent: Error });
793
+ const $ZodError = /* @__PURE__ */ $constructor("$ZodError", initializer$1);
793
794
  /** Get-or-create `obj[key]` as an own data property. A path segment naming an inherited member
794
795
  * ("toString", "constructor") would otherwise read through to the prototype, and assigning
795
796
  * "__proto__" would hit the setter instead of creating a key. */
@@ -1078,7 +1079,7 @@ const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9
1078
1079
  /** Returns a regex for validating an RFC 9562/4122 UUID.
1079
1080
  *
1080
1081
  * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */
1081
- const uuid = (version) => {
1082
+ const uuid$1 = (version) => {
1082
1083
  if (!version) return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;
1083
1084
  return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);
1084
1085
  };
@@ -1618,8 +1619,8 @@ const $ZodUUID = /*@__PURE__*/ $constructor("$ZodUUID", (inst, def) => {
1618
1619
  v8: 8
1619
1620
  }[def.version];
1620
1621
  if (v === void 0) throw new Error(`Invalid UUID version: "${def.version}"`);
1621
- def.pattern ?? (def.pattern = uuid(v));
1622
- } else def.pattern ?? (def.pattern = uuid());
1622
+ def.pattern ?? (def.pattern = uuid$1(v));
1623
+ } else def.pattern ?? (def.pattern = uuid$1());
1623
1624
  $ZodStringFormat.init(inst, def);
1624
1625
  });
1625
1626
  const $ZodEmail = /*@__PURE__*/ $constructor("$ZodEmail", (inst, def) => {
@@ -5675,6 +5676,14 @@ function object(shape, params) {
5675
5676
  };
5676
5677
  return new ZodObject(def);
5677
5678
  }
5679
+ function strictObject(shape, params) {
5680
+ return new ZodObject({
5681
+ type: "object",
5682
+ shape,
5683
+ catchall: never(),
5684
+ ...normalizeParams(params)
5685
+ });
5686
+ }
5678
5687
  function looseObject(shape, params) {
5679
5688
  return new ZodObject({
5680
5689
  type: "object",
@@ -7941,7 +7950,23 @@ var SdkError = class extends Error {
7941
7950
  stampErrorBrands(this, new.target);
7942
7951
  }
7943
7952
  };
7944
- (class extends SdkError {
7953
+ /**
7954
+ * An {@linkcode SdkError} subclass for HTTP transport failures.
7955
+ *
7956
+ * Thrown by the streamable HTTP transport when the server responds with a
7957
+ * non-OK status code. Narrows {@linkcode SdkError.data | data} to
7958
+ * {@linkcode SdkHttpErrorData} so consumers can inspect the HTTP status
7959
+ * without unsafe casting.
7960
+ *
7961
+ * @example
7962
+ * ```ts source="./sdkErrors.examples.ts#SdkHttpError_basicUsage"
7963
+ * if (error instanceof SdkHttpError) {
7964
+ * console.log(error.status); // number
7965
+ * console.log(error.statusText); // string | undefined
7966
+ * }
7967
+ * ```
7968
+ */
7969
+ var SdkHttpError = class extends SdkError {
7945
7970
  static {
7946
7971
  Object.defineProperty(this, "mcpBrand", { value: "mcp.SdkHttpError" });
7947
7972
  }
@@ -7958,7 +7983,7 @@ var SdkError = class extends Error {
7958
7983
  get statusText() {
7959
7984
  return this.data.statusText;
7960
7985
  }
7961
- });
7986
+ };
7962
7987
  function isPlainObject$7(value) {
7963
7988
  return value !== null && typeof value === "object" && !Array.isArray(value);
7964
7989
  }
@@ -24089,6 +24114,25 @@ var TaigaClient = class {
24089
24114
  }
24090
24115
  };
24091
24116
  //#endregion
24117
+ //#region ../../packages/types/dist/clouds.js
24118
+ /**
24119
+ * Cloud provider platforms that Taiga can connect to.
24120
+ */
24121
+ const CLOUD_PROVIDERS = [
24122
+ "aws",
24123
+ "gcp",
24124
+ "azure",
24125
+ "upcloud",
24126
+ "kubernetes",
24127
+ "digitalocean",
24128
+ "vercel",
24129
+ "railway",
24130
+ "render",
24131
+ "fly",
24132
+ "on_prem",
24133
+ "other"
24134
+ ];
24135
+ //#endregion
24092
24136
  //#region ../../packages/types/dist/lenient-schema.js
24093
24137
  /**
24094
24138
  * Building blocks for reading JSON that arrives untyped -- a stored jsonb
@@ -24150,6 +24194,14 @@ const optionalUuid = string$2().uuid().optional();
24150
24194
  */
24151
24195
  const optionalLineAnchor = number$1().int().min(0).optional().transform((v) => v ? v : void 0);
24152
24196
  //#endregion
24197
+ //#region ../../packages/types/dist/entitlements.js
24198
+ /**
24199
+ * Which agent implementation serves a planning job or build run (PRO-1331).
24200
+ * Recorded on `agent_jobs.runtime` / `build_runs.runtime` at dispatch so
24201
+ * outcomes can be compared per runtime and the UI can badge runs.
24202
+ */
24203
+ const AGENT_RUNTIMES = ["legacy", "engineer"];
24204
+ //#endregion
24153
24205
  //#region ../../packages/types/dist/tenants.js
24154
24206
  const TENANT_DOCUMENT_TYPES = [
24155
24207
  "policy_security",
@@ -24365,6 +24417,14 @@ Object.fromEntries([...EU_COUNTRIES.map((c) => [c.code, "eu"]), ...EEA_COUNTRIES
24365
24417
  //#endregion
24366
24418
  //#region ../../packages/types/dist/factories.js
24367
24419
  const FACTORY_DOCUMENT_TYPES = ["factory_instructions"];
24420
+ /** The single canonical factory-document type (the free-form Factory Instructions doc). */
24421
+ const FACTORY_INSTRUCTIONS_TYPE = "factory_instructions";
24422
+ /**
24423
+ * The pre-PRO-1671 value of that type. Old clients still name it in URLs
24424
+ * (`/factories/:id/documents/team_instructions`), so the API accepts it as
24425
+ * an alias for a deprecation window.
24426
+ */
24427
+ const LEGACY_FACTORY_INSTRUCTIONS_TYPE = "team_instructions";
24368
24428
  //#endregion
24369
24429
  //#region ../../packages/types/dist/forge.js
24370
24430
  /** Source-control hosts. `bitbucket` is a stored link provider without an adapter yet. */
@@ -24416,6 +24476,15 @@ const FORGE_SUPPORT = {
24416
24476
  ],
24417
24477
  bitbucket: []
24418
24478
  };
24479
+ /**
24480
+ * Whether a repository link under this forge may name a GitHub App
24481
+ * installation's repository: only GitHub's. Stored under another forge, the
24482
+ * link would be dispatched with GitHub credentials while the rest of its
24483
+ * lifecycle reads it as that forge.
24484
+ */
24485
+ function linksGitHubAppRepositories(provider) {
24486
+ return provider === "github";
24487
+ }
24419
24488
  const FORGE_TERMS = {
24420
24489
  github: {
24421
24490
  name: "GitHub",
@@ -24471,6 +24540,11 @@ const PRODUCT_DOCUMENT_TYPES = [
24471
24540
  "product_instructions"
24472
24541
  ];
24473
24542
  /**
24543
+ * The pre-PRO-1671 value of `product_instructions`. Old clients still name it
24544
+ * in URLs, so the API accepts it as an alias for a deprecation window.
24545
+ */
24546
+ const LEGACY_PRODUCT_INSTRUCTIONS_TYPE = "project_instructions";
24547
+ /**
24474
24548
  * The document types the codebase-intelligence agent can derive from a repo --
24475
24549
  * the valid values for a single-document reality refresh (PRO-1141).
24476
24550
  *
@@ -24566,6 +24640,8 @@ const PRODUCT_DOCUMENT_DISPLAY_NAMES = {
24566
24640
  service_blueprint: "Service Blueprint"
24567
24641
  };
24568
24642
  const PRODUCT_DOCUMENT_ORIGINS = ["plan", "reality"];
24643
+ /** The forges a repository link can name: `FORGE_PROVIDERS`, under the name links have always used. */
24644
+ const VCS_PROVIDERS = FORGE_PROVIDERS;
24569
24645
  //#endregion
24570
24646
  //#region ../../packages/types/dist/route-key.js
24571
24647
  /**
@@ -25524,6 +25600,29 @@ object({
25524
25600
  [...BUILD_RUN_ACTIVE_STATUSES.filter((s) => s !== "reviewing")];
25525
25601
  //#endregion
25526
25602
  //#region ../../packages/types/dist/agents.js
25603
+ const AGENT_JOB_TYPES = [
25604
+ "generate_document",
25605
+ "generate_backlog",
25606
+ "plan_backlog_item",
25607
+ "infer_backlog_dependencies",
25608
+ "deploy",
25609
+ "provision_infrastructure",
25610
+ "health_check",
25611
+ "refresh_reality_docs",
25612
+ "derive_policy_update",
25613
+ "derive_design_from_documents",
25614
+ "sync_design_tokens",
25615
+ "generate_design_component",
25616
+ "maintenance_sweep",
25617
+ "maintenance_verify",
25618
+ "propose_ui_concepts",
25619
+ "iterate_ui_concept",
25620
+ "fill_questionnaire",
25621
+ "read_questionnaire_layout",
25622
+ "generate_ui_direction",
25623
+ "assess_policy_conformance",
25624
+ "replan_run"
25625
+ ];
25527
25626
  /**
25528
25627
  * Why a PROMPTED `generate_backlog` job planned nothing.
25529
25628
  *
@@ -25936,6 +26035,23 @@ const MCP_TOOLSETS = [
25936
26035
  /** Longest request for changes from Taiga (PRO-3035): about four pages of prose. */
25937
26036
  const CHANGE_REQUEST_MAX_CHARS = 1e4;
25938
26037
  //#endregion
26038
+ //#region ../../packages/types/dist/requests.js
26039
+ /** Every way a request can be answered, whatever its kind. */
26040
+ const REQUEST_EXITS = [
26041
+ "resume_run",
26042
+ "replan",
26043
+ "clear",
26044
+ "leave_line",
26045
+ "approve",
26046
+ "reject",
26047
+ "merge",
26048
+ "close",
26049
+ "request_changes",
26050
+ "done",
26051
+ "dismiss",
26052
+ "reviewed"
26053
+ ];
26054
+ //#endregion
25939
26055
  //#region ../../packages/types/dist/maintenance.js
25940
26056
  /**
25941
26057
  * Maintenance taxonomy + API DTOs.
@@ -26261,6 +26377,19 @@ object({
26261
26377
  */
26262
26378
  const MAINTENANCE_LICENSE_FILTER_MAX = 4096;
26263
26379
  //#endregion
26380
+ //#region ../../packages/types/dist/custom-documents.js
26381
+ /**
26382
+ * Shared types for the custom-documents feature: customer-uploaded reference
26383
+ * files (PDFs, Markdown, OpenAPI specs, etc.) indexed into a Bedrock
26384
+ * Knowledge Base for retrieval by Taiga's internal agents.
26385
+ */
26386
+ const CUSTOM_DOCUMENT_STATUSES = [
26387
+ "pending",
26388
+ "ingesting",
26389
+ "ready",
26390
+ "failed"
26391
+ ];
26392
+ //#endregion
26264
26393
  //#region ../../packages/types/dist/design-tokens.js
26265
26394
  /**
26266
26395
  * The brand grounding contract (PRO-929).
@@ -26436,6 +26565,457 @@ object({
26436
26565
  fontSize: lenient(union([string$2(), number$1()]))
26437
26566
  });
26438
26567
  //#endregion
26568
+ //#region ../../packages/types/dist/questionnaires.js
26569
+ /**
26570
+ * Questionnaire filling (PRO-932).
26571
+ *
26572
+ * A customer uploads their own requirement spreadsheet; Taiga answers what the
26573
+ * project's evidence settles, cites the document version each answer rests on,
26574
+ * and hands back the gaps. The register these types describe is the durable
26575
+ * object -- the workbook is an import format on one side and an export format
26576
+ * on the other.
26577
+ */
26578
+ /**
26579
+ * Lifecycle of one questionnaire.
26580
+ *
26581
+ * `filling` is deliberately NOT set by the fill workflow (PRO-1187), and that
26582
+ * is a decision rather than an omission. A status set at the start of a
26583
+ * multi-minute run needs something to clear it when the run does not finish --
26584
+ * and if the worker dies mid-fill, nothing would: `agent_jobs` has a reaper for
26585
+ * stale JOBS, but it knows nothing about this table, so the register would read
26586
+ * `filling` forever. A state nothing can leave is worse than one nothing
26587
+ * enters.
26588
+ *
26589
+ * "Is a fill running" is already answerable, and from the row that has a reaper:
26590
+ * an active `fill_questionnaire` job with this questionnaire as its target.
26591
+ * Wire `filling` up when it comes with a path off it.
26592
+ */
26593
+ /**
26594
+ * `reading` and `needs_columns` are the import itself (PRO-1506). A workbook
26595
+ * is stored and its row exists from the first byte; the column read runs as
26596
+ * a job. `reading` is that job in flight; `needs_columns` is the read done
26597
+ * without confidence, waiting for a person to confirm the map. Only once the
26598
+ * map is confirmed do items exist and the row becomes `draft`.
26599
+ */
26600
+ /**
26601
+ * A sheet map's bounds, Excel's own: a column index becomes a column letter
26602
+ * in a cell reference the export writes to, so an unbounded one names
26603
+ * whatever it likes.
26604
+ */
26605
+ const EXCEL_MAX_COLUMN = 16384;
26606
+ const EXCEL_MAX_ROW = 1048576;
26607
+ //#endregion
26608
+ //#region ../../packages/types/dist/product-network.js
26609
+ /**
26610
+ * Where an engineer build's sandbox may connect to (PRO-2793, part of
26611
+ * PRO-1980).
26612
+ *
26613
+ * The engineer pod's credential gateway is the sandbox's only way out. By
26614
+ * default it lets through a standard list: the public package registries,
26615
+ * toolchain downloads, container registries, GitHub for reading public
26616
+ * dependencies, and the tenant's own registries. A product adds to that:
26617
+ *
26618
+ * - `allowlist` (the default, also what `null` means): the standard list plus
26619
+ * the product's own `networkHosts`.
26620
+ * - `unrestricted`: any public host. For a product whose builds need hosts
26621
+ * nobody can list in advance; the gateway still refuses private and
26622
+ * metadata addresses, and still never hands the sandbox a credential.
26623
+ *
26624
+ * A host is one exact name (`api.example.com`). There are no wildcards: a
26625
+ * wildcard over a multi-label public suffix (`*.co.uk`) or a provider's
26626
+ * namespace would admit every tenant under it, and telling those apart needs
26627
+ * the public suffix list. A build that needs many names under one domain is
26628
+ * what `unrestricted` is for.
26629
+ */
26630
+ const PRODUCT_NETWORK_ACCESS = ["allowlist", "unrestricted"];
26631
+ /**
26632
+ * A host a product may add: lowercase DNS labels, at least two, ending in a
26633
+ * letter label. No wildcard, scheme, port, path or IP literal.
26634
+ */
26635
+ const PRODUCT_NETWORK_HOST_PATTERN = /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z0-9-]{0,61}[a-z0-9]$/;
26636
+ /**
26637
+ * Domains where anyone can host content under their own name: a bucket, an
26638
+ * app, a tunnel. Listing one whole would let a prompt injection send code to
26639
+ * a bucket the attacker made, the way the gateway's standard list never lists
26640
+ * a shared CDN whole. A specific name under one (`my-bucket.s3.amazonaws.com`)
26641
+ * is fine.
26642
+ */
26643
+ const SHARED_HOSTING_DOMAINS = [
26644
+ "amazonaws.com",
26645
+ "s3.amazonaws.com",
26646
+ "cloudfront.net",
26647
+ "googleapis.com",
26648
+ "storage.googleapis.com",
26649
+ "appspot.com",
26650
+ "firebaseapp.com",
26651
+ "web.app",
26652
+ "blob.core.windows.net",
26653
+ "azureedge.net",
26654
+ "azurewebsites.net",
26655
+ "githubusercontent.com",
26656
+ "github.io",
26657
+ "herokuapp.com",
26658
+ "vercel.app",
26659
+ "netlify.app",
26660
+ "pages.dev",
26661
+ "workers.dev",
26662
+ "trycloudflare.com",
26663
+ "ngrok.io",
26664
+ "ngrok-free.app",
26665
+ "onrender.com",
26666
+ "fly.dev"
26667
+ ];
26668
+ /** Whether `host` has the shape of a host a product may list. */
26669
+ function isProductNetworkHost(host) {
26670
+ return PRODUCT_NETWORK_HOST_PATTERN.test(host);
26671
+ }
26672
+ /** Whether `host` is a domain anyone can host content on, listed whole. */
26673
+ function isSharedHostingDomain(host) {
26674
+ return SHARED_HOSTING_DOMAINS.includes(host);
26675
+ }
26676
+ strictObject({});
26677
+ const uuid = string$2().uuid();
26678
+ const sha256 = string$2().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex characters");
26679
+ object({ jobId: string$2() });
26680
+ /** An upload's grant: a presigned PUT to staging and the headers it signed. */
26681
+ const uploadGrant = object({
26682
+ id: string$2(),
26683
+ url: string$2(),
26684
+ headers: record(string$2(), string$2()),
26685
+ expiresAt: string$2()
26686
+ });
26687
+ object({ version: number$1().int().min(1) });
26688
+ /** The uploads a product's move could not re-file, named while they fit the answer (PRO-3497). */
26689
+ const failedDocuments = array(object({
26690
+ id: string$2(),
26691
+ fileName: string$2(),
26692
+ error: string$2()
26693
+ }));
26694
+ object({
26695
+ backlogItemId: string$2(),
26696
+ divergenceCount: number$1(),
26697
+ created: boolean()
26698
+ });
26699
+ /** The options of a policy fix: build it once planned, and refuse it when the violation was fixed since. */
26700
+ const policyFixOptions = {
26701
+ autoBuild: boolean().optional(),
26702
+ refuseIfFixedSinceAssessment: boolean().optional()
26703
+ };
26704
+ object({
26705
+ findings: number$1(),
26706
+ findingIds: array(string$2()).nullable()
26707
+ });
26708
+ /** An ignore's expiry, when it has one, is in the future. */
26709
+ const expiresInFuture = (expiresAt) => !expiresAt || new Date(expiresAt).getTime() > Date.now();
26710
+ const EXPIRY_IN_FUTURE = {
26711
+ message: "The ignore expiry must be in the future.",
26712
+ path: ["ignoreExpiresAt"]
26713
+ };
26714
+ const ignoreNote = string$2().trim().max(280).nullish();
26715
+ const ignoreExpiresAt = string$2().datetime({ offset: true }).nullish();
26716
+ const productDocumentType = _enum([...PRODUCT_DOCUMENT_TYPES, LEGACY_PRODUCT_INSTRUCTIONS_TYPE]).transform((type) => type === "project_instructions" ? "product_instructions" : type);
26717
+ const customDocumentStatus = _enum(CUSTOM_DOCUMENT_STATUSES);
26718
+ const cloudPreferences = object({
26719
+ iacTool: _enum([
26720
+ "terraform",
26721
+ "pulumi",
26722
+ "cdk",
26723
+ "none"
26724
+ ]).nullable().optional(),
26725
+ stateBackend: _enum([
26726
+ "aws-s3",
26727
+ "gcs",
26728
+ "azurerm",
26729
+ "tfcloud",
26730
+ "other"
26731
+ ]).nullable().optional(),
26732
+ ciSystem: _enum([
26733
+ "github-actions",
26734
+ "gitlab-ci",
26735
+ "circleci",
26736
+ "jenkins",
26737
+ "other"
26738
+ ]).nullable().optional(),
26739
+ authMethod: _enum([
26740
+ "oidc",
26741
+ "static-keys",
26742
+ "unknown"
26743
+ ]).optional(),
26744
+ accountIsolation: _enum([
26745
+ "per-env",
26746
+ "shared",
26747
+ "unknown"
26748
+ ]).optional()
26749
+ }).optional();
26750
+ const cloudBestPractices = object({
26751
+ dedicatedAccount: boolean().optional(),
26752
+ oidcAuth: boolean().optional(),
26753
+ regionMatchesPolicy: boolean().optional(),
26754
+ stateInSameAccount: boolean().optional()
26755
+ }).optional();
26756
+ const cloudProviderConfig = discriminatedUnion("provider", [
26757
+ object({
26758
+ provider: literal("aws"),
26759
+ accountId: string$2().regex(/^\d{12}$/, "AWS account ID must be 12 digits").optional(),
26760
+ region: string$2().min(1),
26761
+ preferences: cloudPreferences,
26762
+ bestPractices: cloudBestPractices
26763
+ }),
26764
+ object({
26765
+ provider: literal("gcp"),
26766
+ projectId: string$2().regex(/^[a-z][a-z0-9-]{4,28}[a-z0-9]$/, "Invalid GCP project ID").optional(),
26767
+ region: string$2().min(1),
26768
+ preferences: cloudPreferences,
26769
+ bestPractices: cloudBestPractices
26770
+ }),
26771
+ object({
26772
+ provider: literal("azure"),
26773
+ subscriptionId: string$2().uuid("Azure subscription ID must be a UUID").optional(),
26774
+ tenantId: string$2().uuid("Azure tenant ID must be a UUID").optional(),
26775
+ region: string$2().min(1),
26776
+ preferences: cloudPreferences,
26777
+ bestPractices: cloudBestPractices
26778
+ }),
26779
+ object({
26780
+ provider: literal("upcloud"),
26781
+ zone: string$2().min(1),
26782
+ username: string$2().min(1).optional(),
26783
+ authMethod: _enum(["password", "token"]).optional(),
26784
+ preferences: cloudPreferences,
26785
+ bestPractices: cloudBestPractices
26786
+ })
26787
+ ]);
26788
+ const columnIndex = number$1().int().min(1).max(EXCEL_MAX_COLUMN);
26789
+ const sheetMap = object({
26790
+ sheetName: string$2().min(1).max(120),
26791
+ idColumn: columnIndex,
26792
+ questionColumn: columnIndex,
26793
+ detailColumns: array(columnIndex).max(20).optional(),
26794
+ sectionColumn: columnIndex.optional(),
26795
+ answerColumn: columnIndex,
26796
+ justificationColumn: columnIndex.optional(),
26797
+ firstDataRow: number$1().int().min(1).max(EXCEL_MAX_ROW)
26798
+ });
26799
+ const answerValue = string$2().trim().min(1).max(64);
26800
+ const justification = string$2().trim().max(2e3);
26801
+ const notApplicableReason = string$2().trim().min(1).max(1200);
26802
+ strictObject({ comment: string$2().trim().min(1).max(PLAN_REJECTION_COMMENT_MAX_CHARS) });
26803
+ strictObject({ expectedRunId: uuid.optional() }), strictObject({ force: boolean().optional() });
26804
+ strictObject({
26805
+ notes: string$2().trim().min(1).max(CHANGE_REQUEST_MAX_CHARS),
26806
+ /** Show the revised plan before the run continues (PRO-3164). */
26807
+ reviewPlan: boolean().optional(),
26808
+ /** The repository whose pull request should change, by its full name, for a run in several (PRO-3346). */
26809
+ repository: string$2().trim().min(1).max(255).optional()
26810
+ }), object({ steer: _enum([
26811
+ "replanning",
26812
+ "after_step",
26813
+ "after_round",
26814
+ "held"
26815
+ ]).optional() });
26816
+ strictObject({
26817
+ exit: _enum(REQUEST_EXITS),
26818
+ comment: string$2().trim().min(1).max(PLAN_REJECTION_COMMENT_MAX_CHARS).optional(),
26819
+ force: boolean().optional()
26820
+ }).refine((answer) => answer.exit === "reject" === (answer.comment !== void 0), {
26821
+ message: "A rejection takes a comment for the planner, and no other answer takes one.",
26822
+ path: ["comment"]
26823
+ }).refine((answer) => answer.exit === "replan" || answer.force === void 0, {
26824
+ message: "Only Plan again can plan anyway.",
26825
+ path: ["force"]
26826
+ });
26827
+ strictObject({ type: productDocumentType }), object({
26828
+ version: number$1().int().min(1),
26829
+ unknownCitations: object({
26830
+ shown: array(string$2()),
26831
+ count: number$1().int().min(0)
26832
+ })
26833
+ }), strictObject({ type: productDocumentType }), strictObject({ type: productDocumentType }), object({ documentId: string$2().uuid() }), strictObject({
26834
+ githubRepositoryId: uuid.optional(),
26835
+ /** A GitLab project, by the connection whose bot reaches it and GitLab's numeric id (P-PRO-150). */
26836
+ gitlabConnectionId: uuid.optional(),
26837
+ gitlabProjectId: number$1().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
26838
+ provider: _enum(VCS_PROVIDERS).optional().default("github"),
26839
+ repositoryName: string$2().min(1).max(512).optional(),
26840
+ repositoryUrl: string$2().url().max(2048).optional(),
26841
+ repositoryDefaultBranch: string$2().max(255).optional().default("main"),
26842
+ /** The link this one replaces, retired in the same transaction (PRO-2522). */
26843
+ replacesRepositoryId: uuid.optional()
26844
+ }).refine((b) => b.gitlabConnectionId === void 0 === (b.gitlabProjectId === void 0), { message: "gitlabConnectionId and gitlabProjectId go together" }).refine((b) => b.gitlabConnectionId === void 0 || b.githubRepositoryId === void 0, { message: "A link is to a GitHub repository or a GitLab project, not both" }).refine((b) => b.githubRepositoryId === void 0 || linksGitHubAppRepositories(b.provider), { message: "githubRepositoryId is a GitHub repository; provider must be github" }), strictObject({
26845
+ repositoryId: uuid,
26846
+ baseBranch: string$2().trim().min(1).max(255).nullable()
26847
+ }), object({
26848
+ effectiveBranch: string$2(),
26849
+ protection: object({
26850
+ protected: boolean(),
26851
+ requiredStatusChecks: array(string$2()),
26852
+ enforcementLevel: string$2().nullable()
26853
+ }).nullable()
26854
+ }), strictObject({
26855
+ license: string$2().trim().min(1).max(200),
26856
+ ignoreReason: _enum(MAINTENANCE_IGNORE_REASONS),
26857
+ ignoreNote,
26858
+ ignoreExpiresAt
26859
+ }).refine((args) => expiresInFuture(args.ignoreExpiresAt), EXPIRY_IN_FUTURE), strictObject({
26860
+ license: string$2().trim().min(1).max(200),
26861
+ findingIds: array(uuid).min(1).optional()
26862
+ }), strictObject({ host: string$2().trim().toLowerCase().refine(isProductNetworkHost, { message: "A host is one exact DNS name, such as api.example.com: no wildcard, scheme, port or path" }).refine((host) => !isSharedHostingDomain(host), { message: "Anyone can host content on this domain, so it cannot be listed whole; list the one host you need under it" }) }), strictObject({
26863
+ type: _enum(AGENT_JOB_TYPES),
26864
+ documentType: string$2().max(30).optional(),
26865
+ priority: number$1().int().min(0).max(99).optional(),
26866
+ metadata: record(string$2(), unknown$1()).optional(),
26867
+ /** Which implementation should serve it (PRO-1332): a request the server may refuse. */
26868
+ runtime: _enum(AGENT_RUNTIMES).optional()
26869
+ }), strictObject({
26870
+ fileName: string$2().trim().min(1).max(1024),
26871
+ sizeBytes: number$1().int().nonnegative(),
26872
+ sha256
26873
+ }), object({ upload: uploadGrant }), strictObject({ uploadId: uuid }), object({
26874
+ questionnaireId: string$2(),
26875
+ jobId: string$2()
26876
+ }), strictObject({ mode: _enum(["generate", "republish"]).default("generate") }), strictObject({ docTypes: array(_enum(REALITY_DERIVED_DOCUMENT_TYPES)).min(1).max(REALITY_DERIVED_DOCUMENT_TYPES.length).optional() }), object({ jobIds: array(string$2()) }), object({ cancelledJobIds: array(string$2()) }), strictObject({
26877
+ factoryId: uuid,
26878
+ stopLine: boolean().optional()
26879
+ }), object({
26880
+ changed: boolean(),
26881
+ previousFactoryId: string$2().nullable(),
26882
+ lineStopped: boolean(),
26883
+ failedDocuments,
26884
+ /** How many uploads kept the old factory; null while not known, never read as none. */
26885
+ failedCount: number$1().int().min(0).nullable()
26886
+ }), strictObject({ documentIds: array(uuid).min(1).max(100).optional() }), object({
26887
+ rescopedCount: number$1().int().min(0).nullable(),
26888
+ failedDocuments,
26889
+ failedCount: number$1().int().min(0).nullable()
26890
+ }), strictObject({ repositoryId: uuid }), strictObject({
26891
+ ecosystem: string$2().min(1).max(50),
26892
+ packageName: string$2().min(1).max(255),
26893
+ /** The installed version, for a package resolved at several in a monorepo. */
26894
+ currentVersion: string$2().min(1).max(100).nullish(),
26895
+ /** The linked repository the group belongs to: a fix touches one. */
26896
+ productRepositoryId: uuid.nullish(),
26897
+ /** Build the fix as soon as it is planned (PRO-949). */
26898
+ autoBuild: boolean().optional()
26899
+ }), object({
26900
+ backlogItemId: string$2(),
26901
+ findingCount: number$1()
26902
+ }), strictObject({
26903
+ ...policyFixOptions,
26904
+ controlId: string$2().min(1).max(40)
26905
+ }), strictObject({ environments: array(string$2()).default(["development"]) }), strictObject({
26906
+ connection: object({
26907
+ name: string$2().min(1).max(150),
26908
+ provider: _enum(CLOUD_PROVIDERS),
26909
+ providerConfig: cloudProviderConfig
26910
+ }).refine((connection) => connection.provider === connection.providerConfig.provider, {
26911
+ message: "connection.provider must match connection.providerConfig.provider",
26912
+ path: ["providerConfig", "provider"]
26913
+ }),
26914
+ environment: object({
26915
+ name: string$2().min(1).max(100),
26916
+ slug: string$2().min(1).max(63).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "Slug must be lowercase letters, digits, and dashes"),
26917
+ type: _enum(ENVIRONMENT_TYPES),
26918
+ ordinal: number$1().int().min(0).default(0),
26919
+ isProtected: boolean().default(false)
26920
+ }).optional()
26921
+ });
26922
+ object({
26923
+ status: customDocumentStatus.nullable(),
26924
+ /** The retry itself threw; absent when it went through. */
26925
+ error: string$2().optional()
26926
+ });
26927
+ strictObject({ type: _enum([...FACTORY_DOCUMENT_TYPES, LEGACY_FACTORY_INSTRUCTIONS_TYPE]).transform((type) => type === "team_instructions" ? FACTORY_INSTRUCTIONS_TYPE : type) });
26928
+ strictObject({ type: _enum(TENANT_DOCUMENT_TYPES) }), strictObject({
26929
+ name: string$2().min(1).max(50),
26930
+ action: _enum(["accept", "decline"])
26931
+ }), object({
26932
+ applied: _enum([
26933
+ "draft",
26934
+ "published",
26935
+ "declined"
26936
+ ]),
26937
+ version: number$1().int().nullable()
26938
+ }), strictObject({
26939
+ fileName: string$2().trim().min(1).max(255),
26940
+ mime: string$2().min(1).max(255),
26941
+ sizeBytes: number$1().int().positive(),
26942
+ sha256,
26943
+ factoryId: string$2().optional(),
26944
+ productId: string$2().optional(),
26945
+ origin: string$2().optional()
26946
+ }), discriminatedUnion("deduplicated", [object({
26947
+ deduplicated: literal(true),
26948
+ documentId: string$2(),
26949
+ factoryId: string$2().nullable(),
26950
+ status: customDocumentStatus
26951
+ }), object({
26952
+ deduplicated: literal(false),
26953
+ upload: uploadGrant
26954
+ })]), strictObject({ uploadId: uuid }), object({
26955
+ documentId: string$2(),
26956
+ factoryId: string$2().nullable(),
26957
+ deduplicated: boolean(),
26958
+ status: customDocumentStatus.nullable(),
26959
+ /** Filing it threw; absent when it went through. */
26960
+ error: string$2().optional()
26961
+ }), strictObject({ ids: array(uuid).min(1).max(100) }), object({
26962
+ failedIds: array(string$2()).nullable(),
26963
+ deletedIds: array(string$2()).optional()
26964
+ }), strictObject({ ids: array(uuid).min(1).max(25) }), object({ referenced: array(string$2()) }), strictObject({
26965
+ approve: array(string$2().min(1).max(100)).max(200).default([]),
26966
+ remove: array(string$2().min(1).max(100)).max(200).default([])
26967
+ }).refine((b) => b.approve.length + b.remove.length > 0, { message: "Name a license to approve or remove" }), object({ version: number$1().nullable() });
26968
+ strictObject({
26969
+ ignoreReason: _enum(MAINTENANCE_IGNORE_REASONS),
26970
+ ignoreNote,
26971
+ ignoreExpiresAt
26972
+ }).refine((args) => expiresInFuture(args.ignoreExpiresAt), EXPIRY_IN_FUTURE), strictObject({ autoBuild: boolean().optional() }), object({ backlogItemId: string$2() });
26973
+ strictObject(policyFixOptions);
26974
+ strictObject({ tier: _enum([
26975
+ "development",
26976
+ "staging",
26977
+ "production"
26978
+ ]) });
26979
+ object({
26980
+ url: string$2().url(),
26981
+ expiresAt: string$2(),
26982
+ written: number$1(),
26983
+ unwrittenCount: number$1(),
26984
+ summary: object({
26985
+ byTaiga: number$1(),
26986
+ byYou: number$1(),
26987
+ notApplicable: number$1(),
26988
+ blank: number$1()
26989
+ })
26990
+ }), strictObject({
26991
+ columnMap: object({ sheets: array(sheetMap).min(1).max(50) }),
26992
+ answerVocabulary: array(string$2().min(1).max(64)).max(16).nullable().optional(),
26993
+ answerLegend: string$2().max(4e3).nullable().optional()
26994
+ }), object({
26995
+ imported: number$1(),
26996
+ skippedRows: number$1()
26997
+ });
26998
+ discriminatedUnion("action", [
26999
+ strictObject({ action: literal("accept") }),
27000
+ strictObject({ action: literal("reject") }),
27001
+ strictObject({
27002
+ action: literal("edit"),
27003
+ answerValue: answerValue.optional(),
27004
+ justification: justification.optional()
27005
+ }),
27006
+ strictObject({
27007
+ action: literal("answer"),
27008
+ answerValue,
27009
+ justification: justification.optional()
27010
+ }),
27011
+ strictObject({
27012
+ action: literal("not_applicable"),
27013
+ /** The token the form uses for it, when it has one -- `NA`, `N/A`, `es`. */
27014
+ answerValue: answerValue.optional(),
27015
+ reason: notApplicableReason
27016
+ })
27017
+ ]);
27018
+ //#endregion
26439
27019
  //#region ../../packages/types/dist/auto-build.js
26440
27020
  /**
26441
27021
  * Auto-build: the review-plans gate (PRO-1305).
@@ -26520,30 +27100,6 @@ Object.freeze({
26520
27100
  applicationOwnership: true
26521
27101
  });
26522
27102
  //#endregion
26523
- //#region ../../packages/types/dist/product-network.js
26524
- /**
26525
- * Where an engineer build's sandbox may connect to (PRO-2793, part of
26526
- * PRO-1980).
26527
- *
26528
- * The engineer pod's credential gateway is the sandbox's only way out. By
26529
- * default it lets through a standard list: the public package registries,
26530
- * toolchain downloads, container registries, GitHub for reading public
26531
- * dependencies, and the tenant's own registries. A product adds to that:
26532
- *
26533
- * - `allowlist` (the default, also what `null` means): the standard list plus
26534
- * the product's own `networkHosts`.
26535
- * - `unrestricted`: any public host. For a product whose builds need hosts
26536
- * nobody can list in advance; the gateway still refuses private and
26537
- * metadata addresses, and still never hands the sandbox a credential.
26538
- *
26539
- * A host is one exact name (`api.example.com`). There are no wildcards: a
26540
- * wildcard over a multi-label public suffix (`*.co.uk`) or a provider's
26541
- * namespace would admit every tenant under it, and telling those apart needs
26542
- * the public suffix list. A build that needs many names under one domain is
26543
- * what `unrestricted` is for.
26544
- */
26545
- const PRODUCT_NETWORK_ACCESS = ["allowlist", "unrestricted"];
26546
- //#endregion
26547
27103
  //#region src/compat.ts
26548
27104
  /**
26549
27105
  * Why this server should not serve the API it reached, or null when it may
@@ -26664,6 +27220,39 @@ const TOOLSET_OF = {
26664
27220
  taiga_retry_knowledge: "documents"
26665
27221
  };
26666
27222
  /**
27223
+ * Deliver & Operate's tools (PRO-3834): initiatives, plans, runs and the line, fixes, environments, deployments,
27224
+ * monitoring and delivery metrics. An organization whose plan refuses delivery work does not see them, as its web app
27225
+ * shows none of their views; the API says which (`deliveryIncluded` at introspection), so the plan, not the key,
27226
+ * decides. Fixing a finding plans and builds, so it goes with them.
27227
+ */
27228
+ const DELIVERY_TOOLS = /* @__PURE__ */ new Set([
27229
+ "taiga_list_initiatives",
27230
+ "taiga_get_initiative",
27231
+ "taiga_get_plan",
27232
+ "taiga_list_runs",
27233
+ "taiga_get_run",
27234
+ "taiga_get_line",
27235
+ "taiga_queue_initiative",
27236
+ "taiga_move_initiative",
27237
+ "taiga_review_plan",
27238
+ "taiga_plan_again",
27239
+ "taiga_resume_initiative",
27240
+ "taiga_stop_run",
27241
+ "taiga_request_changes",
27242
+ "taiga_request_initiatives",
27243
+ "taiga_fix_finding",
27244
+ "taiga_fix_policy_violation",
27245
+ "taiga_set_auto_build",
27246
+ "taiga_set_auto_merge",
27247
+ "taiga_pause_line",
27248
+ "taiga_create_environment",
27249
+ "taiga_update_environment",
27250
+ "taiga_get_deployments",
27251
+ "taiga_get_monitoring",
27252
+ "taiga_get_delivery_metrics",
27253
+ "taiga_sync_design_tokens"
27254
+ ]);
27255
+ /**
26667
27256
  * TAIGA_TOOLSETS as written: comma-separated names, or "all"; a name it does not know is said, not ignored, and so
26668
27257
  * is a value that names none.
26669
27258
  */
@@ -26894,7 +27483,7 @@ function setupNextStep(product) {
26894
27483
  if (isImportedProduct(product)) switch (importStatusOf(product)) {
26895
27484
  case "analyzing":
26896
27485
  case "generating_docs": return `The import is running and derives the documents from the code (taiga_wait (jobId) follows its job). Then review them, and ${FINISH_DISCOVERY}`;
26897
- case "complete": return "The import is done: review the reality documents (taiga_get_product_document without type), then taiga_finish_discovery opens the product and starts planning its first initiatives (paid agent work: ask the person first).";
27486
+ case "complete": return "The import is done: review the reality documents (taiga_get_product_document without type), then " + FINISH_DISCOVERY;
26898
27487
  case "failed":
26899
27488
  case "cancelled": return "The last import did not finish: taiga_start_import runs it again.";
26900
27489
  default: return "Link its repository if it has none (taiga_list_linkable_repositories, taiga_link_repository), then taiga_start_import: the import derives the documents from the code and runs by itself.";
@@ -27590,11 +28179,25 @@ function withFixability(row) {
27590
28179
  if (dependency && !row["recommendedVersion"] && row["remediableBy"] === "coding_agent") return {
27591
28180
  ...row,
27592
28181
  fixable: false,
27593
- fixNote: "No fixed version is known yet: taiga_fix_finding refuses it until one is published."
28182
+ fixNote: noVersionNote(row["data"])
27594
28183
  };
27595
28184
  return row;
27596
28185
  }
27597
28186
  /**
28187
+ * Why a dependency has no version to move to. A language runtime declared as
28188
+ * a container image moves only to a release the image has published
28189
+ * (PRO-3729), so its vendor's fix can be out while Fix is refused: the
28190
+ * finding's runtime data says so where the row carries it (taiga_get_finding).
28191
+ */
28192
+ function noVersionNote(data) {
28193
+ const runtime = data?.runtime;
28194
+ const fixedIn = typeof runtime?.["fixedIn"] === "string" ? runtime["fixedIn"] : null;
28195
+ if (fixedIn) return `Fixed in ${fixedIn}, but there is no release to move to yet: the image the repository declares has not published it, or, where the line has ended, a supported line (the summary says which). taiga_fix_finding refuses it until there is one.`;
28196
+ if (runtime && (typeof runtime["newest"] === "string" || "endOfLife" in runtime)) return "A newer release is out, but the image the repository declares has not published one to move to yet (the summary names the image): taiga_fix_finding refuses it until it does.";
28197
+ if (runtime) return "No fixed release is known yet, or, where the line has ended, the image the repository declares has not published a supported line (the summary says which): taiga_fix_finding refuses it until there is one.";
28198
+ return "No version to move to yet: no fixed version is known, or for a language runtime the image the repository declares has not published one (taiga_get_finding says which). taiga_fix_finding refuses it until there is one.";
28199
+ }
28200
+ /**
27598
28201
  * Dev-only, runtime or unknown, said on a dependency row (PRO-2861) in place of the raw per-lockfile groups
27599
28202
  * the API carries: the groups need the lockfile name to read, which `dependencyScope` does once here.
27600
28203
  */
@@ -27990,7 +28593,7 @@ function registerMaintenanceTools(server, client) {
27990
28593
  }));
27991
28594
  server.registerTool("taiga_fix_finding", {
27992
28595
  title: "Fix a finding",
27993
- description: "Raise an initiative that fixes a finding; it ends in a pull request, which merges on its own only where the product's auto-merge allows it. wholeGroup: true fixes, in that repository, every open advisory on that package version in one bump, or every place the rule flagged. A malicious package is removed, with every advisory on that version, whatever wholeGroup says. Refused when no fixed version is known (fixable: false), the code is in a submodule, or a secret is only in history (rotate it outside Taiga).",
28596
+ description: "Raise an initiative that fixes a finding; it ends in a pull request, which merges on its own only where the product's auto-merge allows it. wholeGroup: true fixes, in that repository, every open advisory on that package version in one bump, or every place the rule flagged. A malicious package is removed, with every advisory on that version, whatever wholeGroup says. A language runtime moves every file declaring it together, in a container image only to a tag the image has published. Refused when there is no version to move to (fixable: false; for a runtime, also while its image has not published the fix), the code is in a submodule, or a secret is only in history (rotate it outside Taiga).",
27994
28597
  inputSchema: object({
27995
28598
  productId,
27996
28599
  findingId,
@@ -48338,6 +48941,7 @@ function withStrictInputs(server, client, registered, toolsets, left) {
48338
48941
  const inputs = /* @__PURE__ */ new Map();
48339
48942
  const register = server.registerTool.bind(server);
48340
48943
  server.registerTool = ((name, config, callback) => {
48944
+ if (DELIVERY_TOOLS.has(name) && client.getIntrospection()?.deliveryIncluded === false) return void 0;
48341
48945
  const toolset = TOOLSET_OF[name];
48342
48946
  if (name !== "taiga_whoami") {
48343
48947
  if (!toolset) throw new Error(`Tool ${name}: no toolset in toolsets.ts`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taiga-ai/mcp-server",
3
- "version": "0.36.0-rc.778",
3
+ "version": "0.36.0-rc.800",
4
4
  "description": "Taiga for AI coding assistants: read products, policies, initiatives and runs, and operate the line, over MCP",
5
5
  "mcpName": "ga.tai/mcp-server",
6
6
  "license": "UNLICENSED",