create-openagent 0.4.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog — create-openagent
2
2
 
3
+ ## [0.5.0] - 2026-10-12
4
+
5
+ - Pin SDK 0.7.0 and expose soft plush/flat finish and on-face/raised eye controls
6
+ across every family, preserving wearables and real verified-request state.
7
+ - Keep the persisted signer/receiver, restart/replay/revocation behavior and
8
+ loopback-only transport unchanged; qualify the generated HTTP controls with
9
+ the same packed SDK used by browser acceptance.
10
+
3
11
  ## [0.4.0] - 2026-10-12
4
12
 
5
13
  - Pin SDK 0.6.0 and add combinable glasses/headphones controls that preserve the
package/README.md CHANGED
@@ -5,7 +5,7 @@ explicit receiver trust, authenticated HTTP requests and animated avatars run
5
5
  locally without a Life account or a hosted identity service.
6
6
 
7
7
  ```sh
8
- npx create-openagent@0.4.0 my-agent-app --yes
8
+ npx create-openagent@0.5.0 my-agent-app --yes
9
9
  cd my-agent-app
10
10
  npm install
11
11
  npm run dev
@@ -15,7 +15,9 @@ In a second terminal, run `npm run agent`. It signs an actual server-issued
15
15
  challenge; the receiver verifies the signature and current trust and consumes
16
16
  the challenge exactly once. The viewer uses Autos by default, offers all 17 families and 62 kinds with face
17
17
  framing (including SpaceX and holiday characters), and updates from actual verified requests. It uses the same SDK player you can
18
- mount in your own UI.
18
+ mount in your own UI. SDK 0.7.0 adds soft plush as the default finish, flat material
19
+ as an option, and on-face or raised eye placement on every family. Those controls
20
+ keep the selected accessories and actual verified-request state intact.
19
21
 
20
22
  Node 20+ is required. Private keys and receiver state stay in the generated
21
23
  application's ignored local data directory. Preserve this directory across
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import { fileURLToPath } from "url";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "create-openagent",
11
- version: "0.4.0",
11
+ version: "0.5.0",
12
12
  description: "Create a working OpenAgentID app with local identity, real verification and live avatars.",
13
13
  license: "Apache-2.0 OR MIT",
14
14
  author: "L1fe Labs, Inc. <eng@l1fe.ai>",
@@ -155,7 +155,7 @@ function generateStarterTemplate(projectName) {
155
155
  identity: "node src/identity.mjs",
156
156
  test: "node --test test/*.test.mjs"
157
157
  },
158
- dependencies: { "@openagentid/sdk": "0.6.0" }
158
+ dependencies: { "@openagentid/sdk": "0.7.0" }
159
159
  }, null, 2) + "\n" },
160
160
  { path: ".gitignore", content: "node_modules/\n.openagent/\ncoverage/\n.env\n" },
161
161
  { path: "src/workspaces.mjs", content: workspaces },
@@ -433,6 +433,8 @@ var html = String.raw`<!doctype html>
433
433
  <p id="identity"></p><div class="controls"><label>Family <select id="skin"></select></label>
434
434
  <label>Kind <select id="shape"></select></label>
435
435
  <label>Expression <select id="expression"><option value="">Follow actual status</option></select></label></div>
436
+ <div class="controls"><label>Finish <select id="finish"><option value="plush">Soft plush</option><option value="flat">Flat vector</option></select></label>
437
+ <label>Eyes <select id="eye-placement"><option value="face">On face</option><option value="raised">Raised</option></select></label></div>
436
438
  <fieldset><legend>Accessories</legend><div id="accessories" class="controls"></div></fieldset>
437
439
  <p>In another terminal, run:</p><pre>npm run agent -- "Hello from my agent"</pre>
438
440
  <p>This viewer is read-only. A completed request appears after the receiver verifies a fresh signed proof.</p>
