@tunnelbox/core 0.1.18 → 0.1.20

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.
@@ -1,166 +1,277 @@
1
- {
2
- "agent.err.createSession": "Failed to create session",
3
- "agent.err.httpClient": "Cannot access the opencode HTTP client",
4
- "agent.err.unknownPerm": "Unknown permission request: {id}",
5
- "agent.err.unknownQuestion": "Unknown question request: {id}",
6
- "agent.log.fallback404": "Preferred endpoint returned 404, falling back to the other one: {message}",
7
- "agent.log.gotPermReply": "Received permission reply from phone (id={id} {reply} {version})",
8
- "agent.log.gotQuestionReply": "Received question reply from phone (id={id} {status} {version})",
9
- "agent.log.handleFailed": "Failed to handle {type}: {message}",
10
- "agent.log.msgOk": "session.messages OK session={session} data={count} limited={limited} win={win} ms={ms}",
11
- "agent.log.msgFailed": "session.messages FAILED session={session} err={err} ms={ms}",
12
- "agent.log.msgLimitFallback": "limit unsupported, fell back to full session fetch (session={session})",
13
- "agent.log.httpOk": "opencode HTTP {status} {path}",
14
- "agent.log.pendingResent": "session.pending: resent {count} pending request(s) for {session}",
15
- "agent.log.unhandledType": "Unhandled message type: {type}",
16
- "events.log.fwdPermission": "Forwarded permission request to phone (id={id} tool={tool} {version})",
17
- "events.log.sessionDeleted": "Forwarded session.deleted to phone (session={session})",
18
- "events.log.permissionReplied": "opencode acked permission.replied (id={id} {response})",
19
- "events.log.questionRejected": "opencode acked question.rejected (id={id})",
20
- "events.log.questionReplied": "opencode acked question.replied (id={id})",
21
- "index.error.connectRelay": "Cannot connect to the relay; check the relay address and try again",
22
- "index.error.pairTimeout": "Timed out waiting for a pairing code (the relay did not respond)",
23
- "index.log.claimed": "Bound to your phone account. From now on the phone connects directly from My Computers; no need to scan again",
24
- "index.log.connectedRelay": "Connected to relay {url}",
25
- "index.log.loaded": "tunnelbox opencode plugin started (v{version})",
26
- "index.log.disconnected": "Disconnected from relay, reconnecting automatically…",
27
- "index.log.exit": "Exited",
28
- "index.log.pairCode": "Generated pairing code: {code}",
29
- "index.log.pairingStillClaimed": "This pairing code is for re-pairing a new phone under the same account. This computer is already linked and stays reachable from “My Computers” on your phone.",
30
- "index.log.pairingPreparing": "Connecting to the relay and generating a pairing code…",
31
- "index.log.permissionToPhone": "Permission request → phone approval (id={id} tool={tool})",
32
- "index.log.permissionTuiFallback": "App offline; permission request handled by the opencode TUI (id={id} tool={tool})",
33
- "index.log.relayError": "Relay error: {msg}",
34
- "index.log.resetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
35
- "index.log.unknown": "Unknown",
36
- "install.codeLine": "Pairing code: {code}",
37
- "install.commandInstalled": "Installed command: {path}",
38
- "install.done": "Done. Attempted to connect to the relay and output pairing info:",
39
- "install.failConnect": "(Could not connect to the relay to print pairing info — the relay may be unreachable or the Node version is too old.",
40
- "install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type “show phone pairing code” / /pair inside opencode.)",
41
- "install.hintFresh": "Note: the pairing code is single-use and valid for about 10 minutes. If you start opencode later, use the latest pairing info printed at startup or obtained via /pair.",
42
- "install.pluginInstalled": "Installed plugin: {path}",
43
- "install.qrUnavailable": "(QR rendering unavailable — use the pairing code above)",
44
- "install.qrcodeEnsure": "Installing qrcode into the opencode config directory…",
45
- "install.qrcodeFail": "qrcode installation failed (not critical — only the pairing code is shown): {err}",
46
- "install.relayError": "Relay returned an error: {msg}",
47
- "install.scanHint": "Open tunnelbox on your phone, tap “Scan to pair”, and scan the QR code above to connect:",
48
- "pair.heading": "tunnelbox phone pairing",
49
- "pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with “Scan to pair”, or enter the pairing code manually.",
50
- "pair.oneTime": "The pairing code is single-use and invalidates after it is claimed; ask to “refresh the pairing code” for a new one.",
51
- "pair.promptBody": "Please show this computer's phone pairing info: the pairing code and a QR code I can scan. Keep the QR code inside a monospaced code block and reproduce it character-for-character so my phone can scan it.",
52
- "pair.promptDescription": "Show the phone pairing code and scan-able QR code",
53
- "pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap “Scan to pair”, and scan the QR code below to connect automatically.",
54
- "perm.promptAuthorize": "opencode requests authorization",
55
- "perm.promptPatterns": "opencode requests access to: {list}",
56
- "perm.promptResource": "opencode requests access to resources: {list}",
57
- "perm.promptTool": "opencode requests to run {tool}",
58
- "qr.codeLabel": "Pairing code",
59
- "qr.fileWritten": "Pairing info written to: {path}",
60
- "qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
61
- "qr.titleNoType": "tunnelbox phone pairing",
62
- "qr.titleWithType": "tunnelbox {type} phone pairing",
63
- "qr.unavailable": "(qrcode not installed — use the pairing code above)",
64
- "claude.errBusy": "This session is still running; wait for it to finish or stop it first",
65
- "claude.errTurn": "generation error",
66
- "claude.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
67
- "claude.pairForced": "--pair: forcing a pairing code request (this run only)",
68
- "claude.pairUnclaimed": "No bound account detected; starting pairing guide:",
69
- "claude.claimedHint": "Bound to a phone account: connect directly from My Computers on the phone",
70
- "claude.errStartFailed": "Failed to start:",
71
- "claude.msgStarted": "Claude Code adapter started (Ctrl+C to quit)",
72
- "claude.warnInvalidMode": "Ignoring invalid TUNNELBOX_CLAUDE_MODE: {raw} (allowed {list})",
73
- "claude.warnInvalidThinking": "Ignoring invalid TUNNELBOX_CLAUDE_THINKING: {raw} (off|adaptive|enabled[:budget])",
74
- "claude.cmdNew": "New session",
75
- "claude.cmdHelp": "Show help",
76
- "claude.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
77
- "claude.logConnected": "Connected to relay {url}",
78
- "claude.logMsgUncaught": "Uncaught exception while handling message: {message}",
79
- "claude.reasonDisconnect": "Relay disconnected (fail-closed auto-reject)",
80
- "claude.reasonUnbind": "Account unbound (fail-closed auto-reject)",
81
- "claude.logDisconnected": "Disconnected from relay, reconnecting automatically…",
82
- "claude.logPairCode": "Generated pairing code: {code}",
83
- "claude.logUnhandledType": "Unhandled message type: {type}",
84
- "claude.logHandleFailed": "Failed to handle {type}: {message}",
85
- "claude.newSessionTitle": "New session",
86
- "claude.helpText": "Supported commands:\n- /new new session\n- /help show help",
87
- "claude.logPromptFailed": "session.prompt failed: {message}",
88
- "claude.logAbortSent": "Abort sent (session={session})",
89
- "claude.logAbortFailed": "Abort failed (session={session}): {message}",
90
- "claude.errBadWorkspaceEmpty": "Missing workspace path",
91
- "claude.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
92
- "claude.logWorkspaceSwitched": "Switched workspace: {path}",
93
- "claude.logUnknownQuestionReply": "Unmatched structured question reply (id={id})",
94
- "claude.logFlushedQuestions": "Cancelled {count} pending question(s): {reason}",
95
- "claude.logFlushedApprovals": "Rejected {count} pending request(s): {reason}",
96
- "claude.logPendingResent": "session.pending: resent {count} pending item(s) for {session}",
97
- "claude.logSetModeFailed": "setPermissionMode failed (session={session}): {message}",
98
- "claude.errWorkspaceMissing": "Workspace does not exist: {dir}",
99
- "claude.logSessionError": "Session error (session={session}): {message}",
100
- "claude.logOfflineDenyTool": "Relay offline, auto-rejecting tool {tool}",
101
- "claude.errOfflineDeny": "Relay offline, auto-rejected (fail-closed)",
102
- "claude.logAuqDisabled": "AskUserQuestion disabled (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), auto-rejected",
103
- "claude.errAuqDisabled": "AskUserQuestion is not enabled",
104
- "claude.logAuqParseFailed": "Failed to parse AskUserQuestion input, auto-rejected (fail-closed)",
105
- "claude.errAuqParse": "Could not parse the questions",
106
- "claude.logAuqSkipped": "AskUserQuestion unanswered/cancelled (session={session})",
107
- "claude.errAuqCancelled": "User did not select (cancelled)",
108
- "claude.logAuqDone": "AskUserQuestion answered (session={session})",
109
- "claude.promptRunTool": "Claude Code requests to run {tool}",
110
- "claude.errApprovalTimeout": "Approval timed out, auto-rejected (fail-closed)",
111
- "claude.errUserDenied": "Rejected by user",
112
- "claude.errAborted": "Request aborted",
113
- "claude.logPermToPhone": "Permission request (tool={tool}) → sent to phone as permissionID={id}",
114
- "claude.errRelayUnreachable": "Relay unreachable, auto-rejected (fail-closed)",
115
- "claude.logQuestionOffline": "Relay offline, structured question auto-cancelled",
116
- "claude.logQuestionToPhone": "Structured question ({count} item(s)) → sent to phone questionID={id}",
117
- "claude.logDialogOffline": "Relay offline, dialog auto-cancelled ({tool})",
118
- "claude.logDialogToPhone": "Dialog request (kind={kind} tool={tool}) → sent to phone as permissionID={id}",
119
- "claude.logAuqDialogParse": "Failed to parse AskUserQuestion payload, keeping default behavior (session={session})",
120
- "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) has no mapping, keeping default behavior (session={session})",
121
- "claude.promptMcpAuth": "MCP “{server}” requests authorization",
122
- "claude.logElicitUnmapped": "MCP elicitation (server={server}, mode={mode}) not handled, auto-rejected (session={session})",
123
- "claude.logResetIdentity": "Unbound from account; resetting identity and generating a new pairing code…",
124
- "claude.dialogConfirm": "Claude Code requests confirmation ({kind})",
125
- "claude.resultTruncated": "… (result truncated)",
126
- "claude.streamError": "claude streaming error",
127
- "claude.errListSessions": "Failed to read Claude session list",
128
- "claude.errReadHistory": "Failed to read session history ({id})",
129
- "setup.langSet": "Runtime language set to",
130
- "setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
131
- "setup.langCurrent": "Current runtime language",
132
- "hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
133
- "hermes.logConnected": "Connected to relay {url}",
134
- "hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
135
- "hermes.logDisconnected": "Disconnected from relay, reconnecting automatically…",
136
- "hermes.logPairCode": "Generated pairing code: {code}",
137
- "hermes.logUnhandledType": "Unhandled message type: {type}",
138
- "hermes.logHandleFailed": "Failed to handle {type}: {message}",
139
- "hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
140
- "hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
141
- "hermes.cmdNew": "New session",
142
- "hermes.cmdHelp": "Show help",
143
- "hermes.newSessionTitle": "New session",
144
- "hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
145
- "hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
146
- "hermes.errBadWorkspace": "Directory does not exist or is unusable",
147
- "hermes.logWorkspaceSwitched": "Switched workspace: {path}",
148
- "hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
149
- "hermes.errStartFailed": "Failed to start: {message}",
150
- "hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
151
- "hermes.logAbortSent": "Abort sent (session={session})",
152
- "hermes.logPromptFailed": "session.prompt failed: {message}",
153
- "hermes.logTurnError": "Turn error (session={session}): {message}",
154
- "hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
155
- "hermes.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
156
- "hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
157
- "hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
158
- "hermes.errHermesExit": "hermes exited ({code}): {err}",
159
- "hermes.logSessionUpdated": "Session updated (session={session})",
160
- "hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
161
- "hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
162
- "hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
163
- "hermes.errToolPair": "tunnelbox_pair failed: {err}",
164
- "hermes.errToolStatus": "tunnelbox_status failed: {err}",
165
- "hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
166
- }
1
+ {
2
+ "agent.err.createSession": "Failed to create session",
3
+ "agent.err.httpClient": "Cannot access the opencode HTTP client",
4
+ "agent.err.unknownPerm": "Unknown permission request: {id}",
5
+ "agent.err.unknownQuestion": "Unknown question request: {id}",
6
+ "agent.log.fallback404": "Preferred endpoint returned 404, falling back to the other one: {message}",
7
+ "agent.log.gotPermReply": "Received permission reply from phone (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "Received question reply from phone (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "Failed to handle {type}: {message}",
10
+ "agent.log.msgOk": "session.messages OK session={session} data={count} limited={limited} win={win} ms={ms}",
11
+ "agent.log.msgFailed": "session.messages FAILED session={session} err={err} ms={ms}",
12
+ "agent.log.msgLimitFallback": "limit unsupported, fell back to full session fetch (session={session})",
13
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
14
+ "agent.log.pendingResent": "session.pending: resent {count} pending request(s) for {session}",
15
+ "agent.log.unhandledType": "Unhandled message type: {type}",
16
+ "events.log.fwdPermission": "Forwarded permission request to phone (id={id} tool={tool} {version})",
17
+ "events.log.sessionDeleted": "Forwarded session.deleted to phone (session={session})",
18
+ "events.log.permissionReplied": "opencode acked permission.replied (id={id} {response})",
19
+ "events.log.questionRejected": "opencode acked question.rejected (id={id})",
20
+ "events.log.questionReplied": "opencode acked question.replied (id={id})",
21
+ "index.error.connectRelay": "Cannot connect to the relay; check the relay address and try again",
22
+ "index.error.pairTimeout": "Timed out waiting for a pairing code (the relay did not respond)",
23
+ "index.log.claimed": "Bound to your phone account. From now on the phone connects directly from My Computers; no need to scan again",
24
+ "index.log.connectedRelay": "Connected to relay {url}",
25
+ "index.log.loaded": "tunnelbox opencode plugin started (v{version})",
26
+ "index.log.disconnected": "Disconnected from relay, reconnecting automatically…",
27
+ "index.log.exit": "Exited",
28
+ "index.log.pairCode": "Generated pairing code: {code}",
29
+ "index.log.pairingStillClaimed": "This pairing code is for re-pairing a new phone under the same account. This computer is already linked and stays reachable from “My Computers” on your phone.",
30
+ "index.log.pairingPreparing": "Connecting to the relay and generating a pairing code…",
31
+ "index.log.permissionToPhone": "Permission request → phone approval (id={id} tool={tool})",
32
+ "index.log.permissionTuiFallback": "App offline; permission request handled by the opencode TUI (id={id} tool={tool})",
33
+ "index.log.relayError": "Relay error: {msg}",
34
+ "index.log.resetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
35
+ "index.log.unknown": "Unknown",
36
+ "install.codeLine": "Pairing code: {code}",
37
+ "install.commandInstalled": "Installed command: {path}",
38
+ "install.done": "Done. Attempted to connect to the relay and output pairing info:",
39
+ "install.failConnect": "(Could not connect to the relay to print pairing info — the relay may be unreachable or the Node version is too old.",
40
+ "install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type “show phone pairing code” / /pair inside opencode.)",
41
+ "install.hintFresh": "Note: the pairing code is single-use and valid for about 10 minutes. If you start opencode later, use the latest pairing info printed at startup or obtained via /pair.",
42
+ "install.pluginInstalled": "Installed plugin: {path}",
43
+ "install.qrUnavailable": "(QR rendering unavailable — use the pairing code above)",
44
+ "install.qrcodeEnsure": "Installing qrcode into the opencode config directory…",
45
+ "install.qrcodeFail": "qrcode installation failed (not critical — only the pairing code is shown): {err}",
46
+ "install.relayError": "Relay returned an error: {msg}",
47
+ "install.scanHint": "Open tunnelbox on your phone, tap “Scan to pair”, and scan the QR code above to connect:",
48
+ "pair.heading": "tunnelbox phone pairing",
49
+ "pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with “Scan to pair”, or enter the pairing code manually.",
50
+ "pair.oneTime": "The pairing code is single-use and valid for about 10 minutes; it stops working once claimed or expired. Ask to “refresh the pairing code” for a new one.",
51
+ "pair.promptBody": "Please show this computer's phone pairing info: the pairing code and a QR code I can scan. Keep the QR code inside a monospaced code block and reproduce it character-for-character so my phone can scan it.",
52
+ "pair.promptDescription": "Show the phone pairing code and scan-able QR code",
53
+ "pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap “Scan to pair”, and scan the QR code below to connect automatically.",
54
+ "perm.promptAuthorize": "opencode requests authorization",
55
+ "perm.promptPatterns": "opencode requests access to: {list}",
56
+ "perm.promptResource": "opencode requests access to resources: {list}",
57
+ "perm.promptTool": "opencode requests to run {tool}",
58
+ "qr.codeLabel": "Pairing code",
59
+ "qr.fileWritten": "Pairing info written to: {path}",
60
+ "qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
61
+ "qr.titleNoType": "tunnelbox phone pairing",
62
+ "qr.titleWithType": "tunnelbox {type} phone pairing",
63
+ "qr.unavailable": "(qrcode not installed — use the pairing code above)",
64
+ "claude.errBusy": "This session is still running; wait for it to finish or stop it first",
65
+ "claude.errTurn": "generation error",
66
+ "claude.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
67
+ "claude.pairForced": "--pair: forcing a pairing code request (this run only)",
68
+ "claude.pairUnclaimed": "No bound account detected; starting pairing guide:",
69
+ "claude.claimedHint": "Bound to a phone account: connect directly from My Computers on the phone",
70
+ "claude.errStartFailed": "Failed to start:",
71
+ "claude.msgStarted": "Claude Code adapter started (Ctrl+C to quit)",
72
+ "claude.warnInvalidMode": "Ignoring invalid TUNNELBOX_CLAUDE_MODE: {raw} (allowed {list})",
73
+ "claude.warnInvalidThinking": "Ignoring invalid TUNNELBOX_CLAUDE_THINKING: {raw} (off|adaptive|enabled[:budget])",
74
+ "claude.cmdNew": "New session",
75
+ "claude.cmdHelp": "Show help",
76
+ "claude.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
77
+ "claude.logConnected": "Connected to relay {url}",
78
+ "claude.logMsgUncaught": "Uncaught exception while handling message: {message}",
79
+ "claude.reasonDisconnect": "Relay disconnected (fail-closed auto-reject)",
80
+ "claude.reasonUnbind": "Account unbound (fail-closed auto-reject)",
81
+ "claude.logDisconnected": "Disconnected from relay, reconnecting automatically…",
82
+ "claude.logPairCode": "Generated pairing code: {code}",
83
+ "claude.logUnhandledType": "Unhandled message type: {type}",
84
+ "claude.logHandleFailed": "Failed to handle {type}: {message}",
85
+ "claude.newSessionTitle": "New session",
86
+ "claude.helpText": "Supported commands:\n- /new new session\n- /help show help",
87
+ "claude.logPromptFailed": "session.prompt failed: {message}",
88
+ "claude.logAbortSent": "Abort sent (session={session})",
89
+ "claude.logAbortFailed": "Abort failed (session={session}): {message}",
90
+ "claude.errBadWorkspaceEmpty": "Missing workspace path",
91
+ "claude.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
92
+ "claude.logWorkspaceSwitched": "Switched workspace: {path}",
93
+ "claude.logUnknownQuestionReply": "Unmatched structured question reply (id={id})",
94
+ "claude.logFlushedQuestions": "Cancelled {count} pending question(s): {reason}",
95
+ "claude.logFlushedApprovals": "Rejected {count} pending request(s): {reason}",
96
+ "claude.logPendingResent": "session.pending: resent {count} pending item(s) for {session}",
97
+ "claude.logSetModeFailed": "setPermissionMode failed (session={session}): {message}",
98
+ "claude.errWorkspaceMissing": "Workspace does not exist: {dir}",
99
+ "claude.logSessionError": "Session error (session={session}): {message}",
100
+ "claude.logOfflineDenyTool": "Relay offline, auto-rejecting tool {tool}",
101
+ "claude.errOfflineDeny": "Relay offline, auto-rejected (fail-closed)",
102
+ "claude.logAuqDisabled": "AskUserQuestion disabled (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), auto-rejected",
103
+ "claude.errAuqDisabled": "AskUserQuestion is not enabled",
104
+ "claude.logAuqParseFailed": "Failed to parse AskUserQuestion input, auto-rejected (fail-closed)",
105
+ "claude.errAuqParse": "Could not parse the questions",
106
+ "claude.logAuqSkipped": "AskUserQuestion unanswered/cancelled (session={session})",
107
+ "claude.errAuqCancelled": "User did not select (cancelled)",
108
+ "claude.logAuqDone": "AskUserQuestion answered (session={session})",
109
+ "claude.promptRunTool": "Claude Code requests to run {tool}",
110
+ "claude.errApprovalTimeout": "Approval timed out, auto-rejected (fail-closed)",
111
+ "claude.errUserDenied": "Rejected by user",
112
+ "claude.errAborted": "Request aborted",
113
+ "claude.logPermToPhone": "Permission request (tool={tool}) → sent to phone as permissionID={id}",
114
+ "claude.errRelayUnreachable": "Relay unreachable, auto-rejected (fail-closed)",
115
+ "claude.logQuestionOffline": "Relay offline, structured question auto-cancelled",
116
+ "claude.logQuestionToPhone": "Structured question ({count} item(s)) → sent to phone questionID={id}",
117
+ "claude.logDialogOffline": "Relay offline, dialog auto-cancelled ({tool})",
118
+ "claude.logDialogToPhone": "Dialog request (kind={kind} tool={tool}) → sent to phone as permissionID={id}",
119
+ "claude.logAuqDialogParse": "Failed to parse AskUserQuestion payload, keeping default behavior (session={session})",
120
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) has no mapping, keeping default behavior (session={session})",
121
+ "claude.promptMcpAuth": "MCP “{server}” requests authorization",
122
+ "claude.logElicitUnmapped": "MCP elicitation (server={server}, mode={mode}) not handled, auto-rejected (session={session})",
123
+ "claude.logResetIdentity": "Unbound from account; resetting identity and generating a new pairing code…",
124
+ "claude.dialogConfirm": "Claude Code requests confirmation ({kind})",
125
+ "claude.resultTruncated": "… (result truncated)",
126
+ "claude.streamError": "claude streaming error",
127
+ "claude.errListSessions": "Failed to read Claude session list",
128
+ "claude.errReadHistory": "Failed to read session history ({id})",
129
+ "setup.langSet": "Runtime language set to",
130
+ "setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
131
+ "setup.langCurrent": "Current runtime language",
132
+ "hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
133
+ "hermes.logConnected": "Connected to relay {url}",
134
+ "hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
135
+ "hermes.logDisconnected": "Disconnected from relay, reconnecting automatically…",
136
+ "hermes.logPairCode": "Generated pairing code: {code}",
137
+ "hermes.logUnhandledType": "Unhandled message type: {type}",
138
+ "hermes.logHandleFailed": "Failed to handle {type}: {message}",
139
+ "hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
140
+ "hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
141
+ "hermes.cmdNew": "New session",
142
+ "hermes.cmdHelp": "Show help",
143
+ "hermes.newSessionTitle": "New session",
144
+ "hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
145
+ "hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
146
+ "hermes.errBadWorkspace": "Directory does not exist or is unusable",
147
+ "hermes.logWorkspaceSwitched": "Switched workspace: {path}",
148
+ "hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
149
+ "hermes.errStartFailed": "Failed to start: {message}",
150
+ "hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
151
+ "hermes.logAbortSent": "Abort sent (session={session})",
152
+ "hermes.logPromptFailed": "session.prompt failed: {message}",
153
+ "hermes.logTurnError": "Turn error (session={session}): {message}",
154
+ "hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
155
+ "hermes.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
156
+ "hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
157
+ "hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
158
+ "hermes.errHermesExit": "hermes exited ({code}): {err}",
159
+ "hermes.logSessionUpdated": "Session updated (session={session})",
160
+ "hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
161
+ "hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
162
+ "hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
163
+ "hermes.errToolPair": "tunnelbox_pair failed: {err}",
164
+ "hermes.errToolStatus": "tunnelbox_status failed: {err}",
165
+ "hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status",
166
+ "qr.validFor": "The pairing code is valid for about 10 minutes; get a new one on your computer if it expires.",
167
+ "pair.toolDesc": "Show this computer's opencode phone pairing info (pairing code and a scan-able QR code). Call when the user asks about pairing, scanning a QR code, or controlling this computer from their phone.",
168
+ "pair.toolRefreshDesc": "Whether to request a new pairing code from the relay",
169
+ "state.errSaveState": "Failed to save state",
170
+ "adapter.logConnected": "Connected to relay {url}",
171
+ "adapter.logDisconnected": "Disconnected from relay, reconnecting automatically…",
172
+ "adapter.logPairCode": "Generated pairing code: {code}",
173
+ "adapter.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
174
+ "adapter.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
175
+ "adapter.logUnhandledType": "Unhandled message type: {type}",
176
+ "adapter.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
177
+ "adapter.errBusy": "This session is still running; wait for it to finish or stop it first",
178
+ "adapter.errBadWorkspaceEmpty": "Missing workspace path",
179
+ "adapter.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
180
+ "adapter.errWorkspaceMissing": "Workspace does not exist: {dir}",
181
+ "adapter.cmdNew": "New session",
182
+ "adapter.cmdHelp": "Show help",
183
+ "adapter.helpText": "Supported commands:\n- /new new session\n- /help show help",
184
+ "adapter.newSessionTitle": "New session",
185
+ "install.langHelpTitle": "install-local supported languages (--lang <tag>):",
186
+ "install.langHelpExample": "Example: npm run install-local -- --lang de-DE",
187
+ "install.unknownLang": "Unknown language \"{raw}\", falling back to en-US. Supported: {list}",
188
+ "hermes.errAskRequired": "question is required",
189
+ "hermes.msgPhoneUnavailable": "Phone unavailable or no response: use the built-in clarify to ask locally, or decide on your own.",
190
+ "hermes.errClarifyUnavailable": "clarify support unavailable",
191
+ "hermes.errAskFailed": "tunnelbox_ask failed: {err}",
192
+ "hermes.errClarifyFailed": "clarify failed: {err}",
193
+ "bin.denied": "Rejected from your phone",
194
+ "bin.timeout": "Approval timed out (fail-closed)",
195
+ "bin.reqRun": "Claude Code requests to run {tool}",
196
+ "bin.pairTitle": "tunnelbox phone pairing",
197
+ "bin.pairCodeLine": " Pairing code: {code}",
198
+ "bin.pairHint": "Open the tunnelbox app, tap “Scan to pair” and scan the QR code, or enter the pairing code manually (single-use).",
199
+ "bin.pairWritten": " Pairing info written to: {path}",
200
+ "bin.pairRequestFailed": "Failed to request a pairing code from the relay.",
201
+ "bin.alreadyClaimed": "This computer is already bound to a phone account; connect directly from “My Computers”. To re-pair, unbind it on your phone first.",
202
+ "bin.noRelay": "No relay URL configured: set TUNNELBOX_RELAY_URL and try again.",
203
+ "bin.connectFailed": "Cannot connect to the relay: {relay}\nSet TUNNELBOX_RELAY_URL or configure it in the official-plugin state file.",
204
+ "bin.statusRelay": "Relay: {value}",
205
+ "bin.statusAgent": "Agent ID: {value}",
206
+ "bin.statusClaimed": "Phone bound: {value}",
207
+ "bin.statusStateFile": "State file: {value}",
208
+ "bin.statusLatest": "Latest pairing info:",
209
+ "bin.usage": "Usage: tunnelbox <pair|status|ask>",
210
+ "bin.usagePair": " pair request and print a phone pairing code",
211
+ "bin.usageStatus": " status show relay/binding status",
212
+ "bin.usageAsk": " ask forward a tool approval to the phone",
213
+ "adapter.logMsgUncaught": "Uncaught exception while handling message: {message}",
214
+ "adapter.logHandleFailed": "Failed to handle {type}: {message}",
215
+ "adapter.logPromptFailed": "session.prompt failed: {message}",
216
+ "adapter.logAbortSent": "Abort sent (session={session})",
217
+ "adapter.errUserDenied": "Rejected by user",
218
+ "adapter.logPendingResent": "session.pending: resent {count} pending request(s)",
219
+ "adapter.logWorkspaceSwitched": "Switched workspace: {path}",
220
+ "adapter.logNewSession": "New session persisted codexId={codexId} (alias={session})",
221
+ "adapter.logSessionError": "Turn error (session={session}): {message}",
222
+ "adapter.logDshSent": "Sent to dsh (session={session})",
223
+ "adapter.logReadHistoryFailed": "Failed to read session history ({session}): {message}",
224
+ "adapter.logAnswererInitFailed": "Answerer initialization failed: {message}",
225
+ "adapter.logRemoteMode": "Dual-display mode: selections/approvals use typert multi-client broadcast; phone and dsh web share the view, first answer wins",
226
+ "adapter.logRemoteProbeFailed": "typert remote event source probe failed; falling back to local answering mode: {message}",
227
+ "adapter.logLocalMode": "Local answering mode: selections/approvals answered by the phone (headless, no dsh web broadcast)",
228
+ "adapter.logRemoteStreamInterrupted": "remote events stream interrupted: {message}",
229
+ "adapter.logResultRejected": "$events/result not accepted ({eventId}): {message}",
230
+ "adapter.logResultBackfillFailed": "$events/result backfill failed ({eventId}): {message}",
231
+ "adapter.logRemoteQuestion": "remote question broadcast → phone question card questionID={id} (session={session})",
232
+ "adapter.errRemoteReadyFrame": "Unexpected remote events first frame",
233
+ "adapter.logRemoteApproval": "remote approval broadcast → phone permission card permissionID={id} (session={session})",
234
+ "adapter.logUserQuestionRoute": "user-questions selection → routed to session={session}",
235
+ "adapter.errDshQuestionEmpty": "dsh question content is empty",
236
+ "adapter.errQuestionTimeout": "Question timed out ({seconds}s), cancelled",
237
+ "adapter.errQuestionCancelledAbort": "Question cancelled (agent aborted)",
238
+ "adapter.errQuestionCancelledRelay": "Relay unreachable, question cancelled",
239
+ "adapter.logQuestionToPhone": "user-questions selection → sent to phone question card questionID={id} (session={session})",
240
+ "adapter.errQuestionUserCancelled": "User cancelled/rejected the question on the phone",
241
+ "adapter.logApprovalRequest": "Approval request (tool={tool}) → sent to phone permission card permissionID={id}",
242
+ "adapter.logAgentPresetFailed": "agentPreset resolution failed ({preset}); falling back to no preset: {message}",
243
+ "adapter.logSessionLiveAdopted": "Session {session} is already held by another agent in this process (live); adopting the existing agent to continue: {message}",
244
+ "adapter.logDisposeSkipped": "Adopted external live agent does not run dispose (session {session} is managed by its original holder)",
245
+ "adapter.logAgentCreateFailed": "Failed to create/resume agent ({session}): {message}",
246
+ "adapter.errSessionBusyLive": "Session {session} is busy (live); try again later",
247
+ "adapter.errAgentsUnavailable": "agents service unavailable",
248
+ "adapter.logToolReason": "dsh requests to run tool {tool}",
249
+ "adapter.logGatewayConnected": "Connected to local OpenClaw Gateway ({version})",
250
+ "adapter.logGatewayDisconnected": "Disconnected from OpenClaw Gateway; the official client is reconnecting…",
251
+ "adapter.logGatewayConnectFailed": "Cannot connect to local OpenClaw Gateway (first time, approve the device locally: `openclaw devices list` + `openclaw devices approve <requestId>`)",
252
+ "adapter.errGatewayNoSessionKey": "Gateway did not return a session key",
253
+ "adapter.logDeleteSessionFailed": "Failed to delete session ({session}): {message} (still acking as deleted)",
254
+ "adapter.logApprovalReplyFailed": "Approval reply failed ({id}): {message}",
255
+ "adapter.logPendingApproval": "session.pending: resent {count} pending approval(s) (session={session})",
256
+ "adapter.workspaceDefault": "Default",
257
+ "adapter.cursorSessionTitle": "Cursor session",
258
+ "adapter.reasonDisconnect": "Relay disconnected, auto-rejecting (fail-closed)",
259
+ "adapter.warnInvalidEnv": "Ignoring invalid {name}: {raw} ({list})",
260
+ "adapter.errStartFailed": "Failed to start:",
261
+ "adapter.msgStarted": "{name} adapter started (Ctrl+C to quit)",
262
+ "adapter.warnCliMissing": "Executable \"{bin}\" not found; install it (e.g. npm i -g @openai/codex) or set TUNNELBOX_CODEX_BIN to its path",
263
+ "adapter.errCliNotFound": "{name} executable \"{bin}\" not found: install the Codex CLI (npm i -g @openai/codex) or set TUNNELBOX_CODEX_BIN",
264
+ "adapter.errSessionNotFound": "Session not found or already deleted",
265
+ "adapter.checkHeader": "tunnelbox-codex environment check",
266
+ "adapter.checkCliOk": "{name} executable: {path}",
267
+ "adapter.checkCliMissing": "{name} executable not found ({bin})",
268
+ "bin.yes": "yes",
269
+ "bin.no": "no",
270
+ "adapter.errAppServerSpawn": "Failed to start codex app-server: {message} (make sure your Codex CLI supports `codex app-server`)",
271
+ "adapter.errAppServerExit": "codex app-server exited; pending approvals/choices were auto-declined",
272
+ "adapter.logUnsupportedServerRequest": "unsupported app-server request: {method}",
273
+ "adapter.logQuestionNative": "choice request -> phone choice card questionID={id} (session={session})",
274
+ "adapter.logPermissionNative": "approval request -> phone approval card permissionID={id} (session={session})",
275
+ "adapter.checkAppServerOk": "codex app-server available",
276
+ "adapter.checkAppServerMissing": "this Codex CLI does not support `codex app-server` (please upgrade Codex CLI)"
277
+ }