@dxos/compute 0.8.4-main.e8ec1fe → 0.8.4-main.f466a3d56e

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 (180) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +36 -1
  3. package/dist/lib/neutral/StorageService.mjs +22 -0
  4. package/dist/lib/neutral/chunk-AKVCVI6N.mjs +25 -0
  5. package/dist/lib/neutral/chunk-AKVCVI6N.mjs.map +7 -0
  6. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  7. package/dist/lib/neutral/chunk-LF2ANNYW.mjs +171 -0
  8. package/dist/lib/neutral/chunk-LF2ANNYW.mjs.map +7 -0
  9. package/dist/lib/neutral/chunk-LRCABAWU.mjs +17 -0
  10. package/dist/lib/neutral/chunk-LRCABAWU.mjs.map +7 -0
  11. package/dist/lib/neutral/chunk-RCLYF66G.mjs +21 -0
  12. package/dist/lib/neutral/chunk-RCLYF66G.mjs.map +7 -0
  13. package/dist/lib/neutral/chunk-SEBWOTOU.mjs +235 -0
  14. package/dist/lib/neutral/chunk-SEBWOTOU.mjs.map +7 -0
  15. package/dist/lib/neutral/chunk-VSICPGGY.mjs +53 -0
  16. package/dist/lib/neutral/chunk-VSICPGGY.mjs.map +7 -0
  17. package/dist/lib/neutral/chunk-XEVFBI6S.mjs +62 -0
  18. package/dist/lib/neutral/chunk-XEVFBI6S.mjs.map +7 -0
  19. package/dist/lib/neutral/fib-ZSJYREBW.mjs +10 -0
  20. package/dist/lib/neutral/fib-ZSJYREBW.mjs.map +7 -0
  21. package/dist/lib/neutral/index.mjs +1225 -0
  22. package/dist/lib/neutral/index.mjs.map +7 -0
  23. package/dist/lib/neutral/meta.json +1 -0
  24. package/dist/lib/neutral/reply-YH3BVOUT.mjs +10 -0
  25. package/dist/lib/neutral/reply-YH3BVOUT.mjs.map +7 -0
  26. package/dist/lib/neutral/sleep-TSPIQ5EY.mjs +10 -0
  27. package/dist/lib/neutral/sleep-TSPIQ5EY.mjs.map +7 -0
  28. package/dist/lib/neutral/testing/index.mjs +32 -0
  29. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  30. package/dist/types/src/Blueprint.d.ts +192 -0
  31. package/dist/types/src/Blueprint.d.ts.map +1 -0
  32. package/dist/types/src/Credential.d.ts +27 -0
  33. package/dist/types/src/Credential.d.ts.map +1 -0
  34. package/dist/types/src/LayerSpec.d.ts +56 -0
  35. package/dist/types/src/LayerSpec.d.ts.map +1 -0
  36. package/dist/types/src/McpServer.d.ts +27 -0
  37. package/dist/types/src/McpServer.d.ts.map +1 -0
  38. package/dist/types/src/Operation.d.ts +340 -0
  39. package/dist/types/src/Operation.d.ts.map +1 -0
  40. package/dist/types/src/OperationHandlerSet.d.ts +67 -0
  41. package/dist/types/src/OperationHandlerSet.d.ts.map +1 -0
  42. package/dist/types/src/OperationHandlerSet.test.d.ts +2 -0
  43. package/dist/types/src/OperationHandlerSet.test.d.ts.map +1 -0
  44. package/dist/types/src/OperationRegistry.d.ts +23 -0
  45. package/dist/types/src/OperationRegistry.d.ts.map +1 -0
  46. package/dist/types/src/Process.d.ts +247 -0
  47. package/dist/types/src/Process.d.ts.map +1 -0
  48. package/dist/types/src/Routine.d.ts +63 -0
  49. package/dist/types/src/Routine.d.ts.map +1 -0
  50. package/dist/types/src/Script.d.ts +22 -0
  51. package/dist/types/src/Script.d.ts.map +1 -0
  52. package/dist/types/src/ServiceResolver.d.ts +89 -0
  53. package/dist/types/src/ServiceResolver.d.ts.map +1 -0
  54. package/dist/types/src/StorageService.d.ts +58 -0
  55. package/dist/types/src/StorageService.d.ts.map +1 -0
  56. package/dist/types/src/Template.d.ts +62 -0
  57. package/dist/types/src/Template.d.ts.map +1 -0
  58. package/dist/types/src/Template.test.d.ts +2 -0
  59. package/dist/types/src/Template.test.d.ts.map +1 -0
  60. package/dist/types/src/Trace.d.ts +268 -0
  61. package/dist/types/src/Trace.d.ts.map +1 -0
  62. package/dist/types/src/Trigger.d.ts +150 -0
  63. package/dist/types/src/Trigger.d.ts.map +1 -0
  64. package/dist/types/src/TriggerEvent.d.ts +75 -0
  65. package/dist/types/src/TriggerEvent.d.ts.map +1 -0
  66. package/dist/types/src/errors.d.ts +308 -0
  67. package/dist/types/src/errors.d.ts.map +1 -0
  68. package/dist/types/src/index.d.ts +17 -5
  69. package/dist/types/src/index.d.ts.map +1 -1
  70. package/dist/types/src/testing/definitions.d.ts +11 -0
  71. package/dist/types/src/testing/definitions.d.ts.map +1 -0
  72. package/dist/types/src/testing/fib.d.ts +8 -0
  73. package/dist/types/src/testing/fib.d.ts.map +1 -0
  74. package/dist/types/src/testing/index.d.ts +6 -4
  75. package/dist/types/src/testing/index.d.ts.map +1 -1
  76. package/dist/types/src/testing/reply.d.ts +4 -0
  77. package/dist/types/src/testing/reply.d.ts.map +1 -0
  78. package/dist/types/src/testing/sleep.d.ts +6 -0
  79. package/dist/types/src/testing/sleep.d.ts.map +1 -0
  80. package/dist/types/src/umbrella.test.d.ts +2 -0
  81. package/dist/types/src/umbrella.test.d.ts.map +1 -0
  82. package/dist/types/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +29 -41
  84. package/src/Blueprint.ts +303 -0
  85. package/src/Credential.ts +53 -0
  86. package/src/LayerSpec.ts +91 -0
  87. package/src/McpServer.ts +44 -0
  88. package/src/Operation.ts +593 -0
  89. package/src/OperationHandlerSet.test.ts +92 -0
  90. package/src/OperationHandlerSet.ts +174 -0
  91. package/src/OperationRegistry.ts +50 -0
  92. package/src/Process.ts +504 -0
  93. package/src/Routine.ts +75 -0
  94. package/src/Script.ts +40 -0
  95. package/src/ServiceResolver.ts +194 -0
  96. package/src/StorageService.ts +101 -0
  97. package/src/Template.test.ts +151 -0
  98. package/src/Template.ts +122 -0
  99. package/src/Trace.ts +368 -0
  100. package/src/Trigger.ts +209 -0
  101. package/src/TriggerEvent.ts +64 -0
  102. package/src/errors.ts +71 -0
  103. package/src/index.ts +19 -6
  104. package/src/testing/definitions.ts +49 -0
  105. package/src/testing/fib.ts +22 -0
  106. package/src/testing/index.ts +13 -5
  107. package/src/testing/reply.ts +18 -0
  108. package/src/testing/sleep.ts +16 -0
  109. package/src/umbrella.test.ts +51 -0
  110. package/dist/lib/browser/chunk-CPBXT2HX.mjs +0 -3114
  111. package/dist/lib/browser/chunk-CPBXT2HX.mjs.map +0 -7
  112. package/dist/lib/browser/index.mjs +0 -55
  113. package/dist/lib/browser/meta.json +0 -1
  114. package/dist/lib/browser/testing/index.mjs +0 -197
  115. package/dist/lib/browser/testing/index.mjs.map +0 -7
  116. package/dist/lib/node-esm/chunk-D3RM3FQW.mjs +0 -3116
  117. package/dist/lib/node-esm/chunk-D3RM3FQW.mjs.map +0 -7
  118. package/dist/lib/node-esm/index.mjs +0 -56
  119. package/dist/lib/node-esm/meta.json +0 -1
  120. package/dist/lib/node-esm/testing/index.mjs +0 -198
  121. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  122. package/dist/types/src/compute-graph-registry.d.ts +0 -37
  123. package/dist/types/src/compute-graph-registry.d.ts.map +0 -1
  124. package/dist/types/src/compute-graph-registry.test.d.ts +0 -2
  125. package/dist/types/src/compute-graph-registry.test.d.ts.map +0 -1
  126. package/dist/types/src/compute-graph.d.ts +0 -67
  127. package/dist/types/src/compute-graph.d.ts.map +0 -1
  128. package/dist/types/src/compute-graph.test.d.ts +0 -2
  129. package/dist/types/src/compute-graph.test.d.ts.map +0 -1
  130. package/dist/types/src/compute-node.d.ts +0 -24
  131. package/dist/types/src/compute-node.d.ts.map +0 -1
  132. package/dist/types/src/functions/async-function.d.ts +0 -68
  133. package/dist/types/src/functions/async-function.d.ts.map +0 -1
  134. package/dist/types/src/functions/edge-function.d.ts +0 -20
  135. package/dist/types/src/functions/edge-function.d.ts.map +0 -1
  136. package/dist/types/src/functions/function-defs.d.ts +0 -11
  137. package/dist/types/src/functions/function-defs.d.ts.map +0 -1
  138. package/dist/types/src/functions/index.d.ts +0 -4
  139. package/dist/types/src/functions/index.d.ts.map +0 -1
  140. package/dist/types/src/hyperformula.test.d.ts +0 -2
  141. package/dist/types/src/hyperformula.test.d.ts.map +0 -1
  142. package/dist/types/src/testing/test-builder.d.ts +0 -15
  143. package/dist/types/src/testing/test-builder.d.ts.map +0 -1
  144. package/dist/types/src/testing/test-plugin.d.ts +0 -35
  145. package/dist/types/src/testing/test-plugin.d.ts.map +0 -1
  146. package/dist/types/src/testing/test-runtime.d.ts +0 -10
  147. package/dist/types/src/testing/test-runtime.d.ts.map +0 -1
  148. package/dist/types/src/testing/util.d.ts +0 -2
  149. package/dist/types/src/testing/util.d.ts.map +0 -1
  150. package/dist/types/src/types/hyperformula.d.ts +0 -8
  151. package/dist/types/src/types/hyperformula.d.ts.map +0 -1
  152. package/dist/types/src/types/index.d.ts +0 -3
  153. package/dist/types/src/types/index.d.ts.map +0 -1
  154. package/dist/types/src/types/types.d.ts +0 -20
  155. package/dist/types/src/types/types.d.ts.map +0 -1
  156. package/dist/types/src/types/types.test.d.ts +0 -2
  157. package/dist/types/src/types/types.test.d.ts.map +0 -1
  158. package/dist/types/src/util.d.ts +0 -2
  159. package/dist/types/src/util.d.ts.map +0 -1
  160. package/src/compute-graph-registry.test.ts +0 -154
  161. package/src/compute-graph-registry.ts +0 -97
  162. package/src/compute-graph.test.ts +0 -107
  163. package/src/compute-graph.ts +0 -270
  164. package/src/compute-node.ts +0 -59
  165. package/src/functions/async-function.ts +0 -184
  166. package/src/functions/edge-function.ts +0 -114
  167. package/src/functions/function-defs.ts +0 -2427
  168. package/src/functions/index.ts +0 -7
  169. package/src/hyperformula.test.ts +0 -14
  170. package/src/testing/test-builder.ts +0 -60
  171. package/src/testing/test-plugin.ts +0 -98
  172. package/src/testing/test-runtime.ts +0 -33
  173. package/src/testing/util.ts +0 -9
  174. package/src/types/hyperformula.ts +0 -19
  175. package/src/types/index.ts +0 -6
  176. package/src/types/types.test.ts +0 -91
  177. package/src/types/types.ts +0 -80
  178. package/src/util.ts +0 -8
  179. /package/dist/lib/{browser/index.mjs.map → neutral/StorageService.mjs.map} +0 -0
  180. /package/dist/lib/{node-esm/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,174 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import { type Atom, type Registry } from '@effect-atom/atom';
8
+ import * as Context from 'effect/Context';
9
+ import * as Effect from 'effect/Effect';
10
+ import { pipe } from 'effect/Function';
11
+ import * as Layer from 'effect/Layer';
12
+
13
+ import { runAndForwardErrors } from '@dxos/effect';
14
+ import { assertArgument } from '@dxos/invariant';
15
+
16
+ import { NoHandlerError } from './errors';
17
+ import type * as Operation from './Operation';
18
+
19
+ export const TypeId = '~@dxos/operation/OperationHandlerSet' as const;
20
+ export type TypeId = typeof TypeId;
21
+
22
+ export interface OperationHandlerSet {
23
+ [TypeId]: TypeId;
24
+
25
+ readonly handlers: Effect.Effect<Operation.WithHandler<Operation.Definition.Any>[]>;
26
+
27
+ getHandlers(): Promise<Operation.WithHandler<Operation.Definition.Any>[]>;
28
+ }
29
+
30
+ export const isOperationHandlerSet = (value: unknown): value is OperationHandlerSet => {
31
+ return typeof value === 'object' && value !== null && TypeId in value;
32
+ };
33
+
34
+ export const empty: OperationHandlerSet = {
35
+ [TypeId]: TypeId,
36
+ handlers: Effect.succeed([]),
37
+ getHandlers: () => Promise.resolve([]),
38
+ };
39
+
40
+ /**
41
+ * Creates a new operation handler set from a list of handlers.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const set = OperationHandlerSet.make(
46
+ * Operation.withHandler(Operation.make({ input: Schema.Void, output: Schema.Void }), (input) => Effect.succeed({})),
47
+ * Operation.withHandler(Operation.make({ input: Schema.Void, output: Schema.Void }), (input) => Effect.succeed({})),
48
+ * );
49
+ * ```
50
+ */
51
+ export const make = (...handlers: Operation.WithHandler<Operation.Definition.Any>[]): OperationHandlerSet => {
52
+ return async(() => Promise.resolve(handlers));
53
+ };
54
+
55
+ export const async = (
56
+ getHandlers: () => Promise<Operation.WithHandler<Operation.Definition.Any>[]>,
57
+ ): OperationHandlerSet => {
58
+ // NOTE: Re-runing async module imports has a big performance penalty in Chrome.
59
+ let promise: Promise<Operation.WithHandler<Operation.Definition.Any>[]> | null = null;
60
+ const getHandlersCached = () => {
61
+ if (!promise) {
62
+ promise = getHandlers();
63
+ }
64
+ return promise;
65
+ };
66
+ return {
67
+ [TypeId]: TypeId,
68
+ getHandlers,
69
+ handlers: Effect.promise(getHandlersCached),
70
+ };
71
+ };
72
+
73
+ /**
74
+ * Builds a set backed by an atom of contributed sets. The merged result is
75
+ * cached and invalidated whenever the atom changes, so most accesses are
76
+ * cheap but newly registered handlers are picked up.
77
+ */
78
+ export const reactive = (
79
+ registry: Registry.Registry,
80
+ atom: Atom.Atom<readonly OperationHandlerSet[]>,
81
+ ): OperationHandlerSet => {
82
+ let cached: Promise<Operation.WithHandler<Operation.Definition.Any>[]> | null = null;
83
+ registry.subscribe(atom, () => {
84
+ cached = null;
85
+ });
86
+ // `suspend` defers `registry.get(atom)` until each run, so re-evaluations
87
+ // after cache invalidation see the current contributed sets.
88
+ const compute = Effect.suspend(() =>
89
+ pipe(
90
+ registry.get(atom),
91
+ Effect.forEach((set) => set.handlers, { concurrency: 'unbounded' }),
92
+ Effect.map((groups) => groups.flat()),
93
+ // Reset cached on failure so a transient error doesn't permanently
94
+ // poison subsequent calls.
95
+ Effect.tapErrorCause(() =>
96
+ Effect.sync(() => {
97
+ cached = null;
98
+ }),
99
+ ),
100
+ ),
101
+ );
102
+ const getHandlers = () => (cached ??= runAndForwardErrors(compute));
103
+ return {
104
+ [TypeId]: TypeId,
105
+ getHandlers,
106
+ handlers: Effect.promise(getHandlers),
107
+ };
108
+ };
109
+
110
+ /**
111
+ * Merges multiple operation handler sets into a single set.
112
+ *
113
+ */
114
+ export const merge = (...sets: OperationHandlerSet[]): OperationHandlerSet => {
115
+ assertArgument(sets.every(isOperationHandlerSet), 'sets', 'sets must be an array of OperationHandlerSet');
116
+ return async(() => Promise.all(sets.map((set) => set.getHandlers())).then((handlers) => handlers.flat()));
117
+ };
118
+
119
+ /**
120
+ * Creates a new operation handler set from a list of lazy-loaded modules.
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * const set = OperationHandlerSet.lazy(
125
+ * () => import('./my-handler'),
126
+ * () => import('./my-other-handler'),
127
+ * );
128
+ * ```
129
+ */
130
+ export const lazy = (
131
+ ...modules: (() => Promise<{ default: Operation.WithHandler<Operation.Definition.Any> }>)[]
132
+ ): OperationHandlerSet => {
133
+ return async(() => Promise.all(modules.map((module) => module().then(({ default: handler }) => handler))));
134
+ };
135
+
136
+ /**
137
+ * Gets a handler for an operation by definition.
138
+ */
139
+ export const getHandler = <const Op extends Operation.Definition.Any>(
140
+ set: OperationHandlerSet,
141
+ definition: Op,
142
+ ): Effect.Effect<Operation.WithHandler<Op>, NoHandlerError> =>
143
+ Effect.gen(function* () {
144
+ const handlers = yield* set.handlers;
145
+ const handler = handlers.find((handler) => handler.meta.key === definition.meta.key);
146
+ if (!handler) {
147
+ return yield* Effect.fail(new NoHandlerError(definition.meta.key));
148
+ }
149
+ return handler as any;
150
+ });
151
+
152
+ /**
153
+ * Gets a handler for an operation by key.
154
+ */
155
+ export const getHandlerByKey = (
156
+ set: OperationHandlerSet,
157
+ key: string,
158
+ ): Effect.Effect<Operation.WithHandler<Operation.Definition.Any>, NoHandlerError> =>
159
+ Effect.gen(function* () {
160
+ const handlers = yield* set.handlers;
161
+ const handler = handlers.find((handler) => handler.meta.key === key);
162
+ if (!handler) {
163
+ return yield* Effect.fail(new NoHandlerError(key));
164
+ }
165
+ return handler as any;
166
+ });
167
+
168
+ export class OperationHandlerProvider extends Context.Tag('@dxos/operation/OperationHandlerProvider')<
169
+ OperationHandlerProvider,
170
+ OperationHandlerSet
171
+ >() {}
172
+
173
+ export const provide = (handlers: OperationHandlerSet): Layer.Layer<OperationHandlerProvider, never, never> =>
174
+ Layer.succeed(OperationHandlerProvider, handlers);
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import * as Context from 'effect/Context';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Layer from 'effect/Layer';
10
+ import * as Option from 'effect/Option';
11
+
12
+ import { Database, Filter, Query } from '@dxos/echo';
13
+
14
+ import * as Operation from './Operation';
15
+ import * as OperationHandlerSet from './OperationHandlerSet';
16
+
17
+ export interface OperationRegistry {
18
+ /**
19
+ * Resolve an operation by key.
20
+ */
21
+ resolve(key: string): Effect.Effect<Option.Option<Operation.Definition.Any>>;
22
+ }
23
+
24
+ export class Service extends Context.Tag('@dxos/operation/OperationRegistry')<Service, OperationRegistry>() {}
25
+
26
+ /**
27
+ * Resolve an operation by key.
28
+ */
29
+ export const resolve: (key: string) => Effect.Effect<Option.Option<Operation.Definition.Any>, never, Service> =
30
+ Effect.serviceFunctionEffect(Service, (service) => service.resolve);
31
+
32
+ export const layer: Layer.Layer<Service, never, Database.Service | OperationHandlerSet.OperationHandlerProvider> =
33
+ Layer.effect(
34
+ Service,
35
+ Effect.gen(function* () {
36
+ const database = yield* Database.Service;
37
+ const handlerSet = yield* OperationHandlerSet.OperationHandlerProvider;
38
+ return {
39
+ resolve: (key: string) =>
40
+ Database.runQueryFirst(Query.select(Filter.and(Filter.type(Operation.PersistentOperation), Filter.key(key))))
41
+ .pipe(
42
+ Effect.flatten,
43
+ Effect.map(Operation.deserialize),
44
+ Effect.catchTag('NoSuchElementException', () => OperationHandlerSet.getHandlerByKey(handlerSet, key)),
45
+ Effect.option,
46
+ )
47
+ .pipe(Effect.provideService(Database.Service, database)),
48
+ };
49
+ }),
50
+ );