@0xmaxma/claude-gateway 1.3.15 → 1.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.template.json +8 -4
- package/dist/agent/builtin-commands.d.ts +1 -1
- package/dist/agent/builtin-commands.d.ts.map +1 -1
- package/dist/agent/builtin-commands.js +5 -0
- package/dist/agent/builtin-commands.js.map +1 -1
- package/dist/agent/line-pure.d.ts +31 -0
- package/dist/agent/line-pure.d.ts.map +1 -0
- package/dist/agent/line-pure.js +99 -0
- package/dist/agent/line-pure.js.map +1 -0
- package/dist/agent/line-reply-manager.d.ts +68 -0
- package/dist/agent/line-reply-manager.d.ts.map +1 -0
- package/dist/agent/line-reply-manager.js +383 -0
- package/dist/agent/line-reply-manager.js.map +1 -0
- package/dist/agent/runner.d.ts +11 -2
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +106 -8
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +25 -1
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +7 -0
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/line-access.d.ts +60 -0
- package/dist/api/line-access.d.ts.map +1 -0
- package/dist/api/line-access.js +69 -0
- package/dist/api/line-access.js.map +1 -0
- package/dist/api/line-mention.d.ts +35 -0
- package/dist/api/line-mention.d.ts.map +1 -0
- package/dist/api/line-mention.js +33 -0
- package/dist/api/line-mention.js.map +1 -0
- package/dist/api/line-pending-senders.d.ts +40 -0
- package/dist/api/line-pending-senders.d.ts.map +1 -0
- package/dist/api/line-pending-senders.js +107 -0
- package/dist/api/line-pending-senders.js.map +1 -0
- package/dist/api/line-webhook-router.d.ts +51 -0
- package/dist/api/line-webhook-router.d.ts.map +1 -0
- package/dist/api/line-webhook-router.js +416 -0
- package/dist/api/line-webhook-router.js.map +1 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +244 -7
- package/dist/api/router.js.map +1 -1
- package/dist/history/types.d.ts +1 -1
- package/dist/history/types.d.ts.map +1 -1
- package/dist/session/compactor.d.ts +1 -1
- package/dist/session/compactor.d.ts.map +1 -1
- package/dist/session/compactor.js.map +1 -1
- package/dist/session/process.d.ts +2 -2
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +14 -3
- package/dist/session/process.js.map +1 -1
- package/dist/session/store.d.ts +13 -13
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js.map +1 -1
- package/dist/shell/claude-pty-shell.js +87 -10
- package/dist/shell/claude-pty-shell.js.map +1 -1
- package/dist/shell/screen.d.ts +61 -0
- package/dist/shell/screen.d.ts.map +1 -1
- package/dist/shell/screen.js +158 -25
- package/dist/shell/screen.js.map +1 -1
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/watch/factory.d.ts +24 -0
- package/dist/watch/factory.d.ts.map +1 -1
- package/dist/watch/factory.js +55 -1
- package/dist/watch/factory.js.map +1 -1
- package/mcp/bun.lock +9 -2
- package/mcp/package.json +1 -0
- package/mcp/server.ts +2 -0
- package/mcp/tools/line/module.ts +127 -0
- package/mcp/tools/line/pure.ts +62 -0
- package/mcp/tools/telegram/receiver-server.ts +8 -5
- package/package.json +2 -1
package/dist/shell/screen.d.ts
CHANGED
|
@@ -73,6 +73,37 @@ export declare function neutralizeTuiTriggers(text: string): string;
|
|
|
73
73
|
export declare const TUI_MENU_FOOTER: readonly ["to navigate", "to cancel"];
|
|
74
74
|
/** A numbered option row, with an optional leading ❯/> highlight marker. */
|
|
75
75
|
export declare const TUI_MENU_OPTION_RE: RegExp;
|
|
76
|
+
/**
|
|
77
|
+
* A tool-permission prompt blocking on keyboard input. Distinct from the
|
|
78
|
+
* AskUserQuestion select menu: Claude Code raises this for guarded operations
|
|
79
|
+
* (e.g. a "Dangerous rm operation on possibly-empty variable path" circuit
|
|
80
|
+
* breaker) that prompt EVEN under --dangerously-skip-permissions, since
|
|
81
|
+
* bypassPermissions deliberately keeps a few catastrophe guards (rm against
|
|
82
|
+
* root/home, possibly-empty globs). The wrapper otherwise assumes no permission
|
|
83
|
+
* prompt ever appears, so without this detector the PTY wedges at the Yes/No
|
|
84
|
+
* forever — nobody can answer it from chat and the typing indicator never clears.
|
|
85
|
+
*
|
|
86
|
+
* Matched by the universal question line plus a footer token unique to permission
|
|
87
|
+
* prompts: the select-menu footer carries "↑/↓ to navigate" and the 32MB overlay
|
|
88
|
+
* carries "esc to go back", so "Tab to amend" / "ctrl+e to explain" disambiguate
|
|
89
|
+
* cleanly. The tokens are the fuller phrases (not bare "to amend" / "to explain")
|
|
90
|
+
* so a chat reply that merely contains those words can't satisfy the footer gate.
|
|
91
|
+
* Region-restricted (bottom rows) + multi-marker + a required ❯/> selection caret
|
|
92
|
+
* so quoted prose in scrollback (a numbered list with none of the live-prompt
|
|
93
|
+
* chrome) cannot trip it — the same defense detectDialog() uses, plus more.
|
|
94
|
+
* Detection only ever BRIDGES the choice to a human; it never presses a key on its
|
|
95
|
+
* own (a destructive guard must not be auto-accepted), making it strictly safer
|
|
96
|
+
* than detectDialog.
|
|
97
|
+
*/
|
|
98
|
+
export declare const TUI_PERMISSION_PROMPT = "Do you want to proceed?";
|
|
99
|
+
export declare const TUI_PERMISSION_FOOTER_TOKENS: readonly ["Tab to amend", "ctrl+e to explain"];
|
|
100
|
+
/** A blocking interactive prompt parsed off the screen: the selectable options
|
|
101
|
+
* plus any context text shown above the question (warning + command). */
|
|
102
|
+
export interface PermissionPrompt {
|
|
103
|
+
options: MenuOption[];
|
|
104
|
+
/** Human-readable lines above the question (e.g. the dangerous command) — '' if none. */
|
|
105
|
+
context: string;
|
|
106
|
+
}
|
|
76
107
|
/**
|
|
77
108
|
* Parse a user's menu reply (typed number or a button's choice payload) into a
|
|
78
109
|
* 1-based option index. Returns null for anything that isn't a leading integer
|
|
@@ -90,6 +121,14 @@ export declare function parseMenuChoice(text: string, count: number): number | n
|
|
|
90
121
|
export declare function extractChannelContent(text: string): string;
|
|
91
122
|
/** Build the chat-facing menu prompt (also the API/number fallback text). */
|
|
92
123
|
export declare function formatMenuPrompt(options: MenuOption[]): string;
|
|
124
|
+
/**
|
|
125
|
+
* Build the chat-facing prompt for a tool-permission request. Leads with a clear
|
|
126
|
+
* warning (this is a guarded/destructive operation Claude Code refused to run
|
|
127
|
+
* unattended), echoes the context lines (e.g. the exact command) so the human can
|
|
128
|
+
* judge, and lists the options 1..N — the same numbering selectMenuOption() types
|
|
129
|
+
* back into the TUI. Also the API/no-button fallback text.
|
|
130
|
+
*/
|
|
131
|
+
export declare function formatPermissionPrompt(context: string, options: MenuOption[]): string;
|
|
93
132
|
/**
|
|
94
133
|
* Virtual terminal fed with raw PTY bytes. Used ONLY for liveness signals
|
|
95
134
|
* (busy / idle / dialog detection) — assistant text is never parsed from
|
|
@@ -149,6 +188,28 @@ export declare class ScreenModel {
|
|
|
149
188
|
* footer; callers must check detectDialog() first and let it auto-accept.
|
|
150
189
|
*/
|
|
151
190
|
detectMenu(): MenuOption[] | null;
|
|
191
|
+
/**
|
|
192
|
+
* Detect a tool-permission prompt blocking on input (e.g. the dangerous-rm
|
|
193
|
+
* circuit breaker that fires even under --dangerously-skip-permissions) and
|
|
194
|
+
* parse its options + context. Returns null when no such prompt is on screen.
|
|
195
|
+
*
|
|
196
|
+
* Region-restricted to the bottom rows and gated on BOTH the question line and
|
|
197
|
+
* a permission-only footer token, so a reply/history that merely quotes the
|
|
198
|
+
* prompt (sitting in scrollback above) never trips it. The bypass-permissions
|
|
199
|
+
* startup dialog is handled by detectDialog()/auto-accept and is excluded here.
|
|
200
|
+
* Callers must only ever BRIDGE this to a human — never auto-select an option.
|
|
201
|
+
*/
|
|
202
|
+
detectPermissionPrompt(): PermissionPrompt | null;
|
|
203
|
+
/**
|
|
204
|
+
* True if a select menu or permission prompt is still blocking on input at the
|
|
205
|
+
* BOTTOM of the screen. Used to decide whether the confirming Enter after a typed
|
|
206
|
+
* selection is still needed: scoping to the bottom region means stale footer /
|
|
207
|
+
* numbered rows left in scrollback by an already-answered prompt can't keep a
|
|
208
|
+
* stray Enter alive (which would submit an empty line at the idle caret).
|
|
209
|
+
* detectMenu() deliberately scans the full buffer to parse a tall menu's options,
|
|
210
|
+
* so it's the wrong signal for this liveness check — hence the dedicated method.
|
|
211
|
+
*/
|
|
212
|
+
interactivePromptBlocking(): boolean;
|
|
152
213
|
}
|
|
153
214
|
/**
|
|
154
215
|
* Heartbeat liveness predicate (pure). The PTY session counts as actively working
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/shell/screen.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAE9C,uFAAuF;AACvF,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAClD,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,eAAO,MAAM,gBAAgB,uDAAwD,CAAC;AActF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,6BAA6B,mBAAmB,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,uCAAwC,CAAC;AACrE,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,QAAoC,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAG9D;AAED;;;;GAIG;AACH,qBAAa,WAAW;aAMM,IAAI;aAAwB,IAAI;IAL5D,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,UAAU,CAAc;IAChC,kGAAkG;IAClG,OAAO,CAAC,aAAa,CAAS;gBAEF,IAAI,SAAM,EAAkB,IAAI,SAAK;IAIjE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMzB,uDAAuD;IACvD,OAAO,IAAI,MAAM;IAIjB,IAAI,IAAI,MAAM;IAId;;;;;;;;;OASG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKhC,OAAO,CAAC,QAAQ;IAUhB,2EAA2E;IAC3E,MAAM,IAAI,OAAO;IAIjB,qFAAqF;IACrF,eAAe,IAAI,OAAO;IAM1B,sCAAsC;IACtC,SAAS,IAAI,OAAO;IAIpB;;;;;;;;;;OAUG;IACH,qBAAqB,IAAI,OAAO;IAKhC,YAAY,IAAI,UAAU,GAAG,IAAI;IAajC;;;;;;;;;OASG;IACH,UAAU,IAAI,UAAU,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/shell/screen.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAE9C,uFAAuF;AACvF,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAClD,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,eAAO,MAAM,gBAAgB,uDAAwD,CAAC;AActF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,6BAA6B,mBAAmB,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,uCAAwC,CAAC;AACrE,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,QAAoC,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAC/D,eAAO,MAAM,4BAA4B,gDAAiD,CAAC;AAE3F;0EAC0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;CACjB;AAsCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAG9D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAIrF;AAED;;;;GAIG;AACH,qBAAa,WAAW;aAMM,IAAI;aAAwB,IAAI;IAL5D,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,UAAU,CAAc;IAChC,kGAAkG;IAClG,OAAO,CAAC,aAAa,CAAS;gBAEF,IAAI,SAAM,EAAkB,IAAI,SAAK;IAIjE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMzB,uDAAuD;IACvD,OAAO,IAAI,MAAM;IAIjB,IAAI,IAAI,MAAM;IAId;;;;;;;;;OASG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKhC,OAAO,CAAC,QAAQ;IAUhB,2EAA2E;IAC3E,MAAM,IAAI,OAAO;IAIjB,qFAAqF;IACrF,eAAe,IAAI,OAAO;IAM1B,sCAAsC;IACtC,SAAS,IAAI,OAAO;IAIpB;;;;;;;;;;OAUG;IACH,qBAAqB,IAAI,OAAO;IAKhC,YAAY,IAAI,UAAU,GAAG,IAAI;IAajC;;;;;;;;;OASG;IACH,UAAU,IAAI,UAAU,EAAE,GAAG,IAAI;IAajC;;;;;;;;;;OAUG;IACH,sBAAsB,IAAI,gBAAgB,GAAG,IAAI;IAmDjD;;;;;;;;OAQG;IACH,yBAAyB,IAAI,OAAO;CAKrC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACzC,eAAe,EAAE,MAAM,GACtB,OAAO,CAET"}
|
package/dist/shell/screen.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ScreenModel = exports.TUI_MENU_OPTION_RE = exports.TUI_MENU_FOOTER = exports.TUI_SYNTHETIC_MODEL = exports.TUI_REQUEST_TOO_LARGE_DISMISS = exports.TUI_REQUEST_TOO_LARGE = exports.TUI_BYPASS_PERMS = exports.TUI_PROMPT_RE = exports.TUI_BUSY_MARKER = void 0;
|
|
3
|
+
exports.ScreenModel = exports.TUI_PERMISSION_FOOTER_TOKENS = exports.TUI_PERMISSION_PROMPT = exports.TUI_MENU_OPTION_RE = exports.TUI_MENU_FOOTER = exports.TUI_SYNTHETIC_MODEL = exports.TUI_REQUEST_TOO_LARGE_DISMISS = exports.TUI_REQUEST_TOO_LARGE = exports.TUI_BYPASS_PERMS = exports.TUI_PROMPT_RE = exports.TUI_BUSY_MARKER = void 0;
|
|
4
4
|
exports.neutralizeTuiTriggers = neutralizeTuiTriggers;
|
|
5
5
|
exports.parseMenuChoice = parseMenuChoice;
|
|
6
6
|
exports.extractChannelContent = extractChannelContent;
|
|
7
7
|
exports.formatMenuPrompt = formatMenuPrompt;
|
|
8
|
+
exports.formatPermissionPrompt = formatPermissionPrompt;
|
|
8
9
|
exports.isPtyActivelyWorking = isPtyActivelyWorking;
|
|
9
10
|
const headless_1 = require("@xterm/headless");
|
|
10
11
|
/** The TUI renders spaces as U+00A0 (non-breaking) — normalize before matching. */
|
|
@@ -95,6 +96,69 @@ function neutralizeTuiTriggers(text) {
|
|
|
95
96
|
exports.TUI_MENU_FOOTER = ['to navigate', 'to cancel'];
|
|
96
97
|
/** A numbered option row, with an optional leading ❯/> highlight marker. */
|
|
97
98
|
exports.TUI_MENU_OPTION_RE = /^\s*[❯>]?\s*(\d+)\.\s+(.+?)\s*$/;
|
|
99
|
+
/**
|
|
100
|
+
* A tool-permission prompt blocking on keyboard input. Distinct from the
|
|
101
|
+
* AskUserQuestion select menu: Claude Code raises this for guarded operations
|
|
102
|
+
* (e.g. a "Dangerous rm operation on possibly-empty variable path" circuit
|
|
103
|
+
* breaker) that prompt EVEN under --dangerously-skip-permissions, since
|
|
104
|
+
* bypassPermissions deliberately keeps a few catastrophe guards (rm against
|
|
105
|
+
* root/home, possibly-empty globs). The wrapper otherwise assumes no permission
|
|
106
|
+
* prompt ever appears, so without this detector the PTY wedges at the Yes/No
|
|
107
|
+
* forever — nobody can answer it from chat and the typing indicator never clears.
|
|
108
|
+
*
|
|
109
|
+
* Matched by the universal question line plus a footer token unique to permission
|
|
110
|
+
* prompts: the select-menu footer carries "↑/↓ to navigate" and the 32MB overlay
|
|
111
|
+
* carries "esc to go back", so "Tab to amend" / "ctrl+e to explain" disambiguate
|
|
112
|
+
* cleanly. The tokens are the fuller phrases (not bare "to amend" / "to explain")
|
|
113
|
+
* so a chat reply that merely contains those words can't satisfy the footer gate.
|
|
114
|
+
* Region-restricted (bottom rows) + multi-marker + a required ❯/> selection caret
|
|
115
|
+
* so quoted prose in scrollback (a numbered list with none of the live-prompt
|
|
116
|
+
* chrome) cannot trip it — the same defense detectDialog() uses, plus more.
|
|
117
|
+
* Detection only ever BRIDGES the choice to a human; it never presses a key on its
|
|
118
|
+
* own (a destructive guard must not be auto-accepted), making it strictly safer
|
|
119
|
+
* than detectDialog.
|
|
120
|
+
*/
|
|
121
|
+
exports.TUI_PERMISSION_PROMPT = 'Do you want to proceed?';
|
|
122
|
+
exports.TUI_PERMISSION_FOOTER_TOKENS = ['Tab to amend', 'ctrl+e to explain'];
|
|
123
|
+
/**
|
|
124
|
+
* Parse the numbered option rows out of a block of screen lines and return the
|
|
125
|
+
* live run as 1..N options. Scrollback above a prompt can contain stale numbered
|
|
126
|
+
* lines (a prior chat message rendered as "1. … 2. …"), so we take the LAST run
|
|
127
|
+
* that starts at "1." and increments by one — that is the live prompt nearest the
|
|
128
|
+
* footer, not history. Returns null for fewer than two options. Shared by
|
|
129
|
+
* detectMenu() and detectPermissionPrompt() so both number options identically.
|
|
130
|
+
*
|
|
131
|
+
* `stripBorder` strips a left box border ("│ ") before matching, for prompts that
|
|
132
|
+
* render inside a rounded dialog box (the permission prompt). detectMenu() leaves
|
|
133
|
+
* it off so its full-buffer scan stays byte-identical to before — stripping the
|
|
134
|
+
* border there would let "│ 1. …" lines in dialog-bordered scrollback newly parse
|
|
135
|
+
* as options and shift the live run it picks.
|
|
136
|
+
*/
|
|
137
|
+
function parseOptionRun(lines, stripBorder = false) {
|
|
138
|
+
const matches = [];
|
|
139
|
+
for (const raw of lines) {
|
|
140
|
+
const line = stripBorder ? raw.replace(/^\s*│\s?/, '') : raw;
|
|
141
|
+
const m = exports.TUI_MENU_OPTION_RE.exec(line);
|
|
142
|
+
if (m)
|
|
143
|
+
matches.push({ index: Number(m[1]), label: m[2].trim() });
|
|
144
|
+
}
|
|
145
|
+
if (matches.length < 2)
|
|
146
|
+
return null;
|
|
147
|
+
let start = -1;
|
|
148
|
+
for (let i = 0; i < matches.length; i++) {
|
|
149
|
+
if (matches[i].index === 1)
|
|
150
|
+
start = i;
|
|
151
|
+
}
|
|
152
|
+
if (start === -1)
|
|
153
|
+
return null;
|
|
154
|
+
const run = [];
|
|
155
|
+
let expected = 1;
|
|
156
|
+
for (let i = start; i < matches.length && matches[i].index === expected; i++) {
|
|
157
|
+
run.push(matches[i]);
|
|
158
|
+
expected++;
|
|
159
|
+
}
|
|
160
|
+
return run.length >= 2 ? run : null;
|
|
161
|
+
}
|
|
98
162
|
/**
|
|
99
163
|
* Parse a user's menu reply (typed number or a button's choice payload) into a
|
|
100
164
|
* 1-based option index. Returns null for anything that isn't a leading integer
|
|
@@ -126,6 +190,18 @@ function formatMenuPrompt(options) {
|
|
|
126
190
|
const lines = options.map((o, i) => `${i + 1}. ${o.label}`).join('\n');
|
|
127
191
|
return `🔢 Choose an option — tap a button below, or reply with the number:\n\n${lines}`;
|
|
128
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Build the chat-facing prompt for a tool-permission request. Leads with a clear
|
|
195
|
+
* warning (this is a guarded/destructive operation Claude Code refused to run
|
|
196
|
+
* unattended), echoes the context lines (e.g. the exact command) so the human can
|
|
197
|
+
* judge, and lists the options 1..N — the same numbering selectMenuOption() types
|
|
198
|
+
* back into the TUI. Also the API/no-button fallback text.
|
|
199
|
+
*/
|
|
200
|
+
function formatPermissionPrompt(context, options) {
|
|
201
|
+
const opts = options.map((o, i) => `${i + 1}. ${o.label}`).join('\n');
|
|
202
|
+
const ctx = context.trim() ? `\n\n${context.trim()}` : '';
|
|
203
|
+
return `⚠️ Claude Code is asking permission for a guarded operation — a human must decide:${ctx}\n\nTap a button below, or reply with the number:\n\n${opts}`;
|
|
204
|
+
}
|
|
129
205
|
/**
|
|
130
206
|
* Virtual terminal fed with raw PTY bytes. Used ONLY for liveness signals
|
|
131
207
|
* (busy / idle / dialog detection) — assistant text is never parsed from
|
|
@@ -236,34 +312,91 @@ class ScreenModel {
|
|
|
236
312
|
const lines = text.split('\n');
|
|
237
313
|
const footerIdx = lines.findIndex((l) => exports.TUI_MENU_FOOTER.some((s) => l.includes(s)));
|
|
238
314
|
const region = footerIdx >= 0 ? lines.slice(0, footerIdx) : lines;
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
315
|
+
// parseOptionRun() takes the live 1..N run nearest the footer, so stale
|
|
316
|
+
// numbered scrollback above the menu can't inflate or shift the option list.
|
|
317
|
+
return parseOptionRun(region);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Detect a tool-permission prompt blocking on input (e.g. the dangerous-rm
|
|
321
|
+
* circuit breaker that fires even under --dangerously-skip-permissions) and
|
|
322
|
+
* parse its options + context. Returns null when no such prompt is on screen.
|
|
323
|
+
*
|
|
324
|
+
* Region-restricted to the bottom rows and gated on BOTH the question line and
|
|
325
|
+
* a permission-only footer token, so a reply/history that merely quotes the
|
|
326
|
+
* prompt (sitting in scrollback above) never trips it. The bypass-permissions
|
|
327
|
+
* startup dialog is handled by detectDialog()/auto-accept and is excluded here.
|
|
328
|
+
* Callers must only ever BRIDGE this to a human — never auto-select an option.
|
|
329
|
+
*/
|
|
330
|
+
detectPermissionPrompt() {
|
|
331
|
+
const text = this.bottomText(DIALOG_REGION_ROWS);
|
|
332
|
+
if (!text.includes(exports.TUI_PERMISSION_PROMPT))
|
|
333
|
+
return null;
|
|
334
|
+
if (!exports.TUI_PERMISSION_FOOTER_TOKENS.some((t) => text.includes(t)))
|
|
246
335
|
return null;
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
//
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
336
|
+
// The "Bypass Permissions mode … Yes, I accept" startup dialog is a separate
|
|
337
|
+
// case with its own auto-accept — don't double-handle it here.
|
|
338
|
+
if (exports.TUI_BYPASS_PERMS.every((s) => text.includes(s)))
|
|
339
|
+
return null;
|
|
340
|
+
const lines = text.split('\n');
|
|
341
|
+
// Use the LAST occurrence of the question — the live prompt sits nearest the
|
|
342
|
+
// footer, so a reply/history that quotes "Do you want to proceed?" higher in
|
|
343
|
+
// the bottom region can't capture the question index and empty the context.
|
|
344
|
+
let qIdx = -1;
|
|
345
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
346
|
+
if (lines[i].includes(exports.TUI_PERMISSION_PROMPT)) {
|
|
347
|
+
qIdx = i;
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
257
350
|
}
|
|
258
|
-
|
|
351
|
+
const footerIdx = lines.findIndex((l, i) => i > qIdx && exports.TUI_PERMISSION_FOOTER_TOKENS.some((t) => l.includes(t)));
|
|
352
|
+
// Options live strictly between the question and the footer.
|
|
353
|
+
const optionRegion = footerIdx >= 0 ? lines.slice(qIdx + 1, footerIdx) : lines.slice(qIdx + 1);
|
|
354
|
+
// A live select prompt always highlights one option with the ❯/> caret (kept
|
|
355
|
+
// even inside a box border). Quoted prose numbered lists never carry it, so
|
|
356
|
+
// requiring it closes the false-positive where conversational text pairs a
|
|
357
|
+
// numbered list with the question + a footer-ish phrase.
|
|
358
|
+
const hasCaret = optionRegion.some((l) => /^\s*│?\s*[❯>]\s*\d+\./.test(l));
|
|
359
|
+
if (!hasCaret)
|
|
259
360
|
return null;
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
361
|
+
const options = parseOptionRun(optionRegion, true);
|
|
362
|
+
if (!options)
|
|
363
|
+
return null;
|
|
364
|
+
// Context = the warning + command shown above the question. Bound it to the
|
|
365
|
+
// dialog box (scan up for the rounded top border ╭) so conversation lines that
|
|
366
|
+
// merely share the bottom region aren't swept in; fall back to the few lines
|
|
367
|
+
// immediately above the question when the prompt isn't boxed.
|
|
368
|
+
const isBorderOnly = (l) => /^[\s│╭╮╰╯─]*$/.test(l);
|
|
369
|
+
const stripBorder = (l) => l.replace(/^[\s│]+/, '').replace(/[\s│]+$/, '');
|
|
370
|
+
const aboveQ = lines.slice(0, qIdx);
|
|
371
|
+
let boxTop = -1;
|
|
372
|
+
for (let i = aboveQ.length - 1; i >= 0; i--) {
|
|
373
|
+
if (/[╭╮]/.test(aboveQ[i])) {
|
|
374
|
+
boxTop = i;
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
265
377
|
}
|
|
266
|
-
|
|
378
|
+
const contextLines = boxTop >= 0 ? aboveQ.slice(boxTop + 1) : aboveQ.slice(-4);
|
|
379
|
+
const context = contextLines
|
|
380
|
+
.filter((l) => !isBorderOnly(l))
|
|
381
|
+
.map(stripBorder)
|
|
382
|
+
.filter((l) => l.length > 0)
|
|
383
|
+
.join('\n');
|
|
384
|
+
return { options, context };
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* True if a select menu or permission prompt is still blocking on input at the
|
|
388
|
+
* BOTTOM of the screen. Used to decide whether the confirming Enter after a typed
|
|
389
|
+
* selection is still needed: scoping to the bottom region means stale footer /
|
|
390
|
+
* numbered rows left in scrollback by an already-answered prompt can't keep a
|
|
391
|
+
* stray Enter alive (which would submit an empty line at the idle caret).
|
|
392
|
+
* detectMenu() deliberately scans the full buffer to parse a tall menu's options,
|
|
393
|
+
* so it's the wrong signal for this liveness check — hence the dedicated method.
|
|
394
|
+
*/
|
|
395
|
+
interactivePromptBlocking() {
|
|
396
|
+
const text = this.bottomText(DIALOG_REGION_ROWS);
|
|
397
|
+
if (exports.TUI_MENU_FOOTER.every((s) => text.includes(s)))
|
|
398
|
+
return true;
|
|
399
|
+
return this.detectPermissionPrompt() !== null;
|
|
267
400
|
}
|
|
268
401
|
}
|
|
269
402
|
exports.ScreenModel = ScreenModel;
|
package/dist/shell/screen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/shell/screen.ts"],"names":[],"mappings":";;;AA0FA,sDAKC;
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/shell/screen.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -27,6 +27,66 @@ export interface AgentConfig {
|
|
|
27
27
|
dmAllowlist?: string[];
|
|
28
28
|
autoThread?: boolean;
|
|
29
29
|
};
|
|
30
|
+
line?: {
|
|
31
|
+
channelAccessToken: string;
|
|
32
|
+
channelSecret: string;
|
|
33
|
+
/** default true when the block is present */
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
/** default "/line/webhook" */
|
|
36
|
+
webhookPath?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Slow-LLM postback button (ported from hermes-agent). Seconds to wait for
|
|
39
|
+
* the agent's answer before burning the reply token to send a tappable
|
|
40
|
+
* "Get answer" button; tapping yields a fresh (free) reply token. Default
|
|
41
|
+
* 45 (leaves margin under LINE's ~60s token TTL). Set 0 to disable — the
|
|
42
|
+
* agent then uses the plain reply-token-first → push-fallback path.
|
|
43
|
+
*/
|
|
44
|
+
slowResponseThreshold?: number;
|
|
45
|
+
/** Button label (default "Get answer", max 20 chars on LINE). */
|
|
46
|
+
slowButtonLabel?: string;
|
|
47
|
+
/** Bubble text shown with the button (default a "still thinking" notice). */
|
|
48
|
+
slowPendingText?: string;
|
|
49
|
+
/**
|
|
50
|
+
* DM access policy (mirrors `discord.dmPolicy`). Closed by default: when
|
|
51
|
+
* absent, only senders in `dmAllowlist` may reach the agent (same posture as
|
|
52
|
+
* hermes/openclaw). 'open' replies to any 1:1 sender; 'allowlist' replies
|
|
53
|
+
* only to `dmAllowlist`; 'disabled' ignores all DMs.
|
|
54
|
+
*/
|
|
55
|
+
dmPolicy?: 'open' | 'allowlist' | 'disabled';
|
|
56
|
+
/** LINE userIds allowed under allowlist / closed-default (case-sensitive "U"+32hex). */
|
|
57
|
+
dmAllowlist?: string[];
|
|
58
|
+
/**
|
|
59
|
+
* Group/room access policy (the group analogue of `dmPolicy`). Closed by
|
|
60
|
+
* default: when absent, only conversations whose groupId/roomId is in
|
|
61
|
+
* `groupAllowlist` are answered. 'open' answers in any group/room the bot is
|
|
62
|
+
* invited to; 'allowlist' answers only listed ones; 'disabled' ignores all
|
|
63
|
+
* group/room traffic. Applies to both `group` and `room` sources.
|
|
64
|
+
*/
|
|
65
|
+
groupPolicy?: 'open' | 'allowlist' | 'disabled';
|
|
66
|
+
/**
|
|
67
|
+
* Allowed conversation ids for groups and rooms — groupIds ("C"+32hex) and
|
|
68
|
+
* roomIds ("R"+32hex) share one list (the webhook tells us which). Used under
|
|
69
|
+
* allowlist / closed-default.
|
|
70
|
+
*/
|
|
71
|
+
groupAllowlist?: string[];
|
|
72
|
+
/**
|
|
73
|
+
* In groups/rooms, only respond when the bot is @mentioned (native LINE
|
|
74
|
+
* mention or its name). Default true (absent ⇒ true). No effect on DMs.
|
|
75
|
+
* Set false to make the bot answer every allowed group message.
|
|
76
|
+
*/
|
|
77
|
+
requireMention?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Pairing aid for the allowlist (orthogonal to dm/groupPolicy — not a policy
|
|
80
|
+
* value). When on, an un-allowlisted sender (DM or group/room) gets a one-time
|
|
81
|
+
* pairing code replied to them via the free reply token, and the same code
|
|
82
|
+
* shows in the UI "pending" row so an admin can visually match it
|
|
83
|
+
* before clicking "+ Add". Default true (absent ⇒ on). Only has an effect
|
|
84
|
+
* under `allowlist` (closed-default) — `open` never denies and `disabled`
|
|
85
|
+
* is hard-off, so neither sends a code. Set false to restore the silent
|
|
86
|
+
* closed-allowlist behavior.
|
|
87
|
+
*/
|
|
88
|
+
pairing?: boolean;
|
|
89
|
+
};
|
|
30
90
|
claude: {
|
|
31
91
|
model: string;
|
|
32
92
|
/** @deprecated --dangerously-skip-permissions is always passed now; this field is ignored. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/watch/factory.d.ts
CHANGED
|
@@ -17,12 +17,36 @@ export interface WatcherOptions {
|
|
|
17
17
|
* before the debounced onChange fires (e.g. for file renames).
|
|
18
18
|
*/
|
|
19
19
|
onAddSync?: (filePath: string) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Optional handler for watcher-level errors (e.g. inotify ENOSPC). When
|
|
22
|
+
* omitted, errors are logged and swallowed so a single failing watcher
|
|
23
|
+
* never escalates to an unhandledRejection that crashes the whole gateway.
|
|
24
|
+
*/
|
|
25
|
+
onError?: (err: NodeJS.ErrnoException) => void;
|
|
20
26
|
}
|
|
21
27
|
export interface WatchHandle {
|
|
22
28
|
close(): Promise<void> | void;
|
|
23
29
|
/** Resolves when chokidar has finished its initial scan and is ready to detect changes. */
|
|
24
30
|
ready: Promise<void>;
|
|
25
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* A degraded watcher recorded for health reporting. One entry per distinct
|
|
34
|
+
* (error code, watched paths) pair; repeated errors increment `count` rather
|
|
35
|
+
* than piling up. Surfaced on GET /status so an ENOSPC degrade is observable
|
|
36
|
+
* in production instead of being a single console line nobody sees.
|
|
37
|
+
*/
|
|
38
|
+
export interface WatcherErrorRecord {
|
|
39
|
+
paths: string[];
|
|
40
|
+
code: string | null;
|
|
41
|
+
message: string;
|
|
42
|
+
count: number;
|
|
43
|
+
firstAt: string;
|
|
44
|
+
lastAt: string;
|
|
45
|
+
}
|
|
46
|
+
/** Snapshot of degraded watchers for health reporting. Empty when healthy. */
|
|
47
|
+
export declare function getWatcherHealth(): WatcherErrorRecord[];
|
|
48
|
+
/** Test-only: clear the recorded watcher-error registry. */
|
|
49
|
+
export declare function resetWatcherHealth(): void;
|
|
26
50
|
/**
|
|
27
51
|
* Shared chokidar watcher factory.
|
|
28
52
|
* Watches the given paths, debounces rapid changes, and calls onChange.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/watch/factory.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;IACrC;;;;OAIG;IACH,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/watch/factory.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;IACrC;;;;OAIG;IACH,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,2FAA2F;IAC3F,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,kBAAkB,EAAE,CAEvD;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAuBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,WAAW,CAgE/D"}
|
package/dist/watch/factory.js
CHANGED
|
@@ -3,8 +3,42 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getWatcherHealth = getWatcherHealth;
|
|
7
|
+
exports.resetWatcherHealth = resetWatcherHealth;
|
|
6
8
|
exports.createWatcher = createWatcher;
|
|
7
9
|
const chokidar_1 = __importDefault(require("chokidar"));
|
|
10
|
+
// Bounded by the number of distinct watchers (a few dozen at most), so this
|
|
11
|
+
// never grows unbounded. Keyed by `${code}:${paths}`.
|
|
12
|
+
const watcherErrors = new Map();
|
|
13
|
+
/** Snapshot of degraded watchers for health reporting. Empty when healthy. */
|
|
14
|
+
function getWatcherHealth() {
|
|
15
|
+
return [...watcherErrors.values()].map((r) => ({ ...r, paths: [...r.paths] }));
|
|
16
|
+
}
|
|
17
|
+
/** Test-only: clear the recorded watcher-error registry. */
|
|
18
|
+
function resetWatcherHealth() {
|
|
19
|
+
watcherErrors.clear();
|
|
20
|
+
}
|
|
21
|
+
function recordWatcherError(paths, e) {
|
|
22
|
+
const code = e?.code ?? null;
|
|
23
|
+
const key = `${code ?? 'ERR'}:${paths.join(',')}`;
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
const existing = watcherErrors.get(key);
|
|
26
|
+
if (existing) {
|
|
27
|
+
existing.count += 1;
|
|
28
|
+
existing.lastAt = now;
|
|
29
|
+
existing.message = e?.message ?? String(e);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
watcherErrors.set(key, {
|
|
33
|
+
paths: [...paths],
|
|
34
|
+
code,
|
|
35
|
+
message: e?.message ?? String(e),
|
|
36
|
+
count: 1,
|
|
37
|
+
firstAt: now,
|
|
38
|
+
lastAt: now,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
8
42
|
/**
|
|
9
43
|
* Shared chokidar watcher factory.
|
|
10
44
|
* Watches the given paths, debounces rapid changes, and calls onChange.
|
|
@@ -40,7 +74,27 @@ function createWatcher(opts) {
|
|
|
40
74
|
debounced(filePath);
|
|
41
75
|
})
|
|
42
76
|
.on('change', (filePath) => debounced(filePath))
|
|
43
|
-
.on('unlink', (filePath) => debounced(filePath))
|
|
77
|
+
.on('unlink', (filePath) => debounced(filePath))
|
|
78
|
+
.on('error', (err) => {
|
|
79
|
+
// chokidar surfaces watcher failures (e.g. inotify ENOSPC) via the
|
|
80
|
+
// 'error' event. Without a listener these bubble up as an
|
|
81
|
+
// unhandledRejection — which the gateway treats as fatal and exits on.
|
|
82
|
+
// Catch, log actionably, and degrade this watcher instead of crashing.
|
|
83
|
+
const e = err;
|
|
84
|
+
// Record for /status health reporting so the degrade is observable in
|
|
85
|
+
// production, not just a single console line.
|
|
86
|
+
recordWatcherError(opts.paths, e);
|
|
87
|
+
if (e && e.code === 'ENOSPC') {
|
|
88
|
+
console.error(`[watch] inotify limit reached (ENOSPC) while watching ${opts.paths.join(', ')}; ` +
|
|
89
|
+
'this watcher is degraded. Raise fs.inotify.max_user_instances / ' +
|
|
90
|
+
'fs.inotify.max_user_watches, or reduce the number of watched paths.');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.error(`[watch] watcher error for ${opts.paths.join(', ')}:`, e?.message ?? e);
|
|
94
|
+
}
|
|
95
|
+
if (opts.onError)
|
|
96
|
+
opts.onError(e);
|
|
97
|
+
});
|
|
44
98
|
return {
|
|
45
99
|
ready,
|
|
46
100
|
async close() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/watch/factory.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/watch/factory.ts"],"names":[],"mappings":"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"}
|
package/mcp/bun.lock
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"": {
|
|
6
6
|
"name": "claude-gateway-plugin",
|
|
7
7
|
"dependencies": {
|
|
8
|
+
"@line/bot-sdk": "^11.0.2",
|
|
8
9
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
9
10
|
"discord.js": "^14.16.0",
|
|
10
11
|
"grammy": "^1.21.0",
|
|
@@ -29,6 +30,8 @@
|
|
|
29
30
|
|
|
30
31
|
"@hono/node-server": ["@hono/node-server@1.19.14", "", { "peerDependencies": { "hono": "^4" } }, "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw=="],
|
|
31
32
|
|
|
33
|
+
"@line/bot-sdk": ["@line/bot-sdk@11.0.2", "", { "dependencies": { "@types/node": "^24.0.0" } }, "sha512-Y2PCEIlKw5ytu56HhrZt0Wfb8ZxBjrpKTlsmaZ4nWkbHKV2F0T7ZpwFfT7FqXryyqOrl8+RdvFYBBXE4B464SA=="],
|
|
34
|
+
|
|
32
35
|
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
|
|
33
36
|
|
|
34
37
|
"@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="],
|
|
@@ -37,7 +40,7 @@
|
|
|
37
40
|
|
|
38
41
|
"@sapphire/snowflake": ["@sapphire/snowflake@3.5.3", "", {}, "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ=="],
|
|
39
42
|
|
|
40
|
-
"@types/node": ["@types/node@
|
|
43
|
+
"@types/node": ["@types/node@24.13.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA=="],
|
|
41
44
|
|
|
42
45
|
"@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
|
|
43
46
|
|
|
@@ -235,7 +238,7 @@
|
|
|
235
238
|
|
|
236
239
|
"undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="],
|
|
237
240
|
|
|
238
|
-
"undici-types": ["undici-types@7.
|
|
241
|
+
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
|
239
242
|
|
|
240
243
|
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
|
|
241
244
|
|
|
@@ -260,5 +263,9 @@
|
|
|
260
263
|
"@discordjs/rest/@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="],
|
|
261
264
|
|
|
262
265
|
"@discordjs/ws/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="],
|
|
266
|
+
|
|
267
|
+
"@types/ws/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
|
|
268
|
+
|
|
269
|
+
"@types/ws/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
|
|
263
270
|
}
|
|
264
271
|
}
|