@code3d/core 0.0.1-alpha.6 → 0.0.1-alpha.8

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 (37) hide show
  1. package/README.md +53 -3
  2. package/bld/chunks/{chunk-3RIMOCPP.js → chunk-EWPRWRLV.js} +2 -2
  3. package/bld/chunks/{chunk-T6COR2SG.js → chunk-HSU2FH3L.js} +3 -3
  4. package/bld/chunks/{chunk-T3RAUNSF.js → chunk-MICNLFBF.js} +452 -107
  5. package/bld/chunks/chunk-MICNLFBF.js.map +7 -0
  6. package/bld/chunks/{chunk-KYW4AWKO.js → chunk-OAVABPL5.js} +2 -2
  7. package/bld/library/cached.d.ts +5 -3
  8. package/bld/library/cached.d.ts.map +1 -1
  9. package/bld/library/index.d.ts +4 -4
  10. package/bld/library/index.d.ts.map +1 -1
  11. package/bld/library/index.js +5 -3
  12. package/bld/library/kernel-cache.d.ts +5 -3
  13. package/bld/library/kernel-cache.d.ts.map +1 -1
  14. package/bld/library/loft.d.ts.map +1 -1
  15. package/bld/library/replicad.js +2 -2
  16. package/bld/library/runtime.d.ts +61 -6
  17. package/bld/library/runtime.d.ts.map +1 -1
  18. package/bld/library/topology.d.ts +4 -2
  19. package/bld/library/topology.d.ts.map +1 -1
  20. package/bld/node/index.js +7 -5
  21. package/bld/node/replicad.js +4 -4
  22. package/bld/tooling/index.d.ts +2 -2
  23. package/bld/tooling/index.d.ts.map +1 -1
  24. package/bld/tooling/index.js +4 -2
  25. package/package.json +1 -1
  26. package/src/library/cached.ts +29 -8
  27. package/src/library/index.ts +5 -2
  28. package/src/library/kernel-cache.ts +29 -5
  29. package/src/library/loft.ts +5 -1
  30. package/src/library/runtime.ts +508 -43
  31. package/src/library/shell.ts +3 -3
  32. package/src/library/topology.ts +24 -15
  33. package/src/tooling/index.ts +2 -0
  34. package/bld/chunks/chunk-T3RAUNSF.js.map +0 -7
  35. /package/bld/chunks/{chunk-3RIMOCPP.js.map → chunk-EWPRWRLV.js.map} +0 -0
  36. /package/bld/chunks/{chunk-T6COR2SG.js.map → chunk-HSU2FH3L.js.map} +0 -0
  37. /package/bld/chunks/{chunk-KYW4AWKO.js.map → chunk-OAVABPL5.js.map} +0 -0
@@ -2,7 +2,7 @@ export { identifyCachedFunction } from '../library/cached.js';
2
2
  export { installFontEngine, installModelResourceReader, } from '../library/font.js';
3
3
  export { googleFontSources, googleFontUrl } from '../library/google-font.js';
4
4
  export { installOpenCascade } from '../library/open-cascade.js';
5
- export { clearKernelOperationCache, kernelOperationCacheStats, setKernelCacheBudget, setKernelArtifactStore, setKernelExternalBytes, } from '../library/kernel-cache.js';
5
+ export { clearKernelOperationCache, kernelOperationCacheStats, setKernelCacheBudget, setKernelCachePersistenceThreshold, setKernelArtifactStore, setKernelExternalBytes, } from '../library/kernel-cache.js';
6
6
  export type { KernelArtifactStore } from '../library/kernel-cache.js';
7
7
  export { SketchConstraintError, installSketchSolver, } from '../library/sketch-solver.js';
8
8
  export { assertSketchDragConnections, isSketch, sketchDefinition, sketchDragRequiresSolver, sketchEntityParameters, sketchFrame, sketchPointResolver, sketchSource, snapshotSketch, solveSketchSnapshot, withSketchEntityParameters, } from '../library/sketch.js';
