@ours.network/install 1.2.1-nightly.28 → 1.2.1-nightly.29

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
@@ -591,4 +591,4 @@ Existing installation records keep their ports and identities. A listener acquir
591
591
  by another process after preflight still causes startup to fail safely; no foreign
592
592
  process is stopped and no retained installation is silently moved.
593
593
 
594
- Workspace setup pins Fleet `1.2.0-nightly.35` 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, the packaged `/fleet` browser entry, separate `ours-fleet setup-tunnel` and `ours-fleet link-device` commands, 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. Existing installation identities and configured ports remain retained; a retained-port collision fails safely.
594
+ Workspace setup pins Fleet `1.2.0-nightly.38` 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, separate `ours-fleet setup-tunnel` and `ours-fleet link-device` commands, 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. Existing installation identities and configured ports remain retained; a retained-port collision fails safely.
@@ -13,9 +13,9 @@
13
13
  "@ours.network/codex": "1.2.0-nightly.10",
14
14
  "@ours.network/cowork": "1.3.3-nightly.20261001.6d49d3a",
15
15
  "@ours.network/daemon": "3.8.1-nightly.7",
16
- "@ours.network/fleet": "1.2.0-nightly.35",
16
+ "@ours.network/fleet": "1.2.0-nightly.38",
17
17
  "@ours.network/mcp": "1.2.0-nightly.10",
18
- "@ours.network/messenger-server": "1.0.31-nightly.13",
18
+ "@ours.network/messenger-server": "1.0.31-nightly.14",
19
19
  "@ours.network/sdk": "3.8.1-nightly.15",
20
20
  "@ours.network/tg-connector": "1.0.1-nightly.9"
21
21
  }
@@ -224,18 +224,6 @@
224
224
  "url": "https://github.com/sponsors/sindresorhus"
225
225
  }
226
226
  },
227
- "node_modules/@adapt-toolkit/sdk/node_modules/mime": {
228
- "version": "1.6.0",
229
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
230
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
231
- "license": "MIT",
232
- "bin": {
233
- "mime": "cli.js"
234
- },
235
- "engines": {
236
- "node": ">=4"
237
- }
238
- },
239
227
  "node_modules/@adapt-toolkit/sdk/node_modules/mime-db": {
240
228
  "version": "1.52.0",
241
229
  "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -595,22 +583,6 @@
595
583
  "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
596
584
  }
597
585
  },
598
- "node_modules/@fastify/accept-negotiator": {
599
- "version": "2.1.0",
600
- "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.1.0.tgz",
601
- "integrity": "sha512-F3EVbzWt+xcnVaOHmWyIlpuFtbxOln7HDZQsh09MtMmMm/CipMayNt8hnIL8VQi54u2ZociDbf+iluGYkf7B1A==",
602
- "funding": [
603
- {
604
- "type": "github",
605
- "url": "https://github.com/sponsors/fastify"
606
- },
607
- {
608
- "type": "opencollective",
609
- "url": "https://opencollective.com/fastify"
610
- }
611
- ],
612
- "license": "MIT"
613
- },
614
586
  "node_modules/@fastify/ajv-compiler": {
615
587
  "version": "4.0.6",
616
588
  "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.6.tgz",
@@ -738,54 +710,6 @@
738
710
  "ipaddr.js": "^2.1.0"
739
711
  }
740
712
  },
