@volter/world 3.0.175 → 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.
- package/dist/examples/customer-onboarding/README.md +1 -1
- package/dist/examples/customer-onboarding/package.json +4 -4
- package/dist/examples/integration-branches/README.md +4 -4
- package/dist/examples/integration-branches/package.json +4 -4
- package/dist/examples/workplace-agent/README.md +1 -1
- package/dist/examples/workplace-agent/package.json +4 -4
- package/dist/src/cli.js +5 -3
- package/dist/src/world.d.ts +1 -1
- package/dist/src/world.js +4 -4
- package/examples/customer-onboarding/README.md +1 -1
- package/examples/customer-onboarding/package.json +4 -4
- package/examples/integration-branches/README.md +4 -4
- package/examples/integration-branches/package.json +4 -4
- package/examples/workplace-agent/README.md +1 -1
- package/examples/workplace-agent/package.json +4 -4
- package/package.json +3 -3
- package/src/cli.ts +5 -4
- package/src/world.ts +4 -4
|
@@ -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.
|
|
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.
|
|
15
|
-
"@volter/world-core": "3.0.
|
|
16
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
42
|
-
$ npx @volter/world@3.0.
|
|
43
|
-
$ npx @volter/world@3.0.
|
|
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.
|
|
13
|
-
"@volter/world-core": "3.0.
|
|
14
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
15
|
-
"@volter/world-core": "3.0.
|
|
16
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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) =>
|
|
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'}`);
|
package/dist/src/world.d.ts
CHANGED
|
@@ -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,
|
|
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) =>
|
|
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
|
|
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.
|
|
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.
|
|
15
|
-
"@volter/world-core": "3.0.
|
|
16
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
42
|
-
$ npx @volter/world@3.0.
|
|
43
|
-
$ npx @volter/world@3.0.
|
|
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.
|
|
13
|
-
"@volter/world-core": "3.0.
|
|
14
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
15
|
-
"@volter/world-core": "3.0.
|
|
16
|
-
"@volter/world-runtime": "3.0.
|
|
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.
|
|
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.
|
|
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.
|
|
35
|
-
"@volter/world-runtime": "3.0.
|
|
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
|
-
|
|
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) =>
|
|
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,
|
|
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) =>
|
|
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
|
|
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()) {
|