@@ -15,7 +15,7 @@ export { sketchRegions } from '../library/sketch-regions.js';
15
15
  export type { SketchRegion } from '../library/sketch-regions.js';
16
16
  export { describeOpenCascadeException } from '../library/open-cascade-error.js';
17
17
  export { authoringApi, beginModelEvaluation, relationPreview, currentRelationSelf, relationSelectionPreview, relationTraceReference, createModelSnapshotter, disposeModelObjects, executeSnapshotQueryBatch, instrumentRelation, instrumentModelOperation, isConstraint, isRelationExpression, isModelObject, modelElementReference, modelObjectRuntimeInfo, modelTopologyIds, modelTopologyReference, planModelSnapshotQueries, relatedModelObjects, retainModelGeometry, } from '../library/runtime.js';
18
- export type { Constraint, ConstraintAnchorSnapshot, RelationExpression, RelationPreview, ConstraintSnapshot, TransformationSnapshot, RelationStageSnapshot, RelationSpatialReference, ConstraintTraceReference, RelationTraceReference, ElementKind, ElementSnapshot, ModelElementReference, ModelGeometryKind, ModelGeometrySnapshot, ModelKind, ModelObject, ModelObjectRuntimeInfo, ModelOperationInputRole, ModelOperationInstrumentation, ModelOperationKind, ModelOperationRegionSnapshot, ModelOperationSelectionSnapshot, ModelOperationSnapshot, ModelParameterDimension, ModelSnapshotObject, ModelSpatialOperation, RotationReferenceSnapshot, ModelTopologyReference, ParameterKind, ParameterTarget, ParameterUsage, RelationObject, RenderMesh, SnapshotQuery, SnapshotQueryBatch, SnapshotQueryResult, SourceRef, Transform, } from '../library/runtime.js';
18
+ export type { Constraint, ConstraintAnchorSnapshot, RelationExpression, RelationPreview, ConstraintSnapshot, TransformationSnapshot, RelationStageSnapshot, RelationSpatialReference, ConstraintTraceReference, RelationTraceReference, ElementKind, ElementSnapshot, DistanceSnapshot, ModelElementReference, ModelGeometryKind, ModelGeometrySnapshot, ModelKind, ModelObject, ModelObjectRuntimeInfo, ModelOperationInputRole, ModelOperationInstrumentation, ModelOperationKind, ModelOperationRegionSnapshot, ModelOperationSelectionSnapshot, ModelOperationSnapshot, ModelParameterDimension, ModelSnapshotObject, ModelSpatialOperation, RotationReferenceSnapshot, ModelTopologyReference, ParameterKind, ParameterTarget, ParameterUsage, RelationObject, RenderMesh, SnapshotQuery, SnapshotQueryBatch, SnapshotQueryResult, SourceRef, Transform, } from '../library/runtime.js';
19
19
  export { composeTransforms, identityRigidTransform, invertTransform, quaternionAxisAngle, relativeTransform, rotateVector, rotationAround, transformsAreEquivalent, xyzRotation, } from '../library/spatial.js';
20
20
  export type { Quaternion, RigidTransform, Vec3 } from '../library/spatial.js';
21
21
  export type { TopologyGeometry, TopologyInspection, TopologyInspectionItem, TopologyInspectionOptions, } from '../library/topology-inspection.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tooling/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tooling/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  installOpenCascade
