@ours.network/install 1.2.1-nightly.42 → 1.2.1-nightly.44

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/README.md CHANGED
@@ -1,3 +1,87 @@
1
+ ## Start here: choose what you want
2
+
3
+ Run `ours-install` with no options. It asks what you would like to do, in terms of goals:
4
+
5
+ ```
6
+ What would you like to do?
7
+ > (●) Add collaboration tools to my agent apps (Claude Code, Codex or another app)
8
+ ( ) Install the complete Ours workspace
9
+ ( ) Connect my agent apps to an Ours workspace that runs on another computer
10
+ ( ) Other setups (server only, custom ports or packages)
11
+ ```
12
+
13
+ Your existing agent configuration, skills, plugins and custom settings stay as they are. Ours adds its own tools next to them; it does not replace or reconfigure your setup.
14
+
15
+ **Collaboration tools** (`--plugin-only`) give the agent apps you already use their own secure Ours identity, so they can message other agents and people, share files and be woken when mail arrives. They install:
16
+
17
+ - one container: the Ours daemon, published only on `127.0.0.1` (port 3050 by default); nothing else runs;
18
+ - the Ours plugin in each selected app that was found on this computer: Claude Code and/or Codex;
19
+ - the Ours command-line tools and the saved connection in `~/.ours-client`.
20
+
21
+ No Cowork, Messenger, Telegram, Fleet or gateway containers are installed. Clients reach the daemon through a small prefix inside the daemon container that serves only `/daemon/…`, passes requests through unchanged (the daemon still checks every credential) and refuses every other path.
22
+
23
+ ```sh
24
+ ours-install --plugin-only --state-dir ~/.ours-install --identity-name "Your Name" --integrations claude-code,codex
25
+ ```
26
+
27
+ **The complete workspace** adds rooms per task where you invite other agents and people, task and progress tracking, access from your phone through the Ours App, persistent agents that keep working (Fleet), and orchestration of agents from several vendors.
28
+
29
+ **Another agent app.** Choose "Another agent app" in the list. At the end the installer prints exact instructions for the version it installed: the prepared plugin folder, the MCP server command (`node <folder>/bin/proxy.mjs`, stdio), the skill file, and the npm package `@ours.network/claude-code@<version>`. The app must be able to run a local stdio MCP server and must set `CLAUDE_CODE_SESSION_ID` to a value unique to each agent session in that server's environment; without it the Ours tools refuse to act. Apps that cannot run MCP servers cannot use Ours this way. Do not use the public GitHub marketplace `adapt-toolkit/ours-claude-marketplace` with this release: it currently selects an older, incompatible plugin.
30
+
31
+ ### Updating
32
+
33
+ When Ours is already installed, `ours-install` shows the installation and offers:
34
+
35
+ ```
36
+ ◆ Ours is already set up on this computer
37
+ • The complete Ours workspace — folder /home/me/.ours-install, running in Docker
38
+ What would you like to do?
39
+ > (●) Update Ours (recommended)
40
+ ( ) Repair: run setup again with the same choices
41
+ ( ) Remove Ours from this computer
42
+ ( ) Cancel
43
+ ```
44
+
45
+ An update keeps the installation's product (collaboration tools or workspace), runtime, folder, identities, data, connected apps and their settings. It never adds workspace parts to a collaboration-tools installation; to switch, remove it first. An unfinished update or setup is offered as "Finish the earlier update or setup". Running the same setup again is safe: it keeps existing identities, and if the server's access credentials were replaced (`ours-install server access-replace`), it issues a fresh client credential.
46
+
47
+ ### Removing Ours completely
48
+
49
+ ```sh
50
+ ours-install remove # everything Ours created on this computer
51
+ ours-install remove --dry-run # only show the list
52
+ ours-install remove --state-dir ~/.ours-install # one installation
53
+ ```
54
+
55
+ The command lists everything it found, grouped (services and containers; identities, keys, messages and settings; connections in your agent apps; persistent agents; programs and downloads; earlier installations), and what it keeps and why. Then it asks you to type `remove ours`. It runs only in a terminal; identities and their private keys exist nowhere else, so they are never deleted without a person confirming. Make a backup first if you may need them: `ours-install server backup server <label> --state-dir <folder>`.
56
+
57
+ What it removes, and how it proves each item is Ours:
58
+
59
+ | Item | Proof required |
60
+ | --- | --- |
61
+ | Containers | Compose project of the installation **and** a Compose project folder inside the installation folder (containers inherit image labels, so a label alone is not proof), or the installer's own helper names on its own image |
62
+ | Images | the image ID recorded when this installer built it, or the image an owned container was created from; a name alone is never proof; only the name is removed (`docker image rm <tag>`, never by ID or with force) |
63
+ | Volumes, network | the installation's Compose project label |
64
+ | Build cache | only the record whose description is the installer's own npm cache mount (`id=/ours-dist-2-npm`), pruned by its record ID (`docker buildx prune --filter id=…`); kept while another Ours installation uses the engine |
65
+ | Installation and connection folders | their own record (`installation.json` / `profile.json`) still names the installation; the folder is renamed aside, then deleted |
66
+ | Downloaded programs | the owner record of each download folder; a damaged record keeps the folder |
67
+ | Claude Code / Codex | the Ours plugin and plugin source (through their own CLIs), their Ours entries in `settings.json` / `config.toml`, and their cached copy of the Ours plugin, only when the source points into Ours downloads |
68
+ | Ours tool records `~/.ours-mcp` | only the rows and session folders of the removed installation |
69
+ | Persistent agents (Fleet) | services that reference this Ours connection, Fleet configuration and state set up by this client |
70
+ | Earlier installations | old daemon and connector services, verified stopped first; marked plugin sections and old skills |
71
+
72
+ It keeps Docker, Node.js, npm, Claude Code and Codex, your other settings, skills and plugins, shared images such as `node:24`, other build cache records, containers and images it cannot prove, and the temporary session guards in `/tmp/ours-<uid>` that every Ours tool session of your user shares.
73
+
74
+ If something cannot be removed, the summary says exactly what and why, the command exits with status 1 and keeps a small retry record (`~/.ours-removal.json`, identities only). Fix the reason and run `ours-install remove` again; it continues where it stopped:
75
+
76
+ ```
77
+ ◆ Removal summary
78
+ ! Some Ours items could not be removed yet:
79
+ ! - Container images of ours-235c4591528dc8a6 — ours-235c4591528dc8a6:runtime is still used by container user-made, which Ours did not create; remove that container if you no longer need it
80
+ • Fix the reason shown, then run ours-install remove again; it continues from where it stopped.
81
+ ```
82
+
83
+ Running it when nothing is left changes nothing and says so.
84
+
1
85
  ## Install first, connect the App afterwards
