@askexenow/exe-os 0.9.392 → 0.9.394

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.
@@ -4909,11 +4909,410 @@
4909
4909
  "composeSha256": "220b251375f372107e8d8d54a9c3e4ceab1f57aae80f4babf2933c3887532263",
4910
4910
  "composeOverrideSha256": "af295ca2f75b85788416e4df51cab86d8b773bf4cafe6cf6df9c7c26b9a42d6d"
4911
4911
  }
4912
+ },
4913
+ "0.9.53": {
4914
+ "version": "0.9.53",
4915
+ "releasedAt": "2026-09-23T21:55:18.488Z",
4916
+ "npmVersion": "0.9.393",
4917
+ "notes": "Dashboard-only Exe dogfood canary replacing unapplied 0.9.52: npm 0.9.393 scopes retained-Compose health to Dashboard, required core, and rendered dependencies while recording unchanged unrelated red containers and failing new regressions. From live stack 0.9.50, update only Dashboard to v0.9.392. Preserve CRM v0.9.66, Auth v0.6.10, and every other service pin. Signed live base and override Compose bytes are unchanged; no config assets are delivered. Public DEMO remains disabled pending separate CRM rollout.",
4918
+ "services": {
4919
+ "exe-db": {
4920
+ "image": "update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9",
4921
+ "env": "EXE_DB_IMAGE",
4922
+ "composeService": "exe-db",
4923
+ "required": true,
4924
+ "category": "core",
4925
+ "description": "Postgres (pgvector) — digest-pinned (bug 32d6e02f; was tag-only in 0.9.25, regressed from 0.9.24)"
4926
+ },
4927
+ "exe-os": {
4928
+ "image": "update.askexe.com/askexe/exe-os:v0.9.382@sha256:266a59a482865eab9f79497999acb33c1fe1868ec54ea5cd1ce971c492f11bd6",
4929
+ "env": "EXE_OS_IMAGE_TAG",
4930
+ "composeService": "exe-os",
4931
+ "healthUrl": "http://127.0.0.1:8765/health",
4932
+ "required": true,
4933
+ "category": "core",
4934
+ "description": "exe-os daemon + MCP server"
4935
+ },
4936
+ "crm": {
4937
+ "image": "update.askexe.com/askexe/exe-crm:v0.9.66@sha256:38bbae74ddd33dbbd62175a46ad0d3f99ef6c671b0c2187e35398ca9c504c3eb",
4938
+ "env": "CRM_IMAGE_TAG",
4939
+ "composeService": "exe-crm",
4940
+ "healthUrl": "http://127.0.0.1:3000/healthz",
4941
+ "category": "app",
4942
+ "gitSha": "a3d107483304d10b05c9f1ee5e1b0182c4628e65",
4943
+ "description": "Central authentication and recovery with server-validated shared sessions for CRM web and worker."
4944
+ },
4945
+ "wiki": {
4946
+ "image": "update.askexe.com/askexe/exe-wiki:v0.9.37@sha256:8fa22e77c0742fbb690f7b4c8431a186692a20ebd335fb141782df4289dc337f",
4947
+ "env": "WIKI_IMAGE_TAG",
4948
+ "composeService": "exe-wiki",
4949
+ "healthUrl": "http://127.0.0.1:3001/api/ping",
4950
+ "category": "app",
4951
+ "description": "Central hosted authentication and recovery with server-validated shared sessions, membership enforcement, and no product-local credential form.",
4952
+ "gitSha": "713a4370c2b641b8f8b07fd1e7390afa79a9c931"
4953
+ },
4954
+ "gateway": {
4955
+ "image": "update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105",
4956
+ "env": "GATEWAY_IMAGE_TAG",
4957
+ "composeService": "exe-gateway",
4958
+ "healthUrl": "http://127.0.0.1:3100/health",
4959
+ "category": "app",
4960
+ "description": "WhatsApp/messaging gateway — provenance-stamped rebuild of main (outbound message persistence fix); pinned by digest, dated immutable tag.",
4961
+ "gitSha": "c15f093a0f59730bd5c2c73791ff77059dfa7cc1"
4962
+ },
4963
+ "monitorAgent": {
4964
+ "image": "update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a",
4965
+ "env": "MONITOR_AGENT_IMAGE_TAG",
4966
+ "composeService": "exe-monitor-agent",
4967
+ "category": "monitoring",
4968
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
4969
+ },
4970
+ "monitorHub": {
4971
+ "image": "update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97",
4972
+ "env": "MONITOR_HUB_IMAGE_TAG",
4973
+ "composeService": "exe-monitor-hub",
4974
+ "healthUrl": "http://127.0.0.1:8090/api/health",
4975
+ "category": "monitoring",
4976
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
4977
+ },
4978
+ "auth": {
4979
+ "image": "update.askexe.com/askexe/exe-auth:v0.6.10@sha256:0260349962d087cd3c33fed1d362029416e82ae9cc60abca7969beac2cb8639f",
4980
+ "env": "AUTH_IMAGE_TAG",
4981
+ "composeService": "exe-auth",
4982
+ "healthUrl": "http://127.0.0.1:3300/",
4983
+ "category": "auth",
4984
+ "description": "GoTrue SSO and privileged license authority bridge; stateless auth proxy.",
4985
+ "gitSha": "29fe7015d90b80c94db3a1e3904852b934071711"
4986
+ },
4987
+ "erp": {
4988
+ "image": "update.askexe.com/askexe/exe-erp:v0.3.17@sha256:ef61b59d94c04189fe2975045a3816d2fecc8efe3027e0ee8c17d0fa2efdbc3b",
4989
+ "env": "ERP_IMAGE_TAG",
4990
+ "composeService": "exe-erp",
4991
+ "healthUrl": "http://127.0.0.1:8069/api/method/ping",
4992
+ "healthHost": "localhost",
4993
+ "required": false,
4994
+ "category": "app",
4995
+ "description": "Enterprise Resource Planning with central hosted authentication and subject-bound organization admission.",
4996
+ "gitSha": "a769ec5e0ae53bc5944715845869715ebbffd63a"
4997
+ },
4998
+ "gotrue": {
4999
+ "image": "update.askexe.com/askexe/gotrue:v2.172.1@sha256:b0dd7aa28dd1f9a8bd31f136c8b912661f701d9b863171e5843cb08f18f49de4",
5000
+ "composeService": "gotrue",
5001
+ "healthUrl": "http://127.0.0.1:9999/health",
5002
+ "category": "infra"
5003
+ },
5004
+ "redis": {
5005
+ "image": "update.askexe.com/askexe/redis:7.4-alpine@sha256:6ab0b6e7381779332f97b8ca76193e45b0756f38d4c0dcda72dbb3c32061ab99",
5006
+ "composeService": "redis",
5007
+ "category": "infra"
5008
+ },
5009
+ "clickhouse": {
5010
+ "image": "update.askexe.com/askexe/clickhouse-server:24.8.4.13-alpine@sha256:88a45f9e328549b2579256c46ee38e5c0e25ae58303d9eb6d9c7ed8d6d2bbf3c",
5011
+ "composeService": "clickhouse",
5012
+ "category": "infra"
5013
+ },
5014
+ "cloudflared": {
5015
+ "image": "update.askexe.com/askexe/cloudflared:2026-07@sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f",
5016
+ "composeService": "cloudflared",
5017
+ "category": "infra"
5018
+ },
5019
+ "exe-sso-edge": {
5020
+ "image": "update.askexe.com/askexe/nginx:alpine@sha256:20316569d8f81a160065d7d2a5eeffc7ca97d79022462ee255fd23fa103a6b5c",
5021
+ "composeService": "exe-sso-edge",
5022
+ "category": "infra"
5023
+ },
5024
+ "exe-otel-collector": {
5025
+ "image": "update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197",
5026
+ "composeService": "exe-otel-collector",
5027
+ "category": "infra"
5028
+ },
5029
+ "dashboard": {
5030
+ "image": "update.askexe.com/askexe/exe-dashboard:v0.9.392@sha256:d151441554c00e216084bd1caf2278e8c41fde188c039e0f167e158a511cbeec",
5031
+ "env": "DASHBOARD_IMAGE_TAG",
5032
+ "composeService": "exe-dashboard",
5033
+ "healthUrl": "http://127.0.0.1:3301/health",
5034
+ "required": false,
5035
+ "category": "optional",
5036
+ "description": "Customer dashboard at dashboard.<apex> — credits, usage, API keys, billing",
5037
+ "gitSha": "e11b25ad567389440da8ed5e566a9c59bce24123"
5038
+ }
5039
+ },
5040
+ "rolloutStage": "canary",
5041
+ "config": {
5042
+ "composeSha256": "220b251375f372107e8d8d54a9c3e4ceab1f57aae80f4babf2933c3887532263",
5043
+ "composeOverrideSha256": "af295ca2f75b85788416e4df51cab86d8b773bf4cafe6cf6df9c7c26b9a42d6d"
5044
+ }
5045
+ },
5046
+ "0.9.54": {
5047
+ "version": "0.9.54",
5048
+ "releasedAt": "2026-09-23T22:31:53.000Z",
5049
+ "npmVersion": "0.9.393",
5050
+ "notes": "CRM DEMO routing canary from the applied Dashboard 0.9.53 baseline. Update only CRM web and worker to v0.9.67 with signed DEMO workspace routing; preserve Dashboard v0.9.392, Auth v0.6.10, and all other pins. Operator DEMO bootstrap remains a separate scoped step after image acceptance.",
5051
+ "services": {
5052
+ "exe-db": {
5053
+ "image": "update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9",
5054
+ "env": "EXE_DB_IMAGE",
5055
+ "composeService": "exe-db",
5056
+ "required": true,
5057
+ "category": "core",
5058
+ "description": "Postgres (pgvector) — digest-pinned (bug 32d6e02f; was tag-only in 0.9.25, regressed from 0.9.24)"
5059
+ },
5060
+ "exe-os": {
5061
+ "image": "update.askexe.com/askexe/exe-os:v0.9.382@sha256:266a59a482865eab9f79497999acb33c1fe1868ec54ea5cd1ce971c492f11bd6",
5062
+ "env": "EXE_OS_IMAGE_TAG",
5063
+ "composeService": "exe-os",
5064
+ "healthUrl": "http://127.0.0.1:8765/health",
5065
+ "required": true,
5066
+ "category": "core",
5067
+ "description": "exe-os daemon + MCP server"
5068
+ },
5069
+ "crm": {
5070
+ "image": "update.askexe.com/askexe/exe-crm:v0.9.67@sha256:56452b7df4361e157e4d727dd71c8ed3f1cffd4b345bbddecf651609c0de9b48",
5071
+ "env": "CRM_IMAGE_TAG",
5072
+ "composeService": "exe-crm",
5073
+ "healthUrl": "http://127.0.0.1:3000/healthz",
5074
+ "category": "app",
5075
+ "gitSha": "9127619259b7ba2ff8963fbf302827e3cf518ece",
5076
+ "description": "Central authentication and recovery with server-validated shared sessions for CRM web and worker."
5077
+ },
5078
+ "wiki": {
5079
+ "image": "update.askexe.com/askexe/exe-wiki:v0.9.37@sha256:8fa22e77c0742fbb690f7b4c8431a186692a20ebd335fb141782df4289dc337f",
5080
+ "env": "WIKI_IMAGE_TAG",
5081
+ "composeService": "exe-wiki",
5082
+ "healthUrl": "http://127.0.0.1:3001/api/ping",
5083
+ "category": "app",
5084
+ "description": "Central hosted authentication and recovery with server-validated shared sessions, membership enforcement, and no product-local credential form.",
5085
+ "gitSha": "713a4370c2b641b8f8b07fd1e7390afa79a9c931"
5086
+ },
5087
+ "gateway": {
5088
+ "image": "update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105",
5089
+ "env": "GATEWAY_IMAGE_TAG",
5090
+ "composeService": "exe-gateway",
5091
+ "healthUrl": "http://127.0.0.1:3100/health",
5092
+ "category": "app",
5093
+ "description": "WhatsApp/messaging gateway — provenance-stamped rebuild of main (outbound message persistence fix); pinned by digest, dated immutable tag.",
5094
+ "gitSha": "c15f093a0f59730bd5c2c73791ff77059dfa7cc1"
5095
+ },
5096
+ "monitorAgent": {
5097
+ "image": "update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a",
5098
+ "env": "MONITOR_AGENT_IMAGE_TAG",
5099
+ "composeService": "exe-monitor-agent",
5100
+ "category": "monitoring",
5101
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
5102
+ },
5103
+ "monitorHub": {
5104
+ "image": "update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97",
5105
+ "env": "MONITOR_HUB_IMAGE_TAG",
5106
+ "composeService": "exe-monitor-hub",
5107
+ "healthUrl": "http://127.0.0.1:8090/api/health",
5108
+ "category": "monitoring",
5109
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
5110
+ },
5111
+ "auth": {
5112
+ "image": "update.askexe.com/askexe/exe-auth:v0.6.10@sha256:0260349962d087cd3c33fed1d362029416e82ae9cc60abca7969beac2cb8639f",
5113
+ "env": "AUTH_IMAGE_TAG",
5114
+ "composeService": "exe-auth",
5115
+ "healthUrl": "http://127.0.0.1:3300/",
5116
+ "category": "auth",
5117
+ "description": "GoTrue SSO and privileged license authority bridge; stateless auth proxy.",
5118
+ "gitSha": "29fe7015d90b80c94db3a1e3904852b934071711"
5119
+ },
5120
+ "erp": {
5121
+ "image": "update.askexe.com/askexe/exe-erp:v0.3.17@sha256:ef61b59d94c04189fe2975045a3816d2fecc8efe3027e0ee8c17d0fa2efdbc3b",
5122
+ "env": "ERP_IMAGE_TAG",
5123
+ "composeService": "exe-erp",
5124
+ "healthUrl": "http://127.0.0.1:8069/api/method/ping",
5125
+ "healthHost": "localhost",
5126
+ "required": false,
5127
+ "category": "app",
5128
+ "description": "Enterprise Resource Planning with central hosted authentication and subject-bound organization admission.",
5129
+ "gitSha": "a769ec5e0ae53bc5944715845869715ebbffd63a"
5130
+ },
5131
+ "gotrue": {
5132
+ "image": "update.askexe.com/askexe/gotrue:v2.172.1@sha256:b0dd7aa28dd1f9a8bd31f136c8b912661f701d9b863171e5843cb08f18f49de4",
5133
+ "composeService": "gotrue",
5134
+ "healthUrl": "http://127.0.0.1:9999/health",
5135
+ "category": "infra"
5136
+ },
5137
+ "redis": {
5138
+ "image": "update.askexe.com/askexe/redis:7.4-alpine@sha256:6ab0b6e7381779332f97b8ca76193e45b0756f38d4c0dcda72dbb3c32061ab99",
5139
+ "composeService": "redis",
5140
+ "category": "infra"
5141
+ },
5142
+ "clickhouse": {
5143
+ "image": "update.askexe.com/askexe/clickhouse-server:24.8.4.13-alpine@sha256:88a45f9e328549b2579256c46ee38e5c0e25ae58303d9eb6d9c7ed8d6d2bbf3c",
5144
+ "composeService": "clickhouse",
5145
+ "category": "infra"
5146
+ },
5147
+ "cloudflared": {
5148
+ "image": "update.askexe.com/askexe/cloudflared:2026-07@sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f",
5149
+ "composeService": "cloudflared",
5150
+ "category": "infra"
5151
+ },
5152
+ "exe-sso-edge": {
5153
+ "image": "update.askexe.com/askexe/nginx:alpine@sha256:20316569d8f81a160065d7d2a5eeffc7ca97d79022462ee255fd23fa103a6b5c",
5154
+ "composeService": "exe-sso-edge",
5155
+ "category": "infra"
5156
+ },
5157
+ "exe-otel-collector": {
5158
+ "image": "update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197",
5159
+ "composeService": "exe-otel-collector",
5160
+ "category": "infra"
5161
+ },
5162
+ "dashboard": {
5163
+ "image": "update.askexe.com/askexe/exe-dashboard:v0.9.392@sha256:d151441554c00e216084bd1caf2278e8c41fde188c039e0f167e158a511cbeec",
5164
+ "env": "DASHBOARD_IMAGE_TAG",
5165
+ "composeService": "exe-dashboard",
5166
+ "healthUrl": "http://127.0.0.1:3301/health",
5167
+ "required": false,
5168
+ "category": "optional",
5169
+ "description": "Customer dashboard at dashboard.<apex> — credits, usage, API keys, billing",
5170
+ "gitSha": "e11b25ad567389440da8ed5e566a9c59bce24123"
5171
+ }
5172
+ },
5173
+ "rolloutStage": "canary",
5174
+ "config": {
5175
+ "composeSha256": "220b251375f372107e8d8d54a9c3e4ceab1f57aae80f4babf2933c3887532263",
5176
+ "composeOverrideSha256": "af295ca2f75b85788416e4df51cab86d8b773bf4cafe6cf6df9c7c26b9a42d6d"
5177
+ }
5178
+ },
5179
+ "0.9.55": {
5180
+ "version": "0.9.55",
5181
+ "releasedAt": "2026-09-23T23:14:06.000Z",
5182
+ "npmVersion": "0.9.394",
5183
+ "notes": "CRM DEMO routing canary superseding unapplied stack 0.9.54. The scoped updater now validates, restarts, witnesses, and rolls back CRM web and worker together under the one signed CRM_IMAGE_TAG. From the applied Dashboard 0.9.53 baseline, update only CRM to v0.9.67; preserve Dashboard v0.9.392, Auth v0.6.10, and every other image pin. Operator DEMO bootstrap remains separate after image acceptance.",
5184
+ "services": {
5185
+ "exe-db": {
5186
+ "image": "update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9",
5187
+ "env": "EXE_DB_IMAGE",
5188
+ "composeService": "exe-db",
5189
+ "required": true,
5190
+ "category": "core",
5191
+ "description": "Postgres (pgvector) — digest-pinned (bug 32d6e02f; was tag-only in 0.9.25, regressed from 0.9.24)"
5192
+ },
5193
+ "exe-os": {
5194
+ "image": "update.askexe.com/askexe/exe-os:v0.9.382@sha256:266a59a482865eab9f79497999acb33c1fe1868ec54ea5cd1ce971c492f11bd6",
5195
+ "env": "EXE_OS_IMAGE_TAG",
5196
+ "composeService": "exe-os",
5197
+ "healthUrl": "http://127.0.0.1:8765/health",
5198
+ "required": true,
5199
+ "category": "core",
5200
+ "description": "exe-os daemon + MCP server"
5201
+ },
5202
+ "crm": {
5203
+ "image": "update.askexe.com/askexe/exe-crm:v0.9.67@sha256:56452b7df4361e157e4d727dd71c8ed3f1cffd4b345bbddecf651609c0de9b48",
5204
+ "env": "CRM_IMAGE_TAG",
5205
+ "composeService": "exe-crm",
5206
+ "healthUrl": "http://127.0.0.1:3000/healthz",
5207
+ "category": "app",
5208
+ "gitSha": "9127619259b7ba2ff8963fbf302827e3cf518ece",
5209
+ "description": "Central authentication and recovery with server-validated shared sessions for CRM web and worker."
5210
+ },
5211
+ "wiki": {
5212
+ "image": "update.askexe.com/askexe/exe-wiki:v0.9.37@sha256:8fa22e77c0742fbb690f7b4c8431a186692a20ebd335fb141782df4289dc337f",
5213
+ "env": "WIKI_IMAGE_TAG",
5214
+ "composeService": "exe-wiki",
5215
+ "healthUrl": "http://127.0.0.1:3001/api/ping",
5216
+ "category": "app",
5217
+ "description": "Central hosted authentication and recovery with server-validated shared sessions, membership enforcement, and no product-local credential form.",
5218
+ "gitSha": "713a4370c2b641b8f8b07fd1e7390afa79a9c931"
5219
+ },
5220
+ "gateway": {
5221
+ "image": "update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105",
5222
+ "env": "GATEWAY_IMAGE_TAG",
5223
+ "composeService": "exe-gateway",
5224
+ "healthUrl": "http://127.0.0.1:3100/health",
5225
+ "category": "app",
5226
+ "description": "WhatsApp/messaging gateway — provenance-stamped rebuild of main (outbound message persistence fix); pinned by digest, dated immutable tag.",
5227
+ "gitSha": "c15f093a0f59730bd5c2c73791ff77059dfa7cc1"
5228
+ },
5229
+ "monitorAgent": {
5230
+ "image": "update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a",
5231
+ "env": "MONITOR_AGENT_IMAGE_TAG",
5232
+ "composeService": "exe-monitor-agent",
5233
+ "category": "monitoring",
5234
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
5235
+ },
5236
+ "monitorHub": {
5237
+ "image": "update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97",
5238
+ "env": "MONITOR_HUB_IMAGE_TAG",
5239
+ "composeService": "exe-monitor-hub",
5240
+ "healthUrl": "http://127.0.0.1:8090/api/health",
5241
+ "category": "monitoring",
5242
+ "gitSha": "10660eb4abdeffbcba2aad13549aa58e208ac7a3"
5243
+ },
5244
+ "auth": {
5245
+ "image": "update.askexe.com/askexe/exe-auth:v0.6.10@sha256:0260349962d087cd3c33fed1d362029416e82ae9cc60abca7969beac2cb8639f",
5246
+ "env": "AUTH_IMAGE_TAG",
5247
+ "composeService": "exe-auth",
5248
+ "healthUrl": "http://127.0.0.1:3300/",
5249
+ "category": "auth",
5250
+ "description": "GoTrue SSO and privileged license authority bridge; stateless auth proxy.",
5251
+ "gitSha": "29fe7015d90b80c94db3a1e3904852b934071711"
5252
+ },
5253
+ "erp": {
5254
+ "image": "update.askexe.com/askexe/exe-erp:v0.3.17@sha256:ef61b59d94c04189fe2975045a3816d2fecc8efe3027e0ee8c17d0fa2efdbc3b",
5255
+ "env": "ERP_IMAGE_TAG",
5256
+ "composeService": "exe-erp",
5257
+ "healthUrl": "http://127.0.0.1:8069/api/method/ping",
5258
+ "healthHost": "localhost",
5259
+ "required": false,
5260
+ "category": "app",
5261
+ "description": "Enterprise Resource Planning with central hosted authentication and subject-bound organization admission.",
5262
+ "gitSha": "a769ec5e0ae53bc5944715845869715ebbffd63a"
5263
+ },
5264
+ "gotrue": {
5265
+ "image": "update.askexe.com/askexe/gotrue:v2.172.1@sha256:b0dd7aa28dd1f9a8bd31f136c8b912661f701d9b863171e5843cb08f18f49de4",
5266
+ "composeService": "gotrue",
5267
+ "healthUrl": "http://127.0.0.1:9999/health",
5268
+ "category": "infra"
5269
+ },
5270
+ "redis": {
5271
+ "image": "update.askexe.com/askexe/redis:7.4-alpine@sha256:6ab0b6e7381779332f97b8ca76193e45b0756f38d4c0dcda72dbb3c32061ab99",
5272
+ "composeService": "redis",
5273
+ "category": "infra"
5274
+ },
5275
+ "clickhouse": {
5276
+ "image": "update.askexe.com/askexe/clickhouse-server:24.8.4.13-alpine@sha256:88a45f9e328549b2579256c46ee38e5c0e25ae58303d9eb6d9c7ed8d6d2bbf3c",
5277
+ "composeService": "clickhouse",
5278
+ "category": "infra"
5279
+ },
5280
+ "cloudflared": {
5281
+ "image": "update.askexe.com/askexe/cloudflared:2026-07@sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f",
5282
+ "composeService": "cloudflared",
5283
+ "category": "infra"
5284
+ },
5285
+ "exe-sso-edge": {
5286
+ "image": "update.askexe.com/askexe/nginx:alpine@sha256:20316569d8f81a160065d7d2a5eeffc7ca97d79022462ee255fd23fa103a6b5c",
5287
+ "composeService": "exe-sso-edge",
5288
+ "category": "infra"
5289
+ },
5290
+ "exe-otel-collector": {
5291
+ "image": "update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197",
5292
+ "composeService": "exe-otel-collector",
5293
+ "category": "infra"
5294
+ },
5295
+ "dashboard": {
5296
+ "image": "update.askexe.com/askexe/exe-dashboard:v0.9.392@sha256:d151441554c00e216084bd1caf2278e8c41fde188c039e0f167e158a511cbeec",
5297
+ "env": "DASHBOARD_IMAGE_TAG",
5298
+ "composeService": "exe-dashboard",
5299
+ "healthUrl": "http://127.0.0.1:3301/health",
5300
+ "required": false,
5301
+ "category": "optional",
5302
+ "description": "Customer dashboard at dashboard.<apex> — credits, usage, API keys, billing",
5303
+ "gitSha": "e11b25ad567389440da8ed5e566a9c59bce24123"
5304
+ }
5305
+ },
5306
+ "rolloutStage": "canary",
5307
+ "config": {
5308
+ "composeSha256": "220b251375f372107e8d8d54a9c3e4ceab1f57aae80f4babf2933c3887532263",
5309
+ "composeOverrideSha256": "af295ca2f75b85788416e4df51cab86d8b773bf4cafe6cf6df9c7c26b9a42d6d"
5310
+ }
4912
5311
  }
