@taiga-ai/mcp-server 0.37.0-dev.974 → 0.37.0-dev.976

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 +45 -15
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -23883,6 +23883,10 @@ var TaigaClient = class {
23883
23883
  async listBuildRunSteps(id) {
23884
23884
  return this.request("GET", `/builds/${seg(id)}/steps`);
23885
23885
  }
23886
+ /** The public hosts the run reached through the egress gateway (PRO-4268). */
23887
+ async listBuildRunEgressHosts(id) {
23888
+ return this.request("GET", `/builds/${seg(id)}/hosts`);
23889
+ }
23886
23890
  async getMaintenanceSummary(productId) {
23887
23891
  return this.request("GET", `/products/${seg(productId)}/maintenance/summary`);
23888
23892
  }
@@ -27218,16 +27222,18 @@ const EXCEL_MAX_ROW = 1048576;
27218
27222
  * Where an engineer build's sandbox may connect to (PRO-2793, part of
27219
27223
  * PRO-1980).
27220
27224
  *
27221
- * The engineer pod's credential gateway is the sandbox's only way out. By
27222
- * default it lets through a standard list: the public package registries,
27223
- * toolchain downloads, container registries, GitHub for reading public
27224
- * dependencies, and the tenant's own registries. A product adds to that:
27225
+ * The egress gateway is the sandbox's only way out for what the other
27226
+ * gateways do not carry (packages, images, toolchains, scanners). Reads are
27227
+ * open and writes are controlled (PRO-4266): every run is held to an upload
27228
+ * budget, the gateway refuses private and metadata addresses, and it never
27229
+ * hands the sandbox a credential, whichever access a product has.
27225
27230
  *
27226
- * - `allowlist` (the default, also what `null` means): the standard list plus
27227
- * the product's own `networkHosts`.
27228
- * - `unrestricted`: any public host. For a product whose builds need hosts
27229
- * nobody can list in advance; the gateway still refuses private and
27230
- * metadata addresses, and still never hands the sandbox a credential.
27231
+ * - `unrestricted` (the default, also what `null` means): any public host.
27232
+ * A list of hosts nobody can keep complete broke builds one host at a time.
27233
+ * - `allowlist`: only the gateway's standard list (the public package
27234
+ * registries, toolchain downloads, container registries, GitHub for public
27235
+ * dependencies, the tenant's own registries) plus the product's own
27236
+ * `networkHosts`. For a product that wants to name where its builds go.
27231
27237
  *
27232
27238
  * A host is one exact name (`api.example.com`). There are no wildcards: a
27233
27239
  * wildcard over a multi-label public suffix (`*.co.uk`) or a provider's
@@ -35739,7 +35745,7 @@ const PRODUCT_VIEW_FIELDS = [
35739
35745
  "createdAt",
35740
35746
  "updatedAt"
35741
35747
  ];
