@askexenow/exe-os 0.9.269 → 0.9.270

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/deploy/compose/.env.customer.example +2 -0
  2. package/deploy/compose/.env.default +1 -0
  3. package/deploy/compose/.env.example +2 -0
  4. package/deploy/compose/docker-compose.yml +1 -0
  5. package/deploy/compose/generate-env.ts +5 -0
  6. package/deploy/compose/init-db.sql +236 -56
  7. package/dist/bin/cli.js +1 -1
  8. package/dist/bin/exe-forget.js +1 -1
  9. package/dist/bin/exe-new-employee.js +1 -1
  10. package/dist/bin/exe-search.js +1 -1
  11. package/dist/bin/exe-start.sh +28 -1
  12. package/dist/bin/install.js +1 -1
  13. package/dist/bin/setup.js +1 -1
  14. package/dist/bin/stack-update.js +2 -2
  15. package/dist/bin/vps-health-gate.js +1 -1
  16. package/dist/catchup-brief-7G3HIQT3.js +151 -0
  17. package/dist/catchup-brief-IA2K5RYM.js +151 -0
  18. package/dist/catchup-brief-KABFKY7U.js +151 -0
  19. package/dist/chunk-4GJHWD4H.js +1148 -0
  20. package/dist/chunk-6H7PZOYD.js +58 -0
  21. package/dist/chunk-AQU2CVD4.js +1148 -0
  22. package/dist/chunk-AX6EKVRZ.js +13696 -0
  23. package/dist/chunk-DFI2IZXM.js +1395 -0
  24. package/dist/chunk-EM4EYF3P.js +149 -0
  25. package/dist/chunk-F7RM3Z4R.js +230 -0
  26. package/dist/chunk-LMYSCMSQ.js +1148 -0
  27. package/dist/chunk-RJVFHGFD.js +13696 -0
  28. package/dist/chunk-U2O2UXVQ.js +13696 -0
  29. package/dist/chunk-X56OLWQS.js +58 -0
  30. package/dist/chunk-YYO5RQRT.js +1021 -0
  31. package/dist/chunk-ZFHXFDWX.js +58 -0
  32. package/dist/hooks/error-recall.js +1 -1
  33. package/dist/hooks/manifest.json +4 -4
  34. package/dist/hooks/prompt-submit.js +1 -1
  35. package/dist/hooks/session-start.js +1 -1
  36. package/dist/lib/exe-daemon.js +49 -3
  37. package/dist/lib/hybrid-search.js +1 -1
  38. package/dist/lib/session-wrappers.js +1 -1
  39. package/dist/mcp/register-tools.js +3 -3
  40. package/dist/mcp/server.js +3 -3
  41. package/dist/reranker-7GCUQ6LC.js +19 -0
  42. package/dist/reranker-NLH3VBTN.js +19 -0
  43. package/dist/reranker-RUOD4YHZ.js +19 -0
  44. package/dist/setup-wizard-M7A7MXH4.js +12 -0
  45. package/dist/stack-update-MYPMZQEI.js +52 -0
  46. package/dist/task-enforcement-CJKWU43B.js +364 -0
  47. package/dist/task-enforcement-FYDLTS3R.js +391 -0
  48. package/dist/task-enforcement-YXKZYS5L.js +369 -0
  49. package/package.json +1 -1
  50. package/release-notes.json +33 -14
  51. package/stack.release.json +48 -48
