@treeseed/sdk 0.13.0-rc.75 → 0.13.0-rc.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"completedAt":"2026-09-
|
|
1
|
+
{"completedAt":"2026-09-02T05:04:54.660Z"}
|
|
@@ -1493,12 +1493,175 @@ export declare const hostedTopologyRollbackApprovalSchema: z.ZodObject<{
|
|
|
1493
1493
|
approvedAt: string;
|
|
1494
1494
|
rollbackDigest: string;
|
|
1495
1495
|
}>;
|
|
1496
|
+
export declare const hostedTopologyRollbackExecutionSchema: z.ZodEffects<z.ZodObject<{
|
|
1497
|
+
schemaVersion: z.ZodLiteral<"treeseed.hosted-topology-rollback-execution/v1">;
|
|
1498
|
+
rollback: z.ZodObject<{
|
|
1499
|
+
schemaVersion: z.ZodLiteral<"treeseed.hosted-topology-rollback/v1">;
|
|
1500
|
+
rollbackId: z.ZodString;
|
|
1501
|
+
sourceReceiptId: z.ZodString;
|
|
1502
|
+
environment: z.ZodEnum<["staging", "production"]>;
|
|
1503
|
+
operations: z.ZodArray<z.ZodObject<{
|
|
1504
|
+
resourceId: z.ZodString;
|
|
1505
|
+
action: z.ZodEnum<["restore", "delete-created", "noop"]>;
|
|
1506
|
+
providerResourceId: z.ZodString;
|
|
1507
|
+
targetDigest: z.ZodNullable<z.ZodString>;
|
|
1508
|
+
}, "strict", z.ZodTypeAny, {
|
|
1509
|
+
action: "noop" | "restore" | "delete-created";
|
|
1510
|
+
resourceId: string;
|
|
1511
|
+
providerResourceId: string;
|
|
1512
|
+
targetDigest: string | null;
|
|
1513
|
+
}, {
|
|
1514
|
+
action: "noop" | "restore" | "delete-created";
|
|
1515
|
+
resourceId: string;
|
|
1516
|
+
providerResourceId: string;
|
|
1517
|
+
targetDigest: string | null;
|
|
1518
|
+
}>, "many">;
|
|
1519
|
+
rollbackDigest: z.ZodString;
|
|
1520
|
+
}, "strict", z.ZodTypeAny, {
|
|
1521
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1522
|
+
environment: "production" | "staging";
|
|
1523
|
+
operations: {
|
|
1524
|
+
action: "noop" | "restore" | "delete-created";
|
|
1525
|
+
resourceId: string;
|
|
1526
|
+
providerResourceId: string;
|
|
1527
|
+
targetDigest: string | null;
|
|
1528
|
+
}[];
|
|
1529
|
+
rollbackId: string;
|
|
1530
|
+
sourceReceiptId: string;
|
|
1531
|
+
rollbackDigest: string;
|
|
1532
|
+
}, {
|
|
1533
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1534
|
+
environment: "production" | "staging";
|
|
1535
|
+
operations: {
|
|
1536
|
+
action: "noop" | "restore" | "delete-created";
|
|
1537
|
+
resourceId: string;
|
|
1538
|
+
providerResourceId: string;
|
|
1539
|
+
targetDigest: string | null;
|
|
1540
|
+
}[];
|
|
1541
|
+
rollbackId: string;
|
|
1542
|
+
sourceReceiptId: string;
|
|
1543
|
+
rollbackDigest: string;
|
|
1544
|
+
}>;
|
|
1545
|
+
sourceReceiptId: z.ZodString;
|
|
1546
|
+
topologyId: z.ZodString;
|
|
1547
|
+
environment: z.ZodEnum<["staging", "production"]>;
|
|
1548
|
+
sourcePlanDigest: z.ZodString;
|
|
1549
|
+
targetPlanDigest: z.ZodString;
|
|
1550
|
+
executionDigest: z.ZodString;
|
|
1551
|
+
}, "strict", z.ZodTypeAny, {
|
|
1552
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1553
|
+
environment: "production" | "staging";
|
|
1554
|
+
rollback: {
|
|
1555
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1556
|
+
environment: "production" | "staging";
|
|
1557
|
+
operations: {
|
|
1558
|
+
action: "noop" | "restore" | "delete-created";
|
|
1559
|
+
resourceId: string;
|
|
1560
|
+
providerResourceId: string;
|
|
1561
|
+
targetDigest: string | null;
|
|
1562
|
+
}[];
|
|
1563
|
+
rollbackId: string;
|
|
1564
|
+
sourceReceiptId: string;
|
|
1565
|
+
rollbackDigest: string;
|
|
1566
|
+
};
|
|
1567
|
+
topologyId: string;
|
|
1568
|
+
sourceReceiptId: string;
|
|
1569
|
+
sourcePlanDigest: string;
|
|
1570
|
+
targetPlanDigest: string;
|
|
1571
|
+
executionDigest: string;
|
|
1572
|
+
}, {
|
|
1573
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1574
|
+
environment: "production" | "staging";
|
|
1575
|
+
rollback: {
|
|
1576
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1577
|
+
environment: "production" | "staging";
|
|
1578
|
+
operations: {
|
|
1579
|
+
action: "noop" | "restore" | "delete-created";
|
|
1580
|
+
resourceId: string;
|
|
1581
|
+
providerResourceId: string;
|
|
1582
|
+
targetDigest: string | null;
|
|
1583
|
+
}[];
|
|
1584
|
+
rollbackId: string;
|
|
1585
|
+
sourceReceiptId: string;
|
|
1586
|
+
rollbackDigest: string;
|
|
1587
|
+
};
|
|
1588
|
+
topologyId: string;
|
|
1589
|
+
sourceReceiptId: string;
|
|
1590
|
+
sourcePlanDigest: string;
|
|
1591
|
+
targetPlanDigest: string;
|
|
1592
|
+
executionDigest: string;
|
|
1593
|
+
}>, {
|
|
1594
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1595
|
+
environment: "production" | "staging";
|
|
1596
|
+
rollback: {
|
|
1597
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1598
|
+
environment: "production" | "staging";
|
|
1599
|
+
operations: {
|
|
1600
|
+
action: "noop" | "restore" | "delete-created";
|
|
1601
|
+
resourceId: string;
|
|
1602
|
+
providerResourceId: string;
|
|
1603
|
+
targetDigest: string | null;
|
|
1604
|
+
}[];
|
|
1605
|
+
rollbackId: string;
|
|
1606
|
+
sourceReceiptId: string;
|
|
1607
|
+
rollbackDigest: string;
|
|
1608
|
+
};
|
|
1609
|
+
topologyId: string;
|
|
1610
|
+
sourceReceiptId: string;
|
|
1611
|
+
sourcePlanDigest: string;
|
|
1612
|
+
targetPlanDigest: string;
|
|
1613
|
+
executionDigest: string;
|
|
1614
|
+
}, {
|
|
1615
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1616
|
+
environment: "production" | "staging";
|
|
1617
|
+
rollback: {
|
|
1618
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1619
|
+
environment: "production" | "staging";
|
|
1620
|
+
operations: {
|
|
1621
|
+
action: "noop" | "restore" | "delete-created";
|
|
1622
|
+
resourceId: string;
|
|
1623
|
+
providerResourceId: string;
|
|
1624
|
+
targetDigest: string | null;
|
|
1625
|
+
}[];
|
|
1626
|
+
rollbackId: string;
|
|
1627
|
+
sourceReceiptId: string;
|
|
1628
|
+
rollbackDigest: string;
|
|
1629
|
+
};
|
|
1630
|
+
topologyId: string;
|
|
1631
|
+
sourceReceiptId: string;
|
|
1632
|
+
sourcePlanDigest: string;
|
|
1633
|
+
targetPlanDigest: string;
|
|
1634
|
+
executionDigest: string;
|
|
1635
|
+
}>;
|
|
1636
|
+
export declare const hostedTopologyRollbackExecutionApprovalSchema: z.ZodObject<{
|
|
1637
|
+
schemaVersion: z.ZodLiteral<"treeseed.hosted-topology-rollback-execution-approval/v1">;
|
|
1638
|
+
executionDigest: z.ZodString;
|
|
1639
|
+
environment: z.ZodEnum<["staging", "production"]>;
|
|
1640
|
+
decision: z.ZodLiteral<"approved">;
|
|
1641
|
+
approvedBy: z.ZodString;
|
|
1642
|
+
approvedAt: z.ZodString;
|
|
1643
|
+
}, "strict", z.ZodTypeAny, {
|
|
1644
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution-approval/v1";
|
|
1645
|
+
environment: "production" | "staging";
|
|
1646
|
+
decision: "approved";
|
|
1647
|
+
approvedBy: string;
|
|
1648
|
+
approvedAt: string;
|
|
1649
|
+
executionDigest: string;
|
|
1650
|
+
}, {
|
|
1651
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution-approval/v1";
|
|
1652
|
+
environment: "production" | "staging";
|
|
1653
|
+
decision: "approved";
|
|
1654
|
+
approvedBy: string;
|
|
1655
|
+
approvedAt: string;
|
|
1656
|
+
executionDigest: string;
|
|
1657
|
+
}>;
|
|
1496
1658
|
export type HostedTopologyDeclaration = z.infer<typeof hostedTopologyDeclarationSchema>;
|
|
1497
1659
|
export type HostedResourceObservation = z.infer<typeof hostedResourceObservationSchema>;
|
|
1498
1660
|
export type HostedTopologyPlan = z.infer<typeof hostedTopologyPlanSchema>;
|
|
1499
1661
|
export type HostedTopologyApproval = z.infer<typeof hostedTopologyApprovalSchema>;
|
|
1500
1662
|
export type AuthorizedHostedTopologyPlan = z.infer<typeof authorizedHostedTopologyPlanSchema>;
|
|
1501
1663
|
export type HostedTopologyReceipt = z.infer<typeof hostedTopologyReceiptSchema>;
|
|
1664
|
+
export type HostedTopologyRollbackExecution = z.infer<typeof hostedTopologyRollbackExecutionSchema>;
|
|
1502
1665
|
export declare function planHostedTopology(input: {
|
|
1503
1666
|
declaration: HostedTopologyDeclaration;
|
|
1504
1667
|
observations: HostedResourceObservation[];
|
|
@@ -1547,4 +1710,63 @@ export declare function authorizeHostedTopologyRollback(rollbackInput: z.input<t
|
|
|
1547
1710
|
rollbackDigest: string;
|
|
1548
1711
|
};
|
|
1549
1712
|
};
|
|
1713
|
+
export declare function planHostedTopologyRollbackExecution(input: {
|
|
1714
|
+
rollback: z.input<typeof hostedTopologyRollbackSchema>;
|
|
1715
|
+
sourceReceipt: z.input<typeof hostedTopologyReceiptSchema>;
|
|
1716
|
+
sourcePlan: z.input<typeof hostedTopologyPlanSchema> | z.input<typeof authorizedHostedTopologyPlanSchema>;
|
|
1717
|
+
targetPlan: z.input<typeof hostedTopologyPlanSchema>;
|
|
1718
|
+
}): {
|
|
1719
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1720
|
+
environment: "production" | "staging";
|
|
1721
|
+
rollback: {
|
|
1722
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1723
|
+
environment: "production" | "staging";
|
|
1724
|
+
operations: {
|
|
1725
|
+
action: "noop" | "restore" | "delete-created";
|
|
1726
|
+
resourceId: string;
|
|
1727
|
+
providerResourceId: string;
|
|
1728
|
+
targetDigest: string | null;
|
|
1729
|
+
}[];
|
|
1730
|
+
rollbackId: string;
|
|
1731
|
+
sourceReceiptId: string;
|
|
1732
|
+
rollbackDigest: string;
|
|
1733
|
+
};
|
|
1734
|
+
topologyId: string;
|
|
1735
|
+
sourceReceiptId: string;
|
|
1736
|
+
sourcePlanDigest: string;
|
|
1737
|
+
targetPlanDigest: string;
|
|
1738
|
+
executionDigest: string;
|
|
1739
|
+
};
|
|
1740
|
+
export declare function authorizeHostedTopologyRollbackExecution(executionInput: z.input<typeof hostedTopologyRollbackExecutionSchema>, approvalInput: z.input<typeof hostedTopologyRollbackExecutionApprovalSchema>): {
|
|
1741
|
+
execution: {
|
|
1742
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution/v1";
|
|
1743
|
+
environment: "production" | "staging";
|
|
1744
|
+
rollback: {
|
|
1745
|
+
schemaVersion: "treeseed.hosted-topology-rollback/v1";
|
|
1746
|
+
environment: "production" | "staging";
|
|
1747
|
+
operations: {
|
|
1748
|
+
action: "noop" | "restore" | "delete-created";
|
|
1749
|
+
resourceId: string;
|
|
1750
|
+
providerResourceId: string;
|
|
1751
|
+
targetDigest: string | null;
|
|
1752
|
+
}[];
|
|
1753
|
+
rollbackId: string;
|
|
1754
|
+
sourceReceiptId: string;
|
|
1755
|
+
rollbackDigest: string;
|
|
1756
|
+
};
|
|
1757
|
+
topologyId: string;
|
|
1758
|
+
sourceReceiptId: string;
|
|
1759
|
+
sourcePlanDigest: string;
|
|
1760
|
+
targetPlanDigest: string;
|
|
1761
|
+
executionDigest: string;
|
|
1762
|
+
};
|
|
1763
|
+
approval: {
|
|
1764
|
+
schemaVersion: "treeseed.hosted-topology-rollback-execution-approval/v1";
|
|
1765
|
+
environment: "production" | "staging";
|
|
1766
|
+
decision: "approved";
|
|
1767
|
+
approvedBy: string;
|
|
1768
|
+
approvedAt: string;
|
|
1769
|
+
executionDigest: string;
|
|
1770
|
+
};
|
|
1771
|
+
};
|
|
1550
1772
|
export {};
|
|
@@ -169,6 +169,34 @@ const hostedTopologyRollbackApprovalSchema = z.object({
|
|
|
169
169
|
approvedBy: z.string().min(1).max(256),
|
|
170
170
|
approvedAt: timestamp
|
|
171
171
|
}).strict();
|
|
172
|
+
const hostedTopologyRollbackExecutionSchema = z.object({
|
|
173
|
+
schemaVersion: z.literal("treeseed.hosted-topology-rollback-execution/v1"),
|
|
174
|
+
rollback: hostedTopologyRollbackSchema,
|
|
175
|
+
sourceReceiptId: z.string().regex(/^topology-receipt-[a-f0-9]{16}$/u),
|
|
176
|
+
topologyId: identifier,
|
|
177
|
+
environment: z.enum(["staging", "production"]),
|
|
178
|
+
sourcePlanDigest: digest,
|
|
179
|
+
targetPlanDigest: digest,
|
|
180
|
+
executionDigest: digest
|
|
181
|
+
}).strict().superRefine((execution, context) => {
|
|
182
|
+
const core = {
|
|
183
|
+
rollback: execution.rollback,
|
|
184
|
+
sourceReceiptId: execution.sourceReceiptId,
|
|
185
|
+
topologyId: execution.topologyId,
|
|
186
|
+
environment: execution.environment,
|
|
187
|
+
sourcePlanDigest: execution.sourcePlanDigest,
|
|
188
|
+
targetPlanDigest: execution.targetPlanDigest
|
|
189
|
+
};
|
|
190
|
+
if (deploymentDigest(core) !== execution.executionDigest) context.addIssue({ code: z.ZodIssueCode.custom, path: ["executionDigest"], message: "Hosted rollback execution digest does not bind its complete source and target closure." });
|
|
191
|
+
});
|
|
192
|
+
const hostedTopologyRollbackExecutionApprovalSchema = z.object({
|
|
193
|
+
schemaVersion: z.literal("treeseed.hosted-topology-rollback-execution-approval/v1"),
|
|
194
|
+
executionDigest: digest,
|
|
195
|
+
environment: z.enum(["staging", "production"]),
|
|
196
|
+
decision: z.literal("approved"),
|
|
197
|
+
approvedBy: z.string().min(1).max(256),
|
|
198
|
+
approvedAt: timestamp
|
|
199
|
+
}).strict();
|
|
172
200
|
function observationMap(items, declaration) {
|
|
173
201
|
const resources = new Map(declaration.resources.map((resource) => [resource.id, resource]));
|
|
174
202
|
const observations = /* @__PURE__ */ new Map();
|
|
@@ -289,9 +317,46 @@ function authorizeHostedTopologyRollback(rollbackInput, approvalInput) {
|
|
|
289
317
|
if (approval.rollbackDigest !== rollback.rollbackDigest || approval.environment !== rollback.environment) throw new Error("Hosted topology rollback approval does not bind the exact rollback and environment.");
|
|
290
318
|
return { rollback, approval };
|
|
291
319
|
}
|
|
320
|
+
function planHostedTopologyRollbackExecution(input) {
|
|
321
|
+
const rollback = hostedTopologyRollbackSchema.parse(input.rollback), sourceReceipt = hostedTopologyReceiptSchema.parse(input.sourceReceipt);
|
|
322
|
+
const sourcePlan = input.sourcePlan && typeof input.sourcePlan === "object" && "approval" in input.sourcePlan ? authorizedHostedTopologyPlanSchema.parse(input.sourcePlan) : hostedTopologyPlanSchema.parse(input.sourcePlan);
|
|
323
|
+
const targetPlan = hostedTopologyPlanSchema.parse(input.targetPlan);
|
|
324
|
+
if (sourceReceipt.receiptId !== rollback.sourceReceiptId || sourceReceipt.planDigest !== sourcePlan.planDigest) throw new Error("Hosted rollback execution source receipt is stale.");
|
|
325
|
+
if ([sourceReceipt.environment, sourcePlan.environment, targetPlan.environment].some((environment) => environment !== rollback.environment)) throw new Error("Hosted rollback execution environment does not match its source and target plans.");
|
|
326
|
+
if (sourceReceipt.topologyId !== sourcePlan.topologyId || sourcePlan.topologyId !== targetPlan.topologyId) throw new Error("Hosted rollback execution topology identity changed.");
|
|
327
|
+
const sourceActions = new Map(sourcePlan.actions.map((action) => [action.resourceId, action]));
|
|
328
|
+
const sourceResources = new Map(sourceReceipt.resources.map((resource) => [resource.resourceId, resource]));
|
|
329
|
+
const targetActions = new Map(targetPlan.actions.map((action) => [action.resourceId, action]));
|
|
330
|
+
if (sourceResources.size !== sourceActions.size || rollback.operations.length !== sourceActions.size || new Set(rollback.operations.map(({ resourceId }) => resourceId)).size !== sourceActions.size) throw new Error("Hosted rollback execution does not cover the complete source resource set.");
|
|
331
|
+
for (const operation of rollback.operations) {
|
|
332
|
+
const source = sourceActions.get(operation.resourceId), observed = sourceResources.get(operation.resourceId), target = targetActions.get(operation.resourceId);
|
|
333
|
+
if (!source || !observed || observed.providerResourceId !== operation.providerResourceId) throw new Error(`Hosted rollback execution source mismatch for ${operation.resourceId}.`);
|
|
334
|
+
if (operation.action === "delete-created") {
|
|
335
|
+
if (target) throw new Error(`Hosted rollback execution target must remove created resource ${operation.resourceId}.`);
|
|
336
|
+
} else if (!target || !operation.targetDigest || target.desiredDigest !== operation.targetDigest || target.provider !== source.provider || target.kind !== source.kind) {
|
|
337
|
+
throw new Error(`Hosted rollback execution target specification mismatch for ${operation.resourceId}.`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if ([...targetActions.keys()].some((resourceId) => !sourceActions.has(resourceId))) throw new Error("Hosted rollback execution target introduces an unapproved resource.");
|
|
341
|
+
const core = {
|
|
342
|
+
rollback,
|
|
343
|
+
sourceReceiptId: sourceReceipt.receiptId,
|
|
344
|
+
topologyId: sourceReceipt.topologyId,
|
|
345
|
+
environment: rollback.environment,
|
|
346
|
+
sourcePlanDigest: sourcePlan.planDigest,
|
|
347
|
+
targetPlanDigest: targetPlan.planDigest
|
|
348
|
+
};
|
|
349
|
+
return hostedTopologyRollbackExecutionSchema.parse({ schemaVersion: "treeseed.hosted-topology-rollback-execution/v1", ...core, executionDigest: deploymentDigest(core) });
|
|
350
|
+
}
|
|
351
|
+
function authorizeHostedTopologyRollbackExecution(executionInput, approvalInput) {
|
|
352
|
+
const execution = hostedTopologyRollbackExecutionSchema.parse(executionInput), approval = hostedTopologyRollbackExecutionApprovalSchema.parse(approvalInput);
|
|
353
|
+
if (approval.executionDigest !== execution.executionDigest || approval.environment !== execution.environment) throw new Error("Hosted rollback execution approval does not bind the exact source, target, and environment.");
|
|
354
|
+
return { execution, approval };
|
|
355
|
+
}
|
|
292
356
|
export {
|
|
293
357
|
authorizeHostedTopologyPlan,
|
|
294
358
|
authorizeHostedTopologyRollback,
|
|
359
|
+
authorizeHostedTopologyRollbackExecution,
|
|
295
360
|
authorizedHostedTopologyPlanSchema,
|
|
296
361
|
hostedProviderSchema,
|
|
297
362
|
hostedResourceKindSchema,
|
|
@@ -301,8 +366,11 @@ export {
|
|
|
301
366
|
hostedTopologyPlanSchema,
|
|
302
367
|
hostedTopologyReceiptSchema,
|
|
303
368
|
hostedTopologyRollbackApprovalSchema,
|
|
369
|
+
hostedTopologyRollbackExecutionApprovalSchema,
|
|
370
|
+
hostedTopologyRollbackExecutionSchema,
|
|
304
371
|
hostedTopologyRollbackSchema,
|
|
305
372
|
planHostedTopology,
|
|
306
373
|
planHostedTopologyRollback,
|
|
374
|
+
planHostedTopologyRollbackExecution,
|
|
307
375
|
verifyHostedTopologyReadback
|
|
308
376
|
};
|
|
@@ -116,6 +116,7 @@ const SERVICE_PROVIDER_CATALOG = [
|
|
|
116
116
|
description: "Connect a Cloudflare account with separately scoped capability tokens.",
|
|
117
117
|
knowledgePageIds: ["provider.cloudflare"],
|
|
118
118
|
connectionFields: [
|
|
119
|
+
field("deploymentEnvironment", "Deployment environment", "The exact TreeSeed deployment environment. Use staging or production; one connection must never span both."),
|
|
119
120
|
field("accountId", "Account ID", "The non-secret Cloudflare account identifier."),
|
|
120
121
|
field("zoneId", "Zone ID", "Optional non-secret zone identifier used by reviewed DNS and TLS topology resources.", false)
|
|
121
122
|
],
|
|
@@ -127,7 +128,7 @@ const SERVICE_PROVIDER_CATALOG = [
|
|
|
127
128
|
credentialProfiles: [
|
|
128
129
|
{ id: "cloudflare-runtime", label: "Pages and Workers token", description: "A token limited to application deployment resources.", capabilities: ["frontend-hosting"], fields: [field("apiToken", "API token", "Encrypted in this browser and used only for authorized frontend operations.", true, true)], permissions: ["Account: Workers Scripts Edit", "Account: Pages Edit"], sharing: "capability-scoped", unattendedCompatible: true, authoritySchemes: ["environment-reference", "external-vault", "workload-identity"], knowledgePageIds: ["provider.cloudflare", "services.credentials", "vault.rotation"] },
|
|
129
130
|
{ id: "cloudflare-dns", label: "DNS token", description: "A token restricted to selected zones.", capabilities: ["dns-management"], fields: [field("apiToken", "DNS API token", "Encrypted separately from deployment authority.", true, true)], permissions: ["Zone: DNS Edit for only the managed zones"], sharing: "capability-scoped", unattendedCompatible: true, authoritySchemes: ["environment-reference", "external-vault", "workload-identity"], knowledgePageIds: ["provider.cloudflare", "services.credentials", "vault.rotation"] },
|
|
130
|
-
{ id: "cloudflare-storage", label: "Storage
|
|
131
|
+
{ id: "cloudflare-storage", label: "Storage authority", description: "Vault-custodied R2 management and S3-compatible state credentials, isolated from runtime and DNS authority.", capabilities: ["object-storage"], fields: [field("apiToken", "Storage API token", "Encrypted separately and used only to reconcile authorized R2 resources.", true, true), field("accessKeyId", "R2 access key ID", "Vault-custodied S3-compatible access key identifier for encrypted OpenTofu state.", true, true), field("secretAccessKey", "R2 secret access key", "Vault-custodied S3-compatible secret key for encrypted OpenTofu state.", true, true)], permissions: ["Account: Workers R2 Storage Edit", "Object read and write for only the managed state bucket"], sharing: "capability-scoped", unattendedCompatible: true, authoritySchemes: ["environment-reference", "external-vault", "workload-identity"], knowledgePageIds: ["provider.cloudflare", "services.credentials", "vault.rotation"] }
|
|
131
132
|
]
|
|
132
133
|
},
|
|
133
134
|
{
|
|
@@ -138,6 +139,7 @@ const SERVICE_PROVIDER_CATALOG = [
|
|
|
138
139
|
description: "Connect a Railway workspace for future backend and private infrastructure.",
|
|
139
140
|
knowledgePageIds: ["provider.railway"],
|
|
140
141
|
connectionFields: [
|
|
142
|
+
field("deploymentEnvironment", "Deployment environment", "The exact TreeSeed deployment environment. Use staging or production; one connection must never span both."),
|
|
141
143
|
field("workspaceId", "Workspace ID", "The non-secret Railway workspace identifier."),
|
|
142
144
|
field("projectId", "Project ID", "Optional non-secret project identifier used to adopt a reviewed hosted topology.", false),
|
|
143
145
|
field("environmentId", "Environment ID", "Optional non-secret environment identifier used to target reviewed hosted deployments.", false)
|