@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.
- package/dist/index.js +638 -34
- 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
|
-
|
|
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
|
|
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: "
|
|
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
|
|
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.
|
|
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",
|