rovloom 0.5.0 → 0.6.1

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.
Files changed (64) hide show
  1. package/README.md +9 -1
  2. package/dist/src/admin/index.js +1 -1
  3. package/dist/src/{chunk-emcefrc1.js → chunk-0e9gg4sg.js} +3 -4
  4. package/dist/src/chunk-1xer1ent.js +102 -0
  5. package/dist/src/{chunk-863tk45b.js → chunk-41fny9qm.js} +5 -5
  6. package/dist/src/{chunk-zjzrcc59.js → chunk-59h200cr.js} +139 -7
  7. package/dist/src/chunk-5w5srj3b.js +93 -0
  8. package/dist/src/{chunk-d4ejrtjq.js → chunk-6n6b1xpy.js} +1 -1
  9. package/dist/src/{chunk-ympzv86c.js → chunk-6w4g9fw8.js} +16 -4
  10. package/dist/src/{chunk-smpevv7n.js → chunk-73aq2qkz.js} +9 -16
  11. package/dist/src/{chunk-0ake7e4r.js → chunk-8c9yc0ge.js} +9 -17
  12. package/dist/src/{chunk-57ayxqnb.js → chunk-8fy8w7ds.js} +2 -23
  13. package/dist/src/{chunk-64ftwe9b.js → chunk-8ykrqhxh.js} +8 -2
  14. package/dist/src/{chunk-2tn0r64b.js → chunk-9h9x79bx.js} +5 -5
  15. package/dist/src/{chunk-nyn75b8v.js → chunk-av31bx1e.js} +31 -2
  16. package/dist/src/{chunk-0xgpxdgc.js → chunk-bbdtsg4b.js} +7 -5
  17. package/dist/src/{chunk-q5pgbwb3.js → chunk-e7jgpxkf.js} +2 -2
  18. package/dist/src/{chunk-zj48jvfe.js → chunk-efty77sb.js} +3 -40
  19. package/dist/src/{chunk-abd4envz.js → chunk-enj7s8cv.js} +71 -78
  20. package/dist/src/{chunk-4etdq0cp.js → chunk-ftpy8xx3.js} +313 -28
  21. package/dist/src/{chunk-zdxww7ms.js → chunk-h3xyq7zk.js} +1 -1
  22. package/dist/src/{chunk-ttsrctxg.js → chunk-hxmq28pg.js} +9 -7
  23. package/dist/src/{chunk-r0nfthsf.js → chunk-j59ac0xs.js} +2 -2
  24. package/dist/src/{chunk-5s2emvww.js → chunk-j6svdqr8.js} +10 -302
  25. package/dist/src/{chunk-9y36gntb.js → chunk-jkzfck98.js} +10 -5
  26. package/dist/src/{chunk-sj24fpz3.js → chunk-m76cmkfy.js} +28 -30
  27. package/dist/src/{chunk-5n8csngz.js → chunk-m96mbzcw.js} +816 -305
  28. package/dist/src/{chunk-xhq21g24.js → chunk-m9c1pnv9.js} +3 -3
  29. package/dist/src/{chunk-fnakrk0a.js → chunk-n3z3jaxy.js} +39 -36
  30. package/dist/src/{chunk-e7x51y0t.js → chunk-ndj0ay2p.js} +19 -18
  31. package/dist/src/chunk-pgs9jp6t.js +320 -0
  32. package/dist/src/chunk-pksaqt9a.js +25 -0
  33. package/dist/src/{chunk-ebm3kvnq.js → chunk-pnep7yhj.js} +31 -100
  34. package/dist/src/chunk-qn5xae7g.js +66 -0
  35. package/dist/src/{chunk-0pewfj89.js → chunk-qp8tgms2.js} +1 -1
  36. package/dist/src/{chunk-7k9g0x5e.js → chunk-rmgw8h27.js} +10 -8
  37. package/dist/src/{chunk-gbsbwssz.js → chunk-sf4ztxba.js} +3 -3
  38. package/dist/src/{chunk-7q96e161.js → chunk-shez7hkc.js} +6 -12
  39. package/dist/src/chunk-sqz614bh.js +30 -0
  40. package/dist/src/{chunk-09f9q26d.js → chunk-vdwzb63d.js} +2 -2
  41. package/dist/src/chunk-xtvgm6kf.js +48 -0
  42. package/dist/src/chunk-y8zm75jt.js +157 -0
  43. package/dist/src/chunk-yasqw2vj.js +756 -0
  44. package/dist/src/{chunk-ybte82d3.js → chunk-z0qmfqvd.js} +4 -3
  45. package/dist/src/chunk-zm705snh.js +53 -0
  46. package/dist/src/cli/index.js +39 -30
  47. package/dist/src/cli/main.js +14 -9
  48. package/dist/src/connector/herdr/installation.js +4 -4
  49. package/dist/src/connector/herdr/provider.js +9 -9
  50. package/dist/src/connector/herdr/runtime.js +7 -7
  51. package/dist/src/connector/luvus/index.js +7 -6
  52. package/dist/src/mcp/index.js +16 -14
  53. package/dist/src/runtime/index.js +16 -15
  54. package/dist/src/service/index.js +3 -4
  55. package/dist/src/store.js +4 -4
  56. package/dist/src/transport/index.js +9 -9
  57. package/dist/src/webui/index.js +975 -834
  58. package/package.json +1 -1
  59. package/dist/src/chunk-5j0gj6w2.js +0 -7
  60. package/dist/src/chunk-9yg6x3gt.js +0 -24
  61. package/dist/src/chunk-erdq0rn8.js +0 -1300
  62. package/dist/src/chunk-n073xnr1.js +0 -1117
  63. package/dist/src/chunk-rwpynx2j.js +0 -51
  64. package/dist/src/chunk-vwcntax3.js +0 -228
@@ -6,7 +6,7 @@ import"./chunk-9tt13dm0.js";
6
6
  import"./chunk-g7pnjzkk.js";
7
7
  import {
8
8
  readOrCreateRoleConfig
9
- } from "./chunk-64ftwe9b.js";
9
+ } from "./chunk-8ykrqhxh.js";
10
10
  import {
11
11
  resolveRoleConfigPath2
12
12
  } from "./chunk-1bf0wmgk.js";