@@ -0,0 +1,58 @@
1
+ import {
2
+ MODELS_DIR
3
+ } from "./chunk-VXIMSRTO.js";
4
+
5
+ // src/lib/reranker.ts
6
+ import path from "path";
7
+ import { existsSync } from "fs";
8
+ var RERANKER_MODEL_FILE = "jina-reranker-v3-q4_k_m.gguf";
9
+ function isRerankerAvailable() {
10
+ return existsSync(path.join(MODELS_DIR, RERANKER_MODEL_FILE));
11
+ }
12
+ function getRerankerModelPath() {
13
+ return path.join(MODELS_DIR, RERANKER_MODEL_FILE);
14
+ }
15
+ async function disposeReranker() {
16
+ }
17
+ async function rerankWithScores(query, texts, topK) {
18
+ if (texts.length === 0) return [];
19
+ const { rerankViaWorker } = await import("./lib/exe-daemon.js");
20
+ const scored = await rerankViaWorker(query, texts, topK);
21
+ return scored.map((s) => ({
22
+ text: texts[s.index] ?? "",
23
+ score: s.score,
24
+ index: s.index
25
+ }));
26
+ }
27
+ async function rerank(query, candidates, topK = 5) {
28
+ if (candidates.length === 0) return [];
29
+ if (candidates.length <= topK) return candidates;
30
+ const scored = await rerankWithScores(
31
+ query,
32
+ candidates.map((c) => c.raw_text),
33
+ topK
34
+ );
35
+ return scored.map((s) => candidates[s.index]);
36
+ }
37
+ async function rerankWithContext(query, candidates, topK) {
38
+ if (candidates.length === 0) return [];
39
+ const formattedTexts = candidates.map(
40
+ (c) => c.context ? `[${c.context}] ${c.text.slice(0, 460)}` : c.text.slice(0, 512)
41
+ );
42
+ const { rerankViaWorker } = await import("./lib/exe-daemon.js");
43
+ const scored = await rerankViaWorker(query, formattedTexts, topK);
44
+ return scored.map((s) => ({
45
+ text: candidates[s.index]?.text ?? "",
46
+ score: s.score,
47
+ index: s.index
48
+ }));
49
+ }
50
+
51
+ export {
52
+ isRerankerAvailable,
53
+ getRerankerModelPath,
54
+ disposeReranker,
55
+ rerankWithScores,
56
+ rerank,
57
+ rerankWithContext
58
+ };
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  hybridSearch,
6
6
  lightweightSearch
7
- } from "../chunk-HYI4PN4J.js";
7
+ } from "../chunk-LMYSCMSQ.js";
8
8
  import {
9
9
  initStore
10
10
  } from "../chunk-5MOYMGS5.js";
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-06-10T16:07:09.480Z",
3
+ "generatedAt": "2026-06-11T07:58:33.288Z",
4
4
  "hashes": {
5
5
  "bug-report-worker.js": "e896e6ae6decaa81577180af6023c624d80fd57394e44b055ccf216cdae12bb4",
6
6
  "codex-stop-task-finalizer.js": "b891f44156fb9ee55bd16b75fe203c48cd5d045f312fd8579dcb4441e0a4f2d1",
7
7
  "commit-complete.js": "9235763142c96dde44389ee9fb2ad890fe44c386dbd192994d3076ad40144606",
8
- "error-recall.js": "d389264838f8fee37757d58c4bbf1a02794c49dd82272c7e25c032b9a6f55551",
8
+ "error-recall.js": "844d0ae3d1407de24a1a3d64134b4e4750708c99d82a0b642f46b42bf9de4d1a",
9
9
  "exe-heartbeat-hook.js": "96070a71bc3e19b8644fe77b7bc400a8286570e75c04dfdce139050f409776a4",
10
10
  "ingest-worker.js": "bec72f3d97677faf924c58c7d1cedfbc044ca2bed82e10b4fbbe84fdc29ec5c7",
11
11
  "ingest.js": "2c915457864682e968e58365a84e1de8335535154a4d4767096d9bb56db07a2d",
@@ -15,9 +15,9 @@
15
15
  "post-tool-combined.js": "b987f325de9f8c9bf6fa609d1754985c7384916df55265ee99c39c7eb63531e6",
16
16
  "pre-compact.js": "2ca0094427fd634732c3f0012a0e91d54854e20f7b86468deaa56ad2b3081540",
17
17
  "pre-tool-use.js": "81427b7d610fa67ee45dfcf353ad2803e35d83e89b15f52596592f4fe453ef63",
18
- "prompt-submit.js": "3ad4e031ecc19cd3a4d45e6aef872eb4ecabb6cb5df9620ec01aeb12c3ebfe86",
18
+ "prompt-submit.js": "f18f4cb79eb1bccf4960ad28e3621b553ade43d652a2f22154d26537a03921be",
19
19
  "session-end.js": "bbab93ba92dcf55c68be8b8daeb099670776619cda4c2f9ac1e67420ae58a05e",
20
- "session-start.js": "4a165d17609c1e19d2ac15bf7aebdc5e1013d7e92ec2a7cfc0568703380af32b",
20
+ "session-start.js": "4e23882d7bb91bd71fecedb8552f8597fceb8e3e8cfc8b09bc2b32863afa43f1",
21
21
  "stop.js": "3e601ea77a42f8533a1fba55e65725cce888d7fed44eb3803b55f5cbfa01e617",
22
22
  "subagent-stop.js": "1fa828a24117fe000db120d7dffc3835d518e2d51aec3aa7a11aee668c7d66ce",
23
23
  "summary-worker.js": "1215f908f6203e9aaed923a3f7173960407a981e62e338a839b09c484f07f5bd"
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  hybridSearch,
3
3
  lightweightSearch
4
- } from "../chunk-HYI4PN4J.js";
4
+ } from "../chunk-LMYSCMSQ.js";
5
5
  import {
6
6
  initStore
7
7
  } from "../chunk-5MOYMGS5.js";