741
- "node_modules/@fastify/send": {
742
- "version": "4.1.1",
743
- "resolved": "https://registry.npmjs.org/@fastify/send/-/send-4.1.1.tgz",
744
- "integrity": "sha512-BYo+EiaKwlxH+WetGk6hAs1d39iP0y1gqB8lGF/qwkJ9ZZ/cBY1vx5NvExb9Sc3yRMFjD5X4Eyh4e4+TzRkzdw==",
745
- "funding": [
746
- {
747
- "type": "github",
748
- "url": "https://github.com/sponsors/fastify"
749
- },
750
- {
751
- "type": "opencollective",
752
- "url": "https://opencollective.com/fastify"
753
- }
754
- ],
755
- "license": "MIT",
756
- "dependencies": {
757
- "@lukeed/ms": "^2.0.2",
758
- "escape-html": "~1.0.3",
759
- "fast-decode-uri-component": "^1.0.1",
760
- "http-errors": "^2.0.0",
761
- "mime": "^3"
762
- }
763
- },
764
- "node_modules/@fastify/static": {
765
- "version": "10.1.5",
766
- "resolved": "https://registry.npmjs.org/@fastify/static/-/static-10.1.5.tgz",
767
- "integrity": "sha512-3r0ZFXo82nKlPzySOUYhwWVfPZStfiwjmyevkX7cJWL2yXmEzl0Rpxv+L6L1R4OxqvlDGqf3g8OdBzILKgqe6w==",
768
- "funding": [
769
- {
770
- "type": "github",
771
- "url": "https://github.com/sponsors/fastify"
772
- },
773
- {
774
- "type": "opencollective",
775
- "url": "https://opencollective.com/fastify"
776
- }
777
- ],
778
- "license": "MIT",
779
- "dependencies": {
780
- "@fastify/accept-negotiator": "^2.0.0",
781
- "@fastify/error": "^4.0.0",
782
- "@fastify/send": "^4.0.0",
783
- "content-disposition": "^3.0.0",
784
- "fastify-plugin": "^6.0.0",
785
- "fastq": "^1.17.1",
786
- "glob": "^13.0.0"
787
- }
788
- },
789
713
  "node_modules/@fastify/websocket": {
790
714
  "version": "11.3.1",
791
715
  "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.3.1.tgz",
@@ -819,15 +743,6 @@
819
743
  "hono": "^4"
820
744
  }
821
745
  },
822
- "node_modules/@lukeed/ms": {
823
- "version": "2.0.2",
824
- "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz",
825
- "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==",
826
- "license": "MIT",
827
- "engines": {
828
- "node": ">=8"
829
- }
830
- },
831
746
  "node_modules/@modelcontextprotocol/sdk": {
832
747
  "version": "1.32.0",
833
748
  "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.0.tgz",
@@ -1085,13 +1000,12 @@
1085
1000
  }
1086
1001
  },
1087
1002
  "node_modules/@ours.network/fleet": {
1088
- "version": "1.2.0-nightly.35",
1089
- "resolved": "https://registry.npmjs.org/@ours.network/fleet/-/fleet-1.2.0-nightly.35.tgz",
1090
- "integrity": "sha512-C6uy1ftZDWUI8Rvhxq07qkuwTWBQnplL4eBW8zM4ItZCgzp0+4w//H2C4G8HFuwAOxrLFUFUbMpaaeSqI2zUKw==",
1003
+ "version": "1.2.0-nightly.38",
1004
+ "resolved": "https://registry.npmjs.org/@ours.network/fleet/-/fleet-1.2.0-nightly.38.tgz",
1005
+ "integrity": "sha512-glCDY/WfILgTJfG7G3ao5iEtCyWtyPOzl/o+D1EVphUuKQYZIW7Xk8sxyT2/D8FADRqvJSBbebWseWbgmlU6Ow==",
1091
1006
  "license": "FSL-1.1-Apache-2.0",
1092
1007
  "dependencies": {
1093
1008
  "@agentclientprotocol/sdk": "^1.3.0",
1094
- "@fastify/static": "^10.1.2",
1095
1009
  "@fastify/websocket": "^11.2.0",
1096
1010
  "@ours.network/cli": "2.8.1-nightly.13",
1097
1011
  "@ours.network/mcp": "1.2.0-nightly.10",
@@ -1132,9 +1046,9 @@
1132
1046
  }
1133
1047
  },
