@czap/core 0.1.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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/addressed-digest.d.ts +15 -0
- package/dist/addressed-digest.d.ts.map +1 -0
- package/dist/addressed-digest.js +35 -0
- package/dist/addressed-digest.js.map +1 -0
- package/dist/animation.d.ts +46 -0
- package/dist/animation.d.ts.map +1 -0
- package/dist/animation.js +70 -0
- package/dist/animation.js.map +1 -0
- package/dist/assembly.d.ts +25 -0
- package/dist/assembly.d.ts.map +1 -0
- package/dist/assembly.js +58 -0
- package/dist/assembly.js.map +1 -0
- package/dist/av-bridge.d.ts +74 -0
- package/dist/av-bridge.d.ts.map +1 -0
- package/dist/av-bridge.js +107 -0
- package/dist/av-bridge.js.map +1 -0
- package/dist/av-renderer.d.ts +56 -0
- package/dist/av-renderer.d.ts.map +1 -0
- package/dist/av-renderer.js +65 -0
- package/dist/av-renderer.js.map +1 -0
- package/dist/blend.d.ts +61 -0
- package/dist/blend.d.ts.map +1 -0
- package/dist/blend.js +100 -0
- package/dist/blend.js.map +1 -0
- package/dist/boundary.d.ts +154 -0
- package/dist/boundary.d.ts.map +1 -0
- package/dist/boundary.js +269 -0
- package/dist/boundary.js.map +1 -0
- package/dist/brands.d.ts +63 -0
- package/dist/brands.d.ts.map +1 -0
- package/dist/brands.js +31 -0
- package/dist/brands.js.map +1 -0
- package/dist/caps.d.ts +49 -0
- package/dist/caps.d.ts.map +1 -0
- package/dist/caps.js +73 -0
- package/dist/caps.js.map +1 -0
- package/dist/capsule.d.ts +77 -0
- package/dist/capsule.d.ts.map +1 -0
- package/dist/capsule.js +18 -0
- package/dist/capsule.js.map +1 -0
- package/dist/capsules/boundary-evaluate.d.ts +28 -0
- package/dist/capsules/boundary-evaluate.d.ts.map +1 -0
- package/dist/capsules/boundary-evaluate.js +117 -0
- package/dist/capsules/boundary-evaluate.js.map +1 -0
- package/dist/capsules/canonical-cbor.d.ts +13 -0
- package/dist/capsules/canonical-cbor.d.ts.map +1 -0
- package/dist/capsules/canonical-cbor.js +60 -0
- package/dist/capsules/canonical-cbor.js.map +1 -0
- package/dist/capsules/token-buffer.d.ts +24 -0
- package/dist/capsules/token-buffer.d.ts.map +1 -0
- package/dist/capsules/token-buffer.js +53 -0
- package/dist/capsules/token-buffer.js.map +1 -0
- package/dist/capture.d.ts +40 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +10 -0
- package/dist/capture.js.map +1 -0
- package/dist/cbor.d.ts +33 -0
- package/dist/cbor.d.ts.map +1 -0
- package/dist/cbor.js +179 -0
- package/dist/cbor.js.map +1 -0
- package/dist/cell.d.ts +53 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +83 -0
- package/dist/cell.js.map +1 -0
- package/dist/codec.d.ts +30 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +25 -0
- package/dist/codec.js.map +1 -0
- package/dist/component.d.ts +52 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +44 -0
- package/dist/component.js.map +1 -0
- package/dist/composable.d.ts +76 -0
- package/dist/composable.d.ts.map +1 -0
- package/dist/composable.js +221 -0
- package/dist/composable.js.map +1 -0
- package/dist/compositor-pool.d.ts +74 -0
- package/dist/compositor-pool.d.ts.map +1 -0
- package/dist/compositor-pool.js +119 -0
- package/dist/compositor-pool.js.map +1 -0
- package/dist/compositor.d.ts +90 -0
- package/dist/compositor.d.ts.map +1 -0
- package/dist/compositor.js +278 -0
- package/dist/compositor.js.map +1 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -0
- package/dist/dag.d.ts +251 -0
- package/dist/dag.d.ts.map +1 -0
- package/dist/dag.js +450 -0
- package/dist/dag.js.map +1 -0
- package/dist/defaults.d.ts +45 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +45 -0
- package/dist/defaults.js.map +1 -0
- package/dist/derived.d.ts +34 -0
- package/dist/derived.d.ts.map +1 -0
- package/dist/derived.js +101 -0
- package/dist/derived.js.map +1 -0
- package/dist/diagnostics.d.ts +77 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +122 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/dirty.d.ts +55 -0
- package/dist/dirty.d.ts.map +1 -0
- package/dist/dirty.js +80 -0
- package/dist/dirty.js.map +1 -0
- package/dist/easing.d.ts +55 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +291 -0
- package/dist/easing.js.map +1 -0
- package/dist/ecs.d.ts +105 -0
- package/dist/ecs.d.ts.map +1 -0
- package/dist/ecs.js +245 -0
- package/dist/ecs.js.map +1 -0
- package/dist/fnv.d.ts +14 -0
- package/dist/fnv.d.ts.map +1 -0
- package/dist/fnv.js +28 -0
- package/dist/fnv.js.map +1 -0
- package/dist/frame-budget.d.ts +73 -0
- package/dist/frame-budget.d.ts.map +1 -0
- package/dist/frame-budget.js +114 -0
- package/dist/frame-budget.js.map +1 -0
- package/dist/gen-frame.d.ts +102 -0
- package/dist/gen-frame.d.ts.map +1 -0
- package/dist/gen-frame.js +121 -0
- package/dist/gen-frame.js.map +1 -0
- package/dist/harness/arbitrary-from-schema.d.ts +28 -0
- package/dist/harness/arbitrary-from-schema.d.ts.map +1 -0
- package/dist/harness/arbitrary-from-schema.js +262 -0
- package/dist/harness/arbitrary-from-schema.js.map +1 -0
- package/dist/harness/cached-projection.d.ts +19 -0
- package/dist/harness/cached-projection.d.ts.map +1 -0
- package/dist/harness/cached-projection.js +39 -0
- package/dist/harness/cached-projection.js.map +1 -0
- package/dist/harness/index.d.ts +16 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +15 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/policy-gate.d.ts +18 -0
- package/dist/harness/policy-gate.d.ts.map +1 -0
- package/dist/harness/policy-gate.js +46 -0
- package/dist/harness/policy-gate.js.map +1 -0
- package/dist/harness/pure-transform.d.ts +42 -0
- package/dist/harness/pure-transform.d.ts.map +1 -0
- package/dist/harness/pure-transform.js +76 -0
- package/dist/harness/pure-transform.js.map +1 -0
- package/dist/harness/receipted-mutation.d.ts +23 -0
- package/dist/harness/receipted-mutation.d.ts.map +1 -0
- package/dist/harness/receipted-mutation.js +52 -0
- package/dist/harness/receipted-mutation.js.map +1 -0
- package/dist/harness/scene-composition.d.ts +19 -0
- package/dist/harness/scene-composition.d.ts.map +1 -0
- package/dist/harness/scene-composition.js +47 -0
- package/dist/harness/scene-composition.js.map +1 -0
- package/dist/harness/site-adapter.d.ts +18 -0
- package/dist/harness/site-adapter.d.ts.map +1 -0
- package/dist/harness/site-adapter.js +38 -0
- package/dist/harness/site-adapter.js.map +1 -0
- package/dist/harness/state-machine.d.ts +19 -0
- package/dist/harness/state-machine.d.ts.map +1 -0
- package/dist/harness/state-machine.js +44 -0
- package/dist/harness/state-machine.js.map +1 -0
- package/dist/hlc.d.ts +99 -0
- package/dist/hlc.d.ts.map +1 -0
- package/dist/hlc.js +219 -0
- package/dist/hlc.js.map +1 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +14 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +31 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/live-cell.d.ts +46 -0
- package/dist/live-cell.d.ts.map +1 -0
- package/dist/live-cell.js +154 -0
- package/dist/live-cell.js.map +1 -0
- package/dist/op.d.ts +58 -0
- package/dist/op.d.ts.map +1 -0
- package/dist/op.js +171 -0
- package/dist/op.js.map +1 -0
- package/dist/plan.d.ts +195 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +211 -0
- package/dist/plan.js.map +1 -0
- package/dist/protocol.d.ts +33 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +10 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quantizer-types.d.ts +28 -0
- package/dist/quantizer-types.d.ts.map +1 -0
- package/dist/quantizer-types.js +9 -0
- package/dist/quantizer-types.js.map +1 -0
- package/dist/receipt.d.ts +294 -0
- package/dist/receipt.d.ts.map +1 -0
- package/dist/receipt.js +352 -0
- package/dist/receipt.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +75 -0
- package/dist/runtime-coordinator.d.ts.map +1 -0
- package/dist/runtime-coordinator.js +149 -0
- package/dist/runtime-coordinator.js.map +1 -0
- package/dist/scheduler.d.ts +58 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +109 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/ship-capsule.d.ts +54 -0
- package/dist/ship-capsule.d.ts.map +1 -0
- package/dist/ship-capsule.js +142 -0
- package/dist/ship-capsule.js.map +1 -0
- package/dist/ship-manifest.d.ts +45 -0
- package/dist/ship-manifest.d.ts.map +1 -0
- package/dist/ship-manifest.js +175 -0
- package/dist/ship-manifest.js.map +1 -0
- package/dist/signal.d.ts +149 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +277 -0
- package/dist/signal.js.map +1 -0
- package/dist/speculative.d.ts +67 -0
- package/dist/speculative.d.ts.map +1 -0
- package/dist/speculative.js +139 -0
- package/dist/speculative.js.map +1 -0
- package/dist/store.d.ts +39 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +42 -0
- package/dist/store.js.map +1 -0
- package/dist/style.d.ts +119 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +168 -0
- package/dist/style.js.map +1 -0
- package/dist/testing.d.ts +14 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +14 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme.d.ts +78 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +109 -0
- package/dist/theme.js.map +1 -0
- package/dist/timeline.d.ts +45 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +101 -0
- package/dist/timeline.js.map +1 -0
- package/dist/token-buffer.d.ts +43 -0
- package/dist/token-buffer.d.ts.map +1 -0
- package/dist/token-buffer.js +112 -0
- package/dist/token-buffer.js.map +1 -0
- package/dist/token.d.ts +107 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +143 -0
- package/dist/token.js.map +1 -0
- package/dist/tuple.d.ts +16 -0
- package/dist/tuple.d.ts.map +1 -0
- package/dist/tuple.js +16 -0
- package/dist/tuple.js.map +1 -0
- package/dist/type-utils.d.ts +41 -0
- package/dist/type-utils.d.ts.map +1 -0
- package/dist/type-utils.js +10 -0
- package/dist/type-utils.js.map +1 -0
- package/dist/typed-ref.d.ts +50 -0
- package/dist/typed-ref.d.ts.map +1 -0
- package/dist/typed-ref.js +59 -0
- package/dist/typed-ref.js.map +1 -0
- package/dist/ui-quality.d.ts +50 -0
- package/dist/ui-quality.d.ts.map +1 -0
- package/dist/ui-quality.js +64 -0
- package/dist/ui-quality.js.map +1 -0
- package/dist/validation-error.d.ts +25 -0
- package/dist/validation-error.d.ts.map +1 -0
- package/dist/validation-error.js +32 -0
- package/dist/validation-error.js.map +1 -0
- package/dist/vector-clock.d.ts +46 -0
- package/dist/vector-clock.d.ts.map +1 -0
- package/dist/vector-clock.js +91 -0
- package/dist/vector-clock.js.map +1 -0
- package/dist/video.d.ts +62 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +59 -0
- package/dist/video.js.map +1 -0
- package/dist/wasm-dispatch.d.ts +52 -0
- package/dist/wasm-dispatch.d.ts.map +1 -0
- package/dist/wasm-dispatch.js +204 -0
- package/dist/wasm-dispatch.js.map +1 -0
- package/dist/wasm-fallback.d.ts +19 -0
- package/dist/wasm-fallback.d.ts.map +1 -0
- package/dist/wasm-fallback.js +93 -0
- package/dist/wasm-fallback.js.map +1 -0
- package/dist/wire.d.ts +49 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +201 -0
- package/dist/wire.js.map +1 -0
- package/dist/zap.d.ts +42 -0
- package/dist/zap.d.ts.map +1 -0
- package/dist/zap.js +172 -0
- package/dist/zap.js.map +1 -0
- package/package.json +71 -0
- package/src/addressed-digest.ts +48 -0
- package/src/animation.ts +103 -0
- package/src/assembly.ts +76 -0
- package/src/av-bridge.ts +161 -0
- package/src/av-renderer.ts +118 -0
- package/src/blend.ts +135 -0
- package/src/boundary.ts +363 -0
- package/src/brands.ts +86 -0
- package/src/caps.ts +100 -0
- package/src/capsule.ts +95 -0
- package/src/capsules/boundary-evaluate.ts +128 -0
- package/src/capsules/canonical-cbor.ts +60 -0
- package/src/capsules/token-buffer.ts +57 -0
- package/src/capture.ts +48 -0
- package/src/cbor.ts +199 -0
- package/src/cell.ts +130 -0
- package/src/codec.ts +39 -0
- package/src/component.ts +102 -0
- package/src/composable.ts +328 -0
- package/src/compositor-pool.ts +162 -0
- package/src/compositor.ts +387 -0
- package/src/config.ts +157 -0
- package/src/dag.ts +527 -0
- package/src/defaults.ts +60 -0
- package/src/derived.ts +164 -0
- package/src/diagnostics.ts +186 -0
- package/src/dirty.ts +101 -0
- package/src/easing.ts +334 -0
- package/src/ecs.ts +382 -0
- package/src/fnv.ts +31 -0
- package/src/frame-budget.ts +149 -0
- package/src/gen-frame.ts +229 -0
- package/src/harness/arbitrary-from-schema.ts +270 -0
- package/src/harness/cached-projection.ts +46 -0
- package/src/harness/index.ts +16 -0
- package/src/harness/policy-gate.ts +51 -0
- package/src/harness/pure-transform.ts +121 -0
- package/src/harness/receipted-mutation.ts +59 -0
- package/src/harness/scene-composition.ts +54 -0
- package/src/harness/site-adapter.ts +43 -0
- package/src/harness/state-machine.ts +49 -0
- package/src/hlc.ts +238 -0
- package/src/index.ts +274 -0
- package/src/interpolate.ts +37 -0
- package/src/live-cell.ts +199 -0
- package/src/op.ts +233 -0
- package/src/plan.ts +317 -0
- package/src/protocol.ts +49 -0
- package/src/quantizer-types.ts +29 -0
- package/src/receipt.ts +444 -0
- package/src/runtime-coordinator.ts +230 -0
- package/src/scheduler.ts +161 -0
- package/src/ship-capsule.ts +191 -0
- package/src/signal.ts +345 -0
- package/src/speculative.ts +186 -0
- package/src/store.ts +77 -0
- package/src/style.ts +249 -0
- package/src/testing.ts +14 -0
- package/src/theme.ts +153 -0
- package/src/timeline.ts +146 -0
- package/src/token-buffer.ts +151 -0
- package/src/token.ts +197 -0
- package/src/tuple.ts +19 -0
- package/src/type-utils.ts +48 -0
- package/src/typed-ref.ts +79 -0
- package/src/ui-quality.ts +105 -0
- package/src/validation-error.ts +34 -0
- package/src/vector-clock.ts +111 -0
- package/src/video.ts +106 -0
- package/src/wasm-dispatch.ts +300 -0
- package/src/wasm-fallback.ts +102 -0
- package/src/wire.ts +274 -0
- package/src/zap.ts +241 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capsule declaration wrapping TokenBuffer as a stateMachine.
|
|
3
|
+
* Proves the factory kernel against a stateful LLM-token primitive
|
|
4
|
+
* with bounded-allocation discipline.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { Schema } from 'effect';
|
|
9
|
+
import { defineCapsule } from '../assembly.js';
|
|
10
|
+
const TokenEventSchema = Schema.Union([
|
|
11
|
+
Schema.Struct({ _tag: Schema.Literal('push'), token: Schema.String }),
|
|
12
|
+
Schema.Struct({ _tag: Schema.Literal('flush') }),
|
|
13
|
+
Schema.Struct({ _tag: Schema.Literal('reset') }),
|
|
14
|
+
]);
|
|
15
|
+
const PhaseSchema = Schema.Union([Schema.Literal('idle'), Schema.Literal('buffering'), Schema.Literal('draining')]);
|
|
16
|
+
const BufferStateSchema = Schema.Struct({
|
|
17
|
+
phase: PhaseSchema,
|
|
18
|
+
tokens: Schema.Array(Schema.String),
|
|
19
|
+
totalBytes: Schema.Number,
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Declared capsule for TokenBuffer. Registered in the module-level
|
|
23
|
+
* catalog at import time; walked by the factory compiler.
|
|
24
|
+
*/
|
|
25
|
+
export const tokenBufferCapsule = defineCapsule({
|
|
26
|
+
_kind: 'stateMachine',
|
|
27
|
+
name: 'core.token-buffer',
|
|
28
|
+
input: TokenEventSchema,
|
|
29
|
+
output: BufferStateSchema,
|
|
30
|
+
capabilities: { reads: [], writes: ['buffer.tokens'] },
|
|
31
|
+
invariants: [
|
|
32
|
+
{
|
|
33
|
+
name: 'phase-matches-content',
|
|
34
|
+
check: (_i, o) => {
|
|
35
|
+
const out = o;
|
|
36
|
+
return out.tokens.length === 0 ? out.phase !== 'buffering' : true;
|
|
37
|
+
},
|
|
38
|
+
message: 'empty buffer cannot be in buffering phase',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'totalBytes-tracks-tokens',
|
|
42
|
+
check: (_i, o) => {
|
|
43
|
+
const out = o;
|
|
44
|
+
const expected = out.tokens.reduce((s, t) => s + t.length, 0);
|
|
45
|
+
return out.totalBytes === expected;
|
|
46
|
+
},
|
|
47
|
+
message: 'totalBytes must equal sum of token byte lengths',
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
budgets: { p95Ms: 0.5, allocClass: 'bounded' },
|
|
51
|
+
site: ['node', 'browser'],
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=token-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-buffer.js","sourceRoot":"","sources":["../../src/capsules/token-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACrE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAEpH,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,WAAW;IAClB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM;CAC1B,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;IAC9C,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE;IACtD,UAAU,EAAE;QACV;YACE,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACf,MAAM,GAAG,GAAG,CAAiD,CAAC;gBAC9D,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;YACpE,CAAC;YACD,OAAO,EAAE,2CAA2C;SACrD;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACf,MAAM,GAAG,GAAG,CAAsD,CAAC;gBACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC9D,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC;YACrC,CAAC;YACD,OAAO,EAAE,iDAAiD;SAC3D;KACF;IACD,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE;IAC9C,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;CAC1B,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture types -- the contract between frame rendering and video encoding.
|
|
3
|
+
*
|
|
4
|
+
* `FrameCapture` is the abstraction that both WebCodecs and Remotion
|
|
5
|
+
* implement. VideoRenderer produces frames, FrameCapture consumes them.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { Millis } from './brands.js';
|
|
10
|
+
/** Encoder-facing configuration: target resolution and frame rate. */
|
|
11
|
+
export interface CaptureConfig {
|
|
12
|
+
readonly width: number;
|
|
13
|
+
readonly height: number;
|
|
14
|
+
readonly fps: number;
|
|
15
|
+
}
|
|
16
|
+
/** Single pre-rendered frame handed to a {@link FrameCapture} — frame number, timestamp, and pixel source. */
|
|
17
|
+
export interface CaptureFrame {
|
|
18
|
+
readonly frame: number;
|
|
19
|
+
readonly timestamp: number;
|
|
20
|
+
readonly bitmap: ImageBitmap | OffscreenCanvas;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Minimal encoder contract: `init` to open the encoder, `capture` per frame,
|
|
24
|
+
* `finalize` to flush and return the encoded blob. Implemented by `@czap/web`
|
|
25
|
+
* (WebCodecs) and `@czap/remotion` (Remotion capture).
|
|
26
|
+
*/
|
|
27
|
+
export interface FrameCapture {
|
|
28
|
+
readonly _tag: 'FrameCapture';
|
|
29
|
+
init(config: CaptureConfig): Promise<void>;
|
|
30
|
+
capture(frame: CaptureFrame): Promise<void>;
|
|
31
|
+
finalize(): Promise<CaptureResult>;
|
|
32
|
+
}
|
|
33
|
+
/** Encoder output returned from {@link FrameCapture}.`finalize`: the encoded blob plus codec metadata. */
|
|
34
|
+
export interface CaptureResult {
|
|
35
|
+
readonly blob: Blob;
|
|
36
|
+
readonly codec: string;
|
|
37
|
+
readonly frames: number;
|
|
38
|
+
readonly durationMs: Millis;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAM1C,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,8GAA8G;AAC9G,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC;CAChD;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACpC;AAED,0GAA0G;AAC1G,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
|
package/dist/capture.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture types -- the contract between frame rendering and video encoding.
|
|
3
|
+
*
|
|
4
|
+
* `FrameCapture` is the abstraction that both WebCodecs and Remotion
|
|
5
|
+
* implement. VideoRenderer produces frames, FrameCapture consumes them.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/dist/cbor.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical CBOR encoder — RFC 8949 §4.2.1 deterministic encoding.
|
|
3
|
+
*
|
|
4
|
+
* Pure encode-only path used to produce stable byte sequences for content
|
|
5
|
+
* addressing and idempotency hashes. Honors ADR-0003: identical inputs
|
|
6
|
+
* (including key-permuted plain objects) emit byte-identical Uint8Arrays
|
|
7
|
+
* across platforms.
|
|
8
|
+
*
|
|
9
|
+
* Rules implemented:
|
|
10
|
+
* - Integers (major 0/1) use shortest form. Range: [MIN_SAFE_INTEGER,
|
|
11
|
+
* MAX_SAFE_INTEGER]. Negative `n` encodes as `-1 - n` per spec.
|
|
12
|
+
* - Numbers that are not safe integers encode as float64 (major 7, simple 27).
|
|
13
|
+
* - Strings encode as UTF-8 with major 3 length prefix.
|
|
14
|
+
* - Uint8Array encodes as major 2 (byte string) with length prefix.
|
|
15
|
+
* - Arrays encode definite-length (major 4).
|
|
16
|
+
* - Plain objects encode as definite-length maps (major 5). Keys are
|
|
17
|
+
* sorted by their **encoded byte order** (lex on UTF-8 bytes for the
|
|
18
|
+
* string-keyed case) before emission. `undefined` properties are skipped.
|
|
19
|
+
* - `false`/`true`/`null` emit simple values 20/21/22. `undefined` is
|
|
20
|
+
* coerced to null (22) for JSON parity; plain-object properties whose
|
|
21
|
+
* value is `undefined` are skipped entirely.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
/** Canonical CBOR encoder namespace (ADR-0001 pattern). */
|
|
26
|
+
export declare const CanonicalCbor: {
|
|
27
|
+
readonly encode: (value: unknown) => Uint8Array;
|
|
28
|
+
};
|
|
29
|
+
export declare namespace CanonicalCbor {
|
|
30
|
+
/** Output type — raw CBOR bytes per RFC 8949 §4.2.1. */
|
|
31
|
+
type Encoded = Uint8Array;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=cbor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cbor.d.ts","sourceRoot":"","sources":["../src/cbor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAyKH,2DAA2D;AAC3D,eAAO,MAAM,aAAa;6BA1BF,OAAO,KAAG,UAAU;CA0Ba,CAAC;AAE1D,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,wDAAwD;IACxD,KAAY,OAAO,GAAG,UAAU,CAAC;CAClC"}
|
package/dist/cbor.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical CBOR encoder — RFC 8949 §4.2.1 deterministic encoding.
|
|
3
|
+
*
|
|
4
|
+
* Pure encode-only path used to produce stable byte sequences for content
|
|
5
|
+
* addressing and idempotency hashes. Honors ADR-0003: identical inputs
|
|
6
|
+
* (including key-permuted plain objects) emit byte-identical Uint8Arrays
|
|
7
|
+
* across platforms.
|
|
8
|
+
*
|
|
9
|
+
* Rules implemented:
|
|
10
|
+
* - Integers (major 0/1) use shortest form. Range: [MIN_SAFE_INTEGER,
|
|
11
|
+
* MAX_SAFE_INTEGER]. Negative `n` encodes as `-1 - n` per spec.
|
|
12
|
+
* - Numbers that are not safe integers encode as float64 (major 7, simple 27).
|
|
13
|
+
* - Strings encode as UTF-8 with major 3 length prefix.
|
|
14
|
+
* - Uint8Array encodes as major 2 (byte string) with length prefix.
|
|
15
|
+
* - Arrays encode definite-length (major 4).
|
|
16
|
+
* - Plain objects encode as definite-length maps (major 5). Keys are
|
|
17
|
+
* sorted by their **encoded byte order** (lex on UTF-8 bytes for the
|
|
18
|
+
* string-keyed case) before emission. `undefined` properties are skipped.
|
|
19
|
+
* - `false`/`true`/`null` emit simple values 20/21/22. `undefined` is
|
|
20
|
+
* coerced to null (22) for JSON parity; plain-object properties whose
|
|
21
|
+
* value is `undefined` are skipped entirely.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
const MAJOR_UNSIGNED = 0 << 5;
|
|
26
|
+
const MAJOR_NEGATIVE = 1 << 5;
|
|
27
|
+
const MAJOR_BYTES = 2 << 5;
|
|
28
|
+
const MAJOR_STRING = 3 << 5;
|
|
29
|
+
const MAJOR_ARRAY = 4 << 5;
|
|
30
|
+
const MAJOR_MAP = 5 << 5;
|
|
31
|
+
const MAJOR_SIMPLE = 7 << 5;
|
|
32
|
+
const SIMPLE_FALSE = 20;
|
|
33
|
+
const SIMPLE_TRUE = 21;
|
|
34
|
+
const SIMPLE_NULL = 22;
|
|
35
|
+
const SIMPLE_FLOAT64 = 27;
|
|
36
|
+
const textEncoder = new TextEncoder();
|
|
37
|
+
/** Internal: encode an unsigned integer head with the given major type. */
|
|
38
|
+
function encodeHead(major, value) {
|
|
39
|
+
if (value < 0 || !Number.isFinite(value)) {
|
|
40
|
+
throw new RangeError(`CanonicalCbor: head argument must be a non-negative finite integer, got ${value}`);
|
|
41
|
+
}
|
|
42
|
+
if (value < 24) {
|
|
43
|
+
return new Uint8Array([major | value]);
|
|
44
|
+
}
|
|
45
|
+
if (value < 0x100) {
|
|
46
|
+
return new Uint8Array([major | 24, value]);
|
|
47
|
+
}
|
|
48
|
+
if (value < 0x10000) {
|
|
49
|
+
return new Uint8Array([major | 25, (value >>> 8) & 0xff, value & 0xff]);
|
|
50
|
+
}
|
|
51
|
+
if (value < 0x100000000) {
|
|
52
|
+
return new Uint8Array([
|
|
53
|
+
major | 26,
|
|
54
|
+
(value >>> 24) & 0xff,
|
|
55
|
+
(value >>> 16) & 0xff,
|
|
56
|
+
(value >>> 8) & 0xff,
|
|
57
|
+
value & 0xff,
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
// 8-byte unsigned integer head; safe up to 2^53 - 1.
|
|
61
|
+
const high = Math.floor(value / 0x100000000);
|
|
62
|
+
const low = value >>> 0;
|
|
63
|
+
return new Uint8Array([
|
|
64
|
+
major | 27,
|
|
65
|
+
(high >>> 24) & 0xff,
|
|
66
|
+
(high >>> 16) & 0xff,
|
|
67
|
+
(high >>> 8) & 0xff,
|
|
68
|
+
high & 0xff,
|
|
69
|
+
(low >>> 24) & 0xff,
|
|
70
|
+
(low >>> 16) & 0xff,
|
|
71
|
+
(low >>> 8) & 0xff,
|
|
72
|
+
low & 0xff,
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
function concat(parts) {
|
|
76
|
+
let total = 0;
|
|
77
|
+
for (const p of parts)
|
|
78
|
+
total += p.length;
|
|
79
|
+
const out = new Uint8Array(total);
|
|
80
|
+
let offset = 0;
|
|
81
|
+
for (const p of parts) {
|
|
82
|
+
out.set(p, offset);
|
|
83
|
+
offset += p.length;
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
function encodeInteger(value) {
|
|
88
|
+
if (value >= 0) {
|
|
89
|
+
return encodeHead(MAJOR_UNSIGNED, value);
|
|
90
|
+
}
|
|
91
|
+
// -1 - n form. For value = -1 → 0; value = -100 → 99; etc.
|
|
92
|
+
return encodeHead(MAJOR_NEGATIVE, -1 - value);
|
|
93
|
+
}
|
|
94
|
+
function encodeFloat64(value) {
|
|
95
|
+
const buf = new ArrayBuffer(8);
|
|
96
|
+
new DataView(buf).setFloat64(0, value, false /* big-endian */);
|
|
97
|
+
const out = new Uint8Array(9);
|
|
98
|
+
out[0] = MAJOR_SIMPLE | SIMPLE_FLOAT64;
|
|
99
|
+
out.set(new Uint8Array(buf), 1);
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
function encodeNumber(value) {
|
|
103
|
+
if (Number.isInteger(value) &&
|
|
104
|
+
value >= Number.MIN_SAFE_INTEGER &&
|
|
105
|
+
value <= Number.MAX_SAFE_INTEGER) {
|
|
106
|
+
return encodeInteger(value);
|
|
107
|
+
}
|
|
108
|
+
return encodeFloat64(value);
|
|
109
|
+
}
|
|
110
|
+
function encodeString(value) {
|
|
111
|
+
const utf8 = textEncoder.encode(value);
|
|
112
|
+
return concat([encodeHead(MAJOR_STRING, utf8.length), utf8]);
|
|
113
|
+
}
|
|
114
|
+
function encodeBytes(value) {
|
|
115
|
+
return concat([encodeHead(MAJOR_BYTES, value.length), value]);
|
|
116
|
+
}
|
|
117
|
+
function encodeArray(value) {
|
|
118
|
+
const parts = [encodeHead(MAJOR_ARRAY, value.length)];
|
|
119
|
+
for (const item of value) {
|
|
120
|
+
parts.push(_encode(item));
|
|
121
|
+
}
|
|
122
|
+
return concat(parts);
|
|
123
|
+
}
|
|
124
|
+
function compareBytes(a, b) {
|
|
125
|
+
const len = Math.min(a.length, b.length);
|
|
126
|
+
for (let i = 0; i < len; i++) {
|
|
127
|
+
const av = a[i];
|
|
128
|
+
const bv = b[i];
|
|
129
|
+
if (av !== bv)
|
|
130
|
+
return av - bv;
|
|
131
|
+
}
|
|
132
|
+
return a.length - b.length;
|
|
133
|
+
}
|
|
134
|
+
function encodeObject(value) {
|
|
135
|
+
// Skip undefined values to match JSON semantics.
|
|
136
|
+
const keys = Object.keys(value).filter((k) => value[k] !== undefined);
|
|
137
|
+
const pairs = [];
|
|
138
|
+
for (const key of keys) {
|
|
139
|
+
pairs.push({
|
|
140
|
+
keyBytes: encodeString(key),
|
|
141
|
+
valueBytes: _encode(value[key]),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// RFC 8949 §4.2.1: sort by encoded-key byte sequence, lexicographically.
|
|
145
|
+
pairs.sort((p, q) => compareBytes(p.keyBytes, q.keyBytes));
|
|
146
|
+
const parts = [encodeHead(MAJOR_MAP, pairs.length)];
|
|
147
|
+
for (const pair of pairs) {
|
|
148
|
+
parts.push(pair.keyBytes);
|
|
149
|
+
parts.push(pair.valueBytes);
|
|
150
|
+
}
|
|
151
|
+
return concat(parts);
|
|
152
|
+
}
|
|
153
|
+
const _encode = (value) => {
|
|
154
|
+
if (value === null || value === undefined) {
|
|
155
|
+
return new Uint8Array([MAJOR_SIMPLE | SIMPLE_NULL]);
|
|
156
|
+
}
|
|
157
|
+
if (typeof value === 'boolean') {
|
|
158
|
+
return new Uint8Array([MAJOR_SIMPLE | (value ? SIMPLE_TRUE : SIMPLE_FALSE)]);
|
|
159
|
+
}
|
|
160
|
+
if (typeof value === 'number') {
|
|
161
|
+
return encodeNumber(value);
|
|
162
|
+
}
|
|
163
|
+
if (typeof value === 'string') {
|
|
164
|
+
return encodeString(value);
|
|
165
|
+
}
|
|
166
|
+
if (value instanceof Uint8Array) {
|
|
167
|
+
return encodeBytes(value);
|
|
168
|
+
}
|
|
169
|
+
if (Array.isArray(value)) {
|
|
170
|
+
return encodeArray(value);
|
|
171
|
+
}
|
|
172
|
+
if (typeof value === 'object') {
|
|
173
|
+
return encodeObject(value);
|
|
174
|
+
}
|
|
175
|
+
throw new TypeError(`CanonicalCbor: unsupported value type ${typeof value}`);
|
|
176
|
+
};
|
|
177
|
+
/** Canonical CBOR encoder namespace (ADR-0001 pattern). */
|
|
178
|
+
export const CanonicalCbor = { encode: _encode };
|
|
179
|
+
//# sourceMappingURL=cbor.js.map
|
package/dist/cbor.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cbor.js","sourceRoot":"","sources":["../src/cbor.ts"],"names":[],"mappings":"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"}
|
package/dist/cell.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell<T> -- writable reactive primitive.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Scope } from 'effect';
|
|
7
|
+
import { Effect, Stream, SubscriptionRef } from 'effect';
|
|
8
|
+
interface CellShape<T> {
|
|
9
|
+
readonly _tag: 'Cell';
|
|
10
|
+
readonly ref: SubscriptionRef.SubscriptionRef<T>;
|
|
11
|
+
readonly changes: Stream.Stream<T>;
|
|
12
|
+
readonly get: Effect.Effect<T>;
|
|
13
|
+
set(value: T): Effect.Effect<void>;
|
|
14
|
+
update(f: (current: T) => T): Effect.Effect<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Read all values from a tuple of cells, preserving the tuple type `T`.
|
|
18
|
+
*
|
|
19
|
+
* Sanctioned single cast site for Cell combinators. Two type-system gaps force
|
|
20
|
+
* this containment:
|
|
21
|
+
* 1. `tupleMap`'s callback signature collapses to `U = Effect<T[number]>`,
|
|
22
|
+
* losing the per-element `Effect<T[K]>` relationship.
|
|
23
|
+
* 2. `Effect.all`'s tuple overload returns a mapped-tuple result
|
|
24
|
+
* `{ -readonly [K in keyof ...]: _A }` that TypeScript cannot fold back
|
|
25
|
+
* to the input tuple type `T` (`T` could be instantiated with an
|
|
26
|
+
* arbitrary subtype per the structural contravariance rules).
|
|
27
|
+
*
|
|
28
|
+
* The runtime behavior is provably correct: `tupleMap` is total and order-
|
|
29
|
+
* preserving, `Effect.all` with an array input preserves positional order and
|
|
30
|
+
* arity, so the resulting values are `T` by construction.
|
|
31
|
+
*/
|
|
32
|
+
export declare const readAllCellValues: <T extends readonly unknown[]>(cells: { readonly [K in keyof T]: CellShape<T[K]>; }) => Effect.Effect<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Cell — mutable reactive primitive backed by `SubscriptionRef`.
|
|
35
|
+
* The workhorse of czap's reactive graph: `get` for a snapshot, `set` to
|
|
36
|
+
* push, `changes` for the stream of subsequent values.
|
|
37
|
+
*/
|
|
38
|
+
export declare const Cell: {
|
|
39
|
+
/** Build a cell with an initial value. */
|
|
40
|
+
make: <T>(initial: T) => Effect.Effect<CellShape<T>>;
|
|
41
|
+
/** Seed a cell with an initial value and mirror every stream emission into it. */
|
|
42
|
+
fromStream: <T>(initial: T, source: Stream.Stream<T>) => Effect.Effect<CellShape<T>, never, Scope.Scope>;
|
|
43
|
+
/** Tuple-combine cells into a single cell of their current values. */
|
|
44
|
+
all: <const T extends readonly unknown[]>(cells: { readonly [K in keyof T]: CellShape<T[K]>; }) => Effect.Effect<CellShape<T>, never, Scope.Scope>;
|
|
45
|
+
/** Scoped `map` — derive a new cell by applying `fn` to every emission. */
|
|
46
|
+
map: <T, U>(cell: CellShape<T>, fn: (value: T) => U) => Effect.Effect<CellShape<U>, never, Scope.Scope>;
|
|
47
|
+
};
|
|
48
|
+
export declare namespace Cell {
|
|
49
|
+
/** Structural shape of a {@link Cell}: `_tag`, `get`, `set`, `changes`. */
|
|
50
|
+
type Shape<T> = CellShape<T>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=cell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAa,MAAM,QAAQ,CAAC;AAGpE,UAAU,SAAS,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACnD;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,SAAS,OAAO,EAAE,EAC5D,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,KAClD,MAAM,CAAC,MAAM,CAAC,CAAC,CAGjB,CAAC;AA+CF;;;;GAIG;AACH,eAAO,MAAM,IAAI;IACf,0CAA0C;WAjG7B,CAAC,WAAW,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAmGxD,kFAAkF;iBArF/D,CAAC,WAAW,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAuF5G,sEAAsE;gBAvDpD,CAAC,SAAS,SAAS,OAAO,EAAE,SACvC,EAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,KAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAuDhD,2EAA2E;UAvB/D,CAAC,EAAE,CAAC,QAAQ,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;CAyB5G,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,2EAA2E;IAC3E,KAAY,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;CACrC"}
|
package/dist/cell.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cell<T> -- writable reactive primitive.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Effect, Stream, SubscriptionRef, Semaphore } from 'effect';
|
|
7
|
+
import { tupleMap } from './tuple.js';
|
|
8
|
+
const _make = (initial) => Effect.gen(function* () {
|
|
9
|
+
const ref = yield* SubscriptionRef.make(initial);
|
|
10
|
+
return {
|
|
11
|
+
_tag: 'Cell',
|
|
12
|
+
ref,
|
|
13
|
+
changes: SubscriptionRef.changes(ref),
|
|
14
|
+
get: SubscriptionRef.get(ref),
|
|
15
|
+
set: (value) => SubscriptionRef.set(ref, value),
|
|
16
|
+
update: (f) => SubscriptionRef.update(ref, f),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
const _fromStream = (initial, source) => Effect.gen(function* () {
|
|
20
|
+
const cell = yield* _make(initial);
|
|
21
|
+
yield* Effect.forkScoped(Stream.runForEach(source, (value) => cell.set(value)));
|
|
22
|
+
return cell;
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Read all values from a tuple of cells, preserving the tuple type `T`.
|
|
26
|
+
*
|
|
27
|
+
* Sanctioned single cast site for Cell combinators. Two type-system gaps force
|
|
28
|
+
* this containment:
|
|
29
|
+
* 1. `tupleMap`'s callback signature collapses to `U = Effect<T[number]>`,
|
|
30
|
+
* losing the per-element `Effect<T[K]>` relationship.
|
|
31
|
+
* 2. `Effect.all`'s tuple overload returns a mapped-tuple result
|
|
32
|
+
* `{ -readonly [K in keyof ...]: _A }` that TypeScript cannot fold back
|
|
33
|
+
* to the input tuple type `T` (`T` could be instantiated with an
|
|
34
|
+
* arbitrary subtype per the structural contravariance rules).
|
|
35
|
+
*
|
|
36
|
+
* The runtime behavior is provably correct: `tupleMap` is total and order-
|
|
37
|
+
* preserving, `Effect.all` with an array input preserves positional order and
|
|
38
|
+
* arity, so the resulting values are `T` by construction.
|
|
39
|
+
*/
|
|
40
|
+
export const readAllCellValues = (cells) => {
|
|
41
|
+
const gets = tupleMap(cells, (cell) => cell.get);
|
|
42
|
+
return Effect.all(gets, { concurrency: 'unbounded' });
|
|
43
|
+
};
|
|
44
|
+
const _all = (cells) => {
|
|
45
|
+
const readAll = readAllCellValues(cells);
|
|
46
|
+
return Effect.gen(function* () {
|
|
47
|
+
const values = yield* readAll;
|
|
48
|
+
const combined = yield* _make(values);
|
|
49
|
+
const sem = Semaphore.makeUnsafe(1);
|
|
50
|
+
yield* Effect.forkScoped(Effect.gen(function* () {
|
|
51
|
+
const changeStreams = tupleMap(cells, (cell) => cell.changes);
|
|
52
|
+
const updates = changeStreams.map((changes) => Stream.runForEach(changes, () => Semaphore.withPermits(sem, 1)(Effect.gen(function* () {
|
|
53
|
+
const newValues = yield* readAll;
|
|
54
|
+
yield* combined.set(newValues);
|
|
55
|
+
}))));
|
|
56
|
+
yield* Effect.all(updates, { concurrency: 'unbounded' });
|
|
57
|
+
}));
|
|
58
|
+
return combined;
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const _map = (cell, fn) => Effect.gen(function* () {
|
|
62
|
+
const initialValue = yield* cell.get;
|
|
63
|
+
const mappedInitial = fn(initialValue);
|
|
64
|
+
const mapped = yield* _make(mappedInitial);
|
|
65
|
+
yield* Effect.forkScoped(Stream.runForEach(cell.changes, (value) => mapped.set(fn(value))));
|
|
66
|
+
return mapped;
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Cell — mutable reactive primitive backed by `SubscriptionRef`.
|
|
70
|
+
* The workhorse of czap's reactive graph: `get` for a snapshot, `set` to
|
|
71
|
+
* push, `changes` for the stream of subsequent values.
|
|
72
|
+
*/
|
|
73
|
+
export const Cell = {
|
|
74
|
+
/** Build a cell with an initial value. */
|
|
75
|
+
make: _make,
|
|
76
|
+
/** Seed a cell with an initial value and mirror every stream emission into it. */
|
|
77
|
+
fromStream: _fromStream,
|
|
78
|
+
/** Tuple-combine cells into a single cell of their current values. */
|
|
79
|
+
all: _all,
|
|
80
|
+
/** Scoped `map` — derive a new cell by applying `fn` to every emission. */
|
|
81
|
+
map: _map,
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=cell.js.map
|
package/dist/cell.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cell.js","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"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"}
|
package/dist/codec.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec -- Effect Schema codec builder.
|
|
3
|
+
*
|
|
4
|
+
* Wraps Effect Schema into a typed codec with encode/decode methods.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { Effect } from 'effect';
|
|
9
|
+
import { Schema } from 'effect';
|
|
10
|
+
interface CodecShape<A, I = A> {
|
|
11
|
+
readonly schema: Schema.Codec<A, I>;
|
|
12
|
+
encode(value: A): Effect.Effect<I, Schema.SchemaError>;
|
|
13
|
+
decode(input: I): Effect.Effect<A, Schema.SchemaError>;
|
|
14
|
+
}
|
|
15
|
+
declare function _make<A, I>(schema: Schema.Codec<A, I>): CodecShape<A, I>;
|
|
16
|
+
/**
|
|
17
|
+
* Codec — typed encode/decode wrapper over `effect`'s `Schema.Codec`.
|
|
18
|
+
* Gives a single call site for schema-driven validation so consumers don't
|
|
19
|
+
* import `Schema.encodeEffect`/`decodeEffect` directly.
|
|
20
|
+
*/
|
|
21
|
+
export declare const Codec: {
|
|
22
|
+
/** Wrap a `Schema.Codec` in the {@link Codec.Shape} facade. */
|
|
23
|
+
make: typeof _make;
|
|
24
|
+
};
|
|
25
|
+
export declare namespace Codec {
|
|
26
|
+
/** Structural shape of a codec: underlying schema plus `encode` / `decode` Effects. */
|
|
27
|
+
type Shape<A, I = A> = CodecShape<A, I>;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,UAAU,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;CACxD;AAED,iBAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAMjE;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK;IAChB,+DAA+D;;CAEhE,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,uFAAuF;IACvF,KAAY,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAChD"}
|
package/dist/codec.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec -- Effect Schema codec builder.
|
|
3
|
+
*
|
|
4
|
+
* Wraps Effect Schema into a typed codec with encode/decode methods.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { Schema } from 'effect';
|
|
9
|
+
function _make(schema) {
|
|
10
|
+
return {
|
|
11
|
+
schema,
|
|
12
|
+
encode: (value) => Schema.encodeEffect(schema)(value),
|
|
13
|
+
decode: (input) => Schema.decodeEffect(schema)(input),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Codec — typed encode/decode wrapper over `effect`'s `Schema.Codec`.
|
|
18
|
+
* Gives a single call site for schema-driven validation so consumers don't
|
|
19
|
+
* import `Schema.encodeEffect`/`decodeEffect` directly.
|
|
20
|
+
*/
|
|
21
|
+
export const Codec = {
|
|
22
|
+
/** Wrap a `Schema.Codec` in the {@link Codec.Shape} facade. */
|
|
23
|
+
make: _make,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAQhC,SAAS,KAAK,CAAO,MAA0B;IAC7C,OAAO;QACL,MAAM;QACN,MAAM,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;QACxD,MAAM,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;KACzD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,+DAA+D;IAC/D,IAAI,EAAE,KAAK;CACZ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ComponentDef -- adaptive component primitive for constraint-based rendering.
|
|
3
|
+
*
|
|
4
|
+
* A component binds a boundary, styles, and named slots into a single
|
|
5
|
+
* content-addressed unit. Content-addressed via FNV-1a.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { ContentAddress } from './brands.js';
|
|
10
|
+
import type { Boundary } from './boundary.js';
|
|
11
|
+
import type { Style } from './style.js';
|
|
12
|
+
/** Per-slot configuration on a component — whether the slot must be provided, plus optional description. */
|
|
13
|
+
export interface SlotConfig {
|
|
14
|
+
readonly required: boolean;
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
}
|
|
17
|
+
interface ComponentDef<B extends Boundary.Shape = Boundary.Shape, SlotNames extends readonly string[] = readonly string[]> {
|
|
18
|
+
readonly _tag: 'ComponentDef';
|
|
19
|
+
readonly _version: 1;
|
|
20
|
+
readonly id: ContentAddress;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly boundary?: B;
|
|
23
|
+
readonly styles: Style.Shape<B>;
|
|
24
|
+
readonly slots: {
|
|
25
|
+
readonly [K in SlotNames[number]]: SlotConfig;
|
|
26
|
+
};
|
|
27
|
+
readonly defaultSlot?: SlotNames[number];
|
|
28
|
+
}
|
|
29
|
+
interface ComponentFactory {
|
|
30
|
+
make<B extends Boundary.Shape, const SN extends readonly [string, ...string[]]>(config: {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly boundary?: B;
|
|
33
|
+
readonly styles: Style.Shape<B>;
|
|
34
|
+
readonly slots: {
|
|
35
|
+
readonly [K in SN[number]]: SlotConfig;
|
|
36
|
+
};
|
|
37
|
+
readonly defaultSlot?: SN[number];
|
|
38
|
+
}): ComponentDef<B, SN>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Component — the content-addressed unit that binds a {@link Boundary}, a
|
|
42
|
+
* {@link Style}, and named slots into a single declaration compilers can
|
|
43
|
+
* target. The optional boundary gates style variants; the slots describe
|
|
44
|
+
* the consumer-facing API.
|
|
45
|
+
*/
|
|
46
|
+
export declare const Component: ComponentFactory;
|
|
47
|
+
export declare namespace Component {
|
|
48
|
+
/** Structural shape of a component definition, parameterized by its boundary and slot names. */
|
|
49
|
+
type Shape<B extends Boundary.Shape = Boundary.Shape, SN extends readonly string[] = readonly string[]> = ComponentDef<B, SN>;
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,4GAA4G;AAC5G,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,YAAY,CACpB,CAAC,SAAS,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EACzC,SAAS,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAEvD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU;KAAE,CAAC;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE;QACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,UAAU;SAAE,CAAC;QAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;KACnC,GAAG,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACzB;AAsBD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,gBAsBvB,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,gGAAgG;IAChG,KAAY,KAAK,CACf,CAAC,SAAS,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EACzC,EAAE,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,IAC9C,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACzB"}
|