create-openagent 0.3.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 +13 -0
- package/README.md +4 -2
- package/dist/index.js +27 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
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
|
+
|
|
11
|
+
## [0.4.0] - 2026-10-12
|
|
12
|
+
|
|
13
|
+
- Pin SDK 0.6.0 and add combinable glasses/headphones controls that preserve the
|
|
14
|
+
real receiver status, selected character family and animated eye nodes.
|
|
15
|
+
|
|
3
16
|
|
|
4
17
|
## [0.3.0] - 2026-10-12
|
|
5
18
|
|
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.
|
|
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.
|
|
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.
|
|
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,17 +433,29 @@ 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>
|
|
438
|
+
<fieldset><legend>Accessories</legend><div id="accessories" class="controls"></div></fieldset>
|
|
436
439
|
<p>In another terminal, run:</p><pre>npm run agent -- "Hello from my agent"</pre>
|
|
437
440
|
<p>This viewer is read-only. A completed request appears after the receiver verifies a fresh signed proof.</p>
|
|
438
441
|
<p>Keys stay on this computer. No account or identity service is required.</p></main></body></html>
|
|
439
442
|
`;
|
|
440
|
-
var css = String.raw`:root{font-family:system-ui,sans-serif;color:#ecf0f5;background:#10151c;color-scheme:dark}body{margin:0}main{max-width:760px;margin:0 auto;padding:48px 24px}h1{font-size:clamp(2rem,6vw,3.8rem);letter-spacing:-.05em;margin:12px 0}p{line-height:1.6;color:#bdc8d6}.eyebrow{font-size:.85rem;letter-spacing:.1em;text-transform:uppercase}#avatar{height:300px;display:flex;align-items:center;justify-content:center;margin:12px 0}#avatar svg{max-width:100%;height:280px;border-radius:50%;overflow:hidden}#identity{font-family:monospace;font-size:.85rem;overflow-wrap:anywhere}.controls{display:flex;gap:24px;flex-wrap:wrap}label{display:flex;gap:10px;align-items:center}select{appearance:none;padding:8px 38px 8px 12px;border-radius:8px;background-color:#222d3b;background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:right 17px center,right 12px center;background-size:5px 5px;background-repeat:no-repeat;color:inherit;border:1px solid #516176}@media(forced-colors:active){select{appearance:auto;background-image:none}}pre{padding:18px;white-space:pre-wrap;background:#1b2532;border-radius:12px;border:1px solid #344458}#status{font-weight:600;color:#fff}
|
|
443
|
+
var css = String.raw`:root{font-family:system-ui,sans-serif;color:#ecf0f5;background:#10151c;color-scheme:dark}body{margin:0}main{max-width:760px;margin:0 auto;padding:48px 24px}h1{font-size:clamp(2rem,6vw,3.8rem);letter-spacing:-.05em;margin:12px 0}p{line-height:1.6;color:#bdc8d6}.eyebrow{font-size:.85rem;letter-spacing:.1em;text-transform:uppercase}#avatar{height:300px;display:flex;align-items:center;justify-content:center;margin:12px 0}#avatar svg{max-width:100%;height:280px;border-radius:50%;overflow:hidden}#identity{font-family:monospace;font-size:.85rem;overflow-wrap:anywhere}.controls{display:flex;gap:24px;flex-wrap:wrap}label{display:flex;gap:10px;align-items:center}fieldset{border:0;margin:24px 0;padding:0;min-width:0}legend{padding:0;margin-bottom:12px}input[type=checkbox]{width:18px;height:18px;accent-color:#1687ff}select{appearance:none;padding:8px 38px 8px 12px;border-radius:8px;background-color:#222d3b;background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:right 17px center,right 12px center;background-size:5px 5px;background-repeat:no-repeat;color:inherit;border:1px solid #516176}@media(forced-colors:active){select{appearance:auto;background-image:none}}pre{padding:18px;white-space:pre-wrap;background:#1b2532;border-radius:12px;border:1px solid #344458}#status{font-weight:600;color:#fff}
|
|
441
444
|
`;
|
|
442
|
-
var viewer = String.raw`import { mountCharacter, getCharacterExpressions, getCharacterSkins } from '/character-player.js';
|
|
445
|
+
var viewer = String.raw`import { mountCharacter, getCharacterExpressions, getCharacterSkins, getCharacterAccessories } from '/character-player.js';
|
|
443
446
|
|
|
444
447
|
const skin = document.querySelector('#skin');
|
|
445
448
|
const shape = document.querySelector('#shape');
|
|
449
|
+
const finish = document.querySelector('#finish');
|
|
450
|
+
const eyePlacement = document.querySelector('#eye-placement');
|
|
446
451
|
const catalog = getCharacterSkins();
|
|
452
|
+
const accessories = document.querySelector('#accessories');
|
|
453
|
+
const selectedAccessories = () => Array.from(accessories.querySelectorAll('input:checked'), input => input.value);
|
|
454
|
+
for (const accessory of getCharacterAccessories()) {
|
|
455
|
+
const label = document.createElement('label');
|
|
456
|
+
const input = document.createElement('input'); input.type = 'checkbox'; input.value = accessory.id;
|
|
457
|
+
label.append(input, document.createTextNode(accessory.label)); accessories.append(label);
|
|
458
|
+
}
|
|
447
459
|
const display = value => value.replaceAll('-', ' ').replace(/^./, letter => letter.toUpperCase());
|
|
448
460
|
skin.replaceChildren(...catalog.map(entry => new Option(entry.label, entry.id)));
|
|
449
461
|
skin.value = 'autos';
|
|
@@ -461,6 +473,9 @@ for (const value of getCharacterExpressions()) {
|
|
|
461
473
|
let player, did, revision = -1, latestStatus = 'idle', stopped = false, timer;
|
|
462
474
|
skin.addEventListener('change', () => { kinds(); player?.setAppearance({ skin: skin.value }); });
|
|
463
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 }));
|
|
478
|
+
accessories.addEventListener('change', () => player?.setAppearance({ accessories: selectedAccessories() }));
|
|
464
479
|
expression.addEventListener('change', () => player?.update({ status: latestStatus, expression: expression.value || null }));
|
|
465
480
|
async function refresh() {
|
|
466
481
|
try {
|
|
@@ -472,7 +487,7 @@ async function refresh() {
|
|
|
472
487
|
!['idle', 'working', 'success'].includes(state.status) || !Number.isSafeInteger(state.completedRequests) || state.completedRequests < 0) throw new Error('Invalid receiver state.');
|
|
473
488
|
if (!player || state.did !== did) {
|
|
474
489
|
player?.dispose(); document.querySelector('#avatar').replaceChildren();
|
|
475
|
-
did = state.did; player = mountCharacter(document.querySelector('#avatar'), did, { skin: skin.value, ...(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' });
|
|
476
491
|
identity.textContent = did; revision = -1;
|
|
477
492
|
}
|
|
478
493
|
if (state.revision !== revision) {
|
|
@@ -493,7 +508,7 @@ Requires Node 20+. Run npm install, then npm run dev. Open the numeric loopback
|
|
|
493
508
|
|
|
494
509
|
npm run agent -- "Hello from my agent"
|
|
495
510
|
|
|
496
|
-
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 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.
|
|
497
512
|
|
|
498
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.
|
|
499
514
|
|
|
@@ -637,6 +652,12 @@ test('host, browser-origin, closed-schema and private/static paths are refused',
|
|
|
637
652
|
const markup = await viewer.text();
|
|
638
653
|
assert.match(markup, /<select id="skin"><\/select>/);
|
|
639
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\(\)/);
|
|
640
661
|
const script = await fetch(f.app.url + '/character-player.js');
|
|
641
662
|
assert.equal(script.status, 200); assert.match(await script.text(), /mountCharacter/);
|
|
642
663
|
const huge = await post(f.app, '/request', { value: 'x'.repeat(25000) }); assert.equal(huge.status, 413);
|
package/package.json
CHANGED