@@ -163,7 +163,7 @@ You are **${ag.agentId}**. Daemon is degraded \u2014 memory unavailable.
163
163
  query = `last actions on ${projectName}`;
164
164
  header = "## Resuming Session\nHere's where you left off:";
165
165
  try {
166
- const { buildCatchupBrief } = await import("../catchup-brief-Z7SNTGLV.js");
166
+ const { buildCatchupBrief } = await import("../catchup-brief-7G3HIQT3.js");
167
167
  const brief = await buildCatchupBrief(
168
168
  agentId,
169
169
  projectName,
@@ -2002,6 +2002,15 @@ async function startMcpHttpServer() {
2002
2002
  });
2003
2003
  }, mcpSessionOwnerKey2 = function(details) {
2004
2004
  return `${details.runtime}:${details.agentId}:${details.sessionHint || `anon-${randomUUID().slice(0, 8)}`}`;
2005
+ }, resolveMcpSessionDetails2 = function(sessionId, requestDetails) {
2006
+ const persisted = sessionDetails.get(sessionId);
2007
+ if (!persisted) return requestDetails;
2008
+ return {
2009
+ agentId: requestDetails.agentId === "default" ? persisted.agentId : requestDetails.agentId,
2010
+ agentRole: requestDetails.agentRole === "employee" ? persisted.agentRole : requestDetails.agentRole,
2011
+ runtime: requestDetails.runtime === "Unknown" ? persisted.runtime : requestDetails.runtime,
2012
+ sessionHint: requestDetails.sessionHint || persisted.sessionHint
2013
+ };
2005
2014
  }, evictDuplicateMcpSessions2 = function(ownerKey, keepSid) {
2006
2015
  for (const [sid, existingOwner] of sessionOwnerKeys.entries()) {
2007
2016
  if (sid !== keepSid && existingOwner === ownerKey) {
@@ -2074,7 +2083,7 @@ async function startMcpHttpServer() {
2074
2083
  }));
2075
2084
  recordMcpHttpEvent({ level: "warn", message, status, ...extra });
2076
2085
  };
2077
- var parseDurationMs = parseDurationMs2, closeMcpSession = closeMcpSession2, mcpSessionOwnerKey = mcpSessionOwnerKey2, evictDuplicateMcpSessions = evictDuplicateMcpSessions2, pruneStaleRecoveryAliases = pruneStaleRecoveryAliases2, getRecoveredMcpSession = getRecoveredMcpSession2, sweepStaleMcpSessions = sweepStaleMcpSessions2, getJsonRpcId = getJsonRpcId2, sendJsonRpcError = sendJsonRpcError2;
2086
+ var parseDurationMs = parseDurationMs2, closeMcpSession = closeMcpSession2, mcpSessionOwnerKey = mcpSessionOwnerKey2, resolveMcpSessionDetails = resolveMcpSessionDetails2, evictDuplicateMcpSessions = evictDuplicateMcpSessions2, pruneStaleRecoveryAliases = pruneStaleRecoveryAliases2, getRecoveredMcpSession = getRecoveredMcpSession2, sweepStaleMcpSessions = sweepStaleMcpSessions2, getJsonRpcId = getJsonRpcId2, sendJsonRpcError = sendJsonRpcError2;
2078
2087
  process.stderr.write("[exed] MCP HTTP: importing SDK modules...\n");
