@agimon-ai/po-core 0.0.0-alpha.13 → 0.0.0-alpha.15

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 (133) hide show
  1. package/dist/extensionFile.cjs +3 -0
  2. package/dist/extensionFile.d.mts +3 -2
  3. package/dist/extensionFile.mjs +3 -1
  4. package/dist/headlessHub.cjs +71 -76
  5. package/dist/headlessHub.cjs.map +1 -1
  6. package/dist/headlessHub.d.mts +23 -13
  7. package/dist/headlessHub.d.mts.map +1 -1
  8. package/dist/headlessHub.mjs +71 -76
  9. package/dist/headlessHub.mjs.map +1 -1
  10. package/dist/headlessSessionHost.d.mts +6 -5
  11. package/dist/headlessSessionHost.d.mts.map +1 -1
  12. package/dist/packageApiServer.cjs +32 -23
  13. package/dist/packageApiServer.cjs.map +1 -1
  14. package/dist/packageApiServer.d.mts +19 -12
  15. package/dist/packageApiServer.d.mts.map +1 -1
  16. package/dist/packageApiServer.mjs +32 -23
  17. package/dist/packageApiServer.mjs.map +1 -1
  18. package/dist/runtimeCordisHost.cjs.map +1 -1
  19. package/dist/runtimeCordisHost.d.mts +1 -1
  20. package/dist/runtimeCordisHost.mjs.map +1 -1
  21. package/dist/serverPlugin.cjs +39 -0
  22. package/dist/serverPlugin.d.mts +12 -0
  23. package/dist/serverPlugin.mjs +11 -0
  24. package/dist/src/extensions/extensionFile.cjs +18 -2
  25. package/dist/src/extensions/extensionFile.cjs.map +1 -1
  26. package/dist/src/extensions/extensionFile.d.mts +14 -1
  27. package/dist/src/extensions/extensionFile.d.mts.map +1 -1
  28. package/dist/src/extensions/extensionFile.mjs +18 -3
  29. package/dist/src/extensions/extensionFile.mjs.map +1 -1
  30. package/dist/src/extensions/serverPlugin.cjs +230 -91
  31. package/dist/src/extensions/serverPlugin.cjs.map +1 -1
  32. package/dist/src/extensions/serverPlugin.d.mts +2 -2
  33. package/dist/src/extensions/serverPlugin.d.mts.map +1 -1
  34. package/dist/src/extensions/serverPlugin.mjs +230 -91
  35. package/dist/src/extensions/serverPlugin.mjs.map +1 -1
  36. package/dist/src/schemas/extensionFile.d.mts +7 -3
  37. package/dist/src/schemas/extensionFile.d.mts.map +1 -1
  38. package/dist/src/schemas/headless.cjs +2 -2
  39. package/dist/src/schemas/headless.cjs.map +1 -1
  40. package/dist/src/schemas/headless.d.mts +11 -10
  41. package/dist/src/schemas/headless.d.mts.map +1 -1
  42. package/dist/src/schemas/headless.mjs +2 -2
  43. package/dist/src/schemas/headless.mjs.map +1 -1
  44. package/dist/src/schemas/hubChannel.cjs.map +1 -1
  45. package/dist/src/schemas/hubChannel.d.mts +1 -1
  46. package/dist/src/schemas/hubChannel.mjs.map +1 -1
  47. package/dist/src/schemas/packageApi.cjs.map +1 -1
  48. package/dist/src/schemas/packageApi.d.mts +1 -1
  49. package/dist/src/schemas/packageApi.mjs.map +1 -1
  50. package/dist/src/schemas/{serverFacet.cjs → serverPlugin.cjs} +29 -37
  51. package/dist/src/schemas/serverPlugin.cjs.map +1 -0
  52. package/dist/src/schemas/{serverFacet.d.mts → serverPlugin.d.mts} +54 -31
  53. package/dist/src/schemas/serverPlugin.d.mts.map +1 -0
  54. package/dist/src/schemas/serverPlugin.mjs +95 -0
  55. package/dist/src/schemas/serverPlugin.mjs.map +1 -0
  56. package/dist/src/schemas/serverScope.cjs +37 -0
  57. package/dist/src/schemas/serverScope.cjs.map +1 -0
  58. package/dist/src/schemas/serverScope.d.mts +77 -0
  59. package/dist/src/schemas/serverScope.d.mts.map +1 -0
  60. package/dist/src/schemas/serverScope.mjs +33 -0
  61. package/dist/src/schemas/serverScope.mjs.map +1 -0
  62. package/dist/src/server/liveImport.cjs +1 -1
  63. package/dist/src/server/liveImport.cjs.map +1 -1
  64. package/dist/src/server/liveImport.d.mts +1 -1
  65. package/dist/src/server/liveImport.mjs +1 -1
  66. package/dist/src/server/liveImport.mjs.map +1 -1
  67. package/dist/src/server/serverPackages.cjs +60 -0
  68. package/dist/src/server/serverPackages.cjs.map +1 -0
  69. package/dist/src/server/serverPackages.d.mts +44 -0
  70. package/dist/src/server/serverPackages.d.mts.map +1 -0
  71. package/dist/src/server/serverPackages.mjs +59 -0
  72. package/dist/src/server/serverPackages.mjs.map +1 -0
  73. package/dist/src/server/serverScope.cjs +507 -0
  74. package/dist/src/server/serverScope.cjs.map +1 -0
  75. package/dist/src/server/serverScope.d.mts +123 -0
  76. package/dist/src/server/serverScope.d.mts.map +1 -0
  77. package/dist/src/server/serverScope.mjs +507 -0
  78. package/dist/src/server/serverScope.mjs.map +1 -0
  79. package/dist/src/services/apiSurfaceAssert/index.cjs.map +1 -1
  80. package/dist/src/services/apiSurfaceAssert/index.d.mts +1 -1
  81. package/dist/src/services/apiSurfaceAssert/index.mjs.map +1 -1
  82. package/dist/src/services/chatgptImages/index.cjs +1 -1
  83. package/dist/src/services/chatgptImages/index.cjs.map +1 -1
  84. package/dist/src/services/chatgptImages/index.mjs +1 -1
  85. package/dist/src/services/chatgptImages/index.mjs.map +1 -1
  86. package/dist/src/services/chatgptWebSearch/index.cjs +1 -1
  87. package/dist/src/services/chatgptWebSearch/index.cjs.map +1 -1
  88. package/dist/src/services/chatgptWebSearch/index.mjs +1 -1
  89. package/dist/src/services/chatgptWebSearch/index.mjs.map +1 -1
  90. package/dist/src/services/headlessClient/index.cjs +1 -1
  91. package/dist/src/services/headlessClient/index.cjs.map +1 -1
  92. package/dist/src/services/headlessClient/index.mjs +1 -1
  93. package/dist/src/services/headlessClient/index.mjs.map +1 -1
  94. package/dist/src/services/piExtensionHost/index.cjs.map +1 -1
  95. package/dist/src/services/piExtensionHost/index.d.mts +1 -1
  96. package/dist/src/services/piExtensionHost/index.mjs.map +1 -1
  97. package/dist/src/services/{serverFacet → serverHost}/index.cjs +3 -3
  98. package/dist/src/services/serverHost/index.cjs.map +1 -0
  99. package/dist/src/services/{serverFacet → serverHost}/index.d.mts +4 -4
  100. package/dist/src/services/serverHost/index.d.mts.map +1 -0
  101. package/dist/src/services/{serverFacet → serverHost}/index.mjs +3 -3
  102. package/dist/src/services/serverHost/index.mjs.map +1 -0
  103. package/dist/src/systems/main/adapters/headlessHost.cjs +3 -3
  104. package/dist/src/systems/main/adapters/headlessHost.cjs.map +1 -1
  105. package/dist/src/systems/main/adapters/headlessHost.d.mts +3 -3
  106. package/dist/src/systems/main/adapters/headlessHost.mjs +3 -3
  107. package/dist/src/systems/main/adapters/headlessHost.mjs.map +1 -1
  108. package/dist/src/systems/main/adapters/headlessSessionHost.cjs +23 -21
  109. package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -1
  110. package/dist/src/systems/main/adapters/headlessSessionHost.d.mts.map +1 -1
  111. package/dist/src/systems/main/adapters/headlessSessionHost.mjs +23 -21
  112. package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
  113. package/dist/src/systems/main/types/headlessHost.d.mts +1 -1
  114. package/dist/src/types/kernel.d.mts +2 -2
  115. package/dist/src/types/server/directHarnessRuntime.d.mts +1 -1
  116. package/dist/src/web/types/webPlugin.d.mts +1 -1
  117. package/package.json +9 -9
  118. package/dist/serverFacet.cjs +0 -34
  119. package/dist/serverFacet.d.mts +0 -10
  120. package/dist/serverFacet.mjs +0 -9
  121. package/dist/src/schemas/serverFacet.cjs.map +0 -1
  122. package/dist/src/schemas/serverFacet.d.mts.map +0 -1
  123. package/dist/src/schemas/serverFacet.mjs +0 -101
  124. package/dist/src/schemas/serverFacet.mjs.map +0 -1
  125. package/dist/src/server/serverFacetLoader.cjs +0 -232
  126. package/dist/src/server/serverFacetLoader.cjs.map +0 -1
  127. package/dist/src/server/serverFacetLoader.d.mts +0 -75
  128. package/dist/src/server/serverFacetLoader.d.mts.map +0 -1
  129. package/dist/src/server/serverFacetLoader.mjs +0 -230
  130. package/dist/src/server/serverFacetLoader.mjs.map +0 -1
  131. package/dist/src/services/serverFacet/index.cjs.map +0 -1
  132. package/dist/src/services/serverFacet/index.d.mts.map +0 -1
  133. package/dist/src/services/serverFacet/index.mjs.map +0 -1
