@volter/world 3.0.176 → 3.0.177

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.
@@ -13,7 +13,7 @@ You need Node 22.6+, npm and registry access during installation. The browser pa
13
13
  Copy this starter into a new folder:
14
14
 
15
15
  ```console
16
- $ npx @volter/world@3.0.176 example customer-onboarding --dir onboarding
16
+ $ npx @volter/world@3.0.177 example customer-onboarding --dir onboarding
17
17
  $ cd onboarding
18
18
  $ npm install
19
19
  ```
@@ -11,12 +11,12 @@
11
11
  "pg": "8.16.3"
12
12
  },
13
13
  "devDependencies": {
14
- "@volter/world": "3.0.176",
15
- "@volter/world-core": "3.0.159",
16
- "@volter/world-runtime": "3.0.173",
14
+ "@volter/world": "3.0.177",
15
+ "@volter/world-core": "3.0.160",
16
+ "@volter/world-runtime": "3.0.174",
17
17
  "@volter/world-console": "3.0.153",
18
18
  "@volter/twin-stripe": "3.0.2",
19
19
  "@volter/twin-resend": "1.0.1",
20
- "@volter/world-ui": "1.0.159"
20
+ "@volter/world-ui": "1.0.160"
21
21
  }
22
22
  }
@@ -13,7 +13,7 @@ Give two workers the same Stripe baseline, let them change different existing cu
13
13
  Use an empty parent folder. Create the baseline starter there:
14
14
 
15
15
  ```console
16
- $ npx @volter/world@3.0.176 example integration-branches --dir baseline
16
+ $ npx @volter/world@3.0.177 example integration-branches --dir baseline
17
17
  $ cd baseline
18
18
  $ npm install
19
19
  $ ./node_modules/.bin/volter world init --name baseline --twins stripe
@@ -38,9 +38,9 @@ The stopped baseline retains its history and can supply local path remotes. Defa
38
38
  Create three more copies in the same parent folder:
39
39
 
40
40
  ```console
41
- $ npx @volter/world@3.0.176 example integration-branches --dir integration
42
- $ npx @volter/world@3.0.176 example integration-branches --dir worker-a
43
- $ npx @volter/world@3.0.176 example integration-branches --dir worker-b
41
+ $ npx @volter/world@3.0.177 example integration-branches --dir integration
42
+ $ npx @volter/world@3.0.177 example integration-branches --dir worker-a
43
+ $ npx @volter/world@3.0.177 example integration-branches --dir worker-b
44
44
  ```
45
45
 
46
46
  In `integration`, then `worker-a`, then `worker-b`, install dependencies and initialize with the folder's name. Before a first boot or app write, link and pull the baseline:
@@ -9,11 +9,11 @@
9
9
  "stripe": "17.7.0"
10
10
  },
11
11
  "devDependencies": {
12
- "@volter/world": "3.0.176",
13
- "@volter/world-core": "3.0.159",
14
- "@volter/world-runtime": "3.0.173",
12
+ "@volter/world": "3.0.177",
13
+ "@volter/world-core": "3.0.160",
14
+ "@volter/world-runtime": "3.0.174",
15
15
  "@volter/world-console": "3.0.153",
16
16
  "@volter/twin-stripe": "3.0.2",
17
- "@volter/world-ui": "1.0.159"
17
+ "@volter/world-ui": "1.0.160"
18
18
  }
19
19
  }
@@ -19,7 +19,7 @@ A catalog page may select a newer default. Keep this example's manifest and inst
19
19
  together; its recorded workflow does not establish behavior for a different release.
20
20
 
21
21
  ```console
22
- $ npx @volter/world@3.0.176 example workplace-agent --dir workplace
22
+ $ npx @volter/world@3.0.177 example workplace-agent --dir workplace
23
23
  $ cd workplace
24
24
  $ npm install
25
25
  $ ./node_modules/.bin/volter world init --name workplace --twins github,linear,slack
@@ -11,13 +11,13 @@
11
11
  "@slack/web-api": "7.19.0"
12
12
  },