2079
2088
  const { McpServer } = await import("@modelcontextprotocol/sdk/server/mcp.js");
2080
2089
  const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
@@ -2687,8 +2696,11 @@ async function startMcpHttpServer() {
2687
2696
  registerAllTools(wrappedMcp, gateState.license, gateState.hasKey);
2688
2697
  await sessionMcp.connect(transport);
2689
2698
  } else if (sessionId && !transports.has(sessionId) && req.method === "POST") {
2690
- const details = { agentId, agentRole, runtime, sessionHint };
2699
+ const details = resolveMcpSessionDetails2(sessionId, { agentId, agentRole, runtime, sessionHint });
2691
2700
  const recovered = await createRecoveredMcpSession(sessionId, details);
2701
+ agentId = details.agentId;
2702
+ agentRole = details.agentRole;
2703
+ sessionHint = details.sessionHint ?? "";
2692
2704
  transport = recovered.transport;
2693
2705
  req.headers["mcp-session-id"] = recovered.sessionId;
2694
2706
  } else if (sessionId && !transports.has(sessionId) && req.method === "DELETE") {
@@ -4100,7 +4112,7 @@ function startTaskEnforcementScanner() {
4100
4112
  const tick = async () => traceDaemonTimer("task_enforcement", async () => {
4101
4113
  fired("task_enforcement");
4102
4114
  try {
4103
- const { runTaskEnforcementTick } = await import("../task-enforcement-CO3UKUD3.js");
4115
+ const { runTaskEnforcementTick } = await import("../task-enforcement-FYDLTS3R.js");
4104
4116
  const { getTransport } = await import("./transport.js");
4105
4117
  const { loadAgentConfig } = await import("./agent-config.js");
4106
4118
  const { getClient } = await import("./database.js");
@@ -4119,6 +4131,7 @@ function startTaskEnforcementScanner() {
4119
4131
  const { checkAutoWakeGates } = await import("../daemon-orchestration-G5HGOMGQ.js");
4120
4132
  const { ensureEmployee } = await import("./tmux-routing.js");
4121
4133
  const { shouldAutoInstance } = await import("./employees.js");
4134
+ const { recordOrchestrationEventBestEffort } = await import("../orchestration-events-SSAWHTVL.js");
4122
4135
  const projectDir = process.cwd();
4123
4136
  await runTaskEnforcementTick({
4124
4137
  transport: enforcementTransport,
@@ -4140,6 +4153,39 @@ function startTaskEnforcementScanner() {
4140
4153
  return null;
4141
4154
  }
4142
4155
  return ensureEmployee(reviewerName, sessionScope, projectDir, shouldAutoInstance(reviewerName));
4156
+ },
4157
+ zombieWorkerRecover: (session, agentName, sessionScope, reason) => {
4158
+ const gateReason = checkAutoWakeGates(`mcp-zombie::${agentName}::${sessionScope || session}`, Date.now());
4159
+ if (gateReason) {
4160
+ process.stderr.write(
4161
+ `[exed] MCP zombie recovery GATED: ${session} \u2014 ${gateReason}
4162
+ `
4163
+ );
4164
+ return;
4165
+ }
4166
+ process.stderr.write(`[exed] MCP zombie recovery: killing ${session} (${reason}) for task resume
4167
+ `);
4168
+ try {
4169
+ transport.kill(session);
4170
+ } catch (err) {
4171
+ process.stderr.write(`[exed] MCP zombie recovery kill failed for ${session}: ${err instanceof Error ? err.message : String(err)}
4172
+ `);
4173
+ }
4174
+ const resumeScope = sessionScope || (session.includes("-") ? session.slice(session.lastIndexOf("-") + 1) : "");
4175
+ const resumeResult = resumeScope ? ensureEmployee(agentName, resumeScope, projectDir, shouldAutoInstance(agentName)) : null;
4176
+ if (resumeResult?.error) {
4177
+ process.stderr.write(`[exed] MCP zombie recovery resume failed for ${agentName}: ${resumeResult.error}
4178
+ `);
4179
+ }
4180
+ recordOrchestrationEventBestEffort({
4181
+ eventType: "session.recovered",
4182
+ source: "exe-daemon.mcpZombieRecovery",
4183
+ agentId: agentName,
4184
+ sessionScope: resumeScope || null,
4185
+ tmuxSession: session,
4186
+ result: resumeResult?.error ? "resume_failed" : "killed_and_resumed",
4187
+ payload: { reason, resumeStatus: resumeResult?.status ?? null }
4188
+ });
4143
4189
  }
4144
4190
  });
4145
4191
  acted("task_enforcement");
@@ -5,7 +5,7 @@ import {
5
5
  recentRecords,
6
6
  rrfMerge,
7
7
  rrfMergeMulti
8
- } from "../chunk-HYI4PN4J.js";
8
+ } from "../chunk-LMYSCMSQ.js";
9
9
  import "../chunk-5MOYMGS5.js";
10
10
  import "../chunk-CHCA3ZM2.js";
11
11
  import "../chunk-RSIDQBIG.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateSessionWrappers
3
- } from "../chunk-GBCZXOWU.js";
3
+ } from "../chunk-EM4EYF3P.js";
4
4
  import "../chunk-MLKGABMK.js";
5
5
  export {
6
6
  generateSessionWrappers
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  registerAllTools
3
- } from "../chunk-LSV3ODBA.js";
3
+ } from "../chunk-AX6EKVRZ.js";
4
4
  import "../chunk-DIZLK77N.js";
5
5
  import "../chunk-557C2IGL.js";
6
6
  import "../chunk-FO6CLTAL.js";
7
7
  import "../chunk-DLTODKBW.js";
8
- import "../chunk-KUACUU74.js";
8
+ import "../chunk-6H7PZOYD.js";
9
9
  import "../chunk-2WBBVEIB.js";
10
10
  import "../chunk-3VTC7TJF.js";
11
11
  import "../chunk-IOVGBFTA.js";
@@ -61,7 +61,7 @@ import "../chunk-M7GR2WO4.js";
61
61
  import "../chunk-474SY5VD.js";
62
62
  import "../chunk-KFYOA37Q.js";
63
63
  import "../chunk-7IZWLMTP.js";
64
- import "../chunk-HYI4PN4J.js";
64
+ import "../chunk-LMYSCMSQ.js";
65
65
  import "../chunk-5MOYMGS5.js";
66
66
  import "../chunk-CHCA3ZM2.js";
67
67
  import "../chunk-RSIDQBIG.js";
@@ -3,12 +3,12 @@ import {
3
3
  } from "../chunk-V4TZI6EO.js";
4
4
  import {
5
5
  registerAllTools
6
- } from "../chunk-LSV3ODBA.js";
6
+ } from "../chunk-AX6EKVRZ.js";
7
7
  import "../chunk-DIZLK77N.js";
