@mesh-tech/mesh-cli 0.40.4 → 0.40.6

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,4 +1,4 @@
1
1
  {
2
- "commit": "302e83050",
3
- "builtAt": "2026-10-19T17:38:44.215Z"
2
+ "commit": "d3a5dfdea",
3
+ "builtAt": "2026-10-20T06:06:39.788Z"
4
4
  }
@@ -33,6 +33,12 @@ const TASK_QUEUE = "{{name}}";
33
33
  // itself reads, and a hand-copied spelling that drifts is a partner refused
34
34
  // with no explanation. The primitive cannot add them for you — this identity
35
35
  // builds its roles now, before the events service exists.
36
+ //
37
+ // Declaring roles turns project role assertion ON, so granted roles ride in the
38
+ // token.
39
+ // A sign-in (`oidc`) client added later that must carry ANOTHER project's roles
40
+ // (e.g. forwarding the user's token to Temporal) turns project assertion off and
41
+ // sets `accessTokenRoleAssertion: true` + requests `projects:roles` — see authz.md.
36
42
 
37
43
  const connector = new mesh.auth.ZitadelConnector("idp", { tenant, env: platform.env });
38
44
 
@@ -123,6 +129,9 @@ const config = new mesh.apps.AppConfig("config", {
123
129
  // migration Job and fails when it fails, and the service's pods are held until
124
130
  // the schema has applied.
125
131
  //
132
+ // Its log lines carry `service: "{{name}}-events"`, which the Hub's log search
133
+ // filters by, with nothing to set here.
134
+ //
126
135
  // A knob written HERE is pinned in code: Kubernetes keeps an explicit `env`
127
136
  // entry over the `envFrom` the app values arrive through, so a value in this
128
137
  // block wins over whatever an operator saves in the Hub. Leave one out to hand
@@ -173,6 +182,8 @@ const api = new mesh.apps.Service("api", {
173
182
  ],
174
183
  ingress: env.buildIngress({ subdomain: "{{name}}" }),
175
184
  // Drives readiness, liveness and the Hub uptime sampler on BOTH ingress kinds.
185
+ // An `ingress.pathMatches` list must route this path too: the sampler
186
+ // requests it on the public URL.
176
187
  // `ingress.healthCheckPath` sets the ALB target group's path only, and a
177
188
  // gateway (HTTPRoute) tenant has no target group — so the path belongs here.
178
189
  // A boot that can outlast the liveness window (a busy node, a tight CPU
@@ -241,7 +252,9 @@ const worker = new mesh.apps.TemporalWorker("worker", {
241
252
  // =============================================================================
242
253
  // Access — LAST. The pointer is what the Hub's App -> Access tab reads; without
243
254
  // it the tab is blank and no one can be granted a role, including the two the
244
- // events service authorizes its subscribers by.
255
+ // events service authorizes its subscribers by. Keep the name "authz": an app
256
+ // that moves to policy-engine hands its metadata path to SpiceDBSchema, which
257
+ // adopts the Export published under that name.
245
258
  // =============================================================================
246
259
 
247
260
  new mesh.auth.AppAuthzPointer("authz", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mesh-tech/mesh-cli",
3
- "version": "0.40.4",
3
+ "version": "0.40.6",
4
4
  "description": "CLI for Mesh platform development utilities",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "@mesh-tech/agent-contracts": "0.6.0",
45
- "@mesh-tech/tsconfig": "2.46.0",
45
+ "@mesh-tech/tsconfig": "2.48.0",
46
46
  "@mesh-tech/workflow-viz": "0.3.2",
47
47
  "@tanstack/intent": "^0.3.6",
48
48
  "@types/node": "^20.0.0",
@@ -42,6 +42,11 @@ const connector = new mesh.auth.ZitadelConnector("idp", { tenant, env: platform.
42
42
  // The schema's coarse roles become Zitadel PROJECT ROLES: the vocabulary the
43
43
  // Hub grants people and API keys against. An `api`-type application is the
44
44
  // resource server tokens are minted for (its clientId is the JWT audience).
45
+ // Declaring roles turns project role assertion ON, so granted roles ride in the
46
+ // token.
47
+ // A sign-in (`oidc`) client added later that must carry ANOTHER project's roles
48
+ // (e.g. forwarding the user's token to Temporal) turns project assertion off and
49
+ // sets `accessTokenRoleAssertion: true` + requests `projects:roles` — see authz.md.
45
50
  const identity = new mesh.auth.ZitadelAppIdentity("identity", {
46
51
  connector,
47
52
  tenant,
@@ -107,6 +112,8 @@ const api = new mesh.apps.Service("api", {
107
112
  },
108
113
  ingress: env.buildIngress({ subdomain: "{{name}}-api" }),
109
114
  // Drives readiness, liveness and the Hub uptime sampler on BOTH ingress kinds.
115
+ // An `ingress.pathMatches` list must route this path too: the sampler
116
+ // requests it on the public URL.
110
117
  // `ingress.healthCheckPath` sets the ALB target group's path only, and a
111
118
  // gateway (HTTPRoute) tenant has no target group — so the path belongs here.
112
119
  // A boot that can outlast the liveness window (a busy node, a tight CPU
@@ -45,6 +45,9 @@ const connector = new mesh.auth.ZitadelConnector("idp", { tenant, env: platform.
45
45
  // roleAssertion defaults ON (roles are declared) so granted roles ride in the
46
46
  // token — without it a minted API key authenticates but carries no roles, which
47
47
  // is fatal for role-gating (no SpiceDB fallback).
48
+ // A sign-in (`oidc`) client added later that must carry ANOTHER project's roles
49
+ // (e.g. forwarding the user's token to Temporal) turns project assertion off and
50
+ // sets `accessTokenRoleAssertion: true` + requests `projects:roles` — see authz.md.
48
51
  const identity = new mesh.auth.ZitadelAppIdentity("identity", {
49
52
  connector,
50
53
  tenant,
@@ -83,6 +86,8 @@ const api = new mesh.apps.Service("api", {
83
86
  },
84
87
  ingress: env.buildIngress({ subdomain: "{{name}}-api" }),
85
88
  // Drives readiness, liveness and the Hub uptime sampler on BOTH ingress kinds.
89
+ // An `ingress.pathMatches` list must route this path too: the sampler
90
+ // requests it on the public URL.
86
91
  // `ingress.healthCheckPath` sets the ALB target group's path only, and a
87
92
  // gateway (HTTPRoute) tenant has no target group — so the path belongs here.
88
93
  // A boot that can outlast the liveness window (a busy node, a tight CPU
@@ -102,7 +107,9 @@ const api = new mesh.apps.Service("api", {
102
107
  // component to publish it, so the pointer publishes the compiled blob itself
103
108
  // at the conventional …/authz/ops-hub-metadata path and references it.
104
109
  // It publishes env.zitadel — the project bound above through zitadelAppProjectId;
105
- // never pass a `zitadel:` override here (that is the Hub's own escape hatch). ---
110
+ // never pass a `zitadel:` override here (that is the Hub's own escape hatch).
111
+ // Keep the name "authz": an app that moves to policy-engine hands this path to
112
+ // SpiceDBSchema, which adopts the Export published under that name. ---
106
113
  new mesh.auth.AppAuthzPointer("authz", {
107
114
  env,
108
115
  mode: "role-gating",
@@ -73,6 +73,8 @@ const api = new mesh.apps.Service("api", {
73
73
  link: [vendorpay.link()],
74
74
  ingress: env.buildIngress({ subdomain: "{{name}}-api" }),
75
75
  // Drives readiness, liveness and the Hub uptime sampler on BOTH ingress kinds.
76
+ // An `ingress.pathMatches` list must route this path too: the sampler
77
+ // requests it on the public URL.
76
78
  // `ingress.healthCheckPath` sets the ALB target group's path only, and a
77
79
  // gateway (HTTPRoute) tenant has no target group — so the path belongs here.
78
80
  // A boot that can outlast the liveness window (a busy node, a tight CPU
@@ -46,6 +46,8 @@ const api = new mesh.apps.Service("api", {
46
46
  ],
47
47
  ingress: env.buildIngress({ subdomain: "{{name}}-api" }),
48
48
  // Drives readiness, liveness and the Hub uptime sampler on BOTH ingress kinds.
49
+ // An `ingress.pathMatches` list must route this path too: the sampler
50
+ // requests it on the public URL.
49
51
  // `ingress.healthCheckPath` sets the ALB target group's path only, and a
50
52
  // gateway (HTTPRoute) tenant has no target group — so the path belongs here.
51
53
  // A boot that can outlast the liveness window (a busy node, a tight CPU