1134
1048
  "node_modules/@ours.network/messenger-server": {
1135
- "version": "1.0.31-nightly.13",
1136
- "resolved": "https://registry.npmjs.org/@ours.network/messenger-server/-/messenger-server-1.0.31-nightly.13.tgz",
1137
- "integrity": "sha512-hDosXHgQ+vyzPdSxqTz6vCaOCn0LMTmOL4TJiWplkJhzyw2c586RckXJbqNJsTa0mmodvLxW0ewZyQ/xJVIeXA==",
1049
+ "version": "1.0.31-nightly.14",
1050
+ "resolved": "https://registry.npmjs.org/@ours.network/messenger-server/-/messenger-server-1.0.31-nightly.14.tgz",
1051
+ "integrity": "sha512-0lMoIadihMQqN0sdW20DF4a94Nc6bx0lnaCckSnn5VqOmvqELNdG3kRZ1Heh9VwkPEu6qNM27AR7tWpTbzvJCg==",
1138
1052
  "license": "FSL-1.1-Apache-2.0",
1139
1053
  "dependencies": {
1140
1054
  "@eslint-community/regexpp": "4.12.2",
@@ -1331,15 +1245,6 @@
1331
1245
  "fastq": "^1.17.1"
1332
1246
  }
1333
1247
  },
1334
- "node_modules/balanced-match": {
1335
- "version": "4.0.4",
1336
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
1337
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
1338
- "license": "MIT",
1339
- "engines": {
1340
- "node": "18 || 20 || >=22"
1341
- }
1342
- },
1343
1248
  "node_modules/better-sqlite3": {
1344
1249
  "version": "13.0.3",
1345
1250
  "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz",
@@ -1395,18 +1300,6 @@
1395
1300
  "url": "https://opencollective.com/express"
1396
1301
  }
1397
1302
  },
1398
- "node_modules/brace-expansion": {
1399
- "version": "5.0.12",
1400
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
1401
- "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
1402
- "license": "MIT",
1403
- "dependencies": {
1404
- "balanced-match": "^4.0.2"
1405
- },
1406
- "engines": {
1407
- "node": "20 || >=22"
1408
- }
1409
- },
1410
1303
  "node_modules/buffer-equal-constant-time": {
1411
1304
  "version": "1.0.1",
1412
1305
  "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@@ -1515,12 +1408,12 @@
1515
1408
  }
1516
1409
  },
1517
1410
  "node_modules/content-disposition": {
1518
- "version": "3.0.0",
1519
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-3.0.0.tgz",
1520
- "integrity": "sha512-ZH/0Xs9rMIFWCOmGdmS9eHBTF62qqQYNz4nVjQhkdIO/a0fCP4UIM3mRz/wiqL0L14YgAz/1xio4OaSY4+ON/A==",
1411
+ "version": "1.1.0",
1412
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
1413
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
1521
1414
  "license": "MIT",
1522
1415
  "engines": {
1523
- "node": ">=22"
1416
+ "node": ">=18"
1524
1417
  },
1525
1418
  "funding": {
1526
1419
  "type": "opencollective",
@@ -1903,19 +1796,6 @@
1903
1796
  "express": ">= 4.11"
1904
1797
  }
1905
1798
  },
1906
- "node_modules/express/node_modules/content-disposition": {
1907
- "version": "1.1.0",
1908
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
1909
- "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
1910
- "license": "MIT",
1911
- "engines": {
1912
- "node": ">=18"
1913
- },
1914
- "funding": {
1915
- "type": "opencollective",
1916
- "url": "https://opencollective.com/express"
1917
- }
1918
- },
1919
1799
  "node_modules/fast-decode-uri-component": {
1920
1800
  "version": "1.0.1",
1921
1801
  "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
@@ -2180,23 +2060,6 @@
2180
2060
  "node": ">= 0.4"
2181
2061
  }
2182
2062
  },
2183
- "node_modules/glob": {
2184
- "version": "13.0.6",
2185
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
2186
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
2187
- "license": "BlueOak-1.0.0",
2188
- "dependencies": {
2189
- "minimatch": "^10.2.2",
2190
- "minipass": "^7.1.3",
2191
- "path-scurry": "^2.0.2"
2192
- },
2193
- "engines": {
2194
- "node": "18 || 20 || >=22"
2195
- },
2196
- "funding": {
2197
- "url": "https://github.com/sponsors/isaacs"
2198
- }
2199
- },
2200
2063
  "node_modules/gopd": {
2201
2064
  "version": "1.2.0",
2202
2065
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -2580,15 +2443,6 @@
2580
2443
  "loose-envify": "cli.js"
2581
2444
  }
