rovloom 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +8 -0
  2. package/dist/src/admin/index.js +1 -1
  3. package/dist/src/{chunk-smpevv7n.js → chunk-0dqx2mmz.js} +9 -16
  4. package/dist/src/{chunk-rwpynx2j.js → chunk-0qgk7mhz.js} +12 -11
  5. package/dist/src/{chunk-erdq0rn8.js → chunk-3dvn33c4.js} +57 -58
  6. package/dist/src/chunk-5b8g62kw.js +438 -0
  7. package/dist/src/{chunk-64ftwe9b.js → chunk-8ykrqhxh.js} +8 -2
  8. package/dist/src/{chunk-9y36gntb.js → chunk-9zkq0kc8.js} +10 -5
  9. package/dist/src/{chunk-5n8csngz.js → chunk-d2kz25f2.js} +156 -11
  10. package/dist/src/{chunk-ympzv86c.js → chunk-ez7d5dac.js} +13 -4
  11. package/dist/src/{chunk-emcefrc1.js → chunk-g27b2gmx.js} +3 -4
  12. package/dist/src/{chunk-abd4envz.js → chunk-gyvqqnjb.js} +30 -57
  13. package/dist/src/{chunk-e7x51y0t.js → chunk-jf4r0r44.js} +2 -2
  14. package/dist/src/{chunk-4etdq0cp.js → chunk-jka7v3wb.js} +4 -7
  15. package/dist/src/{chunk-xhq21g24.js → chunk-m9c1pnv9.js} +3 -3
  16. package/dist/src/{chunk-7k9g0x5e.js → chunk-mg0fd6ph.js} +1 -1
  17. package/dist/src/{chunk-0ake7e4r.js → chunk-n6wtjyfb.js} +6 -14
  18. package/dist/src/{chunk-nyn75b8v.js → chunk-qjh9x872.js} +30 -1
  19. package/dist/src/{chunk-r0nfthsf.js → chunk-s3ydr65k.js} +2 -2
  20. package/dist/src/{chunk-ybte82d3.js → chunk-srfbjwtk.js} +4 -3
  21. package/dist/src/{chunk-sj24fpz3.js → chunk-ssp57p43.js} +24 -28
  22. package/dist/src/{chunk-ebm3kvnq.js → chunk-wxqhscsw.js} +26 -3
  23. package/dist/src/{chunk-7q96e161.js → chunk-x0td5wn4.js} +6 -12
  24. package/dist/src/{chunk-9yg6x3gt.js → chunk-ytpfmcp1.js} +4 -3
  25. package/dist/src/{chunk-fnakrk0a.js → chunk-yv9px0f5.js} +22 -25
  26. package/dist/src/{chunk-n073xnr1.js → chunk-zjkjjm81.js} +43 -46
  27. package/dist/src/cli/index.js +23 -15
  28. package/dist/src/cli/main.js +14 -9
  29. package/dist/src/mcp/index.js +6 -5
  30. package/dist/src/runtime/index.js +2 -2
  31. package/dist/src/service/index.js +3 -4
  32. package/dist/src/store.js +1 -1
  33. package/dist/src/webui/index.js +1095 -156
  34. package/package.json +1 -1