@@ -1,6 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_extensionFile = require("./src/extensions/extensionFile.cjs");
3
+ const require_serverScope = require("./src/schemas/serverScope.cjs");
3
4
  exports.composeRootHooks = require_extensionFile.composeRootHooks;
5
+ exports.composeRootInjects = require_extensionFile.composeRootInjects;
4
6
  exports.defineActivity = require_extensionFile.defineActivity;
5
7
  exports.defineChannel = require_extensionFile.defineChannel;
6
8
  exports.defineCommand = require_extensionFile.defineCommand;
@@ -15,5 +17,6 @@ exports.defineRoutedContribution = require_extensionFile.defineRoutedContributio
15
17
  exports.defineServerCommand = require_extensionFile.defineServerCommand;
16
18
  exports.defineServerTool = require_extensionFile.defineServerTool;
17
19
  exports.defineService = require_extensionFile.defineService;
20
+ exports.defineServiceContract = require_serverScope.defineServiceContract;
18
21
  exports.defineTool = require_extensionFile.defineTool;
19
22
  exports.defineToolRestriction = require_extensionFile.defineToolRestriction;
@@ -1,3 +1,4 @@
1
+ import { defineServiceContract } from "./src/schemas/serverScope.mjs";
1
2
  import { ActivityFile, ChannelFile, CommandContribution, CommandFile, HookFile, MethodFile, OrFactory, PathSupplied, RootDeclaration, RootFile, RouteFile, RoutedCardinality, RoutedFileOptions, ServerCommandFile, ServerToolFile, ServiceFile, ToolContribution, ToolFile, WithRoot } from "./src/schemas/extensionFile.mjs";