2582
2445
  },
2583
- "node_modules/lru-cache": {
2584
- "version": "11.5.3",
2585
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz",
2586
- "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==",
2587
- "license": "BlueOak-1.0.0",
2588
- "engines": {
2589
- "node": "20 || >=22"
2590
- }
2591
- },
2592
2446
  "node_modules/math-intrinsics": {
2593
2447
  "version": "1.1.0",
2594
2448
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -2633,15 +2487,15 @@
2633
2487
  }
2634
2488
  },
2635
2489
  "node_modules/mime": {
2636
- "version": "3.0.0",
2637
- "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
2638
- "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
2490
+ "version": "1.6.0",
2491
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
2492
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
2639
2493
  "license": "MIT",
2640
2494
  "bin": {
2641
2495
  "mime": "cli.js"
2642
2496
  },
2643
2497
  "engines": {
2644
- "node": ">=10.0.0"
2498
+ "node": ">=4"
2645
2499
  }
2646
2500
  },
2647
2501
  "node_modules/mime-db": {
@@ -2675,21 +2529,6 @@
2675
2529
  "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
2676
2530
  "license": "ISC"
2677
2531
  },
2678
- "node_modules/minimatch": {
2679
- "version": "10.2.6",
2680
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
2681
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
2682
- "license": "BlueOak-1.0.0",
2683
- "dependencies": {
2684
- "brace-expansion": "^5.0.8"
2685
- },
2686
- "engines": {
2687
- "node": "18 || 20 || >=22"
2688
- },
2689
- "funding": {
2690
- "url": "https://github.com/sponsors/isaacs"
2691
- }
2692
- },
2693
2532
  "node_modules/minimist": {
2694
2533
  "version": "1.2.8",
2695
2534
  "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -2699,15 +2538,6 @@
2699
2538
  "url": "https://github.com/sponsors/ljharb"
2700
2539
  }
2701
2540
  },
2702
- "node_modules/minipass": {
2703
- "version": "7.1.3",
2704
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
2705
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
2706
- "license": "BlueOak-1.0.0",
2707
- "engines": {
2708
- "node": ">=16 || 14 >=14.17"
2709
- }
2710
- },
2711
2541
  "node_modules/ms": {
2712
2542
  "version": "2.1.3",
2713
2543
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -2899,22 +2729,6 @@
2899
2729
  "node": ">=8"
2900
2730
  }
2901
2731
  },
2902
- "node_modules/path-scurry": {
2903
- "version": "2.0.2",
2904
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
2905
- "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
2906
- "license": "BlueOak-1.0.0",
2907
- "dependencies": {
2908
- "lru-cache": "^11.0.0",
2909
- "minipass": "^7.1.2"
2910
- },
2911
- "engines": {
2912
- "node": "18 || 20 || >=22"
2913
- },
2914
- "funding": {
2915
- "url": "https://github.com/sponsors/isaacs"
2916
- }
2917
- },
2918
2732
  "node_modules/path-to-regexp": {
2919
2733
  "version": "8.4.2",
2920
2734
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
@@ -3015,9 +2829,9 @@
3015
2829
  }
3016
2830
  },
3017
2831
  "node_modules/pino": {
3018
- "version": "10.3.1",
3019
- "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz",
3020
- "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==",
2832
+ "version": "10.4.0",
2833
+ "resolved": "https://registry.npmjs.org/pino/-/pino-10.4.0.tgz",
2834
+ "integrity": "sha512-bk1ZMTwG/Vymx+zPoa28MhNzucFvXJWp3csrSuxuHPSMeUettaCoQ5Jvg07mtC4JGNpcfTwz41oVCnNgBK9+vA==",
3021
2835
  "license": "MIT",
3022
2836
  "dependencies": {
3023
2837
  "@pinojs/redact": "^0.4.0",
@@ -3027,7 +2841,7 @@
3027
2841
  "pino-std-serializers": "^7.0.0",
3028
2842
  "process-warning": "^5.0.0",
3029
2843
  "quick-format-unescaped": "^4.0.3",
3030
- "real-require": "^0.2.0",
2844
+ "real-require": "^1.0.0",
3031
2845
  "safe-stable-stringify": "^2.3.1",
3032
2846
  "sonic-boom": "^4.0.1",
3033
2847
  "thread-stream": "^4.0.0"
@@ -3270,13 +3084,10 @@
3270
3084
  }
3271
3085
  },