8
8
  import "../chunk-557C2IGL.js";
9
9
  import "../chunk-FO6CLTAL.js";
10
10
  import "../chunk-DLTODKBW.js";
11
- import "../chunk-KUACUU74.js";
11
+ import "../chunk-6H7PZOYD.js";
12
12
  import {
13
13
  initLicenseGate
14
14
  } from "../chunk-2WBBVEIB.js";
@@ -71,7 +71,7 @@ import "../chunk-M7GR2WO4.js";
71
71
  import "../chunk-474SY5VD.js";
72
72
  import "../chunk-KFYOA37Q.js";
73
73
  import "../chunk-7IZWLMTP.js";
74
- import "../chunk-HYI4PN4J.js";
74
+ import "../chunk-LMYSCMSQ.js";
75
75
  import {
76
76
  disposeStore,
77
77
  initStore
@@ -0,0 +1,19 @@
1
+ import {
2
+ disposeReranker,
3
+ getRerankerModelPath,
4
+ isRerankerAvailable,
5
+ rerank,
6
+ rerankWithContext,
7
+ rerankWithScores
8
+ } from "./chunk-ZFHXFDWX.js";
9
+ import "./chunk-VXIMSRTO.js";
10
+ import "./chunk-LYH5HE24.js";
11
+ import "./chunk-MLKGABMK.js";
12
+ export {
13
+ disposeReranker,
14
+ getRerankerModelPath,
15
+ isRerankerAvailable,
16
+ rerank,
17
+ rerankWithContext,
18
+ rerankWithScores
19
+ };
@@ -0,0 +1,19 @@
1
+ import {
2
+ disposeReranker,
3
+ getRerankerModelPath,
4
+ isRerankerAvailable,
5
+ rerank,
6
+ rerankWithContext,
7
+ rerankWithScores
8
+ } from "./chunk-X56OLWQS.js";
9
+ import "./chunk-VXIMSRTO.js";
10
+ import "./chunk-LYH5HE24.js";
11
+ import "./chunk-MLKGABMK.js";
12
+ export {
13
+ disposeReranker,
14
+ getRerankerModelPath,
15
+ isRerankerAvailable,
16
+ rerank,
17
+ rerankWithContext,
18
+ rerankWithScores
19
+ };
@@ -0,0 +1,19 @@
1
+ import {
2
+ disposeReranker,
3
+ getRerankerModelPath,
4
+ isRerankerAvailable,
5
+ rerank,
6
+ rerankWithContext,
7
+ rerankWithScores
8
+ } from "./chunk-6H7PZOYD.js";
9
+ import "./chunk-VXIMSRTO.js";
10
+ import "./chunk-LYH5HE24.js";
11
+ import "./chunk-MLKGABMK.js";
12
+ export {
13
+ disposeReranker,
14
+ getRerankerModelPath,
15
+ isRerankerAvailable,
16
+ rerank,
17
+ rerankWithContext,
18
+ rerankWithScores
19
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ runSetupWizard,
3
+ validateModel
4
+ } from "./chunk-YYO5RQRT.js";
5
+ import "./chunk-K333WOW4.js";
6
+ import "./chunk-VXIMSRTO.js";
7
+ import "./chunk-LYH5HE24.js";
8
+ import "./chunk-MLKGABMK.js";
9
+ export {
10
+ runSetupWizard,
11
+ validateModel
12
+ };
@@ -0,0 +1,52 @@
1
+ import {
2
+ assertBreakingChangesAllowed,
3
+ assertDeploymentScopeAllowed,
4
+ assertHostReadyForApply,
5
+ assertProductionDeployGate,
6
+ bootstrapStackHost,
7
+ canonicalizeStackManifest,
8
+ collectProductionDeployGateIssues,
9
+ createStackUpdatePlan,
10
+ defaultStackPaths,
11
+ findLatestBackupEnvFile,
12
+ hardenHost,
13
+ listAvailableVersions,
14
+ loadStackManifest,
15
+ pairMonitorAgent,
16
+ parseEnv,
17
+ parseStackManifest,
18
+ patchEnv,
19
+ readCurrentStackVersion,
20
+ rollbackStackUpdate,
21
+ runStackUpdate,
22
+ verifyReleaseHealth,
23
+ verifyStackManifestSignature
24
+ } from "./chunk-DFI2IZXM.js";
25
+ import "./chunk-MOZ2YQ54.js";
26
+ import "./chunk-VXIMSRTO.js";
27
+ import "./chunk-LYH5HE24.js";
28
+ import "./chunk-MLKGABMK.js";
29
+ export {
30
+ assertBreakingChangesAllowed,
31
+ assertDeploymentScopeAllowed,
32
+ assertHostReadyForApply,
33
+ assertProductionDeployGate,
34
+ bootstrapStackHost,
35
+ canonicalizeStackManifest,
36
+ collectProductionDeployGateIssues,
37
+ createStackUpdatePlan,
38
+ defaultStackPaths,
39
+ findLatestBackupEnvFile,
40
+ hardenHost,
41
+ listAvailableVersions,
42
+ loadStackManifest,
43
+ pairMonitorAgent,
44
+ parseEnv,
45
+ parseStackManifest,
46
+ patchEnv,
47
+ readCurrentStackVersion,
48
+ rollbackStackUpdate,
49
+ runStackUpdate,
50
+ verifyReleaseHealth,
51
+ verifyStackManifestSignature
52
+ };