@dxos/app-framework 0.13.0 → 0.14.0
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.
- package/CHANGELOG.md +38 -0
- package/dist/lib/chunk-process-manager-capability.mjs +69 -13
- package/dist/lib/chunk-process-manager-capability.mjs.map +1 -1
- package/dist/lib/common/capabilities.mjs.map +1 -1
- package/dist/lib/vite-plugin/packages.mjs +0 -1
- package/dist/lib/vite-plugin/packages.mjs.map +1 -1
- package/dist/types/src/common/capabilities.d.ts +2 -2
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +10 -1
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -1
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -26
- package/src/common/capabilities.ts +1 -2
- package/src/plugin-process-manager/process-manager-capability.test.ts +78 -1
- package/src/plugin-process-manager/process-manager-capability.ts +103 -26
- package/src/vite-plugin/packages.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @dxos/app-framework
|
|
2
2
|
|
|
3
|
+
## 0.14.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0715304: An app now has one process manager: the stack's `Process.ManagerService`, which the app's operation invoker, `Capabilities.ProcessManager` and `AgentService` all use. Operations the app invokes with `on: 'edge'` therefore run on EDGE instead of dying with "Remote process requested, but RemoteProcessManager offers no process control", which an agent's watches and Brain store views logged every three seconds. `@dxos/app-framework` now owns the unified-manager spec that `@dxos/plugin-routine` used to contribute, with a no-op remote manager as a fallback, and a `LayerStack` spec now outranks an ambient service of the same tag.
|
|
8
|
+
- Updated dependencies [0715304]
|
|
9
|
+
- Updated dependencies [ec6da5a]
|
|
10
|
+
- Updated dependencies [a1e64db]
|
|
11
|
+
- Updated dependencies [28bb45b]
|
|
12
|
+
- Updated dependencies [1eed6b1]
|
|
13
|
+
- Updated dependencies [6847fe2]
|
|
14
|
+
- Updated dependencies [35217f4]
|
|
15
|
+
- Updated dependencies [1819960]
|
|
16
|
+
- Updated dependencies [eb5d14d]
|
|
17
|
+
- Updated dependencies [5324de6]
|
|
18
|
+
- Updated dependencies [b07f49f]
|
|
19
|
+
- @dxos/compute-runtime@0.14.0
|
|
20
|
+
- @dxos/compute@0.14.0
|
|
21
|
+
- @dxos/echo@0.14.0
|
|
22
|
+
- @dxos/effect@0.14.0
|
|
23
|
+
- @dxos/ui-theme@0.14.0
|
|
24
|
+
- @dxos/operation@0.14.0
|
|
25
|
+
- @dxos/graph@0.14.0
|
|
26
|
+
- @dxos/edge-client@0.14.0
|
|
27
|
+
- @dxos/protocols@0.14.0
|
|
28
|
+
- @dxos/async@0.14.0
|
|
29
|
+
- @dxos/context@0.14.0
|
|
30
|
+
- @dxos/debug@0.14.0
|
|
31
|
+
- @dxos/errors@0.14.0
|
|
32
|
+
- @dxos/invariant@0.14.0
|
|
33
|
+
- @dxos/keys@0.14.0
|
|
34
|
+
- @dxos/log@0.14.0
|
|
35
|
+
- @dxos/util@0.14.0
|
|
36
|
+
- @dxos/web-context@0.14.0
|
|
37
|
+
- @dxos/web-context-react@0.14.0
|
|
38
|
+
- @dxos/react-error-boundary@0.14.0
|
|
39
|
+
- @dxos/react-hooks@0.14.0
|
|
40
|
+
|
|
3
41
|
## 0.13.0
|
|
4
42
|
|
|
5
43
|
### Minor Changes
|
|
@@ -3,15 +3,20 @@ import { Service as Service$1 } from "./core/plugin.mjs";
|
|
|
3
3
|
import { AtomRegistry, LayerSpec as LayerSpec$1, OperationHandler, OperationHandlers, OperationInvoker, ProcessManager as ProcessManager$1, ProcessManagerRuntime, RemoteTraceMonitor as RemoteTraceMonitor$1, ServiceResolver as ServiceResolver$1, TraceSink } from "./common/capabilities.mjs";
|
|
4
4
|
import { r as layerIdb } from "./chunk-ProcessManagerPlugin.mjs";
|
|
5
5
|
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Exit from "effect/Exit";
|
|
6
7
|
import { log } from "@dxos/log";
|
|
8
|
+
import * as Context from "effect/Context";
|
|
7
9
|
import * as Layer from "effect/Layer";
|
|
10
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
8
11
|
import { invariant } from "@dxos/invariant";
|
|
12
|
+
import * as Scope from "effect/Scope";
|
|
9
13
|
import * as OperationHandlerSet from "@dxos/compute/OperationHandlerSet";
|
|
10
14
|
import * as ServiceResolver from "@dxos/compute/ServiceResolver";
|
|
15
|
+
import * as Stream from "effect/Stream";
|
|
11
16
|
import * as ManagedRuntime from "effect/ManagedRuntime";
|
|
12
17
|
import * as Registry from "effect/reactivity/AtomRegistry";
|
|
13
18
|
import * as Tracer from "effect/Tracer";
|
|
14
|
-
import { LayerStack, ProcessManager, RemoteProcessManager, RemoteTraceMonitor, UnifiedProcessManager } from "@dxos/compute-runtime";
|
|
19
|
+
import { LayerStack, ProcessManager, ProcessOperationInvoker, RemoteProcessManager, RemoteTraceMonitor, UnifiedProcessManager } from "@dxos/compute-runtime";
|
|
15
20
|
import * as LayerSpec from "@dxos/compute/LayerSpec";
|
|
16
21
|
import * as Process from "@dxos/compute/Process";
|
|
17
22
|
import * as Trace from "@dxos/compute/Trace";
|
|
@@ -42,7 +47,7 @@ var makeDynamicTraceSink = (getFactories, resolver) => {
|
|
|
42
47
|
log.warn("trace sink factory failed", { err }, {
|
|
43
48
|
"~LogMeta": "~LogMeta",
|
|
44
49
|
F: __dxlog_file,
|
|
45
|
-
L:
|
|
50
|
+
L: 86,
|
|
46
51
|
S: void 0
|
|
47
52
|
});
|
|
48
53
|
}
|
|
@@ -51,6 +56,44 @@ var makeDynamicTraceSink = (getFactories, resolver) => {
|
|
|
51
56
|
};
|
|
52
57
|
return { write: (message) => Trace.mergeSinks(resolve()).write(message) };
|
|
53
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* The application's one {@link Process.ManagerService}, as built by the stack. Every built-in and plugin
|
|
61
|
+
* consumer sees the same manager, so a host's remote manager (e.g. EDGE) reaches the app's invoker too.
|
|
62
|
+
*/
|
|
63
|
+
var ProcessManagerSpec = LayerSpec.make({
|
|
64
|
+
affinity: "application",
|
|
65
|
+
requires: [
|
|
66
|
+
ProcessManager.ProcessManagerService,
|
|
67
|
+
RemoteProcessManager.Service,
|
|
68
|
+
RemoteTraceMonitor.Service,
|
|
69
|
+
Registry.AtomRegistry
|
|
70
|
+
],
|
|
71
|
+
provides: [Process.ManagerService]
|
|
72
|
+
}, () => UnifiedProcessManager.layer);
|
|
73
|
+
/**
|
|
74
|
+
* A {@link Process.Manager} that is the stack's {@link Process.ManagerService}, resolved on first use: building it
|
|
75
|
+
* resolves the host's remote manager, which may need services (the client) that are not ready at activation.
|
|
76
|
+
* The process tree reads empty until then.
|
|
77
|
+
*/
|
|
78
|
+
var fromStack = (resolver, scope, registry) => {
|
|
79
|
+
const resolvedAtom = Atom.make(void 0).pipe(Atom.keepAlive);
|
|
80
|
+
const manager = Effect.suspend(() => {
|
|
81
|
+
const resolved = registry.get(resolvedAtom);
|
|
82
|
+
return resolved !== void 0 ? Effect.succeed(resolved) : resolver.resolve(Process.ManagerService, {}).pipe(Scope.provide(scope), Effect.tap((stackManager) => Effect.sync(() => registry.set(resolvedAtom, stackManager))), Effect.orDie);
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
processTree: Effect.flatMap(manager, (stackManager) => stackManager.processTree),
|
|
86
|
+
processTreeAtom: Atom.make((get) => {
|
|
87
|
+
const stackManager = get(resolvedAtom);
|
|
88
|
+
return stackManager === void 0 ? [] : get(stackManager.processTreeAtom);
|
|
89
|
+
}),
|
|
90
|
+
list: (filter) => Effect.flatMap(manager, (stackManager) => stackManager.list(filter)),
|
|
91
|
+
subscribeToTraceMessages: (filter) => Stream.unwrap(Effect.map(manager, (stackManager) => stackManager.subscribeToTraceMessages(filter))),
|
|
92
|
+
spawn: (definition, options) => Effect.flatMap(manager, (stackManager) => stackManager.spawn(definition, options)),
|
|
93
|
+
handles: (options) => Effect.flatMap(manager, (stackManager) => stackManager.handles(options)),
|
|
94
|
+
attach: (pid, options) => Effect.flatMap(manager, (stackManager) => stackManager.attach(pid, options))
|
|
95
|
+
};
|
|
96
|
+
};
|
|
54
97
|
var process_manager_capability_default = makeModule(Effect.fnUntraced(function* () {
|
|
55
98
|
const capabilityManager = yield* Service;
|
|
56
99
|
const pluginManager = yield* Service$1;
|
|
@@ -64,7 +107,7 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
64
107
|
log.info("setup process manager", { traceSinks: traceSinkContributions.get().length }, {
|
|
65
108
|
"~LogMeta": "~LogMeta",
|
|
66
109
|
F: __dxlog_file,
|
|
67
|
-
L:
|
|
110
|
+
L: 168,
|
|
68
111
|
S: this
|
|
69
112
|
});
|
|
70
113
|
let processManagerHolder;
|
|
@@ -81,13 +124,25 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
81
124
|
invariant(processManagerHolder, "ProcessManagerService accessed before the process-manager runtime was initialised", {
|
|
82
125
|
"~LogMeta": "~LogMeta",
|
|
83
126
|
F: __dxlog_file,
|
|
84
|
-
L:
|
|
127
|
+
L: 198,
|
|
85
128
|
S: this,
|
|
86
129
|
A: ["processManagerHolder", "'ProcessManagerService accessed before the process-manager runtime was initialised'"]
|
|
87
130
|
});
|
|
88
131
|
return processManagerHolder;
|
|
89
132
|
}))));
|
|
90
|
-
const
|
|
133
|
+
const fallbacks = Effect.runSync(Effect.gen(function* () {
|
|
134
|
+
const remoteProcessManager = yield* RemoteProcessManager.Service;
|
|
135
|
+
const remoteTraceMonitor = yield* RemoteTraceMonitor.Service;
|
|
136
|
+
return Context.make(RemoteProcessManager.Service, remoteProcessManager).pipe(Context.add(RemoteTraceMonitor.Service, remoteTraceMonitor));
|
|
137
|
+
}).pipe(Effect.provide(Layer.mergeAll(RemoteProcessManager.layerNoop, remoteTraceMonitors.length > 0 ? Layer.succeed(RemoteTraceMonitor.Service, remoteTraceMonitors[0]) : RemoteTraceMonitor.layerNoop)), Effect.provideService(Registry.AtomRegistry, atomRegistry)));
|
|
138
|
+
const layerStack = new LayerStack.LayerStack({
|
|
139
|
+
layers: [
|
|
140
|
+
ambientLayerSpec,
|
|
141
|
+
ProcessManagerSpec,
|
|
142
|
+
...layerSpecs
|
|
143
|
+
],
|
|
144
|
+
services: fallbacks
|
|
145
|
+
});
|
|
91
146
|
const serviceResolver = layerStack.getServiceResolver();
|
|
92
147
|
const rejectedLayerSpecs = /* @__PURE__ */ new WeakSet();
|
|
93
148
|
const admitLayerSpecs = (specs) => {
|
|
@@ -105,7 +160,7 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
105
160
|
}, {
|
|
106
161
|
"~LogMeta": "~LogMeta",
|
|
107
162
|
F: __dxlog_file,
|
|
108
|
-
L:
|
|
163
|
+
L: 249,
|
|
109
164
|
S: this
|
|
110
165
|
});
|
|
111
166
|
}
|
|
@@ -118,10 +173,11 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
118
173
|
const mergedTraceSink = makeDynamicTraceSink(() => traceSinkContributions.get(), serviceResolver);
|
|
119
174
|
const baseLayer = Layer.mergeAll(Layer.succeed(Service, capabilityManager), Layer.succeed(Service$1, pluginManager), Layer.succeed(Registry.AtomRegistry, atomRegistry), Layer.succeed(ServiceResolver.ServiceResolver, serviceResolver), OperationHandlerSet.provide(handlerSet), layerIdb, Layer.succeed(Trace.TraceSink, mergedTraceSink), Layer.succeed(Tracer.Tracer, OtelTracer.makeGlobal("@dxos/app-framework/process-manager")));
|
|
120
175
|
const processManagerLayer = ProcessManager.layer({ runtimeName: Trace.CommonRuntimeName.local }).pipe(Layer.provide(baseLayer));
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
const unifiedProcessManagerLayer =
|
|
176
|
+
const stackScope = yield* Scope.make();
|
|
177
|
+
yield* Effect.addFinalizer(() => Scope.close(stackScope, Exit.void));
|
|
178
|
+
const unifiedProcessManager = fromStack(serviceResolver, stackScope, atomRegistry);
|
|
179
|
+
const unifiedProcessManagerLayer = Layer.succeed(Process.ManagerService, unifiedProcessManager);
|
|
180
|
+
const operationInvokerLayer = ProcessOperationInvoker.layer.pipe(Layer.provide(Layer.mergeAll(unifiedProcessManagerLayer, baseLayer, Layer.succeed(Database.Origin, "user"))));
|
|
125
181
|
const runtimeLayer = Layer.mergeAll(baseLayer, processManagerLayer, operationInvokerLayer, unifiedProcessManagerLayer);
|
|
126
182
|
const managedRuntime = ManagedRuntime.make(runtimeLayer);
|
|
127
183
|
yield* Effect.addFinalizer(() => Effect.promise(() => managedRuntime.dispose()).pipe(Effect.andThen(layerStack.destroy())));
|
|
@@ -131,9 +187,9 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
131
187
|
runFork: (effect, options) => managedRuntime.runFork(effect, options),
|
|
132
188
|
runSync: (effect) => managedRuntime.runSync(effect)
|
|
133
189
|
};
|
|
134
|
-
const unifiedProcessManager = managedRuntime.runSync(Effect.flatMap(Process.ManagerService, Effect.succeed));
|
|
135
190
|
processManagerHolder = managedRuntime.runSync(Effect.flatMap(ProcessManager.ProcessManagerService, Effect.succeed));
|
|
136
|
-
|
|
191
|
+
managedRuntime.runFork(unifiedProcessManager.processTree);
|
|
192
|
+
const operationInvoker = managedRuntime.runSync(Effect.flatMap(ProcessOperationInvoker.Service, Effect.succeed));
|
|
137
193
|
return [
|
|
138
194
|
contribute(ProcessManagerRuntime, processManagerRuntime),
|
|
139
195
|
contribute(ServiceResolver$1, serviceResolver),
|
|
@@ -143,6 +199,6 @@ var process_manager_capability_default = makeModule(Effect.fnUntraced(function*
|
|
|
143
199
|
];
|
|
144
200
|
}));
|
|
145
201
|
//#endregion
|
|
146
|
-
export { process_manager_capability_default as default, makeDynamicTraceSink };
|
|
202
|
+
export { process_manager_capability_default as default, fromStack, makeDynamicTraceSink };
|
|
147
203
|
|
|
148
204
|
//# sourceMappingURL=chunk-process-manager-capability.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-process-manager-capability.mjs","names":[],"sources":["../../src/plugin-process-manager/process-manager-capability.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\nimport * as Registry from 'effect/reactivity/AtomRegistry';\nimport * as Tracer from 'effect/Tracer';\n\nimport {\n LayerStack,\n ProcessManager,\n RemoteProcessManager,\n RemoteTraceMonitor,\n UnifiedProcessManager,\n} from '@dxos/compute-runtime';\nimport * as LayerSpec from '@dxos/compute/LayerSpec';\nimport * as OperationHandlerSet from '@dxos/compute/OperationHandlerSet';\nimport * as Process from '@dxos/compute/Process';\nimport * as ServiceResolver from '@dxos/compute/ServiceResolver';\nimport * as Trace from '@dxos/compute/Trace';\nimport { Database } from '@dxos/echo';\nimport * as OtelTracer from '@dxos/effect/OtelTracer';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n// Explicit import so the emitted `.d.ts` references the package via its public\n// alias instead of a relative `node_modules` path (TS2883).\nimport { OperationInvoker } from '@dxos/operation';\n\nimport { Capabilities } from '../common/index.ts';\nimport { Capability, Plugin } from '../core/index.ts';\nimport { layerIdb } from './idb-key-value-store.ts';\n\n//\n// Capability Module\n//\n// Hosts the {@link ProcessManager} runtime for the plugin system.\n//\n// Workflow:\n// 1. Requires {@link Capabilities.LayerSpec} and {@link Capabilities.OperationHandler}\n// contributions from dependency-mode modules.\n// 2. Collects all contributed {@link LayerSpec.LayerSpec}s and builds a\n// {@link LayerStack} whose {@link ServiceResolver} drives process-scoped\n// service resolution; specs contributed later are added to the live stack.\n// 3. Wires a reactive {@link OperationHandlerSet} that tracks\n// {@link Capabilities.OperationHandler} contributions and invalidates its\n// cached merge when new handlers register.\n// 4. Composes the fixed runtime requirements (capability/plugin managers,\n// service resolver, operation invoker, process manager) into a single\n// {@link Layer} and builds a {@link ManagedRuntime} from it.\n// 5. Exposes a disposable-less wrapper as {@link Capabilities.ProcessManagerRuntime}\n// (the plugin system manages its lifecycle).\n//\n\n/**\n * Trace sink over the LIVE contribution list, so a sink contributed after the runtime was built (an\n * on-demand module, like plugin-progress's adapter) still observes writes. Instances are cached per\n * factory, since a sink may hold state across writes and must not be rebuilt underneath itself.\n */\nexport const makeDynamicTraceSink = (\n getFactories: () => readonly Capabilities.TraceSinkFactory[],\n resolver: ServiceResolver.ServiceResolver,\n): Trace.Sink => {\n const instances = new Map<Capabilities.TraceSinkFactory, Trace.Sink>();\n const resolve = (): Trace.Sink[] => {\n const sinks: Trace.Sink[] = [];\n for (const factory of getFactories()) {\n const existing = instances.get(factory);\n if (existing) {\n sinks.push(existing);\n continue;\n }\n try {\n const sink = factory({ resolver });\n instances.set(factory, sink);\n sinks.push(sink);\n } catch (err) {\n // One factory that cannot build must not cost the sinks behind it their messages.\n log.warn('trace sink factory failed', { err });\n }\n }\n return sinks;\n };\n\n // `mergeSinks` per write, for its guarantee that one throwing sink cannot break the chain.\n return { write: (message) => Trace.mergeSinks(resolve()).write(message) };\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilityManager = yield* Capability.Service;\n const pluginManager = yield* Plugin.Service;\n const atomRegistry = yield* Capabilities.AtomRegistry;\n\n const layerSpecContributions = yield* Capabilities.LayerSpec;\n const traceSinkContributions = yield* Capabilities.TraceSink;\n const operationHandlerContributions = yield* Capabilities.OperationHandler;\n const remoteTraceMonitorContributions = yield* Capabilities.RemoteTraceMonitor;\n // Startup soft-ordering makes same-pass providers visible here; specs contributed later (a\n // plugin enabled after boot) join the live stack through the subscription below.\n const layerSpecs = layerSpecContributions.get();\n // Optional swarm-backed remote trace source (DX-1125); first contribution wins, else empty.\n const remoteTraceMonitors = remoteTraceMonitorContributions.get();\n\n log.info('setup process manager', { traceSinks: traceSinkContributions.get().length });\n\n // Forward reference to `ProcessManager.ProcessManagerService`. The runtime\n // that owns the manager depends transitively on `ServiceResolver` (which is\n // built from the `LayerStack` below), so we cannot materialise it before\n // the stack exists. Instead we publish the manager into this holder as\n // soon as the runtime is built, and the ambient layer reads it lazily via\n // `Layer.effect` — slice init only runs once a process actually triggers\n // service resolution, by which point the holder is populated.\n let processManagerHolder: ProcessManager.Manager | undefined;\n\n // Expose the foundational app-framework services through the LayerStack so\n // that operations declaring `services: [Capability.Service]` (and friends)\n // can resolve them via the ServiceResolver. Without this, only consumers\n // sitting on the same ManagedRuntime layer graph can see them — process\n // executions go through ServiceResolver.resolveAll and would fail.\n const ambientLayerSpec = LayerSpec.make(\n {\n affinity: 'application',\n requires: [],\n provides: [Capability.Service, Plugin.Service, Registry.AtomRegistry, ProcessManager.ProcessManagerService],\n },\n () =>\n Layer.mergeAll(\n Layer.succeed(Capability.Service, capabilityManager),\n Layer.succeed(Plugin.Service, pluginManager),\n Layer.succeed(Registry.AtomRegistry, atomRegistry),\n Layer.effect(\n ProcessManager.ProcessManagerService,\n Effect.sync(() => {\n invariant(\n processManagerHolder,\n 'ProcessManagerService accessed before the process-manager runtime was initialised',\n );\n return processManagerHolder;\n }),\n ),\n ),\n );\n\n const layerStack = new LayerStack.LayerStack({ layers: [ambientLayerSpec, ...layerSpecs] });\n const serviceResolver = layerStack.getServiceResolver();\n\n // The stack extends built slices in place, so admitting a late spec costs no live service.\n const rejectedLayerSpecs = new WeakSet<LayerSpec.LayerSpec>();\n const admitLayerSpecs = (specs: readonly LayerSpec.LayerSpec[]) => {\n const candidates = specs.filter((spec) => !rejectedLayerSpecs.has(spec));\n try {\n layerStack.addLayers(candidates);\n } catch {\n // Admitted one at a time so a single bad spec does not keep the others out.\n for (const spec of candidates) {\n try {\n layerStack.addLayers([spec]);\n } catch (err) {\n rejectedLayerSpecs.add(spec);\n log.error('LayerSpec rejected', { provides: spec.provides.map((tag) => tag.key), err });\n }\n }\n }\n };\n const cancelLayerSpecWatch = atomRegistry.subscribe(layerSpecContributions.atom, admitLayerSpecs);\n yield* Effect.addFinalizer(() => Effect.sync(cancelLayerSpecWatch));\n // Covers a contribution landing between the snapshot above and the subscription.\n admitLayerSpecs(layerSpecContributions.get());\n\n // Handler sets register eagerly at startup (keyed sets defer only handler BODIES), so the\n // reactive view over contributions is complete at boot — no demand pull on a miss.\n const handlerSet = OperationHandlerSet.reactive(atomRegistry, operationHandlerContributions.atom);\n\n const mergedTraceSink = makeDynamicTraceSink(() => traceSinkContributions.get(), serviceResolver);\n\n // Base services required by ProcessManager and the operation invoker.\n // Sensible defaults are provided here; plugins that want alternative\n // implementations (e.g. persistent KV store) can contribute their own LayerSpec entries\n // against the ServiceResolver.\n const baseLayer = Layer.mergeAll(\n Layer.succeed(Capability.Service, capabilityManager),\n Layer.succeed(Plugin.Service, pluginManager),\n Layer.succeed(Registry.AtomRegistry, atomRegistry),\n Layer.succeed(ServiceResolver.ServiceResolver, serviceResolver),\n OperationHandlerSet.provide(handlerSet),\n layerIdb,\n Layer.succeed(Trace.TraceSink, mergedTraceSink),\n // Over the OTel global provider, a proxy that no-ops until one is registered, so this is\n // installed whether or not observability exists.\n Layer.succeed(Tracer.Tracer, OtelTracer.makeGlobal('@dxos/app-framework/process-manager')),\n );\n\n const processManagerLayer = ProcessManager.layer({ runtimeName: Trace.CommonRuntimeName.local }).pipe(\n Layer.provide(baseLayer),\n );\n const operationInvokerLayer = ProcessManager.ProcessOperationInvoker.layer.pipe(\n // Operations invoked through the app's own invoker are the person's actions, from a menu, dialog or shortcut.\n Layer.provide(Layer.mergeAll(processManagerLayer, baseLayer, Layer.succeed(Database.Origin, 'user'))),\n );\n\n // App-framework has no EDGE runtime, so the remote process view is empty;\n // the aggregate manager therefore equals the local process tree.\n const remoteProcessManagerLayer = RemoteProcessManager.layerNoop.pipe(Layer.provide(baseLayer));\n // Remote ephemeral trace (DX-1125): use the first contributed swarm-backed monitor, else no-op.\n const remoteTraceMonitorLayer =\n remoteTraceMonitors.length > 0\n ? Layer.succeed(RemoteTraceMonitor.Service, remoteTraceMonitors[0])\n : RemoteTraceMonitor.layerNoop;\n const unifiedProcessManagerLayer = UnifiedProcessManager.layer.pipe(\n Layer.provide(Layer.mergeAll(processManagerLayer, remoteProcessManagerLayer, remoteTraceMonitorLayer, baseLayer)),\n );\n\n const runtimeLayer = Layer.mergeAll(\n baseLayer,\n processManagerLayer,\n operationInvokerLayer,\n unifiedProcessManagerLayer,\n );\n\n const managedRuntime = ManagedRuntime.make(runtimeLayer as Layer.Layer<any, any, never>);\n\n // The module scope closes on deactivation/shutdown: dispose the runtime, then tear\n // down the stack's keep-alive slices.\n yield* Effect.addFinalizer(() =>\n Effect.promise(() => managedRuntime.dispose()).pipe(Effect.andThen(layerStack.destroy())),\n );\n\n const processManagerRuntime: Capabilities.ProcessManagerRuntime = {\n runPromise: (effect, options) => managedRuntime.runPromise(effect as Effect.Effect<any, any, any>, options),\n runPromiseExit: (effect, options) =>\n managedRuntime.runPromiseExit(effect as Effect.Effect<any, any, any>, options),\n runFork: (effect, options) => managedRuntime.runFork(effect as Effect.Effect<any, any, any>, options),\n runSync: (effect) => managedRuntime.runSync(effect as Effect.Effect<any, any, any>),\n };\n\n // Eagerly extract the process manager. Safe because it does not require a\n // fresh scope and is a stable reference for the lifetime of the runtime.\n const unifiedProcessManager = managedRuntime.runSync(\n Effect.flatMap(Process.ManagerService, Effect.succeed) as Effect.Effect<Process.Manager, never, never>,\n );\n\n // Publish the manager into the ambient-layer holder so that\n // `ProcessManager.ProcessManagerService` becomes resolvable through the\n // LayerStack alongside the other framework-supplied services.\n processManagerHolder = managedRuntime.runSync(\n Effect.flatMap(ProcessManager.ProcessManagerService, Effect.succeed) as Effect.Effect<\n ProcessManager.Manager,\n never,\n never\n >,\n );\n\n // Eagerly extract the operation invoker built by ProcessOperationInvoker.layer.\n // Pulled via the ProcessOperationInvoker tag so the contributed value carries\n // the full OperationInvoker interface (`invocations`, `pendingFollowups`,\n // `awaitFollowups`, `_invokeCore`) that HistoryTracker requires.\n const operationInvoker: OperationInvoker.OperationInvoker = managedRuntime.runSync(\n Effect.flatMap(ProcessManager.ProcessOperationInvoker.Service, Effect.succeed) as unknown as Effect.Effect<\n OperationInvoker.OperationInvoker,\n never,\n never\n >,\n );\n\n return [\n Capability.contribute(Capabilities.ProcessManagerRuntime, processManagerRuntime),\n Capability.contribute(Capabilities.ServiceResolver, serviceResolver),\n Capability.contribute(Capabilities.ProcessManager, unifiedProcessManager),\n Capability.contribute(Capabilities.OperationInvoker, operationInvoker),\n Capability.contribute(Capabilities.OperationHandlers, handlerSet),\n ];\n }),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chunk-process-manager-capability.mjs","names":[],"sources":["../../src/plugin-process-manager/process-manager-capability.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\nimport * as Atom from 'effect/reactivity/Atom';\nimport * as Registry from 'effect/reactivity/AtomRegistry';\nimport * as Scope from 'effect/Scope';\nimport * as Stream from 'effect/Stream';\nimport * as Tracer from 'effect/Tracer';\n\nimport {\n LayerStack,\n ProcessManager,\n ProcessOperationInvoker,\n RemoteProcessManager,\n RemoteTraceMonitor,\n UnifiedProcessManager,\n} from '@dxos/compute-runtime';\nimport * as LayerSpec from '@dxos/compute/LayerSpec';\nimport * as OperationHandlerSet from '@dxos/compute/OperationHandlerSet';\nimport * as Process from '@dxos/compute/Process';\nimport * as ServiceResolver from '@dxos/compute/ServiceResolver';\nimport * as Trace from '@dxos/compute/Trace';\nimport { Database } from '@dxos/echo';\nimport * as OtelTracer from '@dxos/effect/OtelTracer';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n// Explicit import so the emitted `.d.ts` references the package via its public\n// alias instead of a relative `node_modules` path (TS2883).\nimport { OperationInvoker } from '@dxos/operation';\n\nimport { Capabilities } from '../common/index.ts';\nimport { Capability, Plugin } from '../core/index.ts';\nimport { layerIdb } from './idb-key-value-store.ts';\n\n//\n// Capability Module\n//\n// Hosts the {@link ProcessManager} runtime for the plugin system.\n//\n// Workflow:\n// 1. Requires {@link Capabilities.LayerSpec} and {@link Capabilities.OperationHandler}\n// contributions from dependency-mode modules.\n// 2. Collects all contributed {@link LayerSpec.LayerSpec}s and builds a\n// {@link LayerStack} whose {@link ServiceResolver} drives process-scoped\n// service resolution; specs contributed later are added to the live stack.\n// 3. Wires a reactive {@link OperationHandlerSet} that tracks\n// {@link Capabilities.OperationHandler} contributions and invalidates its\n// cached merge when new handlers register.\n// 4. Composes the fixed runtime requirements (capability/plugin managers,\n// service resolver, operation invoker, process manager) into a single\n// {@link Layer} and builds a {@link ManagedRuntime} from it.\n// 5. Exposes a disposable-less wrapper as {@link Capabilities.ProcessManagerRuntime}\n// (the plugin system manages its lifecycle).\n//\n\n/**\n * Trace sink over the LIVE contribution list, so a sink contributed after the runtime was built (an\n * on-demand module, like plugin-progress's adapter) still observes writes. Instances are cached per\n * factory, since a sink may hold state across writes and must not be rebuilt underneath itself.\n */\nexport const makeDynamicTraceSink = (\n getFactories: () => readonly Capabilities.TraceSinkFactory[],\n resolver: ServiceResolver.ServiceResolver,\n): Trace.Sink => {\n const instances = new Map<Capabilities.TraceSinkFactory, Trace.Sink>();\n const resolve = (): Trace.Sink[] => {\n const sinks: Trace.Sink[] = [];\n for (const factory of getFactories()) {\n const existing = instances.get(factory);\n if (existing) {\n sinks.push(existing);\n continue;\n }\n try {\n const sink = factory({ resolver });\n instances.set(factory, sink);\n sinks.push(sink);\n } catch (err) {\n // One factory that cannot build must not cost the sinks behind it their messages.\n log.warn('trace sink factory failed', { err });\n }\n }\n return sinks;\n };\n\n // `mergeSinks` per write, for its guarantee that one throwing sink cannot break the chain.\n return { write: (message) => Trace.mergeSinks(resolve()).write(message) };\n};\n\n/**\n * The application's one {@link Process.ManagerService}, as built by the stack. Every built-in and plugin\n * consumer sees the same manager, so a host's remote manager (e.g. EDGE) reaches the app's invoker too.\n */\nconst ProcessManagerSpec = LayerSpec.make(\n {\n affinity: 'application',\n requires: [\n ProcessManager.ProcessManagerService,\n RemoteProcessManager.Service,\n RemoteTraceMonitor.Service,\n Registry.AtomRegistry,\n ],\n provides: [Process.ManagerService],\n },\n () => UnifiedProcessManager.layer,\n);\n\n/**\n * A {@link Process.Manager} that is the stack's {@link Process.ManagerService}, resolved on first use: building it\n * resolves the host's remote manager, which may need services (the client) that are not ready at activation.\n * The process tree reads empty until then.\n */\nexport const fromStack = (\n resolver: ServiceResolver.ServiceResolver,\n scope: Scope.Scope,\n registry: Registry.AtomRegistry,\n): Process.Manager => {\n const resolvedAtom = Atom.make<Process.Manager | undefined>(undefined).pipe(Atom.keepAlive);\n const manager: Effect.Effect<Process.Manager> = Effect.suspend(() => {\n const resolved = registry.get(resolvedAtom);\n return resolved !== undefined\n ? Effect.succeed(resolved)\n : resolver.resolve(Process.ManagerService, {}).pipe(\n Scope.provide(scope),\n Effect.tap((stackManager) => Effect.sync(() => registry.set(resolvedAtom, stackManager))),\n // The framework's own spec provides it, so a failure here is a broken stack, not a missing plugin.\n Effect.orDie,\n );\n });\n\n return {\n processTree: Effect.flatMap(manager, (stackManager) => stackManager.processTree),\n processTreeAtom: Atom.make((get) => {\n const stackManager = get(resolvedAtom);\n return stackManager === undefined ? [] : get(stackManager.processTreeAtom);\n }),\n list: (filter) => Effect.flatMap(manager, (stackManager) => stackManager.list(filter)),\n subscribeToTraceMessages: (filter) =>\n Stream.unwrap(Effect.map(manager, (stackManager) => stackManager.subscribeToTraceMessages(filter))),\n spawn: (definition, options) => Effect.flatMap(manager, (stackManager) => stackManager.spawn(definition, options)),\n handles: (options) => Effect.flatMap(manager, (stackManager) => stackManager.handles(options)),\n attach: (pid, options) => Effect.flatMap(manager, (stackManager) => stackManager.attach(pid, options)),\n };\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilityManager = yield* Capability.Service;\n const pluginManager = yield* Plugin.Service;\n const atomRegistry = yield* Capabilities.AtomRegistry;\n\n const layerSpecContributions = yield* Capabilities.LayerSpec;\n const traceSinkContributions = yield* Capabilities.TraceSink;\n const operationHandlerContributions = yield* Capabilities.OperationHandler;\n const remoteTraceMonitorContributions = yield* Capabilities.RemoteTraceMonitor;\n // Startup soft-ordering makes same-pass providers visible here; specs contributed later (a\n // plugin enabled after boot) join the live stack through the subscription below.\n const layerSpecs = layerSpecContributions.get();\n // Optional swarm-backed remote trace source (DX-1125); first contribution wins, else empty.\n const remoteTraceMonitors = remoteTraceMonitorContributions.get();\n\n log.info('setup process manager', { traceSinks: traceSinkContributions.get().length });\n\n // Forward reference to `ProcessManager.ProcessManagerService`. The runtime\n // that owns the manager depends transitively on `ServiceResolver` (which is\n // built from the `LayerStack` below), so we cannot materialise it before\n // the stack exists. Instead we publish the manager into this holder as\n // soon as the runtime is built, and the ambient layer reads it lazily via\n // `Layer.effect` — slice init only runs once a process actually triggers\n // service resolution, by which point the holder is populated.\n let processManagerHolder: ProcessManager.Manager | undefined;\n\n // Expose the foundational app-framework services through the LayerStack so\n // that operations declaring `services: [Capability.Service]` (and friends)\n // can resolve them via the ServiceResolver. Without this, only consumers\n // sitting on the same ManagedRuntime layer graph can see them — process\n // executions go through ServiceResolver.resolveAll and would fail.\n const ambientLayerSpec = LayerSpec.make(\n {\n affinity: 'application',\n requires: [],\n provides: [Capability.Service, Plugin.Service, Registry.AtomRegistry, ProcessManager.ProcessManagerService],\n },\n () =>\n Layer.mergeAll(\n Layer.succeed(Capability.Service, capabilityManager),\n Layer.succeed(Plugin.Service, pluginManager),\n Layer.succeed(Registry.AtomRegistry, atomRegistry),\n Layer.effect(\n ProcessManager.ProcessManagerService,\n Effect.sync(() => {\n invariant(\n processManagerHolder,\n 'ProcessManagerService accessed before the process-manager runtime was initialised',\n );\n return processManagerHolder;\n }),\n ),\n ),\n );\n\n // Fallbacks for a host with no remote runtime; a plugin spec providing either tag (e.g. EDGE's) wins.\n const fallbacks = Effect.runSync(\n Effect.gen(function* () {\n const remoteProcessManager = yield* RemoteProcessManager.Service;\n const remoteTraceMonitor = yield* RemoteTraceMonitor.Service;\n return Context.make(RemoteProcessManager.Service, remoteProcessManager).pipe(\n Context.add(RemoteTraceMonitor.Service, remoteTraceMonitor),\n );\n }).pipe(\n Effect.provide(\n Layer.mergeAll(\n RemoteProcessManager.layerNoop,\n // Remote ephemeral trace (DX-1125): the first contributed swarm-backed monitor, else no-op.\n remoteTraceMonitors.length > 0\n ? Layer.succeed(RemoteTraceMonitor.Service, remoteTraceMonitors[0])\n : RemoteTraceMonitor.layerNoop,\n ),\n ),\n Effect.provideService(Registry.AtomRegistry, atomRegistry),\n ),\n );\n\n const layerStack = new LayerStack.LayerStack({\n layers: [ambientLayerSpec, ProcessManagerSpec, ...layerSpecs],\n services: fallbacks,\n });\n const serviceResolver = layerStack.getServiceResolver();\n\n // The stack extends built slices in place, so admitting a late spec costs no live service.\n const rejectedLayerSpecs = new WeakSet<LayerSpec.LayerSpec>();\n const admitLayerSpecs = (specs: readonly LayerSpec.LayerSpec[]) => {\n const candidates = specs.filter((spec) => !rejectedLayerSpecs.has(spec));\n try {\n layerStack.addLayers(candidates);\n } catch {\n // Admitted one at a time so a single bad spec does not keep the others out.\n for (const spec of candidates) {\n try {\n layerStack.addLayers([spec]);\n } catch (err) {\n rejectedLayerSpecs.add(spec);\n log.error('LayerSpec rejected', { provides: spec.provides.map((tag) => tag.key), err });\n }\n }\n }\n };\n const cancelLayerSpecWatch = atomRegistry.subscribe(layerSpecContributions.atom, admitLayerSpecs);\n yield* Effect.addFinalizer(() => Effect.sync(cancelLayerSpecWatch));\n // Covers a contribution landing between the snapshot above and the subscription.\n admitLayerSpecs(layerSpecContributions.get());\n\n // Handler sets register eagerly at startup (keyed sets defer only handler BODIES), so the\n // reactive view over contributions is complete at boot — no demand pull on a miss.\n const handlerSet = OperationHandlerSet.reactive(atomRegistry, operationHandlerContributions.atom);\n\n const mergedTraceSink = makeDynamicTraceSink(() => traceSinkContributions.get(), serviceResolver);\n\n // Base services required by ProcessManager and the operation invoker.\n // Sensible defaults are provided here; plugins that want alternative\n // implementations (e.g. persistent KV store) can contribute their own LayerSpec entries\n // against the ServiceResolver.\n const baseLayer = Layer.mergeAll(\n Layer.succeed(Capability.Service, capabilityManager),\n Layer.succeed(Plugin.Service, pluginManager),\n Layer.succeed(Registry.AtomRegistry, atomRegistry),\n Layer.succeed(ServiceResolver.ServiceResolver, serviceResolver),\n OperationHandlerSet.provide(handlerSet),\n layerIdb,\n Layer.succeed(Trace.TraceSink, mergedTraceSink),\n // Over the OTel global provider, a proxy that no-ops until one is registered, so this is\n // installed whether or not observability exists.\n Layer.succeed(Tracer.Tracer, OtelTracer.makeGlobal('@dxos/app-framework/process-manager')),\n );\n\n const processManagerLayer = ProcessManager.layer({ runtimeName: Trace.CommonRuntimeName.local }).pipe(\n Layer.provide(baseLayer),\n );\n // Holds the stack's application slice that the manager resolves from, for the module's lifetime.\n const stackScope = yield* Scope.make();\n yield* Effect.addFinalizer(() => Scope.close(stackScope, Exit.void));\n const unifiedProcessManager = fromStack(serviceResolver, stackScope, atomRegistry);\n const unifiedProcessManagerLayer = Layer.succeed(Process.ManagerService, unifiedProcessManager);\n const operationInvokerLayer = ProcessOperationInvoker.layer.pipe(\n // Operations invoked through the app's own invoker are the person's actions, from a menu, dialog or shortcut.\n Layer.provide(Layer.mergeAll(unifiedProcessManagerLayer, baseLayer, Layer.succeed(Database.Origin, 'user'))),\n );\n\n const runtimeLayer = Layer.mergeAll(\n baseLayer,\n processManagerLayer,\n operationInvokerLayer,\n unifiedProcessManagerLayer,\n );\n\n const managedRuntime = ManagedRuntime.make(runtimeLayer as Layer.Layer<any, any, never>);\n\n // The module scope closes on deactivation/shutdown: dispose the runtime, then tear\n // down the stack's keep-alive slices.\n yield* Effect.addFinalizer(() =>\n Effect.promise(() => managedRuntime.dispose()).pipe(Effect.andThen(layerStack.destroy())),\n );\n\n const processManagerRuntime: Capabilities.ProcessManagerRuntime = {\n runPromise: (effect, options) => managedRuntime.runPromise(effect as Effect.Effect<any, any, any>, options),\n runPromiseExit: (effect, options) =>\n managedRuntime.runPromiseExit(effect as Effect.Effect<any, any, any>, options),\n runFork: (effect, options) => managedRuntime.runFork(effect as Effect.Effect<any, any, any>, options),\n runSync: (effect) => managedRuntime.runSync(effect as Effect.Effect<any, any, any>),\n };\n\n // Publish the manager into the ambient-layer holder so that\n // `ProcessManager.ProcessManagerService` becomes resolvable through the\n // LayerStack alongside the other framework-supplied services.\n processManagerHolder = managedRuntime.runSync(\n Effect.flatMap(ProcessManager.ProcessManagerService, Effect.succeed) as Effect.Effect<\n ProcessManager.Manager,\n never,\n never\n >,\n );\n\n // Resolved in the background rather than on first spawn, so a view that only reads the tree still fills in;\n // after the holder above, which the stack's manager is built over.\n managedRuntime.runFork(unifiedProcessManager.processTree);\n\n // Eagerly extract the operation invoker built by ProcessOperationInvoker.layer, via its own tag so the\n // contributed value carries the full OperationInvoker interface (`invocations`, `pendingFollowups`,\n // `awaitFollowups`, `_invokeCore`) that HistoryTracker requires.\n const operationInvoker: OperationInvoker.OperationInvoker = managedRuntime.runSync(\n Effect.flatMap(ProcessOperationInvoker.Service, Effect.succeed) as Effect.Effect<\n ProcessOperationInvoker.ProcessOperationInvoker,\n never,\n never\n >,\n );\n\n return [\n Capability.contribute(Capabilities.ProcessManagerRuntime, processManagerRuntime),\n Capability.contribute(Capabilities.ServiceResolver, serviceResolver),\n Capability.contribute(Capabilities.ProcessManager, unifiedProcessManager),\n Capability.contribute(Capabilities.OperationInvoker, operationInvoker),\n Capability.contribute(Capabilities.OperationHandlers, handlerSet),\n ];\n }),\n);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.mjs","names":[],"sources":["../../../src/common/capabilities.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Command$ from 'effect/cli/Command';\nimport * as Effect from 'effect/Effect';\nimport type * as Exit$ from 'effect/Exit';\nimport type * as Fiber$ from 'effect/Fiber';\nimport type * as Layer$ from 'effect/Layer';\nimport type * as ManagedRuntime$ from 'effect/ManagedRuntime';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\nimport type * as Registry from 'effect/reactivity/AtomRegistry';\nimport type { FC, PropsWithChildren } from 'react';\n\nimport type {\n ProcessManager as ProcessManager$,\n RemoteTraceMonitor as RemoteTraceMonitor$,\n} from '@dxos/compute-runtime';\nimport * as ComputeLayerSpec from '@dxos/compute/LayerSpec';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as OperationHandlerSet from '@dxos/compute/OperationHandlerSet';\nimport * as Process from '@dxos/compute/Process';\nimport * as ComputeServiceResolver from '@dxos/compute/ServiceResolver';\nimport * as Trace from '@dxos/compute/Trace';\nimport { OperationInvoker as OperationInvoker$ } from '@dxos/operation';\n\nimport { Capability as Capability$, Plugin as Plugin$, type PluginManager as PluginManager$ } from '../core/index.ts';\nimport type {\n HistoryTracker as HistoryTracker$,\n UndoMapping as UndoMapping$,\n UndoRegistry as UndoRegistry$,\n} from '../plugin-process-manager/index.ts';\nimport type { Surface } from '../ui/index.ts';\n\n/**\n * @category Capability\n */\nexport const PluginManager = Capability$.makeSingleton<PluginManager$.PluginManager>()(\n 'org.dxos.app-framework.capability.pluginManager',\n);\n\n/**\n * @category Capability\n */\nexport const AtomRegistry = Capability$.makeSingleton<Registry.AtomRegistry>()(\n 'org.dxos.app-framework.capability.atomRegistry',\n);\n\nexport type ReactContext = Readonly<{\n id: string;\n dependsOn?: string[];\n context: FC<PropsWithChildren>;\n}>;\n\n/**\n * @category Capability\n */\nexport const ReactContext = Capability$.make<ReactContext>()('org.dxos.app-framework.capability.reactContext');\n\nexport type ReactRoot = Readonly<{ id: string; root: FC<PropsWithChildren> }>;\n\n/**\n * @category Capability\n */\nexport const ReactRoot = Capability$.make<ReactRoot>()('org.dxos.app-framework.capability.reactRoot');\n\n/**\n * Surface definitions that can be either React components or Web Components.\n */\nexport type ReactSurface = Surface.Definition | readonly Surface.Definition[];\n\n/**\n * @category Capability\n */\nexport const ReactSurface = Capability$.make<ReactSurface>()('org.dxos.app-framework.capability.reactSurface');\n\n// The requirement channel stays open: a command's services are supplied partly by the contributing\n// plugin and partly by the host — `CommandConfig` carries the host's global flags and is provided as\n// an ambient layer by the host binary — so no single side can discharge them all. `CommandServices`\n// in @dxos/cli-util names what a host owes; hosts should type their layer with it.\nexport type AnyCommand = Command$.Command<any, any, any, any, any>;\n\n/**\n * @category Capability\n */\nexport const Command = Capability$.make<AnyCommand>()('org.dxos.app-framework.capability.command');\n\n/**\n * @category Capability\n */\n// The input channel is closed: a contributed layer is merged into whatever a host is assembling, so\n// it has to carry its own requirements rather than expect the host to satisfy them.\nexport const Layer = Capability$.make<Layer$.Layer<any, any, never>>()('org.dxos.app-framework.capability.layer');\n\n/**\n * Layer specification contributed by plugins.\n *\n * Plugins contribute {@link LayerSpec.LayerSpec} entries that are collected by the\n * process-manager module and composed into a {@link LayerStack} which backs the\n * {@link ProcessManagerRuntime}'s service resolver.\n *\n * @category Capability\n */\nexport const LayerSpec = Capability$.make<ComputeLayerSpec.LayerSpec>()('org.dxos.app-framework.capability.layerSpec');\n\n/**\n * Context passed to {@link TraceSinkFactory} implementations when the\n * process-manager capability materialises contributed sinks.\n */\nexport interface TraceSinkFactoryContext {\n /**\n * Service resolver backing the shared {@link ProcessManagerRuntime}. Use it\n * to resolve per-space (or per-process) services like `FeedTraceSink` when\n * building a routing sink.\n */\n readonly resolver: ComputeServiceResolver.ServiceResolver;\n}\n\n/**\n * Factory that builds a {@link Trace$.Sink} when the process-manager\n * capability is ready. Plugins that only need a static sink can ignore the\n * context (e.g. `() => myConsoleSink`); plugins that need per-space routing\n * can use {@link TraceSinkFactoryContext.resolver} to look up services.\n */\nexport type TraceSinkFactory = (ctx: TraceSinkFactoryContext) => Trace.Sink;\n\n/**\n * Trace sink contribution.\n *\n * Plugins contribute {@link TraceSinkFactory} functions; the process-manager\n * capability invokes each factory with the runtime's\n * {@link ServiceResolver$.ServiceResolver}, collects the resulting\n * {@link Trace$.Sink}s, merges them via {@link Trace$.mergeSinks}, and\n * installs the merged sink as {@link Trace$.TraceSink} in the runtime layer\n * so every process writes to every contributed sink.\n *\n * @category Capability\n */\nexport const TraceSink = Capability$.make<TraceSinkFactory>()('org.dxos.app-framework.capability.traceSink');\n\n/**\n * Source of ephemeral trace messages broadcast by remote runtimes over the space swarm (DX-1125).\n * Contributed by a client-aware plugin; the process-manager capability wires the first contribution\n * (or a no-op) into the aggregate {@link ProcessManager} so its `subscribeToTraceMessages` surfaces\n * remote progress alongside local.\n *\n * @category Capability\n */\nexport const RemoteTraceMonitor = Capability$.make<RemoteTraceMonitor$.Monitor>()(\n 'org.dxos.app-framework.capability.remoteTraceMonitor',\n);\n\n/**\n * Service resolver backing the shared {@link ProcessManagerRuntime}.\n *\n * Contributed by the process-manager capability module. Consumers can combine\n * it with {@link ServiceResolver$.provide} to build space-scoped layers without\n * having to go through the process-manager runtime:\n *\n * @example\n * ```ts\n * const resolver = yield* Capability.get(Capabilities.ServiceResolver);\n * yield* effect.pipe(\n * Effect.provide(\n * ServiceResolver.provide({ space }, Database.Service).pipe(\n * Layer.provide(Layer.succeed(ServiceResolver.ServiceResolver, resolver)),\n * ),\n * ),\n * );\n * ```\n *\n * @category Capability\n */\nexport const ServiceResolver = Capability$.makeSingleton<ComputeServiceResolver.ServiceResolver>()(\n 'org.dxos.app-framework.capability.serviceResolver',\n);\n\n/**\n * Process manager backing the shared {@link ProcessManagerRuntime}. Exposes the\n * live process tree (including inactive/terminated entries) via\n * {@link Process.Manager#processTreeAtom}.\n *\n * @category Capability\n */\nexport const ProcessManager = Capability$.makeSingleton<Process.Manager>()(\n 'org.dxos.app-framework.capability.processManager',\n);\n\n/**\n * Services that are always available when running effects through a {@link ProcessManagerRuntime}.\n */\nexport type ProcessManagerRuntimeServices =\n | Capability$.Service\n | Plugin$.Service\n | ProcessManager$.ProcessManagerService\n | Operation.Service\n | ProcessManager$.ProcessOperationInvoker.Service\n | ComputeServiceResolver.ServiceResolver;\n\n/**\n * Runtime that runs effects requiring a fixed set of capability-manager and\n * process-manager services.\n *\n * The shape mirrors {@link ManagedRuntime$.ManagedRuntime} but deliberately does\n * not expose `dispose` – lifecycle is driven by the host plugin manager.\n */\nexport interface ProcessManagerRuntime {\n runPromise<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: { readonly signal?: AbortSignal },\n ): Promise<A>;\n runPromiseExit<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: { readonly signal?: AbortSignal },\n ): Promise<Exit$.Exit<A, E>>;\n runFork<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: Effect.RunOptions,\n ): Fiber$.Fiber<A, E>;\n runSync<A, E>(effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>): A;\n}\n\n/**\n * @category Capability\n */\nexport const ProcessManagerRuntime = Capability$.makeSingleton<ProcessManagerRuntime>()(\n 'org.dxos.app-framework.capability.processManagerRuntime',\n);\n\nexport type ManagedRuntime = ManagedRuntime$.ManagedRuntime<any, any>;\n\n/**\n * @category Capability\n */\nexport const ManagedRuntime = Capability$.makeSingleton<ManagedRuntime>()(\n 'org.dxos.app-framework.capability.managedRuntime',\n);\n\n//\n// Operation System Capabilities\n//\n\nexport const OperationHandler = Capability$.make<OperationHandlerSet.OperationHandlerSet>()(\n 'org.dxos.app-framework.capability.operationHandler',\n);\n\n/**\n * Merged, contribution-ordered view over all {@link OperationHandler} contributions — the same\n * set the operation invoker resolves against. Provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const OperationHandlers = Capability$.makeSingleton<OperationHandlerSet.OperationHandlerSet>()(\n 'org.dxos.app-framework.capability.operationHandlers',\n);\n\nexport type UndoMapping = UndoMapping$.UndoMapping;\n\n/**\n * Undo mapping registration - contributed by plugins.\n * @category Capability\n */\nexport const UndoMapping = Capability$.make<UndoMapping[]>()('org.dxos.app-framework.capability.undoMapping');\n\n/**\n * Operation invoker backed by the process manager. Spawns a process per\n * operation invocation; see {@link ProcessManager$.ProcessOperationInvoker}.\n */\nexport type OperationInvoker = OperationInvoker$.OperationInvoker;\n\n/**\n * Operation invoker - provided by the process-manager capability.\n * @category Capability\n */\nexport const OperationInvoker = Capability$.makeSingleton<OperationInvoker>()(\n 'org.dxos.app-framework.capability.operationInvoker',\n);\n\nexport type UndoRegistry = UndoRegistry$.UndoRegistry;\n\n/**\n * Undo registry - provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const UndoRegistry = Capability$.makeSingleton<UndoRegistry>()('org.dxos.app-framework.capability.undoRegistry');\n\nexport type HistoryTracker = HistoryTracker$.HistoryTracker;\n\n/**\n * History tracker - provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const HistoryTracker = Capability$.makeSingleton<HistoryTracker>()(\n 'org.dxos.app-framework.capability.historyTracker',\n);\n\n//\n// Atom Capability Helpers\n//\n\n/**\n * Get the current value of an atom capability.\n * @example const settings = yield* Capabilities.getAtomValue(CommentCapabilities.Settings);\n */\nexport const getAtomValue = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n): Effect.Effect<T, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n return registry.get(atom);\n });\n\n/**\n * Get the current value of an atom capability, or `Option.none()` when either the registry or the\n * atom itself is uncontributed.\n *\n * For operations that run on both the app and a headless host (the edge operation-service, `dx mcp\n * serve`): those hosts have a capability manager but activate no UI plugins, so {@link getAtomValue}\n * fails on capabilities like `Layout` that only the app contributes.\n *\n * @example const layout = yield* Capabilities.getAtomValueOption(AppCapabilities.Layout);\n */\nexport const getAtomValueOption = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n): Effect.Effect<Option.Option<T>, never, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.getOption(AtomRegistry);\n const atom = yield* Capability$.getOption(atomCapability);\n return Option.map(Option.all([registry, atom]), ([registry, atom]) => registry.get(atom));\n });\n\n/**\n * Update an atom capability value (requires writable atom).\n * @example yield* Capabilities.updateAtomValue(CommentCapabilities.Settings, (s) => ({ ...s, foo: true }));\n */\nexport const updateAtomValue = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Writable<T>>,\n fn: (current: T) => T,\n): Effect.Effect<void, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n registry.set(atom, fn(registry.get(atom)));\n });\n\n/**\n * Subscribe to an atom capability.\n * @example const unsubscribe = yield* Capabilities.subscribeAtom(CommentCapabilities.Settings, (value) => ...);\n */\nexport const subscribeAtom = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n callback: (value: T) => void,\n): Effect.Effect<() => void, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n return registry.subscribe(atom, () => callback(registry.get(atom)));\n });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,IAAa,gBAAgB,cAAwD,CAAC,CACpF,iDACF;;;;AAKA,IAAa,eAAe,cAAiD,CAAC,CAC5E,gDACF;;;;AAWA,IAAa,eAAe,KAA+B,CAAC,CAAC,gDAAgD;;;;AAO7G,IAAa,YAAY,KAA4B,CAAC,CAAC,6CAA6C;;;;AAUpG,IAAa,eAAe,KAA+B,CAAC,CAAC,gDAAgD;;;;AAW7G,IAAa,UAAU,KAA6B,CAAC,CAAC,2CAA2C;;;;AAOjG,IAAa,QAAQ,KAAgD,CAAC,CAAC,yCAAyC;;;;;;;;;;AAWhH,IAAa,YAAY,KAA6C,CAAC,CAAC,6CAA6C;;;;;;;;;;;;;AAmCrH,IAAa,YAAY,KAAmC,CAAC,CAAC,6CAA6C;;;;;;;;;AAU3G,IAAa,qBAAqB,KAA8C,CAAC,CAC/E,sDACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAa,kBAAkB,cAAkE,CAAC,CAChG,mDACF;;;;;;;;AASA,IAAa,iBAAiB,cAA2C,CAAC,CACxE,kDACF;;;;AAuCA,IAAa,wBAAwB,cAAiD,CAAC,CACrF,yDACF;;;;AAOA,IAAa,iBAAiB,cAA0C,CAAC,CACvE,kDACF;AAMA,IAAa,mBAAmB,KAA0D,CAAC,CACzF,oDACF;;;;;;AAOA,IAAa,oBAAoB,cAAmE,CAAC,CACnG,qDACF;;;;;AAQA,IAAa,cAAc,KAAgC,CAAC,CAAC,+CAA+C;;;;;AAY5G,IAAa,mBAAmB,cAA4C,CAAC,CAC3E,oDACF;;;;;AAQA,IAAa,eAAe,cAAwC,CAAC,CAAC,gDAAgD;;;;;AAQtH,IAAa,iBAAiB,cAA0C,CAAC,CACvE,kDACF;;;;;AAUA,IAAa,gBACX,mBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,OAAO,SAAS,IAAI,IAAI;AAC1B,CAAC;;;;;;;;;;;AAYH,IAAa,sBACX,mBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,UAAsB,YAAY;CAC1D,MAAM,OAAO,OAAO,UAAsB,cAAc;CACxD,OAAO,OAAO,IAAI,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,UAAU,SAAS,IAAI,IAAI,CAAC;AAC1F,CAAC;;;;;AAMH,IAAa,mBACX,gBACA,OAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,SAAS,IAAI,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;AAC3C,CAAC;;;;;AAMH,IAAa,iBACX,gBACA,aAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,OAAO,SAAS,UAAU,YAAY,SAAS,SAAS,IAAI,IAAI,CAAC,CAAC;AACpE,CAAC"}
|
|
1
|
+
{"version":3,"file":"capabilities.mjs","names":[],"sources":["../../../src/common/capabilities.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Command$ from 'effect/cli/Command';\nimport * as Effect from 'effect/Effect';\nimport type * as Exit$ from 'effect/Exit';\nimport type * as Fiber$ from 'effect/Fiber';\nimport type * as Layer$ from 'effect/Layer';\nimport type * as ManagedRuntime$ from 'effect/ManagedRuntime';\nimport * as Option from 'effect/Option';\nimport type * as Atom from 'effect/reactivity/Atom';\nimport type * as Registry from 'effect/reactivity/AtomRegistry';\nimport type { FC, PropsWithChildren } from 'react';\n\nimport type {\n ProcessManager as ProcessManager$,\n RemoteTraceMonitor as RemoteTraceMonitor$,\n} from '@dxos/compute-runtime';\nimport * as ComputeLayerSpec from '@dxos/compute/LayerSpec';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as OperationHandlerSet from '@dxos/compute/OperationHandlerSet';\nimport * as Process from '@dxos/compute/Process';\nimport * as ComputeServiceResolver from '@dxos/compute/ServiceResolver';\nimport * as Trace from '@dxos/compute/Trace';\nimport { OperationInvoker as OperationInvoker$ } from '@dxos/operation';\n\nimport { Capability as Capability$, Plugin as Plugin$, type PluginManager as PluginManager$ } from '../core/index.ts';\nimport type {\n HistoryTracker as HistoryTracker$,\n UndoMapping as UndoMapping$,\n UndoRegistry as UndoRegistry$,\n} from '../plugin-process-manager/index.ts';\nimport type { Surface } from '../ui/index.ts';\n\n/**\n * @category Capability\n */\nexport const PluginManager = Capability$.makeSingleton<PluginManager$.PluginManager>()(\n 'org.dxos.app-framework.capability.pluginManager',\n);\n\n/**\n * @category Capability\n */\nexport const AtomRegistry = Capability$.makeSingleton<Registry.AtomRegistry>()(\n 'org.dxos.app-framework.capability.atomRegistry',\n);\n\nexport type ReactContext = Readonly<{\n id: string;\n dependsOn?: string[];\n context: FC<PropsWithChildren>;\n}>;\n\n/**\n * @category Capability\n */\nexport const ReactContext = Capability$.make<ReactContext>()('org.dxos.app-framework.capability.reactContext');\n\nexport type ReactRoot = Readonly<{ id: string; root: FC<PropsWithChildren> }>;\n\n/**\n * @category Capability\n */\nexport const ReactRoot = Capability$.make<ReactRoot>()('org.dxos.app-framework.capability.reactRoot');\n\n/**\n * Surface definitions that can be either React components or Web Components.\n */\nexport type ReactSurface = Surface.Definition | readonly Surface.Definition[];\n\n/**\n * @category Capability\n */\nexport const ReactSurface = Capability$.make<ReactSurface>()('org.dxos.app-framework.capability.reactSurface');\n\n// The requirement channel stays open: a command's services are supplied partly by the contributing\n// plugin and partly by the host — `CommandConfig` carries the host's global flags and is provided as\n// an ambient layer by the host binary — so no single side can discharge them all. `CommandServices`\n// in @dxos/cli-util names what a host owes; hosts should type their layer with it.\nexport type AnyCommand = Command$.Command<any, any, any, any, any>;\n\n/**\n * @category Capability\n */\nexport const Command = Capability$.make<AnyCommand>()('org.dxos.app-framework.capability.command');\n\n/**\n * @category Capability\n */\n// The input channel is closed: a contributed layer is merged into whatever a host is assembling, so\n// it has to carry its own requirements rather than expect the host to satisfy them.\nexport const Layer = Capability$.make<Layer$.Layer<any, any, never>>()('org.dxos.app-framework.capability.layer');\n\n/**\n * Layer specification contributed by plugins.\n *\n * Plugins contribute {@link LayerSpec.LayerSpec} entries that are collected by the\n * process-manager module and composed into a {@link LayerStack} which backs the\n * {@link ProcessManagerRuntime}'s service resolver.\n *\n * @category Capability\n */\nexport const LayerSpec = Capability$.make<ComputeLayerSpec.LayerSpec>()('org.dxos.app-framework.capability.layerSpec');\n\n/**\n * Context passed to {@link TraceSinkFactory} implementations when the\n * process-manager capability materialises contributed sinks.\n */\nexport interface TraceSinkFactoryContext {\n /**\n * Service resolver backing the shared {@link ProcessManagerRuntime}. Use it\n * to resolve per-space (or per-process) services like `FeedTraceSink` when\n * building a routing sink.\n */\n readonly resolver: ComputeServiceResolver.ServiceResolver;\n}\n\n/**\n * Factory that builds a {@link Trace$.Sink} when the process-manager\n * capability is ready. Plugins that only need a static sink can ignore the\n * context (e.g. `() => myConsoleSink`); plugins that need per-space routing\n * can use {@link TraceSinkFactoryContext.resolver} to look up services.\n */\nexport type TraceSinkFactory = (ctx: TraceSinkFactoryContext) => Trace.Sink;\n\n/**\n * Trace sink contribution.\n *\n * Plugins contribute {@link TraceSinkFactory} functions; the process-manager\n * capability invokes each factory with the runtime's\n * {@link ServiceResolver$.ServiceResolver}, collects the resulting\n * {@link Trace$.Sink}s, merges them via {@link Trace$.mergeSinks}, and\n * installs the merged sink as {@link Trace$.TraceSink} in the runtime layer\n * so every process writes to every contributed sink.\n *\n * @category Capability\n */\nexport const TraceSink = Capability$.make<TraceSinkFactory>()('org.dxos.app-framework.capability.traceSink');\n\n/**\n * Source of ephemeral trace messages broadcast by remote runtimes over the space swarm (DX-1125).\n * Contributed by a client-aware plugin; the process-manager capability wires the first contribution\n * (or a no-op) into the aggregate {@link ProcessManager} so its `subscribeToTraceMessages` surfaces\n * remote progress alongside local.\n *\n * @category Capability\n */\nexport const RemoteTraceMonitor = Capability$.make<RemoteTraceMonitor$.Monitor>()(\n 'org.dxos.app-framework.capability.remoteTraceMonitor',\n);\n\n/**\n * Service resolver backing the shared {@link ProcessManagerRuntime}.\n *\n * Contributed by the process-manager capability module. Consumers can combine\n * it with {@link ServiceResolver$.provide} to build space-scoped layers without\n * having to go through the process-manager runtime:\n *\n * @example\n * ```ts\n * const resolver = yield* Capability.get(Capabilities.ServiceResolver);\n * yield* effect.pipe(\n * Effect.provide(\n * ServiceResolver.provide({ space }, Database.Service).pipe(\n * Layer.provide(Layer.succeed(ServiceResolver.ServiceResolver, resolver)),\n * ),\n * ),\n * );\n * ```\n *\n * @category Capability\n */\nexport const ServiceResolver = Capability$.makeSingleton<ComputeServiceResolver.ServiceResolver>()(\n 'org.dxos.app-framework.capability.serviceResolver',\n);\n\n/**\n * Process manager backing the shared {@link ProcessManagerRuntime}. Exposes the\n * live process tree (including inactive/terminated entries) via\n * {@link Process.Manager#processTreeAtom}.\n *\n * @category Capability\n */\nexport const ProcessManager = Capability$.makeSingleton<Process.Manager>()(\n 'org.dxos.app-framework.capability.processManager',\n);\n\n/**\n * Services that are always available when running effects through a {@link ProcessManagerRuntime}.\n */\nexport type ProcessManagerRuntimeServices =\n | Capability$.Service\n | Plugin$.Service\n | ProcessManager$.ProcessManagerService\n | Operation.Service\n | ComputeServiceResolver.ServiceResolver;\n\n/**\n * Runtime that runs effects requiring a fixed set of capability-manager and\n * process-manager services.\n *\n * The shape mirrors {@link ManagedRuntime$.ManagedRuntime} but deliberately does\n * not expose `dispose` – lifecycle is driven by the host plugin manager.\n */\nexport interface ProcessManagerRuntime {\n runPromise<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: { readonly signal?: AbortSignal },\n ): Promise<A>;\n runPromiseExit<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: { readonly signal?: AbortSignal },\n ): Promise<Exit$.Exit<A, E>>;\n runFork<A, E>(\n effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>,\n options?: Effect.RunOptions,\n ): Fiber$.Fiber<A, E>;\n runSync<A, E>(effect: Effect.Effect<A, E, ProcessManagerRuntimeServices>): A;\n}\n\n/**\n * @category Capability\n */\nexport const ProcessManagerRuntime = Capability$.makeSingleton<ProcessManagerRuntime>()(\n 'org.dxos.app-framework.capability.processManagerRuntime',\n);\n\nexport type ManagedRuntime = ManagedRuntime$.ManagedRuntime<any, any>;\n\n/**\n * @category Capability\n */\nexport const ManagedRuntime = Capability$.makeSingleton<ManagedRuntime>()(\n 'org.dxos.app-framework.capability.managedRuntime',\n);\n\n//\n// Operation System Capabilities\n//\n\nexport const OperationHandler = Capability$.make<OperationHandlerSet.OperationHandlerSet>()(\n 'org.dxos.app-framework.capability.operationHandler',\n);\n\n/**\n * Merged, contribution-ordered view over all {@link OperationHandler} contributions — the same\n * set the operation invoker resolves against. Provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const OperationHandlers = Capability$.makeSingleton<OperationHandlerSet.OperationHandlerSet>()(\n 'org.dxos.app-framework.capability.operationHandlers',\n);\n\nexport type UndoMapping = UndoMapping$.UndoMapping;\n\n/**\n * Undo mapping registration - contributed by plugins.\n * @category Capability\n */\nexport const UndoMapping = Capability$.make<UndoMapping[]>()('org.dxos.app-framework.capability.undoMapping');\n\n/**\n * Operation invoker backed by the process manager. Spawns a process per\n * operation invocation; see `ProcessOperationInvoker` in `@dxos/compute-runtime`.\n */\nexport type OperationInvoker = OperationInvoker$.OperationInvoker;\n\n/**\n * Operation invoker - provided by the process-manager capability.\n * @category Capability\n */\nexport const OperationInvoker = Capability$.makeSingleton<OperationInvoker>()(\n 'org.dxos.app-framework.capability.operationInvoker',\n);\n\nexport type UndoRegistry = UndoRegistry$.UndoRegistry;\n\n/**\n * Undo registry - provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const UndoRegistry = Capability$.makeSingleton<UndoRegistry>()('org.dxos.app-framework.capability.undoRegistry');\n\nexport type HistoryTracker = HistoryTracker$.HistoryTracker;\n\n/**\n * History tracker - provided by ProcessManagerPlugin.\n * @category Capability\n */\nexport const HistoryTracker = Capability$.makeSingleton<HistoryTracker>()(\n 'org.dxos.app-framework.capability.historyTracker',\n);\n\n//\n// Atom Capability Helpers\n//\n\n/**\n * Get the current value of an atom capability.\n * @example const settings = yield* Capabilities.getAtomValue(CommentCapabilities.Settings);\n */\nexport const getAtomValue = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n): Effect.Effect<T, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n return registry.get(atom);\n });\n\n/**\n * Get the current value of an atom capability, or `Option.none()` when either the registry or the\n * atom itself is uncontributed.\n *\n * For operations that run on both the app and a headless host (the edge operation-service, `dx mcp\n * serve`): those hosts have a capability manager but activate no UI plugins, so {@link getAtomValue}\n * fails on capabilities like `Layout` that only the app contributes.\n *\n * @example const layout = yield* Capabilities.getAtomValueOption(AppCapabilities.Layout);\n */\nexport const getAtomValueOption = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n): Effect.Effect<Option.Option<T>, never, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.getOption(AtomRegistry);\n const atom = yield* Capability$.getOption(atomCapability);\n return Option.map(Option.all([registry, atom]), ([registry, atom]) => registry.get(atom));\n });\n\n/**\n * Update an atom capability value (requires writable atom).\n * @example yield* Capabilities.updateAtomValue(CommentCapabilities.Settings, (s) => ({ ...s, foo: true }));\n */\nexport const updateAtomValue = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Writable<T>>,\n fn: (current: T) => T,\n): Effect.Effect<void, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n registry.set(atom, fn(registry.get(atom)));\n });\n\n/**\n * Subscribe to an atom capability.\n * @example const unsubscribe = yield* Capabilities.subscribeAtom(CommentCapabilities.Settings, (value) => ...);\n */\nexport const subscribeAtom = <T>(\n atomCapability: Capability$.InterfaceDef<Atom.Atom<T>>,\n callback: (value: T) => void,\n): Effect.Effect<() => void, Error, Capability$.Service> =>\n Effect.gen(function* () {\n const registry = yield* Capability$.get(AtomRegistry);\n const atom = yield* Capability$.get(atomCapability);\n return registry.subscribe(atom, () => callback(registry.get(atom)));\n });\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,IAAa,gBAAgB,cAAwD,CAAC,CACpF,iDACF;;;;AAKA,IAAa,eAAe,cAAiD,CAAC,CAC5E,gDACF;;;;AAWA,IAAa,eAAe,KAA+B,CAAC,CAAC,gDAAgD;;;;AAO7G,IAAa,YAAY,KAA4B,CAAC,CAAC,6CAA6C;;;;AAUpG,IAAa,eAAe,KAA+B,CAAC,CAAC,gDAAgD;;;;AAW7G,IAAa,UAAU,KAA6B,CAAC,CAAC,2CAA2C;;;;AAOjG,IAAa,QAAQ,KAAgD,CAAC,CAAC,yCAAyC;;;;;;;;;;AAWhH,IAAa,YAAY,KAA6C,CAAC,CAAC,6CAA6C;;;;;;;;;;;;;AAmCrH,IAAa,YAAY,KAAmC,CAAC,CAAC,6CAA6C;;;;;;;;;AAU3G,IAAa,qBAAqB,KAA8C,CAAC,CAC/E,sDACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAa,kBAAkB,cAAkE,CAAC,CAChG,mDACF;;;;;;;;AASA,IAAa,iBAAiB,cAA2C,CAAC,CACxE,kDACF;;;;AAsCA,IAAa,wBAAwB,cAAiD,CAAC,CACrF,yDACF;;;;AAOA,IAAa,iBAAiB,cAA0C,CAAC,CACvE,kDACF;AAMA,IAAa,mBAAmB,KAA0D,CAAC,CACzF,oDACF;;;;;;AAOA,IAAa,oBAAoB,cAAmE,CAAC,CACnG,qDACF;;;;;AAQA,IAAa,cAAc,KAAgC,CAAC,CAAC,+CAA+C;;;;;AAY5G,IAAa,mBAAmB,cAA4C,CAAC,CAC3E,oDACF;;;;;AAQA,IAAa,eAAe,cAAwC,CAAC,CAAC,gDAAgD;;;;;AAQtH,IAAa,iBAAiB,cAA0C,CAAC,CACvE,kDACF;;;;;AAUA,IAAa,gBACX,mBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,OAAO,SAAS,IAAI,IAAI;AAC1B,CAAC;;;;;;;;;;;AAYH,IAAa,sBACX,mBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,UAAsB,YAAY;CAC1D,MAAM,OAAO,OAAO,UAAsB,cAAc;CACxD,OAAO,OAAO,IAAI,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,UAAU,SAAS,IAAI,IAAI,CAAC;AAC1F,CAAC;;;;;AAMH,IAAa,mBACX,gBACA,OAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,SAAS,IAAI,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;AAC3C,CAAC;;;;;AAMH,IAAa,iBACX,gBACA,aAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,IAAgB,YAAY;CACpD,MAAM,OAAO,OAAO,IAAgB,cAAc;CAClD,OAAO,SAAS,UAAU,YAAY,SAAS,SAAS,IAAI,IAAI,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packages.mjs","names":[],"sources":["../../../src/vite-plugin/packages.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n/**\n * Packages shared between the Composer host app and remote plugins.\n *\n * {@link DEFAULT_PACKAGES} is the single source of truth: `importMapPlugin` emits\n * one wrapper chunk per entry so the host serves it at runtime, and `composerPlugin`\n * (via {@link isSharedPackage}) externalizes the same set from plugin bundles.\n * Adding a new `@dxos/*` (or third-party) package that plugins may depend on means\n * adding it here — in one place — so the externalization contract stays in sync\n * with what the host actually provides.\n *\n * Every entry must also be a **direct** dependency of composer-app's `package.json`,\n * including packages that are only re-exported by an umbrella (e.g. via subpath\n * re-exports from another listed package). pnpm doesn't symlink transitive deps\n * into a package's own `node_modules`, so the import-map plugin's `this.resolve`\n * call fails for transitive-only entries and the importmap silently drops them —\n * leaving plugins with bare specifiers the host can't satisfy at install time.\n *\n * Plugin packages (`@dxos/plugin-*`) are intentionally NOT listed: community plugins\n * bundle their own copy of any plugin-subpath import, which is safe because those\n * exports are limited to lightweight types/operation defs.\n */\n\n/**\n * Non-`@dxos/*` packages the Composer host provides to plugins via import map.\n * Spread into {@link DEFAULT_PACKAGES} so the third-party set lives in one place.\n */\nconst THIRD_PARTY_SHARED_PACKAGES = [\n '@effect/atom-react',\n '@effect/platform',\n 'effect',\n 'lit',\n 'react',\n 'react-dom',\n 'solid-js',\n];\n\nexport const DEFAULT_PACKAGES = [\n // packages/common\n '@dxos/async',\n '@dxos/context',\n '@dxos/crypto',\n '@dxos/debug',\n '@dxos/display-name',\n '@dxos/effect',\n '@dxos/effect-atom-solid',\n '@dxos/errors',\n '@dxos/feed-store',\n '@dxos/graph',\n '@dxos/hypercore',\n '@dxos/invariant',\n '@dxos/keys',\n '@dxos/log',\n '@dxos/merkle-search-tree',\n '@dxos/random',\n '@dxos/random-access-storage',\n '@dxos/timeframe',\n '@dxos/tracing',\n '@dxos/util',\n '@dxos/web-context',\n '@dxos/web-context-react',\n '@dxos/web-context-solid',\n\n // packages/core/echo\n '@dxos/echo',\n '@dxos/echo-client',\n '@dxos/echo-host',\n '@dxos/echo-protocol',\n '@dxos/echo-query',\n '@dxos/echo-react',\n '@dxos/echo-solid',\n '@dxos/feed',\n '@dxos/index-core',\n\n // packages/core/halo\n '@dxos/credentials',\n '@dxos/keyring',\n\n // packages/core/mesh\n '@dxos/edge-client',\n '@dxos/messaging',\n '@dxos/network-manager',\n '@dxos/rpc',\n '@dxos/rpc-tunnel',\n '@dxos/teleport',\n '@dxos/teleport-extension-automerge-replicator',\n '@dxos/teleport-extension-gossip',\n '@dxos/teleport-extension-replicator',\n '@dxos/websocket-rpc',\n\n // packages/core\n '@dxos/ai',\n '@dxos/assistant',\n '@dxos/assistant-toolkit',\n '@dxos/compute',\n '@dxos/conductor',\n '@dxos/functions',\n '@dxos/functions-runtime',\n '@dxos/mcp-client',\n '@dxos/operation',\n '@dxos/protocols',\n\n // packages/devtools\n '@dxos/devtools',\n\n // packages/sdk\n '@dxos/app-framework',\n '@dxos/app-graph',\n '@dxos/app-solid',\n '@dxos/app-toolkit',\n '@dxos/client',\n '@dxos/client-protocol',\n '@dxos/client-services',\n '@dxos/config',\n '@dxos/migrations',\n '@dxos/observability',\n '@dxos/react-client',\n '@dxos/react-edge-client',\n '@dxos/schema',\n '@dxos/types',\n\n // packages/ui\n '@dxos/lit-grid',\n '@dxos/lit-ui',\n '@dxos/react-hooks',\n '@dxos/react-ui',\n '@dxos/react-ui-attention',\n '@dxos/react-ui-audio',\n '@dxos/react-ui-board',\n '@dxos/react-ui-calendar',\n '@dxos/react-ui-canvas',\n '@dxos/react-ui-canvas-compute',\n '@dxos/react-ui-
|
|
1
|
+
{"version":3,"file":"packages.mjs","names":[],"sources":["../../../src/vite-plugin/packages.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n/**\n * Packages shared between the Composer host app and remote plugins.\n *\n * {@link DEFAULT_PACKAGES} is the single source of truth: `importMapPlugin` emits\n * one wrapper chunk per entry so the host serves it at runtime, and `composerPlugin`\n * (via {@link isSharedPackage}) externalizes the same set from plugin bundles.\n * Adding a new `@dxos/*` (or third-party) package that plugins may depend on means\n * adding it here — in one place — so the externalization contract stays in sync\n * with what the host actually provides.\n *\n * Every entry must also be a **direct** dependency of composer-app's `package.json`,\n * including packages that are only re-exported by an umbrella (e.g. via subpath\n * re-exports from another listed package). pnpm doesn't symlink transitive deps\n * into a package's own `node_modules`, so the import-map plugin's `this.resolve`\n * call fails for transitive-only entries and the importmap silently drops them —\n * leaving plugins with bare specifiers the host can't satisfy at install time.\n *\n * Plugin packages (`@dxos/plugin-*`) are intentionally NOT listed: community plugins\n * bundle their own copy of any plugin-subpath import, which is safe because those\n * exports are limited to lightweight types/operation defs.\n */\n\n/**\n * Non-`@dxos/*` packages the Composer host provides to plugins via import map.\n * Spread into {@link DEFAULT_PACKAGES} so the third-party set lives in one place.\n */\nconst THIRD_PARTY_SHARED_PACKAGES = [\n '@effect/atom-react',\n '@effect/platform',\n 'effect',\n 'lit',\n 'react',\n 'react-dom',\n 'solid-js',\n];\n\nexport const DEFAULT_PACKAGES = [\n // packages/common\n '@dxos/async',\n '@dxos/context',\n '@dxos/crypto',\n '@dxos/debug',\n '@dxos/display-name',\n '@dxos/effect',\n '@dxos/effect-atom-solid',\n '@dxos/errors',\n '@dxos/feed-store',\n '@dxos/graph',\n '@dxos/hypercore',\n '@dxos/invariant',\n '@dxos/keys',\n '@dxos/log',\n '@dxos/merkle-search-tree',\n '@dxos/random',\n '@dxos/random-access-storage',\n '@dxos/timeframe',\n '@dxos/tracing',\n '@dxos/util',\n '@dxos/web-context',\n '@dxos/web-context-react',\n '@dxos/web-context-solid',\n\n // packages/core/echo\n '@dxos/echo',\n '@dxos/echo-client',\n '@dxos/echo-host',\n '@dxos/echo-protocol',\n '@dxos/echo-query',\n '@dxos/echo-react',\n '@dxos/echo-solid',\n '@dxos/feed',\n '@dxos/index-core',\n\n // packages/core/halo\n '@dxos/credentials',\n '@dxos/keyring',\n\n // packages/core/mesh\n '@dxos/edge-client',\n '@dxos/messaging',\n '@dxos/network-manager',\n '@dxos/rpc',\n '@dxos/rpc-tunnel',\n '@dxos/teleport',\n '@dxos/teleport-extension-automerge-replicator',\n '@dxos/teleport-extension-gossip',\n '@dxos/teleport-extension-replicator',\n '@dxos/websocket-rpc',\n\n // packages/core\n '@dxos/ai',\n '@dxos/assistant',\n '@dxos/assistant-toolkit',\n '@dxos/compute',\n '@dxos/conductor',\n '@dxos/functions',\n '@dxos/functions-runtime',\n '@dxos/mcp-client',\n '@dxos/operation',\n '@dxos/protocols',\n\n // packages/devtools\n '@dxos/devtools',\n\n // packages/sdk\n '@dxos/app-framework',\n '@dxos/app-graph',\n '@dxos/app-solid',\n '@dxos/app-toolkit',\n '@dxos/client',\n '@dxos/client-protocol',\n '@dxos/client-services',\n '@dxos/config',\n '@dxos/migrations',\n '@dxos/observability',\n '@dxos/react-client',\n '@dxos/react-edge-client',\n '@dxos/schema',\n '@dxos/types',\n\n // packages/ui\n '@dxos/lit-grid',\n '@dxos/lit-ui',\n '@dxos/react-hooks',\n '@dxos/react-ui',\n '@dxos/react-ui-attention',\n '@dxos/react-ui-audio',\n '@dxos/react-ui-board',\n '@dxos/react-ui-calendar',\n '@dxos/react-ui-canvas',\n '@dxos/react-ui-canvas-compute',\n '@dxos/react-ui-chat',\n '@dxos/react-ui-components',\n '@dxos/react-ui-dnd',\n '@dxos/react-ui-editor',\n '@dxos/react-ui-experimental',\n '@dxos/react-ui-form',\n '@dxos/react-ui-gameboard',\n '@dxos/react-ui-geo',\n '@dxos/react-ui-graph',\n '@dxos/react-ui-grid',\n '@dxos/react-ui-list',\n '@dxos/react-ui-markdown',\n '@dxos/react-ui-masonry',\n '@dxos/react-ui-menu',\n '@dxos/react-ui-mosaic',\n '@dxos/react-ui-pickers',\n '@dxos/react-ui-list',\n '@dxos/react-ui-syntax-highlighter',\n '@dxos/react-ui-table',\n '@dxos/react-ui-thread',\n '@dxos/solid-ui',\n '@dxos/solid-ui-geo',\n '@dxos/ui',\n '@dxos/ui-editor',\n '@dxos/ui-theme',\n '@dxos/ui-types',\n\n // third-party\n ...THIRD_PARTY_SHARED_PACKAGES,\n];\n\n/**\n * True when the given bare specifier (or one of its subpaths) is provided by the\n * Composer host at runtime and must not be re-bundled by a plugin.\n *\n * Matches only packages listed in {@link DEFAULT_PACKAGES} — the same list\n * {@link importMapPlugin} consumes — so externalization cannot claim a package\n * the host isn't actually mapping. Unknown `@dxos/*` packages fall through to\n * normal bundling, which is the correct default for plugin-owned or yet-to-be\n * shared workspace packages.\n */\nexport const isSharedPackage = (id: string): boolean =>\n DEFAULT_PACKAGES.some((pkg) => id === pkg || id.startsWith(`${pkg}/`));\n"],"mappings":"AAwCA,IAAa,mBAAmB;CAE9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA,GAAG;EApIH;EACA;EACA;EACA;EACA;EACA;EACA;CA8HG;AACL;;;;;;;;;;;AAYA,IAAa,mBAAmB,OAC9B,iBAAiB,MAAM,QAAQ,OAAO,OAAO,GAAG,WAAW,GAAG,IAAI,EAAE,CAAC"}
|
|
@@ -152,7 +152,7 @@ export declare const ProcessManager: Capability$.Tag<Process.Manager, "org.dxos.
|
|
|
152
152
|
/**
|
|
153
153
|
* Services that are always available when running effects through a {@link ProcessManagerRuntime}.
|
|
154
154
|
*/
|
|
155
|
-
export type ProcessManagerRuntimeServices = Capability$.Service | Plugin$.Service | ProcessManager$.ProcessManagerService | Operation.Service |
|
|
155
|
+
export type ProcessManagerRuntimeServices = Capability$.Service | Plugin$.Service | ProcessManager$.ProcessManagerService | Operation.Service | ComputeServiceResolver.ServiceResolver;
|
|
156
156
|
/**
|
|
157
157
|
* Runtime that runs effects requiring a fixed set of capability-manager and
|
|
158
158
|
* process-manager services.
|
|
@@ -194,7 +194,7 @@ export type UndoMapping = UndoMapping$.UndoMapping;
|
|
|
194
194
|
export declare const UndoMapping: Capability$.MultiTag<UndoMapping[], "org.dxos.app-framework.capability.undoMapping">;
|
|
195
195
|
/**
|
|
196
196
|
* Operation invoker backed by the process manager. Spawns a process per
|
|
197
|
-
* operation invocation; see
|
|
197
|
+
* operation invocation; see `ProcessOperationInvoker` in `@dxos/compute-runtime`.
|
|
198
198
|
*/
|
|
199
199
|
export type OperationInvoker = OperationInvoker$.OperationInvoker;
|
|
200
200
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/common/capabilities.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../src/common/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import * as Effect from 'effect/Effect';
|
|
2
|
+
import * as Registry from 'effect/reactivity/AtomRegistry';
|
|
3
|
+
import * as Scope from 'effect/Scope';
|
|
4
|
+
import * as Process from '@dxos/compute/Process';
|
|
2
5
|
import * as ServiceResolver from '@dxos/compute/ServiceResolver';
|
|
3
6
|
import * as Trace from '@dxos/compute/Trace';
|
|
4
7
|
import { Capabilities } from '../common/index.ts';
|
|
@@ -9,6 +12,12 @@ import { Capability, Plugin } from '../core/index.ts';
|
|
|
9
12
|
* factory, since a sink may hold state across writes and must not be rebuilt underneath itself.
|
|
10
13
|
*/
|
|
11
14
|
export declare const makeDynamicTraceSink: (getFactories: () => readonly Capabilities.TraceSinkFactory[], resolver: ServiceResolver.ServiceResolver) => Trace.Sink;
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* A {@link Process.Manager} that is the stack's {@link Process.ManagerService}, resolved on first use: building it
|
|
17
|
+
* resolves the host's remote manager, which may need services (the client) that are not ready at activation.
|
|
18
|
+
* The process tree reads empty until then.
|
|
19
|
+
*/
|
|
20
|
+
export declare const fromStack: (resolver: ServiceResolver.ServiceResolver, scope: Scope.Scope, registry: Registry.AtomRegistry) => Process.Manager;
|
|
21
|
+
declare const _default: (props: void) => Effect.Effect<(Capability.Contribution<Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.operationHandlers", "single">> | Capability.Contribution<Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.operationInvoker", "single">> | Capability.Contribution<Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.processManager", "single">> | Capability.Contribution<Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.processManagerRuntime", "single">> | Capability.Contribution<Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.serviceResolver", "single">>)[], never, Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.atomRegistry", "single"> | Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.layerSpec", "multi"> | Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.operationHandler", "multi"> | Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.remoteTraceMonitor", "multi"> | Capability.CapabilityIdentifier<"org.dxos.app-framework.capability.traceSink", "multi"> | Scope.Scope | Plugin.Service | Capability.Service>;
|
|
13
22
|
export default _default;
|
|
14
23
|
//# sourceMappingURL=process-manager-capability.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-manager-capability.d.ts","sourceRoot":"","sources":["../../../../src/plugin-process-manager/process-manager-capability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"process-manager-capability.d.ts","sourceRoot":"","sources":["../../../../src/plugin-process-manager/process-manager-capability.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAKxC,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AActC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,eAAe,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAS7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwBtD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,SAAS,YAAY,CAAC,gBAAgB,EAAE,YAClD,eAAe,CAAC,eAAe,KACxC,KAAK,CAAC,IAwBR,CAAC;AAoBF;;;;GAIG;AACH,eAAO,MAAM,SAAS,aACV,eAAe,CAAC,eAAe,SAClC,KAAK,CAAC,KAAK,YACR,QAAQ,CAAC,YAAY,KAC9B,OAAO,CAAC,OA2BV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../../../src/vite-plugin/packages.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../../../src/vite-plugin/packages.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,gBAAgB,UA4H5B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,OAAQ,MAAM,KAAG,OAC2B,CAAC"}
|