3
- } from "../chunks/chunk-3RIMOCPP.js";
3
+ } from "../chunks/chunk-EWPRWRLV.js";
4
4
  import {
5
5
  SketchConstraintError,
6
6
  TopologyIdSet,
@@ -52,6 +52,7 @@ import {
52
52
  sameTopologyId,
53
53
  setKernelArtifactStore,
54
54
  setKernelCacheBudget,
55
+ setKernelCachePersistenceThreshold,
55
56
  setKernelExternalBytes,
56
57
  sketchArcGeometry,
57
58
  sketchCurveBounds,
@@ -74,7 +75,7 @@ import {
74
75
  transformsAreEquivalent,
75
76
  withSketchEntityParameters,
76
77
  xyzRotation
77
- } from "../chunks/chunk-T3RAUNSF.js";
78
+ } from "../chunks/chunk-MICNLFBF.js";
78
79
  export {
79
80
  SketchConstraintError,
80
81
  TopologyIdSet,
@@ -127,6 +128,7 @@ export {
127
128
  sameTopologyId,
128
129
  setKernelArtifactStore,
129
130
  setKernelCacheBudget,
131
+ setKernelCachePersistenceThreshold,
130
132
  setKernelExternalBytes,
131
133
  sketchArcGeometry,
132
134
  sketchCurveBounds,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code3d/core",
3
- "version": "0.0.1-alpha.6",
3
+ "version": "0.0.1-alpha.8",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -13,7 +13,7 @@ import {
13
13
  } from './kernel-cache.js';
14
14
  import {estimateRetainedBytes} from './retained-memory.js';
15
15
 
16
- export type CachedOptions<Value> = CacheCodec<Value>;
16
+ export type CacheOptions<Value> = CacheCodec<Value>;
17
17
 
18
18
  const identities = new WeakMap<Function, string>();
19
19
  const sessionIdentities = new WeakMap<Function, string>();
@@ -56,18 +56,34 @@ const dataLifecycle: KernelValueLifecycle<unknown> = {
56
56
 
57
57
  /**
58
58
  * Memoizes a synchronous, deterministic computation in the shared cache.
59
+ * Omit args to create a function, or pass an argument tuple to return its value.
59
60
  * Pass changing captured state as arguments and treat returned data as immutable.
60
61
  * The engine fingerprints definitions and dependencies for persistent reuse.
61
62
  * Outside the engine, function identity provides process-local memory reuse.
62
63
  * Custom encoder/decoder pairs run only when writing/restoring persistent data;
63
64
  * memory hits return the retained value without decoding or copying it.
64
65
  */
65
- export function cached<Args extends unknown[], Value>(
66
+ export function cache<Args extends unknown[], Value>(
66
67
  compute: (
67
68
  ...args: Args
68
69
  ) => Value & (Value extends PromiseLike<unknown> ? never : unknown),
69
- options?: CachedOptions<NoInfer<Value>>,
70
- ): (...args: Args) => Value {
70
+ args: Readonly<NoInfer<Args>>,
71
+ options?: CacheOptions<NoInfer<Value>>,
72
+ ): Value;
73
+ export function cache<Args extends unknown[], Value>(
74
+ compute: (
75
+ ...args: Args
76
+ ) => Value & (Value extends PromiseLike<unknown> ? never : unknown),
77
+ args?: undefined,
78
+ options?: CacheOptions<NoInfer<Value>>,
79
+ ): (...args: Args) => Value;
80
+ export function cache<Args extends unknown[], Value>(
81
+ compute: (
82
+ ...args: Args
83
+ ) => Value & (Value extends PromiseLike<unknown> ? never : unknown),
84
+ args?: Readonly<Args>,
85
+ options?: CacheOptions<Value>,
86
+ ): Value | ((...args: Args) => Value) {
71
87
  const operation = cachedArtifact(
72
88
  (...args: Args): Value => {
73
89
  const value = compute(...args);
@@ -77,12 +93,14 @@ export function cached<Args extends unknown[], Value>(
77
93
  'then' in value &&
78
94
  typeof value.then === 'function'
79
95
  )
80
- throw new Error('cached() requires a synchronous computation.');
96
+ throw new Error('cache() requires a synchronous computation.');
81
97
  return value;
82
98
  },
83
99
  {identity: compute, codec: options},
84
100
  );
85
- return (...args) => operation(...args).value;
101
+ return args === undefined
102
+ ? (...args: Args) => operation(...args).value
103
+ : operation(...args).value;
86
104
  }
87
105
 
88
106
  /** Internal artifact form also supports native ownership and remote admission. */
@@ -116,8 +134,11 @@ export function cachedArtifact<Args extends unknown[], Value>(
116
134
  findKernelOperation(key, lifecycle, persistence);
117
135
  const findMany = (keys: readonly KernelOperationKey[]) =>
118
136
  findKernelOperations(keys, lifecycle, persistence);
119
- const accept = (key: KernelOperationKey, value: Value) =>
120
- acceptKernelOperation(key, lifecycle, value, persistence);
137
+ const accept = (
138
+ key: KernelOperationKey,
139
+ value: Value,
140
+ milliseconds: number,
141
+ ) => acceptKernelOperation(key, lifecycle, value, milliseconds, persistence);
121
142
  return Object.assign(
122
143
  (...args: Args): KernelArtifact<Value> => {
123
144
  return evaluateCachedArtifact(
@@ -1,5 +1,5 @@
1
- export {cached} from './cached.js';
2
- export type {CachedOptions} from './cached.js';
1
+ export {cache} from './cached.js';
2
+ export type {CacheOptions} from './cached.js';
3
3
  export {font, googleFont} from './font.js';
4
4
  export type {Font} from './font.js';
5
5
  export type {GoogleFontOptions} from './google-font.js';
@@ -30,6 +30,7 @@ export {
30
30
  coil,
31
31
  cut,
32
32
  cylinder,
33
+ distance,
33
34
  ellipse,
34
35
  extrude,
35
36
  text,
@@ -52,6 +53,7 @@ export type {
52
53
  Anchor,
53
54
  Bound,
54
55
  DirectionalBounds,
56
+ DistanceAxis,
55
57
  PivotChain,
56
58
  PivotRotation,
57
59
  AxisRotation,
@@ -78,6 +80,7 @@ export type {
78
80
  MergedElements,
79
81
  Model,
80
82
  ModelCapabilities,
83
+ ModelBounds,
81
84
  ModelElementKind,
82
85
  ModelForKind,
83
86
  ModelGeometryKind,
@@ -40,6 +40,7 @@ export type KernelValueLifecycle<Value> = Readonly<{
40
40
  }>;
41
41
 
42
42
  type CacheEntry<Value> = Readonly<{
43
+ persistenceEligible: boolean;
43
44
  estimatedBytes: number;
44
45
  signature: string;
45
46
  value: Value;
@@ -49,9 +50,11 @@ type CacheEntry<Value> = Readonly<{
49
50
 
50
51
  export function createComputationCache({
51
52
  maximumBytes = 2 * 1024 ** 3,
53
+ minimumPersistenceMilliseconds = 1,
52
54
  nativeAllocatedBytes,
53
55
  }: {
54
56
  maximumBytes?: number;
57
+ minimumPersistenceMilliseconds?: number;
55
58
  nativeAllocatedBytes: () => number;
56
59
  }) {
57
60
  const entries = new Map<string, CacheEntry<unknown>>();
@@ -77,6 +80,11 @@ export function createComputationCache({
77
80
  evictHistoricalEntries();
78
81
  }
79
82
 
83
+ /** Apply to future computations without changing existing entries' admission. */
84
+ function setKernelCachePersistenceThreshold(milliseconds: number): void {
85
+ minimumPersistenceMilliseconds = milliseconds;
86
+ }
87
+
80
88
  /** The host accounts for in-flight inputs and all auxiliary native heaps. */
81
89
  function setKernelExternalBytes(bytes: number): void {
82
90
  externalBytes = bytes;
@@ -134,8 +142,10 @@ export function createComputationCache({
134
142
  ): KernelArtifact<Value> {
135
143
  const hit = findKernelOperation(key, lifecycle, codec);
136
144
  if (hit) return hit;
145
+ const started = performance.now();
137
146
  const value = compute();
138
- acceptKernelOperation(key, lifecycle, value, codec);
147
+ const milliseconds = performance.now() - started;
148
+ acceptKernelOperation(key, lifecycle, value, milliseconds, codec);
139
149
  return {id: key.id, value};
140
150
  }
141
151
 
@@ -191,7 +201,9 @@ export function createComputationCache({
191
201
  misses += 1;
192
202
  return undefined;
193
203
  }
194
- cached = retainEntry(key, lifecycle, restored);
204
+ // Existing disk records have already been admitted; reading one must
205
+ // not reinterpret decode time as its original computation cost.
206
+ cached = retainEntry(key, lifecycle, restored, true);
195
207
  persistentHits += 1;
196
208
  persisted.add(id);
197
209
  }
@@ -204,7 +216,8 @@ export function createComputationCache({
204
216
  throw new Error(`Kernel operation cache identity collision: ${id}`);
205
217
  hits += 1;
206
218
  const value = cached.instantiate(cached.value);
207
- if (codec !== false) persist(key, cached.value, codec, true);
219
+ if (cached.persistenceEligible && codec !== false)
220
+ persist(key, cached.value, codec, true);
208
221
  touchEntry(id, cached as CacheEntry<unknown>);
209
222
  return {id, value};
210
223
  }
@@ -214,6 +227,7 @@ export function createComputationCache({
214
227
  key: KernelOperationKey,
215
228
  lifecycle: KernelValueLifecycle<Value>,
216
229
  value: Value,
230
+ milliseconds: number,
217
231
  codec?: CacheCodec<Value> | false,
218
232
  ): void {
219
233
  const existing = entries.get(key.id);
@@ -230,8 +244,14 @@ export function createComputationCache({
230
244
  lifecycle.release(value);
231
245
  throw error;
232
246
  }
233
- const entry = retainEntry(key, lifecycle, retained);
234
- if (codec !== false) persist(key, retained, codec);
247
+ const entry = retainEntry(
248
+ key,
249
+ lifecycle,
250
+ retained,
251
+ milliseconds >= minimumPersistenceMilliseconds,
252
+ );
253
+ if (entry.persistenceEligible && codec !== false)
254
+ persist(key, retained, codec);
235
255
  touchEntry(key.id, entry as CacheEntry<unknown>);
236
256
  }
237
257
 
@@ -288,8 +308,10 @@ export function createComputationCache({
288
308
  key: KernelOperationKey,
289
309
  lifecycle: KernelValueLifecycle<Value>,
290
310
  retained: Value,
311
+ persistenceEligible: boolean,
291
312
  ): CacheEntry<Value> {
292
313
  const entry: CacheEntry<Value> = {
314
+ persistenceEligible,
293
315
  estimatedBytes:
294
316
  256 +
295
317
  estimateRetainedBytes(key.signature) +
@@ -375,6 +397,7 @@ export function createComputationCache({
375
397
  clearKernelOperationCache,
376
398
  kernelOperationCacheStats,
377
399
  setKernelCacheBudget,
400
+ setKernelCachePersistenceThreshold,
378
401
  setKernelArtifactStore,
379
402
  findKernelOperation,
380
403
  findKernelOperations,
@@ -396,6 +419,7 @@ export const {
396
419
  clearKernelOperationCache,
397
420
  kernelOperationCacheStats,
398
421
  setKernelCacheBudget,
422
+ setKernelCachePersistenceThreshold,
399
423
  setKernelArtifactStore,
400
424
  findKernelOperation,
401
425
  findKernelOperations,
@@ -62,7 +62,11 @@ export function loftWithTopology(
62
62
  ruled,
63
63
  holes.map(wires => wires[0]),
64
64
  );
65
- return booleanWithTopology(outer, inner, 'cut');
65
+ return booleanWithTopology(
66
+ {...outer, namespace: 'intermediate'},
67
+ {...inner, namespace: 'intermediate'},
68
+ 'cut',
69
+ );
66
70
  } finally {
67
71
  inner?.shape.delete();
68
72
  outer?.shape.delete();