@@ -444,6 +446,8 @@ var viewer = String.raw`import { mountCharacter, getCharacterExpressions, getCha
444
446
 
445
447
  const skin = document.querySelector('#skin');
446
448
  const shape = document.querySelector('#shape');
449
+ const finish = document.querySelector('#finish');
450
+ const eyePlacement = document.querySelector('#eye-placement');
447
451
  const catalog = getCharacterSkins();
448
452
  const accessories = document.querySelector('#accessories');
449
453
  const selectedAccessories = () => Array.from(accessories.querySelectorAll('input:checked'), input => input.value);
@@ -469,6 +473,8 @@ for (const value of getCharacterExpressions()) {
469
473
  let player, did, revision = -1, latestStatus = 'idle', stopped = false, timer;
470
474
  skin.addEventListener('change', () => { kinds(); player?.setAppearance({ skin: skin.value }); });
471
475
  shape.addEventListener('change', () => player?.setAppearance({ shape: shape.value || null }));
476
+ finish.addEventListener('change', () => player?.setAppearance({ finish: finish.value }));
477
+ eyePlacement.addEventListener('change', () => player?.setAppearance({ eyePlacement: eyePlacement.value }));
472
478
  accessories.addEventListener('change', () => player?.setAppearance({ accessories: selectedAccessories() }));
473
479
  expression.addEventListener('change', () => player?.update({ status: latestStatus, expression: expression.value || null }));
474
480
  async function refresh() {
@@ -481,7 +487,7 @@ async function refresh() {
481
487
  !['idle', 'working', 'success'].includes(state.status) || !Number.isSafeInteger(state.completedRequests) || state.completedRequests < 0) throw new Error('Invalid receiver state.');
482
488
  if (!player || state.did !== did) {
483
489
  player?.dispose(); document.querySelector('#avatar').replaceChildren();
484
- did = state.did; player = mountCharacter(document.querySelector('#avatar'), did, { skin: skin.value, accessories: selectedAccessories(), ...(shape.value ? { shape: shape.value } : {}), size: 280, reducedMotion: 'system' });
490
+ did = state.did; player = mountCharacter(document.querySelector('#avatar'), did, { skin: skin.value, finish: finish.value, eyePlacement: eyePlacement.value, accessories: selectedAccessories(), ...(shape.value ? { shape: shape.value } : {}), size: 280, reducedMotion: 'system' });
485
491
  identity.textContent = did; revision = -1;
486
492
  }
487
493
  if (state.revision !== revision) {
@@ -502,7 +508,7 @@ Requires Node 20+. Run npm install, then npm run dev. Open the numeric loopback
502
508
 
503
509
  npm run agent -- "Hello from my agent"
504
510
 
505
- The command obtains a receiver-issued challenge, signs it with a persisted Ed25519 key, and sends a proof. After verification, the receiver hashes and echoes the message. The browser shows the real completed-request count, animated Autos by default, 16 optional families (including SpaceX and seasonal characters), distinct kinds, face framing, combinable glasses/headphones and selectable expressions. It does not simulate work or broadcast runtime state elsewhere. Reduced motion follows your browser preference.
511
+ The command obtains a receiver-issued challenge, signs it with a persisted Ed25519 key, and sends a proof. After verification, the receiver hashes and echoes the message. The browser shows the real completed-request count, animated Autos by default, 16 optional families (including SpaceX and seasonal characters), distinct kinds, face framing, combinable glasses/headphones, soft plush by default with a flat-vector option, on-face or raised eyes and selectable expressions. It does not simulate work or broadcast runtime state elsewhere. Reduced motion follows your browser preference.
506
512
 
507
513
  On first setup, src/workspaces.mjs creates two separate local authorities, persists a unique receiver audience and explicitly imports the signer's public DID/key document into the receiver with trustIdentity. The receiver has no signing key for that agent. The public export is .openagent/identity.json. Private keys, challenge and replay state remain under .openagent/ and are excluded from git. Inspect public identity with npm run identity -- export. Never publish .openagent/ or serve it as static assets.
508
514
 
@@ -646,6 +652,12 @@ test('host, browser-origin, closed-schema and private/static paths are refused',
646
652
  const markup = await viewer.text();
647
653
  assert.match(markup, /<select id="skin"><\/select>/);
648
654
  assert.match(markup, /<select id="shape"><\/select>/);
655
+ assert.match(markup, /<select id="finish"><option value="plush">Soft plush<\/option><option value="flat">Flat vector<\/option>/);
656
+ assert.match(markup, /<select id="eye-placement"><option value="face">On face<\/option><option value="raised">Raised<\/option>/);
657
+ const viewerScript = await (await fetch(f.app.url + '/viewer.js')).text();
658
+ assert.match(viewerScript, /setAppearance\(\{ finish: finish.value \}\)/);
659
+ assert.match(viewerScript, /setAppearance\(\{ eyePlacement: eyePlacement.value \}\)/);
660
+ assert.match(viewerScript, /skin: skin.value, finish: finish.value, eyePlacement: eyePlacement.value, accessories: selectedAccessories\(\)/);
649
661
  const script = await fetch(f.app.url + '/character-player.js');
650
662
  assert.equal(script.status, 200); assert.match(await script.text(), /mountCharacter/);
651
663
  const huge = await post(f.app, '/request', { value: 'x'.repeat(25000) }); assert.equal(huge.status, 413);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-openagent",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Create a working OpenAgentID app with local identity, real verification and live avatars.",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "author": "L1fe Labs, Inc. <eng@l1fe.ai>",