@nervur-org/dock 0.3.1 → 0.4.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/GETTING_STARTED.md +22 -12
- package/{beings/GLOSSARY.md → GLOSSARY.md} +3 -3
- package/NOTICE +1 -1
- package/README.md +20 -16
- package/{beings/WORLDS.md → WORLDS.md} +6 -4
- package/api/route.ts +3 -3
- package/beings/avatar.ts +2 -2
- package/beings/carry.ts +2 -2
- package/beings/clock.ts +2 -2
- package/beings/courier.ts +2 -2
- package/beings/desk.ts +2 -2
- package/beings/doorbell.ts +2 -2
- package/beings/envoy.ts +2 -2
- package/beings/join.ts +2 -2
- package/beings/link.ts +5 -5
- package/beings/look.ts +1 -1
- package/beings/porter.ts +2 -2
- package/beings/presence.ts +1 -1
- package/beings/setup.ts +3 -3
- package/beings/side.ts +2 -2
- package/beings/user.ts +2 -2
- package/beings/way.ts +1 -1
- package/cli/client.ts +6 -6
- package/cli/daemon.ts +7 -7
- package/cli/estate/{quo.service → nervur.service} +12 -12
- package/cli/estate/org.nervur.plist +44 -0
- package/cli/estate.ts +6 -6
- package/cli/{quo.ts → nervur.ts} +43 -37
- package/cli/pilot.ts +3 -3
- package/cli/stand.ts +3 -3
- package/dist/api/route.d.ts +2 -2
- package/dist/api/route.js +2 -2
- package/dist/beings/avatar.d.ts +1 -1
- package/dist/beings/avatar.js +1 -1
- package/dist/beings/carry.d.ts +2 -2
- package/dist/beings/carry.js +1 -1
- package/dist/beings/clock.d.ts +2 -2
- package/dist/beings/clock.js +1 -1
- package/dist/beings/courier.d.ts +2 -2
- package/dist/beings/courier.js +1 -1
- package/dist/beings/desk.d.ts +3 -3
- package/dist/beings/desk.js +1 -1
- package/dist/beings/doorbell.d.ts +3 -3
- package/dist/beings/doorbell.js +1 -1
- package/dist/beings/envoy.d.ts +2 -2
- package/dist/beings/envoy.js +1 -1
- package/dist/beings/join.d.ts +2 -2
- package/dist/beings/link.d.ts +2 -2
- package/dist/beings/link.js +3 -3
- package/dist/beings/look.d.ts +1 -1
- package/dist/beings/porter.d.ts +2 -2
- package/dist/beings/porter.js +1 -1
- package/dist/beings/presence.d.ts +1 -1
- package/dist/beings/setup.d.ts +1 -1
- package/dist/beings/side.d.ts +1 -1
- package/dist/beings/side.js +1 -1
- package/dist/beings/user.d.ts +3 -3
- package/dist/beings/user.js +1 -1
- package/dist/beings/way.d.ts +1 -1
- package/dist/cli/client.js +4 -4
- package/dist/cli/daemon.d.ts +1 -1
- package/dist/cli/daemon.js +6 -6
- package/dist/cli/estate/{quo.service → nervur.service} +12 -12
- package/dist/cli/estate/org.nervur.plist +44 -0
- package/dist/cli/estate.js +6 -6
- package/dist/cli/{quo.js → nervur.js} +43 -37
- package/dist/cli/stand.d.ts +2 -2
- package/dist/dock/agents.d.ts +1 -1
- package/dist/dock/agents.js +1 -1
- package/dist/dock/apns.js +1 -1
- package/dist/dock/console.d.ts +1 -1
- package/dist/dock/dialers.d.ts +2 -2
- package/dist/dock/dialers.js +2 -2
- package/dist/dock/faculty.d.ts +2 -2
- package/dist/dock/faculty.js +1 -1
- package/dist/dock/grants.d.ts +1 -1
- package/dist/dock/grants.js +1 -1
- package/dist/dock/http2.js +1 -1
- package/dist/dock/index.d.ts +1 -1
- package/dist/dock/index.js +1 -1
- package/dist/dock/local.d.ts +2 -2
- package/dist/dock/location.d.ts +1 -1
- package/dist/dock/notifications.d.ts +1 -1
- package/dist/dock/notifications.js +1 -1
- package/dist/dock/push.d.ts +1 -1
- package/dist/dock/push.js +3 -3
- package/dist/dock/service.js +1 -1
- package/dist/dock/timer.d.ts +1 -1
- package/dist/harbor/browser.d.ts +2 -2
- package/dist/harbor/browser.js +4 -4
- package/dist/harbor/capacitor.d.ts +1 -1
- package/dist/harbor/capacitor.js +1 -1
- package/dist/harbor/disk.d.ts +4 -4
- package/dist/harbor/disk.js +5 -5
- package/dist/harbor/edge/edge.d.ts +2 -2
- package/dist/harbor/edge/edge.js +5 -5
- package/dist/harbor/edge/exercise.js +8 -8
- package/dist/harbor/edge/given.d.ts +1 -1
- package/dist/harbor/edge/platform.d.ts +1 -1
- package/dist/harbor/edge/storage.d.ts +1 -1
- package/dist/harbor/edge/storage.js +2 -2
- package/dist/harbor/edge/worker.js +2 -2
- package/dist/harbor/files.d.ts +1 -1
- package/dist/harbor/files.js +2 -2
- package/dist/harbor/http.d.ts +2 -2
- package/dist/harbor/http.js +1 -1
- package/dist/harbor/idb.d.ts +1 -1
- package/dist/harbor/idb.js +0 -0
- package/dist/harbor/quo.js +1 -1
- package/dist/harbor/seal.js +1 -1
- package/dist/harbor/sealed.d.ts +1 -1
- package/dist/harbor/sealed.js +4 -4
- package/dist/harbor/tauri.d.ts +1 -1
- package/dist/harbor/tauri.js +1 -1
- package/dist/harbor/ward.d.ts +1 -1
- package/dist/human/app.d.ts +2 -2
- package/dist/human/door.js +4 -4
- package/dist/human/guest.js +1 -1
- package/dist/human/html.d.ts +1 -1
- package/dist/human/html.js +1 -1
- package/dist/human/local.d.ts +1 -1
- package/dist/human/mark.js +2 -2
- package/dist/human/move.d.ts +2 -2
- package/dist/human/move.js +1 -1
- package/dist/human/screen.d.ts +1 -1
- package/dist/human/screen.js +3 -3
- package/dist/human/tab.bundle.txt +32 -32
- package/dist/human/tab.js +7 -7
- package/dist/human/tree.d.ts +1 -1
- package/dist/human/wake.d.ts +2 -2
- package/dist/human/wake.js +1 -1
- package/dist/human/web.d.ts +1 -1
- package/dist/human/web.js +4 -4
- package/dist/human/worker.bundle.txt +27 -27
- package/dist/human/worker.js +4 -4
- package/dist/human/worlds.d.ts +2 -2
- package/dist/human/worlds.js +4 -4
- package/dist/mcp/agent.d.ts +1 -1
- package/dist/mcp/allow.d.ts +1 -1
- package/dist/mcp/allow.js +2 -2
- package/dist/mcp/oauth.js +1 -1
- package/dist/mcp/runner.d.ts +1 -1
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +2 -2
- package/dock/agents.ts +2 -2
- package/dock/apns.ts +1 -1
- package/dock/console.ts +1 -1
- package/dock/dialers.ts +3 -3
- package/dock/faculty.ts +2 -2
- package/dock/grants.ts +2 -2
- package/dock/http2.ts +1 -1
- package/dock/index.ts +3 -3
- package/dock/local.ts +1 -1
- package/dock/location.ts +1 -1
- package/dock/notifications.ts +2 -2
- package/dock/push.ts +4 -4
- package/dock/service.ts +1 -1
- package/dock/timer.ts +1 -1
- package/harbor/browser.ts +5 -5
- package/harbor/capacitor.ts +2 -2
- package/harbor/disk.ts +8 -8
- package/harbor/edge/edge.ts +7 -7
- package/harbor/edge/exercise.ts +11 -11
- package/harbor/edge/given.ts +1 -1
- package/harbor/edge/platform.d.ts +1 -1
- package/harbor/edge/storage.ts +2 -2
- package/harbor/edge/worker.ts +2 -2
- package/harbor/edge/wrangler.toml +3 -3
- package/harbor/files.ts +2 -2
- package/harbor/http.ts +2 -2
- package/harbor/idb.ts +0 -0
- package/harbor/quo.ts +1 -1
- package/harbor/resolve.ts +1 -1
- package/harbor/seal.ts +1 -1
- package/harbor/sealed.ts +5 -5
- package/harbor/tauri.ts +2 -2
- package/harbor/ward.ts +1 -1
- package/human/app.ts +2 -2
- package/human/apps.ts +1 -1
- package/human/door.ts +4 -4
- package/human/guest.ts +2 -2
- package/human/html.ts +2 -2
- package/human/local.ts +1 -1
- package/human/mark.ts +2 -2
- package/human/move.ts +3 -3
- package/human/screen.ts +5 -5
- package/human/tab.bundle.txt +32 -32
- package/human/tab.ts +10 -10
- package/human/tree.ts +1 -1
- package/human/wake.ts +3 -3
- package/human/web.ts +5 -5
- package/human/worker.bundle.txt +27 -27
- package/human/worker.ts +6 -6
- package/human/worlds.ts +5 -5
- package/mcp/agent.ts +1 -1
- package/mcp/allow.ts +5 -5
- package/mcp/oauth.ts +1 -1
- package/mcp/runner.ts +1 -1
- package/mcp/server.ts +3 -3
- package/package.json +15 -7
- package/{api/quo-api.md → quo-api.md} +1 -1
- package/{beings/quo-dock.md → quo-dock.md} +74 -71
- package/{harbor/quo-harbor.md → quo-harbor.md} +54 -30
- package/{human/quo-human.md → quo-human.md} +7 -7
- package/{mcp/quo-mcp.md → quo-mcp.md} +10 -10
- package/cli/estate/systems.quo.plist +0 -44
- package/cli/quo-dock.md +0 -1942
- package/dist/cli/estate/systems.quo.plist +0 -44
- package/dock/quo-app-bells.md +0 -280
- package/dock/quo-dock.md +0 -1942
- /package/dist/cli/{quo.d.ts → nervur.d.ts} +0 -0
- /package/{beings/quo-app-bells.md → quo-app-bells.md} +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
The daemon on a Mac, as the user, forever: a launchd agent. It holds the
|
|
4
|
+
harbor at ~/.nervur and the socket to every quo. route ~/.nervur/dial.json
|
|
5
|
+
names, so a Mac behind NAT is reached through the droplet it dialed. The
|
|
6
|
+
daemon runs the dock's emitted `dist/cli/nervur.js` from where the estate
|
|
7
|
+
installed it, never the source. Install, with node on the path:
|
|
8
|
+
|
|
9
|
+
sed "s#HOME#$HOME#g; s#NODE#$(which node)#g" mac/org.nervur.plist > ~/Library/LaunchAgents/org.nervur.plist
|
|
10
|
+
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/org.nervur.plist
|
|
11
|
+
|
|
12
|
+
Remove with `launchctl bootout gui/$(id -u)/org.nervur`; restart after a
|
|
13
|
+
wire change with `launchctl kickstart -k gui/$(id -u)/org.nervur`. The
|
|
14
|
+
log is ~/.nervur/serve.log. No HTTP door: a Mac is a dialer, not a listener.
|
|
15
|
+
-->
|
|
16
|
+
<plist version="1.0">
|
|
17
|
+
<dict>
|
|
18
|
+
<key>Label</key>
|
|
19
|
+
<string>org.nervur</string>
|
|
20
|
+
<key>ProgramArguments</key>
|
|
21
|
+
<array>
|
|
22
|
+
<string>NODE</string>
|
|
23
|
+
<string>HOME/ESTATE/node_modules/@nervur-org/dock/dist/cli/nervur.js</string>
|
|
24
|
+
<string>serve</string>
|
|
25
|
+
</array>
|
|
26
|
+
<key>EnvironmentVariables</key>
|
|
27
|
+
<dict>
|
|
28
|
+
<key>NERVUR_DIR</key>
|
|
29
|
+
<string>HOME/.nervur</string>
|
|
30
|
+
</dict>
|
|
31
|
+
<key>WorkingDirectory</key>
|
|
32
|
+
<string>HOME/ESTATE</string>
|
|
33
|
+
<key>RunAtLoad</key>
|
|
34
|
+
<true/>
|
|
35
|
+
<key>KeepAlive</key>
|
|
36
|
+
<true/>
|
|
37
|
+
<key>ThrottleInterval</key>
|
|
38
|
+
<integer>2</integer>
|
|
39
|
+
<key>StandardOutPath</key>
|
|
40
|
+
<string>HOME/.nervur/serve.log</string>
|
|
41
|
+
<key>StandardErrorPath</key>
|
|
42
|
+
<string>HOME/.nervur/serve.log</string>
|
|
43
|
+
</dict>
|
|
44
|
+
</plist>
|
package/cli/estate.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// `
|
|
3
|
-
// every estate has. One folder per harbor: `droplet/`, the
|
|
2
|
+
// `nervur estate DIR --domain D`: an estate folder, written once, of the shape
|
|
3
|
+
// every estate has. One folder per harbor: `droplet/`, the harbor directory
|
|
4
4
|
// that device runs minus what it mints, its routes under the domain, no
|
|
5
5
|
// agents, no schedules, no classes of its own, and that device's unit and
|
|
6
6
|
// Caddyfile; and `mac/`, the launchd agent that runs the daemon on an
|
|
@@ -32,13 +32,13 @@ export async function estate(dir: string, domain: string): Promise<{ dir: string
|
|
|
32
32
|
const name = basename(dir);
|
|
33
33
|
const files: Record<string, string> = {
|
|
34
34
|
'package.json': JSON.stringify({ name, private: true, description: `The ${name} estate: one owner's harbors, built on the dock and nothing else.`, type: 'module', dependencies: { '@nervur-org/dock': `^${await version()}` } }, null, 2) + '\n',
|
|
35
|
-
[`${name}.md`]: `# ${name}\n\nAn estate: all of one owner's harbors. One folder per harbor, each the
|
|
35
|
+
[`${name}.md`]: `# ${name}\n\nAn estate: all of one owner's harbors. One folder per harbor, each the harbor\ndirectory that device runs minus what it mints, plus that device's unit.\n\`droplet/\` is the first: its routes under \`${domain}\`, its agents, its\nclasses, its systemd unit and its Caddyfile. This folder depends on the\ndock and nothing else.\n\n## The droplet\n\nWhere it is, how it is reached, and what was done to stand it up: yours\nto write.\n`,
|
|
36
36
|
'droplet/routes.json': JSON.stringify(routesFor(domain)) + '\n',
|
|
37
|
-
'droplet/stand.ts': `// SPDX-License-Identifier: Apache-2.0\n// What the root stands up on this harbor, once, after the inits and with no\n// daemon over the folder: the beings the estate boots for its own working\n// and the relations between them, placed on real invitations. Run as\n// \`node droplet/stand.ts <dir>\`; twice is once.\nimport { stand } from '@nervur-org/dock/stand';\n\nconsole.log(await stand(process.argv[2] ?? process.env.
|
|
37
|
+
'droplet/stand.ts': `// SPDX-License-Identifier: Apache-2.0\n// What the root stands up on this harbor, once, after the inits and with no\n// daemon over the folder: the beings the estate boots for its own working\n// and the relations between them, placed on real invitations. Run as\n// \`node droplet/stand.ts <dir>\`; twice is once.\nimport { stand } from '@nervur-org/dock/stand';\n\nconsole.log(await stand(process.argv[2] ?? process.env.NERVUR_DIR ?? '', { boot: [], wire: [] }));\n`,
|
|
38
38
|
'droplet/classes/index.ts': '// The classes this harbor holds beside the dock\'s built-in ones, exported\n// by name.\nexport {};\n',
|
|
39
|
-
'droplet/
|
|
39
|
+
'droplet/nervur.service': (await template('nervur.service')).replaceAll('ESTATE', name),
|
|
40
40
|
'droplet/Caddyfile': (await template('Caddyfile')).replaceAll('DOMAIN', domain),
|
|
41
|
-
'mac/
|
|
41
|
+
'mac/org.nervur.plist': (await template('org.nervur.plist')).replaceAll('ESTATE', name),
|
|
42
42
|
};
|
|
43
43
|
for (const [rel, text] of Object.entries(files)) {
|
|
44
44
|
await mkdir(join(dir, rel, '..'), { recursive: true });
|
package/cli/{quo.ts → nervur.ts}
RENAMED
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
// `
|
|
3
|
+
// `nervur`: the one command of the estate. Thin on purpose: each subcommand
|
|
4
4
|
// picks a folder, reaches the daemon or the disk, and hands off. Logic that
|
|
5
5
|
// appears here was missing from a being or a side, and moves there.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// quo census [--dir D] [--ward W] [--via S] the empty ask: pk and every being
|
|
13
|
-
// quo boot [--dir D] [--ward W] [--via S] <json> { key, class, public? }
|
|
14
|
-
// quo invite [--dir D] [--ward W] [--via S] <json> { being, id }; with routes.json naming web., the answer carries the link
|
|
15
|
-
// quo knock [--dir D] [--ward W] [--via S] <json> { being | { boot, key }, id, invitation, method?, args?, wanted? }
|
|
16
|
-
// quo remove [--dir D] [--ward W] [--via S] <json> { being, id }: a relation out of a being; on the ward pk, an owner
|
|
17
|
-
// quo unboot [--dir D] [--ward W] [--via S] <json> { being }: a being out of the ward, with every relation she holds
|
|
18
|
-
// quo ask [--dir D] [--ward W] <being> [method] [json] the root asking a being of its own ward, as the device
|
|
19
|
-
// quo side [--dir D] [--ward W] --as NAME an avatar over stdio for a local MCP client; NAME is the client identity
|
|
20
|
-
// quo run [--dir D] [--ward W] --as NAME --url URL --model NAME [--turns N] a human at a terminal talking to a model through an avatar: a line in, the model's final text out
|
|
21
|
-
// quo pilot [--dir D] [--ward W] [--via S] the owner pilot over stdio: census, boot, invite, knock, remove
|
|
22
|
-
// quo reach [--dir D] <pk> <url> a hint for the harbor's directory: that ward pk lives at that quo. route
|
|
23
|
-
// quo estate <dir> --domain D an estate folder of the shape every estate has: a droplet's quo directory, unit and Caddyfile, a Mac's launchd agent, on this dock
|
|
7
|
+
// The command carries the kit's name and never the protocol's. `quo` is
|
|
8
|
+
// Quo's word, and it stays on the wire: the `quo.` route, a ward's door, the
|
|
9
|
+
// sealed wards' folder. Nothing a person types is called quo, and nothing a
|
|
10
|
+
// device holds for the daemon is either: the unit, the unix user, the home
|
|
11
|
+
// and the environment file all say nervur.
|
|
24
12
|
//
|
|
25
|
-
// D
|
|
13
|
+
// nervur init [--dir D] [--ward W] [--user U] [--class C] [--default] [--show] [--domain DOM] mint a seed, boot a ward over a disk store, write both; C is the class of the ward's home being, User unless said; --default marks it the default ward; --show shows it at the web route; --domain writes the four routes under DOM
|
|
14
|
+
// nervur default [--dir D] <ward> mark one ward the default, the one a caller means when naming none; the one ward hosted is the default unmarked
|
|
15
|
+
// nervur show|hide [--dir D] <ward> show a ward at the web route, listed at its root and its public being's page painted for a stranger; hidden at init, and a hidden ward's page is the plain door
|
|
16
|
+
// nervur domain [--dir D] <domain> write routes.json by the convention: mcp., web., quo. and api. under the domain, over https
|
|
17
|
+
// nervur serve [--dir D] [--http PORT] the daemon: harbor from disk, the two sockets, the HTTP door on loopback, a socket held to every route the dialers faculty keeps
|
|
18
|
+
// nervur census [--dir D] [--ward W] [--via S] the empty ask: pk and every being
|
|
19
|
+
// nervur boot [--dir D] [--ward W] [--via S] <json> { key, class, public? }
|
|
20
|
+
// nervur invite [--dir D] [--ward W] [--via S] <json> { being, id }; with routes.json naming web., the answer carries the link
|
|
21
|
+
// nervur knock [--dir D] [--ward W] [--via S] <json> { being | { boot, key }, id, invitation, method?, args?, wanted? }
|
|
22
|
+
// nervur remove [--dir D] [--ward W] [--via S] <json> { being, id }: a relation out of a being; on the ward pk, an owner
|
|
23
|
+
// nervur unboot [--dir D] [--ward W] [--via S] <json> { being }: a being out of the ward, with every relation she holds
|
|
24
|
+
// nervur ask [--dir D] [--ward W] <being> [method] [json] the root asking a being of its own ward, as the device
|
|
25
|
+
// nervur side [--dir D] [--ward W] --as NAME an avatar over stdio for a local MCP client; NAME is the client identity
|
|
26
|
+
// nervur run [--dir D] [--ward W] --as NAME --url URL --model NAME [--turns N] a human at a terminal talking to a model through an avatar: a line in, the model's final text out
|
|
27
|
+
// nervur pilot [--dir D] [--ward W] [--via S] the owner pilot over stdio: census, boot, invite, knock, remove
|
|
28
|
+
// nervur reach [--dir D] <pk> <url> a hint for the harbor's directory: that ward pk lives at that quo. route
|
|
29
|
+
// nervur estate <dir> --domain D an estate folder of the shape every estate has: a droplet's harbor directory, unit and Caddyfile, a Mac's launchd agent, on this dock
|
|
30
|
+
//
|
|
31
|
+
// D defaults to $NERVUR_DIR, then ~/.nervur. W defaults to the default ward, and
|
|
26
32
|
// init names a new ward main when none is given. init takes
|
|
27
33
|
// --user NAME for the user being, defaulting to the device's user. run
|
|
28
|
-
// takes the model's base URL as --url or $
|
|
29
|
-
// --model or $
|
|
34
|
+
// takes the model's base URL as --url or $NERVUR_MODEL_URL, its name as
|
|
35
|
+
// --model or $NERVUR_MODEL, a bearer from $NERVUR_MODEL_KEY, read here and never
|
|
30
36
|
// kept, and --turns as the ceiling of model calls in one turn. S is a
|
|
31
37
|
// standing the user being holds at another ward, one the root there invited
|
|
32
38
|
// as an owner: with --via, the owner asks go to that ward's door, sealed,
|
|
@@ -34,7 +40,7 @@
|
|
|
34
40
|
import { homedir, userInfo } from 'node:os';
|
|
35
41
|
import { join } from 'node:path';
|
|
36
42
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
37
|
-
import { isInvitation } from '
|
|
43
|
+
import { isInvitation } from 'nervur';
|
|
38
44
|
import { DiskHarbor } from '../harbor/disk.ts';
|
|
39
45
|
import { serve, readRoutes, writeRoutes } from './daemon.ts';
|
|
40
46
|
import { ask, askBeing, side, reach, type Run } from './client.ts';
|
|
@@ -55,7 +61,7 @@ function parse(argv: string[]) {
|
|
|
55
61
|
else rest.push(a);
|
|
56
62
|
}
|
|
57
63
|
const [cmd, json, more, third] = rest;
|
|
58
|
-
return { cmd, json, more, third, flags, dir: flags.dir ?? process.env.
|
|
64
|
+
return { cmd, json, more, third, flags, dir: flags.dir ?? process.env.NERVUR_DIR ?? join(homedir(), '.nervur'), ward: flags.ward, via: flags.via };
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
const print = (v: unknown) => console.log(JSON.stringify(v, null, 2));
|
|
@@ -69,7 +75,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
69
75
|
}
|
|
70
76
|
if (cmd === 'default') {
|
|
71
77
|
if (!json) {
|
|
72
|
-
console.error('
|
|
78
|
+
console.error('nervur default <ward>');
|
|
73
79
|
return 2;
|
|
74
80
|
}
|
|
75
81
|
await DiskHarbor.setDefault(dir, json);
|
|
@@ -78,7 +84,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
78
84
|
}
|
|
79
85
|
if (cmd === 'show' || cmd === 'hide') {
|
|
80
86
|
if (!json) {
|
|
81
|
-
console.error(`
|
|
87
|
+
console.error(`nervur ${cmd} <ward>`);
|
|
82
88
|
return 2;
|
|
83
89
|
}
|
|
84
90
|
await DiskHarbor.setShown(dir, json, cmd === 'show');
|
|
@@ -87,7 +93,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
87
93
|
}
|
|
88
94
|
if (cmd === 'domain') {
|
|
89
95
|
if (!json) {
|
|
90
|
-
console.error('
|
|
96
|
+
console.error('nervur domain <domain>');
|
|
91
97
|
return 2;
|
|
92
98
|
}
|
|
93
99
|
print({ routes: await writeRoutes(dir, json) });
|
|
@@ -99,18 +105,18 @@ async function main(argv: string[]): Promise<number> {
|
|
|
99
105
|
const wardOf = async () => flags.ward ?? (await DiskHarbor.defaultOf(dir));
|
|
100
106
|
if (cmd === 'side' || cmd === 'run') {
|
|
101
107
|
if (!flags.as) {
|
|
102
|
-
console.error(`
|
|
108
|
+
console.error(`nervur ${cmd} needs --as NAME`);
|
|
103
109
|
return 2;
|
|
104
110
|
}
|
|
105
111
|
let run: Run | undefined;
|
|
106
112
|
if (cmd === 'run') {
|
|
107
|
-
const url = flags.url ?? process.env.
|
|
108
|
-
const model = flags.model ?? process.env.
|
|
113
|
+
const url = flags.url ?? process.env.NERVUR_MODEL_URL;
|
|
114
|
+
const model = flags.model ?? process.env.NERVUR_MODEL;
|
|
109
115
|
if (!url || !model) {
|
|
110
|
-
console.error('
|
|
116
|
+
console.error('nervur run needs --url URL and --model NAME, or NERVUR_MODEL_URL and NERVUR_MODEL');
|
|
111
117
|
return 2;
|
|
112
118
|
}
|
|
113
|
-
const key = process.env.
|
|
119
|
+
const key = process.env.NERVUR_MODEL_KEY;
|
|
114
120
|
const turns = flags.turns !== undefined ? Number(flags.turns) : undefined;
|
|
115
121
|
if (turns !== undefined && !(Number.isInteger(turns) && turns > 0)) {
|
|
116
122
|
console.error('--turns is a positive integer');
|
|
@@ -129,7 +135,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
129
135
|
return -1;
|
|
130
136
|
}
|
|
131
137
|
if (cmd === 'serve') {
|
|
132
|
-
const port = flags.http ?? process.env.
|
|
138
|
+
const port = flags.http ?? process.env.NERVUR_HTTP;
|
|
133
139
|
const s = await serve(dir, port !== undefined ? { http: { port: Number(port) } } : {});
|
|
134
140
|
print({ dir: s.harbor.dir, sock: s.sock, side: s.side, http: s.http ? `http://${s.http.host}:${s.http.port}` : null, dial: s.quo.dialers.map((d) => d.url), wards: Object.fromEntries([...s.harbor.wards].map(([n, h]) => [n, h.pk])) });
|
|
135
141
|
const stop = () => void s.close().then(() => process.exit(0));
|
|
@@ -139,19 +145,19 @@ async function main(argv: string[]): Promise<number> {
|
|
|
139
145
|
}
|
|
140
146
|
if (cmd === 'estate') {
|
|
141
147
|
if (!json || !flags.domain) {
|
|
142
|
-
console.error('
|
|
148
|
+
console.error('nervur estate needs <dir> --domain D');
|
|
143
149
|
return 2;
|
|
144
150
|
}
|
|
145
151
|
print(await estate(json, flags.domain));
|
|
146
152
|
return 0;
|
|
147
153
|
}
|
|
148
154
|
// The root reaching into a being of its own ward. Two positionals and the
|
|
149
|
-
// args as JSON, because a human writes this one by hand: `
|
|
155
|
+
// args as JSON, because a human writes this one by hand: `nervur ask clock keep
|
|
150
156
|
// '{"id":"nightly","ask":"desk.hello","cron":"0 3 * * *"}'`. With no
|
|
151
157
|
// method it is that being's describe, as the device sees her.
|
|
152
158
|
if (cmd === 'ask') {
|
|
153
159
|
if (!json) {
|
|
154
|
-
console.error('
|
|
160
|
+
console.error('nervur ask needs <being> [method] [json]');
|
|
155
161
|
return 2;
|
|
156
162
|
}
|
|
157
163
|
const out = await askBeing(dir, json, more, third ? (JSON.parse(third) as Record<string, unknown>) : {}, await wardOf());
|
|
@@ -161,7 +167,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
161
167
|
}
|
|
162
168
|
if (cmd === 'reach') {
|
|
163
169
|
if (!json || !more) {
|
|
164
|
-
console.error('
|
|
170
|
+
console.error('nervur reach needs <pk> <url>');
|
|
165
171
|
return 2;
|
|
166
172
|
}
|
|
167
173
|
const out = await reach(dir, json, more);
|
|
@@ -188,7 +194,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
188
194
|
const failed = 'error' in out || (typeof out.result === 'object' && out.result !== null && 'error' in out.result);
|
|
189
195
|
return failed ? 1 : 0;
|
|
190
196
|
}
|
|
191
|
-
console.error('usage:
|
|
197
|
+
console.error('usage: nervur init|default|show|hide|domain|serve|census|boot|public|invite|knock|remove|unboot|ask|side|run|pilot|reach|estate [--dir D] [--ward W] [--via S] [--as NAME] [--url URL --model NAME] [json]');
|
|
192
198
|
return 2;
|
|
193
199
|
}
|
|
194
200
|
|
package/cli/pilot.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// The owner pilot: `
|
|
2
|
+
// The owner pilot: `nervur pilot`. The model side pointed at a ward instead of
|
|
3
3
|
// an avatar. The ward is a being to her owner, so her describe is the tool
|
|
4
4
|
// list and a tool call is an owner ask, exactly as for anyone; nothing here
|
|
5
5
|
// names an ask. Whoever runs this process is the owner, by the device's own
|
|
6
6
|
// rules: the root of the ward here, through the daemon's socket, or, with
|
|
7
7
|
// `via`, an owner at another ward's door, on a standing the user being here
|
|
8
8
|
// holds there. The owner creates and places; the work goes through
|
|
9
|
-
// `
|
|
9
|
+
// `nervur side`, under a gate.
|
|
10
10
|
//
|
|
11
11
|
// It stands here and not in `mcp/`, because what it is made of is the
|
|
12
12
|
// daemon's socket: `mcp/` holds the model side itself, the subject it is
|
|
13
13
|
// given comes from a client of the daemon, and the client is this folder's.
|
|
14
14
|
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
15
|
-
import type { Answer, Blueprint, JsonObject } from '
|
|
15
|
+
import type { Answer, Blueprint, JsonObject } from 'nervur';
|
|
16
16
|
import { ask } from './client.ts';
|
|
17
17
|
import type { Serving } from '../beings/side.ts';
|
|
18
18
|
import { mcpSide, type Subject } from '../mcp/server.ts';
|
package/cli/stand.ts
CHANGED
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
//
|
|
28
28
|
// **It adds and never removes.** A line taken out of a script leaves its
|
|
29
29
|
// relation standing, because silently unplacing a relation is a wake that
|
|
30
|
-
// stops with nobody told. Removal is a deliberate `
|
|
30
|
+
// stops with nobody told. Removal is a deliberate `nervur remove`.
|
|
31
31
|
//
|
|
32
32
|
// **It fails loudly.** A line that will not place stops the script where it
|
|
33
33
|
// is, and a harbor half stood is said, never served.
|
|
34
|
-
import type { Invitation, JsonObject } from '
|
|
35
|
-
import type { Harbor } from '
|
|
34
|
+
import type { Invitation, JsonObject } from 'nervur';
|
|
35
|
+
import type { Harbor } from 'nervur/harbor';
|
|
36
36
|
import { DiskHarbor } from '../harbor/disk.ts';
|
|
37
37
|
|
|
38
38
|
// A being the estate boots, and where; `public` marks her as the one being
|
package/dist/api/route.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Handler } from '../harbor/http.ts';
|
|
2
|
-
import type { Hosted } from '
|
|
2
|
+
import type { Hosted } from 'nervur/harbor';
|
|
3
3
|
import type { Avatar } from '../beings/avatar.ts';
|
|
4
4
|
import type { Grants } from '../dock/grants.ts';
|
|
5
|
-
import { type Invitation } from '
|
|
5
|
+
import { type Invitation } from 'nervur';
|
|
6
6
|
export type Held = {
|
|
7
7
|
wards: ReadonlyMap<string, Hosted>;
|
|
8
8
|
here(): string;
|
package/dist/api/route.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readText } from '../harbor/http.js';
|
|
|
2
2
|
import { invitationOf } from '../beings/link.js';
|
|
3
3
|
import { landed, POLICY } from '../human/door.js';
|
|
4
4
|
import { CSS } from '../human/style.js';
|
|
5
|
-
import { isInvitation, isSilence, isWord, wordOf } from '
|
|
5
|
+
import { isInvitation, isSilence, isWord, wordOf } from 'nervur';
|
|
6
6
|
const open = { 'access-control-allow-origin': '*', 'access-control-allow-methods': 'GET, POST, OPTIONS', 'access-control-allow-headers': 'content-type, authorization' };
|
|
7
7
|
const word = (s) => (typeof s === 'string' && /^[\w.-]{1,40}$/.test(s) ? s : null);
|
|
8
8
|
export function apiRoute(harbor, o) {
|
|
@@ -13,7 +13,7 @@ export function apiRoute(harbor, o) {
|
|
|
13
13
|
// that was sent here and never for a script somewhere else. Its policy
|
|
14
14
|
// is the allow page's, and for the same reason: a page that runs no
|
|
15
15
|
// script of its own should be allowed none.
|
|
16
|
-
const page = (status, body) => new Response(`<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>
|
|
16
|
+
const page = (status, body) => new Response(`<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>nervur</title>\n<style>${CSS}</style>\n</head><body>${body}</body></html>`, {
|
|
17
17
|
status,
|
|
18
18
|
headers: { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store', 'content-security-policy': POLICY, 'referrer-policy': 'no-referrer' },
|
|
19
19
|
});
|
package/dist/beings/avatar.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Answer, Blueprint, Invitation, JsonObject, OccupantRecord, Wanted } from '
|
|
1
|
+
import type { Answer, Blueprint, Invitation, JsonObject, OccupantRecord, Wanted } from 'nervur';
|
|
2
2
|
import { Carrier } from './carry.ts';
|
|
3
3
|
export declare const USER = "user";
|
|
4
4
|
export declare const PUSHER = "user:push";
|
package/dist/beings/avatar.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// calls the four methods below: one of the two ways in, `enter` behind a
|
|
8
8
|
// route's proof or `join` with an invitation, then `tools` and `call`.
|
|
9
9
|
// Nothing of a side is in her cells.
|
|
10
|
-
import { isSilence, isWord, wordOf } from '
|
|
10
|
+
import { isSilence, isWord, wordOf } from 'nervur';
|
|
11
11
|
import { Carrier } from './carry.js';
|
|
12
12
|
// Her one standing, and the id under which the user being pushes to her.
|
|
13
13
|
// Two ids for one far being, because standings and occupants share one
|
package/dist/beings/carry.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Asker, Blueprint, JsonObject, OccupantRecord, Reply } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Asker, Blueprint, JsonObject, OccupantRecord, Reply } from 'nervur';
|
|
3
3
|
export declare class Carrier extends Being {
|
|
4
4
|
static carries(_occupant: OccupantRecord | undefined, _asker: Asker): boolean;
|
|
5
5
|
static hidden(id: string): boolean;
|
package/dist/beings/carry.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// `look` once per digest, and keeps both in her cells. So a describe of
|
|
19
19
|
// hers may cost one ask per stale standing, which is the price of a page
|
|
20
20
|
// that is never more than one ask behind.
|
|
21
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
21
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
22
22
|
import { sanitise } from './look.js';
|
|
23
23
|
// The names a far being carries, read off her notes: every ask her
|
|
24
24
|
// `standings` groups name, and each group's page. Empty when she carries
|
package/dist/beings/clock.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Asker, Json, JsonObject, OccupantRecord, Stance } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Asker, Json, JsonObject, OccupantRecord, Stance } from 'nervur';
|
|
3
3
|
declare const root: (_occ: OccupantRecord | undefined, asker: Asker) => boolean;
|
|
4
4
|
declare const timer: (_occ: OccupantRecord | undefined, asker: Asker) => boolean;
|
|
5
5
|
declare const watching: (occ: OccupantRecord | undefined, asker: Asker) => boolean;
|
package/dist/beings/clock.js
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// and what an occupant registered on the service placement. Nothing is read
|
|
30
30
|
// from a file and nothing is set on the class, so a schedule outlives the
|
|
31
31
|
// process the way every cell does, and is gone when it is dropped.
|
|
32
|
-
import { Being, isSilence, isWord, wordOf, OWNER } from '
|
|
32
|
+
import { Being, isSilence, isWord, wordOf, OWNER } from 'nervur';
|
|
33
33
|
import { TIMER, join } from '../dock/index.js';
|
|
34
34
|
// The root and nobody else. `OWNER` is one of the ward's own words, refused at
|
|
35
35
|
// every mint, so no occupant can ever wear it: an ask gated this way is the
|
package/dist/beings/courier.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Invitation, JsonObject, OccupantRecord } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Invitation, JsonObject, OccupantRecord } from 'nervur';
|
|
3
3
|
export declare const MOVER = "mover";
|
|
4
4
|
export type Moving = {
|
|
5
5
|
world: string;
|
package/dist/beings/courier.js
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
// the shell holding this device when it is asked for, and what arrives goes
|
|
27
27
|
// back to the shell, since a partition written into another ward's cells is
|
|
28
28
|
// a copy nobody asked for.
|
|
29
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
29
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
30
30
|
// The id each end knows the other by for the length of one move.
|
|
31
31
|
export const MOVER = 'mover';
|
|
32
32
|
const HEX = /^(?:[0-9a-f]{2})+$/;
|
package/dist/beings/desk.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Asker, Blueprint, JsonObject, Reply, Stance } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Asker, Blueprint, JsonObject, Reply, Stance } from 'nervur';
|
|
3
3
|
export declare class Desk extends Being {
|
|
4
4
|
static asks: {
|
|
5
5
|
hello: {
|
|
@@ -49,5 +49,5 @@ export declare class Desk extends Being {
|
|
|
49
49
|
kinds: string[];
|
|
50
50
|
};
|
|
51
51
|
send(args: JsonObject): Promise<JsonObject>;
|
|
52
|
-
device(args: JsonObject): Promise<import("
|
|
52
|
+
device(args: JsonObject): Promise<import("nervur").Json>;
|
|
53
53
|
}
|
package/dist/beings/desk.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// judges nothing here: she does not know what an address is, whether one was
|
|
17
17
|
// sent to before, or what a link says. She keeps the ways in named in one
|
|
18
18
|
// place, so a side that renders her renders every way into this world.
|
|
19
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
19
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
20
20
|
import { join } from '../dock/faculty.js';
|
|
21
21
|
import { LOCAL } from '../dock/local.js';
|
|
22
22
|
import { WAY, kindOf, verified } from './way.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Asker, JsonObject, OccupantRecord } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Asker, JsonObject, OccupantRecord } from 'nervur';
|
|
3
3
|
declare const isDevice: (occ: OccupantRecord | undefined) => boolean;
|
|
4
4
|
declare const isWorld: (occ: OccupantRecord | undefined) => boolean;
|
|
5
5
|
declare const isMaker: (occ: OccupantRecord | undefined) => occ is OccupantRecord;
|
|
@@ -67,7 +67,7 @@ export declare class Doorbell extends Being {
|
|
|
67
67
|
for: typeof isWorld;
|
|
68
68
|
};
|
|
69
69
|
};
|
|
70
|
-
describe(asker: Parameters<Being['describe']>[0]): import("
|
|
70
|
+
describe(asker: Parameters<Being['describe']>[0]): import("nervur").Blueprint;
|
|
71
71
|
claim(_args: JsonObject, asker: Asker): Promise<JsonObject>;
|
|
72
72
|
keep(args: JsonObject): JsonObject;
|
|
73
73
|
admit(_args: JsonObject): Promise<JsonObject>;
|
package/dist/beings/doorbell.js
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// in. The device hands its banner key to a world itself, beside the
|
|
22
22
|
// invitation to this doorbell, so a bell that held both halves of the
|
|
23
23
|
// relation is a bell that could read a banner, and this one cannot.
|
|
24
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
24
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
25
25
|
const DEVICE = 'device';
|
|
26
26
|
// Her standing at the box's push faculty, under an id of her own. The ward
|
|
27
27
|
// knocks and takes it for her, and the invitation never reaches her.
|
package/dist/beings/envoy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { Asker, AskSpec, JsonObject, OccupantRecord } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { Asker, AskSpec, JsonObject, OccupantRecord } from 'nervur';
|
|
3
3
|
export declare const owner: (_rec: OccupantRecord | undefined, asker: Asker) => boolean;
|
|
4
4
|
export declare const occupant: (rec: OccupantRecord | undefined) => boolean;
|
|
5
5
|
export declare const places: (rec: OccupantRecord | undefined, asker: Asker) => boolean;
|
package/dist/beings/envoy.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// bytes checked before anything is parsed, the id kept bounded so a retry
|
|
19
19
|
// lands once, `{ ok }` answered before the wake goes out, a wake that meets
|
|
20
20
|
// silence written down and never retried.
|
|
21
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
21
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
22
22
|
// The two gates. The owner is the ward's ask pointer, `{ id: 'OWNER' }`,
|
|
23
23
|
// which is how the daemon asks `deliver` and how the root places a
|
|
24
24
|
// credential; an occupant is anyone holding a standing at her.
|
package/dist/beings/join.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Hosted } from '
|
|
2
|
-
import type { Invitation } from '
|
|
1
|
+
import type { Hosted } from 'nervur/harbor';
|
|
2
|
+
import type { Invitation } from 'nervur';
|
|
3
3
|
import type { Avatar } from './avatar.ts';
|
|
4
4
|
export declare function avatarOf(hosted: Hosted, identity: string): Promise<{
|
|
5
5
|
avatar?: Avatar;
|
package/dist/beings/link.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Invitation } from '
|
|
2
|
-
export declare const KEY = "
|
|
1
|
+
import type { Invitation } from 'nervur';
|
|
2
|
+
export declare const KEY = "nervur";
|
|
3
3
|
export declare const PROOF = "proof";
|
|
4
4
|
export declare function format(inv: Invitation): string;
|
|
5
5
|
export declare function parse(hash: string): Invitation | null;
|
package/dist/beings/link.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const KEY = '
|
|
1
|
+
export const KEY = 'nervur';
|
|
2
2
|
// The other reserved key: a proof, for a way in the world sent out itself.
|
|
3
3
|
// A proof is not a capability into a ward, it is a word one door will trade
|
|
4
4
|
// once for an invitation, and it rides in the fragment for the same reason:
|
|
@@ -15,7 +15,7 @@ export function format(inv) {
|
|
|
15
15
|
// The invitation in a fragment, or null. Anything else in the fragment is
|
|
16
16
|
// the page's own and is left alone.
|
|
17
17
|
export function parse(hash) {
|
|
18
|
-
const m =
|
|
18
|
+
const m = new RegExp(`(?:^#|&)${KEY}=([^&]+)`).exec(hash.startsWith('#') ? hash : `#${hash}`);
|
|
19
19
|
if (!m)
|
|
20
20
|
return null;
|
|
21
21
|
const v = decodeURIComponent(m[1]);
|
|
@@ -55,7 +55,7 @@ export function proofLink(page, kind, token) {
|
|
|
55
55
|
return `${page}#${PROOF}=${encodeURIComponent(`${kind}.${token}`)}`;
|
|
56
56
|
}
|
|
57
57
|
// The invitation as a human hands it over: the compact form, the whole link
|
|
58
|
-
// it came in, or the JSON value `
|
|
58
|
+
// it came in, or the JSON value `nervur invite` printed. Wherever a person
|
|
59
59
|
// types or pastes an invitation, this is what reads it, so the three forms
|
|
60
60
|
// are one form everywhere.
|
|
61
61
|
export function invitationOf(text) {
|
package/dist/beings/look.d.ts
CHANGED
package/dist/beings/porter.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Being } from '
|
|
2
|
-
import type { JsonObject } from '
|
|
1
|
+
import { Being } from 'nervur';
|
|
2
|
+
import type { JsonObject } from 'nervur';
|
|
3
3
|
export declare class Porter extends Being {
|
|
4
4
|
static cells: JsonObject;
|
|
5
5
|
static asks: {
|
package/dist/beings/porter.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// twice is two doorbells and no harm. A stranger who keeps knocking is the
|
|
14
14
|
// harbor's, never hers and never the door's, and the count below is only so
|
|
15
15
|
// that a loop in this session stops somewhere a human can see.
|
|
16
|
-
import { Being, isSilence, isWord, wordOf } from '
|
|
16
|
+
import { Being, isSilence, isWord, wordOf } from 'nervur';
|
|
17
17
|
const ROOM = 64;
|
|
18
18
|
export class Porter extends Being {
|
|
19
19
|
static cells = { minted: 0 };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Asker, OccupantRecord, Stance } from '
|
|
1
|
+
import type { Asker, OccupantRecord, Stance } from 'nervur';
|
|
2
2
|
import { Avatar } from './avatar.ts';
|
|
3
3
|
export declare class Presence extends Avatar {
|
|
4
4
|
static carries(occupant: OccupantRecord | undefined, _asker: Asker): boolean;
|
package/dist/beings/setup.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Hosted } from '
|
|
1
|
+
import type { Hosted } from 'nervur/harbor';
|
|
2
2
|
export declare function setupHome(hosted: Hosted, user: string): Promise<void>;
|
|
3
3
|
export declare function setup(hosted: Hosted, user: string, cls?: string): Promise<void>;
|
package/dist/beings/side.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Answer, Blueprint, Json, JsonObject, Wanted, WordName } from '
|
|
1
|
+
import type { Answer, Blueprint, Json, JsonObject, Wanted, WordName } from 'nervur';
|
|
2
2
|
import type { Avatar } from './avatar.ts';
|
|
3
3
|
export type Serving = {
|
|
4
4
|
close(): Promise<void>;
|
package/dist/beings/side.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// her one standing, and a push as a notification. Sides in this repository:
|
|
6
6
|
// a screen, an MCP server, a runner, an event-driven agent. None knows
|
|
7
7
|
// another exists, and none of this file names a platform.
|
|
8
|
-
import { isSilence, isUnreached, isWord, wordOf } from '
|
|
8
|
+
import { isSilence, isUnreached, isWord, wordOf } from 'nervur';
|
|
9
9
|
export function word(answer) {
|
|
10
10
|
if (isSilence(answer))
|
|
11
11
|
return { word: 'silence' };
|
package/dist/beings/user.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Asker, Blueprint, Invitation, JsonObject, OccupantRecord, Stance } from '
|
|
1
|
+
import type { Asker, Blueprint, Invitation, JsonObject, OccupantRecord, Stance } from 'nervur';
|
|
2
2
|
import { Carrier } from './carry.ts';
|
|
3
3
|
export declare const DESK = "desk";
|
|
4
4
|
export declare const BELL = "bell";
|
|
@@ -195,7 +195,7 @@ export declare class User extends Carrier {
|
|
|
195
195
|
};
|
|
196
196
|
hello(args: JsonObject, asker: Asker): Promise<{
|
|
197
197
|
welcome: string | null;
|
|
198
|
-
name: import("
|
|
198
|
+
name: import("nervur").Json;
|
|
199
199
|
}>;
|
|
200
200
|
wayBack(id: string, inv: Invitation): Promise<boolean>;
|
|
201
201
|
whoami(_args: JsonObject, asker: Asker): {
|
|
@@ -208,7 +208,7 @@ export declare class User extends Carrier {
|
|
|
208
208
|
pushed?: undefined;
|
|
209
209
|
} | {
|
|
210
210
|
error?: undefined;
|
|
211
|
-
pushed: import("
|
|
211
|
+
pushed: import("nervur").Json;
|
|
212
212
|
} | {
|
|
213
213
|
unreached: boolean;
|
|
214
214
|
rang: boolean;
|
package/dist/beings/user.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// client identity the desk established. A device she let mint brings the
|
|
8
8
|
// next one in, so a human adds a device from a device already in and only
|
|
9
9
|
// the first one has to come from the root, on the box.
|
|
10
|
-
import { isInvitation, isSilence, isWord, wordOf } from '
|
|
10
|
+
import { isInvitation, isSilence, isWord, wordOf } from 'nervur';
|
|
11
11
|
import { Carrier } from './carry.js';
|
|
12
12
|
import { PUSH, banner, isToken, join, sealBanner } from '../dock/index.js';
|
|
13
13
|
export const DESK = 'desk';
|