@lovelace_lol/polyester is the ClojureScript worker-backed character-runtime
package for Character Loom agency experiments.
Polyester starts as a fork of Latticework's CLJS staging work. Its purpose is to
let LoomLarge A/B test the CLJS runtime separately from the existing
@lovelace_lol/latticework TypeScript package while preserving compatible agency
contracts where practical.
- Package:
@lovelace_lol/polyester - Repo:
meekmachine/Polyester - Source fork:
meekmachine/Latticework - Initial scope: CLJS npm exports and CLJS worker exports from the Latticework CLJS staging branch
npm install @lovelace_lol/polyesterthree is an optional peer dependency. Install it in consumers that use
main-thread animation or runtime surfaces backed by Three.js.
npm install threeThe CLJS npm bundle is exposed through ./cljs.
import {
createAnimationAgency,
createBlinkAgency,
createEyeHeadTrackingAgency,
createGazeAgency,
createHairAgency,
createLipSyncAgency,
createProsodicAgency,
createTranscriptionAgency,
createTTSAgency,
createConversationAgency,
createVocalAgency,
} from '@lovelace_lol/polyester/cljs';The CLJS worker bundle is exposed through ./cljs-worker.
const worker = new Worker(
new URL('@lovelace_lol/polyester/cljs-worker', import.meta.url),
{ type: 'module' },
);The current root export still mirrors the inherited Latticework TypeScript surface while the split is being validated. The long-term direction is for Polyester to become the CLJS-first agency package and for Latticework to remain the stable TypeScript package until the migration is complete.
- Animation boundary
- Blink
- Gaze
- Eye/head tracking facade
- Hair
- Lipsync
- Prosodic speech gestures
- TTS planning and Azure timing normalization
- Transcription state and interruption detection
- Conversation turn orchestration
- Vocal timeline planning
Remaining transition work is tracked from the Latticework umbrella issue: deeper agency parity, worker integration hardening, and an EmotionExpression agency scaffold.
See Polyester CLJS Transition Architecture for the detailed current-state inventory, recent CLJS PR summary, remaining TypeScript compatibility surfaces, and the next runtime stream/Effect boundary work.
Polyester is intended to be tested from LoomLarge without committing temporary dependency churn.
Supported paths:
- install a Polyester PR SHA in CI/previews
- install a published
@lovelace_lol/polyesterversion - use npm aliasing if LoomLarge needs to test Polyester behind the existing
@lovelace_lol/latticeworkdependency name
Example npm alias:
{
"dependencies": {
"@lovelace_lol/latticework": "npm:@lovelace_lol/polyester@latest"
}
}npm ci
npm run build
npm run typecheck
npm test
npm run test:cljsThe build emits:
- TypeScript ESM/CJS bundles through
tsup - CLJS npm ESM bundle through
shadow-cljs - CLJS browser worker bundle through
shadow-cljs - declaration files for root and CLJS imports
Publishing mirrors the Latticework tag/release flow. The checked-in
package.json version is a baseline only; the publish workflow resolves the
actual release version from an existing vX.Y.Z tag or from the latest npm
version, then bumps the patch version in the CI workspace before publishing.
- Open a PR against
main. - PR checks run build, typecheck, and tests.
- Merge to
main. - The
Publish Polyester to NPMworkflow determines the next patch version, creates or reuses a release tag, builds, tests, and publishes if that npm version does not already exist. - Verify the published package.
npm view @lovelace_lol/polyester version gitHead --jsonThe workflow expects the GitHub npm environment to provide:
NPM_KEYfor npm authenticationPUBLISH_PUSH_TOKENfor pushing release tags
Internal namespaces still use the inherited Latticework naming in this initial fork. That keeps the first repository split small and verifiable. A later cleanup can rename internals once package publishing and LoomLarge A/B testing are working.