2
- import { composeRootHooks, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineTool, defineToolRestriction } from "./src/extensions/extensionFile.mjs";
3
- export { type ActivityFile, type ChannelFile, type CommandContribution, type CommandFile, type HookFile, type MethodFile, type OrFactory, type PathSupplied, type RootDeclaration, type RootFile, type RouteFile, type RoutedCardinality, type RoutedFileOptions, type ServerCommandFile, type ServerToolFile, type ServiceFile, type ToolContribution, type ToolFile, type WithRoot, composeRootHooks, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineTool, defineToolRestriction };
3
+ import { composeRootHooks, composeRootInjects, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineTool, defineToolRestriction } from "./src/extensions/extensionFile.mjs";
4
+ export { type ActivityFile, type ChannelFile, type CommandContribution, type CommandFile, type HookFile, type MethodFile, type OrFactory, type PathSupplied, type RootDeclaration, type RootFile, type RouteFile, type RoutedCardinality, type RoutedFileOptions, type ServerCommandFile, type ServerToolFile, type ServiceFile, type ToolContribution, type ToolFile, type WithRoot, composeRootHooks, composeRootInjects, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineServiceContract, defineTool, defineToolRestriction };
@@ -1 +1,3 @@
1
- export { composeRootHooks, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineTool, defineToolRestriction } from "./src/extensions/extensionFile.mjs";
1
+ import { composeRootHooks, composeRootInjects, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineTool, defineToolRestriction } from "./src/extensions/extensionFile.mjs";
2
+ import { defineServiceContract } from "./src/schemas/serverScope.mjs";
3
+ export { composeRootHooks, composeRootInjects, defineActivity, defineChannel, defineCommand, defineHook, defineMethod, defineMode, defineProvider, defineResource, defineRoot, defineRoute, defineRoutedContribution, defineServerCommand, defineServerTool, defineService, defineServiceContract, defineTool, defineToolRestriction };
@@ -9,9 +9,9 @@ require("./src/schemas/sessionProtocol.cjs");
9
9
  require("./src/constants/agentSettled.cjs");
