@volter/world 3.0.145 → 3.0.146
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 +20 -20
- package/dist/examples/customer-onboarding/package.json +4 -4
- package/dist/examples/integration-branches/README.md +32 -32
- package/dist/examples/integration-branches/package.json +4 -4
- package/dist/examples/workplace-agent/README.md +19 -19
- package/dist/examples/workplace-agent/package.json +4 -4
- package/dist/src/agent-prompt.js +1 -1
- package/examples/customer-onboarding/README.md +20 -20
- package/examples/customer-onboarding/package.json +4 -4
- package/examples/integration-branches/README.md +32 -32
- package/examples/integration-branches/package.json +4 -4
- package/examples/workplace-agent/README.md +19 -19
- package/examples/workplace-agent/package.json +4 -4
- package/package.json +5 -5
- package/src/agent-prompt.ts +1 -1
|
@@ -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.146 example customer-onboarding --dir onboarding
|
|
17
17
|
$ cd onboarding
|
|
18
18
|
$ npm install
|
|
19
19
|
```
|
|
@@ -23,7 +23,7 @@ The command copies source; it neither installs dependencies nor starts a World.
|
|
|
23
23
|
Read [onboarding.mjs](./onboarding.mjs) for the application and [run.mjs](./run.mjs) for the command entry. Empty keys in [.env.example](./.env.example) tell init what the app reads; init supplies throwaway credentials. Do not add real keys.
|
|
24
24
|
|
|
25
25
|
```console
|
|
26
|
-
$
|
|
26
|
+
$ ./node_modules/.bin/volter world init --name onboarding --twins stripe,resend
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Review Stripe and Resend's exact sources in `.volter/world.json`. The `pg` dependency and `DATABASE_URL` also request a managed PostgreSQL service. Keep it: this app needs SQL. SaaS selection does not exclude a declared native database. `world covers` describes the configured database as part of this workflow.
|
|
@@ -31,12 +31,12 @@ Review Stripe and Resend's exact sources in `.volter/world.json`. The `pg` depen
|
|
|
31
31
|
## Create and read an account
|
|
32
32
|
|
|
33
33
|
```console
|
|
34
|
-
$
|
|
35
|
-
$
|
|
36
|
-
$
|
|
37
|
-
$
|
|
38
|
-
$
|
|
39
|
-
$
|
|
34
|
+
$ ./node_modules/.bin/volter world up
|
|
35
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
36
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs create Ada owner@world.test
|
|
37
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
38
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
39
|
+
$ ./node_modules/.bin/volter world log
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
Read the customer returned by Stripe, the signup row returned by SQL and the email returned by Resend. `completion: complete` means delivery was observed, not merely that a send request was accepted. Opaque IDs can differ between fresh Worlds; customer identity, stored fields and delivery status are the useful outcomes.
|
|
@@ -46,25 +46,25 @@ Read the customer returned by Stripe, the signup row returned by SQL and the ema
|
|
|
46
46
|
A refusing recipient's mail server creates a bounce after the send was accepted:
|
|
47
47
|
|
|
48
48
|
```console
|
|
49
|
-
$
|
|
50
|
-
$
|
|
51
|
-
$
|
|
52
|
-
$
|
|
49
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs bounce
|
|
50
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs create Grace owner@world.test
|
|
51
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
52
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Grace's customer and SQL row remain. Her email exists and has `last_event: bounced`; the application reports `partial-email-bounced`. The `bounce` command uses Resend's declared synthetic recipient setting, not a successful-send handler. Restore delivery before later signups:
|
|
56
56
|
|
|
57
57
|
```console
|
|
58
|
-
$
|
|
58
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs deliver
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
An unverified sender is refused before an email is accepted:
|
|
62
62
|
|
|
63
63
|
```console
|
|
64
|
-
$
|
|
65
|
-
$
|
|
66
|
-
$
|
|
67
|
-
$
|
|
64
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs refused
|
|
65
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs retry
|
|
66
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
67
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
The first command creates Lin's customer and SQL row, then records the email refusal. The second resumes that pending welcome on the same customer. It refuses to resend an email that already has an accepted ID. These application receipts do not guarantee exactly-once delivery after an ambiguous network failure; resolve acceptance before retrying an uncertain send.
|
|
@@ -80,7 +80,7 @@ $ node prepare-ui.mjs
|
|
|
80
80
|
Then start the app through the World:
|
|
81
81
|
|
|
82
82
|
```console
|
|
83
|
-
$
|
|
83
|
+
$ ./node_modules/.bin/volter world run -- node server.mjs
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
Open the printed app URL in your browser. Submit a signup, advance the World clock in another terminal and reload. The page shows the completion state and full stored outcome. Its server registers its app URL with the World after listening; consumers can discover it with `world app-url`.
|
|
@@ -88,8 +88,8 @@ Open the printed app URL in your browser. Submit a signup, advance the World clo
|
|
|
88
88
|
To open the World dashboard, stop the app with Ctrl-C first, then switch the owned compute to the viewer:
|
|
89
89
|
|
|
90
90
|
```console
|
|
91
|
-
$
|
|
92
|
-
$
|
|
91
|
+
$ ./node_modules/.bin/volter world down
|
|
92
|
+
$ ./node_modules/.bin/volter world view --no-open
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
The viewer prints the dashboard URL and keeps running. Start `world run -- node server.mjs` in a second terminal if you want the application alongside it. Open **Stripe** under **Records**, then select the customer to inspect its name, email and stored ID. Open **Resend** to inspect the accepted email and delivery event. **Board** opens the vendor pages declared by the installed twin; its root workspace may cover settings rather than customers. Provisioning remains in full history even when hidden from the business-activity view. Read the application's SQL completion record with `run.mjs read` or its browser page.
|
|
@@ -11,10 +11,10 @@
|
|
|
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.
|
|
17
|
-
"@volter/world-console": "3.0.
|
|
14
|
+
"@volter/world": "3.0.146",
|
|
15
|
+
"@volter/world-core": "3.0.146",
|
|
16
|
+
"@volter/world-runtime": "3.0.146",
|
|
17
|
+
"@volter/world-console": "3.0.141",
|
|
18
18
|
"@volter/twin-stripe": "3.0.2",
|
|
19
19
|
"@volter/twin-resend": "1.0.1"
|
|
20
20
|
}
|
|
@@ -13,21 +13,21 @@ 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.146 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
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Review the selected vendor, then create Ada and Grace through the SDK:
|
|
23
23
|
|
|
24
24
|
```console
|
|
25
|
-
$
|
|
26
|
-
$
|
|
27
|
-
$
|
|
28
|
-
$
|
|
29
|
-
$
|
|
30
|
-
$
|
|
25
|
+
$ ./node_modules/.bin/volter world up
|
|
26
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
27
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs create Ada
|
|
28
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs create Grace
|
|
29
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
30
|
+
$ ./node_modules/.bin/volter world down
|
|
31
31
|
$ cd ..
|
|
32
32
|
```
|
|
33
33
|
|
|
@@ -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.146 example integration-branches --dir integration
|
|
42
|
+
$ npx @volter/world@3.0.146 example integration-branches --dir worker-a
|
|
43
|
+
$ npx @volter/world@3.0.146 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:
|
|
@@ -48,10 +48,10 @@ In `integration`, then `worker-a`, then `worker-b`, install dependencies and ini
|
|
|
48
48
|
```console
|
|
49
49
|
$ cd integration
|
|
50
50
|
$ npm install
|
|
51
|
-
$
|
|
52
|
-
$
|
|
53
|
-
$
|
|
54
|
-
$
|
|
51
|
+
$ ./node_modules/.bin/volter world init --name integration --twins stripe
|
|
52
|
+
$ ./node_modules/.bin/volter remote add origin ../baseline
|
|
53
|
+
$ ./node_modules/.bin/volter world pull
|
|
54
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
55
55
|
$ cd ..
|
|
56
56
|
```
|
|
57
57
|
|
|
@@ -61,12 +61,12 @@ Repeat that block in each worker, replacing both occurrences of `integration` wi
|
|
|
61
61
|
|
|
62
62
|
```console
|
|
63
63
|
$ cd worker-a
|
|
64
|
-
$
|
|
65
|
-
$
|
|
66
|
-
$
|
|
67
|
-
$
|
|
68
|
-
$
|
|
69
|
-
$
|
|
64
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs rename Ada Ada-worker-A
|
|
65
|
+
$ ./node_modules/.bin/volter world changeset worker-a-change -m "Worker A renames Ada"
|
|
66
|
+
$ ./node_modules/.bin/volter remote add integration ../integration
|
|
67
|
+
$ ./node_modules/.bin/volter world push worker-a-change --remote integration
|
|
68
|
+
$ ./node_modules/.bin/volter world run -- node receipt.mjs
|
|
69
|
+
$ ./node_modules/.bin/volter world down
|
|
70
70
|
$ cd ..
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -76,19 +76,19 @@ The delivery receipt names integration. The worker's tracked `origin` still name
|
|
|
76
76
|
|
|
77
77
|
```console
|
|
78
78
|
$ cd worker-b
|
|
79
|
-
$
|
|
80
|
-
$
|
|
81
|
-
$
|
|
82
|
-
$
|
|
83
|
-
$
|
|
79
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs rename Grace Grace-worker-B
|
|
80
|
+
$ ./node_modules/.bin/volter world changeset worker-b-change -m "Worker B renames Grace"
|
|
81
|
+
$ ./node_modules/.bin/volter remote add integration ../integration
|
|
82
|
+
$ ./node_modules/.bin/volter world push worker-b-change --remote integration
|
|
83
|
+
$ ./node_modules/.bin/volter world down
|
|
84
84
|
$ cd ../integration
|
|
85
|
-
$
|
|
86
|
-
$
|
|
87
|
-
$
|
|
85
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
86
|
+
$ ./node_modules/.bin/volter world run -- node receipt.mjs
|
|
87
|
+
$ ./node_modules/.bin/volter world down
|
|
88
88
|
$ cd ../baseline
|
|
89
|
-
$
|
|
90
|
-
$
|
|
91
|
-
$
|
|
89
|
+
$ ./node_modules/.bin/volter world up
|
|
90
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
91
|
+
$ ./node_modules/.bin/volter world down
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Integration holds the two renamed customers. Baseline still holds Ada and Grace. This example deliberately changes distinct records. A named delivery binds to the destination head it reads and refuses a concurrent move; it does not provide an automatic semantic merge for two workers changing the same field. Read the integration diff and coordinate overlapping work before accepting it.
|
|
@@ -9,10 +9,10 @@
|
|
|
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.
|
|
15
|
-
"@volter/world-console": "3.0.
|
|
12
|
+
"@volter/world": "3.0.146",
|
|
13
|
+
"@volter/world-core": "3.0.146",
|
|
14
|
+
"@volter/world-runtime": "3.0.146",
|
|
15
|
+
"@volter/world-console": "3.0.141",
|
|
16
16
|
"@volter/twin-stripe": "3.0.2"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -13,18 +13,18 @@ You need Node 22.6+, npm and registry access during installation. No platform ac
|
|
|
13
13
|
## Prepare an ordinary workplace
|
|
14
14
|
|
|
15
15
|
```console
|
|
16
|
-
$ npx @volter/world@3.0.
|
|
16
|
+
$ npx @volter/world@3.0.146 example workplace-agent --dir workplace
|
|
17
17
|
$ cd workplace
|
|
18
18
|
$ npm install
|
|
19
|
-
$
|
|
19
|
+
$ ./node_modules/.bin/volter world init --name workplace --twins github,linear,slack
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Read [package.json](./package.json), [package-lock.json](./package-lock.json) and [clients.mjs](./clients.mjs) for exact tool, twin and SDK versions. Keep the lockfile created by your installation. Review the three configured vendors and synthetic credentials before booting. No model vendor is selected by this starter.
|
|
23
23
|
|
|
24
24
|
```console
|
|
25
|
-
$
|
|
26
|
-
$
|
|
27
|
-
$
|
|
25
|
+
$ ./node_modules/.bin/volter world up
|
|
26
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
27
|
+
$ ./node_modules/.bin/volter world run -- node seed.mjs
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
[seed.mjs](./seed.mjs) creates stored records through each vendor's API. Run it once per fresh or reset World. It writes `company.json` with the returned repository owner, issue number, team and channel IDs. Existing runbook and policy records give your agent something to read before acting.
|
|
@@ -32,10 +32,10 @@ $ npx volter world run -- node seed.mjs
|
|
|
32
32
|
## Complete a handoff
|
|
33
33
|
|
|
34
34
|
```console
|
|
35
|
-
$
|
|
36
|
-
$
|
|
37
|
-
$
|
|
38
|
-
$
|
|
35
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs
|
|
36
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read
|
|
37
|
+
$ ./node_modules/.bin/volter world log
|
|
38
|
+
$ ./node_modules/.bin/volter world diff
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Read the ticket's title, priority and team, then the channel and posted source/ticket links. [handoff.mjs](./handoff.mjs) writes an application receipt under `outcomes/` as soon as the ticket exists. A repeated completed handoff prints that receipt; it does not create another ticket. [operate.mjs](./operate.mjs) reads the vendor's stored result rather than trusting the receipt alone.
|
|
@@ -45,7 +45,7 @@ Read the ticket's title, priority and team, then the channel and posted source/t
|
|
|
45
45
|
Install the World skill and MCP tools into your agent's configuration:
|
|
46
46
|
|
|
47
47
|
```console
|
|
48
|
-
$
|
|
48
|
+
$ ./node_modules/.bin/volter agents install
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
If you already completed the example handoff, create another source issue with `world run -- node operate.mjs issue`. Give your agent that returned issue number and this task:
|
|
@@ -59,23 +59,23 @@ The agent uses the same public SDKs as [clients.mjs](./clients.mjs); the [coding
|
|
|
59
59
|
Archive the channel, then create another source issue:
|
|
60
60
|
|
|
61
61
|
```console
|
|
62
|
-
$
|
|
63
|
-
$
|
|
62
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs archive
|
|
63
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs issue
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
Use the returned issue number in both commands below:
|
|
67
67
|
|
|
68
68
|
```console
|
|
69
|
-
$
|
|
70
|
-
$
|
|
69
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs <issue-number>
|
|
70
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read <issue-number>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
Slack's archived-channel refusal leaves the Linear ticket stored. The application reports `partial-ticket-created-notification-failed` and preserves the vendor error in its receipt. Unarchive the channel and resume that same handoff:
|
|
74
74
|
|
|
75
75
|
```console
|
|
76
|
-
$
|
|
77
|
-
$
|
|
78
|
-
$
|
|
76
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs unarchive
|
|
77
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs <issue-number>
|
|
78
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read <issue-number>
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
The retry uses the recorded ticket and attempts only the notification. An uncertain process exit between a successful vendor call and writing its receipt requires inspecting the vendor before retrying; this example does not claim exactly-once external execution.
|
|
@@ -98,9 +98,9 @@ Personal repositories use GitHub's ordinary create-repository API. Organization
|
|
|
98
98
|
It expects HTTP 201 with the organization's `login` and `id`, then creates a private repository using `github.repos.createInOrg`. Run it once in this World:
|
|
99
99
|
|
|
100
100
|
```console
|
|
101
|
-
$
|
|
101
|
+
$ ./node_modules/.bin/volter world run -- node create-organization.mjs
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
Without the owner or signed-in browser identity, the settings operation can redirect to sign-in. Inspect `GET /twin` for its declared setup endpoints rather than guessing a request body or inserting state files.
|
|
105
105
|
|
|
106
|
-
Stop with
|
|
106
|
+
Stop with `./node_modules/.bin/volter world down` to retain the workplace. [Inspect a World](https://world.volter.ai/docs/guides/inspect-a-world.html) shows its vendor screens, semantic relations and event history. [Failure handoff](https://world.volter.ai/docs/guides/reproduce-a-failure.html) describes how to share source, clock, handlers and application receipt conditions. [Source files](./public-files.json) identify the starter. The source instructions carry no new execution claim.
|
|
@@ -11,10 +11,10 @@
|
|
|
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.
|
|
17
|
-
"@volter/world-console": "3.0.
|
|
14
|
+
"@volter/world": "3.0.146",
|
|
15
|
+
"@volter/world-core": "3.0.146",
|
|
16
|
+
"@volter/world-runtime": "3.0.146",
|
|
17
|
+
"@volter/world-console": "3.0.141",
|
|
18
18
|
"@volter/twin-github": "3.0.6",
|
|
19
19
|
"@volter/twin-linear": "3.0.4",
|
|
20
20
|
"@volter/twin-slack": "3.0.5"
|
package/dist/src/agent-prompt.js
CHANGED
|
@@ -9,7 +9,7 @@ export function agentPrompt(o = {}) {
|
|
|
9
9
|
'',
|
|
10
10
|
o.tools
|
|
11
11
|
? '1. You have the Volter World tools (volter mcp). Keep an app\'s existing pinned World tools. If the `volter` command is missing, install it: `npm install -g @volter/world`.'
|
|
12
|
-
: '1. Keep the app\'s pinned World tools if present,
|
|
12
|
+
: '1. Keep the app\'s pinned World tools if present, running `./node_modules/.bin/volter` from the app folder after installing its locked dependencies. A missing local binary stops without fetching another package. Otherwise install the command: `npm install -g @volter/world`. Install the agent tooling with `volter agents install --yes`.',
|
|
13
13
|
`2. Read the app's manifests, env names and any .volter/world.json. Show me the likely vendors and why, before keeping them. Preserve a saved World and its state; do not initialize it again to resume. For a new World, choose the exact catalog releases and initialize only the selected vendors with ${cmd('volter world init --twins <selected-vendors> --source <vendor>=<package>', 'world_init with vendors and sources')}.`,
|
|
14
14
|
`3. ${o.tools ? 'Start it with world_up' : 'Start it: `volter world up`'}, then run my usual app command inside it: ${cmd('volter world run -- <the app command>', 'world_run')}. Use throwaway credentials. Diagnose a failure as routing, data, scenario, unsupported operation or runtime; preserve the refusal's evidence rather than bypassing it.`,
|
|
15
15
|
`4. Tell me what the app did at each vendor (${cmd('volter world log', 'world_log')}), and give me the dashboard link (${o.tools ? 'world_view' : '`volter world view --no-open`, started in the background: it keeps running'}).`,
|
|
@@ -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.146 example customer-onboarding --dir onboarding
|
|
17
17
|
$ cd onboarding
|
|
18
18
|
$ npm install
|
|
19
19
|
```
|
|
@@ -23,7 +23,7 @@ The command copies source; it neither installs dependencies nor starts a World.
|
|
|
23
23
|
Read [onboarding.mjs](./onboarding.mjs) for the application and [run.mjs](./run.mjs) for the command entry. Empty keys in [.env.example](./.env.example) tell init what the app reads; init supplies throwaway credentials. Do not add real keys.
|
|
24
24
|
|
|
25
25
|
```console
|
|
26
|
-
$
|
|
26
|
+
$ ./node_modules/.bin/volter world init --name onboarding --twins stripe,resend
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
Review Stripe and Resend's exact sources in `.volter/world.json`. The `pg` dependency and `DATABASE_URL` also request a managed PostgreSQL service. Keep it: this app needs SQL. SaaS selection does not exclude a declared native database. `world covers` describes the configured database as part of this workflow.
|
|
@@ -31,12 +31,12 @@ Review Stripe and Resend's exact sources in `.volter/world.json`. The `pg` depen
|
|
|
31
31
|
## Create and read an account
|
|
32
32
|
|
|
33
33
|
```console
|
|
34
|
-
$
|
|
35
|
-
$
|
|
36
|
-
$
|
|
37
|
-
$
|
|
38
|
-
$
|
|
39
|
-
$
|
|
34
|
+
$ ./node_modules/.bin/volter world up
|
|
35
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
36
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs create Ada owner@world.test
|
|
37
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
38
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
39
|
+
$ ./node_modules/.bin/volter world log
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
Read the customer returned by Stripe, the signup row returned by SQL and the email returned by Resend. `completion: complete` means delivery was observed, not merely that a send request was accepted. Opaque IDs can differ between fresh Worlds; customer identity, stored fields and delivery status are the useful outcomes.
|
|
@@ -46,25 +46,25 @@ Read the customer returned by Stripe, the signup row returned by SQL and the ema
|
|
|
46
46
|
A refusing recipient's mail server creates a bounce after the send was accepted:
|
|
47
47
|
|
|
48
48
|
```console
|
|
49
|
-
$
|
|
50
|
-
$
|
|
51
|
-
$
|
|
52
|
-
$
|
|
49
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs bounce
|
|
50
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs create Grace owner@world.test
|
|
51
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
52
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
Grace's customer and SQL row remain. Her email exists and has `last_event: bounced`; the application reports `partial-email-bounced`. The `bounce` command uses Resend's declared synthetic recipient setting, not a successful-send handler. Restore delivery before later signups:
|
|
56
56
|
|
|
57
57
|
```console
|
|
58
|
-
$
|
|
58
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs deliver
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
An unverified sender is refused before an email is accepted:
|
|
62
62
|
|
|
63
63
|
```console
|
|
64
|
-
$
|
|
65
|
-
$
|
|
66
|
-
$
|
|
67
|
-
$
|
|
64
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs refused
|
|
65
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs retry
|
|
66
|
+
$ ./node_modules/.bin/volter world clock advance 5s
|
|
67
|
+
$ ./node_modules/.bin/volter world run -- node run.mjs read
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
The first command creates Lin's customer and SQL row, then records the email refusal. The second resumes that pending welcome on the same customer. It refuses to resend an email that already has an accepted ID. These application receipts do not guarantee exactly-once delivery after an ambiguous network failure; resolve acceptance before retrying an uncertain send.
|
|
@@ -80,7 +80,7 @@ $ node prepare-ui.mjs
|
|
|
80
80
|
Then start the app through the World:
|
|
81
81
|
|
|
82
82
|
```console
|
|
83
|
-
$
|
|
83
|
+
$ ./node_modules/.bin/volter world run -- node server.mjs
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
Open the printed app URL in your browser. Submit a signup, advance the World clock in another terminal and reload. The page shows the completion state and full stored outcome. Its server registers its app URL with the World after listening; consumers can discover it with `world app-url`.
|
|
@@ -88,8 +88,8 @@ Open the printed app URL in your browser. Submit a signup, advance the World clo
|
|
|
88
88
|
To open the World dashboard, stop the app with Ctrl-C first, then switch the owned compute to the viewer:
|
|
89
89
|
|
|
90
90
|
```console
|
|
91
|
-
$
|
|
92
|
-
$
|
|
91
|
+
$ ./node_modules/.bin/volter world down
|
|
92
|
+
$ ./node_modules/.bin/volter world view --no-open
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
The viewer prints the dashboard URL and keeps running. Start `world run -- node server.mjs` in a second terminal if you want the application alongside it. Open **Stripe** under **Records**, then select the customer to inspect its name, email and stored ID. Open **Resend** to inspect the accepted email and delivery event. **Board** opens the vendor pages declared by the installed twin; its root workspace may cover settings rather than customers. Provisioning remains in full history even when hidden from the business-activity view. Read the application's SQL completion record with `run.mjs read` or its browser page.
|
|
@@ -11,10 +11,10 @@
|
|
|
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.
|
|
17
|
-
"@volter/world-console": "3.0.
|
|
14
|
+
"@volter/world": "3.0.146",
|
|
15
|
+
"@volter/world-core": "3.0.146",
|
|
16
|
+
"@volter/world-runtime": "3.0.146",
|
|
17
|
+
"@volter/world-console": "3.0.141",
|
|
18
18
|
"@volter/twin-stripe": "3.0.2",
|
|
19
19
|
"@volter/twin-resend": "1.0.1"
|
|
20
20
|
}
|
|
@@ -13,21 +13,21 @@ 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.146 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
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Review the selected vendor, then create Ada and Grace through the SDK:
|
|
23
23
|
|
|
24
24
|
```console
|
|
25
|
-
$
|
|
26
|
-
$
|
|
27
|
-
$
|
|
28
|
-
$
|
|
29
|
-
$
|
|
30
|
-
$
|
|
25
|
+
$ ./node_modules/.bin/volter world up
|
|
26
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
27
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs create Ada
|
|
28
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs create Grace
|
|
29
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
30
|
+
$ ./node_modules/.bin/volter world down
|
|
31
31
|
$ cd ..
|
|
32
32
|
```
|
|
33
33
|
|
|
@@ -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.146 example integration-branches --dir integration
|
|
42
|
+
$ npx @volter/world@3.0.146 example integration-branches --dir worker-a
|
|
43
|
+
$ npx @volter/world@3.0.146 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:
|
|
@@ -48,10 +48,10 @@ In `integration`, then `worker-a`, then `worker-b`, install dependencies and ini
|
|
|
48
48
|
```console
|
|
49
49
|
$ cd integration
|
|
50
50
|
$ npm install
|
|
51
|
-
$
|
|
52
|
-
$
|
|
53
|
-
$
|
|
54
|
-
$
|
|
51
|
+
$ ./node_modules/.bin/volter world init --name integration --twins stripe
|
|
52
|
+
$ ./node_modules/.bin/volter remote add origin ../baseline
|
|
53
|
+
$ ./node_modules/.bin/volter world pull
|
|
54
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
55
55
|
$ cd ..
|
|
56
56
|
```
|
|
57
57
|
|
|
@@ -61,12 +61,12 @@ Repeat that block in each worker, replacing both occurrences of `integration` wi
|
|
|
61
61
|
|
|
62
62
|
```console
|
|
63
63
|
$ cd worker-a
|
|
64
|
-
$
|
|
65
|
-
$
|
|
66
|
-
$
|
|
67
|
-
$
|
|
68
|
-
$
|
|
69
|
-
$
|
|
64
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs rename Ada Ada-worker-A
|
|
65
|
+
$ ./node_modules/.bin/volter world changeset worker-a-change -m "Worker A renames Ada"
|
|
66
|
+
$ ./node_modules/.bin/volter remote add integration ../integration
|
|
67
|
+
$ ./node_modules/.bin/volter world push worker-a-change --remote integration
|
|
68
|
+
$ ./node_modules/.bin/volter world run -- node receipt.mjs
|
|
69
|
+
$ ./node_modules/.bin/volter world down
|
|
70
70
|
$ cd ..
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -76,19 +76,19 @@ The delivery receipt names integration. The worker's tracked `origin` still name
|
|
|
76
76
|
|
|
77
77
|
```console
|
|
78
78
|
$ cd worker-b
|
|
79
|
-
$
|
|
80
|
-
$
|
|
81
|
-
$
|
|
82
|
-
$
|
|
83
|
-
$
|
|
79
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs rename Grace Grace-worker-B
|
|
80
|
+
$ ./node_modules/.bin/volter world changeset worker-b-change -m "Worker B renames Grace"
|
|
81
|
+
$ ./node_modules/.bin/volter remote add integration ../integration
|
|
82
|
+
$ ./node_modules/.bin/volter world push worker-b-change --remote integration
|
|
83
|
+
$ ./node_modules/.bin/volter world down
|
|
84
84
|
$ cd ../integration
|
|
85
|
-
$
|
|
86
|
-
$
|
|
87
|
-
$
|
|
85
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
86
|
+
$ ./node_modules/.bin/volter world run -- node receipt.mjs
|
|
87
|
+
$ ./node_modules/.bin/volter world down
|
|
88
88
|
$ cd ../baseline
|
|
89
|
-
$
|
|
90
|
-
$
|
|
91
|
-
$
|
|
89
|
+
$ ./node_modules/.bin/volter world up
|
|
90
|
+
$ ./node_modules/.bin/volter world run -- node customer.mjs read
|
|
91
|
+
$ ./node_modules/.bin/volter world down
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Integration holds the two renamed customers. Baseline still holds Ada and Grace. This example deliberately changes distinct records. A named delivery binds to the destination head it reads and refuses a concurrent move; it does not provide an automatic semantic merge for two workers changing the same field. Read the integration diff and coordinate overlapping work before accepting it.
|
|
@@ -9,10 +9,10 @@
|
|
|
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.
|
|
15
|
-
"@volter/world-console": "3.0.
|
|
12
|
+
"@volter/world": "3.0.146",
|
|
13
|
+
"@volter/world-core": "3.0.146",
|
|
14
|
+
"@volter/world-runtime": "3.0.146",
|
|
15
|
+
"@volter/world-console": "3.0.141",
|
|
16
16
|
"@volter/twin-stripe": "3.0.2"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -13,18 +13,18 @@ You need Node 22.6+, npm and registry access during installation. No platform ac
|
|
|
13
13
|
## Prepare an ordinary workplace
|
|
14
14
|
|
|
15
15
|
```console
|
|
16
|
-
$ npx @volter/world@3.0.
|
|
16
|
+
$ npx @volter/world@3.0.146 example workplace-agent --dir workplace
|
|
17
17
|
$ cd workplace
|
|
18
18
|
$ npm install
|
|
19
|
-
$
|
|
19
|
+
$ ./node_modules/.bin/volter world init --name workplace --twins github,linear,slack
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Read [package.json](./package.json), [package-lock.json](./package-lock.json) and [clients.mjs](./clients.mjs) for exact tool, twin and SDK versions. Keep the lockfile created by your installation. Review the three configured vendors and synthetic credentials before booting. No model vendor is selected by this starter.
|
|
23
23
|
|
|
24
24
|
```console
|
|
25
|
-
$
|
|
26
|
-
$
|
|
27
|
-
$
|
|
25
|
+
$ ./node_modules/.bin/volter world up
|
|
26
|
+
$ ./node_modules/.bin/volter world clock set 2026-01-15T12:00:00Z
|
|
27
|
+
$ ./node_modules/.bin/volter world run -- node seed.mjs
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
[seed.mjs](./seed.mjs) creates stored records through each vendor's API. Run it once per fresh or reset World. It writes `company.json` with the returned repository owner, issue number, team and channel IDs. Existing runbook and policy records give your agent something to read before acting.
|
|
@@ -32,10 +32,10 @@ $ npx volter world run -- node seed.mjs
|
|
|
32
32
|
## Complete a handoff
|
|
33
33
|
|
|
34
34
|
```console
|
|
35
|
-
$
|
|
36
|
-
$
|
|
37
|
-
$
|
|
38
|
-
$
|
|
35
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs
|
|
36
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read
|
|
37
|
+
$ ./node_modules/.bin/volter world log
|
|
38
|
+
$ ./node_modules/.bin/volter world diff
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Read the ticket's title, priority and team, then the channel and posted source/ticket links. [handoff.mjs](./handoff.mjs) writes an application receipt under `outcomes/` as soon as the ticket exists. A repeated completed handoff prints that receipt; it does not create another ticket. [operate.mjs](./operate.mjs) reads the vendor's stored result rather than trusting the receipt alone.
|
|
@@ -45,7 +45,7 @@ Read the ticket's title, priority and team, then the channel and posted source/t
|
|
|
45
45
|
Install the World skill and MCP tools into your agent's configuration:
|
|
46
46
|
|
|
47
47
|
```console
|
|
48
|
-
$
|
|
48
|
+
$ ./node_modules/.bin/volter agents install
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
If you already completed the example handoff, create another source issue with `world run -- node operate.mjs issue`. Give your agent that returned issue number and this task:
|
|
@@ -59,23 +59,23 @@ The agent uses the same public SDKs as [clients.mjs](./clients.mjs); the [coding
|
|
|
59
59
|
Archive the channel, then create another source issue:
|
|
60
60
|
|
|
61
61
|
```console
|
|
62
|
-
$
|
|
63
|
-
$
|
|
62
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs archive
|
|
63
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs issue
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
Use the returned issue number in both commands below:
|
|
67
67
|
|
|
68
68
|
```console
|
|
69
|
-
$
|
|
70
|
-
$
|
|
69
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs <issue-number>
|
|
70
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read <issue-number>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
Slack's archived-channel refusal leaves the Linear ticket stored. The application reports `partial-ticket-created-notification-failed` and preserves the vendor error in its receipt. Unarchive the channel and resume that same handoff:
|
|
74
74
|
|
|
75
75
|
```console
|
|
76
|
-
$
|
|
77
|
-
$
|
|
78
|
-
$
|
|
76
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs unarchive
|
|
77
|
+
$ ./node_modules/.bin/volter world run -- node handoff.mjs <issue-number>
|
|
78
|
+
$ ./node_modules/.bin/volter world run -- node operate.mjs read <issue-number>
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
The retry uses the recorded ticket and attempts only the notification. An uncertain process exit between a successful vendor call and writing its receipt requires inspecting the vendor before retrying; this example does not claim exactly-once external execution.
|
|
@@ -98,9 +98,9 @@ Personal repositories use GitHub's ordinary create-repository API. Organization
|
|
|
98
98
|
It expects HTTP 201 with the organization's `login` and `id`, then creates a private repository using `github.repos.createInOrg`. Run it once in this World:
|
|
99
99
|
|
|
100
100
|
```console
|
|
101
|
-
$
|
|
101
|
+
$ ./node_modules/.bin/volter world run -- node create-organization.mjs
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
Without the owner or signed-in browser identity, the settings operation can redirect to sign-in. Inspect `GET /twin` for its declared setup endpoints rather than guessing a request body or inserting state files.
|
|
105
105
|
|
|
106
|
-
Stop with
|
|
106
|
+
Stop with `./node_modules/.bin/volter world down` to retain the workplace. [Inspect a World](https://world.volter.ai/docs/guides/inspect-a-world.html) shows its vendor screens, semantic relations and event history. [Failure handoff](https://world.volter.ai/docs/guides/reproduce-a-failure.html) describes how to share source, clock, handlers and application receipt conditions. [Source files](./public-files.json) identify the starter. The source instructions carry no new execution claim.
|
|
@@ -11,10 +11,10 @@
|
|
|
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.
|
|
17
|
-
"@volter/world-console": "3.0.
|
|
14
|
+
"@volter/world": "3.0.146",
|
|
15
|
+
"@volter/world-core": "3.0.146",
|
|
16
|
+
"@volter/world-runtime": "3.0.146",
|
|
17
|
+
"@volter/world-console": "3.0.141",
|
|
18
18
|
"@volter/twin-github": "3.0.6",
|
|
19
19
|
"@volter/twin-linear": "3.0.4",
|
|
20
20
|
"@volter/twin-slack": "3.0.5"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volter/world",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.146",
|
|
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,12 +31,12 @@
|
|
|
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.146",
|
|
35
|
+
"@volter/world-runtime": "3.0.146",
|
|
36
36
|
"zod": "^4.6.5"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@volter/world-console": "3.0.
|
|
39
|
+
"@volter/world-console": "3.0.141"
|
|
40
40
|
},
|
|
41
41
|
"peerDependenciesMeta": {
|
|
42
42
|
"@volter/world-console": {
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@volter/world-console": "3.0.
|
|
47
|
+
"@volter/world-console": "3.0.141"
|
|
48
48
|
},
|
|
49
49
|
"bin": {
|
|
50
50
|
"volter": "dist/src/cli.js"
|
package/src/agent-prompt.ts
CHANGED
|
@@ -19,7 +19,7 @@ export function agentPrompt(o: AgentPromptOptions = {}): string {
|
|
|
19
19
|
'',
|
|
20
20
|
o.tools
|
|
21
21
|
? '1. You have the Volter World tools (volter mcp). Keep an app\'s existing pinned World tools. If the `volter` command is missing, install it: `npm install -g @volter/world`.'
|
|
22
|
-
: '1. Keep the app\'s pinned World tools if present,
|
|
22
|
+
: '1. Keep the app\'s pinned World tools if present, running `./node_modules/.bin/volter` from the app folder after installing its locked dependencies. A missing local binary stops without fetching another package. Otherwise install the command: `npm install -g @volter/world`. Install the agent tooling with `volter agents install --yes`.',
|
|
23
23
|
`2. Read the app's manifests, env names and any .volter/world.json. Show me the likely vendors and why, before keeping them. Preserve a saved World and its state; do not initialize it again to resume. For a new World, choose the exact catalog releases and initialize only the selected vendors with ${cmd('volter world init --twins <selected-vendors> --source <vendor>=<package>', 'world_init with vendors and sources')}.`,
|
|
24
24
|
`3. ${o.tools ? 'Start it with world_up' : 'Start it: `volter world up`'}, then run my usual app command inside it: ${cmd('volter world run -- <the app command>', 'world_run')}. Use throwaway credentials. Diagnose a failure as routing, data, scenario, unsupported operation or runtime; preserve the refusal's evidence rather than bypassing it.`,
|
|
25
25
|
`4. Tell me what the app did at each vendor (${cmd('volter world log', 'world_log')}), and give me the dashboard link (${o.tools ? 'world_view' : '`volter world view --no-open`, started in the background: it keeps running'}).`,
|