2
86
 
3
87
  ```sh
@@ -655,7 +739,7 @@ Existing installation records keep their ports and identities. A listener acquir
655
739
  by another process after preflight still causes startup to fail safely; no foreign
656
740
  process is stopped and no retained installation is silently moved.
657
741
 
658
- Workspace setup pins Fleet `1.2.0-nightly.54` with its recorded registry integrity. This release includes first-time Fleet setup through the host API for the account App, direct App access to the workspace services with the device credential, v2 positional one-use grants and automatic QR/connection-code output from `ours-fleet setup-tunnel`, optional private file/stdin inputs for legacy v1 payloads, a separate `ours-fleet link-device` command for additional devices, host prerequisite checks before the one-time workspace proof (`setup-tunnel --check`), `setup-tunnel --resume` to finish a setup that stopped after the host saved its private pending setup record (not when the proof's answer was lost, or after the setup window expired with an unconfirmed non-default port), and persists the available Fleet loopback port used by the workspace tunnel. It also accepts a setup-generated configuration left behind after the host enrollment state was removed, runs the host Codex when it is at least as new as the packaged one, offers only the Codex models the signed-in account can use, and removes the temporary setup contact after confirmation. Fleet serves no pages and opens no browser: every screen is in the App. Fleet also serves the workspace notification routes, produces notifications through the server gateway with the imported producer credential, accepts the App's device credential on the notification presence socket so an open App receives no push, and defaults agent wakes to `monitor.interrupt: after_tool` (Hermes: no interrupt; role snapshots saved before this default keep no interrupt). Existing installation identities and configured ports remain retained; a retained-port collision fails safely.
742
+ Workspace setup pins Fleet `1.2.0-nightly.57` with its recorded registry integrity. This release includes first-time Fleet setup through the host API for the account App, direct App access to the workspace services with the device credential, v2 positional one-use grants and automatic QR/connection-code output from `ours-fleet setup-tunnel`, optional private file/stdin inputs for legacy v1 payloads, a separate `ours-fleet link-device` command for additional devices, host prerequisite checks before the one-time workspace proof (`setup-tunnel --check`), `setup-tunnel --resume` to finish a setup that stopped after the host saved its private pending setup record (not when the proof's answer was lost, or after the setup window expired with an unconfirmed non-default port), and persists the available Fleet loopback port used by the workspace tunnel. It also accepts a setup-generated configuration left behind after the host enrollment state was removed, runs the host Codex when it is at least as new as the packaged one, offers only the Codex models the signed-in account can use, and removes the temporary setup contact after confirmation. Fleet serves no pages and opens no browser: every screen is in the App. Fleet also serves the workspace notification routes, produces notifications through the server gateway with the imported producer credential, accepts the App's device credential on the notification presence socket so an open App receives no push, and defaults agent wakes to `monitor.interrupt: after_tool` (Hermes: no interrupt; role snapshots saved before this default keep no interrupt). Existing installation identities and configured ports remain retained; a retained-port collision fails safely.
659
743
 
660
744
  ### App tunnel setup prerelease sequencing
661
745
 
@@ -672,7 +756,7 @@ connection code automatically; the App checks readiness and opens the code field
672
756
  Private `--file`/`--stdin` transports remain optional and are the only transports
673
757
  for legacy v1 payloads with long-lived credentials.
674
758
 
675
- The nightly installer release manifest selects published Fleet `1.2.0-nightly.54`
759
+ The nightly installer release manifest selects published Fleet `1.2.0-nightly.57`
676
760
  and its actual registry integrity through the normal release manifest/source-policy
677
761
  generators. This release includes v2 argument and private-input support. The former
678
762
  nightly.41 selection predates this capability. Merge and publish the repinned
@@ -729,7 +813,14 @@ Recovery introduces no host watchdog or service.
729
813
  Host boot is a separate prerequisite. On Linux, enable the selected Docker
730
814
  Engine system service; rootless Docker additionally needs its user service and
731
815
  user linger. The installer reports read-only boot diagnostics and does not enable
732
- or restart host services. A reachable remote Engine or Docker Desktop context
816
+ or restart host services. It reads the persistent `docker.service` unit-file
817
+ state, not whether Docker is running now: when Docker is running but not enabled,
818
+ it says that ours components depending on Docker will not start automatically
819
+ after a reboot and prints the optional command (`sudo systemctl enable
820
+ docker.service`, or `systemctl --user enable docker.service` plus
821
+ `sudo loginctl enable-linger USER` for rootless Docker). A masked unit, or a host
822
+ not booted with systemd or with no `docker.service` (WSL with Docker Desktop integration, snap,
823
+ OpenRC and similar), gets the same warning without a systemctl command. A reachable remote Engine or Docker Desktop context
733
824
  cannot prove boot recovery on this machine. A custom Unix socket also has an
734
825
  unverified boot-service binding; a host unit cannot establish its startup. On macOS/Windows with WSL, enable Docker
735
826
  Desktop startup at sign-in; this does not provide pre-login startup. Rootless
package/assets/Dockerfile CHANGED
@@ -28,6 +28,7 @@ COPY --chmod=644 scripts/runtime/legacy-import.mjs /opt/ours/docker/legacy-impor
28
28
  COPY --chmod=644 scripts/runtime/entrypoint.sh /opt/ours/docker/entrypoint.sh
29
29
  COPY --chmod=644 scripts/runtime/healthcheck.mjs /opt/ours/docker/healthcheck.mjs
30
30
  COPY --chmod=644 scripts/runtime/start-telegram.sh scripts/runtime/health-telegram.sh scripts/runtime/start-cowork.sh scripts/runtime/health-cowork.sh scripts/runtime/start-messenger.sh scripts/runtime/health-messenger.mjs scripts/runtime/notifications-gateway.mjs scripts/runtime/supervise.mjs scripts/runtime/recover.mjs scripts/runtime/dependency-ready.mjs /opt/ours/docker/
31
+ COPY --chmod=644 scripts/runtime/daemon-client-prefix.mjs /opt/ours/docker/daemon-client-prefix.mjs
31
32
  RUN chmod 755 /opt/ours/maintenance /opt/ours/docker
32
33
  FROM node:24 AS maintenance
33
34
  LABEL network.ours.build-context="1"
@@ -13,10 +13,10 @@
13
13
  "@ours.network/codex": "1.2.0-nightly.13",
14
14
  "@ours.network/cowork": "1.3.3-nightly.20261005.f549477",
15
15
  "@ours.network/daemon": "3.8.1-nightly.9",
16
- "@ours.network/fleet": "1.2.0-nightly.54",
16
+ "@ours.network/fleet": "1.2.0-nightly.57",
17
17
  "@ours.network/mcp": "1.2.0-nightly.13",
18
18
  "@ours.network/messenger-server": "1.0.31-nightly.17",
19
- "@ours.network/notifications": "0.3.1-nightly.2",
19
+ "@ours.network/notifications": "0.3.1-nightly.3",
20
20
  "@ours.network/sdk": "3.8.1-nightly.17",
21
21
  "@ours.network/tg-connector": "1.0.1-nightly.11"
22
22
  }
@@ -429,9 +429,9 @@
429
429
  }
430
430
  },
431
431
  "node_modules/@agentclientprotocol/sdk": {
432
- "version": "1.7.0",
433
- "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.7.0.tgz",
434
- "integrity": "sha512-ZORuxsuEnLjRly7t6Ad7zAsWitjWsyprswyPUHz/yycPb+tTm3DGa8XheaHhRXqX8LS9snuxaYavXSRA50TlHw==",
432
+ "version": "1.8.0",
433
+ "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.8.0.tgz",
434
+ "integrity": "sha512-fbP7qHZsFyTJVT0/RPrcWJ8An26qLXHEuGCHHEKDyxD1xpXV+Ejyh2LAE6vBAFePkpVjZeeohnbgvuEhZ7wLMg==",
435
435
  "license": "Apache-2.0",
436
436
  "peerDependencies": {
437
437
  "zod": "^3.25.0 || ^4.0.0"
@@ -542,9 +542,9 @@
542
542
  ]
543
543
  },
544
544
  "node_modules/@anthropic-ai/sdk": {
545
- "version": "0.132.1",
546
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.132.1.tgz",
547
- "integrity": "sha512-Dg+Rd0effi+4FyNwgEx6JXl9COefsZ3C7BOPSKYIWboQOEIi9HXtu1WBdND0DIgMF7Qt1vuCSjsbs7sjUkzJuQ==",
545
+ "version": "0.133.0",
546
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.133.0.tgz",
547
+ "integrity": "sha512-jlqUN8p8ESTJj+GJnA4KjzbEfF1waEoGzRT8jwytlYGFFgv+/DUQOxlYGvYw10UzhD1kwLqYzxvA3FrTB2YWuQ==",
548
548
  "license": "MIT",
549
549
  "optional": true,
550
550
  "peer": true,
@@ -585,9 +585,9 @@
585
585
  }
586
586
  },
587
587
  "node_modules/@fastify/ajv-compiler": {
588
- "version": "4.0.6",
589
- "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.6.tgz",
590
- "integrity": "sha512-NtuzM0SfaMJbGlnjr9LWQUN5LzgSrbB8tf/wRZNas+4E1O/Nmzl53e7ruT61HDZyRCJGC6FxIogmNZO1c5ETBA==",
588
+ "version": "4.0.7",
589
+ "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.7.tgz",
590
+ "integrity": "sha512-VP0yIfwlc1ohj733keYDqyHm1VWeP9VQxYomunhr90jkC4aNNibbkrRiaNgPgqj1ORxUenILR4qzA/ppYBNAtQ==",
591
591
  "funding": [
592
592
  {
593
593
  "type": "github",
@@ -606,9 +606,9 @@
606
606
  }
607
607
  },
608
608
  "node_modules/@fastify/ajv-compiler/node_modules/fast-uri": {
609
- "version": "4.2.1",
610
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.1.tgz",
611
- "integrity": "sha512-TmHQgewjHtMq1E5QKA0tOE0yeYGQs25KZC/ziJpubRtWI15W92e6vPFydWOeZBVROSHBYw/QhD9d5OefdD6LDg==",
609
+ "version": "4.2.2",
610
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.2.tgz",
611
+ "integrity": "sha512-EwVpUMzLVNOmcWW0zi5G3JJwkopB6XXjnVvNBGfqrMMsVew2hkQWl5e/pe/CfYUeS6jt4cIO2MnamEW7v/7wPw==",
612
612
  "funding": [
613
613
  {
614
614
  "type": "github",
@@ -621,10 +621,26 @@
621
621
  ],
622
622
  "license": "BSD-3-Clause"
623
623
  },
624
+ "node_modules/@fastify/deepmerge": {
625
+ "version": "3.2.2",
626
+ "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-3.2.2.tgz",
627
+ "integrity": "sha512-155eqA/WMQdN6gUD4RrhS2K0Pcz2Ou9pQ86L0sipOpP9ONbTA6oYw/hW4VdBjR4egcDHqmWUK9x80oUX7S1mDQ==",
628
+ "funding": [
629
+ {
630
+ "type": "github",
631
+ "url": "https://github.com/sponsors/fastify"
632
+ },
633
+ {
634
+ "type": "opencollective",
635
+ "url": "https://opencollective.com/fastify"
636
+ }
637
+ ],
638
+ "license": "MIT"
639
+ },
624
640
  "node_modules/@fastify/error": {
625
- "version": "4.2.0",
626
- "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz",
627
- "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==",
641
+ "version": "4.2.1",
642
+ "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.1.tgz",
643
+ "integrity": "sha512-MYBumuIwP+5MIpXSyKm6/o1Eigcoij186lWUssX3LH5U8KWqU0ktZhzC4CErIX9EJeQeRGI+zJZQWakBlFbUcg==",
628
644
  "funding": [
629
645
  {
630
646
  "type": "github",
@@ -638,9 +654,9 @@
638
654
  "license": "MIT"
639
655
  },
640
656
  "node_modules/@fastify/fast-json-stringify-compiler": {
641
- "version": "5.1.0",
642
- "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.1.0.tgz",
643
- "integrity": "sha512-PxcYtKLbQ8Z+yApiqjK8FwxIwvEj38k2OiLc17u8dkJSlmfi2wHHPaSnaoqBPQqtvF8YVsDgDpP2snDCfFrpfw==",
657
+ "version": "5.1.1",
658
+ "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.1.1.tgz",
659
+ "integrity": "sha512-pyxRKk7UpUnnrztP9pF4+ZYxusEQ4LifTyzRdiXmyql1QezNHxO02D25MVU2o4kMeAMYWAjG6RKRlojgkbiDAw==",
644
660
  "funding": [
645
661
  {
646
662
  "type": "github",
@@ -657,9 +673,9 @@
657
673
  }
658
674
  },
659
675
  "node_modules/@fastify/forwarded": {
660
- "version": "3.0.2",
661
- "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.2.tgz",
662
- "integrity": "sha512-NE8HgKLgYejV9lDpqkEFaDKMLYelJBVfHekhB0UKvX0ghagXRJqg68feg8er1NPXxG4N9i6vPxzt8E+3wHfcmA==",
676
+ "version": "3.1.1",
677
+ "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.1.1.tgz",
678
+ "integrity": "sha512-XfDtW2Icvhqi6DP1YHFK4q/E8WpNd3+raBdzAyVZxmTInbFTtnEEKvEAMMOVdFuRyv+ynYipaA9D8FvjPqACkw==",
663
679
  "funding": [
664
680
  {
665
681
  "type": "github",
@@ -673,9 +689,9 @@
673
689
  "license": "MIT"
674
690
  },
675
691
  "node_modules/@fastify/merge-json-schemas": {
676
- "version": "0.2.1",
677
- "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz",
678
- "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==",
692
+ "version": "0.2.2",
693
+ "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.2.tgz",
694
+ "integrity": "sha512-d/gx9sRbUCVgGRGzma46wLcwiY8noTqO2Nmjg/vbTARxHRE5bdh5PIL8s97Lt1X7ScRWRW52eVYxwIoPwIdVUA==",
679
695
  "funding": [
680
696
  {
681
697
  "type": "github",
@@ -692,9 +708,9 @@
692
708
  }
693
709
  },
694
710
  "node_modules/@fastify/proxy-addr": {
695
- "version": "5.1.1",
696
- "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.1.tgz",
697
- "integrity": "sha512-zv07Y9GEuDsJPegZoDFd4SDWaZOW8N2pa0GSrYmKpId/tjt1Hgo3BjZBVjdVpfVrHaA+Qv5jawtS2O50J5xM9g==",
711
+ "version": "5.1.2",
712
+ "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.2.tgz",
713
+ "integrity": "sha512-uqB4QsgVoro0XDC+DIftIMGXHdBPn+lK6Ek3xXAIxPMCJfqxnbtyEoMCm2KPUVOuIosd7Cyw9HawEqMFM/UA+g==",
698
714
  "funding": [
699
715
  {
700
716
  "type": "github",
@@ -712,9 +728,9 @@
712
728
  }
713
729
  },
714
730
  "node_modules/@fastify/websocket": {
715
- "version": "11.3.3",
716
- "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.3.3.tgz",
717
- "integrity": "sha512-NBJoykKpFwrdX9Ezod1rt30p5NoPFu7vgeuUowSM3JVI5/hFNRPhetqkWMTiF/ifIzctwitbJut1gZ6FDg1mwQ==",
731
+ "version": "11.3.4",
732
+ "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.3.4.tgz",
733
+ "integrity": "sha512-firnJtEOv6pfdoXIzFDMbd+omgWwFNfLtdM8JejNFr/9lT/9DHkEhjTShuRFeE4phqrevD2B3JRW0v6uyzWhHQ==",
718
734
  "funding": [
719
735
  {
720
736
  "type": "github",
@@ -1002,9 +1018,9 @@
1002
1018
  }
1003
1019
  },
1004
1020
  "node_modules/@ours.network/fleet": {
1005
- "version": "1.2.0-nightly.54",
1006
- "resolved": "https://registry.npmjs.org/@ours.network/fleet/-/fleet-1.2.0-nightly.54.tgz",
1007
- "integrity": "sha512-Sh3t8iRGBoYzbyslS+IKuqQ573Zn+M0GVhR0cGepy/hlyNMAwXD2TBM+j7d8QiA1+ALugkMhKnanivE97JBmhQ==",
1021
+ "version": "1.2.0-nightly.57",
1022
+ "resolved": "https://registry.npmjs.org/@ours.network/fleet/-/fleet-1.2.0-nightly.57.tgz",
1023
+ "integrity": "sha512-FAgN3L5yOlWQgGFJ4g0x1jpCqpAtYvRnol+ZBrgR8vCl+Ex1Ebct6GiSTIdkPtvYth4lidUgSkBpJqwiSTkx3Q==",
1008
1024
  "license": "FSL-1.1-Apache-2.0",
1009
1025
  "dependencies": {
1010
1026
  "@agentclientprotocol/sdk": "^1.3.0",
@@ -1067,9 +1083,9 @@
1067
1083
  }
1068
1084
  },
1069
1085
  "node_modules/@ours.network/notifications": {
1070
- "version": "0.3.1-nightly.2",
1071
- "resolved": "https://registry.npmjs.org/@ours.network/notifications/-/notifications-0.3.1-nightly.2.tgz",
1072
- "integrity": "sha512-OjnrJ8ZuOfKYT4KAmiRLU7czfiuacs6rShwOvvqxqBaUKcs1UwjsYwHARNb6erMxG4am3xxcE0ItahL+d2vt4A==",
1086
+ "version": "0.3.1-nightly.3",
1087
+ "resolved": "https://registry.npmjs.org/@ours.network/notifications/-/notifications-0.3.1-nightly.3.tgz",
1088
+ "integrity": "sha512-mt69E2LLkfwBMOJm7IP49wLIO9KtugBqh6nQpfrfbRuTlenjyrmZqcAuhW1CyI2R1H518B0Evxagnx9/V9fIig==",
1073
1089
  "license": "FSL-1.1-Apache-2.0",
1074
1090
  "dependencies": {
1075
1091
  "web-push": "3.6.7",
@@ -1244,9 +1260,9 @@
1244
1260
  }
1245
1261
  },
1246
1262
  "node_modules/avvio": {
1247
- "version": "9.3.0",
1248
- "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.3.0.tgz",
1249
- "integrity": "sha512-g2tQ7LE7oOSqDfwEm3M+ZCMTJc7KiZCdJ4UwyZJb5ckTKyYu50OYmvv0mCFXPuYXoM4zkSt8zM9XQ9KCvxA74A==",
1263
+ "version": "9.3.1",
1264
+ "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.3.1.tgz",
1265
+ "integrity": "sha512-QyTKW61/qlba+cUQBm/sT9X8lri4UdomqSDwCnrnj1IvLVDRRiXRkz4CgBRWB+/cmfC7SK5WQc8T1vSdGvaUcQ==",
1250
1266
  "funding": [
1251
1267
  {
1252
1268
  "type": "github",
@@ -1426,9 +1442,9 @@
1426
1442
  }
1427
1443
  },
1428
1444
  "node_modules/content-disposition": {
1429
- "version": "1.1.0",
1430
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
1431
- "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
1445
+ "version": "2.0.1",
1446
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz",
1447
+ "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==",
1432
1448
  "license": "MIT",
1433
1449
  "engines": {
1434
1450
  "node": ">=18"
@@ -1753,15 +1769,15 @@
1753
1769
  }
1754
1770
  },
1755
1771
  "node_modules/express": {
1756
- "version": "5.2.1",
1757
- "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
1758
- "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
1772
+ "version": "5.3.0",
1773
+ "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz",
1774
+ "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==",
1759
1775
  "license": "MIT",
1760
1776
  "dependencies": {
1761
1777
  "accepts": "^2.0.0",
1762
- "body-parser": "^2.2.1",
1763
- "content-disposition": "^1.0.0",
1764
- "content-type": "^1.0.5",
1778
+ "body-parser": "^2.3.0",
1779
+ "content-disposition": "^2.0.1",
1780
+ "content-type": "^2.0.0",
1765
1781
  "cookie": "^0.7.1",
1766
1782
  "cookie-signature": "^1.2.1",
1767
1783
  "debug": "^4.4.0",
@@ -1777,14 +1793,14 @@
1777
1793
  "on-finished": "^2.4.1",
1778
1794
  "once": "^1.4.0",
1779
1795
  "parseurl": "^1.3.3",
1780
- "proxy-addr": "^2.0.7",
1781
- "qs": "^6.14.0",
1796
+ "proxy-addr": "^2.0.8",
1797
+ "qs": "^6.16.0",
1782
1798
  "range-parser": "^1.2.1",
1783
1799
  "router": "^2.2.0",
1784
1800
  "send": "^1.1.0",
1785
1801
  "serve-static": "^2.2.0",
1786
1802
  "statuses": "^2.0.1",
1787
- "type-is": "^2.0.1",
1803
+ "type-is": "^2.1.0",
1788
1804
  "vary": "^1.1.2"
1789
1805
  },
1790
1806
  "engines": {
@@ -1814,6 +1830,19 @@
1814
1830
  "express": ">= 4.11"
1815
1831
  }
1816
1832
  },
1833
+ "node_modules/express/node_modules/content-type": {
1834
+ "version": "2.1.0",
1835
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
1836
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
1837
+ "license": "MIT",
1838
+ "engines": {
1839
+ "node": ">=18"
1840
+ },
1841
+ "funding": {
1842
+ "type": "opencollective",
1843
+ "url": "https://opencollective.com/express"
1844
+ }
1845
+ },
1817
1846
  "node_modules/fast-decode-uri-component": {
1818
1847
  "version": "1.0.1",
1819
1848
  "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
@@ -1827,9 +1856,9 @@
1827
1856
  "license": "MIT"
1828
1857
  },
1829
1858
  "node_modules/fast-json-stringify": {
1830
- "version": "7.0.1",
1831
- "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.0.1.tgz",
1832
- "integrity": "sha512-eRSayARSbbwlBjpP4vnTTIRD5QPcIrmihPxDeN1DtKnHPg66UuJLx+8hlK1kaFdjvzyQ/dzALoi4vwAQ+T+iZA==",
1859
+ "version": "7.1.0",
1860
+ "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.1.0.tgz",
1861
+ "integrity": "sha512-wAhAQ+es0aH+x5OofdCHlZZFdqwtiM6lpEosaRIwfg271WYeEQ/tPcXdu5vpzlqZpbJ4WNqaW4QR5UjfG4Dc2w==",
1833
1862
  "funding": [
1834
1863
  {
1835
1864
  "type": "github",
@@ -1851,9 +1880,9 @@
1851
1880
  }
1852
1881
  },
1853
1882
  "node_modules/fast-json-stringify/node_modules/fast-uri": {
1854
- "version": "4.2.1",
1855
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.1.tgz",
1856
- "integrity": "sha512-TmHQgewjHtMq1E5QKA0tOE0yeYGQs25KZC/ziJpubRtWI15W92e6vPFydWOeZBVROSHBYw/QhD9d5OefdD6LDg==",
1883
+ "version": "4.2.2",
1884
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.2.tgz",
1885
+ "integrity": "sha512-EwVpUMzLVNOmcWW0zi5G3JJwkopB6XXjnVvNBGfqrMMsVew2hkQWl5e/pe/CfYUeS6jt4cIO2MnamEW7v/7wPw==",
1857
1886
  "funding": [
1858
1887
  {
1859
1888
  "type": "github",
@@ -1933,9 +1962,9 @@
1933
1962
  }
1934
1963
  },
1935
1964
  "node_modules/fastify-plugin": {
1936
- "version": "6.0.0",
1937
- "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz",
1938
- "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==",
1965
+ "version": "6.0.1",
1966
+ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.1.tgz",
1967
+ "integrity": "sha512-4wW4RxSmvPXLrh5mgQEiu43qU3bw44N2ss4FTkTkQIbprUhE+/s43QX0j/ttcztdWK7PEkHqVthdc5GdEGDvjA==",
1939
1968
  "funding": [
1940
1969
  {
1941
1970
  "type": "github",
@@ -1979,9 +2008,9 @@
1979
2008
  }
1980
2009
  },
1981
2010
  "node_modules/find-my-way": {
1982
- "version": "9.9.0",
1983
- "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.9.0.tgz",
1984
- "integrity": "sha512-sJsgZ1sQH2UDuowPuMKg8az7Qc8F0jnj+SKkFWU/+T0xcFlgV5skgXOGUqmQzOdmW6ALA7AhJINWx3qFBkbLHA==",
2011
+ "version": "9.10.0",
2012
+ "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.10.0.tgz",
2013
+ "integrity": "sha512-eru+uCPQ2g+nLBkf84MHP/KyNNMar0BDy0j+i8Fb72GF9/YHBZ58q7FODUtfVV7XU9nfRUHXSmaM8NmZcIbZ4Q==",
1985
2014
  "license": "MIT",
1986
2015
  "dependencies": {
1987
2016
  "fast-deep-equal": "^3.1.3",
@@ -2321,9 +2350,9 @@
2321
2350
  "license": "MIT"
2322
2351
  },
2323
2352
  "node_modules/json-schema-ref-resolver": {
2324
- "version": "3.0.0",
2325
- "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz",
2326
- "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==",
2353
+ "version": "3.0.1",
2354
+ "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.1.tgz",
2355
+ "integrity": "sha512-w+HwgljXpVwZ3IidoUR1qPZxSOQ+NRQWuVe6a5pe8XbHsNZE4UAwVPUvzZagn7yBKbJtt6UJnRFYbNTRPZI45Q==",
2327
2356
  "funding": [
2328
2357
  {
2329
2358
  "type": "github",
@@ -2388,9 +2417,9 @@
2388
2417
  }
2389
2418
  },
2390
2419
  "node_modules/light-my-request": {
2391
- "version": "6.6.0",
2392
- "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz",
2393
- "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==",
2420
+ "version": "6.8.0",
2421
+ "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.8.0.tgz",
2422
+ "integrity": "sha512-5Q8PjoSEdtGIB8fikZsTem5vgRo4F2mR6vUKTDW/H1g6MtAt8e3duQbg/QxL5yzg6BZhor2KOUm3hhWMWLTZwg==",
2394
2423
  "funding": [
2395
2424
  {
2396
2425
  "type": "github",
@@ -2403,40 +2432,25 @@
2403
2432
  ],
2404
2433
  "license": "BSD-3-Clause",
2405
2434
  "dependencies": {
2406
- "cookie": "^1.0.1",
2407
- "process-warning": "^4.0.0",
2408
- "set-cookie-parser": "^2.6.0"
2435
+ "@fastify/deepmerge": "^3.1.0",
2436
+ "cookie": "^2.0.0",
2437
+ "process-warning": "^5.0.0",
2438
+ "set-cookie-parser": "^3.0.1"
2409
2439
  }
2410
2440
  },
2411
2441
  "node_modules/light-my-request/node_modules/cookie": {
2412
- "version": "1.1.1",
2413
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
2414
- "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
2442
+ "version": "2.0.1",
2443
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz",
2444
+ "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==",
2415
2445
  "license": "MIT",
2416
2446
  "engines": {
2417
- "node": ">=18"
2447
+ "node": ">=22"
2418
2448
  },
2419
2449
  "funding": {
2420
2450
  "type": "opencollective",
2421
2451
  "url": "https://opencollective.com/express"
2422
2452
  }
2423
2453
  },
2424
- "node_modules/light-my-request/node_modules/process-warning": {
2425
- "version": "4.0.1",
2426
- "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz",
2427
- "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==",
2428
- "funding": [
2429
- {
2430
- "type": "github",
2431
- "url": "https://github.com/sponsors/fastify"
2432
- },
2433
- {
2434
- "type": "opencollective",
2435
- "url": "https://opencollective.com/fastify"
2436
- }
2437
- ],
2438
- "license": "MIT"
2439
- },
2440
2454
  "node_modules/locate-path": {
2441
2455
  "version": "5.0.0",
2442
2456
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -2954,9 +2968,9 @@
2954
2968
  }
2955
2969
  },
2956
2970
  "node_modules/process-warning": {
2957
- "version": "5.1.0",
2958
- "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.0.tgz",
2959
- "integrity": "sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==",
2971
+ "version": "5.1.1",
2972
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.1.tgz",
2973
+ "integrity": "sha512-oCkNVj4OKnKEcocVBcDfiIugN1/cE6rgfT3nCtzeqZPA8+rIxMaQ0xXzIkGP8Gj2qUaP1UR7uhJ1VD8lUCpzCg==",
2960
2974
  "funding": [
2961
2975
  {
2962
2976
  "type": "github",
@@ -3206,9 +3220,9 @@
3206
3220
  "license": "MIT"
3207
3221
  },
3208
3222
  "node_modules/safe-regex2": {
3209
- "version": "5.1.1",
3210
- "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz",
3211
- "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==",
3223
+ "version": "5.1.2",
3224
+ "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.2.tgz",
3225
+ "integrity": "sha512-tAtCGFPPP02VroDVzp4daGi6bC7jWG+41D47GKf18FeH/ubvKQHT9VmhAkvtjNOmJwqtApzWeUpEhkyEYULvmw==",
3212
3226
  "funding": [
3213
3227
  {
3214
3228
  "type": "github",
@@ -3252,9 +3266,9 @@
3252
3266
  }
3253
3267
  },
3254
3268
  "node_modules/secure-json-parse": {
3255
- "version": "4.1.0",
3256
- "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz",
3257
- "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==",
3269
+ "version": "4.1.1",
3270
+ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.1.tgz",
3271
+ "integrity": "sha512-lnd81MQEZKjhW/Gd2TQqdd4XP6QYNdDW/EP+I7nTrFHP9y2LmaGPIHk9xsnzcOiEr1c39c/e84xFgGviQKBTRw==",
3258
3272
  "funding": [
3259
3273
  {
3260
3274
  "type": "github",
@@ -3331,9 +3345,9 @@
3331
3345
  "license": "ISC"
3332
3346
  },
3333
3347
  "node_modules/set-cookie-parser": {
3334
- "version": "2.7.2",
3335
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
3336
- "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
3348
+ "version": "3.1.3",
3349
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.3.tgz",
3350
+ "integrity": "sha512-xletSdAI5efyVJjsatBbzDkXl3M/Zmad3xfnQe7ZXuBB0yNwW7C2WFsNGjdRNfZunmNHQuX79xs/ACMTLCdcew==",
3337
3351
  "license": "MIT"
3338
3352
  },
3339
3353
  "node_modules/setprototypeof": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "channel": "nightly",
4
- "installerVersion": "1.2.1-nightly.42",
4
+ "installerVersion": "1.2.1-nightly.44",
5
5
  "packages": {
6
6
  "@ours.network/sdk": {
7
7
  "version": "3.8.1-nightly.17",
@@ -24,12 +24,12 @@
24
24
  "integrity": "sha512-03qDDGRgN9pBGsBsCcvArhPuYfMblqsaXS9HinxAzOSiI3PaoNOh+4MxIAOoHXoE/12xxCDf7kbMdEAR0CPIfg=="
25
25
  },
26
26
  "@ours.network/notifications": {
27
- "version": "0.3.1-nightly.2",
28
- "integrity": "sha512-OjnrJ8ZuOfKYT4KAmiRLU7czfiuacs6rShwOvvqxqBaUKcs1UwjsYwHARNb6erMxG4am3xxcE0ItahL+d2vt4A=="
27
+ "version": "0.3.1-nightly.3",
28
+ "integrity": "sha512-mt69E2LLkfwBMOJm7IP49wLIO9KtugBqh6nQpfrfbRuTlenjyrmZqcAuhW1CyI2R1H518B0Evxagnx9/V9fIig=="
29
29
  },
30
30
  "@ours.network/fleet": {
31
- "version": "1.2.0-nightly.54",
32
- "integrity": "sha512-Sh3t8iRGBoYzbyslS+IKuqQ573Zn+M0GVhR0cGepy/hlyNMAwXD2TBM+j7d8QiA1+ALugkMhKnanivE97JBmhQ=="
31
+ "version": "1.2.0-nightly.57",
32
+ "integrity": "sha512-FAgN3L5yOlWQgGFJ4g0x1jpCqpAtYvRnol+ZBrgR8vCl+Ex1Ebct6GiSTIdkPtvYth4lidUgSkBpJqwiSTkx3Q=="
33
33
  },
34
34
  "@ours.network/mcp": {
35
35
  "version": "1.2.0-nightly.13",
@@ -8,7 +8,15 @@ export const SOURCE_ROOT = resolve(process.env.OURS_SOURCE_ROOT || '/src');
8
8
  export const OUT = join(ROOT, 'docker/vendor');
9
9
  export const CONFIG = JSON.parse(readFileSync(join(ROOT, 'sources.json'), 'utf8'));
10
10
  // Notifications joined the server set later; retained selections without it still build.
11
- export const SELECTED = new Set((process.env.OURS_BUILD_PACKAGES || ['sdk,cli,daemon,tg-connector,cowork,messenger-server', ...(CONFIG.packages?.['@ours.network/notifications'] ? ['notifications'] : [])].join(',')).split(',').map(name => '@ours.network/' + name));
11
+ // A plugin-only server selection names only sdk, cli and daemon, and builds only those.
12
+ const APPLICATIONS = ['tg-connector', 'cowork', 'messenger-server', 'notifications'];
13
+ export const SELECTED = new Set((process.env.OURS_BUILD_PACKAGES || ['sdk', 'cli', 'daemon',
14
+ ...APPLICATIONS.filter(name => name !== 'notifications' || CONFIG.packages?.['@ours.network/notifications'])
15
+ .filter(name => !isDaemonOnly(CONFIG) || CONFIG.packages?.['@ours.network/' + name])].join(',')).split(',').map(name => '@ours.network/' + name));
16
+ function isDaemonOnly(config) {
17
+ const names = Object.keys(config.packages ?? {}).sort().join(',');
18
+ return names === '@ours.network/cli,@ours.network/daemon,@ours.network/sdk';
19
+ }
12
20
  export const inheritedLock = process.env.OURS_INSTALLER_LOCK_FD === '3' ? [3] : [];
13
21
  export const run = (args, cwd) => execFileSync(args[0], args.slice(1), { cwd, stdio: ['inherit', 'inherit', 'inherit', ...inheritedLock] });
14
22
  export const capture = (args, cwd, env = process.env) => execFileSync(args[0], args.slice(1), { cwd, env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'inherit', ...inheritedLock] });