breakpoint-mcp 1.82.1 โ 1.84.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.
- package/addon/breakpoint_mcp/operations.gd +298 -275
- package/addon/breakpoint_mcp/plugin.cfg +1 -1
- package/addon/breakpoint_mcp/runtime_bridge.gd +20 -3
- package/dist/addon-version.js.map +1 -0
- package/dist/annotations.js.map +1 -0
- package/dist/bridge.js +86 -2
- package/dist/bridge.js.map +1 -0
- package/dist/capabilities.js +101 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/clients.js.map +1 -0
- package/dist/cli/doctor.js +147 -6
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/github.js.map +1 -0
- package/dist/cli/init.js +26 -4
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/tools.js.map +1 -0
- package/dist/cli/usage.js +40 -1
- package/dist/cli/usage.js.map +1 -0
- package/dist/client-caps.js +75 -0
- package/dist/client-caps.js.map +1 -0
- package/dist/close-cause.js.map +1 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm.js +13 -21
- package/dist/confirm.js.map +1 -0
- package/dist/connect-cause.js.map +1 -0
- package/dist/csdap.js.map +1 -0
- package/dist/cslsp.js.map +1 -0
- package/dist/dap.js.map +1 -0
- package/dist/exit-cause.js.map +1 -0
- package/dist/finiteness.js.map +1 -0
- package/dist/framing.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/late-reply.js.map +1 -0
- package/dist/logger.js.map +1 -0
- package/dist/lsp.js.map +1 -0
- package/dist/mutation-guard.js +235 -0
- package/dist/mutation-guard.js.map +1 -0
- package/dist/path-cohort.js.map +1 -0
- package/dist/paths.js.map +1 -0
- package/dist/pause.js.map +1 -0
- package/dist/peers.js +20 -4
- package/dist/peers.js.map +1 -0
- package/dist/ports.js.map +1 -0
- package/dist/readiness.js.map +1 -0
- package/dist/recipes.js.map +1 -0
- package/dist/remedies.js.map +1 -0
- package/dist/result-cost.js.map +1 -0
- package/dist/schemas.js +155 -46
- package/dist/schemas.js.map +1 -0
- package/dist/secret.js.map +1 -0
- package/dist/spawn-guard.js +76 -0
- package/dist/spawn-guard.js.map +1 -0
- package/dist/stdio.js.map +1 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/tasks.js.map +1 -0
- package/dist/timeout-cause.js.map +1 -0
- package/dist/timeout-caveat.js.map +1 -0
- package/dist/tool-census.js +47 -0
- package/dist/tool-census.js.map +1 -0
- package/dist/tools/assetgen.js +13 -7
- package/dist/tools/assetgen.js.map +1 -0
- package/dist/tools/backend.js +4 -0
- package/dist/tools/backend.js.map +1 -0
- package/dist/tools/cli.js +73 -20
- package/dist/tools/cli.js.map +1 -0
- package/dist/tools/csdap.js.map +1 -0
- package/dist/tools/cslsp.js.map +1 -0
- package/dist/tools/dap.js +2 -3
- package/dist/tools/dap.js.map +1 -0
- package/dist/tools/editor/animation.js +3 -3
- package/dist/tools/editor/animation.js.map +1 -0
- package/dist/tools/editor/audio.js +5 -3
- package/dist/tools/editor/audio.js.map +1 -0
- package/dist/tools/editor/common.js.map +1 -0
- package/dist/tools/editor/core.js.map +1 -0
- package/dist/tools/editor/filesystem.js.map +1 -0
- package/dist/tools/editor/introspection.js.map +1 -0
- package/dist/tools/editor/node.js +4 -4
- package/dist/tools/editor/node.js.map +1 -0
- package/dist/tools/editor/particles.js +2 -1
- package/dist/tools/editor/particles.js.map +1 -0
- package/dist/tools/editor/physics.js +5 -4
- package/dist/tools/editor/physics.js.map +1 -0
- package/dist/tools/editor/project_input_test.js.map +1 -0
- package/dist/tools/editor/resource.js +11 -6
- package/dist/tools/editor/resource.js.map +1 -0
- package/dist/tools/editor/scene.js +7 -4
- package/dist/tools/editor/scene.js.map +1 -0
- package/dist/tools/editor/shader.js +4 -3
- package/dist/tools/editor/shader.js.map +1 -0
- package/dist/tools/editor/signal.js.map +1 -0
- package/dist/tools/editor/spatial.js +15 -8
- package/dist/tools/editor/spatial.js.map +1 -0
- package/dist/tools/editor/tiles.js +5 -3
- package/dist/tools/editor/tiles.js.map +1 -0
- package/dist/tools/editor/ui.js +6 -4
- package/dist/tools/editor/ui.js.map +1 -0
- package/dist/tools/editor.js.map +1 -0
- package/dist/tools/knowledge.js.map +1 -0
- package/dist/tools/lsp-common.js.map +1 -0
- package/dist/tools/lsp.js +1 -1
- package/dist/tools/lsp.js.map +1 -0
- package/dist/tools/netcode.js +6 -5
- package/dist/tools/netcode.js.map +1 -0
- package/dist/tools/processes.js +51 -12
- package/dist/tools/processes.js.map +1 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/runtime.js +17 -5
- package/dist/tools/runtime.js.map +1 -0
- package/dist/tools/tabletop.js +165 -29
- package/dist/tools/tabletop.js.map +1 -0
- package/dist/tools/vcs.js +189 -27
- package/dist/tools/vcs.js.map +1 -0
- package/dist/toolsets.js.map +1 -0
- package/dist/version.js.map +1 -0
- package/dist/wire-defaults.js.map +1 -0
- package/package.json +2 -1
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
name="Breakpoint MCP"
|
|
4
4
|
description="Exposes the live Godot editor and the running game to an MCP host so an AI assistant can drive them: scene/node/resource CRUD with full undo/redo, project settings, ClassDB, editor + in-game screenshots, and an in-game runtime bridge (live SceneTree, property get/set, method calls, signals, input injection, Performance monitors). Pairs with the breakpoint-mcp MCP host."
|
|
5
5
|
author="James Livingston"
|
|
6
|
-
version="1.
|
|
6
|
+
version="1.15.0"
|
|
7
7
|
script="plugin.gd"
|
|
@@ -20,7 +20,7 @@ extends Node
|
|
|
20
20
|
## and the process that is already running keeps the addon it loaded. Held in lockstep
|
|
21
21
|
## with `plugin.cfg` and with `operations.gd`'s copy by contract_check check 14, which
|
|
22
22
|
## exists because two of those literals disagreed for two releases.
|
|
23
|
-
const ADDON_VERSION := "1.
|
|
23
|
+
const ADDON_VERSION := "1.15.0"
|
|
24
24
|
const Codec := preload("res://addons/breakpoint_mcp/variant_json.gd")
|
|
25
25
|
const Remedies := preload("res://addons/breakpoint_mcp/error_remedies.gd")
|
|
26
26
|
const DEFAULT_PORT := 9081
|
|
@@ -1131,8 +1131,25 @@ func _node_add(params: Dictionary) -> Dictionary:
|
|
|
1131
1131
|
var nm := String(params.get("name", ""))
|
|
1132
1132
|
if nm != "":
|
|
1133
1133
|
child.name = nm
|
|
1134
|
-
|
|
1135
|
-
|
|
1134
|
+
# ๐ด 283 ยง1's DEFECT ON THE OTHER PLANE, AND THIS ONE COULD NOT EVEN BE SEEN.
|
|
1135
|
+
# `force_readable_name = true` for the same reason the twenty-two editor sites now
|
|
1136
|
+
# pass it: Godot's default answers ANY name collision with the machine form
|
|
1137
|
+
# `@Type@N`, so a caller asking twice for the same name got a node it could not
|
|
1138
|
+
# address. Worse here than there โ this reply carried `path` and `type` and NO
|
|
1139
|
+
# `name`, so nothing in the answer even hinted the name had been replaced. 1.42.0's
|
|
1140
|
+
# rule about the second call site, and 282 ยง11.1 paying it again.
|
|
1141
|
+
# ๐ด ONLY A NAME THE CALLER ASKED FOR CAN BE COERCED, and the first draft of this got
|
|
1142
|
+
# it wrong in a way the live probe caught: an unparented `ClassDB.instantiate()` node
|
|
1143
|
+
# has an EMPTY name, so reading `requested` off the node reported every unnamed add as
|
|
1144
|
+
# `coerced` from `""`. That is noise dressed as a diagnosis โ the caller asked for
|
|
1145
|
+
# nothing, so nothing was taken from it. The editor plane cannot hit this because it
|
|
1146
|
+
# always writes a default name before adding; this plane deliberately does not.
|
|
1147
|
+
parent.add_child(child, true)
|
|
1148
|
+
var out := {"added": true, "path": _path_of(child), "name": String(child.name), "type": child.get_class()}
|
|
1149
|
+
if nm != "" and String(child.name) != nm:
|
|
1150
|
+
out["coerced"] = true
|
|
1151
|
+
out["requested"] = nm
|
|
1152
|
+
return _ok(out)
|
|
1136
1153
|
|
|
1137
1154
|
|
|
1138
1155
|
func _node_remove(params: Dictionary) -> Dictionary:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addon-version.js","sourceRoot":"","sources":["../src/addon-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,0NAA0N,CAAC;AAE7N;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7D,CAAC;AAKD;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAwB,EAAE,OAAsB;IACnF,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAmB,EAAE;QAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../src/annotations.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge.js
CHANGED
|
@@ -270,6 +270,64 @@ export class BridgeClient {
|
|
|
270
270
|
* for a later, unrelated drop.
|
|
271
271
|
*/
|
|
272
272
|
lastSocketError = null;
|
|
273
|
+
/**
|
|
274
|
+
* 283 ยง2 โ WHAT THE PEER ON THIS PORT HAS ACTUALLY PROVED ABOUT ITSELF.
|
|
275
|
+
*
|
|
276
|
+
* ๐ด FOUR READERS OF ONE FACT AND TWO OF THEM WERE WRONG. `doctor` says "open,
|
|
277
|
+
* but no Breakpoint bridge answered" and `dbg_launch` refuses with the port
|
|
278
|
+
* conflict spelled out; the `runtime_*` family โ reading the same socket โ
|
|
279
|
+
* answered a foreign Godot with `bridge_closed`'s *"the running game closed the
|
|
280
|
+
* connection in an orderly way โฆ which is what a shutdown looks like from here"*
|
|
281
|
+
* when there was never a game of ours, and answered a foreign listener that
|
|
282
|
+
* simply never speaks by hanging for the full timeout and then saying nothing
|
|
283
|
+
* about the port at all. Measured against a headless game leaked from a probe
|
|
284
|
+
* run six days earlier that was still holding 9081.
|
|
285
|
+
*
|
|
286
|
+
* ๐ต THE HOST ALREADY HELD BOTH ANSWERS AND NEVER LOOKED AT THEM. A peer that
|
|
287
|
+
* speaks the protocol sends a frame; a peer whose secret is wrong sends exactly
|
|
288
|
+
* one โ `{"id": null, "ok": false, "error": {"code": "unauthorized"}}` โ and
|
|
289
|
+
* closes. So "is this our bridge" and "is this our bridge with the wrong key"
|
|
290
|
+
* are DERIVED from what arrived on the wire, not from a roster of ports, and the
|
|
291
|
+
* two failures that look most alike get different sentences.
|
|
292
|
+
*
|
|
293
|
+
* ๐ด THE CODES DO NOT MOVE. `bridge_closed` and the timeout code are branched on
|
|
294
|
+
* by callers and tests (264, 268); what changes is the remedy a human reads โ
|
|
295
|
+
* 254's rule about fixing what the reader acts on and leaving the wire
|
|
296
|
+
* vocabulary alone.
|
|
297
|
+
*/
|
|
298
|
+
sawBridgeFrame = false;
|
|
299
|
+
sawAuthDenial = false;
|
|
300
|
+
/**
|
|
301
|
+
* DEFINITIVE: the peer spoke our protocol and refused this key.
|
|
302
|
+
*
|
|
303
|
+
* ๐ต STRONG ENOUGH TO OVERRULE THE CLOSE CAUSE, because it is not an inference.
|
|
304
|
+
* The peer sent `unauthorized` and hung up, so "why did the socket go away" โ
|
|
305
|
+
* which is all `closeRemedy` can answer โ is the wrong question: it went away on
|
|
306
|
+
* purpose, and the reader needs the secret, not the errno.
|
|
307
|
+
*/
|
|
308
|
+
authDenialRemedy() {
|
|
309
|
+
if (!this.sawAuthDenial)
|
|
310
|
+
return undefined;
|
|
311
|
+
return `The peer on ${this.host}:${this.port} answered the Breakpoint handshake with "unauthorized", so something IS listening with our protocol but not with this project's secret โ another Godot instance, or a stale key. Close other Godot instances, or delete res://.godot/breakpoint_mcp.secret and reopen the project to remint it.`;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* INFERENCE: nothing on this connection has ever spoken the protocol.
|
|
315
|
+
*
|
|
316
|
+
* ๐ด AND IT IS ONLY SAFE ON THE DEADLINE, WHICH IS WHY IT IS NOT ON THE CLOSE
|
|
317
|
+
* PATH. A bridge that IS ours also sends no frame if the game is killed before it
|
|
318
|
+
* can answer โ so on a close, "never spoke" cannot separate a foreign listener
|
|
319
|
+
* from our own peer dying mid-request, and asserting it there would throw away
|
|
320
|
+
* 264's errno distinction between a reset and a clean shutdown to say something
|
|
321
|
+
* weaker. Past a FULL deadline on a socket that accepted the connection and then
|
|
322
|
+
* said nothing at all, the reading holds: that is the 15 s of silence measured at
|
|
323
|
+
* 283 against a foreign listener, where the only thing the caller was told was
|
|
324
|
+
* `timed out after 15000ms`.
|
|
325
|
+
*/
|
|
326
|
+
silentPeerRemedy() {
|
|
327
|
+
if (this.sawBridgeFrame)
|
|
328
|
+
return undefined;
|
|
329
|
+
return `Nothing on ${this.host}:${this.port} has ever spoken the Breakpoint bridge protocol on this connection, so this is not ${this.peerNoun} failing โ it is a port held by something else. Find what holds it with \`lsof -nP -iTCP:${this.port} -sTCP:LISTEN\`, or point this plane elsewhere with ${this.hostKnob} and its port knob.`;
|
|
330
|
+
}
|
|
273
331
|
connect() {
|
|
274
332
|
if (this.socket && !this.socket.destroyed)
|
|
275
333
|
return Promise.resolve(this.socket);
|
|
@@ -282,6 +340,10 @@ export class BridgeClient {
|
|
|
282
340
|
this.socket = socket;
|
|
283
341
|
this.connecting = null;
|
|
284
342
|
this.lastSocketError = null;
|
|
343
|
+
// A new socket has proved nothing yet โ 283 ยง2. Reset both, or a peer that
|
|
344
|
+
// once answered would vouch for whatever holds the port after it.
|
|
345
|
+
this.sawBridgeFrame = false;
|
|
346
|
+
this.sawAuthDenial = false;
|
|
285
347
|
this.clearReconnect();
|
|
286
348
|
// Loopback-auth handshake: if a secret is available it MUST be the first
|
|
287
349
|
// line on the connection. TCP preserves order and the addon drains lines
|
|
@@ -369,6 +431,12 @@ export class BridgeClient {
|
|
|
369
431
|
log("bridge sent non-JSON line:", line);
|
|
370
432
|
return;
|
|
371
433
|
}
|
|
434
|
+
// 283 ยง2: a parsed frame is the peer proving it speaks this protocol, and the
|
|
435
|
+
// pre-auth denial is it proving it speaks the protocol with the WRONG key. Both
|
|
436
|
+
// are recorded HERE because this is the only place a line from the peer is read.
|
|
437
|
+
this.sawBridgeFrame = true;
|
|
438
|
+
if (msg.id == null && msg.ok === false && msg.error?.code === "unauthorized")
|
|
439
|
+
this.sawAuthDenial = true;
|
|
372
440
|
// D3: unsolicited change events carry an `event` field and no request id.
|
|
373
441
|
if (msg.event === "resource.changed" && typeof msg.uri === "string") {
|
|
374
442
|
const uri = msg.uri;
|
|
@@ -450,7 +518,13 @@ export class BridgeClient {
|
|
|
450
518
|
// sentence, differing by one parenthetical nothing instructed the caller to act on.
|
|
451
519
|
// `cause.code` separates them, and this is the one close site whose class has a field
|
|
452
520
|
// to put the answer in โ see close-cause.ts for the four that do not.
|
|
453
|
-
|
|
521
|
+
// 283 ยง2: closeRemedy answers "why did the peer go away", which is the wrong
|
|
522
|
+
// question when the peer hung up ON PURPOSE because our key was wrong โ the case
|
|
523
|
+
// that read as *the running game closed the connection in an orderly way โฆ which
|
|
524
|
+
// is what a shutdown looks like from here* against a foreign Godot holding 9081.
|
|
525
|
+
// Only the DEFINITIVE signal is allowed to overrule the errno here; see
|
|
526
|
+
// silentPeerRemedy for why the weaker one is not.
|
|
527
|
+
const remedy = this.authDenialRemedy() ?? closeRemedy(cause, this.peerNoun);
|
|
454
528
|
for (const [, p] of this.pending) {
|
|
455
529
|
clearTimeout(p.timer);
|
|
456
530
|
p.reject(new BridgeError("bridge_closed", `Bridge connection closed before a response arrived${detail}`, remedy));
|
|
@@ -487,7 +561,17 @@ export class BridgeClient {
|
|
|
487
561
|
// line โ a peer that never answered really does leave nothing behind โ which is
|
|
488
562
|
// why the one cause the host can supply comes from outside the socket: its own
|
|
489
563
|
// debugger holding the game. See `setHoldProbe`, and 264's census for the rest.
|
|
490
|
-
|
|
564
|
+
// 283 ยง2: a full timeout against a port that has never produced a frame is
|
|
565
|
+
// not a slow peer, and saying only "timed out after 15000ms" left the user
|
|
566
|
+
// with no next action at all.
|
|
567
|
+
//
|
|
568
|
+
// ๐ด THE HOLD PROBE STILL GOES FIRST, AND THE ORDER IS THE ARGUMENT. It reports
|
|
569
|
+
// a POSITIVE fact this host owns โ our own debugger has the game stopped โ while
|
|
570
|
+
// the stranger reading is an INFERENCE from silence. When the debugger is
|
|
571
|
+
// holding, the peer IS ours and is merely halted, so "nothing here speaks our
|
|
572
|
+
// protocol" would be a confident wrong answer. Inference fills the gap the
|
|
573
|
+
// positive fact leaves; it never overrules it.
|
|
574
|
+
reject(new BridgeError(BRIDGE_TIMEOUT_CODE, `Bridge request '${method}' timed out after ${timeoutMs}ms`, this.holdProbe?.() ?? this.authDenialRemedy() ?? this.silentPeerRemedy() ?? undefined));
|
|
491
575
|
}, timeoutMs);
|
|
492
576
|
this.pending.set(id, { resolve: resolve, reject, timer, method });
|
|
493
577
|
socket.write(payload, (err) => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAyBhE,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,IAAI,CAAS;IACb;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAU;IAChB,YAAY,IAAY,EAAE,OAAe,EAAE,MAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,OAAQ,GAA+C,EAAE,IAAI,KAAK,kBAAkB,CAAC;AACvF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,CAAC,GAAI,GAA+C,EAAE,MAAM,CAAC;IACnE,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,iBAAiB,IAAI,GAAG,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,oFAAoF;IACpF,iFAAiF;IACjF,8BAA8B,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAY;IAC5D,OAAO,CACL,mBAAmB,MAAM,0DAA0D;QACnF,2EAA2E,KAAK,CAAC,OAAO,IAAI,CAC7F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAY;IAYJ;IACA;IACA;IACA;IAUA;IAQA;IAhCX,MAAM,GAAsB,IAAI,CAAC;IACjC,UAAU,GAA+B,IAAI,CAAC;IAC9C,MAAM,GAAG,EAAE,CAAC;IACZ,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC7C,sFAAsF;IACrE,MAAM,CAAwB;IACvC,cAAc,GAAG,IAAI,GAAG,EAA2B,CAAC;IACpD,aAAa,GAAG,KAAK,CAAC;IACtB,cAAc,GAA0B,IAAI,CAAC;IAErD,YACmB,IAAY,EACZ,IAAY,EACZ,gBAAwB,EACxB,QAAQ,eAAe;IACxC,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,yEAAyE;IACzE,yDAAyD;IACxC,OAAO,kNAAkN;IAC1O;;;;;;OAMG;IACc,cAAoC;IACrD;;;;;;;;;OASG;IACH,YAAY,GAAG,8BAA8B,EAC7C,QAAQ,GAAG,YAAY;IACvB;;;;;;;;OAQG;IACH,QAAQ,GAAG,wBAAwB;QA3ClB,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,UAAK,GAAL,KAAK,CAAkB;QAUvB,SAAI,GAAJ,IAAI,CAAqN;QAQzN,mBAAc,GAAd,cAAc,CAAsB;QAwBrD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAS,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1E,oFAAoF;QACpF,qFAAqF;QACrF,8BAA8B;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,wFAAwF;IACvE,QAAQ,CAAS;IAElC,kFAAkF;IACjE,QAAQ,CAAS;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,YAAY,CAAC,KAA+B;QAC1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAEO,SAAS,GAAsC,IAAI,CAAC;IAE5D,mEAAmE;IACnE,iBAAiB,CAAC,EAA2B;QAC3C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;;OAWG;IACK,eAAe,GAAiB,IAAI,CAAC;IAE7C;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACK,cAAc,GAAG,KAAK,CAAC;IACvB,aAAa,GAAG,KAAK,CAAC;IAE9B;;;;;;;OAOG;IACK,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,eAAe,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,iSAAiS,CAAC;IAChV,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,cAAc,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,sFAAsF,IAAI,CAAC,QAAQ,4FAA4F,IAAI,CAAC,IAAI,uDAAuD,IAAI,CAAC,QAAQ,qBAAqB,CAAC;IAC/U,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAE5C,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1E,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,2EAA2E;gBAC3E,kEAAkE;gBAClE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,yEAAyE;gBACzE,yEAAyE;gBACzE,yEAAyE;gBACzE,oEAAoE;gBACpE,uEAAuE;gBACvE,oEAAoE;gBACpE,yEAAyE;gBACzE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,IAAI,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9E,CAAC;gBACD,GAAG,CAAC,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,0EAA0E;gBAC1E,yEAAyE;gBACzE,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;gBAC3B,gFAAgF;gBAChF,2EAA2E;gBAC3E,iFAAiF;gBACjF,mEAAmE;gBACnE,8EAA8E;gBAC9E,8EAA8E;gBAC9E,gFAAgF;gBAChF,iEAAiE;gBACjE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,CACJ,IAAI,WAAW,CACb,kBAAkB,EAClB,0BAA0B,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,GAAG,EAC9G,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CACjD,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CACxB,GAAG,EAAE,GAAE,CAAC,EACR,GAAG,EAAE;YACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO;QAClD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CACjB,GAAG,EAAE,GAAE,CAAC,EACR,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAC/B,CAAC;QACJ,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,+DAA+D;QAC/D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;IAChC,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,KAAsB;QACnC,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1E,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,IAAI,GAOH,CAAC;QACF,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,8EAA8E;QAC9E,gFAAgF;QAChF,iFAAiF;QACjF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,cAAc;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QACxG,0EAA0E;QAC1E,IAAI,GAAG,CAAC,KAAK,KAAK,kBAAkB,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACpB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,EAAE,CAAC,GAAG,CAAC,CAAC;gBACV,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,kCAAkC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,6EAA6E;YAC7E,2EAA2E;YAC3E,4EAA4E;YAC5E,yEAAyE;YACzE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,mFAAmF;YACnF,iFAAiF;YACjF,kFAAkF;YAClF,iDAAiD;YACjD,EAAE;YACF,iFAAiF;YACjF,iFAAiF;YACjF,2EAA2E;YAC3E,+EAA+E;YAC/E,kFAAkF;YAClF,4EAA4E;YAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;YAChC,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM;oBAAE,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;oBACpG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;YAC5E,2EAA2E;YAC3E,0EAA0E;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,mEAAmE;YACnE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,sFAAsF;QACtF,mFAAmF;QACnF,oFAAoF;QACpF,sFAAsF;QACtF,sEAAsE;QACtE,6EAA6E;QAC7E,iFAAiF;QACjF,iFAAiF;QACjF,iFAAiF;QACjF,wEAAwE;QACxE,kDAAkD;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,MAAM,CACN,IAAI,WAAW,CAAC,eAAe,EAAE,qDAAqD,MAAM,EAAE,EAAE,MAAM,CAAC,CACxG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,kFAAkF;QAClF,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACnD,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,OAAO,CACX,MAAc,EACd,SAAkC,EAAE,EACpC,SAAS,GAAG,IAAI,CAAC,gBAAgB;QAEjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QAE9D,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,oEAAoE;gBACpE,+CAA+C;gBAC/C,EAAE;gBACF,uEAAuE;gBACvE,4EAA4E;gBAC5E,+EAA+E;gBAC/E,6EAA6E;gBAC7E,+EAA+E;gBAC/E,gFAAgF;gBAChF,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBACxC,iFAAiF;gBACjF,mFAAmF;gBACnF,mFAAmF;gBACnF,kFAAkF;gBAClF,+EAA+E;gBAC/E,gFAAgF;gBAChF,+EAA+E;gBAC/E,gFAAgF;gBAChF,2EAA2E;gBAC3E,2EAA2E;gBAC3E,8BAA8B;gBAC9B,EAAE;gBACF,gFAAgF;gBAChF,iFAAiF;gBACjF,0EAA0E;gBAC1E,8EAA8E;gBAC9E,2EAA2E;gBAC3E,+CAA+C;gBAC/C,MAAM,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,mBAAmB,MAAM,qBAAqB,SAAS,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;YACnM,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAA+B,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC5B,IAAI,GAAG,EAAE,CAAC;oBACR,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,8EAA8E;oBAC9E,6EAA6E;oBAC7E,gFAAgF;oBAChF,+EAA+E;oBAC/E,4EAA4E;oBAC5E,yEAAyE;oBACzE,2EAA2E;oBAC3E,iFAAiF;oBACjF,2EAA2E;oBAC3E,+EAA+E;oBAC/E,EAAE;oBACF,+EAA+E;oBAC/E,2EAA2E;oBAC3E,gFAAgF;oBAChF,+EAA+E;oBAC/E,kCAAkC;oBAClC,MAAM,CAAC,IAAI,WAAW,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBAClG,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF"}
|
package/dist/capabilities.js
CHANGED
|
@@ -103,6 +103,95 @@ export function droppedTools(enabled) {
|
|
|
103
103
|
.filter((name) => !toolAllowed(name, enabled))
|
|
104
104
|
.sort();
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* HANDLE PRODUCERS โ the pairs where one tool CONSUMES an opaque handle that
|
|
108
|
+
* exactly one other tool MINTS.
|
|
109
|
+
*
|
|
110
|
+
* ๐ด A CAPABILITY BOUNDARY CAN RUN THROUGH THE MIDDLE OF A PAIR, AND UNTIL 296
|
|
111
|
+
* NOTHING ASKED WHETHER IT DID. Every reader above asks the same question โ is
|
|
112
|
+
* the right tool dropped? `capabilities.test.ts` asserts the tagging is total
|
|
113
|
+
* and correct, `droppedToolMessage` asserts a dropped name is never `not found`,
|
|
114
|
+
* and both were right. Neither asks the OTHER question: of the tools left BEHIND
|
|
115
|
+
* on the secure-default surface, can any caller still use them?
|
|
116
|
+
*
|
|
117
|
+
* Measured on a real default surface (driving the shipped server over stdio):
|
|
118
|
+
* `godot_stop` and `godot_output` both take an `id` that ONLY `godot_run_managed`
|
|
119
|
+
* returns, and that tool is `code-execution`. So on a default install those two
|
|
120
|
+
* unprivileged tools can answer exactly one thing โ `No managed process with id
|
|
121
|
+
* "โฆ"` โ for every input a caller can construct, and the sentence gives no hint
|
|
122
|
+
* that the reason is policy rather than a typo. `runtime_peers_digest` and
|
|
123
|
+
* `runtime_peer_stop` are the same pair one plane over, behind
|
|
124
|
+
* `runtime_spawn_peers`.
|
|
125
|
+
*
|
|
126
|
+
* ๐ต THE TABLE IS THE POPULATION, NOT THE FOUR ROWS. A row is owed by any tool
|
|
127
|
+
* whose input names another tool as the source of its value; `capabilities.test.ts`
|
|
128
|
+
* derives that set from the REGISTERED surface and refuses an undeclared one, so
|
|
129
|
+
* the next handle-taking tool cannot join the surface without this file hearing
|
|
130
|
+
* about it. A row whose producer is unprivileged is legal and carries no clause โ
|
|
131
|
+
* such rows are here so the table reads as total rather than as a list of
|
|
132
|
+
* complaints.
|
|
133
|
+
*/
|
|
134
|
+
export const HANDLE_PRODUCERS = {
|
|
135
|
+
// Cross-boundary โ the producer is `code-execution` and the consumer is not.
|
|
136
|
+
godot_output: { field: "id", producer: "godot_run_managed" },
|
|
137
|
+
godot_stop: { field: "id", producer: "godot_run_managed" },
|
|
138
|
+
runtime_peer_stop: { field: "id", producer: "runtime_spawn_peers" },
|
|
139
|
+
runtime_peers_digest: { field: "peers", producer: "runtime_spawn_peers" },
|
|
140
|
+
// ๐ต AND THE SIX THAT SPAN NOTHING, WHICH ARE THE HALF THAT MAKES THIS A TABLE.
|
|
141
|
+
// The two debug planes hand a caller a frame id and then a variables ref, each
|
|
142
|
+
// minted by the tool before it, and every one of those producers is unprivileged โ
|
|
143
|
+
// so these rows carry no clause on any surface. They are declared because the
|
|
144
|
+
// question this table answers is *which tools take a handle somebody else mints*,
|
|
145
|
+
// and a table that held only the four unhappy pairs would be a list of today's
|
|
146
|
+
// complaints. Tag `dbg_scopes` tomorrow and `orphanedConsumers` says so the same
|
|
147
|
+
// day, without anyone remembering to look.
|
|
148
|
+
dbg_scopes: { field: "frame_id", producer: "dbg_stack_trace" },
|
|
149
|
+
dbg_variables: { field: "variables_ref", producer: "dbg_scopes" },
|
|
150
|
+
dbg_set_variable: { field: "variables_ref", producer: "dbg_scopes" },
|
|
151
|
+
cs_dbg_scopes: { field: "frame_id", producer: "cs_dbg_stack_trace" },
|
|
152
|
+
cs_dbg_variables: { field: "variables_ref", producer: "cs_dbg_scopes" },
|
|
153
|
+
cs_dbg_set_variable: { field: "variables_ref", producer: "cs_dbg_scopes" },
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* The consumers whose producer is withheld under `enabled` โ the tools that are
|
|
157
|
+
* ON the surface and cannot be reached from it. Sorted, derived, never restated.
|
|
158
|
+
*/
|
|
159
|
+
export function orphanedConsumers(enabled) {
|
|
160
|
+
return Object.entries(HANDLE_PRODUCERS)
|
|
161
|
+
.filter(([consumer, row]) => toolAllowed(consumer, enabled) && !toolAllowed(row.producer, enabled))
|
|
162
|
+
.map(([consumer]) => consumer)
|
|
163
|
+
.sort();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The sentence a consumer appends to its own refusal when nothing on this surface
|
|
167
|
+
* can mint what it consumes. Empty string when the producer IS reachable โ there
|
|
168
|
+
* the caller simply passed a handle that has expired or never existed, which is
|
|
169
|
+
* the ordinary case and owes no policy explanation.
|
|
170
|
+
*
|
|
171
|
+
* ๐ด IT IS APPENDED TO A REFUSAL AND NEVER SUBSTITUTED FOR ONE. The caller's own
|
|
172
|
+
* mistake stays first in the sentence; this explains why no correct input exists.
|
|
173
|
+
*/
|
|
174
|
+
export function producerWithheldClause(consumer, enabled) {
|
|
175
|
+
const row = HANDLE_PRODUCERS[consumer];
|
|
176
|
+
if (!row)
|
|
177
|
+
return "";
|
|
178
|
+
return withheldProducerSentence(row.field, row.producer, enabled);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The same sentence addressed by (field, producer) rather than by consumer โ for the
|
|
182
|
+
* call sites that serve a WHOLE family through one message. `PeerRegistry.unknownPeer`
|
|
183
|
+
* is the only one: twenty-five runtime tools take an optional `peer`, and the registry
|
|
184
|
+
* that refuses an unknown id does not know which of them is asking.
|
|
185
|
+
*/
|
|
186
|
+
export function withheldProducerSentence(field, producer, enabled) {
|
|
187
|
+
if (toolAllowed(producer, enabled))
|
|
188
|
+
return "";
|
|
189
|
+
const groups = (TOOL_CAPABILITIES[producer] ?? []).join(", ");
|
|
190
|
+
return (` โ and on this surface no \`${field}\` can exist: \`${producer}\`, the only tool that mints one, ` +
|
|
191
|
+
`is WITHHELD BY POLICY in the higher-trust group '${groups}'. This is a configuration, not a missing feature. ` +
|
|
192
|
+
`Enable it with BREAKPOINT_PRIVILEGED_GROUPS=${groups} in this server's env (or \`npx breakpoint-mcp init ` +
|
|
193
|
+
`--trust full\`) and restart, or read the godot://capabilities resource.`);
|
|
194
|
+
}
|
|
106
195
|
/**
|
|
107
196
|
* Wrap `server.registerTool` to DROP any tool whose capability group isn't
|
|
108
197
|
* enabled, so a disabled group's tools never reach `tools/list`. Mirrors
|
|
@@ -243,6 +332,18 @@ export function registerCapabilitiesResource(server, enabled) {
|
|
|
243
332
|
default_secure: enabled.size === 0,
|
|
244
333
|
enabled_groups: [...enabled].sort(),
|
|
245
334
|
dropped_tools: droppedTools(enabled),
|
|
335
|
+
// ๐ 296 โ THE SECOND HALF OF WHAT A GROUP COSTS, AND IT WAS UNPRINTED.
|
|
336
|
+
// `dropped_tools` says what is gone. It does not say that four tools which are
|
|
337
|
+
// STILL HERE cannot be used, because the only tool that produces what they
|
|
338
|
+
// consume is in the dropped set. That is a fact about the surface a caller is
|
|
339
|
+
// reading, so it belongs beside the dropped list rather than only inside the
|
|
340
|
+
// refusal they get after trying โ an agent reads this resource to plan, and
|
|
341
|
+
// planning around a tool that can only refuse is the mistake worth preventing.
|
|
342
|
+
orphaned_consumers: orphanedConsumers(enabled).map((consumer) => ({
|
|
343
|
+
tool: consumer,
|
|
344
|
+
consumes: HANDLE_PRODUCERS[consumer]?.field ?? "",
|
|
345
|
+
produced_only_by: HANDLE_PRODUCERS[consumer]?.producer ?? "",
|
|
346
|
+
})),
|
|
246
347
|
how_to_enable: `Set BREAKPOINT_PRIVILEGED_GROUPS in the MCP server env (comma-separated), from: ${groupList}, or 'all'. ` +
|
|
247
348
|
"Or re-run `npx breakpoint-mcp init --trust full` for a guided setup.",
|
|
248
349
|
groups,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/cli/clients.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -41,6 +41,27 @@ import { BridgeClient } from "../bridge.js";
|
|
|
41
41
|
import { resolveBridgeSecret } from "../secret.js";
|
|
42
42
|
import { ADDON_REL, ADDON_SKEW_HINT, compareAddonVersions, readAddonVersion, } from "../addon-version.js";
|
|
43
43
|
import { resolveBundledAddon } from "./init.js";
|
|
44
|
+
/**
|
|
45
|
+
* The withheld population, DERIVED from the checks' own `withholds` and from
|
|
46
|
+
* which names the report actually carries.
|
|
47
|
+
*
|
|
48
|
+
* A gating check that PASSED withholds nothing, so the subtraction is against
|
|
49
|
+
* the report rather than against the branch: a future check that starts
|
|
50
|
+
* producing one of its dependents on some other path drops out of this list
|
|
51
|
+
* without anybody remembering to edit it.
|
|
52
|
+
*/
|
|
53
|
+
export function withheldChecks(checks) {
|
|
54
|
+
const present = new Set(checks.map((c) => c.name));
|
|
55
|
+
const out = new Set();
|
|
56
|
+
for (const c of checks) {
|
|
57
|
+
if (c.status === "ok" || !c.withholds)
|
|
58
|
+
continue;
|
|
59
|
+
for (const n of c.withholds)
|
|
60
|
+
if (!present.has(n))
|
|
61
|
+
out.add(n);
|
|
62
|
+
}
|
|
63
|
+
return [...out].sort();
|
|
64
|
+
}
|
|
44
65
|
/**
|
|
45
66
|
* Which bridges a run insists on.
|
|
46
67
|
*
|
|
@@ -99,6 +120,26 @@ export function isPluginEnabled(projectGodotText) {
|
|
|
99
120
|
}
|
|
100
121
|
return false;
|
|
101
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* The minimum engine this host supports, as ONE pair of numbers.
|
|
125
|
+
*
|
|
126
|
+
* ๐ด 282 โ `USER_GUIDE.md` ยง2 and this check's own failure hint have both said
|
|
127
|
+
* *4.2+* since they were written, and nothing anywhere enforced it. Written here
|
|
128
|
+
* as the single literal both the check and its self-test read, because the
|
|
129
|
+
* alternative is the shape 203 ยง2 has a rule about: a number in a sentence and a
|
|
130
|
+
* number in a branch, agreeing until somebody edits one of them.
|
|
131
|
+
*/
|
|
132
|
+
export const MIN_GODOT = [4, 2];
|
|
133
|
+
/**
|
|
134
|
+
* The engine version a `--version` line names, or `null` when it names none.
|
|
135
|
+
*
|
|
136
|
+
* Godot prints `4.4.1.stable.official.f47bb5e` or `4.3.stable.official`; the
|
|
137
|
+
* pair is all this check needs and the rest is deliberately not parsed.
|
|
138
|
+
*/
|
|
139
|
+
export function parseGodotVersion(line) {
|
|
140
|
+
const m = /^(\d+)\.(\d+)(?:[.\s]|$)/.exec(line.trim());
|
|
141
|
+
return m ? [Number(m[1]), Number(m[2])] : null;
|
|
142
|
+
}
|
|
102
143
|
function checkGodotBinary(bin, timeoutMs) {
|
|
103
144
|
const res = spawnSync(bin, ["--version"], { timeout: timeoutMs, encoding: "utf8" });
|
|
104
145
|
if (res.error) {
|
|
@@ -112,6 +153,34 @@ function checkGodotBinary(bin, timeoutMs) {
|
|
|
112
153
|
};
|
|
113
154
|
}
|
|
114
155
|
const version = (res.stdout ?? "").trim().split(/\r?\n/)[0] || "(no version output)";
|
|
156
|
+
// ๐ด 282 โ THE PASS PATH USED TO ACCEPT ANYTHING THAT SPAWNED. Measured on the
|
|
157
|
+
// published 1.82.1: `GODOT_BIN=/bin/ls` produced `โ godot-binary /bin/ls โ ls
|
|
158
|
+
// (GNU coreutils) 9.4`, and a real Godot 3.5 binary passed a check whose own
|
|
159
|
+
// failure hint says *Install Godot 4.2+*. `spawnSync` not erroring answers
|
|
160
|
+
// "something ran", which is not the question this row's name asks โ 276's *a
|
|
161
|
+
// column with no stated predicate cannot be wrong*, spelled as a check whose
|
|
162
|
+
// predicate was the absence of an exception.
|
|
163
|
+
const parsed = parseGodotVersion(version);
|
|
164
|
+
if (parsed === null) {
|
|
165
|
+
return {
|
|
166
|
+
name: "godot-binary",
|
|
167
|
+
status: "fail",
|
|
168
|
+
severity: "required",
|
|
169
|
+
detail: `${bin} ran but did not report a Godot version (${version})`,
|
|
170
|
+
hint: `That binary answered '--version' with something that is not a Godot version. Point GODOT_BIN at the Godot executable itself (on macOS: /Applications/Godot.app/Contents/MacOS/Godot).`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const [maj, min] = parsed;
|
|
174
|
+
const [needMaj, needMin] = MIN_GODOT;
|
|
175
|
+
if (maj < needMaj || (maj === needMaj && min < needMin)) {
|
|
176
|
+
return {
|
|
177
|
+
name: "godot-binary",
|
|
178
|
+
status: "fail",
|
|
179
|
+
severity: "required",
|
|
180
|
+
detail: `${bin} โ ${version} (below the minimum ${needMaj}.${needMin})`,
|
|
181
|
+
hint: `This host needs Godot ${needMaj}.${needMin} or newer. Install it and put it on PATH, or set GODOT_BIN to its absolute path.`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
115
184
|
return {
|
|
116
185
|
name: "godot-binary",
|
|
117
186
|
status: "ok",
|
|
@@ -179,7 +248,16 @@ function checkAddon(projectPath) {
|
|
|
179
248
|
status: "skip",
|
|
180
249
|
severity: "info",
|
|
181
250
|
detail: `no project.godot at ${projectPath}`,
|
|
182
|
-
|
|
251
|
+
// ๐ด 282 โ THE HINT NAMED A FLAG THAT DOES NOT EXIST ON ONE OF ITS TWO
|
|
252
|
+
// SURFACES. The same `Check` is returned by the `breakpoint_doctor` MCP
|
|
253
|
+
// tool, whose input schema is `additionalProperties: false` over
|
|
254
|
+
// `require_live`, `live_level`, `include_csharp`, `timeout_ms` โ there is
|
|
255
|
+
// no `--project` to pass in a conversation, and an assistant reading the
|
|
256
|
+
// remedy would try an argument that cannot be accepted. Both remedies are
|
|
257
|
+
// named because the reader is sometimes a terminal and sometimes not.
|
|
258
|
+
hint: "Point this at your Godot project: pass `--project <dir>` on the command line, " +
|
|
259
|
+
"or set GODOT_PROJECT in the server's environment and restart the server.",
|
|
260
|
+
withholds: ["addon-installed", "addon-version", "addon-enabled"],
|
|
183
261
|
},
|
|
184
262
|
];
|
|
185
263
|
}
|
|
@@ -428,6 +506,7 @@ export async function runDoctorChecks(config, opts) {
|
|
|
428
506
|
status: "fail",
|
|
429
507
|
severity,
|
|
430
508
|
liveness,
|
|
509
|
+
tier: b.tier,
|
|
431
510
|
detail: `${b.host}:${b.port} unreachable`,
|
|
432
511
|
hint: b.hint,
|
|
433
512
|
};
|
|
@@ -448,6 +527,7 @@ export async function runDoctorChecks(config, opts) {
|
|
|
448
527
|
status: "fail",
|
|
449
528
|
severity,
|
|
450
529
|
liveness,
|
|
530
|
+
tier: b.tier,
|
|
451
531
|
detail: `${b.host}:${b.port} open, but no Breakpoint bridge answered`,
|
|
452
532
|
hint: "Something holds that port without speaking the bridge protocol, or the shared secret is stale. Close other Godot instances, or delete res://.godot/breakpoint_mcp.secret and reopen the editor to remint it.",
|
|
453
533
|
};
|
|
@@ -458,6 +538,7 @@ export async function runDoctorChecks(config, opts) {
|
|
|
458
538
|
status: "ok",
|
|
459
539
|
severity,
|
|
460
540
|
liveness,
|
|
541
|
+
tier: b.tier,
|
|
461
542
|
detail: `${b.host}:${b.port} reachable${b.secretEnv ? " ยท bridge answered" : ""}`,
|
|
462
543
|
};
|
|
463
544
|
}));
|
|
@@ -475,8 +556,9 @@ export async function runDoctorChecks(config, opts) {
|
|
|
475
556
|
checks.push(checkCsharpTool("csharp-lsp", config.csLspCmd));
|
|
476
557
|
checks.push(checkCsharpTool("csharp-dap", config.csDapCmd));
|
|
477
558
|
}
|
|
478
|
-
const
|
|
479
|
-
|
|
559
|
+
const withheld = withheldChecks(checks);
|
|
560
|
+
const ok = checks.every((c) => c.severity !== "required" || c.status !== "fail") && withheld.length === 0;
|
|
561
|
+
return { checks, ok, withheld, liveLevel: opts.liveLevel };
|
|
480
562
|
}
|
|
481
563
|
/**
|
|
482
564
|
* ๐ด `โ` IS RESERVED FOR A CHECK THAT FAILED THE RUN. An informational check
|
|
@@ -502,6 +584,19 @@ function glyph(c) {
|
|
|
502
584
|
export function summaryLine(report) {
|
|
503
585
|
const failed = report.checks.filter((c) => c.status === "fail");
|
|
504
586
|
const noted = failed.filter((c) => c.severity === "info");
|
|
587
|
+
// ๐ด 282 โ THE WITHHELD SET IS NAMED BEFORE THE FAILED SET, because it is the
|
|
588
|
+
// stronger statement: a check that failed was run and answered, and a check
|
|
589
|
+
// that was withheld was not run at all. Saying "some required checks failed"
|
|
590
|
+
// over a run that skipped three of them would be true and would still leave
|
|
591
|
+
// the reader to work out that the answer is *unknown* rather than *no*.
|
|
592
|
+
if (report.withheld.length) {
|
|
593
|
+
const gates = report.checks
|
|
594
|
+
.filter((c) => c.status !== "ok" && c.withholds?.some((n) => report.withheld.includes(n)))
|
|
595
|
+
.map((c) => c.name)
|
|
596
|
+
.join(", ");
|
|
597
|
+
return (`Not verified โ ${report.withheld.length} check(s) never ran because ${gates} did not pass: ` +
|
|
598
|
+
`${report.withheld.join(", ")}. This is not a pass; see the โณ hints above.`);
|
|
599
|
+
}
|
|
505
600
|
if (!report.ok)
|
|
506
601
|
return "Some required checks failed โ see the โณ hints above.";
|
|
507
602
|
if (noted.length === 0)
|
|
@@ -515,8 +610,28 @@ export function summaryLine(report) {
|
|
|
515
610
|
// those about the whole set is how the line contradicted the glyphs the first time.
|
|
516
611
|
const parts = [head];
|
|
517
612
|
if (live.length) {
|
|
518
|
-
|
|
519
|
-
|
|
613
|
+
// ๐ด 283 ยง4 โ THE ADVICE IS ABOUT THE INVOCATION, SO IT HAS TO READ THE
|
|
614
|
+
// INVOCATION. This sentence ended in *re-run with --require-live* no matter how
|
|
615
|
+
// the command was run, so `doctor --require-live` answered a user who had just
|
|
616
|
+
// passed the flag by telling them to pass the flag. What actually promotes a
|
|
617
|
+
// still-informational row is the level covering its OWN tier, which the row now
|
|
618
|
+
// declares โ so the remedy is derived per run instead of asserted once.
|
|
619
|
+
const names = live.map((c) => c.name).join(", ");
|
|
620
|
+
const isAre = live.length === 1 ? "is" : "are";
|
|
621
|
+
const needed = [...new Set(live.map((c) => c.tier).filter((t) => t !== undefined))];
|
|
622
|
+
const flag = needed.length === 0
|
|
623
|
+
? "--require-live"
|
|
624
|
+
: needed.length === 1 && needed[0] !== "editor"
|
|
625
|
+
? `--require-live=${needed[0]}`
|
|
626
|
+
: needed.length > 1
|
|
627
|
+
? "--require-live=all"
|
|
628
|
+
: "--require-live";
|
|
629
|
+
parts.push(report.liveLevel === "none"
|
|
630
|
+
? `${names} ${isAre} expected when the editor or the game is not running; re-run with ${flag} once the project is open in Godot.`
|
|
631
|
+
: `${names} ${isAre} still informational because \`--require-live=${report.liveLevel}\` does not cover ` +
|
|
632
|
+
`${needed.length === 1 ? `the ${needed[0]} tier` : "their tier"}; \`${flag}\` is the level that requires ` +
|
|
633
|
+
`${live.length === 1 ? "it" : "them"}, and ${live.length === 1 ? "it needs" : "they need"} the matching ` +
|
|
634
|
+
`${needed.includes("runtime") ? "game" : "editor"} to be running.`);
|
|
520
635
|
}
|
|
521
636
|
if (standing.length) {
|
|
522
637
|
parts.push(`${standing.map((c) => c.name).join(", ")} will NOT clear by starting anything โ see the โณ hint${standing.length === 1 ? "" : "s"} above.`);
|
|
@@ -528,7 +643,14 @@ function printReport(report) {
|
|
|
528
643
|
const out = ["breakpoint-mcp doctor", ""];
|
|
529
644
|
for (const c of report.checks) {
|
|
530
645
|
out.push(` ${glyph(c)} ${c.name.padEnd(width)} ${c.detail}`);
|
|
531
|
-
|
|
646
|
+
// ๐ด 282 โ `status === "fail"` DROPPED EVERY HINT THIS TOOL WROTE FOR THE
|
|
647
|
+
// OTHER TWO STATES, under a footer that says *see the โณ hints above*. The
|
|
648
|
+
// `skip` on `project` carries the remedy for the most common first-run
|
|
649
|
+
// mistake; the `ok` on `addon-version` carries *the addon is ahead of this
|
|
650
|
+
// host โ upgrade the host rather than overwriting*. Both were reachable only
|
|
651
|
+
// through `--json`, and the human-readable surface โ the one a first-run user
|
|
652
|
+
// reads โ is the one that lost them.
|
|
653
|
+
if (c.hint)
|
|
532
654
|
out.push(` โณ ${c.hint}`);
|
|
533
655
|
}
|
|
534
656
|
out.push("");
|
|
@@ -561,8 +683,27 @@ export async function runDoctor(argv) {
|
|
|
561
683
|
if (pre !== null)
|
|
562
684
|
return pre;
|
|
563
685
|
const { flags } = parsed;
|
|
686
|
+
// ๐ด 282 โ A FLAG GIVEN NO VALUE, OR A VALUE THIS PARSER CANNOT READ, IS
|
|
687
|
+
// REFUSED RATHER THAN DROPPED. Measured on the published 1.82.1:
|
|
688
|
+
// `doctor --timeout abc` and a bare `--timeout` both fell back to 1500ms in
|
|
689
|
+
// silence, and a bare `--project` silently checked the current directory โ
|
|
690
|
+
// while `--require-live=yes` on the same command line is a hard exit 2. A user
|
|
691
|
+
// who mistypes the timeout is told nothing and reads the result as a
|
|
692
|
+
// measurement taken the way they asked for.
|
|
693
|
+
if (flags.project === true) {
|
|
694
|
+
process.stderr.write("--project: expected a directory, e.g. --project /path/to/game\n");
|
|
695
|
+
return 2;
|
|
696
|
+
}
|
|
564
697
|
if (typeof flags.project === "string")
|
|
565
698
|
process.env.GODOT_PROJECT = flags.project;
|
|
699
|
+
if (flags.timeout !== undefined) {
|
|
700
|
+
const raw = typeof flags.timeout === "string" ? flags.timeout : "";
|
|
701
|
+
const n = /^\d+$/.test(raw.trim()) ? Number.parseInt(raw, 10) : NaN;
|
|
702
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
703
|
+
process.stderr.write(`--timeout: expected a positive whole number of milliseconds, got ${JSON.stringify(raw)} (default 1500)\n`);
|
|
704
|
+
return 2;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
566
707
|
const timeoutRaw = typeof flags.timeout === "string" ? Number.parseInt(flags.timeout, 10) : NaN;
|
|
567
708
|
const timeoutMs = Number.isFinite(timeoutRaw) && timeoutRaw > 0 ? timeoutRaw : 1500;
|
|
568
709
|
const liveLevel = parseLiveLevel(flags["require-live"]);
|