13
13
  "devDependencies": {
14
- "@volter/world": "3.0.176",
15
- "@volter/world-core": "3.0.159",
16
- "@volter/world-runtime": "3.0.173",
14
+ "@volter/world": "3.0.177",
15
+ "@volter/world-core": "3.0.160",
16
+ "@volter/world-runtime": "3.0.174",
17
17
  "@volter/world-console": "3.0.153",
18
18
  "@volter/twin-github": "3.0.9",
19
19
  "@volter/twin-linear": "3.0.5",
20
20
  "@volter/twin-slack": "3.0.8",
21
- "@volter/world-ui": "1.0.159"
21
+ "@volter/world-ui": "1.0.160"
22
22
  }
23
23
  }
package/dist/src/cli.js CHANGED
@@ -9,6 +9,7 @@ import { fileURLToPath } from 'node:url';
9
9
  import { spawn, spawnSync } from 'node:child_process';
10
10
  import { createHash } from 'node:crypto';
11
11
  import { hostname } from 'node:os';
12
+ import { inWorldHistory, isWorldPerson, shownPersonFields } from '@volter/world-core/runtime';
12
13
  import { existsSync } from 'node:fs';
13
14
  import { join, relative, resolve } from 'node:path';
14
15
  import { forgetPlatform, forgetToken, platformOrigin, storePlatform, storeToken, tokenFor } from "./credentials.js";
@@ -291,8 +292,9 @@ async function worldCommand(verb, args) {
291
292
  }