3272
3086
  "node_modules/real-require": {
3273
- "version": "0.2.0",
3274
- "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
3275
- "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
3276
- "license": "MIT",
3277
- "engines": {
3278
- "node": ">= 12.13.0"
3279
- }
3087
+ "version": "1.0.0",
3088
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz",
3089
+ "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==",
3090
+ "license": "MIT"
3280
3091
  },
3281
3092
  "node_modules/require-directory": {
3282
3093
  "version": "2.1.1",
@@ -3698,12 +3509,6 @@
3698
3509
  "node": ">=20"
3699
3510
  }
3700
3511
  },
3701
- "node_modules/thread-stream/node_modules/real-require": {
3702
- "version": "1.0.0",
3703
- "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz",
3704
- "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==",
3705
- "license": "MIT"
3706
- },
3707
3512
  "node_modules/toad-cache": {
3708
3513
  "version": "3.7.4",
3709
3514
  "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "channel": "nightly",
4
- "installerVersion": "1.2.1-nightly.28",
4
+ "installerVersion": "1.2.1-nightly.29",
5
5
  "packages": {
6
6
  "@ours.network/sdk": {
7
7
  "version": "3.8.1-nightly.15",
@@ -20,12 +20,12 @@
20
20
  "integrity": "sha512-tqoLOWc4O8CGwLdO1j6ukm6Vn57EE0zbuxKo4BWd0QVwu9ObKgHCEMOKPgW2mXHeESXSv9m7edcIrnK8I5gD+w=="
21
21
  },
22
22
  "@ours.network/messenger-server": {
23
- "version": "1.0.31-nightly.13",
24
- "integrity": "sha512-hDosXHgQ+vyzPdSxqTz6vCaOCn0LMTmOL4TJiWplkJhzyw2c586RckXJbqNJsTa0mmodvLxW0ewZyQ/xJVIeXA=="
23
+ "version": "1.0.31-nightly.14",
24
+ "integrity": "sha512-0lMoIadihMQqN0sdW20DF4a94Nc6bx0lnaCckSnn5VqOmvqELNdG3kRZ1Heh9VwkPEu6qNM27AR7tWpTbzvJCg=="
25
25
  },
26
26
  "@ours.network/fleet": {
27
- "version": "1.2.0-nightly.35",
28
- "integrity": "sha512-C6uy1ftZDWUI8Rvhxq07qkuwTWBQnplL4eBW8zM4ItZCgzp0+4w//H2C4G8HFuwAOxrLFUFUbMpaaeSqI2zUKw=="
27
+ "version": "1.2.0-nightly.38",
28
+ "integrity": "sha512-glCDY/WfILgTJfG7G3ao5iEtCyWtyPOzl/o+D1EVphUuKQYZIW7Xk8sxyT2/D8FADRqvJSBbebWseWbgmlU6Ow=="
29
29
  },
30
30
  "@ours.network/mcp": {
31
31
  "version": "1.2.0-nightly.10",
@@ -2,7 +2,7 @@
2
2
  "release": {
3
3
  "schema": 1,
4
4
  "channel": "nightly",
5
- "installerVersion": "1.2.1-nightly.28",
5
+ "installerVersion": "1.2.1-nightly.29",
6
6
  "packages": {
7
7
  "@ours.network/sdk": {
8
8
  "version": "3.8.1-nightly.15",
@@ -21,12 +21,12 @@
21
21
  "integrity": "sha512-tqoLOWc4O8CGwLdO1j6ukm6Vn57EE0zbuxKo4BWd0QVwu9ObKgHCEMOKPgW2mXHeESXSv9m7edcIrnK8I5gD+w=="
22
22
  },
23
23
  "@ours.network/messenger-server": {
24
- "version": "1.0.31-nightly.13",
25
- "integrity": "sha512-hDosXHgQ+vyzPdSxqTz6vCaOCn0LMTmOL4TJiWplkJhzyw2c586RckXJbqNJsTa0mmodvLxW0ewZyQ/xJVIeXA=="
24
+ "version": "1.0.31-nightly.14",
25
+ "integrity": "sha512-0lMoIadihMQqN0sdW20DF4a94Nc6bx0lnaCckSnn5VqOmvqELNdG3kRZ1Heh9VwkPEu6qNM27AR7tWpTbzvJCg=="
26
26
  },
27
27
  "@ours.network/fleet": {
28
- "version": "1.2.0-nightly.35",
29
- "integrity": "sha512-C6uy1ftZDWUI8Rvhxq07qkuwTWBQnplL4eBW8zM4ItZCgzp0+4w//H2C4G8HFuwAOxrLFUFUbMpaaeSqI2zUKw=="
28
+ "version": "1.2.0-nightly.38",
29
+ "integrity": "sha512-glCDY/WfILgTJfG7G3ao5iEtCyWtyPOzl/o+D1EVphUuKQYZIW7Xk8sxyT2/D8FADRqvJSBbebWseWbgmlU6Ow=="
30
30
  },
31
31
  "@ours.network/mcp": {
32
32
  "version": "1.2.0-nightly.10",
@@ -75,11 +75,11 @@
75
75
  },
76
76
  "@ours.network/messenger-server": {
77
77
  "type": "npm",
78
- "version": "1.0.31-nightly.13"
78
+ "version": "1.0.31-nightly.14"
79
79
  },
80
80
  "@ours.network/fleet": {
81
81
  "type": "npm",
82
- "version": "1.2.0-nightly.35"
82
+ "version": "1.2.0-nightly.38"
83
83
  },
84
84
  "@ours.network/mcp": {
85
85
  "type": "npm",
@@ -1342,7 +1342,8 @@ async function executeServerCommand(args, effects) {
1342
1342
  throw new Error(`Server build activation is incomplete; repeat server ${record.buildTransition.operation} before other mutations`);
1343
1343
  }
1344
1344
  const showInstallProgress = args.operation === 'install' && !(existing && (record.schema === 1 || record.layoutConversion));
1345
- const installStageCount = (existing ? 7 : 9) + (args.identityName ? 2 : 0);
1345
+ const installStageCount = (existing ? 7 : 9) + (args.identityName ? 2 : 0)
1346
+ + (args.identityName && args.name && args.surname && (!existing || [undefined, null, args.identityName, `${args.name} ${args.surname}`].includes(record.messengerIdentity)) ? 1 : 0);
1346
1347
  let completedInstallStages = 0;
1347
1348
  const installStage = async (label, explanation, action) => {
1348
1349
  if (!showInstallProgress) return action();
@@ -1395,7 +1396,17 @@ async function executeServerCommand(args, effects) {
1395
1396
  if (args.identityName) {
1396
1397
  await installStage('Daemon startup', 'Start the daemon and restore its retained identities.', () => effects.serverLifecycle(record, 'start', ['daemon']));
1397
1398
  const identity = await installStage('Human identity', 'Keep the existing Human identity, or create it on a fresh daemon.', () => effects.serverEnsureIdentity(record, args.identityName));
1398
- record.messengerIdentity = identity.name;
1399
+ // Messenger runs as the person's own identity under the Human identity when Name and Surname are known.
1400
+ // An installation whose Messenger already runs as some other identity under it keeps that identity.
1401
+ const person = args.name && args.surname ? `${args.name} ${args.surname}` : undefined;
1402
+ const selected = existing ? record.messengerIdentity : undefined;
1403
+ if (person && (!selected || selected === identity.name || selected === person)) {
1404
+ const own = await installStage('Messenger identity', 'Keep or create your own identity under the Human identity; Messenger runs as it.', () => effects.serverEnsureMessengerIdentity(record, person));
1405
+ record.messengerIdentity = own.name;
1406
+ } else if (selected && selected !== identity.name
1407
+ && (await effects.serverListIdentities(record)).some(row => row.name === selected && row.kind === 'role' && row.temp === null)) {
1408
+ record.messengerIdentity = selected;
1409
+ } else record.messengerIdentity = identity.name;
1399
1410
  effects.writeJson(recordPath, JSON.stringify(record, null, 2) + '\n');
1400
1411
  await installStage('Application startup', 'Start the selected applications and check readiness.', () => effects.serverLifecycle(record, 'start', record.services.filter(name => name !== 'daemon')));
1401
1412
  } else {
@@ -41,16 +41,27 @@ const { attachOursClient } = await import(pathToFileURL(require.resolve('@ours.n
41
41
  const client = await attachOursClient({ endpoint: selection.endpoint,
42
42
  expectedInstanceId: selection.instanceId, credentialPath: selection.credentialPath,
43
43
  sessionMode: 'external', leaseToken: randomUUID(), env: {} });
44
+ // The lease this short-lived client takes is released exactly once. An operation is not reported as done
45
+ // while that release is incomplete, and what failed first is what is reported.
46
+ let output, released = false;
44
47
  try {
45
48
  const result = selection.operation === 'list' ? await client.listIdentities()
49
+ : selection.operation === 'create-role' ? { created: await client.createIdentity({ name: selection.name, bio: '',
50
+ exposeLocal: true, localAutoAccept: true }), current: await client.currentIdentity() }
51
+ : selection.operation === 'describe-role' ? (await client.chooseIdentity({ name: selection.name, force: false }),
52
+ { current: await client.currentIdentity() })
46
53
  : await client.createRootIdentity({ name: selection.name, bio: '',
47
54
  exposeLocal: true, localAutoAccept: true, skipIfRootExists: true });
48
- process.stdout.write(JSON.stringify(result));
55
+ released = true;
56
+ const release = await client.releaseLease();
57
+ output = release?.failed > 0 ? { onboardingError: 'LEASE_RELEASE_INCOMPLETE' } : result;
49
58
  } catch (error) {
50
- process.stdout.write(JSON.stringify({ onboardingError: error.code || 'OWNER_OPERATION_FAILED' }));
59
+ output = { onboardingError: error.code || 'OWNER_OPERATION_FAILED' };
60
+ if (!released) try { await client.releaseLease(); } catch {}
51
61
  } finally {
52
- try { await client.releaseLease(); } finally { await client.close(); }
62
+ try { await client.close(); } catch {}
53
63
  }
64
+ process.stdout.write(JSON.stringify(output));
54
65
  `;
55
66
  async function identityCommand(record, operation, name) {
56
67
  validateRecord(record);
@@ -115,6 +126,56 @@ try {
115
126
  effects.out?.(`Human identity ${after.root.name} is ready.`);
116
127
  return { name: after.root.name, cid: after.root.cid, created: true };
117
128
  },
129
+ /**
130
+ * The person's own identity under the Human root, which Messenger runs as. An identity of that name is
131
+ * used only when the daemon itself describes it as a permanent role of exactly the retained root;
132
+ * nothing else is renamed or adopted.
133
+ */
134
+ async serverEnsureMessengerIdentity(record, name) {
135
+ validateRecord(record);
136
+ validateIdentityName(name);
137
+ const listed = row => row?.kind === 'role' && row.temp === null && typeof row.cid === 'string';
138
+ const taken = () => new Error('Requested Messenger identity name is already used by another identity; no identity was changed');
139
+ const prior = await identities(record);
140
+ if (!prior.root) throw new Error('Messenger identity requires the Human identity; no identity was changed');
141
+ // The list has no parent column. What the daemon describes for the identity, bound for a moment, names its root.
142
+ const under = (current, row) => current?.name === name && current.temporary === false && current.isRoot === false
143
+ && current.described === true && typeof current.roleId === 'string' && current.roleId !== ''
144
+ && typeof current.cid === 'string' && current.cid === row.cid
145
+ && typeof current.rootCid === 'string' && current.rootCid.toLowerCase() === String(prior.root.cid).toLowerCase();
146
+ const adopt = async rows => {
147
+ const row = rows.rows.find(candidate => candidate.name === name);
148
+ if (rows.root?.cid !== prior.root.cid || !listed(row)) throw taken();
149
+ const { current } = await identityCommand(record, 'describe-role', name);
150
+ if (!under(current, row)) throw taken();
151
+ return row;
152
+ };
153
+ if (prior.rows.some(row => row.name === name)) {
154
+ const row = await adopt(prior);
155
+ effects.out?.(`Retained Messenger identity ${name}.`);
156
+ return { name, cid: row.cid, created: false };
157
+ }
158
+ effects.out?.(`Creating Messenger identity ${name} under ${prior.root.name}; retaining ${prior.rows.length} existing identities.`);
159
+ let result;
160
+ try {
161
+ result = await identityCommand(record, 'create-role', name);
162
+ } catch (error) {
163
+ // Only a name collision can mean a concurrent creator; any other failure is reported as it is.
164
+ if (error.code !== 'NAME_TAKEN') throw error;
165
+ // That creator is accepted only when the authoritative list now shows the name under the same root.
166
+ const after = await identities(record);
167
+ if (!after.rows.some(row => row.name === name)) throw error;
168
+ const row = await adopt(after);
169
+ return { name, cid: row.cid, created: false };
170
+ }
171
+ const after = await identities(record);
172
+ const row = after.rows.find(candidate => candidate.name === name);
173
+ if (result?.created?.hierarchy !== 'role' || result.created.underRoot !== prior.root.name || after.root?.cid !== prior.root.cid
174
+ || !listed(row) || result.created.info?.cid !== row.cid || !under(result.current, row))
175
+ throw new Error('Messenger identity creation completed without a usable identity under the Human identity');
176
+ effects.out?.(`Messenger identity ${name} is ready.`);
177
+ return { name, cid: row.cid, created: true };
178
+ },
118
179
  async serverEnsureHumanProfile(record, human) {
119
180
  validateRecord(record);
120
181
  for (const key of ['name', 'surname']) if (typeof human[key] !== 'string' || !human[key].trim() || human[key].length > 100 || /[\x00-\x1f\x7f]/.test(human[key])) throw new Error('Invalid Messenger human profile');
@@ -42,6 +42,10 @@ export function validateSetupOptions(input, { interactive = input?.interactive =
42
42
  if (options[key].trim().length > 100) throw new Error(`${key} must contain at most 100 characters`);
43
43
  options[key] = options[key].trim();
44
44
  }
45
+ // Name and Surname together name the person's own identity, which Messenger runs as.
46
+ const person = `${options.name} ${options.surname}`;
47
+ if ([...person].length > 64 || person !== person.normalize('NFC') || /[\\/\p{Cc}\p{Cf}\p{Cs}\p{Zl}\p{Zp}]/u.test(person))
48
+ throw new Error('Name and Surname together must contain at most 64 NFC characters, including the space between them, without slashes or control characters');
45
49
  options.hostname = options.hostname?.trim() || defaultHostname();
46
50
  if (!/^[a-z0-9][a-z0-9-]{0,29}$/.test(options.hostname)) throw new Error('Hostname must contain 1–30 lowercase letters, digits or hyphens');
47
51
  const identity = `${options.localUsername}@${options.hostname}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ours.network/install",
3
- "version": "1.2.1-nightly.28",
3
+ "version": "1.2.1-nightly.29",
4
4
  "private": false,
5
5
  "description": "The all-in-one ours.network installer: one shared daemon, MCP, cowork, Telegram, Fleet initialization, harness plugins, Human identity, progress UI, and guided next steps.",
6
6
  "type": "module",