35742
- const UNSET_MEANS = "A null setting is unset: kind reads as application; autoMerge follows the factory, then the organization; ownsInfrastructure and ownsDeployment follow the organization default (yes when it has none); ownsApplication is yes; emitDesignStandards follows how the product started; networkAccess is allowlist. signalAutonomy is what each kind of finding resolves to (off, notify, propose, build, merge) and what decided it: the product, the kind default or cap, or auto-merge consent. dailyFixLimit is how many fixes Taiga may raise on its own per day, set by the product or the starting value (setBy default).";
35748
+ const UNSET_MEANS = "A null setting is unset: kind reads as application; autoMerge follows the factory, then the organization; ownsInfrastructure and ownsDeployment follow the organization default (yes when it has none); ownsApplication is yes; emitDesignStandards follows how the product started; networkAccess is unrestricted. signalAutonomy is what each kind of finding resolves to (off, notify, propose, build, merge) and what decided it: the product, the kind default or cap, or auto-merge consent. dailyFixLimit is how many fixes Taiga may raise on its own per day, set by the product or the starting value (setBy default).";
35743
35749
  /**
35744
35750
  * Each product's policy standing beside its row: the counts the standing read opens with. A product still in setup
35745
35751
  * has none to read; a read the API refuses or fails says so on its row rather than failing the list.
@@ -37214,14 +37220,21 @@ function registerBuildTools(server, client) {
37214
37220
  }));
37215
37221
  server.registerTool("taiga_get_run", {
37216
37222
  title: "Get run",
37217
- description: "Read one coding agent run, and why it failed when it did: its outcome, pull request, security pass (scanCoverage names scanners that did not run) and each step with its commit, files and checks. A failed run says where it stopped (stoppedIn) and the line of the error that says why (cause). full: true adds every step's instructions and report. lastReplan says what a request for changes did to the plan the run builds now: the steps it added, edited and dropped. A failed or stopped run's nextStep says how to carry it on (taiga_resume_initiative on its initiative).",
37223
+ description: "Read one coding agent run, and why it failed when it did: its outcome, pull request, security pass (scanCoverage names scanners that did not run) and each step with its commit, files and checks. A failed run says where it stopped (stoppedIn) and the line of the error that says why (cause). full: true adds every step's instructions and report. lastReplan says what a request for changes did to the plan the run builds now: the steps it added, edited and dropped. A failed or stopped run's nextStep says how to carry it on (taiga_resume_initiative on its initiative). hostsReached lists the public hosts the run reached through the egress gateway, first reached first, with the bytes it sent and received there.",
37218
37224
  inputSchema: object({
37219
37225
  runId,
37220
37226
  full: boolean().optional().describe("Carry each step's complete instructions and report (default false: a summary)")
37221
37227
  }),
37222
37228
  annotations: READ_ONLY
37223
37229
  }, (params) => runTool(async () => {
37224
- const [run, steps] = await Promise.all([client.getBuildRun(params.runId), client.listBuildRunSteps(params.runId)]);
37230
+ const [run, steps, hosts] = await Promise.all([
37231
+ client.getBuildRun(params.runId),
37232
+ client.listBuildRunSteps(params.runId),
37233
+ client.listBuildRunEgressHosts(params.runId).catch((error) => {
37234
+ if (error instanceof TaigaApiError && error.status === 404) return { data: [] };
37235
+ throw error;
37236
+ })
37237
+ ]);
37225
37238
  const runRow = run.data;
37226
37239
  const rows = steps.data.map((step) => neverStarted(step));
37227
37240
  const where = stoppedIn(runRow, rows);
@@ -37239,7 +37252,8 @@ function registerBuildTools(server, client) {
37239
37252
  ...lastReplan ? { lastReplan: {
37240
37253
  ...lastReplan,
37241
37254
  waitsForReview
37242
- } } : {}
37255
+ } } : {},
37256
+ ...hostsReachedOf(hosts.data)
37243
37257
  };
37244
37258
  const note = verificationNote(rows);
37245
37259
  const verification = note ? { verificationNote: note } : {};
@@ -37299,6 +37313,22 @@ function steerSituation(steer) {
37299
37313
  if (steer === "after_round") return "The run is answering review comments or fixing CI; the request is planned when that round ends, and no further automatic round starts while it is open.";
37300
37314
  return "A re-plan is already running; the request joins it.";
37301
37315
  }
37316
+ /** At most this many hosts in a run's read; the rest are counted. */
37317
+ const HOSTS_REACHED_SHOWN = 50;
37318
+ /** Where a run went (PRO-4268): its hosts, first reached first, or nothing for a run that reached none. */
37319
+ function hostsReachedOf(hosts) {
37320
+ if (hosts.length === 0) return {};
37321
+ const shown = hosts.slice(0, HOSTS_REACHED_SHOWN).map(({ host, sentBytes, receivedBytes, connections }) => ({
37322
+ host,
37323
+ sentBytes,
37324
+ receivedBytes,
37325
+ connections
37326
+ }));
37327
+ return {
37328
+ hostsReached: shown,
37329
+ ...hosts.length > shown.length ? { hostsReachedNotShown: hosts.length - shown.length } : {}
37330
+ };
37331
+ }
37302
37332
  //#endregion
37303
37333
  //#region src/tools/queue.ts
37304
37334
  /** How many entries the read names; past this an entry keeps its initiativeId only. */
@@ -55425,7 +55455,7 @@ function registerSetupTools(server, client) {
55425
55455
  }));
55426
55456
  server.registerTool("taiga_update_product", {
55427
55457
  title: "Change a product's settings",
55428
- description: "Change a product's name, what Taiga builds for it (application, infrastructure, pipelines), or where its builds may connect (networkAccess: allowlist, Taiga's standard list plus the product's networkHosts, or unrestricted, any public host; networkHosts replaces the list, each one exact DNS name, no wildcard or domain anyone can host on, 100 at most; changes apply from the next build). A new name changes its slug. Later plans follow the change; planned work is not redone.",
55458
+ description: "Change a product's name, what Taiga builds for it (application, infrastructure, pipelines), or where its builds may connect (networkAccess: unrestricted, any public host, the default; or allowlist, Taiga's standard list plus the product's networkHosts; networkHosts replaces the list, each one exact DNS name, no wildcard or domain anyone can host on, 100 at most; changes apply from the next build). A new name changes its slug. Later plans follow the change; planned work is not redone.",
55429
55459
  inputSchema: object({
55430
55460
  productId,
55431
55461
  name: string$2().trim().min(1).max(255).optional().describe("A new name"),
@@ -55433,7 +55463,7 @@ function registerSetupTools(server, client) {
55433
55463
  ...buildScope,
55434
55464
  deploymentNotes: deploymentNotes.nullable().optional(),
55435
55465
  emitDesignStandards: boolean().nullable().optional().describe("Inherit the organization's design standards; null follows the default"),
55436
- networkAccess: _enum(PRODUCT_NETWORK_ACCESS).nullable().optional().describe("Where a build's sandbox may connect: allowlist (the default; null returns to it) or unrestricted"),
55466
+ networkAccess: _enum(PRODUCT_NETWORK_ACCESS).nullable().optional().describe("Where a build's sandbox may connect: unrestricted (the default; null returns to it) or allowlist"),
55437
55467
  networkHosts: array(string$2().trim().toLowerCase().min(1).max(253)).max(100).optional().describe("The product's own hosts beyond the standard list, replacing the current ones: exact DNS names such as api.example.com")
55438
55468
  }),
55439
55469
  annotations: OPERATE_SETTING
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taiga-ai/mcp-server",
3
- "version": "0.37.0-dev.974",
3
+ "version": "0.37.0-dev.976",
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",