292
293
  case 'log': {
293
294
  const rows = world.log();
295
+ // (a person's password hash is shown as set: ADR 0025)
294
296
  if (asJson) {
295
- json(rows);
297
+ json(rows.map((r) => isWorldPerson(r) && r.fields ? { ...r, fields: shownPersonFields(r.fields) } : r));
296
298
  return;
297
299
  }
298
300
  if (rows.length === 0) {
@@ -312,10 +314,10 @@ async function worldCommand(verb, args) {
312
314
  case 'diff': {
313
315
  const delta = world.diff(value(args, '--base'));
314
316
  if (asJson) {
315
- json(delta);
317
+ json({ ...delta, actions: delta.actions.map((a) => isWorldPerson(a.action) && a.action.fields ? { ...a, action: { ...a.action, fields: shownPersonFields(a.action.fields) } } : a) });
316
318
  return;
317
319
  }
318
- const changes = delta.actions.filter((a) => !a.action.subject.type.startsWith('_'));
320
+ const changes = delta.actions.filter((a) => inWorldHistory(a.action));
319
321
  out(`${changes.length} change${changes.length === 1 ? '' : 's'} since ${value(args, '--base') ? delta.base.id : world.diffBase()}`);
320
322
  for (const v of delta.vendors)
321
323
  out(` ${v.service}: ${v.count} change${v.count === 1 ? '' : 's'}`);
@@ -11,7 +11,7 @@ export declare class TwinLog {
11
11
  readonly stateService: string;
12
12
  readonly root: string;
13
13
  constructor(service: string, stateService: string, root: string);
14
- /** this branch's own entries, bookkeeping aside */
14
+ /** this branch's own entries, bookkeeping aside but the World's people (ADR 0025) */
15
15
  log(): TwinAction[];
16
16
  /** entries the parent does not hold */
17
17
  unpushed(opts?: {
package/dist/src/world.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // way git finds its repository; every method is a name for a world-runtime verb, in the words a
4
4
  // user reads. The `volter` command is one client of this class and adds nothing.
5
5
  import { platformPerson } from "./credentials.js";
6
- import { rebaseChangeset, worldBootMarker, listActions, isTwinBookkeeping, pushablePendingActions, pendingActions, applyTwinWrite, twinResources } from '@volter/world-core/runtime';
6
+ import { rebaseChangeset, worldBootMarker, listActions, inWorldHistory, pushablePendingActions, pendingActions, applyTwinWrite, twinResources } from '@volter/world-core/runtime';
7
7
  import { spawnSync } from 'node:child_process';
8
8
  import clockForm from '@volter/world-core/world-clock';
9
9
  import { activateScript, approveWorldChangeset, branchWorld, clockFile, checkoutWorld, createWorldChangeset, diffWorld, downWorld, fetchFromOrigin, findWorldChangeset, initWorld, listWorldChangesets, listWorldMarks, listWorlds, markWorld, pushWorldChangeset, rebaseWorldChangeset, replayWorldChangeset, resetWorld, runWithWorldEnv, seedServedWorld, seedWorld, shellWorld, materializeBrowserFiles, statusWorld, statusWorldChangeset, upWorld, verifyWorldChangeset, worldLedgers, worldOrigin, bindLegacyCredentials, deployWorld, loadWorldConfig, writeWorldConfig, readServeRecord, refreshTwin, serveWorld, serveWorldView, findInstalledPackage, rootForControlRoot, sealTwinCredential, sealedCredentialInfo, setTwinRoot, credentialPayloadFrom, rootCredentialInput, withoutVaultSignIn, materializeRoots, instanceDir, worldChangesetRules } from '@volter/world-runtime';
@@ -30,8 +30,8 @@ export class TwinLog {
30
30
  this.stateService = stateService;
31
31
  this.root = root;
32
32
  }
33
- /** this branch's own entries, bookkeeping aside */
34
- log() { return listActions(this.stateService, this.root).filter((a) => !isTwinBookkeeping(a)); }
33
+ /** this branch's own entries, bookkeeping aside but the World's people (ADR 0025) */
34
+ log() { return listActions(this.stateService, this.root).filter((a) => inWorldHistory(a)); }
35
35
  /** entries the parent does not hold */
36
36
  unpushed(opts = {}) { return opts.pushable ? pushablePendingActions(this.stateService, this.root) : pendingActions(this.stateService, this.root); }
37
37
  /** the tree: this twin's resources as a read sees them */
@@ -231,7 +231,7 @@ export class World {
231
231
  continue;
232
232
  if (e.provenance === 'placeholder')
233
233
  continue;
234
- if (e.op !== 'set' || !e.fields || e.subject.type.startsWith('_'))
234
+ if (e.op !== 'set' || !e.fields || !inWorldHistory(e))
235
235
  continue;
236
236
  rows.push({ ...e, service: repo.service, ...(e.receipt ? { landed: e.receipt } : {}), ...(positionOf.has(e.id) ? { position: positionOf.get(e.id) } : {}) });
237
237
  }
@@ -13,7 +13,7 @@ You need Node 22.6+, npm and registry access during installation. The browser pa
13
13
  Copy this starter into a new folder:
14
14
 
15
15
  ```console
16
- $ npx @volter/world@3.0.176 example customer-onboarding --dir onboarding
16
+ $ npx @volter/world@3.0.177 example customer-onboarding --dir onboarding
17
17
  $ cd onboarding
18
18
  $ npm install
19
19
  ```
@@ -11,12 +11,12 @@
11
11
  "pg": "8.16.3"
12
12
  },
13
13
  "devDependencies": {
14
- "@volter/world": "3.0.176",
15
- "@volter/world-core": "3.0.159",
16
- "@volter/world-runtime": "3.0.173",
14
+ "@volter/world": "3.0.177",
15
+ "@volter/world-core": "3.0.160",
16
+ "@volter/world-runtime": "3.0.174",
17
17
  "@volter/world-console": "3.0.153",
18
18
  "@volter/twin-stripe": "3.0.2",
19
19
  "@volter/twin-resend": "1.0.1",
20
- "@volter/world-ui": "1.0.159"
20
+ "@volter/world-ui": "1.0.160"
21
21
  }
22
22
  }
@@ -13,7 +13,7 @@ Give two workers the same Stripe baseline, let them change different existing cu
13
13
  Use an empty parent folder. Create the baseline starter there:
14
14
 
15
15
  ```console
16
- $ npx @volter/world@3.0.176 example integration-branches --dir baseline
16
+ $ npx @volter/world@3.0.177 example integration-branches --dir baseline
17
17
  $ cd baseline
18
18
  $ npm install
19
19
  $ ./node_modules/.bin/volter world init --name baseline --twins stripe
@@ -38,9 +38,9 @@ The stopped baseline retains its history and can supply local path remotes. Defa
38
38
  Create three more copies in the same parent folder:
39
39
 
40
40
  ```console
41
- $ npx @volter/world@3.0.176 example integration-branches --dir integration
42
- $ npx @volter/world@3.0.176 example integration-branches --dir worker-a
43
- $ npx @volter/world@3.0.176 example integration-branches --dir worker-b
41
+ $ npx @volter/world@3.0.177 example integration-branches --dir integration
42
+ $ npx @volter/world@3.0.177 example integration-branches --dir worker-a
43
+ $ npx @volter/world@3.0.177 example integration-branches --dir worker-b
44
44
  ```
45
45
 
46
46
  In `integration`, then `worker-a`, then `worker-b`, install dependencies and initialize with the folder's name. Before a first boot or app write, link and pull the baseline:
@@ -9,11 +9,11 @@
9
9
  "stripe": "17.7.0"
10
10
  },
11
11
  "devDependencies": {
12
- "@volter/world": "3.0.176",
13
- "@volter/world-core": "3.0.159",
14
- "@volter/world-runtime": "3.0.173",
12
+ "@volter/world": "3.0.177",
13
+ "@volter/world-core": "3.0.160",
14
+ "@volter/world-runtime": "3.0.174",
15
15
  "@volter/world-console": "3.0.153",
16
16
  "@volter/twin-stripe": "3.0.2",
17
- "@volter/world-ui": "1.0.159"
17
+ "@volter/world-ui": "1.0.160"
18
18
  }
19
19
  }
@@ -19,7 +19,7 @@ A catalog page may select a newer default. Keep this example's manifest and inst
19
19
  together; its recorded workflow does not establish behavior for a different release.
20
20
 
21
21
  ```console
22
- $ npx @volter/world@3.0.176 example workplace-agent --dir workplace
22
+ $ npx @volter/world@3.0.177 example workplace-agent --dir workplace
23
23
  $ cd workplace
24
24
  $ npm install
25
25
  $ ./node_modules/.bin/volter world init --name workplace --twins github,linear,slack
@@ -11,13 +11,13 @@
11
11
  "@slack/web-api": "7.19.0"
12
12
  },
13
13
  "devDependencies": {
14
- "@volter/world": "3.0.176",
15
- "@volter/world-core": "3.0.159",
16
- "@volter/world-runtime": "3.0.173",
14
+ "@volter/world": "3.0.177",
15
+ "@volter/world-core": "3.0.160",
16
+ "@volter/world-runtime": "3.0.174",
17
17
  "@volter/world-console": "3.0.153",
18
18
  "@volter/twin-github": "3.0.9",
19
19
  "@volter/twin-linear": "3.0.5",
20
20
  "@volter/twin-slack": "3.0.8",
21
- "@volter/world-ui": "1.0.159"
21
+ "@volter/world-ui": "1.0.160"
22
22
  }
23
23
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/world",
3
- "version": "3.0.176",
3
+ "version": "3.0.177",
4
4
  "description": "Run your app against a world of twins. `World` and `Repo` — one method per verb: init, up, run, log, diff, reset, branch, checkout, clone, fetch, changeset, push — and the `volter` command, one client of them.",
5
5
  "keywords": [
6
6
  "volter",
@@ -31,8 +31,8 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "^1.30.1",
34
- "@volter/world-core": "3.0.159",
35
- "@volter/world-runtime": "3.0.173",
34
+ "@volter/world-core": "3.0.160",
35
+ "@volter/world-runtime": "3.0.174",
36
36
  "zod": "^4.6.5"
37
37
  },
38
38
  "peerDependencies": {
package/src/cli.ts CHANGED
@@ -9,7 +9,7 @@ import { fileURLToPath } from 'node:url';
9
9
  import { spawn, spawnSync } from 'node:child_process';
10
10
  import { createHash } from 'node:crypto';
11
11
  import { hostname } from 'node:os';
12
- import { formatLedgerDelta } from '@volter/world-core/runtime';
12
+ import { formatLedgerDelta, inWorldHistory, isWorldPerson, shownPersonFields } from '@volter/world-core/runtime';
13
13
  import { existsSync } from 'node:fs';
14
14
  import { join, relative, resolve } from 'node:path';
15
15
  import { forgetPlatform, forgetToken, platformOrigin, requireToken, storePlatform, storeToken, tokenFor } from './credentials.ts';
@@ -242,7 +242,8 @@ async function worldCommand(verb: string, args: string[]): Promise<void> {
242
242
  }
243
243
  case 'log': {
244
244
  const rows = world.log();
245
- if (asJson) { json(rows); return; }
245
+ // (a person's password hash is shown as set: ADR 0025)
246
+ if (asJson) { json(rows.map((r) => isWorldPerson(r) && r.fields ? { ...r, fields: shownPersonFields(r.fields) } : r)); return; }
246
247
  if (rows.length === 0) { out('(no changes yet)'); return; }
247
248
  const withReceipts = flag(args, '--receipts');
248
249
  for (const r of rows) {
@@ -256,8 +257,8 @@ async function worldCommand(verb: string, args: string[]): Promise<void> {
256
257
  }
257
258
  case 'diff': {
258
259
  const delta = world.diff(value(args, '--base'));
259
- if (asJson) { json(delta); return; }
260
- const changes = delta.actions.filter((a) => !a.action.subject.type.startsWith('_'));
260
+ if (asJson) { json({ ...delta, actions: delta.actions.map((a) => isWorldPerson(a.action) && a.action.fields ? { ...a, action: { ...a.action, fields: shownPersonFields(a.action.fields) } } : a) }); return; }
261
+ const changes = delta.actions.filter((a) => inWorldHistory(a.action));
261
262
  out(`${changes.length} change${changes.length === 1 ? '' : 's'} since ${value(args, '--base') ? delta.base.id : world.diffBase()}`);
262
263
  for (const v of delta.vendors) out(` ${v.service}: ${v.count} change${v.count === 1 ? '' : 's'}`);
263
264
  return;
package/src/world.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // way git finds its repository; every method is a name for a world-runtime verb, in the words a
4
4
  // user reads. The `volter` command is one client of this class and adds nothing.
5
5
  import { platformPerson } from './credentials.ts';
6
- import { rebaseChangeset, worldBootMarker, type Changeset, type ChangesetApplication, type LedgerDelta, type PerformAction, type RemoteExecute, type TwinAction, type WorldMarker, type ApplyReceipt, listActions, isTwinBookkeeping, pushablePendingActions, pendingActions, applyTwinWrite, twinResources, type TwinResource } from '@volter/world-core/runtime';
6
+ import { rebaseChangeset, worldBootMarker, type Changeset, type ChangesetApplication, type LedgerDelta, type PerformAction, type RemoteExecute, type TwinAction, type WorldMarker, type ApplyReceipt, listActions, inWorldHistory, pushablePendingActions, pendingActions, applyTwinWrite, twinResources, type TwinResource } from '@volter/world-core/runtime';
7
7
  import { spawnSync } from 'node:child_process';
8
8
  import clockForm from '@volter/world-core/world-clock';
9
9
  import {
@@ -32,8 +32,8 @@ function durationMs(by: string): number {
32
32
 
33
33
  export class TwinLog {
34
34
  constructor(readonly service: string, readonly stateService: string, readonly root: string) {}
35
- /** this branch's own entries, bookkeeping aside */
36
- log(): TwinAction[] { return listActions(this.stateService, this.root).filter((a) => !isTwinBookkeeping(a)); }
35
+ /** this branch's own entries, bookkeeping aside but the World's people (ADR 0025) */
36
+ log(): TwinAction[] { return listActions(this.stateService, this.root).filter((a) => inWorldHistory(a)); }
37
37
  /** entries the parent does not hold */
38
38
  unpushed(opts: { pushable?: boolean } = {}): TwinAction[] { return opts.pushable ? pushablePendingActions(this.stateService, this.root) : pendingActions(this.stateService, this.root); }
39
39
  /** the tree: this twin's resources as a read sees them */
@@ -222,7 +222,7 @@ export class World {
222
222
  if (e.landsId && own.has(e.landsId)) continue;
223
223
  if (own.has(e.id)) continue;
224
224
  if (e.provenance === 'placeholder') continue;
225
- if (e.op !== 'set' || !e.fields || e.subject.type.startsWith('_')) continue;
225
+ if (e.op !== 'set' || !e.fields || !inWorldHistory(e as unknown as TwinAction)) continue;
226
226
  rows.push({ ...(e as unknown as TwinAction), service: repo.service, ...(e.receipt ? { landed: e.receipt } : {}), ...(positionOf.has(e.id) ? { position: positionOf.get(e.id)! } : {}) });
227
227
  }
228
228
  for (const action of repo.log()) {