@@ -50,7 +50,7 @@ function initializeRoleConfig(args, environment) {
50
50
  if (config.role === "connector" && provider && (config.native?.provider ?? "luvus") !== provider) {
51
51
  throw new CliError2("config_exists");
52
52
  }
53
- if (config.role === "gateway" && container && [config.mcp_hostname, config.device_hostname, config.management_hostname].some((host) => host !== "0.0.0.0")) {
53
+ if (config.role === "gateway" && container && (config.management_lan !== true || [config.mcp_hostname, config.device_hostname, config.management_hostname].some((host) => host !== "0.0.0.0"))) {
54
54
  throw new CliError2("config_exists");
55
55
  }
56
56
  return config;
@@ -59,4 +59,4 @@ export {
59
59
  initializeRoleConfig
60
60
  };
61
61
 
62
- //# debugId=130364AF0AAC3C8064756E2164756E21
62
+ //# debugId=5FE0BCD7E52AF87B64756E2164756E21
@@ -1,13 +1,18 @@
1
1
  // @bun
2
+ import"./chunk-d71r315c.js";
3
+ import"./chunk-7crhmqn2.js";
2
4
  import {
3
5
  object2,
4
6
  fields2,
5
7
  boundedJson2
6
8
  } from "./chunk-qt9m2kg2.js";
9
+ import"./chunk-9tt13dm0.js";
10
+ import"./chunk-g7pnjzkk.js";
11
+ import {
12
+ cliMessages2,
13
+ formatMessage2
14
+ } from "./chunk-pgs9jp6t.js";
7
15
  import {
8
- setupFileStamp,
9
- writeSetupFile,
10
- readSetupJson,
11
16
  REGISTRY_MAX_BYTES,
12
17
  parseRegistry,
13
18
  DEFAULT_ADMIN_TTL_DAYS,
@@ -15,13 +20,17 @@ import {
15
20
  issueAdmin,
16
21
  revokeAdmin,
17
22
  summarizeAdmins
18
- } from "./chunk-ebm3kvnq.js";
23
+ } from "./chunk-pnep7yhj.js";
24
+ import {
25
+ setupFileStamp,
26
+ writeSetupFile,
27
+ readSetupJson
28
+ } from "./chunk-1xer1ent.js";
19
29
  import {
20
30
  resolveRoleConfigPath2
21
31
  } from "./chunk-1bf0wmgk.js";
22
32
  import {
23
- runtimeReference,
24
- readRuntimeJson
33
+ runtimeReference
25
34
  } from "./chunk-z7kkfrgz.js";
26
35
  import {
27
36
  CLI_ERROR_CODES,
@@ -31,20 +40,12 @@ import {
31
40
  import {
32
41
  canonicalLoopbackHost
33
42
  } from "./chunk-6n9s7nfe.js";
43
+ import"./chunk-3nnahj0j.js";
44
+ import"./chunk-0y5542k8.js";
34
45
 
35
46
  // src/cli/admin-command.ts
36
- var ADMIN_HELP = `\u7528\u6CD5\uFF1A
37
- rovloom admin list [--config /absolute/path/gateway.json]
38
- rovloom admin create [--principal ID] [--ttl-days N] [--config /absolute/path/gateway.json]
39
- rovloom admin revoke [--principal ID] [--config /absolute/path/gateway.json]
40
-
41
- \u7BA1\u7406\u9875\uFF08\u9ED8\u8BA4 http://127.0.0.1:9445/\uFF09\u7528 HTTP Basic \u767B\u5F55\uFF1A\u7528\u6237\u540D\u662F\u7BA1\u7406\u5458 ID\uFF08\u9ED8\u8BA4 admin\uFF09\uFF0C\u5BC6\u7801\u662F create \u8F93\u51FA\u7684\u53E3\u4EE4\u3002
42
- \u53E3\u4EE4\u539F\u503C\u53EA\u5728 create \u65F6\u5199\u5230 stdout \u4E00\u6B21\uFF08Gateway \u53EA\u4FDD\u5B58 SHA-256 \u6458\u8981\uFF09\uFF1B\u5176\u4F59\u4FE1\u606F\u5199\u5230 stderr\u3002\u4E22\u5931\u53E3\u4EE4\u5C31\u518D create \u4E00\u6B21\uFF1A
43
- \u540C\u540D\u7BA1\u7406\u5458\u88AB\u91CD\u65B0\u7B7E\u53D1\uFF0C\u65E7\u53E3\u4EE4\u4E0E\u5DF2\u767B\u5F55\u7684\u6D4F\u89C8\u5668\u4F1A\u8BDD\u7ACB\u5373\u5931\u6548\u3002revoke \u5220\u9664\u7BA1\u7406\u5458\uFF0C\u540C\u6837\u7ACB\u5373\u751F\u6548\u3002\u4FEE\u6539\u65E0\u9700\u91CD\u542F Gateway\u3002
44
- \u7BA1\u7406\u5458\u4E0D\u80FD\u8C03\u7528 MCP\uFF0C\u4E5F\u4E0E MCP \u4EE4\u724C\u3001\u8BBE\u5907\u51ED\u636E\u4E92\u4E0D\u901A\u7528\uFF1B\u6709\u6548\u671F\u9ED8\u8BA4 ${DEFAULT_ADMIN_TTL_DAYS} \u5929\uFF081-365\uFF09\u3002
45
- \u53EF\u5728\u9996\u6B21\u914D\u5BF9\u524D\u521B\u5EFA\uFF1A\u5168\u65B0 Gateway \u4F1A\u81EA\u884C\u521D\u59CB\u5316\u7A7A\u7684 MCP \u8C03\u7528\u65B9\u6CE8\u518C\u8868\uFF0C\u968F\u540E\u5373\u53EF\u5728\u7BA1\u7406\u9875
46
- \u5728\u7EBF\u914D\u5BF9\u9996\u53F0 Connector\uFF08\u65B0\u5EFA\u7533\u8BF7\uFF0C\u8BBE\u5907\u8FD0\u884C rovloom connector --claim\uFF09\u3002
47
- `;
47
+ import { mkdirSync } from "fs";
48
+ import { dirname } from "path";
48
49
  function parse(args) {
49
50
  const sub = args[1];
50
51
  if (!sub || !["list", "create", "revoke"].includes(sub)) {
@@ -114,9 +115,10 @@ function callersStamp(path) {
114
115
  throw error;
115
116
  }
116
117
  }
117
- function writeAdminFiles2(config, principal, at, days) {
118
+ function writeAdminFiles(config, principal, at, days) {
118
119
  const callersPath = runtimeReference(config.state_dir, "mcp-callers");
119
120
  const managementPath = runtimeReference(config.state_dir, "management");
121
+ mkdirSync(dirname(managementPath), { recursive: true, mode: 448 });
120
122
  const stamp = callersStamp(callersPath);
121
123
  const callers = parseRegistry(readSetupJson(callersPath, REGISTRY_MAX_BYTES) ?? emptyCallerRegistry(callerResource(config)));
122
124
  const { file, exists } = loadManagement(managementPath, config.management_port);
@@ -130,13 +132,10 @@ function writeAdminFiles2(config, principal, at, days) {
130
132
  writeSetupFile(managementPath, boundedJson2(issued.management, 65536), exists, managementStamp);
131
133
  return { secret: issued.secret, expires_at: issued.expires_at };
132
134
  }
133
- function managementSourceExists2(config) {
134
- return readSetupJson(runtimeReference(config.state_dir, "management")) !== undefined;
135
- }
136
- async function handleAdminCommand2(args, io, environment, now = Date.now) {
135
+ async function handleAdminCommand(args, io, environment, now = Date.now) {
137
136
  try {
138
137
  if (args.length === 2 && args[1] === "--help") {
139
- io.stderr.write(ADMIN_HELP);
138
+ io.stderr.write(formatMessage2(cliMessages2(io.language)["help.admin"], { ttlDays: DEFAULT_ADMIN_TTL_DAYS }));
140
139
  return 0;
141
140
  }
142
141
  const flags = parse(args);
@@ -149,16 +148,20 @@ async function handleAdminCommand2(args, io, environment, now = Date.now) {
149
148
  const at = now();
150
149
  const principal = flags.principal ?? "admin";
151
150
  if (flags.sub === "create") {
152
- const issued = writeAdminFiles2(config, principal, at, flags.days);
153
- io.stderr.write("created administrator " + principal + " expires " + new Date(issued.expires_at).toISOString() + `
154
- login at http://127.0.0.1:` + config.management_port + '/ with user "' + principal + `" and the password below (shown once)
155
- `);
151
+ const issued = writeAdminFiles(config, principal, at, flags.days);
152
+ io.stderr.write(formatMessage2(cliMessages2(io.language)["admin.create.created"], {
153
+ principal,
154
+ expires: new Date(issued.expires_at).toISOString()
155
+ }) + formatMessage2(cliMessages2(io.language)["admin.create.login"], {
156
+ url: "http://127.0.0.1:" + config.management_port + "/",
157
+ user: principal
158
+ }));
156
159
  io.stdout.write(issued.secret + `
157
160
  `);
158
161
  return 0;
159
162
  }
160
- const callersStamp = setupFileStamp(callersPath);
161
- const callers = parseRegistry(readRuntimeJson(callersPath, REGISTRY_MAX_BYTES));
163
+ const registryStamp = callersStamp(callersPath);
164
+ const callers = parseRegistry(readSetupJson(callersPath, REGISTRY_MAX_BYTES) ?? emptyCallerRegistry(callerResource(config)));
162
165
  const { file, exists } = loadManagement(managementPath, config.management_port);
163
166
  if (flags.sub === "list") {
164
167
  for (const row of summarizeAdmins(file, at)) {
@@ -170,9 +173,8 @@ login at http://127.0.0.1:` + config.management_port + '/ with user "' + princip
170
173
  const stamp = exists ? setupFileStamp(managementPath) : undefined;
171
174
  const revoked = revokeAdmin(callers, file, principal);
172
175
  writeSetupFile(managementPath, boundedJson2(revoked.management, 65536), true, stamp);
173
- writeSetupFile(callersPath, boundedJson2(revoked.callers, REGISTRY_MAX_BYTES), true, callersStamp);
174
- io.stderr.write("revoked administrator " + principal + `
175
- `);
176
+ writeSetupFile(callersPath, boundedJson2(revoked.callers, REGISTRY_MAX_BYTES), true, registryStamp);
177
+ io.stderr.write(formatMessage2(cliMessages2(io.language)["admin.revoked"], { principal }));
176
178
  return 0;
177
179
  } catch (error) {
178
180
  if (error instanceof CliError2 && CLI_ERROR_CODES.includes(error.code)) {
@@ -185,7 +187,8 @@ login at http://127.0.0.1:` + config.management_port + '/ with user "' + princip
185
187
  return 1;
186
188
  }
187
189
  }
190
+ export {
191
+ handleAdminCommand
192
+ };
188
193
 
189
- export { writeAdminFiles2, managementSourceExists2, handleAdminCommand2 };
190
-
191
- //# debugId=B65D75D1FF47247C64756E2164756E21
194
+ //# debugId=708B820E06464CB564756E2164756E21
@@ -15,10 +15,10 @@ import"./chunk-9tt13dm0.js";
15
15
  import"./chunk-g7pnjzkk.js";
16
16
  import"./chunk-y4hksha9.js";
17
17
  import"./chunk-zxsz6g14.js";
18
- import"./chunk-09f9q26d.js";
18
+ import"./chunk-vdwzb63d.js";
19
19
  import {
20
20
  pinTerminalExecution
21
- } from "./chunk-57ayxqnb.js";
21
+ } from "./chunk-8fy8w7ds.js";
22
22
  import {
23
23
  HerdrLocalError,
24
24
  peerIsCurrentUser,
@@ -31,57 +31,58 @@ import {
31
31
  inspectHerdrServerProcess,
32
32
  bindAttachedHerdr,
33
33
  launchHerdrProcess2
34
- } from "./chunk-q5pgbwb3.js";
34
+ } from "./chunk-e7jgpxkf.js";
35
35
  import"./chunk-mqyq5jh6.js";
36
36
  import"./chunk-hz8pm6hz.js";
37
37
  import {
38
38
  closeSession
39
- } from "./chunk-zjzrcc59.js";
40
- import"./chunk-zj48jvfe.js";
41
- import"./chunk-nyn75b8v.js";
42
- import"./chunk-0xgpxdgc.js";
43
- import"./chunk-d4ejrtjq.js";
39
+ } from "./chunk-59h200cr.js";
40
+ import"./chunk-efty77sb.js";
41
+ import"./chunk-av31bx1e.js";
42
+ import"./chunk-bbdtsg4b.js";
43
+ import"./chunk-6n6b1xpy.js";
44
44
  import {
45
45
  nativeRecordStamp,
46
46
  readNativeRecord,
47
47
  createNativeRecord,
48
48
  removeNativeRecord,
49
49
  recoverLuvusClaimsLock
50
- } from "./chunk-5s2emvww.js";
50
+ } from "./chunk-j6svdqr8.js";
51
51
  import {
52
52
  composeConnectorSessions2,
53
53
  createLuvusConnectorSessions2,
54
54
  createLuvusProductionSources2
55
- } from "./chunk-4etdq0cp.js";
55
+ } from "./chunk-ftpy8xx3.js";
56
56
  import"./chunk-5h82060k.js";
57
57
  import {
58
58
  herdrDeadline,
59
59
  withHerdrSocket,
60
60
  HerdrInstallation2
61
- } from "./chunk-863tk45b.js";
61
+ } from "./chunk-41fny9qm.js";
62
62
  import"./chunk-zb641qa3.js";
63
- import"./chunk-ttsrctxg.js";
63
+ import"./chunk-hxmq28pg.js";
64
64
  import"./chunk-5svt6rwr.js";
65
65
  import {
66
66
  parseHerdrProviderRefConfig2,
67
67
  createHerdrGatewayResources2,
68
68
  createHerdrConnectorResources2
69
- } from "./chunk-2tn0r64b.js";
69
+ } from "./chunk-9h9x79bx.js";
70
70
  import {
71
71
  readRuntimeFile
72
72
  } from "./chunk-z7kkfrgz.js";
73
73
  import {
74
74
  CliError2
75
75
  } from "./chunk-hpzr94hm.js";
76
- import"./chunk-vwcntax3.js";
77
- import"./chunk-gbsbwssz.js";
76
+ import"./chunk-xtvgm6kf.js";
77
+ import"./chunk-5w5srj3b.js";
78
+ import"./chunk-sf4ztxba.js";
78
79
  import"./chunk-3nnahj0j.js";
79
- import"./chunk-zdxww7ms.js";
80
+ import"./chunk-h3xyq7zk.js";
80
81
  import {
81
82
  currentProcessIdentity,
82
83
  listening,
83
84
  ownerIsDead
84
- } from "./chunk-0pewfj89.js";
85
+ } from "./chunk-qp8tgms2.js";
85
86
  import"./chunk-0y5542k8.js";
86
87
 
87
88
  // src/cli/production-herdr.ts
@@ -974,4 +975,4 @@ export {
974
975
  createProductSources
975
976
  };
976
977
 
977
- //# debugId=8CB62E3C0DB6789864756E2164756E21
978
+ //# debugId=C72B2A5481F7ADBD64756E2164756E21
@@ -0,0 +1,320 @@
1
+ // @bun
2
+ // src/cli/messages.ts
3
+ function prefersChinese(tag) {
4
+ return tag.split(".")[0].toLowerCase().replace(/_/gu, "-").startsWith("zh");
5
+ }
6
+ function resolveCliLanguage2(env) {
7
+ const explicit = env.ROVLOOM_LANG?.trim();
8
+ if (explicit) {
9
+ return prefersChinese(explicit) ? "zh-CN" : "en";
10
+ }
11
+ return "en";
12
+ }
13
+ var english = Object.freeze({
14
+ "help.main": `Rovloom {version}
15
+
16
+ Usage:
17
+ rovloom --help
18
+ rovloom --version
19
+ rovloom config template gateway|connector
20
+ rovloom config init connector [--provider luvus|herdr|mixed] [--config /absolute/path/config.json]
21
+ rovloom config init gateway [--container] [--config /absolute/path/config.json]
22
+ rovloom config check [--role gateway|connector] [--config /absolute/path/config.json]
23
+ rovloom config check-runtime [--role gateway|connector] [--config /absolute/path/config.json]
24
+ rovloom gateway [--issue-code] [--config /absolute/path/config.json] [--non-interactive]
25
+ rovloom connector --join <ws://host:port#pairing-code> [--config /absolute/path/config.json]
26
+ rovloom connector --unpair [--non-interactive]
27
+ rovloom service --help
28
+ rovloom token --help
29
+ rovloom doctor --help
30
+ rovloom storage --help
31
+ rovloom admin --help
32
+
33
+ gateway / connector starts the matching role. Pairing is one command: create a per-device pairing code on the
34
+ management page (or run 'rovloom gateway --issue-code' to print one), then run the displayed join command on the
35
+ Connector machine. No prompts, approvals or verification codes.
36
+ --issue-code makes the running Gateway print one fresh per-device pairing code and the full join command.
37
+ --join pairs and starts in one step; running it again with a new code re-pairs this machine as a new device,
38
+ and a join command from a different Gateway retires the previous local state and pairs there.
39
+ --unpair retires all local pairing state (kept under state/retired/) and clears the Gateway address for a clean start.
40
+ --non-interactive disables local interactive behavior (services run this way).
41
+ token manages MCP Bearer tokens, admin manages management-page administrators, and service manages boot services; see each --help.
42
+ config check validates the configuration file read-only; check-runtime additionally verifies program-managed state without reading credentials.
43
+
44
+ Without --config, ~/.config/rovloom/gateway.json or connector.json is used (Windows also uses the user home).
45
+ A missing file is created with defaults on the first run; an existing file is never overwritten or reset.
46
+ Gateway supports Linux/macOS/Windows; Connector supports Linux x64, Windows x64 and macOS (x64 / arm64, attaching only already-running Herdr / Luvus).
47
+ First-run setup selects luvus (default), herdr or mixed via the Connector's native.provider.
48
+ Agent and model logins must be prepared separately; a ready native installation does not mean a model has replied.
49
+ Exit codes: 0 success/clean shutdown, 2 argument or configuration error, 3 backend unavailable, 1 runtime or shutdown failure.
50
+ `,
51
+ "help.admin": `Usage:
52
+ rovloom admin list [--config /absolute/path/gateway.json]
53
+ rovloom admin create [--principal ID] [--ttl-days N] [--config /absolute/path/gateway.json]
54
+ rovloom admin revoke [--principal ID] [--config /absolute/path/gateway.json]
55
+
56
+ The management page (default http://127.0.0.1:9445/) signs in with HTTP Basic: the user name is the administrator ID (default admin) and the password is the secret printed by create.
57
+ The password is written to stdout once, only by create (the Gateway stores only a SHA-256 digest); everything else goes to stderr. If the password is lost, run create again:
58
+ an administrator with the same name is re-issued, and the old password plus signed-in browser sessions stop working immediately. revoke removes an administrator with the same immediate effect. Changes apply without restarting the Gateway.
59
+ Administrators cannot call MCP and share nothing with MCP tokens or device credentials; the default validity is {ttlDays} days (1-365).
60
+ Can be created before the first pairing: a fresh Gateway initializes an empty MCP caller registry on its own, after which the management page
61
+ pairs the first Connector (generate a per-device code, then run the displayed join command on the device).
62
+ `,
63
+ "help.token": `Usage:
64
+ rovloom token list [--config /absolute/path/gateway.json]
65
+ rovloom token create --principal ID --like EXISTING_ID [--ttl-days N]
66
+ rovloom token renew --principal ID [--ttl-days N]
67
+ rovloom token rotate --principal ID [--ttl-days N] [--grace-minutes M]
68
+ rovloom token revoke --principal ID
69
+ rovloom token permissions --principal ID --discard-response true|false
70
+
71
+ The token registry lives in the Gateway state directory; the Gateway re-reads it on every authentication, so changes apply immediately without a restart.
72
+ create/rotate write the new token value to stdout once (new tokens are kept in the private registry and can be viewed again in the Dashboard); everything else goes to stderr.
73
+ create clones the new principal's permissions from the existing principal named by --like, without widening them. renew extends the expiry; the token stays the same.
74
+ rotate issues a new token; the old one keeps working within --grace-minutes (default 0, immediate invalidation). revoke removes the principal.
75
+ permissions manages the explicit result-discard permission, hot-reloaded and off by default. Read and save anything you need before discarding results.
76
+ ttl defaults to 30 days (1-365).
77
+ `,
78
+ "help.storage": `Usage:
79
+ rovloom doctor --role gateway|connector [--config /absolute/config.json] [--json]
80
+ rovloom storage check --role gateway [--config /absolute/config.json] [--json]
81
+ rovloom storage backup --role gateway --output /path/to/gateway.backups/snapshot.db [--config /absolute/config.json] [--json]
82
+ rovloom storage resume --role gateway [--config /absolute/config.json] [--json]
83
+
84
+ Gateway commands require the service to be stopped first; they share the same write lock and refuse active or undeterminable holders.
85
+ check is read-only; backup only uses the plain <state>.backups directory next to the real state directory and exports a redacted snapshot (no raw text or valid credentials); full state needs a separate offline backup.
86
+ resume is an explicit degradation release approved by the local operator and still refuses when integrity, clock or budget checks fail.
87
+ Connector doctor only checks the configuration and managed state; it starts no native runtime and claims no native readiness.
88
+ `,
89
+ "help.service": `service install --role gateway|connector [--executable ABS] [--config ABS] --workdir ABS --user ACCOUNT
90
+ service uninstall|start|restart|stop --role gateway|connector
91
+ install registers boot startup without starting; uninstall only revokes future boot startup and preserves running instances and their control records.
92
+ Omitted --executable uses the current standalone binary; a different binary is rejected.
93
+ Omitted --config uses the same current-user role file as foreground startup. Installation fixes its absolute path; background startup does not select another home.
94
+ Linux uses systemd system units; macOS uses system LaunchDaemons; Windows uses boot-triggered tasks, not SCM services or login tasks.
95
+ Gateway services support Linux systemd, macOS system LaunchDaemons and Windows boot-triggered tasks; the local native Connector service supports Linux x64, Windows x64 and macOS (x64 / arm64).
96
+ Windows uses the explicitly selected existing user with S4U, without storing a password or requiring login. It does not provide an interactive desktop or Windows network credentials/EFS access. Running services receive a local shutdown request; queued/start-racing tasks return service_busy without forced termination; uninstall never stops it.
97
+ `,
98
+ "guard.bunUnsupported": `Rovloom requires Bun {minimum} or newer (https://bun.sh); this runtime is not supported.
99
+ `,
100
+ "run.wildcardListenWarning": `wildcard_listener
101
+ MCP/management listen on all interfaces over plain HTTP; protect them with a firewall or a TLS reverse proxy.
102
+ `,
103
+ "run.pairingRequiredHint": `Gateway is running; pair a Connector (management page or rovloom gateway --issue-code, then run the join command on the device) before using an Agent.
104
+ `,
105
+ "run.configurationRequiredHint": `Setup requires a reachable Gateway, a valid pairing code and a compatible installed Luvus or Herdr. Preserve uncertain setup state for owner review.
106
+ `,
107
+ "setup.native.managedUnsupportedWindows": `{provider}_managed_unsupported_on_windows: set native.{configKey}.mode to "attach".
108
+ `,
109
+ "setup.native.managedUnsupportedMacos": `{provider}_managed_unsupported_on_macos: set native.{configKey}.mode to "attach".
110
+ `,
111
+ "setup.join.completed": `pairing_completed: device {machine} is paired with {url}.
112
+ `,
113
+ "setup.join.providers": `providers: {entries}
114
+ `,
115
+ "setup.join.mcpBlock": `MCP URL: {url}
116
+ Bearer (private): {token}
117
+ `,
118
+ "setup.join.resettingState": `Previous pairing state for another device was retired to {retired}; pairing as a new device.
119
+ `,
120
+ "setup.join.switchingGateway": `Joining a different Gateway; previous pairing state was retired to {retired}.
121
+ `,
122
+ "unpair.completed": `unpair_completed: local pairing state was retired to {retired} and the Gateway address was cleared.
123
+ Run rovloom connector --join to pair with any Gateway.
124
+ `,
125
+ "unpair.empty": `unpair_completed: no local pairing state found; nothing to reset.
126
+ `,
127
+ "setup.native.statePathTooLongLuvus": `native_state_path_too_long: choose a shorter data.directory before initialization (Luvus state path maximum 52 UTF-8 bytes).
128
+ `,
129
+ "setup.native.statePathTooLongHerdr": `native_state_path_too_long: choose a shorter data.directory for the private Herdr sockets (herdr.sock and herdr-client.sock).
130
+ `,
131
+ "setup.gateway.joinCommandBlock": `Join command (one per device; run it on the Connector machine to consume):
132
+ {command}
133
+ `,
134
+ "admin.create.login": `login at {url} with user "{user}" and the password below (shown once)
135
+ `,
136
+ "admin.create.created": `created administrator {principal} expires {expires}
137
+ `,
138
+ "admin.revoked": `revoked administrator {principal}
139
+ `,
140
+ "token.created": `created {principal} expires {expires}
141
+ `,
142
+ "token.renewed": `renewed {principal} expires {expires}
143
+ `,
144
+ "token.rotated": `rotated {principal} expires {expires}
145
+ `,
146
+ "token.permissions": `permissions {principal} discard_response={discard}
147
+ `,
148
+ "token.revoked": `revoked {principal}
149
+ `,
150
+ "mcp.instructions": "Tool availability does not imply a ready backend; execution, authorization, confirmation, deduplication and result retention are owned by the trusted service.",
151
+ "mcp.tool.machines_list": "List the devices visible to the current caller; paging and counts must pass the current ACL.",
152
+ "mcp.tool.machines_get": "Read a visible device by stable ID or exact name.",
153
+ "mcp.tool.providers_list": "List the configured providers visible to the current caller under a device; local machine configuration is not returned.",
154
+ "mcp.tool.providers_get": "Read the kind, revision and readiness of an explicit provider.",
155
+ "mcp.tool.runtime_discover": "Discover the effective capabilities and sources of an explicit Target/revision; grants no execution permission.",
156
+ "mcp.tool.runtime_describe": "Describe the exact methods\u2019 native parameters, categories and limits under an explicit Target/revision.",
157
+ "mcp.tool.runtime_call": "Submit one native call for an explicit Target/revision/contract. deadline is an absolute millisecond deadline; wait_ms only controls short waits; no retries or provider management.",
158
+ "mcp.tool.runtime_call_get": "Read a call under the current ownership, both-end policies and content gating; a short-wait timeout does not change the execution deadline.",
159
+ "mcp.tool.runtime_call_cancel": "Request stopping a wait or bridge; reports only what the service can confirm and promises no native rollback.",
160
+ "mcp.tool.runtime_result_read": "Read bounded result pages under the current read authorization and deadlines; the cursor is bound by the service to the caller and the original result.",
161
+ "mcp.tool.runtime_response_discard": "After processing, explicitly delete the raw text and handle and release read capacity; ownership, the current original-method policy and the independent discard_response permission must be verified. Reading to EOF does not delete the result."
162
+ });
163
+ var chinese = Object.freeze({
164
+ "help.main": `Rovloom {version}
165
+
166
+ \u7528\u6CD5\uFF1A
167
+ rovloom --help
168
+ rovloom --version
169
+ rovloom config template gateway|connector
170
+ rovloom config init connector [--provider luvus|herdr|mixed] [--config /absolute/path/config.json]
171
+ rovloom config init gateway [--container] [--config /absolute/path/config.json]
172
+ rovloom config check [--role gateway|connector] [--config /absolute/path/config.json]
173
+ rovloom config check-runtime [--role gateway|connector] [--config /absolute/path/config.json]
174
+ rovloom gateway [--issue-code] [--config /absolute/path/config.json] [--non-interactive]
175
+ rovloom connector --join <ws://host:port#\u914D\u5BF9\u7801> [--config /absolute/path/config.json]
176
+ rovloom connector --unpair [--non-interactive]
177
+ rovloom service --help
178
+ rovloom token --help
179
+ rovloom doctor --help
180
+ rovloom storage --help
181
+ rovloom admin --help
182
+
183
+ gateway / connector \u542F\u52A8\u5BF9\u5E94\u89D2\u8272\u3002\u914D\u5BF9\u53EA\u9700\u4E00\u6761\u547D\u4EE4\uFF1A\u5728\u7BA1\u7406\u9875\u751F\u6210\u4E00\u673A\u4E00\u7801\uFF08\u6216\u8FD0\u884C rovloom gateway --issue-code \u6253\u5370\u4E00\u5F20\uFF09\uFF0C\u628A\u663E\u793A\u7684\u52A0\u5165\u547D\u4EE4\u590D\u5236\u5230 Connector \u673A\u5668\u6267\u884C\u5373\u53EF\u3002\u6CA1\u6709\u95EE\u7B54\u3001\u6279\u51C6\u6216\u6838\u5BF9\u7801\u3002
184
+ --issue-code \u8BA9\u8FD0\u884C\u4E2D\u7684 Gateway \u6253\u5370\u4E00\u5F20\u65B0\u7684\u4E00\u673A\u4E00\u7801\u53CA\u5B8C\u6574\u52A0\u5165\u547D\u4EE4\u3002
185
+ --join \u4E00\u6761\u547D\u4EE4\u5B8C\u6210\u914D\u5BF9\u5E76\u542F\u52A8\uFF1B\u7528\u65B0\u7801\u518D\u6B21\u6267\u884C\u5373\u628A\u672C\u673A\u4F5C\u4E3A\u65B0\u8BBE\u5907\u91CD\u65B0\u914D\u5BF9\uFF0C
186
+ \u6362\u4E00\u53F0 Gateway \u7684\u52A0\u5165\u547D\u4EE4\u5219\u4F1A\u9000\u5F79\u65E7\u72B6\u6001\u5E76\u76F4\u63A5\u914D\u5BF9\u8FC7\u53BB\u3002
187
+ --unpair \u628A\u672C\u5730\u914D\u5BF9\u72B6\u6001\u6574\u4F53\u9000\u5F79\uFF08\u4FDD\u7559\u5728 state/retired/\uFF09\u5E76\u6E05\u7A7A Gateway \u5730\u5740\uFF0C\u5F97\u5230\u5E72\u51C0\u7684\u8D77\u70B9\u3002
188
+ --non-interactive \u5173\u95ED\u672C\u5730\u4EA4\u4E92\u884C\u4E3A\uFF08\u670D\u52A1\u4EE5\u6B64\u8FD0\u884C\uFF09\u3002
189
+ token \u7BA1\u7406 MCP Bearer \u4EE4\u724C\uFF0Cadmin \u7BA1\u7406\u7BA1\u7406\u9875\u7BA1\u7406\u5458\uFF0Cservice \u7BA1\u7406\u5F00\u673A\u670D\u52A1\uFF1B\u8BE6\u89C1\u5404\u81EA\u7684 --help\u3002
190
+ config check \u53EA\u8BFB\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\uFF1Bcheck-runtime \u53E6\u6838\u5BF9\u7A0B\u5E8F\u7BA1\u7406\u7684\u72B6\u6001\uFF0C\u4E0D\u8BFB\u53D6\u51ED\u636E\u3002
191
+
192
+ \u7701\u7565 --config \u65F6\u8BFB\u53D6 ~/.config/rovloom/gateway.json \u6216 connector.json\uFF08Windows \u540C\u6837\u4F7F\u7528\u7528\u6237 home\uFF09\u3002
193
+ \u6587\u4EF6\u7F3A\u5931\u65F6\u9996\u6B21\u8FD0\u884C\u4F1A\u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u5DF2\u6709\u6587\u4EF6\u4E0D\u4F1A\u88AB\u8986\u76D6\u6216\u91CD\u7F6E\u3002
194
+ Gateway \u652F\u6301 Linux/macOS/Windows\uFF1BConnector \u652F\u6301 Linux x64\u3001Windows x64 \u4E0E macOS\uFF08x64 / arm64\uFF0C\u4EC5\u9644\u7740\u5DF2\u8FD0\u884C\u7684 Herdr / Luvus\uFF09\u3002
195
+ \u9996\u6B21\u5F15\u5BFC\u6309 Connector \u7684 native.provider \u9009\u62E9 luvus\uFF08\u9ED8\u8BA4\uFF09\u3001herdr \u6216 mixed\u3002
196
+ Agent \u4E0E\u6A21\u578B\u767B\u5F55\u9700\u72EC\u7ACB\u51C6\u5907\uFF1B\u539F\u751F ready \u4E0D\u4EE3\u8868\u6A21\u578B\u5DF2\u56DE\u590D\u3002
197
+ \u9000\u51FA\u7801\uFF1A0 \u6210\u529F/\u6B63\u5E38\u5173\u95ED\uFF0C2 \u53C2\u6570\u6216\u914D\u7F6E\u9519\u8BEF\uFF0C3 \u540E\u7AEF\u4E0D\u53EF\u7528\uFF0C1 \u8FD0\u884C\u6216\u5173\u95ED\u5931\u8D25\u3002
198
+ `,
199
+ "help.admin": `\u7528\u6CD5\uFF1A
200
+ rovloom admin list [--config /absolute/path/gateway.json]
201
+ rovloom admin create [--principal ID] [--ttl-days N] [--config /absolute/path/gateway.json]
202
+ rovloom admin revoke [--principal ID] [--config /absolute/path/gateway.json]
203
+
204
+ \u7BA1\u7406\u9875\uFF08\u9ED8\u8BA4 http://127.0.0.1:9445/\uFF09\u7528 HTTP Basic \u767B\u5F55\uFF1A\u7528\u6237\u540D\u662F\u7BA1\u7406\u5458 ID\uFF08\u9ED8\u8BA4 admin\uFF09\uFF0C\u5BC6\u7801\u662F create \u8F93\u51FA\u7684\u53E3\u4EE4\u3002
205
+ \u53E3\u4EE4\u539F\u503C\u53EA\u5728 create \u65F6\u5199\u5230 stdout \u4E00\u6B21\uFF08Gateway \u53EA\u4FDD\u5B58 SHA-256 \u6458\u8981\uFF09\uFF1B\u5176\u4F59\u4FE1\u606F\u5199\u5230 stderr\u3002\u4E22\u5931\u53E3\u4EE4\u5C31\u518D create \u4E00\u6B21\uFF1A
206
+ \u540C\u540D\u7BA1\u7406\u5458\u88AB\u91CD\u65B0\u7B7E\u53D1\uFF0C\u65E7\u53E3\u4EE4\u4E0E\u5DF2\u767B\u5F55\u7684\u6D4F\u89C8\u5668\u4F1A\u8BDD\u7ACB\u5373\u5931\u6548\u3002revoke \u5220\u9664\u7BA1\u7406\u5458\uFF0C\u540C\u6837\u7ACB\u5373\u751F\u6548\u3002\u4FEE\u6539\u65E0\u9700\u91CD\u542F Gateway\u3002
207
+ \u7BA1\u7406\u5458\u4E0D\u80FD\u8C03\u7528 MCP\uFF0C\u4E5F\u4E0E MCP \u4EE4\u724C\u3001\u8BBE\u5907\u51ED\u636E\u4E92\u4E0D\u901A\u7528\uFF1B\u6709\u6548\u671F\u9ED8\u8BA4 {ttlDays} \u5929\uFF081-365\uFF09\u3002
208
+ \u53EF\u5728\u9996\u6B21\u914D\u5BF9\u524D\u521B\u5EFA\uFF1A\u5168\u65B0 Gateway \u4F1A\u81EA\u884C\u521D\u59CB\u5316\u7A7A\u7684 MCP \u8C03\u7528\u65B9\u6CE8\u518C\u8868\uFF0C\u968F\u540E\u5373\u53EF\u5728\u7BA1\u7406\u9875
209
+ \u914D\u5BF9\u9996\u53F0 Connector\uFF08\u751F\u6210\u4E00\u673A\u4E00\u7801\uFF0C\u8BBE\u5907\u6267\u884C\u663E\u793A\u7684\u52A0\u5165\u547D\u4EE4\uFF09\u3002
210
+ `,
211
+ "help.token": `\u7528\u6CD5\uFF1A
212
+ rovloom token list [--config /absolute/path/gateway.json]
213
+ rovloom token create --principal ID --like EXISTING_ID [--ttl-days N]
214
+ rovloom token renew --principal ID [--ttl-days N]
215
+ rovloom token rotate --principal ID [--ttl-days N] [--grace-minutes M]
216
+ rovloom token revoke --principal ID
217
+ rovloom token permissions --principal ID --discard-response true|false
218
+
219
+ \u4EE4\u724C\u6CE8\u518C\u8868\u4F4D\u4E8E Gateway \u72B6\u6001\u76EE\u5F55\uFF1BGateway \u6BCF\u6B21\u8BA4\u8BC1\u91CD\u8BFB\uFF0C\u4FEE\u6539\u7ACB\u5373\u751F\u6548\u3001\u65E0\u9700\u91CD\u542F\u3002
220
+ create/rotate \u628A\u65B0\u4EE4\u724C\u539F\u503C\u53EA\u5199\u5230 stdout \u4E00\u6B21\uFF08\u65B0\u4EE4\u724C\u4FDD\u5B58\u5728\u79C1\u6709\u6CE8\u518C\u8868\uFF0C\u53EF\u5728\u7BA1\u7406\u5458\u9762\u677F\u518D\u6B21\u67E5\u770B\uFF09\uFF1B\u5176\u4F59\u4FE1\u606F\u5199\u5230 stderr\u3002
221
+ create \u7684\u65B0\u4E3B\u4F53\u6743\u9650\u514B\u9686\u81EA --like \u6307\u5B9A\u7684\u73B0\u6709\u4E3B\u4F53\uFF0C\u4E0D\u6269\u5927\u6743\u9650\u3002renew \u5EF6\u957F\u5230\u671F\u65F6\u95F4\u3001\u4EE4\u724C\u4E0D\u53D8\u3002
222
+ rotate \u7B7E\u53D1\u65B0\u4EE4\u724C\uFF1B--grace-minutes \u5185\u65E7\u4EE4\u724C\u7EE7\u7EED\u6709\u6548\uFF08\u9ED8\u8BA4 0\uFF0C\u7ACB\u5373\u5931\u6548\uFF09\u3002revoke \u5220\u9664\u4E3B\u4F53\u3002
223
+ permissions \u663E\u5F0F\u7BA1\u7406\u7ED3\u679C\u5220\u9664\u6743\u9650\uFF0C\u70ED\u751F\u6548\uFF1B\u9ED8\u8BA4\u5173\u95ED\u3002\u5220\u9664\u7ED3\u679C\u524D\u5E94\u5148\u8BFB\u53D6\u5E76\u4FDD\u5B58\u6240\u9700\u5185\u5BB9\u3002
224
+ ttl \u9ED8\u8BA4 30 \u5929\uFF081-365\uFF09\u3002
225
+ `,
226
+ "help.storage": `\u7528\u6CD5\uFF1A
227
+ rovloom doctor --role gateway|connector [--config /absolute/config.json] [--json]
228
+ rovloom storage check --role gateway [--config /absolute/config.json] [--json]
229
+ rovloom storage backup --role gateway --output /path/to/gateway.backups/snapshot.db [--config /absolute/config.json] [--json]
230
+ rovloom storage resume --role gateway [--config /absolute/config.json] [--json]
231
+
232
+ Gateway \u547D\u4EE4\u987B\u5148\u505C\u6B62\u670D\u52A1\uFF1B\u6CBF\u7528\u540C\u4E00\u5199\u9501\uFF0C\u62D2\u7EDD\u6D3B\u52A8\u6216\u65E0\u6CD5\u5224\u5B9A\u7684\u6301\u6709\u8005\u3002
233
+ check \u53EA\u8BFB\uFF1Bbackup \u4EC5\u4F7F\u7528\u771F\u5B9E\u72B6\u6001\u76EE\u5F55\u540C\u7EA7\u7684 <state>.backups \u666E\u901A\u76EE\u5F55\uFF0C\u5BFC\u51FA\u8131\u654F\u5FEB\u7167\uFF08\u4E0D\u542B\u539F\u6587\u53CA\u6709\u6548\u51ED\u636E\uFF09\uFF0C\u5B8C\u6574\u72B6\u6001\u9700\u53E6\u884C\u79BB\u7EBF\u5907\u4EFD\u3002
234
+ resume \u662F\u672C\u673A\u64CD\u4F5C\u5458\u663E\u5F0F\u6279\u51C6\u7684\u89E3\u9664\u964D\u7EA7\uFF0C\u5B8C\u6574\u6027\u3001\u65F6\u949F\u6216\u9884\u7B97\u4E0D\u6B63\u5E38\u65F6\u4ECD\u62D2\u7EDD\u3002
235
+ Connector doctor \u53EA\u68C0\u67E5\u914D\u7F6E\u53CA managed \u72B6\u6001\uFF0C\u4E0D\u542F\u52A8 native\uFF0C\u4E5F\u4E0D\u58F0\u660E native \u5C31\u7EEA\u3002
236
+ `,
237
+ "help.service": `service install --role gateway|connector [--executable ABS] [--config ABS] --workdir ABS --user ACCOUNT
238
+ service uninstall|start|restart|stop --role gateway|connector
239
+ install \u6CE8\u518C\u5F00\u673A\u81EA\u542F\u4F46\u4E0D\u7ACB\u5373\u542F\u52A8\uFF1Buninstall \u53EA\u64A4\u9500\u672A\u6765\u7684\u5F00\u673A\u81EA\u542F\uFF0C\u4FDD\u7559\u6B63\u5728\u8FD0\u884C\u7684\u5B9E\u4F8B\u53CA\u5176\u63A7\u5236\u8BB0\u5F55\u3002
240
+ \u7701\u7565 --executable \u65F6\u4F7F\u7528\u5F53\u524D\u72EC\u7ACB\u53EF\u6267\u884C\u6587\u4EF6\uFF1B\u4F20\u5165\u5176\u5B83\u53EF\u6267\u884C\u6587\u4EF6\u4F1A\u88AB\u62D2\u7EDD\u3002
241
+ \u7701\u7565 --config \u65F6\u6CBF\u7528\u4E0E\u524D\u53F0\u542F\u52A8\u76F8\u540C\u7684\u5F53\u524D\u7528\u6237\u89D2\u8272\u6587\u4EF6\uFF1B\u5B89\u88C5\u56FA\u5B9A\u5176\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u540E\u53F0\u542F\u52A8\u4E0D\u518D\u9009\u62E9\u5176\u5B83 home\u3002
242
+ Linux \u4F7F\u7528 systemd system \u5355\u5143\uFF1BmacOS \u4F7F\u7528\u7CFB\u7EDF LaunchDaemons\uFF1BWindows \u4F7F\u7528\u5F00\u673A\u89E6\u53D1\u4EFB\u52A1\uFF0C\u4E0D\u662F SCM \u670D\u52A1\u6216\u767B\u5F55\u4EFB\u52A1\u3002
243
+ Gateway \u670D\u52A1\u652F\u6301 Linux systemd\u3001macOS \u7CFB\u7EDF LaunchDaemons \u548C Windows \u5F00\u673A\u89E6\u53D1\u4EFB\u52A1\uFF1B\u672C\u673A\u539F\u751F Connector \u670D\u52A1\u652F\u6301 Linux x64\u3001Windows x64 \u548C macOS\uFF08x64 / arm64\uFF09\u3002
244
+ Windows \u4F7F\u7528\u663E\u5F0F\u9009\u62E9\u7684\u65E2\u6709\u7528\u6237\u4E0E S4U\uFF0C\u4E0D\u4FDD\u5B58\u5BC6\u7801\u3001\u4E0D\u8981\u6C42\u767B\u5F55\uFF1B\u4E0D\u63D0\u4F9B\u4EA4\u4E92\u684C\u9762\u6216 Windows \u7F51\u7EDC\u51ED\u636E/EFS \u8BBF\u95EE\u3002\u8FD0\u884C\u4E2D\u7684\u670D\u52A1\u6536\u5230\u672C\u5730\u505C\u6B62\u8BF7\u6C42\uFF1B\u6392\u961F/\u542F\u52A8\u7ADE\u6001\u4E2D\u7684\u4EFB\u52A1\u8FD4\u56DE service_busy \u4E14\u4E0D\u5F3A\u505C\uFF1Buninstall \u4ECE\u4E0D\u505C\u6B62\u5B83\u3002
245
+ `,
246
+ "guard.bunUnsupported": `Rovloom \u9700\u8981 Bun {minimum} \u6216\u66F4\u9AD8\u7248\u672C\uFF08https://bun.sh\uFF09\uFF1B\u5F53\u524D\u8FD0\u884C\u65F6\u4E0D\u53D7\u652F\u6301\u3002
247
+ `,
248
+ "run.wildcardListenWarning": `wildcard_listener
249
+ MCP/\u7BA1\u7406\u9875\u76D1\u542C\u6240\u6709\u7F51\u5361\u4E14\u4E3A\u660E\u6587 HTTP\uFF1B\u8BF7\u7528\u9632\u706B\u5899\u6216 TLS \u53CD\u5411\u4EE3\u7406\u6536\u53E3\u3002
250
+ `,
251
+ "run.pairingRequiredHint": `Gateway \u5DF2\u542F\u52A8\uFF1B\u4F7F\u7528 Agent \u524D\u5148\u914D\u5BF9\u4E00\u53F0 Connector\uFF08\u7BA1\u7406\u9875\u6216 rovloom gateway --issue-code \u751F\u6210\u914D\u5BF9\u7801\uFF0C\u8BBE\u5907\u6267\u884C\u52A0\u5165\u547D\u4EE4\uFF09\u3002
252
+ `,
253
+ "run.configurationRequiredHint": `\u521D\u59CB\u5316\u9700\u53EF\u8FBE Gateway\u3001\u6709\u6548\u914D\u5BF9\u7801\u53CA\u517C\u5BB9\u7684 Luvus/Herdr \u5B89\u88C5\uFF1B\u7ED3\u679C\u4E0D\u786E\u5B9A\u65F6\u4FDD\u7559\u539F\u72B6\u6001\u5E76\u7531\u6240\u6709\u8005\u6838\u67E5\u3002
254
+ `,
255
+ "setup.native.managedUnsupportedWindows": `{provider}_managed_unsupported_on_windows: Windows \u4E0A\u6682\u4E0D\u652F\u6301 managed\uFF0C\u8BF7\u628A native.{configKey}.mode \u8BBE\u4E3A "attach"\u3002
256
+ `,
257
+ "setup.native.managedUnsupportedMacos": `{provider}_managed_unsupported_on_macos: macOS \u4E0A\u6682\u4E0D\u652F\u6301 managed\uFF0C\u8BF7\u628A native.{configKey}.mode \u8BBE\u4E3A "attach"\u3002
258
+ `,
259
+ "setup.join.completed": `pairing_completed: \u8BBE\u5907 {machine} \u5DF2\u4E0E {url} \u5B8C\u6210\u914D\u5BF9\u3002
260
+ `,
261
+ "setup.join.providers": `providers: {entries}
262
+ `,
263
+ "setup.join.mcpBlock": `MCP URL: {url}
264
+ Bearer (private): {token}
265
+ `,
266
+ "setup.join.resettingState": `\u53E6\u4E00\u53F0\u8BBE\u5907\u7684\u65E7\u914D\u5BF9\u72B6\u6001\u5DF2\u9000\u5F79\u5230 {retired}\uFF1B\u6B63\u4EE5\u65B0\u8BBE\u5907\u8EAB\u4EFD\u91CD\u65B0\u914D\u5BF9\u3002
267
+ `,
268
+ "setup.join.switchingGateway": `\u6B63\u5728\u52A0\u5165\u53E6\u4E00\u53F0 Gateway\uFF1B\u65E7\u914D\u5BF9\u72B6\u6001\u5DF2\u9000\u5F79\u5230 {retired}\u3002
269
+ `,
270
+ "unpair.completed": `unpair_completed: \u672C\u5730\u914D\u5BF9\u72B6\u6001\u5DF2\u9000\u5F79\u5230 {retired}\uFF0CGateway \u5730\u5740\u5DF2\u6E05\u7A7A\u3002
271
+ \u8FD0\u884C rovloom connector --join \u5373\u53EF\u4E0E\u4EFB\u610F Gateway \u91CD\u65B0\u914D\u5BF9\u3002
272
+ `,
273
+ "unpair.empty": `unpair_completed: \u672C\u673A\u6CA1\u6709\u53EF\u91CD\u7F6E\u7684\u914D\u5BF9\u72B6\u6001\u3002
274
+ `,
275
+ "setup.native.statePathTooLongLuvus": `native_state_path_too_long: \u521D\u59CB\u5316\u524D\u8BF7\u7F29\u77ED data.directory\uFF08Luvus \u72B6\u6001\u8DEF\u5F84\u6700\u591A52\u4E2AUTF-8\u5B57\u8282\uFF09\u3002
276
+ `,
277
+ "setup.native.statePathTooLongHerdr": `native_state_path_too_long: \u8BF7\u7F29\u77ED data.directory \u4EE5\u5BB9\u7EB3\u9694\u79BB Herdr \u7684 socket\uFF08\u542B herdr-client.sock\uFF09\u3002
278
+ `,
279
+ "setup.gateway.joinCommandBlock": `\u52A0\u5165\u547D\u4EE4\uFF08\u4E00\u673A\u4E00\u7801\uFF0C\u590D\u5236\u5230 Connector \u673A\u5668\u6267\u884C\u5373\u6D88\u8D39\uFF09\uFF1A
280
+ {command}
281
+ `,
282
+ "admin.create.login": `\u5728 {url} \u7528\u7528\u6237\u540D "{user}" \u548C\u4E0B\u65B9\u5BC6\u7801\u767B\u5F55\uFF08\u5BC6\u7801\u53EA\u663E\u793A\u4E00\u6B21\uFF09
283
+ `,
284
+ "admin.create.created": `\u5DF2\u521B\u5EFA\u7BA1\u7406\u5458 {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
285
+ `,
286
+ "admin.revoked": `\u5DF2\u64A4\u9500\u7BA1\u7406\u5458 {principal}
287
+ `,
288
+ "token.created": `\u5DF2\u521B\u5EFA {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
289
+ `,
290
+ "token.renewed": `\u5DF2\u7EED\u671F {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
291
+ `,
292
+ "token.rotated": `\u5DF2\u8F6E\u6362 {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
293
+ `,
294
+ "token.permissions": `\u5DF2\u8BBE\u7F6E {principal} \u7684\u6743\u9650 discard_response={discard}
295
+ `,
296
+ "token.revoked": `\u5DF2\u64A4\u9500 {principal}
297
+ `,
298
+ "mcp.instructions": "\u5DE5\u5177\u5B58\u5728\u4E0D\u8868\u793A\u540E\u7AEF\u53EF\u7528\uFF1B\u6267\u884C\u3001\u6388\u6743\u3001\u786E\u8BA4\u3001\u53BB\u91CD\u4E0E\u7ED3\u679C\u4FDD\u7559\u7531\u53D7\u4FE1\u670D\u52A1\u8D1F\u8D23\u3002",
299
+ "mcp.tool.machines_list": "\u5217\u51FA\u5F53\u524D caller \u53EF\u89C1\u7684\u8BBE\u5907\uFF1B\u5206\u9875\u548C\u8BA1\u6570\u987B\u7ECF\u8FC7\u5F53\u524D ACL\u3002",
300
+ "mcp.tool.machines_get": "\u6309\u7A33\u5B9A ID \u6216\u7CBE\u786E\u540D\u79F0\u8BFB\u53D6\u53EF\u89C1\u8BBE\u5907\u3002",
301
+ "mcp.tool.providers_list": "\u5217\u51FA\u6307\u5B9A\u8BBE\u5907\u4E0B\u5F53\u524D caller \u53EF\u89C1\u7684\u5DF2\u914D\u7F6E provider\uFF1B\u4E0D\u8FD4\u56DE\u672C\u673A\u914D\u7F6E\u3002",
302
+ "mcp.tool.providers_get": "\u8BFB\u53D6\u663E\u5F0F provider \u7684 kind\u3001revision \u548C readiness\u3002",
303
+ "mcp.tool.runtime_discover": "\u53D1\u73B0\u663E\u5F0F Target/revision \u7684\u6709\u6548\u80FD\u529B\u53CA\u6765\u6E90\uFF1B\u4E0D\u6388\u4E88\u6267\u884C\u6743\u9650\u3002",
304
+ "mcp.tool.runtime_describe": "\u63CF\u8FF0\u663E\u5F0F Target/revision \u4E0B\u7CBE\u786E\u65B9\u6CD5\u7684\u539F\u751F\u53C2\u6570\u3001\u5206\u7C7B\u548C\u9650\u5236\u3002",
305
+ "mcp.tool.runtime_call": "\u63D0\u4EA4\u4E00\u6B21\u663E\u5F0F Target/revision/\u5951\u7EA6\u7684\u539F\u751F\u8C03\u7528\u3002deadline \u662F\u7EDD\u5BF9\u6BEB\u79D2\u671F\u9650\uFF0Cwait_ms \u53EA\u63A7\u5236\u77ED\u7B49\uFF1B\u4E0D\u91CD\u8BD5\u6216\u7BA1\u7406 provider\u3002",
306
+ "mcp.tool.runtime_call_get": "\u6309\u5F53\u524D\u5F52\u5C5E\u3001\u53CC\u7AEF\u7B56\u7565\u548C\u5185\u5BB9\u95E8\u7981\u8BFB\u53D6\u8C03\u7528\uFF1B\u77ED\u7B49\u5230\u671F\u4E0D\u6539\u53D8\u6267\u884C\u671F\u9650\u3002",
307
+ "mcp.tool.runtime_call_cancel": "\u8BF7\u6C42\u505C\u6B62\u7B49\u5F85\u6216\u6865\u63A5\uFF1B\u4EC5\u62A5\u544A\u670D\u52A1\u53EF\u786E\u8BA4\u7A0B\u5EA6\uFF0C\u4E0D\u627F\u8BFA\u539F\u751F\u56DE\u6EDA\u3002",
308
+ "mcp.tool.runtime_result_read": "\u6309\u5F53\u524D\u8BFB\u53D6\u6388\u6743\u548C\u671F\u9650\u8BFB\u53D6\u6709\u754C\u7ED3\u679C\u9875\uFF1Bcursor \u7531\u670D\u52A1\u7ED1\u5B9A caller \u548C\u539F\u7ED3\u679C\u3002",
309
+ "mcp.tool.runtime_response_discard": "\u5904\u7406\u5B8C\u7ED3\u679C\u540E\u663E\u5F0F\u5220\u9664\u539F\u6587\u4E0E\u53E5\u67C4\u5E76\u91CA\u653E\u8BFB\u53D6\u5BB9\u91CF\uFF1B\u5FC5\u987B\u9A8C\u8BC1\u5F52\u5C5E\u3001\u5F53\u524D\u539F\u65B9\u6CD5\u7B56\u7565\u53CA\u72EC\u7ACB discard_response \u6743\u9650\u3002\u8BFB\u53D6\u5230 EOF \u4E0D\u4F1A\u81EA\u52A8\u5220\u9664\u7ED3\u679C\u3002"
310
+ });
311
+ function cliMessages2(language = "en") {
312
+ return language === "zh-CN" ? chinese : english;
313
+ }
314
+ function formatMessage2(template, values) {
315
+ return template.replace(/\{(\w+)\}/gu, (match, name) => Object.hasOwn(values, name) ? String(values[name]) : match);
316
+ }
317
+
318
+ export { resolveCliLanguage2, cliMessages2, formatMessage2 };
319
+
320
+ //# debugId=768BC4F3AD60420064756E2164756E21
@@ -0,0 +1,25 @@
1
+ // @bun
2
+ // src/connector/luvus/types.ts
3
+ class LuvusAdapterError2 extends Error {
4
+ code;
5
+ outcome;
6
+ constructor(code, outcome = "not_dispatched") {
7
+ super(code);
8
+ this.code = code;
9
+ this.outcome = outcome;
10
+ this.name = "LuvusAdapterError";
11
+ }
12
+ }
13
+
14
+ // src/connector/capacity.ts
15
+ class ConnectorCapacityError extends LuvusAdapterError2 {
16
+ capacity;
17
+ constructor(resource, reclaimAt) {
18
+ super(resource.startsWith("claim_") ? "claim_capacity" : "connector_attempt_capacity");
19
+ this.capacity = Object.freeze({ resource, reclaim_at: reclaimAt });
20
+ }
21
+ }
22
+
23
+ export { LuvusAdapterError2, ConnectorCapacityError };
24
+
25
+ //# debugId=756004902A6361DA64756E2164756E21