10
10
  const require_pluginProtocol = require("./src/schemas/pluginProtocol.cjs");
11
11
  require("./pluginProtocol.cjs");
12
- const require_index = require("./src/services/serverFacet/index.cjs");
13
- const require_serverFacetLoader = require("./src/server/serverFacetLoader.cjs");
14
- require("./serverFacet.cjs");
12
+ const require_index = require("./src/services/serverHost/index.cjs");
13
+ const require_serverScope = require("./src/server/serverScope.cjs");
14
+ require("./serverPlugin.cjs");
15
15
  const require_index$1 = require("./src/services/sessionGitStatus/index.cjs");
16
16
  let node_crypto = require("node:crypto");
17
17
  node_crypto = require_runtime.__toESM(node_crypto, 1);
@@ -90,13 +90,18 @@ function createHeadlessHub(options) {
90
90
  const maxDirectEventLatest = 4096;
91
91
  const communicationEndpoints = /* @__PURE__ */ new Map();
92
92
  let closed = false;
93
- const mounts = /* @__PURE__ */ new Map();
94
- const disposeMount = async (mounted) => {
95
- try {
96
- await mounted.installed.dispose();
97
- } finally {
98
- mounted.host.dispose();
93
+ /** The mount table each served global or workspace scope publishes, by mount key. */
94
+ const scopeHosts = /* @__PURE__ */ new Map();
95
+ let globalScope;
96
+ const workspaceScopes = /* @__PURE__ */ new Map();
97
+ const openGlobalScope = () => globalScope ??= require_serverScope.PoServerScope.open("global");
98
+ const openWorkspaceScope = (workspaceId) => {
99
+ let scope = workspaceScopes.get(workspaceId);
100
+ if (scope === void 0) {
101
+ scope = openGlobalScope().then((global) => require_serverScope.PoServerScope.open("workspace", global));
102
+ workspaceScopes.set(workspaceId, scope);
99
103
  }
104
+ return scope;
100
105
  };
101
106
  const workspaces = /* @__PURE__ */ new Map();
102
107
  const worktreeProvisioners = /* @__PURE__ */ new Map();
@@ -745,7 +750,7 @@ function createHeadlessHub(options) {
745
750
  canCommunicate,
746
751
  bindCommunication
747
752
  };
748
- const installMount = async (facets, suppliedContext, announceWorkspace) => {
753
+ const serveScope = async (suppliedContext, packages = []) => {
749
754
  if (closed) throw new Error("The headless hub is closed.");
750
755
  const context = suppliedContext ?? {
751
756
  scope: "global",
@@ -754,14 +759,14 @@ function createHeadlessHub(options) {
754
759
  directEvents,
755
760
  onNotice: (message) => options.onNotice?.(message)
756
761
  };
757
- if (context.scope === "session") throw new Error("Session facets belong to their session host.");
762
+ if (context.scope === "session") throw new Error("Session packages belong to their session host.");
758
763
  if (context.scope === "workspace" && (!context.workspaceId || !context.workspaceRoot)) throw new Error("Workspace mounts require an admitted identity and root.");
759
764
  const mount = context.scope === "global" ? { scope: "global" } : {
760
765
  scope: "workspace",
761
766
  workspaceId: context.workspaceId
762
767
  };
763
768
  const key = mountKey(mount);
764
- if (mounts.has(key)) throw new Error(`The '${key}' facets are already mounted.`);
769
+ if (scopeHosts.has(key)) throw new Error(`The '${key}' scope is already served.`);
765
770
  const host = require_index.createPoServerHost({
766
771
  scope: context.scope,
767
772
  context: {
@@ -783,24 +788,20 @@ function createHeadlessHub(options) {
783
788
  },
784
789
  pluginRegistry
785
790
  });
791
+ let scope;
786
792
  try {
787
- const installed = await require_serverFacetLoader.installServerFacets({
793
+ scope = await (mount.scope === "global" ? openGlobalScope() : openWorkspaceScope(mount.workspaceId));
794
+ await scope.serve({
788
795
  host,
789
- facets,
790
- onNotice: options.onNotice,
791
796
  platform: options.platform
792
797
  });
793
- if (closed) {
794
- await installed.dispose();
795
- throw new Error("The headless hub was closed while mounting facets.");
796
- }
797
- mounts.set(key, {
798
+ scopeHosts.set(key, {
798
799
  host,
799
- installed,
800
- context,
801
- facets
800
+ scope
802
801
  });
803
- if (announceWorkspace && mount.scope === "workspace") {
802
+ await scope.install(packages, { onNotice: (message) => options.onNotice?.(message) });
803
+ if (closed) throw new Error("The headless hub was closed while serving a scope.");
804
+ if (mount.scope === "workspace") {
804
805
  const workspace = {
805
806
  id: mount.workspaceId,
806
807
  root: context.workspaceRoot,
@@ -813,35 +814,20 @@ function createHeadlessHub(options) {
813
814
  });
814
815
  }
815
816
  } catch (error) {
817
+ if (scopeHosts.get(key)?.host === host) scopeHosts.delete(key);
816
818
  host.dispose();
819
+ if (mount.scope === "workspace") workspaceScopes.delete(mount.workspaceId);
820
+ else globalScope = void 0;
821
+ await scope?.dispose();
817
822
  throw error;
818
823
  }
819
824
  };
820
- const mountFacets = (facets, suppliedContext) => installMount(facets, suppliedContext, true);
821
- const replacements = /* @__PURE__ */ new Map();
822
- const replaceFacets = (mount, facets) => {
823
- if (mount.scope === "session") return Promise.reject(/* @__PURE__ */ new Error("Session facets belong to their session host."));
824
- const key = mountKey(mount);
825
- const run = (replacements.get(key) ?? Promise.resolve()).then(async () => {
826
- if (closed) throw new Error("The headless hub is closed.");
827
- const previous = mounts.get(key);
828
- if (previous === void 0) throw new Error(`The '${key}' facets are not mounted.`);
829
- mounts.delete(key);
830
- await disposeMount(previous);
831
- if (closed || mount.scope === "workspace" && !workspaces.has(mount.workspaceId)) return;
832
- try {
833
- await installMount(facets, previous.context, false);
834
- } catch (error) {
835
- await installMount(previous.facets, previous.context, false).catch((rollbackError) => options.onNotice?.(`The '${key}' facets could not be restored (${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)})`));
836
- throw error;
837
- }
838
- });
839
- const settled = run.then(() => void 0, () => void 0);
840
- replacements.set(key, settled);
841
- settled.then(() => {
842
- if (replacements.get(key) === settled) replacements.delete(key);
843
- });
844
- return run;
825
+ const installPackages = async (mount, packages) => {
826
+ if (mount.scope === "session") throw new Error("Session packages belong to their session host.");
827
+ if (closed) throw new Error("The headless hub is closed.");
828
+ const served = scopeHosts.get(mountKey(mount));
829
+ if (served === void 0) throw new Error(`The '${mountKey(mount)}' scope is not served.`);
830
+ await served.scope.install(packages, { onNotice: (message) => options.onNotice?.(message) });
845
831
  };
846
832
  return {
847
833
  sessionService,
@@ -1017,8 +1003,12 @@ function createHeadlessHub(options) {
1017
1003
  sessionId
1018
1004
  });
1019
1005
  },
1020
- mountFacets,
1021
- replaceFacets,
1006
+ serveScope,
1007
+ installPackages,
1008
+ sessionParentScope: (workspaceId) => {
1009
+ if (closed) return Promise.reject(/* @__PURE__ */ new Error("The headless hub is closed."));
1010
+ return workspaceId === void 0 ? openGlobalScope() : openWorkspaceScope(workspaceId);
1011
+ },
1022
1012
  workspaces: () => [...workspaces.values()],
1023
1013
  registerWorkspace(workspace) {
1024
1014
  workspaces.set(workspace.id, workspace);
@@ -1037,17 +1027,23 @@ function createHeadlessHub(options) {
1037
1027
  scope: "workspace",
1038
1028
  workspaceId: id
1039
1029
  });
1040
- const mounted = mounts.get(key);
1041
- if (!workspaces.has(id)) return;
1042
- options.onWorkspaceRemoved?.(id);
1043
- workspaces.delete(id);
1044
- emit({
1045
- kind: "workspace_removed",
1046
- workspaceId: id
1047
- });
1048
- if (!mounted) return;
1049
- mounts.delete(key);
1050
- await disposeMount(mounted);
1030
+ const served = scopeHosts.get(key);
1031
+ scopeHosts.delete(key);
1032
+ const scope = workspaceScopes.get(id);
1033
+ workspaceScopes.delete(id);
1034
+ if (workspaces.has(id)) {
1035
+ options.onWorkspaceRemoved?.(id);
1036
+ workspaces.delete(id);
1037
+ emit({
1038
+ kind: "workspace_removed",
1039
+ workspaceId: id
1040
+ });
1041
+ }
1042
+ try {
1043
+ await (await scope)?.dispose();
1044
+ } finally {
1045
+ served?.host.dispose();
1046
+ }
1051
1047
  },
1052
1048
  async requestApi(mount, basePath, request) {
1053
1049
  if (closed) return Response.json({ error: "Server is closed." }, { status: 503 });
@@ -1064,7 +1060,7 @@ function createHeadlessHub(options) {
1064
1060
  body: request.body === null ? void 0 : new Uint8Array(await request.arrayBuffer())
1065
1061
  });
1066
1062
  }
1067
- const handler = mounts.get(mountKey(mount))?.host.handlerFor(basePath);
1063
+ const handler = scopeHosts.get(mountKey(mount))?.scope.apiHandler(basePath);
1068
1064
  if (!handler) return Response.json({ error: `API '${basePath}' is not mounted in ${mountKey(mount)}.` }, { status: 404 });
1069
1065
  return handler.fetch(request);
1070
1066
  },
@@ -1164,19 +1160,6 @@ function createHeadlessHub(options) {
1164
1160
  for (const cleanup of presentationCleanups.values()) cleanup();
1165
1161
  presentationCleanups.clear();
1166
1162
  const failures = [];
1167
- for (const mounted of [...mounts.values()].reverse()) {
1168
- try {
1169
- await mounted.installed.dispose();
1170
- } catch (error) {
1171
- failures.push(error);
1172
- }
1173
- try {
1174
- mounted.host.dispose();
1175
- } catch (error) {
1176
- failures.push(error);
1177
- }
1178
- }
1179
- mounts.clear();
1180
1163
  pluginRegistry.dispose();
1181
1164
  editPresence.clear();
1182
1165
  workspaces.clear();
@@ -1191,6 +1174,18 @@ function createHeadlessHub(options) {
1191
1174
  sessions.clear();
1192
1175
  const outcomes = await Promise.allSettled(shutdowns);
1193
1176
  for (const outcome of outcomes) if (outcome.status === "rejected") failures.push(outcome.reason);
1177
+ try {
1178
+ await (await globalScope)?.dispose();
1179
+ } catch (error) {
1180
+ failures.push(error);
1181
+ }
1182
+ for (const { host } of scopeHosts.values()) try {
1183
+ host.dispose();
1184
+ } catch (error) {
1185
+ failures.push(error);
1186
+ }
1187
+ scopeHosts.clear();
1188
+ workspaceScopes.clear();
1194
1189
  if (failures.length) throw new AggregateError(failures, "Mount shutdown failed");
1195
1190
  }
1196
1191
  };