diff --git a/.gitignore b/.gitignore index a66cfb0534..8b8cb4a59f 100644 --- a/.gitignore +++ b/.gitignore @@ -579,12 +579,12 @@ tmp/nopaint-sheets/ # agent/PR worktree scratch (client work checked out beside the repo) /.tmp-pr*/ -# Built by `node easel/bin/pack.mjs` from easel/ — derived, not source. +# Built by `node aesel/bin/pack.mjs` from aesel/ — derived, not source. system/public/easel.tar.gz # Written beside a real install by the updater; a checkout never makes one. -easel/.update-check.json -easel/install.json +aesel/.update-check.json +aesel/install.json # Max-level sidecars Caddy serves as `precompressed` (xbox/tools/precompress-live.sh) xbox/live/*.br @@ -593,7 +593,7 @@ xbox/live/*.zst # Slab solo release artifacts (signed DMGs + staging) slab/menubar-swift/dist/ -# local backup copies and easel media scratch +# local backup copies and aesel media scratch *.pre-trio *.pre-femrag *.before-*-20[0-9][0-9]* diff --git a/CLAUDE.md b/CLAUDE.md index c1e32f74e7..99b6e8d178 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -164,7 +164,7 @@ Pieces are URL-addressable: `aesthetic.computer/piece-name`, params `piece-name: - `kidlisp/` - KidLisp docs and tools - `spec/` - Jasmine tests for KidLisp - `ants/` - AestheticAnts automated maintenance -- `easel/` - Easel, the terminal coding interface (`ac`); `cd easel && ./install.sh` +- `aesel/` - Aesel, the terminal coding harness (`a`, `ac`); `cd aesel && ./install.sh` ## Notes diff --git a/easel/.gitignore b/aesel/.gitignore similarity index 100% rename from easel/.gitignore rename to aesel/.gitignore diff --git a/easel/CREDITS.md b/aesel/CREDITS.md similarity index 97% rename from easel/CREDITS.md rename to aesel/CREDITS.md index b7037c44a1..3043a44725 100644 --- a/easel/CREDITS.md +++ b/aesel/CREDITS.md @@ -31,7 +31,7 @@ spent refunds become wallet debt. No card data or Stripe keys enter the renderer Production configuration: `AC_CREDITS_CHECKOUT_ENABLED=true` and a dedicated `STRIPE_AC_CREDITS_WEBHOOK_SECRET`, plus the existing Stripe private key. Provision -once with `easel/scripts/provision-credits.mjs` on Lith. This registers completed, +once with `aesel/scripts/provision-credits.mjs` on Lith. This registers completed, async-success, and refund events and writes a private systemd environment file. Re-deploys preserve that environment file. Existing `luna-1m-v1` checkout IDs remain valid and grant the same quantity of shared braincells. @@ -47,5 +47,5 @@ reservation in `ac-credit-wallets.holds`; reconcile those against provider usage before returning credit. Disputes require operator review. -The native app uses `apple/aesel` and the notebook renderer in `easel/shared`. +The native app uses `apple/aesel` and the notebook renderer in `aesel/shared`. The retired Electron update and development-overlay paths are no longer supported. diff --git a/easel/LICENSE b/aesel/LICENSE similarity index 100% rename from easel/LICENSE rename to aesel/LICENSE diff --git a/easel/README.md b/aesel/README.md similarity index 99% rename from easel/README.md rename to aesel/README.md index 7d5a28ef97..fac60327dc 100644 --- a/easel/README.md +++ b/aesel/README.md @@ -11,7 +11,7 @@ Both interfaces require a verified Aesthetic Computer login and an @handle, including pro/private mode and Claude/Codex providers. The Electron GUI is retired. Its shell, installers, updater and release scripts -have been removed; shared native notebook resources now live in `easel/shared/`. +have been removed; shared native notebook resources now live in `aesel/shared/`. The native app uses its own saved threads and does not accept TUI workspace flags. ```sh @@ -266,7 +266,7 @@ shows the terminal where the card is. shot to a padded crop, so the menu bar an overlay is said to be flush against is in the same picture. -`easel/bin/design-loop.mjs` is the whole cycle in one command: close the Aesel +`aesel/bin/design-loop.mjs` is the whole cycle in one command: close the Aesel session, open a fresh one, wait for its overlays to land, photograph them. Fresh because overlays are placed once, when a window appears — editing the placement and reinstalling the menubar does not move what is already on screen, diff --git a/easel/SCORE.md b/aesel/SCORE.md similarity index 100% rename from easel/SCORE.md rename to aesel/SCORE.md diff --git a/easel/art/aesel/README.md b/aesel/art/aesel/README.md similarity index 100% rename from easel/art/aesel/README.md rename to aesel/art/aesel/README.md diff --git a/easel/art/aesel/actions/easel-donkey-actions-1.png b/aesel/art/aesel/actions/easel-donkey-actions-1.png similarity index 100% rename from easel/art/aesel/actions/easel-donkey-actions-1.png rename to aesel/art/aesel/actions/easel-donkey-actions-1.png diff --git a/easel/art/aesel/actions/easel-donkey-actions-2.png b/aesel/art/aesel/actions/easel-donkey-actions-2.png similarity index 100% rename from easel/art/aesel/actions/easel-donkey-actions-2.png rename to aesel/art/aesel/actions/easel-donkey-actions-2.png diff --git a/easel/art/aesel/actions/easel-donkey-actions-3.png b/aesel/art/aesel/actions/easel-donkey-actions-3.png similarity index 100% rename from easel/art/aesel/actions/easel-donkey-actions-3.png rename to aesel/art/aesel/actions/easel-donkey-actions-3.png diff --git a/easel/art/aesel/actions/easel-donkey-actions-4.png b/aesel/art/aesel/actions/easel-donkey-actions-4.png similarity index 100% rename from easel/art/aesel/actions/easel-donkey-actions-4.png rename to aesel/art/aesel/actions/easel-donkey-actions-4.png diff --git a/easel/art/aesel/actions/index.html b/aesel/art/aesel/actions/index.html similarity index 100% rename from easel/art/aesel/actions/index.html rename to aesel/art/aesel/actions/index.html diff --git a/easel/art/aesel/compile.mjs b/aesel/art/aesel/compile.mjs similarity index 100% rename from easel/art/aesel/compile.mjs rename to aesel/art/aesel/compile.mjs diff --git a/easel/art/aesel/generate.mjs b/aesel/art/aesel/generate.mjs similarity index 100% rename from easel/art/aesel/generate.mjs rename to aesel/art/aesel/generate.mjs diff --git a/easel/art/aesel/prompt.txt b/aesel/art/aesel/prompt.txt similarity index 100% rename from easel/art/aesel/prompt.txt rename to aesel/art/aesel/prompt.txt diff --git a/easel/art/aesel/sheet-source.png b/aesel/art/aesel/sheet-source.png similarity index 100% rename from easel/art/aesel/sheet-source.png rename to aesel/art/aesel/sheet-source.png diff --git a/easel/art/aesel/sheet-source.png.illy.json b/aesel/art/aesel/sheet-source.png.illy.json similarity index 100% rename from easel/art/aesel/sheet-source.png.illy.json rename to aesel/art/aesel/sheet-source.png.illy.json diff --git a/easel/art/aesel/sheet-source.png.queue.json b/aesel/art/aesel/sheet-source.png.queue.json similarity index 100% rename from easel/art/aesel/sheet-source.png.queue.json rename to aesel/art/aesel/sheet-source.png.queue.json diff --git a/easel/art/donkey-3d/README.md b/aesel/art/donkey-3d/README.md similarity index 100% rename from easel/art/donkey-3d/README.md rename to aesel/art/donkey-3d/README.md diff --git a/easel/art/donkey-3d/generate-model.mjs b/aesel/art/donkey-3d/generate-model.mjs similarity index 100% rename from easel/art/donkey-3d/generate-model.mjs rename to aesel/art/donkey-3d/generate-model.mjs diff --git a/easel/art/donkey-3d/inspect-model.py b/aesel/art/donkey-3d/inspect-model.py similarity index 100% rename from easel/art/donkey-3d/inspect-model.py rename to aesel/art/donkey-3d/inspect-model.py diff --git a/easel/art/donkey-3d/queue.json b/aesel/art/donkey-3d/queue.json similarity index 100% rename from easel/art/donkey-3d/queue.json rename to aesel/art/donkey-3d/queue.json diff --git a/easel/art/donkey-3d/reference-plan.json b/aesel/art/donkey-3d/reference-plan.json similarity index 95% rename from easel/art/donkey-3d/reference-plan.json rename to aesel/art/donkey-3d/reference-plan.json index be21d601bb..aac7fec764 100644 --- a/easel/art/donkey-3d/reference-plan.json +++ b/aesel/art/donkey-3d/reference-plan.json @@ -2,16 +2,16 @@ "pipeline": "marketing", "pipelineFile": null, "description": "Campaign illy: cover-prompt.txt + refs/ -> gens/.png", - "targetDir": "/Users/jas/aesthetic-computer/easel/art/donkey-3d", + "targetDir": "/Users/jas/aesthetic-computer/aesel/art/donkey-3d", "creativePrompt": "Create one clean modeling reference of the SAME donkey depicted in the attached Aesel animation sheet. The sheet shows multiple moments of one donkey; output exactly one donkey, not a sheet or multiple views.\n\nPreserve the distinctive blue-gray pencil fur, cream muzzle and belly, expressive dark eyes, oversized upright ears with pale inner ears, short dark spiky mane, dark hooves, and dark tufted tail. Preserve the friendly natural donkey proportions. Keep visible colored-pencil strokes as the surface texture, while clarifying a fully volumetric body rather than a flat cutout.\n\nAdd the donkey's defining red reading glasses: small recognizable bright-red frames sitting low on the muzzle, expressive eyes clearly visible above the upper rims. The bridge rests plausibly on the muzzle, and slender curved temples reach toward stable support at the ear bases. Clear lenses, no opaque sunglasses. The glasses are a permanent part of this character's identity. Keep the frames distinct from the face, with simple clean geometry suitable for later separation as an accessory; do not fuse them into fur or hide the eyes.\n\nFull-body three-quarter side view with the head facing right, camera at shoulder height. Neutral quadruped bind pose, standing on all four hooves, legs straight but not locked, all four legs separately readable with air gaps between them. Ears separated, tail gently extended away from hind legs. No saddle, clothing, other props, pedestal, labels, borders, text, or extra limbs. Plain warm-white background, even diffuse light, minimal contact shadow beneath the hooves. Center the complete donkey including ear tips and tail with generous margin.\n\nThis is a rigging reference: preserve correct equine knees/hocks and a balanced weight-bearing stance. Do not make a biped or a toy with fused legs. No running pose or motion blur.", "prompt": "Create one clean modeling reference of the SAME donkey depicted in the attached Aesel animation sheet. The sheet shows multiple moments of one donkey; output exactly one donkey, not a sheet or multiple views.\n\nPreserve the distinctive blue-gray pencil fur, cream muzzle and belly, expressive dark eyes, oversized upright ears with pale inner ears, short dark spiky mane, dark hooves, and dark tufted tail. Preserve the friendly natural donkey proportions. Keep visible colored-pencil strokes as the surface texture, while clarifying a fully volumetric body rather than a flat cutout.\n\nAdd the donkey's defining red reading glasses: small recognizable bright-red frames sitting low on the muzzle, expressive eyes clearly visible above the upper rims. The bridge rests plausibly on the muzzle, and slender curved temples reach toward stable support at the ear bases. Clear lenses, no opaque sunglasses. The glasses are a permanent part of this character's identity. Keep the frames distinct from the face, with simple clean geometry suitable for later separation as an accessory; do not fuse them into fur or hide the eyes.\n\nFull-body three-quarter side view with the head facing right, camera at shoulder height. Neutral quadruped bind pose, standing on all four hooves, legs straight but not locked, all four legs separately readable with air gaps between them. Ears separated, tail gently extended away from hind legs. No saddle, clothing, other props, pedestal, labels, borders, text, or extra limbs. Plain warm-white background, even diffuse light, minimal contact shadow beneath the hooves. Center the complete donkey including ear tips and tail with generous margin.\n\nThis is a rigging reference: preserve correct equine knees/hocks and a balanced weight-bearing stance. Do not make a biped or a toy with fused legs. No running pose or motion blur.\n\nPHYSICAL ACCURACY CONTRACT — REQUIRED, NOT OPTIONAL.\nRender one coherent physical state. Preserve exact object and character counts, identities, topology, and scale; no duplicates, fusions, substitutions, or parts appearing twice.\nMake every support and contact legible: feet bear weight on the stated surface, wheels meet the ground, hands close around held objects, mounted objects remain attached at their brackets, and contact shadows agree with those connections.\nRespect gravity, inertia, balance, joint limits, load paths, and plausible weight distribution. Limbs bend correctly; grips, stance, and object orientation must be mechanically usable.\nKeep camera geometry physically coherent. A first-person camera cannot also show its owner's face or body except the explicitly visible near limbs; reflections and occlusion must agree with the viewpoint.\nIf the prompt names motion, depict exactly one named instant with a readable cause, current action, and supported body state. Do not collapse before, impact, and aftermath into one contradictory tableau.\nDo not use blur, cropping, darkness, particles, or spectacle to hide uncertain anatomy, contact, or mechanics. Reject the image if the action only works because the relevant connection is obscured.", - "promptPath": "/Users/jas/aesthetic-computer/easel/art/donkey-3d/reference-prompt.txt", + "promptPath": "/Users/jas/aesthetic-computer/aesel/art/donkey-3d/reference-prompt.txt", "contracts": [ "physical-accuracy" ], "promptHash": "6c94d93260e9d8013368d5542a0a692a8c5649c0a31f5c076d622f2e44298aaa", "refs": [ - "/Users/jas/aesthetic-computer/easel/shared/assets/donkey-pencil-run-v2.png" + "/Users/jas/aesthetic-computer/aesel/shared/assets/donkey-pencil-run-v2.png" ], "mode": "edit", "provider": "fal", @@ -20,7 +20,7 @@ "quality": "high", "slug": "donkey-3d", "variant": "v1", - "output": "/Users/jas/aesthetic-computer/easel/art/donkey-3d/reference.png", + "output": "/Users/jas/aesthetic-computer/aesel/art/donkey-3d/reference.png", "stages": [ "resolve-inputs", "apply-contracts", diff --git a/easel/art/donkey-3d/reference-prompt.txt b/aesel/art/donkey-3d/reference-prompt.txt similarity index 100% rename from easel/art/donkey-3d/reference-prompt.txt rename to aesel/art/donkey-3d/reference-prompt.txt diff --git a/easel/art/donkey-3d/reference-queue.json b/aesel/art/donkey-3d/reference-queue.json similarity index 100% rename from easel/art/donkey-3d/reference-queue.json rename to aesel/art/donkey-3d/reference-queue.json diff --git a/easel/art/donkey-3d/reference-result.json b/aesel/art/donkey-3d/reference-result.json similarity index 100% rename from easel/art/donkey-3d/reference-result.json rename to aesel/art/donkey-3d/reference-result.json diff --git a/easel/art/donkey-3d/reference.png b/aesel/art/donkey-3d/reference.png similarity index 100% rename from easel/art/donkey-3d/reference.png rename to aesel/art/donkey-3d/reference.png diff --git a/easel/art/donkey-3d/reference.png.illy.json b/aesel/art/donkey-3d/reference.png.illy.json similarity index 96% rename from easel/art/donkey-3d/reference.png.illy.json rename to aesel/art/donkey-3d/reference.png.illy.json index 815e558058..209681e981 100644 --- a/easel/art/donkey-3d/reference.png.illy.json +++ b/aesel/art/donkey-3d/reference.png.illy.json @@ -2,16 +2,16 @@ "pipeline": "marketing", "pipelineFile": null, "description": "Campaign illy: cover-prompt.txt + refs/ -> gens/.png", - "targetDir": "/Users/jas/aesthetic-computer/easel/art/donkey-3d", + "targetDir": "/Users/jas/aesthetic-computer/aesel/art/donkey-3d", "creativePrompt": "Create one clean modeling reference of the SAME donkey depicted in the attached Aesel animation sheet. The sheet shows multiple moments of one donkey; output exactly one donkey, not a sheet or multiple views.\n\nPreserve the distinctive blue-gray pencil fur, cream muzzle and belly, expressive dark eyes, oversized upright ears with pale inner ears, short dark spiky mane, dark hooves, and dark tufted tail. Preserve the friendly natural donkey proportions. Keep visible colored-pencil strokes as the surface texture, while clarifying a fully volumetric body rather than a flat cutout.\n\nAdd the donkey's defining red reading glasses: small recognizable bright-red frames sitting low on the muzzle, expressive eyes clearly visible above the upper rims. The bridge rests plausibly on the muzzle, and slender curved temples reach toward stable support at the ear bases. Clear lenses, no opaque sunglasses. The glasses are a permanent part of this character's identity. Keep the frames distinct from the face, with simple clean geometry suitable for later separation as an accessory; do not fuse them into fur or hide the eyes.\n\nFull-body three-quarter side view with the head facing right, camera at shoulder height. Neutral quadruped bind pose, standing on all four hooves, legs straight but not locked, all four legs separately readable with air gaps between them. Ears separated, tail gently extended away from hind legs. No saddle, clothing, other props, pedestal, labels, borders, text, or extra limbs. Plain warm-white background, even diffuse light, minimal contact shadow beneath the hooves. Center the complete donkey including ear tips and tail with generous margin.\n\nThis is a rigging reference: preserve correct equine knees/hocks and a balanced weight-bearing stance. Do not make a biped or a toy with fused legs. No running pose or motion blur.", "prompt": "Create one clean modeling reference of the SAME donkey depicted in the attached Aesel animation sheet. The sheet shows multiple moments of one donkey; output exactly one donkey, not a sheet or multiple views.\n\nPreserve the distinctive blue-gray pencil fur, cream muzzle and belly, expressive dark eyes, oversized upright ears with pale inner ears, short dark spiky mane, dark hooves, and dark tufted tail. Preserve the friendly natural donkey proportions. Keep visible colored-pencil strokes as the surface texture, while clarifying a fully volumetric body rather than a flat cutout.\n\nAdd the donkey's defining red reading glasses: small recognizable bright-red frames sitting low on the muzzle, expressive eyes clearly visible above the upper rims. The bridge rests plausibly on the muzzle, and slender curved temples reach toward stable support at the ear bases. Clear lenses, no opaque sunglasses. The glasses are a permanent part of this character's identity. Keep the frames distinct from the face, with simple clean geometry suitable for later separation as an accessory; do not fuse them into fur or hide the eyes.\n\nFull-body three-quarter side view with the head facing right, camera at shoulder height. Neutral quadruped bind pose, standing on all four hooves, legs straight but not locked, all four legs separately readable with air gaps between them. Ears separated, tail gently extended away from hind legs. No saddle, clothing, other props, pedestal, labels, borders, text, or extra limbs. Plain warm-white background, even diffuse light, minimal contact shadow beneath the hooves. Center the complete donkey including ear tips and tail with generous margin.\n\nThis is a rigging reference: preserve correct equine knees/hocks and a balanced weight-bearing stance. Do not make a biped or a toy with fused legs. No running pose or motion blur.\n\nPHYSICAL ACCURACY CONTRACT — REQUIRED, NOT OPTIONAL.\nRender one coherent physical state. Preserve exact object and character counts, identities, topology, and scale; no duplicates, fusions, substitutions, or parts appearing twice.\nMake every support and contact legible: feet bear weight on the stated surface, wheels meet the ground, hands close around held objects, mounted objects remain attached at their brackets, and contact shadows agree with those connections.\nRespect gravity, inertia, balance, joint limits, load paths, and plausible weight distribution. Limbs bend correctly; grips, stance, and object orientation must be mechanically usable.\nKeep camera geometry physically coherent. A first-person camera cannot also show its owner's face or body except the explicitly visible near limbs; reflections and occlusion must agree with the viewpoint.\nIf the prompt names motion, depict exactly one named instant with a readable cause, current action, and supported body state. Do not collapse before, impact, and aftermath into one contradictory tableau.\nDo not use blur, cropping, darkness, particles, or spectacle to hide uncertain anatomy, contact, or mechanics. Reject the image if the action only works because the relevant connection is obscured.", - "promptPath": "/Users/jas/aesthetic-computer/easel/art/donkey-3d/reference-prompt.txt", + "promptPath": "/Users/jas/aesthetic-computer/aesel/art/donkey-3d/reference-prompt.txt", "contracts": [ "physical-accuracy" ], "promptHash": "6c94d93260e9d8013368d5542a0a692a8c5649c0a31f5c076d622f2e44298aaa", "refs": [ - "/Users/jas/aesthetic-computer/easel/shared/assets/donkey-pencil-run-v2.png" + "/Users/jas/aesthetic-computer/aesel/shared/assets/donkey-pencil-run-v2.png" ], "mode": "edit", "provider": "fal", diff --git a/easel/art/donkey-character.md b/aesel/art/donkey-character.md similarity index 100% rename from easel/art/donkey-character.md rename to aesel/art/donkey-character.md diff --git a/easel/art/donkey-run-v2/README.md b/aesel/art/donkey-run-v2/README.md similarity index 100% rename from easel/art/donkey-run-v2/README.md rename to aesel/art/donkey-run-v2/README.md diff --git a/easel/art/donkey-run-v2/generate-fal.mjs b/aesel/art/donkey-run-v2/generate-fal.mjs similarity index 100% rename from easel/art/donkey-run-v2/generate-fal.mjs rename to aesel/art/donkey-run-v2/generate-fal.mjs diff --git a/easel/art/donkey-run-v2/prompt.txt b/aesel/art/donkey-run-v2/prompt.txt similarity index 100% rename from easel/art/donkey-run-v2/prompt.txt rename to aesel/art/donkey-run-v2/prompt.txt diff --git a/easel/art/donkey-run-v2/provenance.json b/aesel/art/donkey-run-v2/provenance.json similarity index 100% rename from easel/art/donkey-run-v2/provenance.json rename to aesel/art/donkey-run-v2/provenance.json diff --git a/easel/art/donkey-run-v2/sheet.png b/aesel/art/donkey-run-v2/sheet.png similarity index 100% rename from easel/art/donkey-run-v2/sheet.png rename to aesel/art/donkey-run-v2/sheet.png diff --git a/easel/art/donkey-thinking/README.md b/aesel/art/donkey-thinking/README.md similarity index 100% rename from easel/art/donkey-thinking/README.md rename to aesel/art/donkey-thinking/README.md diff --git a/easel/art/donkey-thinking/prompt.txt b/aesel/art/donkey-thinking/prompt.txt similarity index 100% rename from easel/art/donkey-thinking/prompt.txt rename to aesel/art/donkey-thinking/prompt.txt diff --git a/easel/bin/a b/aesel/bin/a similarity index 100% rename from easel/bin/a rename to aesel/bin/a diff --git a/easel/bin/aes b/aesel/bin/aes similarity index 100% rename from easel/bin/aes rename to aesel/bin/aes diff --git a/easel/bin/aesel b/aesel/bin/aesel similarity index 100% rename from easel/bin/aesel rename to aesel/bin/aesel diff --git a/easel/bin/build-api-map.mjs b/aesel/bin/build-api-map.mjs similarity index 99% rename from easel/bin/build-api-map.mjs rename to aesel/bin/build-api-map.mjs index 4446d5c0cf..8bba5efc3c 100644 --- a/easel/bin/build-api-map.mjs +++ b/aesel/bin/build-api-map.mjs @@ -7,7 +7,7 @@ // sessions, the same eight commands, a minute or two each before the first // edit. The answers do not change between sessions; only the model's memory // does. So the answers are computed once, here, and shipped as -// `easel/context/api.json` for `ac_api` to serve in a single call. +// `aesel/context/api.json` for `ac_api` to serve in a single call. // // What it records, per API name a piece can call: // - where it lives on `$api` (`circle`, `sound.synth`, `ui.Button`) diff --git a/easel/bin/build-picture-tools.mjs b/aesel/bin/build-picture-tools.mjs similarity index 93% rename from easel/bin/build-picture-tools.mjs rename to aesel/bin/build-picture-tools.mjs index 9a65560962..cc5b5b5901 100644 --- a/easel/bin/build-picture-tools.mjs +++ b/aesel/bin/build-picture-tools.mjs @@ -11,9 +11,9 @@ const line = await readFile(resolve(source, 'system/public/aesthetic.computer/di const start = line.indexOf('const nopaintProposal ='); const end = line.indexOf('\nfunction meta()', start); if (start < 0 || end < 0) throw new Error('AC Line proposal contract was not found'); -const vendoredPath = resolve(root, 'easel/media/picture/ac-line.mjs'); +const vendoredPath = resolve(root, 'aesel/media/picture/ac-line.mjs'); const vendored = await readFile(vendoredPath, 'utf8'); const helpers = vendored.indexOf('export function seedFrom'); if (helpers < 0) throw new Error('AC Line seed helpers were not found'); await writeFile(vendoredPath, '// Vendored AC Line proposal contract, verbatim from disks/line.mjs.\n// Generated by bin/build-picture-tools.mjs. Seed helpers from lib/nopaint-proposals.mjs.\n' + line.slice(start, end).replace('const nopaintProposal', 'export const nopaintProposal') + '\n' + vendored.slice(helpers).trimEnd() + '\n'); -await build({ stdin: { contents: `export { default as JSZip } from ${JSON.stringify(require.resolve('jszip'))};\nexport * as graph from ${JSON.stringify(source + '/system/public/aesthetic.computer/lib/graph.mjs')};\nexport { createNoPaintPiece, createNoPaintProposalLayer, appendNoPaintLayer, sameNoPaintPixels } from ${JSON.stringify(source + '/system/public/aesthetic.computer/lib/nopaint-pieces.mjs')};`, resolveDir: root, sourcefile: 'ac-picture-tools.mjs' }, bundle: true, format: 'esm', platform: 'node', target: 'node22', minify: true, outfile: resolve(root, 'easel/media/picture/ac-tools.mjs'), banner: {js: '// Generated from AC graph.mjs and nopaint-pieces.mjs by bin/build-picture-tools.mjs.'} }); +await build({ stdin: { contents: `export { default as JSZip } from ${JSON.stringify(require.resolve('jszip'))};\nexport * as graph from ${JSON.stringify(source + '/system/public/aesthetic.computer/lib/graph.mjs')};\nexport { createNoPaintPiece, createNoPaintProposalLayer, appendNoPaintLayer, sameNoPaintPixels } from ${JSON.stringify(source + '/system/public/aesthetic.computer/lib/nopaint-pieces.mjs')};`, resolveDir: root, sourcefile: 'ac-picture-tools.mjs' }, bundle: true, format: 'esm', platform: 'node', target: 'node22', minify: true, outfile: resolve(root, 'aesel/media/picture/ac-tools.mjs'), banner: {js: '// Generated from AC graph.mjs and nopaint-pieces.mjs by bin/build-picture-tools.mjs.'} }); diff --git a/easel/bin/design-loop.mjs b/aesel/bin/design-loop.mjs similarity index 100% rename from easel/bin/design-loop.mjs rename to aesel/bin/design-loop.mjs diff --git a/easel/bin/easel b/aesel/bin/easel similarity index 100% rename from easel/bin/easel rename to aesel/bin/easel diff --git a/easel/bin/easel-desktop b/aesel/bin/easel-desktop similarity index 100% rename from easel/bin/easel-desktop rename to aesel/bin/easel-desktop diff --git a/easel/bin/frame-ocr b/aesel/bin/frame-ocr similarity index 100% rename from easel/bin/frame-ocr rename to aesel/bin/frame-ocr diff --git a/easel/bin/frame-ocr.swift b/aesel/bin/frame-ocr.swift similarity index 100% rename from easel/bin/frame-ocr.swift rename to aesel/bin/frame-ocr.swift diff --git a/easel/bin/openrouter-probe.mjs b/aesel/bin/openrouter-probe.mjs similarity index 100% rename from easel/bin/openrouter-probe.mjs rename to aesel/bin/openrouter-probe.mjs diff --git a/easel/bin/pack.mjs b/aesel/bin/pack.mjs similarity index 100% rename from easel/bin/pack.mjs rename to aesel/bin/pack.mjs diff --git a/easel/bin/sync-context.mjs b/aesel/bin/sync-context.mjs similarity index 98% rename from easel/bin/sync-context.mjs rename to aesel/bin/sync-context.mjs index ca2578ac87..5b23d87bad 100755 --- a/easel/bin/sync-context.mjs +++ b/aesel/bin/sync-context.mjs @@ -31,7 +31,7 @@ const OUT = join(aesel, "context"); // whole repository: this is the knowledge that is about Aesthetic Computer // rather than about this checkout. export const BUNDLE = [ - ["easel/SCORE.md", "score.md", "the aesel piece workflow"], + ["aesel/SCORE.md", "score.md", "the aesel piece workflow"], ["SCREEN.md", "screen.md", "how a piece draws on the AC canvas"], ["HAND.md", "hand.md", "how the code reads"], ["system/public/aesthetic.computer/disks/CLAUDE.md", "pieces.md", "the piece authoring guide"], diff --git a/easel/context/api.json b/aesel/context/api.json similarity index 99% rename from easel/context/api.json rename to aesel/context/api.json index 67b6b7772b..11a6ae6208 100644 --- a/easel/context/api.json +++ b/aesel/context/api.json @@ -396,7 +396,7 @@ "examples": [ "disks/baktok.mjs:133 pan(noshake ? 0 : choose(-1, 0, 1), noshake ? 0 : choose(-1, 0, 1));", "disks/baktok.mjs:136 pan(noshake ? 0 : choose(-1, 0, 1), noshake ? 0 : choose(-1, 0, 1));", - "disks/clock.mjs:3757 const pan = 0; // Centered pan (could be enhanced later)" + "disks/clock.mjs:3761 const pan = 0; // Centered pan (could be enhanced later)" ] }, { @@ -547,7 +547,7 @@ "doc": "Invert every pixel's color.", "source": "lib/graph.mjs:2106", "examples": [ - "disks/lairk.mjs:711 const inv = camMatrix && invert(camMatrix);" + "disks/lairk.mjs:526 const inv = camMatrix && invert(camMatrix);" ] }, { diff --git a/easel/context/hand.md b/aesel/context/hand.md similarity index 100% rename from easel/context/hand.md rename to aesel/context/hand.md diff --git a/easel/context/kidlisp.md b/aesel/context/kidlisp.md similarity index 100% rename from easel/context/kidlisp.md rename to aesel/context/kidlisp.md diff --git a/easel/context/pieces.md b/aesel/context/pieces.md similarity index 100% rename from easel/context/pieces.md rename to aesel/context/pieces.md diff --git a/easel/context/reference/disks/1v1.mjs b/aesel/context/reference/disks/1v1.mjs similarity index 100% rename from easel/context/reference/disks/1v1.mjs rename to aesel/context/reference/disks/1v1.mjs diff --git a/easel/context/reference/disks/blank.mjs b/aesel/context/reference/disks/blank.mjs similarity index 100% rename from easel/context/reference/disks/blank.mjs rename to aesel/context/reference/disks/blank.mjs diff --git a/easel/context/reference/disks/camera.mjs b/aesel/context/reference/disks/camera.mjs similarity index 100% rename from easel/context/reference/disks/camera.mjs rename to aesel/context/reference/disks/camera.mjs diff --git a/easel/context/reference/disks/notepat.mjs b/aesel/context/reference/disks/notepat.mjs similarity index 100% rename from easel/context/reference/disks/notepat.mjs rename to aesel/context/reference/disks/notepat.mjs diff --git a/easel/context/reference/lib/cam-doll.mjs b/aesel/context/reference/lib/cam-doll.mjs similarity index 100% rename from easel/context/reference/lib/cam-doll.mjs rename to aesel/context/reference/lib/cam-doll.mjs diff --git a/easel/context/reference/lib/disk.mjs b/aesel/context/reference/lib/disk.mjs similarity index 100% rename from easel/context/reference/lib/disk.mjs rename to aesel/context/reference/lib/disk.mjs diff --git a/easel/context/reference/lib/geo.mjs b/aesel/context/reference/lib/geo.mjs similarity index 100% rename from easel/context/reference/lib/geo.mjs rename to aesel/context/reference/lib/geo.mjs diff --git a/easel/context/reference/lib/graph.mjs b/aesel/context/reference/lib/graph.mjs similarity index 100% rename from easel/context/reference/lib/graph.mjs rename to aesel/context/reference/lib/graph.mjs diff --git a/easel/context/reference/lib/num.mjs b/aesel/context/reference/lib/num.mjs similarity index 100% rename from easel/context/reference/lib/num.mjs rename to aesel/context/reference/lib/num.mjs diff --git a/easel/context/reference/lib/ui.mjs b/aesel/context/reference/lib/ui.mjs similarity index 100% rename from easel/context/reference/lib/ui.mjs rename to aesel/context/reference/lib/ui.mjs diff --git a/easel/context/score.md b/aesel/context/score.md similarity index 98% rename from easel/context/score.md rename to aesel/context/score.md index d6943992c3..2df073847e 100644 --- a/easel/context/score.md +++ b/aesel/context/score.md @@ -1,5 +1,5 @@ # Piece score diff --git a/easel/context/screen.md b/aesel/context/screen.md similarity index 100% rename from easel/context/screen.md rename to aesel/context/screen.md diff --git a/easel/docs/duputo-api-review.md b/aesel/docs/duputo-api-review.md similarity index 98% rename from easel/docs/duputo-api-review.md rename to aesel/docs/duputo-api-review.md index da0dfe515f..206b6effb4 100644 --- a/easel/docs/duputo-api-review.md +++ b/aesel/docs/duputo-api-review.md @@ -23,7 +23,7 @@ The agent did not claim visual verification passed. It attempted both diagnostic ## Host and context findings -**Confirmed from code:** `easel/src/tui.mjs` handles only `item/commandExecution/requestApproval` and `item/fileChange/requestApproval`. Other server requests receive JSON-RPC `-32601`. The installed app has the same limitation. `AppServer` requests user-reviewed approvals with `approvalPolicy: on-request`. +**Confirmed from code:** `aesel/src/tui.mjs` handles only `item/commandExecution/requestApproval` and `item/fileChange/requestApproval`. Other server requests receive JSON-RPC `-32601`. The installed app has the same limitation. `AppServer` requests user-reviewed approvals with `approvalPolicy: on-request`. **Confirmed from the installed CLI schema:** the MCP elicitation route is `mcpServer/elicitation/request`. It is not `item/mcpToolCall/requestApproval`. Parameters require `serverName`, `threadId` and a mode-specific payload. Modes include `form`, `openai/form`, `openaiForm`, `url`, and `openai/userVerification`. Form mode includes `message` and `requestedSchema`. Its response requires `action: accept | decline | cancel`, with optional `content` and `_meta`; the command-approval `{decision: accept}` response is not this protocol. diff --git a/easel/docs/format.md b/aesel/docs/format.md similarity index 100% rename from easel/docs/format.md rename to aesel/docs/format.md diff --git a/easel/docs/interface-contract.md b/aesel/docs/interface-contract.md similarity index 92% rename from easel/docs/interface-contract.md rename to aesel/docs/interface-contract.md index fa4de1acc9..0c0d53817c 100644 --- a/easel/docs/interface-contract.md +++ b/aesel/docs/interface-contract.md @@ -13,5 +13,5 @@ explicit overrides. It searches `~/Applications/Aesel Native.app` and `/Applications/Aesel Native.app`; `AESEL_DESKTOP_APP` selects another native bundle. The native app is built from `apple/aesel`. Shared notebook assets live in -`easel/shared`; the terminal runtime remains in `easel/src`. See the +`aesel/shared`; the terminal runtime remains in `aesel/src`. See the [native README](../../apple/aesel/README.md) for build and installation instructions. diff --git a/easel/docs/jev-harness.md b/aesel/docs/jev-harness.md similarity index 100% rename from easel/docs/jev-harness.md rename to aesel/docs/jev-harness.md diff --git a/easel/docs/live-broadcast.md b/aesel/docs/live-broadcast.md similarity index 100% rename from easel/docs/live-broadcast.md rename to aesel/docs/live-broadcast.md diff --git a/easel/docs/local-contract.md b/aesel/docs/local-contract.md similarity index 100% rename from easel/docs/local-contract.md rename to aesel/docs/local-contract.md diff --git a/easel/docs/native-shell.md b/aesel/docs/native-shell.md similarity index 98% rename from easel/docs/native-shell.md rename to aesel/docs/native-shell.md index 69f760d374..d282094a8a 100644 --- a/easel/docs/native-shell.md +++ b/aesel/docs/native-shell.md @@ -23,7 +23,7 @@ sit in. Worth getting the numbers right before arguing from them, because the brief for this memo overstated one of them and the correction changes the argument. -`easel/src` is **5,274 lines** of Node ESM with zero npm dependencies, and +`aesel/src` is **5,274 lines** of Node ESM with zero npm dependencies, and `test/` holds **89 test cases** across seventeen files. But the *interface* — the thing that would have to be replaced if we dropped ANSI — is not 4,400 lines. It is `tui.mjs` at 1,318 and `render.mjs` at 505: **1,823 lines.** The @@ -75,7 +75,7 @@ No `child_process`, no `http`, no `net`. It POSTs to `/api/easel-inference`, parses the `data:` stream by hand, and runs its own agent loop — bounded at twelve rounds, because a looping model spends someone's daily budget on a loop. It touches the filesystem exactly twice: it reads four -bundled guides out of `easel/context/`, and it writes the piece. The tool set is +bundled guides out of `aesel/context/`, and it writes the piece. The tool set is one tool, `write_piece`, which takes the entire file and replaces it. So the claim holds, and more strongly than I expected. **The `ac` bridge needs @@ -204,7 +204,7 @@ aesthetic.computer in a nested `` inside a local `flip-view.html`, with an animated tray icon, a silo-backed updater, deep links, and a lot of Docker and devcontainer orchestration. It spawns subprocesses constantly — docker, devcontainer, emacs, `ac-login.mjs`, a native notepat binary. It has no -cross-reference to `easel/` anywhere. +cross-reference to `aesel/` anywhere. My read: **build inside ac-electron, not beside it.** A second Electron app with a second signing config, a second updater and a second release pipeline is the @@ -275,13 +275,13 @@ not need to learn a new thing. The marker costs nothing and buys continuity. Four options, and the fourth is the null one. -**(a) Electron only — Mac, Windows, Linux.** Shares 100% of `easel/src`, running +**(a) Electron only — Mac, Windows, Linux.** Shares 100% of `aesel/src`, running unchanged in a PTY. Reuses ac-electron's Developer ID, its two-stage notarize, and its silo updater. No iOS, ever. Windows is 95% there in code and 0% there in evidence. **(b) SwiftUI + WKWebView — Mac and iOS.** No Windows. And the fatal detail: -**there is no Node.js on iOS.** `easel/src` cannot run there at all. So this +**there is no Node.js on iOS.** `aesel/src` cannot run there at all. So this option does not share session logic between its two platforms; it reimplements it, and then the Mac app and the iOS app share Swift chrome and nothing else. On macOS it could embed SwiftTerm and spawn `claude` happily — but it would be a diff --git a/easel/docs/next-release.md b/aesel/docs/next-release.md similarity index 100% rename from easel/docs/next-release.md rename to aesel/docs/next-release.md diff --git a/easel/docs/openrouter-backend.md b/aesel/docs/openrouter-backend.md similarity index 100% rename from easel/docs/openrouter-backend.md rename to aesel/docs/openrouter-backend.md diff --git a/easel/docs/picture-workflow.md b/aesel/docs/picture-workflow.md similarity index 100% rename from easel/docs/picture-workflow.md rename to aesel/docs/picture-workflow.md diff --git a/easel/docs/piece-and-harness-routing.md b/aesel/docs/piece-and-harness-routing.md similarity index 100% rename from easel/docs/piece-and-harness-routing.md rename to aesel/docs/piece-and-harness-routing.md diff --git a/easel/docs/playability.md b/aesel/docs/playability.md similarity index 98% rename from easel/docs/playability.md rename to aesel/docs/playability.md index b27652d83d..0e47b35898 100644 --- a/easel/docs/playability.md +++ b/aesel/docs/playability.md @@ -8,7 +8,7 @@ Use the existing preview as the execution surface. The loop is **observe its pix | Existing code | Contribution and current limit | | --- | --- | -| `easel/src/frame-capture-script.mjs`, `preview-frame.mjs` | `ac_frame` reads the software canvas or preserved WebGL composite, returns PNG plus color/edge/blank statistics and optional local OCR. WebGPU is explicitly unsupported. Requested source revision is not yet proof of rendered revision. | +| `aesel/src/frame-capture-script.mjs`, `preview-frame.mjs` | `ac_frame` reads the software canvas or preserved WebGL composite, returns PNG plus color/edge/blank statistics and optional local OCR. WebGPU is explicitly unsupported. Requested source revision is not yet proof of rendered revision. | | Native `PromptPreview` capture bridge | Already identify the preview guest and verify channel/revision. File polling is currently 250 ms in the native overlay; this is a useful compatibility path, not the final fast loop. | | `slab/bin/puppet-mcp.mjs`, `puppet.mjs` | Existing action vocabulary: key, stroke, gesture, cursor; resident daemon holds warm CDP connections. Adapt these primitives to the explicitly bound preview target. Do not use the default “most recent page” target. The MCP key operation is a press, so bounded holds need a small extension. | | `artery/arena-probe.mjs` | Existing CDP key down/up descriptors, bounded movement sequences, and runtime performance evidence. Reuse its hold/release behavior rather than inventing keyboard synthesis. | @@ -16,7 +16,7 @@ Use the existing preview as the execution surface. The loop is **observe its pix | `lib/pen.mjs`, `keyboard.mjs`, `gamepad.mjs`, `gamepad-mappings.mjs` | Keep the actual AC input normalization, coordinate transforms, key polling, gamepad button edges, axes and deadzones. Gamepad currently polls `navigator.getGamepads()` every 8 ms; no test-pad provider was found in this path. | | `disks/gameboy.mjs`, BIOS `handleGameboyInput` | Existing AC virtual buttons and per-frame joypad state already feed WasmBoy. Exercise those controls; do not create another emulator. | | `tests/browser/ac-harness.mjs` | Useful precedent for state hooks, seeded configuration and evidence. Its separate Chrome launch is unsuitable for this preview-only feature. | -| `easel/src/runtime-feedback.mjs` | Existing bounded runtime errors, warnings and source context can accompany each observation. | +| `aesel/src/runtime-feedback.mjs` | Existing bounded runtime errors, warnings and source context can accompany each observation. | | `slab/bin/frame-mcp.mjs`, `slab/lib/frame-tape.mjs` | Existing observe/action/evidence conventions and recorded tapes. Whole-desktop capture/OCR is for shell verification, not the game loop. | Paths beginning `lib/` or `disks/` above are under `system/public/aesthetic.computer/`. diff --git a/easel/docs/spriteland.md b/aesel/docs/spriteland.md similarity index 95% rename from easel/docs/spriteland.md rename to aesel/docs/spriteland.md index 85d40ab2b0..cf570aa055 100644 --- a/easel/docs/spriteland.md +++ b/aesel/docs/spriteland.md @@ -13,8 +13,8 @@ The real Slab rock is a separate native overlay. Desktop markers identify `host_ Validation: - `node --test easel/test/donkey.test.mjs` -- Run `easel/test/preview-geometry.electron.cjs` with the desktop Electron binary for window resizing, hover/fullscreen geometry and QR zoom. -- Run `easel/test/companion-scene.electron.cjs` with `EASEL_DESKTOP=1 COLORTERM=truecolor` and Electron. It verifies every QR/quiet-zone pixel across all sixteen poses and saves normal/small/tiny full-window screenshots under `/tmp/easel-scene-*.png`. +- Run `aesel/test/preview-geometry.electron.cjs` with the desktop Electron binary for window resizing, hover/fullscreen geometry and QR zoom. +- Run `aesel/test/companion-scene.electron.cjs` with `EASEL_DESKTOP=1 COLORTERM=truecolor` and Electron. It verifies every QR/quiet-zone pixel across all sixteen poses and saves normal/small/tiny full-window screenshots under `/tmp/easel-scene-*.png`. - On macOS, `swift easel/test/decode-qr.swift EXPECTED_URL /tmp/easel-scene-normal.png /tmp/easel-scene-small.png /tmp/easel-scene-tiny.png` checks actual screenshot decoding with Vision. Set SDKROOT to a supported local SDK if necessary. The September 15 integration check decoded the same watch URL at 16px, 14px and 12px text sizes. This is software-decoder evidence, not a guarantee for every physical phone camera, screen size or lighting condition. diff --git a/easel/install.sh b/aesel/install.sh similarity index 100% rename from easel/install.sh rename to aesel/install.sh diff --git a/easel/layouts/pro.json b/aesel/layouts/pro.json similarity index 100% rename from easel/layouts/pro.json rename to aesel/layouts/pro.json diff --git a/easel/media/gameboy/README.md b/aesel/media/gameboy/README.md similarity index 100% rename from easel/media/gameboy/README.md rename to aesel/media/gameboy/README.md diff --git a/easel/media/gameboy/hello.c b/aesel/media/gameboy/hello.c similarity index 100% rename from easel/media/gameboy/hello.c rename to aesel/media/gameboy/hello.c diff --git a/easel/media/gameboy/rom.mjs b/aesel/media/gameboy/rom.mjs similarity index 100% rename from easel/media/gameboy/rom.mjs rename to aesel/media/gameboy/rom.mjs diff --git a/easel/media/gameboy/starter.c b/aesel/media/gameboy/starter.c similarity index 100% rename from easel/media/gameboy/starter.c rename to aesel/media/gameboy/starter.c diff --git a/easel/media/paper/README.md b/aesel/media/paper/README.md similarity index 100% rename from easel/media/paper/README.md rename to aesel/media/paper/README.md diff --git a/easel/media/paper/ac-source-bundle.sty b/aesel/media/paper/ac-source-bundle.sty similarity index 100% rename from easel/media/paper/ac-source-bundle.sty rename to aesel/media/paper/ac-source-bundle.sty diff --git a/easel/media/paper/aesthetic-eye.mjs b/aesel/media/paper/aesthetic-eye.mjs similarity index 100% rename from easel/media/paper/aesthetic-eye.mjs rename to aesel/media/paper/aesthetic-eye.mjs diff --git a/easel/media/paper/template.tex b/aesel/media/paper/template.tex similarity index 100% rename from easel/media/paper/template.tex rename to aesel/media/paper/template.tex diff --git a/easel/media/paper/zip.mjs b/aesel/media/paper/zip.mjs similarity index 100% rename from easel/media/paper/zip.mjs rename to aesel/media/paper/zip.mjs diff --git a/easel/media/picture/README.md b/aesel/media/picture/README.md similarity index 100% rename from easel/media/picture/README.md rename to aesel/media/picture/README.md diff --git a/easel/media/picture/ac-line.mjs b/aesel/media/picture/ac-line.mjs similarity index 100% rename from easel/media/picture/ac-line.mjs rename to aesel/media/picture/ac-line.mjs diff --git a/easel/media/picture/ac-tools.mjs b/aesel/media/picture/ac-tools.mjs similarity index 100% rename from easel/media/picture/ac-tools.mjs rename to aesel/media/picture/ac-tools.mjs diff --git a/easel/media/picture/draw.mjs b/aesel/media/picture/draw.mjs similarity index 100% rename from easel/media/picture/draw.mjs rename to aesel/media/picture/draw.mjs diff --git a/easel/media/picture/illy.mjs b/aesel/media/picture/illy.mjs similarity index 100% rename from easel/media/picture/illy.mjs rename to aesel/media/picture/illy.mjs diff --git a/easel/media/picture/png.mjs b/aesel/media/picture/png.mjs similarity index 100% rename from easel/media/picture/png.mjs rename to aesel/media/picture/png.mjs diff --git a/easel/media/sound/README.md b/aesel/media/sound/README.md similarity index 100% rename from easel/media/sound/README.md rename to aesel/media/sound/README.md diff --git a/easel/media/sound/pop/bus.mjs b/aesel/media/sound/pop/bus.mjs similarity index 100% rename from easel/media/sound/pop/bus.mjs rename to aesel/media/sound/pop/bus.mjs diff --git a/easel/media/sound/pop/fx.mjs b/aesel/media/sound/pop/fx.mjs similarity index 100% rename from easel/media/sound/pop/fx.mjs rename to aesel/media/sound/pop/fx.mjs diff --git a/easel/media/sound/pop/necklace.mjs b/aesel/media/sound/pop/necklace.mjs similarity index 100% rename from easel/media/sound/pop/necklace.mjs rename to aesel/media/sound/pop/necklace.mjs diff --git a/easel/media/sound/pop/sinepower.mjs b/aesel/media/sound/pop/sinepower.mjs similarity index 100% rename from easel/media/sound/pop/sinepower.mjs rename to aesel/media/sound/pop/sinepower.mjs diff --git a/easel/media/sound/pop/wav.mjs b/aesel/media/sound/pop/wav.mjs similarity index 100% rename from easel/media/sound/pop/wav.mjs rename to aesel/media/sound/pop/wav.mjs diff --git a/easel/media/sound/provenance.json b/aesel/media/sound/provenance.json similarity index 100% rename from easel/media/sound/provenance.json rename to aesel/media/sound/provenance.json diff --git a/easel/native/approvals.mjs b/aesel/native/approvals.mjs similarity index 100% rename from easel/native/approvals.mjs rename to aesel/native/approvals.mjs diff --git a/easel/native/automation.mjs b/aesel/native/automation.mjs similarity index 100% rename from easel/native/automation.mjs rename to aesel/native/automation.mjs diff --git a/easel/native/gamepad.swift b/aesel/native/gamepad.swift similarity index 100% rename from easel/native/gamepad.swift rename to aesel/native/gamepad.swift diff --git a/easel/native/host.mjs b/aesel/native/host.mjs similarity index 100% rename from easel/native/host.mjs rename to aesel/native/host.mjs diff --git a/easel/native/install.mjs b/aesel/native/install.mjs similarity index 100% rename from easel/native/install.mjs rename to aesel/native/install.mjs diff --git a/easel/native/preview.mjs b/aesel/native/preview.mjs similarity index 100% rename from easel/native/preview.mjs rename to aesel/native/preview.mjs diff --git a/easel/native/prompt.mjs b/aesel/native/prompt.mjs similarity index 100% rename from easel/native/prompt.mjs rename to aesel/native/prompt.mjs diff --git a/easel/package.json b/aesel/package.json similarity index 100% rename from easel/package.json rename to aesel/package.json diff --git a/easel/phone/README.md b/aesel/phone/README.md similarity index 92% rename from easel/phone/README.md rename to aesel/phone/README.md index 2c137a80dc..530fa8aa61 100644 --- a/easel/phone/README.md +++ b/aesel/phone/README.md @@ -1,13 +1,13 @@ # Aesel on a phone The hosted half of Aesel with a touch interface. It is not a port: the agent -loop is `easel/src/ac-server.mjs`, loaded unmodified, and publishing is -`easel/src/publish.mjs`, also unmodified. This directory is only the shell +loop is `aesel/src/ac-server.mjs`, loaded unmodified, and publishing is +`aesel/src/publish.mjs`, also unmodified. This directory is only the shell around them. ## Why this shape -`easel/docs/native-shell.md` concluded that iOS should be its own project with +`aesel/docs/native-shell.md` concluded that iOS should be its own project with "the agent loop rewritten in Swift." Reading `ac-server.mjs` closely argues against that. Its entire Node surface is `EventEmitter`, three `fs` calls, `path.join`, `randomUUID` and `process.env` — and `piece`, `token`, `fetch` and diff --git a/easel/phone/app.mjs b/aesel/phone/app.mjs similarity index 99% rename from easel/phone/app.mjs rename to aesel/phone/app.mjs index d24a9ca915..657e3b6b76 100644 --- a/easel/phone/app.mjs +++ b/aesel/phone/app.mjs @@ -2,7 +2,7 @@ // // This file is the phone's *shell*: sign-in, one piece, a transcript, a live // preview. The thinking is not here — `AcServer` is imported straight out of -// `easel/src` and runs unmodified, so the agent loop, the guides, the tool +// `aesel/src` and runs unmodified, so the agent loop, the guides, the tool // contract and the twelve-round bound are literally the desktop's. That is the // whole architectural bet: a phone client that reimplements the loop would // drift from it inside a month. diff --git a/easel/phone/credits.mjs b/aesel/phone/credits.mjs similarity index 100% rename from easel/phone/credits.mjs rename to aesel/phone/credits.mjs diff --git a/easel/phone/host.html b/aesel/phone/host.html similarity index 100% rename from easel/phone/host.html rename to aesel/phone/host.html diff --git a/easel/phone/index.html b/aesel/phone/index.html similarity index 98% rename from easel/phone/index.html rename to aesel/phone/index.html index 825cacfcf8..7a232bbb62 100644 --- a/easel/phone/index.html +++ b/aesel/phone/index.html @@ -19,7 +19,7 @@ module scope, and an import map cannot supply a bare global. --> - Publish[Explicit publication policy and receipts] ``` -Reuse the adapters in [`easel/src`](../../easel/src/): `ac-server.mjs`, +Reuse the adapters in [`aesel/src`](../../aesel/src/): `ac-server.mjs`, `claude-server.mjs`, `app-server.mjs`, `backends.mjs`, `provider-picker.mjs`, and `provider-preferences.mjs`. WebKit cannot replace a subprocess or filesystem with a browser shim. A native helper or paired host must provide those services. @@ -129,7 +129,7 @@ and defined local versus shared sign-out. See [INTEGRATION.md](INTEGRATION.md). Audit existing transcript-sharing behavior before claiming local-only or private use. Desktop has required disclosure/acceptance logic in -[`required-sharing.mjs`](../../easel/src/required-sharing.mjs); the native flow +[`required-sharing.mjs`](../../aesel/src/required-sharing.mjs); the native flow must either enforce the same account-bound contract or adopt an explicitly revised policy. Source publication, transcript sharing, preview runtime requests, and inference traffic are separate disclosures. Guest access must not inherit @@ -193,7 +193,7 @@ composer, or preview controls. Check VoiceOver and reduced motion on-device. | Paper | Run a supported TeX toolchain on an available host; show source and PDF. Preserve bibliography, consulted sources, embedded source bundle, and visual QA state. | Build, inspect rendered pages, record QA against that exact PDF hash, export matching sources; a compile alone never marks it ready. | | Game Boy | Compile with the existing GBDK toolchain, preview the resulting ROM with the existing emulator, and adapt joypad/gamepad input. | Build and play a real ROM, export exact bytes, show when source is newer than the last successful build. | -Use the contracts in [`easel/media`](../../easel/media/) rather than introducing +Use the contracts in [`aesel/media`](../../aesel/media/) rather than introducing new artifact formats. Optional dependencies must have capability checks and useful errors. Keep unsupported lanes unavailable until their outputs are real. Sound, Paper, and Game Boy need an explicit publication implementation before diff --git a/apple/aesel/Sources/AeselScene.swift b/apple/aesel/Sources/AeselScene.swift index 16b5603fca..ebe5340798 100644 --- a/apple/aesel/Sources/AeselScene.swift +++ b/apple/aesel/Sources/AeselScene.swift @@ -143,7 +143,7 @@ extension EnvironmentValues { } } -/// The shared renderer's native Prox lettering (easel/shared/native/credit-label.swift), +/// The shared renderer's native Prox lettering (aesel/shared/native/credit-label.swift), /// drawn with a light face, a dark edge and tight cyan, purple and pink accents. /// One cached image per letter lets the notebook /// tilt and sway each one on its own. diff --git a/apple/aesel/Sources/AeselTerminal.swift b/apple/aesel/Sources/AeselTerminal.swift index f10850f952..60e7e96389 100644 --- a/apple/aesel/Sources/AeselTerminal.swift +++ b/apple/aesel/Sources/AeselTerminal.swift @@ -2,14 +2,14 @@ import Foundation /// The direct (Developer ID) build carries the terminal half of Aesel: -/// `Contents/Resources/easel` plus Node in `Contents/Helpers`. On launch it +/// `Contents/Resources/aesel` plus Node in `Contents/Helpers`. On launch it /// links `aesel` (this app) and `aes` (the TUI) into ~/.local/bin and installs /// the Claude/Codex host, once per app version. The sandboxed build has /// neither folder and does nothing here. enum AeselTerminal { static func install() { let bundle = Bundle.main.bundleURL - let easel = bundle.appendingPathComponent("Contents/Resources/easel") + let easel = bundle.appendingPathComponent("Contents/Resources/aesel") let node = bundle.appendingPathComponent("Contents/Helpers/node") let files = FileManager.default guard ProcessInfo.processInfo.environment["APP_SANDBOX_CONTAINER_ID"] == nil, @@ -31,7 +31,9 @@ enum AeselTerminal { let path = bin.appendingPathComponent(name).path let target = easel.appendingPathComponent("bin/\(name)").path if let existing = try? files.destinationOfSymbolicLink(atPath: path) { - guard existing != target, existing.contains(".app/Contents/Resources/easel/") else { continue } + // An app-bundle link from before the rename (Resources/easel) is ours too. + guard existing != target, existing.contains(".app/Contents/Resources/aesel/") + || existing.contains(".app/Contents/Resources/easel/") else { continue } try? files.removeItem(atPath: path) } else if files.fileExists(atPath: path) { continue diff --git a/apple/aesel/Sources/Session.swift b/apple/aesel/Sources/Session.swift index c489ac76ac..74255f4ab7 100644 --- a/apple/aesel/Sources/Session.swift +++ b/apple/aesel/Sources/Session.swift @@ -71,7 +71,7 @@ struct SessionSummary: Identifiable { } /// The whole of what SwiftUI observes. It holds no logic about turns, tools or -/// publishing — those live in `easel/phone/session.mjs`, shared with the +/// publishing — those live in `aesel/phone/session.mjs`, shared with the /// desktop. This is the projection of that session's event stream into /// something a view can draw. @Observable diff --git a/apple/aesel/Sources/SessionHost.swift b/apple/aesel/Sources/SessionHost.swift index 3f119f0780..afff230c97 100644 --- a/apple/aesel/Sources/SessionHost.swift +++ b/apple/aesel/Sources/SessionHost.swift @@ -4,8 +4,8 @@ import Security /// Runs the shared JavaScript session in a WKWebView that is never shown. /// -/// The session is `easel/phone/session.mjs`, which builds `AcServer` out of -/// `easel/src` unmodified. Hosting it here rather than porting it to Swift is +/// The session is `aesel/phone/session.mjs`, which builds `AcServer` out of +/// `aesel/src` unmodified. Hosting it here rather than porting it to Swift is /// the point: the agent loop, the twelve-round bound, the tool contract and the /// guides stay one implementation shared with the desktop, and SwiftUI draws /// the result. diff --git a/apple/aesel/bundle-session.sh b/apple/aesel/bundle-session.sh index e5a2b20955..4b4b68c8f0 100755 --- a/apple/aesel/bundle-session.sh +++ b/apple/aesel/bundle-session.sh @@ -4,14 +4,14 @@ cd "$(dirname "$0")" rm -rf Resources/Session/easel/desktop mkdir -p Resources/Session/easel for tree in phone src context; do - rsync -a --delete "../../easel/$tree/" "Resources/Session/easel/$tree/" + rsync -a --delete "../../aesel/$tree/" "Resources/Session/easel/$tree/" done # Use the shared renderer's sanitized rich-text renderer on iPhone as well. mkdir -p Resources/Session/easel/shared/vendor -rsync -a --delete ../../easel/shared/vendor/rich/ Resources/Session/easel/shared/vendor/rich/ -cp ../../easel/shared/{transcript,reply-details,notebook-donkey}.js Resources/Session/easel/shared/ -cp ../../easel/shared/rich.css Resources/Session/easel/shared/ +rsync -a --delete ../../aesel/shared/vendor/rich/ Resources/Session/easel/shared/vendor/rich/ +cp ../../aesel/shared/{transcript,reply-details,notebook-donkey}.js Resources/Session/easel/shared/ +cp ../../aesel/shared/rich.css Resources/Session/easel/shared/ # The shared renderer's pencil companion sheet, drawn natively by AeselDonkey. mkdir -p Resources/Session/easel/shared/assets -cp ../../easel/shared/assets/donkey-pencil-run-v2.png Resources/Session/easel/shared/assets/ -cp ../../easel/shared/assets/donkey-pencil-thinking-v1.png Resources/Session/easel/shared/assets/ +cp ../../aesel/shared/assets/donkey-pencil-run-v2.png Resources/Session/easel/shared/assets/ +cp ../../aesel/shared/assets/donkey-pencil-thinking-v1.png Resources/Session/easel/shared/assets/ diff --git a/apple/aesel/project.yml b/apple/aesel/project.yml index 8007512ac8..708e784b3b 100644 --- a/apple/aesel/project.yml +++ b/apple/aesel/project.yml @@ -47,7 +47,7 @@ targets: PRODUCT_NAME: Aesel INFOPLIST_FILE: MacInfo.plist CODE_SIGN_ENTITLEMENTS: Mac.entitlements - # release-mac.sh stamps both from easel/package.json and the commit count. + # release-mac.sh stamps both from aesel/package.json and the commit count. MARKETING_VERSION: "0.8.0" CURRENT_PROJECT_VERSION: "1" ENABLE_HARDENED_RUNTIME: YES diff --git a/apple/aesel/release-mac.sh b/apple/aesel/release-mac.sh index 38b2f44eee..da40f45f0b 100755 --- a/apple/aesel/release-mac.sh +++ b/apple/aesel/release-mac.sh @@ -5,14 +5,14 @@ # ./release-mac.sh → dist/aesel--arm64.dmg, notarized + stapled # ./release-mac.sh publish → upload that DMG, then pack the TUI tarball # -# Version = easel/package.json (the TUI and app share it); build = commit count. +# Version = aesel/package.json (the TUI and app share it); build = commit count. # Notarization reads APPLE_ID / APPLE_APP_SPECIFIC_PASSWORD / APPLE_TEAM_ID; # publishing reads SPACES_KEY / SPACES_SECRET. Neither is stored here. set -euo pipefail cd "$(dirname "$0")" HERE=$(pwd) REPO=$(cd ../.. && pwd) -VERSION=$(node -p "require('$REPO/easel/package.json').version") +VERSION=$(node -p "require('$REPO/aesel/package.json').version") BUILD=$(git -C "$REPO" rev-list --count HEAD) IDENTITY="Developer ID Application: Jeffrey Scudder (FB5948YR3S)" NODE_VERSION=${NODE_VERSION:-v24.18.1} @@ -40,7 +40,7 @@ publish() { "${s3[@]}" "$DIST/latest.json" "s3://releases-aesthetic-computer/aesel/mac/latest.json" \ --content-type application/json --cache-control no-cache # The same version for terminal-only installs (easel.sh, Linux). - node "$REPO/easel/bin/pack.mjs" + node "$REPO/aesel/bin/pack.mjs" echo "published https://releases.aesthetic.computer/aesel/mac/$(basename "$DMG")" } [[ "${1:-}" == publish ]] && { publish; exit 0; } @@ -77,12 +77,12 @@ ditto "$BUILT" "$APP" # The terminal half: the TUI's source tree, without install.json, so its # self-updater leaves the bundle alone — the app's release updates it. -EASEL="$APP/Contents/Resources/easel" -mkdir -p "$EASEL" +AESEL="$APP/Contents/Resources/aesel" +mkdir -p "$AESEL" for entry in bin src shell context media layouts native shared package.json README.md LICENSE; do - [[ -e "$REPO/easel/$entry" ]] && rsync -a --exclude '.update-check.json' "$REPO/easel/$entry" "$EASEL/" + [[ -e "$REPO/aesel/$entry" ]] && rsync -a --exclude '.update-check.json' "$REPO/aesel/$entry" "$AESEL/" done -rm -f "$EASEL/install.json" +rm -f "$AESEL/install.json" # Node, from nodejs.org, checked against its published SHA-256. mkdir -p "$CACHE" @@ -94,8 +94,8 @@ mkdir -p "$APP/Contents/Helpers" tar -xzf "$CACHE/$TARBALL" -C "$APP/Contents/Helpers" --strip-components 2 "node-$NODE_VERSION-darwin-arm64/bin/node" # Inside out: the TUI's own binaries (frame-ocr), Node, then the app, whose -# seal now covers Resources/easel. -find "$EASEL" -type f -perm -u+x -print0 | while IFS= read -r -d '' file; do +# seal now covers Resources/aesel. +find "$AESEL" -type f -perm -u+x -print0 | while IFS= read -r -d '' file; do if file -b "$file" | grep -q Mach-O; then codesign --force --options runtime --timestamp -s "$IDENTITY" "$file" fi diff --git a/dotfiles/fish/native-macos.fish b/dotfiles/fish/native-macos.fish index 9761e0d755..2c539f4812 100644 --- a/dotfiles/fish/native-macos.fish +++ b/dotfiles/fish/native-macos.fish @@ -21,7 +21,10 @@ set -g fish_function_path $AC_ROOT/dotfiles/fish/functions $fish_function_path source $AC_ROOT/dotfiles/fish/functions/ac-piece-logs.fish # The shared devcontainer config still carries a Linux-only reload alias. alias reload 'source ~/.config/fish/config.fish' -if test -f $AC_ROOT/easel/shell/easel.fish +# Aesel's shell hooks; the easel/ path is a checkout that hasn't pulled the rename. +if test -f $AC_ROOT/aesel/shell/easel.fish + source $AC_ROOT/aesel/shell/easel.fish +else if test -f $AC_ROOT/easel/shell/easel.fish source $AC_ROOT/easel/shell/easel.fish end if test -f $HOME/.config/fish/config.local.fish diff --git a/fedac/native/lib/aesel-ac.mjs b/fedac/native/lib/aesel-ac.mjs index 01da11d130..924935977d 100644 --- a/fedac/native/lib/aesel-ac.mjs +++ b/fedac/native/lib/aesel-ac.mjs @@ -1,6 +1,6 @@ // aesel-ac.mjs — the Aesthetic Computer engine bridge, for a piece. // -// easel/src/ac-server.mjs without Node. The hosted engine needs no vendor +// aesel/src/ac-server.mjs without Node. The hosted engine needs no vendor // binary: the piece POSTs to aesthetic.computer, which buys the inference and // meters it against the device's @handle, and the reply is a server-sent-event // stream in Anthropic's shape. Nothing runs the agent loop for us, so the loop diff --git a/fedac/native/lib/aesel-bridge.mjs b/fedac/native/lib/aesel-bridge.mjs index 2cfa3c2d49..f2bf3f7f79 100644 --- a/fedac/native/lib/aesel-bridge.mjs +++ b/fedac/native/lib/aesel-bridge.mjs @@ -1,6 +1,6 @@ // aesel-bridge.mjs — the Claude engine bridge, for a piece. // -// This is easel/src/claude-server.mjs with the process taken out. Easel's +// This is aesel/src/claude-server.mjs with the process taken out. Easel's // bridge owns a child process and an event emitter; a native piece has // neither. What it has is a raw PTY that hands it whole lines once a frame // (system.pty2.lines) and a write() for lines going the other way. So this diff --git a/lith/deploy.fish b/lith/deploy.fish index bc88ea1adf..bfa7b425f4 100644 --- a/lith/deploy.fish +++ b/lith/deploy.fish @@ -308,7 +308,7 @@ end # the installer can never point at a version older than the source that shipped # with it. echo -e "$GREEN-> Packing the Easel installer tarball...$NC" -ssh -i $SSH_KEY $LITH_USER@$TARGET_HOST "cd $REMOTE_DIR && node easel/bin/pack.mjs" 2>&1 | tail -2 +ssh -i $SSH_KEY $LITH_USER@$TARGET_HOST "cd $REMOTE_DIR && node aesel/bin/pack.mjs" 2>&1 | tail -2 echo -e "$GREEN-> Refreshing notepat.com.amxd build stream...$NC" if test $SPACES_READY = true diff --git a/plans/published-pieces-in-feeds.md b/plans/published-pieces-in-feeds.md index 90ecf47be0..43b6ae44bf 100644 --- a/plans/published-pieces-in-feeds.md +++ b/plans/published-pieces-in-feeds.md @@ -6,7 +6,7 @@ half of "why don't recent pieces show up on mime". ## What happens today -`publish` — from Easel (`easel/src/publish.mjs`) or the web prompt +`publish` — from Easel (`aesel/src/publish.mjs`) or the web prompt (`bios.mjs:21213`) — does three things and no more: 1. `GET /presigned-upload-url//piece-./user` diff --git a/slab/COMPUTER-USE.md b/slab/COMPUTER-USE.md index 2134994388..36ba185487 100644 --- a/slab/COMPUTER-USE.md +++ b/slab/COMPUTER-USE.md @@ -67,7 +67,7 @@ resolve the intended element, wait until usable, act once, and check the outcome explicit tool allowlists, bounds requests, and never retries lost actions. It is not a general MCP SDK: SSE, OAuth, sessionful servers, and stdio clients are outside this helper's scope. -- `easel/src/computer-use.mjs` adapts that client to a host-selected machine and +- `aesel/src/computer-use.mjs` adapts that client to a host-selected machine and browser target, removing those choices from model-facing schemas and rejecting argument attempts to override them. No tools are enabled by default. @@ -173,13 +173,13 @@ const result = await computer.call("puppet_shot", { fresh: true }); The current engine paths differ: -- `easel/src/app-server.mjs` launches Codex app-server. Actual MCP availability +- `aesel/src/app-server.mjs` launches Codex app-server. Actual MCP availability depends on that host's configuration and runtime policies. -- `easel/src/claude-server.mjs` uses `--strict-mcp-config` and admits Aesel's +- `aesel/src/claude-server.mjs` uses `--strict-mcp-config` and admits Aesel's own `ac` tools. Frame/Puppet are **not inherited** from ordinary Claude config. Integrating them needs an explicit host-selected tool configuration; do not remove strict mode or silently add them to its preapproved read-only tools. -- `easel/src/ac-server.mjs` currently offers `write_piece` only. Its model loop +- `aesel/src/ac-server.mjs` currently offers `write_piece` only. Its model loop and hosted endpoint must explicitly support additional tool schemas and image results before this adapter is connected to hosted inference. - An iPhone's loopback address is the phone, not a fleet Mac. Remote computer use diff --git a/slab/lib/computer-use-client.mjs b/slab/lib/computer-use-client.mjs index 359c577353..e30b036fdc 100644 --- a/slab/lib/computer-use-client.mjs +++ b/slab/lib/computer-use-client.mjs @@ -1 +1 @@ -export * from "../../easel/src/computer-use-client.mjs"; +export * from "../../aesel/src/computer-use-client.mjs"; diff --git a/slab/lib/jev-computer-use.mjs b/slab/lib/jev-computer-use.mjs index 7bfce981ee..79f560525d 100644 --- a/slab/lib/jev-computer-use.mjs +++ b/slab/lib/jev-computer-use.mjs @@ -1 +1 @@ -export * from "../../easel/src/jev-computer-use.mjs"; +export * from "../../aesel/src/jev-computer-use.mjs"; diff --git a/slab/lib/jev-config.mjs b/slab/lib/jev-config.mjs index c323ac26fe..7523bddc17 100644 --- a/slab/lib/jev-config.mjs +++ b/slab/lib/jev-config.mjs @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs'; import { homedir } from 'node:os'; import { join } from 'node:path'; import { parseEnv } from 'node:util'; -import { evaluateChoices } from '../../easel/src/jev-decisions.mjs'; +import { evaluateChoices } from '../../aesel/src/jev-decisions.mjs'; // Loaded only for an explicit decision request. Never attach credentials to // browser state, MCP replies, logs, or the page itself. diff --git a/slab/menubar-swift/Sources/SlabMenubar/PromptPreview.swift b/slab/menubar-swift/Sources/SlabMenubar/PromptPreview.swift index f56ec0c74c..4ff968c3cd 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/PromptPreview.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/PromptPreview.swift @@ -763,7 +763,7 @@ final class PromptPreview { } } - // Mirrors easel/src/frame-capture-script.mjs; no request-supplied JavaScript. + // Mirrors aesel/src/frame-capture-script.mjs; no request-supplied JavaScript. private static let frameCaptureExpression = #""" (()=>{ try { diff --git a/slab/test/computer-use-protocol.test.mjs b/slab/test/computer-use-protocol.test.mjs index 53cd2316cb..b107cbfe31 100644 --- a/slab/test/computer-use-protocol.test.mjs +++ b/slab/test/computer-use-protocol.test.mjs @@ -3,7 +3,7 @@ import assert from "node:assert/strict"; import { spawn } from "node:child_process"; import { createServer } from "node:net"; import { once } from "node:events"; -import { createAeselComputerUse } from "../../easel/src/computer-use.mjs"; +import { createAeselComputerUse } from "../../aesel/src/computer-use.mjs"; for (const name of ["frame", "puppet"]) test(`${name}: stdio and HTTP expose identical guidance, schemas, and errors`, async t => { const messages = [ diff --git a/system/backend/easel-images.mjs b/system/backend/easel-images.mjs index e1866ae256..6f600d7d5f 100644 --- a/system/backend/easel-images.mjs +++ b/system/backend/easel-images.mjs @@ -1,5 +1,5 @@ import sharp from 'sharp'; -import { generate as generateProviderImage, FAL_FLARE } from '../../easel/media/picture/illy.mjs'; +import { generate as generateProviderImage, FAL_FLARE } from '../../aesel/media/picture/illy.mjs'; export const hostedImageModels = Object.freeze({openai: ['gpt-image-2'], fal: [FAL_FLARE]}); export function imageRequest(input) { if (!/^[a-zA-Z0-9_-]{16,80}$/.test(input.jobId || '')) throw new Error('Invalid image job.'); diff --git a/system/backend/easel-transcripts.mjs b/system/backend/easel-transcripts.mjs index d1edc14de8..5ab5259cd4 100644 --- a/system/backend/easel-transcripts.mjs +++ b/system/backend/easel-transcripts.mjs @@ -1,7 +1,7 @@ // Company-private Easel transcripts. Authentication is always server verified; // a configured staff subject allowlist is required for raw reads. import { createHash } from 'node:crypto'; -import { parseTranscript, serializeTranscript, MAX_BATCH_BYTES } from '../../easel/src/transcript-format.mjs'; +import { parseTranscript, serializeTranscript, MAX_BATCH_BYTES } from '../../aesel/src/transcript-format.mjs'; const COLLECTION='easel-transcripts-private'; const DAY=86400000; const ID=/^[a-zA-Z0-9_-]{1,80}$/; diff --git a/system/backend/oskiewar-jev.mjs b/system/backend/oskiewar-jev.mjs index adf0f2d228..641219487f 100644 --- a/system/backend/oskiewar-jev.mjs +++ b/system/backend/oskiewar-jev.mjs @@ -1,5 +1,5 @@ import { randomUUID } from 'node:crypto'; -import { evaluateChoices } from '../../easel/src/jev-decisions.mjs'; +import { evaluateChoices } from '../../aesel/src/jev-decisions.mjs'; import { decisionRequest, buttons } from '../../xbox/live/jev-vs-jev/model.mjs'; export const MATCH_MS = 60_000; diff --git a/toolchain/jev/openrouter.mjs b/toolchain/jev/openrouter.mjs index 7e4a109546..697d10a079 100644 --- a/toolchain/jev/openrouter.mjs +++ b/toolchain/jev/openrouter.mjs @@ -1,2 +1,2 @@ // Shared with the installed Aesel harness. -export { evaluateChoices } from '../../easel/src/jev-decisions.mjs'; +export { evaluateChoices } from '../../aesel/src/jev-decisions.mjs';