@@ -0,0 +1,438 @@
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 [--add-device | --repair-device] [--config /absolute/path/config.json] [--non-interactive]
25
+ rovloom connector [--repair | --claim] [--config /absolute/path/config.json] [--non-interactive]
26
+ rovloom service --help
27
+ rovloom token --help
28
+ rovloom doctor --help
29
+ rovloom storage --help
30
+ rovloom admin --help
31
+
32
+ gateway / connector starts the matching role. The first run completes one-time pairing and native installation approval in a real local terminal;
33
+ declining the pairing prompt keeps the Gateway running unpaired, so rovloom admin create can be run first and first pairing completed from the management page;
34
+ --add-device pairs one more Connector on top of a completed setup (same MCP credential; authorization grows to the new device);
35
+ --repair-device / --repair re-pairs the same already-paired device (lost or leaked credentials), keeping native setup and MCP authorization.
36
+ --claim lets an unpaired Connector claim an administrator-created pairing application from a running Gateway online (management-page code approval; the Gateway keeps running).
37
+ These four options need a real local terminal and cannot be combined with --non-interactive. --non-interactive disables the local interactive setup (services run this way).
38
+ token manages MCP Bearer tokens, admin manages management-page administrators, and service manages boot services; see each --help.
39
+ config check validates the configuration file read-only; check-runtime additionally verifies program-managed state without reading credentials.
40
+
41
+ Without --config, ~/.config/rovloom/gateway.json or connector.json is used (Windows also uses the user home).
42
+ A missing file is created with defaults on the first run; an existing file is never overwritten or reset.
43
+ Gateway supports Linux/macOS/Windows; Connector supports Linux x64, Windows x64 and macOS (x64 / arm64, attaching only already-running Herdr / Luvus).
44
+ First-run setup selects luvus (default), herdr or mixed via the Connector's native.provider.
45
+ Agent and model logins must be prepared separately; a ready native installation does not mean a model has replied.
46
+ Exit codes: 0 success/clean shutdown, 2 argument or configuration error, 3 backend unavailable, 1 runtime or shutdown failure.
47
+ `,
48
+ "help.admin": `Usage:
49
+ rovloom admin list [--config /absolute/path/gateway.json]
50
+ rovloom admin create [--principal ID] [--ttl-days N] [--config /absolute/path/gateway.json]
51
+ rovloom admin revoke [--principal ID] [--config /absolute/path/gateway.json]
52
+
53
+ 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.
54
+ 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:
55
+ 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.
56
+ Administrators cannot call MCP and share nothing with MCP tokens or device credentials; the default validity is {ttlDays} days (1-365).
57
+ Can be created before the first pairing: a fresh Gateway initializes an empty MCP caller registry on its own, after which the management page
58
+ pairs the first Connector online (create a pairing application, then run rovloom connector --claim on the device).
59
+ `,
60
+ "help.token": `Usage:
61
+ rovloom token list [--config /absolute/path/gateway.json]
62
+ rovloom token create --principal ID --like EXISTING_ID [--ttl-days N]
63
+ rovloom token renew --principal ID [--ttl-days N]
64
+ rovloom token rotate --principal ID [--ttl-days N] [--grace-minutes M]
65
+ rovloom token revoke --principal ID
66
+ rovloom token permissions --principal ID --discard-response true|false
67
+
68
+ The token registry lives in the Gateway state directory; the Gateway re-reads it on every authentication, so changes apply immediately without a restart.
69
+ 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.
70
+ 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.
71
+ rotate issues a new token; the old one keeps working within --grace-minutes (default 0, immediate invalidation). revoke removes the principal.
72
+ permissions manages the explicit result-discard permission, hot-reloaded and off by default. Read and save anything you need before discarding results.
73
+ ttl defaults to 30 days (1-365).
74
+ `,
75
+ "help.storage": `Usage:
76
+ rovloom doctor --role gateway|connector [--config /absolute/config.json] [--json]
77
+ rovloom storage check --role gateway [--config /absolute/config.json] [--json]
78
+ rovloom storage backup --role gateway --output /path/to/gateway.backups/snapshot.db [--config /absolute/config.json] [--json]
79
+ rovloom storage resume --role gateway [--config /absolute/config.json] [--json]
80
+
81
+ Gateway commands require the service to be stopped first; they share the same write lock and refuse active or undeterminable holders.
82
+ 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.
83
+ resume is an explicit degradation release approved by the local operator and still refuses when integrity, clock or budget checks fail.
84
+ Connector doctor only checks the configuration and managed state; it starts no native runtime and claims no native readiness.
85
+ `,
86
+ "help.service": `service install --role gateway|connector [--executable ABS] [--config ABS] --workdir ABS --user ACCOUNT
87
+ service uninstall|start|restart|stop --role gateway|connector
88
+ install registers boot startup without starting; uninstall only revokes future boot startup and preserves running instances and their control records.
89
+ Omitted --executable uses the current standalone binary; a different binary is rejected.
90
+ Omitted --config uses the same current-user role file as foreground startup. Installation fixes its absolute path; background startup does not select another home.
91
+ Linux uses systemd system units; macOS uses system LaunchDaemons; Windows uses boot-triggered tasks, not SCM services or login tasks.
92
+ 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).
93
+ 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.
94
+ `,
95
+ "guard.bunUnsupported": `Rovloom requires Bun {minimum} or newer (https://bun.sh); this runtime is not supported.
96
+ `,
97
+ "run.wildcardListenWarning": `wildcard_listener
98
+ MCP/management listen on all interfaces over plain HTTP; protect them with a firewall or a TLS reverse proxy.
99
+ `,
100
+ "run.pairingRequiredHint": `Gateway is running; complete local pairing and native setup before using an Agent.
101
+ `,
102
+ "run.configurationRequiredHint": `Setup requires a local terminal, a reachable Gateway, completed pairing and a compatible installed Luvus. Preserve uncertain setup state for owner review.
103
+ `,
104
+ "setup.gatewayAddressPrompt": "Gateway address (ws://host:port or wss://host): ",
105
+ "setup.connector.pairingCodePrompt": "One-time pairing code: ",
106
+ "setup.connector.trustGateway": "Trust this Gateway address for one-time device enrollment and reviewed native setup?",
107
+ "setup.connector.pairingCompleted": `pairing_completed: Device identity is durably paired; discovering the selected native installation next.
108
+ `,
109
+ "setup.connector.nativeSetupResponseUnavailable": `Native setup response unavailable; retain the original setup and rerun Connector to check it.
110
+ `,
111
+ "setup.connector.nativeStatePrepared": `Native state prepared; starting the real Connector. Watch Gateway for connector_ready.
112
+ `,
113
+ "setup.native.managedUnsupportedWindows": `{provider}_managed_unsupported_on_windows: set native.{configKey}.mode to "attach".
114
+ `,
115
+ "setup.native.managedUnsupportedMacos": `{provider}_managed_unsupported_on_macos: set native.{configKey}.mode to "attach".
116
+ `,
117
+ "setup.native.statePathTooLongLuvus": `native_state_path_too_long: choose a shorter data.directory before initialization (Luvus state path maximum 52 UTF-8 bytes).
118
+ `,
119
+ "setup.native.statePathTooLongHerdr": `native_state_path_too_long: choose a shorter data.directory for the private Herdr sockets (herdr.sock and herdr-client.sock).
120
+ `,
121
+ "setup.prompt.connectorNativeAttachEnabled": "Attach to your running {kind} session (or start one in your own config directory if none is running); remote callers will act on your REAL workspaces (terminal execution ENABLED in user config)?",
122
+ "setup.prompt.connectorNativeAttachDisabled": "Attach to your running {kind} session (or start one in your own config directory if none is running); remote callers will act on your REAL workspaces (terminal execution disabled)?",
123
+ "setup.prompt.connectorNativeIsolatedEnabled": "Discover {kind} and create isolated state (terminal execution ENABLED in user config)?",
124
+ "setup.prompt.connectorNativeIsolatedDisabled": "Discover this {kind} installation and create its isolated local state (terminal execution disabled)?",
125
+ "setup.prompt.gatewayNative": "Allow this paired device's measured Luvus ({version}, binary SHA-256 {sha}) for reviewed workspace/Agent operations and one local MCP caller? Terminal execution is controlled by the Connector machine owner's local configuration.",
126
+ "setup.prompt.gatewayNativeInstallations": "Allow this paired device's measured native installations ({entries}) for reviewed workspace/Agent operations and one local MCP caller? Terminal execution is controlled by the Connector machine owner's local configuration.",
127
+ "setup.repair.alreadyPaired": `This Connector is paired as {machine}. Re-pairing replaces only its Gateway credential; native setup is kept. Stop any other running Connector for this device first.
128
+ `,
129
+ "setup.repair.codePrompt": "One-time re-pairing code from rovloom gateway --repair-device: ",
130
+ "setup.repair.trustConfirm": "Trust this Gateway address and replace this device credential with a new one?",
131
+ "setup.repair.confirmationUnavailable": `Gateway confirmation unavailable; if this Connector cannot authenticate, run the re-pairing again.
132
+ `,
133
+ "setup.repair.deviceRepaired": `device_repaired: The device credential is replaced; starting the Connector.
134
+ `,
135
+ "setup.gateway.resumeRePairing": `Resuming the device re-pairing; waiting for the Connector to reconnect.
136
+ `,
137
+ "setup.gateway.repairCodeBlock": `Gateway MCP: {mcpUrl}
138
+ Connector endpoint: {endpoint}
139
+ One-time re-pairing code for the existing device (5 minutes; keep private):
140
+ {code}
141
+ Stop that Connector, then run rovloom connector --repair on its machine and enter the code. The old credential no longer works.
142
+ `,
143
+ "setup.gateway.endpoints": `Gateway MCP: {mcpUrl}
144
+ Connector endpoint: {endpoint}
145
+ `,
146
+ "setup.gateway.unpairedRunning": `Gateway stays unpaired and running; no enrollment or credential is issued.
147
+ `,
148
+ "setup.gateway.managementFirstPairing": "Finish first pairing from the management page: create the administrator with `rovloom admin create`, sign in at {page}, create a pairing application, then run `rovloom connector --claim` on the device.\n",
149
+ "setup.gateway.managementDisabled": `Management is disabled; enable it or rerun to pair from this terminal.
150
+ `,
151
+ "setup.gateway.pairingCodeBlock": `One-time pairing code (5 minutes; keep private):
152
+ {code}
153
+ Run rovloom connector in another local terminal and enter the Gateway address and code.
154
+ `,
155
+ "setup.gateway.resumingExisting": `Resuming the existing setup; no new enrollment or credential is issued.
156
+ `,
157
+ "setup.gateway.connectorReady": `connector_ready: The Connector passed real authentication and every selected native provider is ready.
158
+ `,
159
+ "setup.gateway.adminBlock": `
160
+ Management page: {page}
161
+ Management user: admin
162
+ Management password (private): {secret}
163
+ (Shown once; run rovloom admin create to re-issue.)`,
164
+ "setup.gateway.adminNotCreated": `
165
+ Management administrator was not created; run rovloom admin create.`,
166
+ "setup.gateway.nativeSaved": `Native configuration saved; Gateway will reopen its real providers.
167
+ MCP credential file: {clientPath}
168
+ MCP URL: {url}
169
+ Targets: {targets}
170
+ Binding revision: 1`,
171
+ "setup.gateway.bearerAdditional": `
172
+ Existing MCP Bearer now also covers this device (not shown again; tokens made with rovloom token create --like need re-creating).`,
173
+ "setup.gateway.bearerSecret": `
174
+ Bearer (private): {token}`,
175
+ "setup.approval.resumeConfirm": "Resume the existing device setup?",
176
+ "setup.approval.pairConfirm": "Pair one Connector with this Gateway?",
177
+ "setup.approval.repairDeviceConfirm": "Re-pair the existing Connector device {name} ({machine})? The credential it holds stops working now and in-flight calls become unknown.",
178
+ "setup.claim.pairingCompletedActivated": `pairing_completed: Device identity is durably paired and native activation is complete.
179
+ `,
180
+ "setup.claim.waitEnded": `Approval wait ended; rerun the same command to resume this claim.
181
+ `,
182
+ "setup.claim.restartConfirm": "Start a new claim with a new pairing application?",
183
+ "setup.claim.pairingIdPrompt": "Pairing application ID: ",
184
+ "setup.claim.trustConfirm": "Trust this Gateway address for online device enrollment?",
185
+ "setup.claim.claimCodeBlock": `Claim code: {code}
186
+ Approve this exact code for machine {machine} in the management page.
187
+ `,
188
+ "setup.claim.activationResponseUnavailable": `Native activation response unavailable; rerun the same command to check the original claim.
189
+ `,
190
+ "setup.claim.nativeStatePrepared": `Native state prepared; starting the real Connector.
191
+ `,
192
+ "admin.create.login": `login at {url} with user "{user}" and the password below (shown once)
193
+ `,
194
+ "admin.create.created": `created administrator {principal} expires {expires}
195
+ `,
196
+ "admin.revoked": `revoked administrator {principal}
197
+ `,
198
+ "token.created": `created {principal} expires {expires}
199
+ `,
200
+ "token.renewed": `renewed {principal} expires {expires}
201
+ `,
202
+ "token.rotated": `rotated {principal} expires {expires}
203
+ `,
204
+ "token.permissions": `permissions {principal} discard_response={discard}
205
+ `,
206
+ "token.revoked": `revoked {principal}
207
+ `,
208
+ "mcp.instructions": "Tool availability does not imply a ready backend; execution, authorization, confirmation, deduplication and result retention are owned by the trusted service.",
209
+ "mcp.tool.machines_list": "List the devices visible to the current caller; paging and counts must pass the current ACL.",
210
+ "mcp.tool.machines_get": "Read a visible device by stable ID or exact name.",
211
+ "mcp.tool.providers_list": "List the configured providers visible to the current caller under a device; local machine configuration is not returned.",
212
+ "mcp.tool.providers_get": "Read the kind, revision and readiness of an explicit provider.",
213
+ "mcp.tool.runtime_discover": "Discover the effective capabilities and sources of an explicit Target/revision; grants no execution permission.",
214
+ "mcp.tool.runtime_describe": "Describe the exact methods\u2019 native parameters, categories and limits under an explicit Target/revision.",
215
+ "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.",
216
+ "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.",
217
+ "mcp.tool.runtime_call_cancel": "Request stopping a wait or bridge; reports only what the service can confirm and promises no native rollback.",
218
+ "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.",
219
+ "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."
220
+ });
221
+ var chinese = Object.freeze({
222
+ "help.main": `Rovloom {version}
223
+
224
+ \u7528\u6CD5\uFF1A
225
+ rovloom --help
226
+ rovloom --version
227
+ rovloom config template gateway|connector
228
+ rovloom config init connector [--provider luvus|herdr|mixed] [--config /absolute/path/config.json]
229
+ rovloom config init gateway [--container] [--config /absolute/path/config.json]
230
+ rovloom config check [--role gateway|connector] [--config /absolute/path/config.json]
231
+ rovloom config check-runtime [--role gateway|connector] [--config /absolute/path/config.json]
232
+ rovloom gateway [--add-device | --repair-device] [--config /absolute/path/config.json] [--non-interactive]
233
+ rovloom connector [--repair | --claim] [--config /absolute/path/config.json] [--non-interactive]
234
+ rovloom service --help
235
+ rovloom token --help
236
+ rovloom doctor --help
237
+ rovloom storage --help
238
+ rovloom admin --help
239
+
240
+ gateway / connector \u542F\u52A8\u5BF9\u5E94\u89D2\u8272\u3002\u9996\u6B21\u8FD0\u884C\u65F6\u5728\u771F\u5B9E\u672C\u5730\u7EC8\u7AEF\u5B8C\u6210\u4E00\u6B21\u6027\u914D\u5BF9\u4E0E\u539F\u751F\u5B89\u88C5\u6279\u51C6\uFF1B
241
+ \u5728\u7EC8\u7AEF\u62D2\u7EDD\u914D\u5BF9\u63D0\u793A\u65F6\uFF0CGateway \u4FDD\u6301\u672A\u914D\u5BF9\u8FD0\u884C\uFF0C\u53EF\u5148\u8FD0\u884C rovloom admin create \u518D\u4ECE\u7BA1\u7406\u9875\u5B8C\u6210\u9996\u53F0\u914D\u5BF9\uFF1B
242
+ --add-device \u5728\u5DF2\u5B8C\u6210\u7684\u5F15\u5BFC\u4E4B\u4E0A\u518D\u914D\u5BF9\u4E00\u53F0 Connector\uFF08\u6CBF\u7528\u540C\u4E00 MCP \u51ED\u636E\uFF0C\u6388\u6743\u968F\u4E4B\u6269\u5927\u5230\u65B0\u8BBE\u5907\uFF09\uFF1B
243
+ --repair-device / --repair \u91CD\u65B0\u914D\u5BF9\u5DF2\u914D\u5BF9\u7684\u540C\u4E00\u8BBE\u5907\uFF08\u51ED\u636E\u4E22\u5931\u6216\u6CC4\u6F0F\uFF09\uFF0C\u4FDD\u7559\u539F\u751F\u8BBE\u7F6E\u4E0E MCP \u6388\u6743\u3002
244
+ --claim \u8BA9\u672A\u914D\u5BF9\u7684 Connector \u5411\u8FD0\u884C\u4E2D\u7684 Gateway \u5728\u7EBF\u8BA4\u9886\u7BA1\u7406\u5458\u521B\u5EFA\u7684\u914D\u5BF9\u7533\u8BF7\uFF08\u7BA1\u7406\u9875\u6838\u5BF9\u7801\u6279\u51C6\uFF0CGateway \u4E0D\u505C\u673A\uFF09\u3002
245
+ \u8FD9\u56DB\u4E2A\u9009\u9879\u9700\u8981\u771F\u5B9E\u672C\u5730\u7EC8\u7AEF\uFF0C\u4E0D\u53EF\u4E0E --non-interactive \u5408\u7528\u3002--non-interactive \u5173\u95ED\u672C\u5730\u4EA4\u4E92\u5F15\u5BFC\uFF08\u670D\u52A1\u4EE5\u6B64\u8FD0\u884C\uFF09\u3002
246
+ 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
247
+ 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
248
+
249
+ \u7701\u7565 --config \u65F6\u8BFB\u53D6 ~/.config/rovloom/gateway.json \u6216 connector.json\uFF08Windows \u540C\u6837\u4F7F\u7528\u7528\u6237 home\uFF09\u3002
250
+ \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
251
+ 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
252
+ \u9996\u6B21\u5F15\u5BFC\u6309 Connector \u7684 native.provider \u9009\u62E9 luvus\uFF08\u9ED8\u8BA4\uFF09\u3001herdr \u6216 mixed\u3002
253
+ Agent \u4E0E\u6A21\u578B\u767B\u5F55\u9700\u72EC\u7ACB\u51C6\u5907\uFF1B\u539F\u751F ready \u4E0D\u4EE3\u8868\u6A21\u578B\u5DF2\u56DE\u590D\u3002
254
+ \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
255
+ `,
256
+ "help.admin": `\u7528\u6CD5\uFF1A
257
+ rovloom admin list [--config /absolute/path/gateway.json]
258
+ rovloom admin create [--principal ID] [--ttl-days N] [--config /absolute/path/gateway.json]
259
+ rovloom admin revoke [--principal ID] [--config /absolute/path/gateway.json]
260
+
261
+ \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
262
+ \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
263
+ \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
264
+ \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
265
+ \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
266
+ \u5728\u7EBF\u914D\u5BF9\u9996\u53F0 Connector\uFF08\u65B0\u5EFA\u7533\u8BF7\uFF0C\u8BBE\u5907\u8FD0\u884C rovloom connector --claim\uFF09\u3002
267
+ `,
268
+ "help.token": `\u7528\u6CD5\uFF1A
269
+ rovloom token list [--config /absolute/path/gateway.json]
270
+ rovloom token create --principal ID --like EXISTING_ID [--ttl-days N]
271
+ rovloom token renew --principal ID [--ttl-days N]
272
+ rovloom token rotate --principal ID [--ttl-days N] [--grace-minutes M]
273
+ rovloom token revoke --principal ID
274
+ rovloom token permissions --principal ID --discard-response true|false
275
+
276
+ \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
277
+ 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
278
+ 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
279
+ 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
280
+ 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
281
+ ttl \u9ED8\u8BA4 30 \u5929\uFF081-365\uFF09\u3002
282
+ `,
283
+ "help.storage": `\u7528\u6CD5\uFF1A
284
+ rovloom doctor --role gateway|connector [--config /absolute/config.json] [--json]
285
+ rovloom storage check --role gateway [--config /absolute/config.json] [--json]
286
+ rovloom storage backup --role gateway --output /path/to/gateway.backups/snapshot.db [--config /absolute/config.json] [--json]
287
+ rovloom storage resume --role gateway [--config /absolute/config.json] [--json]
288
+
289
+ 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
290
+ 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
291
+ 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
292
+ 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
293
+ `,
294
+ "help.service": `service install --role gateway|connector [--executable ABS] [--config ABS] --workdir ABS --user ACCOUNT
295
+ service uninstall|start|restart|stop --role gateway|connector
296
+ 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
297
+ \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
298
+ \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
299
+ 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
300
+ 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
301
+ 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
302
+ `,
303
+ "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
304
+ `,
305
+ "run.wildcardListenWarning": `wildcard_listener
306
+ 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
307
+ `,
308
+ "run.pairingRequiredHint": `Gateway \u5DF2\u542F\u52A8\uFF1B\u4F7F\u7528 Agent \u524D\u4ECD\u9700\u5B8C\u6210\u672C\u5730\u914D\u5BF9\u548C\u539F\u751F\u521D\u59CB\u5316\u3002
309
+ `,
310
+ "run.configurationRequiredHint": `\u521D\u59CB\u5316\u9700\u672C\u5730\u7EC8\u7AEF\u3001\u53EF\u8FBE Gateway\u3001\u5B8C\u6574\u914D\u5BF9\u53CA\u517C\u5BB9 Luvus \u5B89\u88C5\uFF1B\u7ED3\u679C\u4E0D\u786E\u5B9A\u65F6\u4FDD\u7559\u539F\u72B6\u6001\u5E76\u7531\u6240\u6709\u8005\u6838\u67E5\u3002
311
+ `,
312
+ "setup.gatewayAddressPrompt": "Gateway \u5730\u5740: ",
313
+ "setup.connector.pairingCodePrompt": "\u4E00\u6B21\u6027\u914D\u5BF9\u7801: ",
314
+ "setup.connector.trustGateway": "\u4FE1\u4EFB\u6B64 Gateway \u5730\u5740\u5E76\u5151\u6362\u4E00\u6B21\u6027\u8BBE\u5907\u914D\u5BF9\uFF1F",
315
+ "setup.connector.pairingCompleted": `pairing_completed: \u8BBE\u5907\u8EAB\u4EFD\u5DF2\u6301\u4E45\u914D\u5BF9\uFF1B\u63A5\u4E0B\u6765\u53D1\u73B0\u6240\u9009\u539F\u751F\u5B89\u88C5\u3002
316
+ `,
317
+ "setup.connector.nativeSetupResponseUnavailable": `\u539F\u751F\u8BBE\u7F6E\u54CD\u5E94\u4E0D\u53EF\u7528\uFF1B\u4FDD\u7559\u539F\u72B6\u6001\uFF0C\u91CD\u65B0\u8FD0\u884C Connector \u6838\u5BF9\u3002
318
+ `,
319
+ "setup.connector.nativeStatePrepared": `\u539F\u751F\u72B6\u6001\u5DF2\u51C6\u5907\uFF1B\u542F\u52A8\u6B63\u5F0F Connector\uFF0C\u4EE5 Gateway \u7684\u5B9E\u9645\u5C31\u7EEA\u63D0\u793A\u4E3A\u51C6\u3002
320
+ `,
321
+ "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
322
+ `,
323
+ "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
324
+ `,
325
+ "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
326
+ `,
327
+ "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
328
+ `,
329
+ "setup.prompt.connectorNativeAttachEnabled": "\u9644\u7740\u5230\u4F60\u6B63\u5728\u8FD0\u884C\u7684 {kind} \u4F1A\u8BDD\uFF08\u6CA1\u6709\u5219\u5728\u4F60\u81EA\u5DF1\u7684\u914D\u7F6E\u76EE\u5F55\u91CC\u542F\u52A8\u4E00\u4E2A\uFF09\uFF0C\u8FDC\u7A0B\u8C03\u7528\u5C06\u76F4\u63A5\u64CD\u4F5C\u4F60\u7684\u771F\u5B9E\u5DE5\u4F5C\u533A\uFF08\u7528\u6237\u914D\u7F6E\u5DF2\u5F00\u542F\u7EC8\u7AEF\u6267\u884C\uFF09\uFF1F",
330
+ "setup.prompt.connectorNativeAttachDisabled": "\u9644\u7740\u5230\u4F60\u6B63\u5728\u8FD0\u884C\u7684 {kind} \u4F1A\u8BDD\uFF08\u6CA1\u6709\u5219\u5728\u4F60\u81EA\u5DF1\u7684\u914D\u7F6E\u76EE\u5F55\u91CC\u542F\u52A8\u4E00\u4E2A\uFF09\uFF0C\u8FDC\u7A0B\u8C03\u7528\u5C06\u76F4\u63A5\u64CD\u4F5C\u4F60\u7684\u771F\u5B9E\u5DE5\u4F5C\u533A\uFF08\u5173\u95ED\u7EC8\u7AEF\u6267\u884C\uFF09\uFF1F",
331
+ "setup.prompt.connectorNativeIsolatedEnabled": "\u53D1\u73B0 {kind} \u5E76\u521B\u5EFA\u9694\u79BB\u72B6\u6001\uFF08\u7528\u6237\u914D\u7F6E\u5DF2\u5F00\u542F\u7EC8\u7AEF\u6267\u884C\uFF09\uFF1F",
332
+ "setup.prompt.connectorNativeIsolatedDisabled": "\u53D1\u73B0 {kind} \u5E76\u521B\u5EFA\u9694\u79BB\u72B6\u6001\uFF08\u5173\u95ED\u7EC8\u7AEF\u6267\u884C\uFF09\uFF1F",
333
+ "setup.prompt.gatewayNative": "\u6279\u51C6\u8FD9\u53F0\u8BBE\u5907\u7684\u5B9E\u6D4B Luvus\uFF08\u7248\u672C {version}\uFF0C\u4E8C\u8FDB\u5236 SHA-256 {sha}\uFF09\u3001\u666E\u901A\u7A97\u53E3/Agent \u64CD\u4F5C\u53CA\u4E00\u4E2A\u672C\u673A MCP caller\uFF08\u7EC8\u7AEF\u6267\u884C\u7531 Connector \u672C\u673A\u6240\u6709\u8005\u914D\u7F6E\u51B3\u5B9A\uFF09\uFF1F",
334
+ "setup.prompt.gatewayNativeInstallations": "\u6279\u51C6\u8FD9\u4E9B\u5B9E\u6D4B\u539F\u751F\u6765\u6E90\uFF08{entries}\uFF09\u3001\u5404\u81EA\u7A97\u53E3/Agent \u64CD\u4F5C\u53CA\u4E00\u4E2A\u672C\u673A MCP caller\uFF08\u7EC8\u7AEF\u6267\u884C\u7531 Connector \u672C\u673A\u6240\u6709\u8005\u914D\u7F6E\u51B3\u5B9A\uFF09\uFF1F",
335
+ "setup.repair.alreadyPaired": `\u6B64 Connector \u5DF2\u914D\u5BF9\u4E3A {machine}\u3002\u91CD\u65B0\u914D\u5BF9\u53EA\u66F4\u6362\u4E0E Gateway \u7684\u51ED\u636E\uFF0C\u4FDD\u7559\u539F\u751F\u8BBE\u7F6E\uFF1B\u8BF7\u5148\u505C\u6B62\u8BE5\u8BBE\u5907\u4E0A\u5176\u5B83\u6B63\u5728\u8FD0\u884C\u7684 Connector\u3002
336
+ `,
337
+ "setup.repair.codePrompt": "\u6765\u81EA rovloom gateway --repair-device \u7684\u4E00\u6B21\u6027\u7801: ",
338
+ "setup.repair.trustConfirm": "\u4FE1\u4EFB\u6B64 Gateway \u5730\u5740\u5E76\u7528\u65B0\u51ED\u636E\u66FF\u6362\u672C\u673A\u8BBE\u5907\u51ED\u636E\uFF1F",
339
+ "setup.repair.confirmationUnavailable": `\u672A\u6536\u5230 Gateway \u7684\u786E\u8BA4\uFF1B\u82E5 Connector \u4E4B\u540E\u65E0\u6CD5\u8BA4\u8BC1\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u91CD\u65B0\u914D\u5BF9\u3002
340
+ `,
341
+ "setup.repair.deviceRepaired": `device_repaired: \u8BBE\u5907\u51ED\u636E\u5DF2\u66F4\u6362\uFF1B\u6B63\u5728\u542F\u52A8 Connector\u3002
342
+ `,
343
+ "setup.gateway.resumeRePairing": `\u7EE7\u7EED\u539F\u91CD\u65B0\u914D\u5BF9\uFF0C\u7B49\u5F85 Connector \u91CD\u8FDE\u3002
344
+ `,
345
+ "setup.gateway.repairCodeBlock": `Gateway MCP: {mcpUrl}
346
+ Connector endpoint: {endpoint}
347
+ \u5DF2\u6709\u8BBE\u5907\u7684\u4E00\u6B21\u6027\u91CD\u65B0\u914D\u5BF9\u7801\uFF085\u5206\u949F\uFF0C\u8BF7\u4FDD\u5BC6\uFF09:
348
+ {code}
349
+ \u5728\u8BE5\u8BBE\u5907\u4E0A\u505C\u6B62 Connector\uFF0C\u8FD0\u884C rovloom connector --repair \u5E76\u8F93\u5165\u6B64\u7801\uFF1B\u65E7\u51ED\u636E\u5DF2\u5931\u6548\u3002
350
+ `,
351
+ "setup.gateway.endpoints": `Gateway MCP: {mcpUrl}
352
+ Connector endpoint: {endpoint}
353
+ `,
354
+ "setup.gateway.unpairedRunning": `Gateway \u4FDD\u6301\u672A\u914D\u5BF9\u5E76\u7EE7\u7EED\u8FD0\u884C\uFF0C\u4E0D\u7B7E\u53D1\u51ED\u636E\u3002
355
+ `,
356
+ "setup.gateway.managementFirstPairing": "\u5728\u7BA1\u7406\u9875\u5B8C\u6210\u9996\u6B21\u914D\u5BF9\uFF1A\u5148\u7528 `rovloom admin create` \u521B\u5EFA\u7BA1\u7406\u5458\uFF0C\u767B\u5F55 {page} \u65B0\u5EFA\u914D\u5BF9\u7533\u8BF7\uFF0C\u518D\u5728\u8BBE\u5907\u4E0A\u8FD0\u884C `rovloom connector --claim`\u3002\n",
357
+ "setup.gateway.managementDisabled": `\u7BA1\u7406\u9875\u672A\u542F\u7528\uFF1B\u8BF7\u542F\u7528\u540E\u91CD\u8BD5\u6216\u5728\u672C\u7EC8\u7AEF\u5B8C\u6210\u914D\u5BF9\u3002
358
+ `,
359
+ "setup.gateway.pairingCodeBlock": `\u4E00\u6B21\u6027\u914D\u5BF9\u7801\uFF085\u5206\u949F\uFF0C\u8BF7\u4FDD\u5BC6\uFF09:
360
+ {code}
361
+ \u5728 Connector \u7684\u672C\u5730\u7EC8\u7AEF\u8F93\u5165 Gateway \u5730\u5740\u4E0E\u8BE5\u7801\uFF1B\u968F\u540E\u56DE\u5230\u6B64\u7EC8\u7AEF\u6279\u51C6\u5B9E\u6D4B\u5B89\u88C5\u3002
362
+ `,
363
+ "setup.gateway.resumingExisting": `\u7EE7\u7EED\u539F\u8BBE\u7F6E\uFF0C\u4E0D\u91CD\u65B0\u7B7E\u53D1\u3002
364
+ `,
365
+ "setup.gateway.connectorReady": `connector_ready: Connector \u5DF2\u901A\u8FC7\u771F\u5B9E\u8BA4\u8BC1\u4E14\u5168\u90E8\u6240\u9009\u539F\u751F provider \u5C31\u7EEA\u3002
366
+ `,
367
+ "setup.gateway.adminBlock": `
368
+ \u7BA1\u7406\u9875: {page}
369
+ \u7BA1\u7406\u5458: admin
370
+ \u7BA1\u7406\u5458\u5BC6\u7801: {secret}
371
+ (\u53EA\u663E\u793A\u4E00\u6B21\uFF1B\u4E22\u5931\u540E\u8FD0\u884C rovloom admin create \u91CD\u65B0\u7B7E\u53D1\u3002)`,
372
+ "setup.gateway.adminNotCreated": `
373
+ \u672A\u80FD\u521B\u5EFA\u7BA1\u7406\u9875\u7BA1\u7406\u5458\uFF0C\u8BF7\u7A0D\u540E\u8FD0\u884C rovloom admin create\u3002`,
374
+ "setup.gateway.nativeSaved": `\u539F\u751F\u914D\u7F6E\u5DF2\u4FDD\u5B58\uFF0CGateway \u5C06\u91CD\u5F00\u5B9E\u9645 provider\u3002
375
+ MCP \u51ED\u636E\u6587\u4EF6: {clientPath}
376
+ MCP URL: {url}
377
+ Targets: {targets}
378
+ Binding revision: 1`,
379
+ "setup.gateway.bearerAdditional": `
380
+ \u73B0\u6709 MCP Bearer \u5DF2\u8986\u76D6\u6B64\u8BBE\u5907\uFF08\u4E0D\u518D\u663E\u793A\uFF1B\u7528 token create --like \u514B\u9686\u7684\u4EE4\u724C\u9700\u8981\u91CD\u65B0\u514B\u9686\uFF09\u3002`,
381
+ "setup.gateway.bearerSecret": `
382
+ Bearer (private): {token}`,
383
+ "setup.approval.resumeConfirm": "\u7EE7\u7EED\u539F\u8BBE\u5907\u8BBE\u7F6E\uFF1F",
384
+ "setup.approval.pairConfirm": "\u5141\u8BB8\u914D\u5BF9\u4E00\u4E2A Connector\uFF1F",
385
+ "setup.approval.repairDeviceConfirm": "\u91CD\u65B0\u914D\u5BF9\u5DF2\u6709\u8BBE\u5907 {name}\uFF08{machine}\uFF09\uFF1F\u8BE5\u8BBE\u5907\u5F53\u524D\u51ED\u636E\u7ACB\u5373\u5931\u6548\uFF0C\u8FDB\u884C\u4E2D\u7684\u8C03\u7528\u7ED3\u679C\u53D8\u4E3A\u672A\u77E5\u3002",
386
+ "setup.claim.pairingCompletedActivated": `pairing_completed: \u8BBE\u5907\u8EAB\u4EFD\u5DF2\u6301\u4E45\u914D\u5BF9\uFF0C\u539F\u751F\u6FC0\u6D3B\u5DF2\u5B8C\u6210\u3002
387
+ `,
388
+ "setup.claim.waitEnded": `\u7B49\u5F85\u6279\u51C6\u5DF2\u7ED3\u675F\uFF1B\u91CD\u65B0\u8FD0\u884C\u540C\u4E00\u547D\u4EE4\u53EF\u7EE7\u7EED\u539F\u8BA4\u9886\u3002
389
+ `,
390
+ "setup.claim.restartConfirm": "\u539F\u8BA4\u9886\u5DF2\u7EC8\u6B62\u6216\u8FC7\u671F\uFF0C\u662F\u5426\u4F7F\u7528\u65B0\u7684\u914D\u5BF9\u7533\u8BF7\u91CD\u65B0\u8BA4\u9886\uFF1F",
391
+ "setup.claim.pairingIdPrompt": "\u914D\u5BF9\u7533\u8BF7 ID: ",
392
+ "setup.claim.trustConfirm": "\u4FE1\u4EFB\u6B64 Gateway \u5730\u5740\u5E76\u5728\u7EBF\u8BA4\u9886\u8BBE\u5907\u914D\u5BF9\uFF1F",
393
+ "setup.claim.claimCodeBlock": `\u6838\u5BF9\u7801: {code}
394
+ \u8BF7\u5728\u7BA1\u7406\u9875\u4E3A\u8BBE\u5907 {machine} \u6838\u5BF9\u5E76\u6279\u51C6\u6B64\u7801\u3002
395
+ `,
396
+ "setup.claim.activationResponseUnavailable": `\u539F\u751F\u6FC0\u6D3B\u54CD\u5E94\u4E0D\u53EF\u7528\uFF1B\u91CD\u65B0\u8FD0\u884C\u540C\u4E00\u547D\u4EE4\u6309\u539F\u8BA4\u9886\u6838\u5BF9\u3002
397
+ `,
398
+ "setup.claim.nativeStatePrepared": `\u539F\u751F\u72B6\u6001\u5DF2\u51C6\u5907\uFF1B\u542F\u52A8\u6B63\u5F0F Connector\u3002
399
+ `,
400
+ "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
401
+ `,
402
+ "admin.create.created": `\u5DF2\u521B\u5EFA\u7BA1\u7406\u5458 {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
403
+ `,
404
+ "admin.revoked": `\u5DF2\u64A4\u9500\u7BA1\u7406\u5458 {principal}
405
+ `,
406
+ "token.created": `\u5DF2\u521B\u5EFA {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
407
+ `,
408
+ "token.renewed": `\u5DF2\u7EED\u671F {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
409
+ `,
410
+ "token.rotated": `\u5DF2\u8F6E\u6362 {principal}\uFF0C\u5230\u671F\u65F6\u95F4 {expires}
411
+ `,
412
+ "token.permissions": `\u5DF2\u8BBE\u7F6E {principal} \u7684\u6743\u9650 discard_response={discard}
413
+ `,
414
+ "token.revoked": `\u5DF2\u64A4\u9500 {principal}
415
+ `,
416
+ "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",
417
+ "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",
418
+ "mcp.tool.machines_get": "\u6309\u7A33\u5B9A ID \u6216\u7CBE\u786E\u540D\u79F0\u8BFB\u53D6\u53EF\u89C1\u8BBE\u5907\u3002",
419
+ "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",
420
+ "mcp.tool.providers_get": "\u8BFB\u53D6\u663E\u5F0F provider \u7684 kind\u3001revision \u548C readiness\u3002",
421
+ "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",
422
+ "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",
423
+ "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",
424
+ "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",
425
+ "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",
426
+ "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",
427
+ "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"
428
+ });
429
+ function cliMessages2(language = "en") {
430
+ return language === "zh-CN" ? chinese : english;
431
+ }
432
+ function formatMessage2(template, values) {
433
+ return template.replace(/\{(\w+)\}/gu, (match, name) => Object.hasOwn(values, name) ? String(values[name]) : match);
434
+ }
435
+
436
+ export { resolveCliLanguage2, cliMessages2, formatMessage2 };
437
+
438
+ //# debugId=8069F52A271C482D64756E2164756E21
@@ -41,7 +41,13 @@ function defaults(role, environment, initialization) {
41
41
  return { ...config, native: { ...config.native, provider: initialization.provider } };
42
42
  }
43
43
  if (config.role === "gateway" && initialization.container) {
44
- return { ...config, mcp_hostname: "0.0.0.0", device_hostname: "0.0.0.0", management_hostname: "0.0.0.0" };
44
+ return {
45
+ ...config,
46
+ mcp_hostname: "0.0.0.0",
47
+ device_hostname: "0.0.0.0",
48
+ management_hostname: "0.0.0.0",
49
+ management_lan: true
50
+ };
45
51
  }
46
52
  return config;
47
53
  }
@@ -98,4 +104,4 @@ function readOrCreateRoleConfig(role, path, environment, initialization = {}) {
98
104
 
99
105
  export { privateDirectory, readOrCreateRoleConfig };
100
106
 
101
- //# debugId=98F38BF75586543964756E2164756E21
107
+ //# debugId=2B2959D62D3C434064756E2164756E21
@@ -3,6 +3,9 @@ import {
3
3
  canonical2,
4
4
  digest2
5
5
  } from "./chunk-d71r315c.js";
6
+ import {
7
+ cliMessages2
8
+ } from "./chunk-5b8g62kw.js";
6
9
  import {
7
10
  MAX_MCP_BYTES2,
8
11
  TOOLS_PAGE_SIZE,
@@ -13,13 +16,13 @@ import {
13
16
  SERVICE_ERROR_CODES,
14
17
  FacadeServiceError2,
15
18
  NativeRequestNotDispatchedError
16
- } from "./chunk-smpevv7n.js";
19
+ } from "./chunk-0dqx2mmz.js";
17
20
  import {
18
21
  parseNativeJson2
19
22
  } from "./chunk-7crhmqn2.js";
20
23
  import {
21
24
  PRODUCT_VERSION2
22
- } from "./chunk-r0nfthsf.js";
25
+ } from "./chunk-s3ydr65k.js";
23
26
  import {
24
27
  canonicalLoopbackHost
25
28
  } from "./chunk-6n9s7nfe.js";
@@ -109,9 +112,10 @@ function toolOffset(cursor) {
109
112
  return offset;
110
113
  }
111
114
  function createMcpFacade2(options) {
115
+ const language = options.language ?? "en";
112
116
  const server = new Server({ name: "rovloom", version: PRODUCT_VERSION2 }, {
113
117
  capabilities: { tools: {} },
114
- 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"
118
+ instructions: cliMessages2(language)["mcp.instructions"]
115
119
  });
116
120
  let initialized = false;
117
121
  let inflight = 0;
@@ -140,7 +144,7 @@ function createMcpFacade2(options) {
140
144
  const names = toolNames2();
141
145
  const next = offset + TOOLS_PAGE_SIZE;
142
146
  return {
143
- tools: names.slice(offset, next).map(toolDefinition2),
147
+ tools: names.slice(offset, next).map((name) => toolDefinition2(name, language)),
144
148
  ...next < names.length ? { nextCursor: Buffer.from(`rovloom-tools-v1:${next}`).toString("base64url") } : {}
145
149
  };
146
150
  });
@@ -504,6 +508,7 @@ function createHttpFacade2(options) {
504
508
  const server = createMcpFacade2({
505
509
  service: options.service,
506
510
  diagnostic: options.diagnostic,
511
+ ...options.language ? { language: options.language } : {},
507
512
  context: {
508
513
  resolve: (signal) => {
509
514
  const context = scope.getStore();
@@ -764,4 +769,4 @@ function startHttpFacade2(options) {
764
769
 
765
770
  export { createMcpFacade2, HTTP_BODY_BYTES2, createHttpFacade2, startHttpFacade2 };
766
771
 
767
- //# debugId=7CD2FDC41059ADFA64756E2164756E21
772
+ //# debugId=69C1DCB6911C499664756E2164756E21