4913
5312
  },
4914
5313
  "signature": {
4915
5314
  "keyId": "exe-stack-1",
4916
5315
  "alg": "ed25519",
4917
- "signature": "xdgiq8L3up4Mr/AAKup4KFb0istz4Mw80ACvfp1K69hy5NXCou/JX3/eyCfgp0ZP20nbzjjEDfYvHATXQ36XCQ=="
5316
+ "signature": "BTPhDNOLpsQWb4XWYhc4B76lw+lAa0+t6RP1wC9B5D/9NNvkFcRTPrrf56YxL2bjBgx1IMWaBi4eM5Fbv2WEDA=="
4918
5317
  }
4919
5318
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "verified_at": "2026-09-23T21:11:44.589Z",
4
- "manifest_sha256": "7001b01788ede1ea0aca7f3688cacaa8a618cac6faf6aa49894111e38765e4c5",
5
- "package_version": "0.9.392"
3
+ "verified_at": "2026-09-23T23:35:24.863Z",
4
+ "manifest_sha256": "6448e6d55002816a5c2c682844a5a0d84f5f006dc21386948f690951ae6ad15f",
5
+ "package_version": "0.9.394"
6
6
  }
package/dist/bin/cli.js CHANGED
@@ -798,14 +798,14 @@ ${JSON.stringify(stormAlert, null, 2)}`);
798
798
  const { runStackUpdateCli } = await import("./stack-update.js");
799
799
  await runStackUpdateCli(args.slice(1));
800
800
  } else if (args[0] === "release") {
801
- const { parseReleaseArgs, runStackRelease } = await import("../stack-release-7YHSLY7J.js");
801
+ const { parseReleaseArgs, runStackRelease } = await import("../stack-release-YCNRPK6R.js");
802
802
  const releaseFlags = parseReleaseArgs(args.slice(1));
803
803
  await runStackRelease(releaseFlags);
804
804
  } else if (args[0] === "stack-promote") {
805
- const { runStackPromoteCli } = await import("../stack-promote-26RFMNSB.js");
805
+ const { runStackPromoteCli } = await import("../stack-promote-4EF7RNIV.js");
806
806
  await runStackPromoteCli(args.slice(1));
807
807
  } else if (args[0] === "stack-generate-manifest") {
808
- const { runStackGenerateManifestCli } = await import("../stack-generate-manifest-QWU7Q4MJ.js");
808
+ const { runStackGenerateManifestCli } = await import("../stack-generate-manifest-H6LJQ2HV.js");
809
809
  process.exit(await runStackGenerateManifestCli(args.slice(1)));
810
810
  } else if (args[0] === "repo-truth") {
811
811
  const { runRepoTruthCli } = await import("./exe-repo-truth.js");
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  registryProxyOptionsFromEnv,
4
4
  runRegistryProxy
5
- } from "../chunk-PRCJG3PK.js";
5
+ } from "../chunk-RLUDQYOA.js";
6
6
  import {
7
7
  isMainModule
8
8
  } from "../chunk-6Y4B3QF6.js";
@@ -7,6 +7,7 @@ import {
7
7
  assertRetainedComposeRenderedImage,
8
8
  assertRetainedComposeRunningService,
9
9
  assertSignedManifestDeliveryGate,
10
+ assessRetainedHealthBefore,
10
11
  backupStackConfig,
11
12
  bootstrapStackHost,
12
13
  builtinStackManifestPublicKeyPath,
@@ -17,12 +18,14 @@ import {
17
18
  defaultStackPaths,
18
19
  detectDanglingVolumes,
19
20
  detectMissingRequiredEnvVars,
21
+ expandComposeServicesWithSidecars,
20
22
  listAvailableVersions,
21
23
  listHostComposeServices,
22
24
  loadServiceSelection,
23
25
  loadStackManifestWithFallback,
24
26
  parseComposeVolumeNames,
25
27
  parseEnv,
28
+ parseRetainedContainerHealth,
26
29
  patchEnv,
27
30
  printDanglingVolumes,
28
31
  printVolumeCleanupResult,
@@ -33,6 +36,9 @@ import {
33
36
  reportStackManifestSource,
34
37
  requiredImagePinKeys,
35
38
  resolveComposeProjectName,
39
+ retainedCompletedDependencies,
40
+ retainedContainerIsHealthy,
41
+ retainedCriticalServices,
36
42
  runScopedServiceSelection,
37
43
  runStackUpdate,
38
44
  saveServiceSelection,
@@ -41,7 +47,7 @@ import {
41
47
  verifyManifestImagesAvailable,
42
48
  warnUnmanagedManifestServices,
43
49
  withStackUpdateOperationLock
44
- } from "../chunk-3SXU7KLW.js";
50
+ } from "../chunk-DYFTZWG2.js";
45
51
  import "../chunk-EC5H53YD.js";
46
52
  import {
47
53
  runVerifyStack
@@ -57,7 +63,7 @@ import {
57
63
  import {
58
64
  logResult,
59
65
  runHealthGate
60
- } from "../chunk-33CHRORT.js";
66
+ } from "../chunk-5OWHYOIF.js";
61
67
  import "../chunk-L25OAFOU.js";
62
68
  import "../chunk-RT57D7C4.js";
63
69
  import "../chunk-FTZET5YX.js";
@@ -2076,7 +2082,25 @@ function readInstalledVersion(lockFile) {
2076
2082
  return void 0;
2077
2083
  }
2078
2084
  }
2079
- function printChanges(changes, composeFile, envFile) {
2085
+ function printChanges(changes, composeFile, envFile, retainedHealth) {
2086
+ if (retainedHealth) {
2087
+ if (changes.length > 0) {
2088
+ console.log("Planned image tag changes:");
2089
+ for (const c of changes) console.log(` - ${c.service}: ${c.key}
2090
+ ${c.before ?? "<unset>"} \u2192 ${c.after}`);
2091
+ }
2092
+ console.log("\nCurrent container health (selected service and required dependencies are gates):");
2093
+ for (const [service, container] of retainedHealth.containers) {
2094
+ const critical = retainedHealth.critical.has(service);
2095
+ const healthy = retainedContainerIsHealthy(container, retainedHealth.completedDependencies?.has(service));
2096
+ const label = critical ? "required for this update" : "unrelated, unchanged baseline";
2097
+ console.log(` ${healthy ? "\u2705" : critical ? "\u274C" : "\u26A0\uFE0F"} ${service}: ${container.state}${container.health ? ` (health: ${container.health})` : ""} \u2014 ${label}`);
2098
+ }
2099
+ const failures = assessRetainedHealthBefore(retainedHealth);
2100
+ if (failures.length > 0) console.log(`
2101
+ \u{1F534} Retained-Compose health gate failed: ${failures.join(", ")}`);
2102
+ return failures.length;
2103
+ }
2080
2104
  if (changes.length === 0) {
2081
2105
  const running2 = areCliContainersRunning(composeFile, envFile);
2082
2106
  if (running2) {
@@ -2111,6 +2135,24 @@ function printChanges(changes, composeFile, envFile) {
2111
2135
  }
2112
2136
  return 0;
2113
2137
  }
2138
+ function captureRetainedHealthForCli(composeFile, envFile, selectedService, requiredCore) {
2139
+ const args = composeArgsForStack(composeFile, envFile);
2140
+ const config = spawnSync3("docker", [...args, "config", "--format", "json"], {
2141
+ encoding: "utf8",
2142
+ stdio: ["pipe", "pipe", "pipe"],
2143
+ timeout: 2e4
2144
+ });
2145
+ const companions = expandComposeServicesWithSidecars([selectedService]).slice(1);
2146
+ const critical = retainedCriticalServices(config.status === 0 ? config.stdout : null, selectedService, requiredCore, companions);
2147
+ const completedDependencies = retainedCompletedDependencies(config.stdout, critical, selectedService, requiredCore, companions);
2148
+ const ps = spawnSync3("docker", [...args, "ps", "--all", "--format", "json"], {
2149
+ encoding: "utf8",
2150
+ stdio: ["pipe", "pipe", "pipe"],
2151
+ timeout: 2e4
2152
+ });
2153
+ const containers = parseRetainedContainerHealth(ps.status === 0 ? ps.stdout : null);
2154
+ return { critical, completedDependencies, containers };
2155
+ }
2114
2156
  function areCliContainersRunning(composeFile, envFile) {
2115
2157
  try {
2116
2158
  const result = spawnSync3("docker", [...composeArgsForStack(composeFile, envFile), "ps", "-q"], {
@@ -2411,20 +2453,20 @@ async function main(args = process.argv.slice(2)) {
2411
2453
  }, plan, liveComposeRaw, envRaw, process.env, retainedComposeFiles.override);
2412
2454
  console.log(`[stack-update] Signed live compose retained: base SHA256 ${manifest.stacks[plan.targetVersion]?.config?.composeSha256}` + (retainedComposeFiles.override === null ? " (no override)" : `, override SHA256 ${manifest.stacks[plan.targetVersion]?.config?.composeOverrideSha256}`));
2413
2455
  const selectedService = Object.values(plan.release.services)[0];
2414
- assertRetainedComposeRunningService(
2415
- composeArgsForStack(opts.composeFile, opts.envFile),
2416
- selectedService.composeService ?? opts.serviceName
2417
- );
2418
- assertRetainedComposeRenderedImage(
2419
- composeArgsForStack(opts.composeFile, opts.envFile),
2420
- selectedService.composeService ?? opts.serviceName,
2421
- selectedService.env,
2422
- plan.changes[0].after,
2423
- void 0,
2424
- { ...process.env, [selectedService.env]: plan.changes[0].after }
2425
- );
2456
+ const composeTargets = expandComposeServicesWithSidecars([selectedService.composeService ?? opts.serviceName]);
2457
+ for (const target of composeTargets) {
2458
+ assertRetainedComposeRunningService(composeArgsForStack(opts.composeFile, opts.envFile), target);
2459
+ assertRetainedComposeRenderedImage(
2460
+ composeArgsForStack(opts.composeFile, opts.envFile),
2461
+ target,
2462
+ selectedService.env,
2463
+ plan.changes[0].after,
2464
+ void 0,
2465
+ { ...process.env, [selectedService.env]: plan.changes[0].after }
2466
+ );
2467
+ }
2426
2468
  console.log(
2427
- `[stack-update] If applied: back up stack config and attempt the configured database/off-host backups; write only ${selectedService.env} in the stack .env; update the stack lock and deploy audit; pull and recreate only ${selectedService.composeService ?? opts.serviceName}. Compose, bind-mounted assets, gateway overlays, host hardening, and service selection remain unchanged.`
2469
+ `[stack-update] If applied: back up stack config and attempt the configured database/off-host backups; write only ${selectedService.env} in the stack .env; update the stack lock and deploy audit; pull and recreate only ${composeTargets.join(", ")}. Compose, bind-mounted assets, gateway overlays, host hardening, and service selection remain unchanged.`
2428
2470
  );
2429
2471
  }
2430
2472
  const targetRelease = manifest.stacks[plan.targetVersion];
@@ -2511,7 +2553,16 @@ async function main(args = process.argv.slice(2)) {
2511
2553
  console.log("");
2512
2554
  }
2513
2555
  }
2514
- const unhealthyCount = printChanges(plan.changes, opts.composeFile, opts.envFile);
2556
+ const retainedHealth = opts.retainCompose && targetRelease ? captureRetainedHealthForCli(
2557
+ opts.composeFile,
2558
+ opts.envFile,
2559
+ Object.values(plan.release.services)[0].composeService ?? opts.serviceName,
2560
+ Object.entries(targetRelease.services).filter(([, service]) => service.required === true && service.category === "core").map(([name, service]) => service.composeService ?? name)
2561
+ ) : void 0;
2562
+ const unhealthyCount = printChanges(plan.changes, opts.composeFile, opts.envFile, retainedHealth);
2563
+ if (opts.retainCompose && unhealthyCount > 0 && !opts.check && !opts.dryRun) {
2564
+ throw new Error("--retain-compose refused: selected service or required dependency is unhealthy");
2565
+ }
2515
2566
  printBreaking(plan.breakingChanges);
2516
2567
  if (opts.verifyImages) {
2517
2568
  const started = Date.now();
@@ -2704,6 +2755,7 @@ export {
2704
2755
  isProductionControlPlaneApply,
2705
2756
  manifestSignatureSkipBanner,
2706
2757
  parseArgs as parseStackUpdateArgs,
2758
+ printChanges,
2707
2759
  reportPartialRun,
2708
2760
  resolveManifestSignaturePolicy,
2709
2761
  main as runStackUpdateCli,
@@ -8,7 +8,7 @@ import {
8
8
  logResult,
9
9
  main,
10
10
  runHealthGate
11
- } from "../chunk-33CHRORT.js";
11
+ } from "../chunk-5OWHYOIF.js";
12
12
  import "../chunk-MLKGABMK.js";
13
13
  export {
14
14
  checkCRM,