@satelliteoflove/godot-mcp 3.8.0 → 3.9.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/commands/game_time_commands.gd +10 -5
- package/addon/game_bridge/mcp_game_bridge.gd +227 -13
- package/addon/plugin.cfg +1 -1
- package/dist/__tests__/tools/game-time.test.js +70 -0
- package/dist/__tests__/tools/game-time.test.js.map +1 -1
- package/dist/tools/game-time.d.ts +10 -0
- package/dist/tools/game-time.d.ts.map +1 -1
- package/dist/tools/game-time.js +34 -1
- package/dist/tools/game-time.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
extends MCPBaseCommand
|
|
3
3
|
class_name MCPGameTimeCommands
|
|
4
4
|
|
|
5
|
-
# Game-time control relay: freeze / step / thaw / status execute in
|
|
6
|
-
# bridge (see mcp_game_bridge.gd); this side only forwards over the
|
|
7
|
-
# channel and waits. Timeout cascade:
|
|
8
|
-
# game time and the bridge's wall budget returns by 25s, so the
|
|
9
|
-
# timeout below fires only if the bridge is gone — and stays under the
|
|
5
|
+
# Game-time control relay: freeze / step / step_until / thaw / status execute in
|
|
6
|
+
# the game bridge (see mcp_game_bridge.gd); this side only forwards over the
|
|
7
|
+
# debugger channel and waits. Timeout cascade: a step/step_until request is
|
|
8
|
+
# capped at 20s of game time and the bridge's wall budget returns by 25s, so the
|
|
9
|
+
# 28s relay timeout below fires only if the bridge is gone — and stays under the
|
|
10
10
|
# server's 30s command timeout so errors surface typed instead of generic.
|
|
11
11
|
const BASE_TIMEOUT := 10.0
|
|
12
12
|
const STEP_TIMEOUT := 28.0
|
|
@@ -18,6 +18,7 @@ func get_commands() -> Dictionary:
|
|
|
18
18
|
return {
|
|
19
19
|
"game_time_freeze": game_time_freeze,
|
|
20
20
|
"game_time_step": game_time_step,
|
|
21
|
+
"game_time_step_until": game_time_step_until,
|
|
21
22
|
"game_time_thaw": game_time_thaw,
|
|
22
23
|
"game_time_status": game_time_status,
|
|
23
24
|
}
|
|
@@ -31,6 +32,10 @@ func game_time_step(params: Dictionary) -> Dictionary:
|
|
|
31
32
|
return await _relay("game_time_step", [params], STEP_TIMEOUT)
|
|
32
33
|
|
|
33
34
|
|
|
35
|
+
func game_time_step_until(params: Dictionary) -> Dictionary:
|
|
36
|
+
return await _relay("game_time_step_until", [params], STEP_TIMEOUT)
|
|
37
|
+
|
|
38
|
+
|
|
34
39
|
func game_time_thaw(params: Dictionary) -> Dictionary:
|
|
35
40
|
return await _relay("game_time_thaw", [params], BASE_TIMEOUT)
|
|
36
41
|
|
|
@@ -170,6 +170,9 @@ func _on_debugger_message(message: String, data: Array) -> bool:
|
|
|
170
170
|
"game_time_step":
|
|
171
171
|
_handle_game_time_step(data)
|
|
172
172
|
return true
|
|
173
|
+
"game_time_step_until":
|
|
174
|
+
_handle_game_time_step_until(data)
|
|
175
|
+
return true
|
|
173
176
|
"game_time_thaw":
|
|
174
177
|
_handle_game_time_thaw(data)
|
|
175
178
|
return true
|
|
@@ -1117,6 +1120,18 @@ var _step_events_fired := 0
|
|
|
1117
1120
|
var _step_transitions: Array = []
|
|
1118
1121
|
var _step_last_tree_paused := false
|
|
1119
1122
|
|
|
1123
|
+
# step_until adds a predicate evaluated each frame. _step_predicate is null for a
|
|
1124
|
+
# fixed-budget step, set for step_until; _step_response_type routes _finish_step's
|
|
1125
|
+
# reply to the matching command (the relay correlates by message type). _step_report
|
|
1126
|
+
# is the optional readings the agent wants back at stop time (in one round-trip,
|
|
1127
|
+
# instead of a separate observation call) — each is [{src: String, expr: Expression}].
|
|
1128
|
+
var _step_predicate: Expression = null
|
|
1129
|
+
var _step_predicate_inputs: Array = []
|
|
1130
|
+
var _step_predicate_met := false
|
|
1131
|
+
var _step_predicate_error := ""
|
|
1132
|
+
var _step_report: Array = []
|
|
1133
|
+
var _step_response_type := "game_time_step"
|
|
1134
|
+
|
|
1120
1135
|
|
|
1121
1136
|
func _send_game_time_response(msg_type: String, result: Dictionary) -> void:
|
|
1122
1137
|
EngineDebugger.send_message("godot_mcp:game_response", [msg_type, result])
|
|
@@ -1235,15 +1250,53 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1235
1250
|
# from window start). Inputs must ride inside the step: an event injected
|
|
1236
1251
|
# while frozen lands on a frame gameplay never processes, so its
|
|
1237
1252
|
# is_action_just_pressed edge would be silently missed.
|
|
1238
|
-
var
|
|
1253
|
+
var compiled := _compile_step_events(params.get("inputs", []))
|
|
1254
|
+
if compiled.has("error"):
|
|
1255
|
+
_send_game_time_response("game_time_step", {"error": compiled["error"]})
|
|
1256
|
+
return
|
|
1257
|
+
|
|
1258
|
+
# Step from a running game is allowed — it freezes first, so "advance
|
|
1259
|
+
# 500ms then wait for me" is a single atomic call.
|
|
1260
|
+
_engage_freeze()
|
|
1261
|
+
|
|
1262
|
+
_step_target_ms = float(duration_ms)
|
|
1263
|
+
_step_target_frames = frames
|
|
1264
|
+
_step_elapsed_ms = 0.0
|
|
1265
|
+
_step_gameplay_ms = 0.0
|
|
1266
|
+
_step_frames = 0
|
|
1267
|
+
_step_physics_ticks = 0
|
|
1268
|
+
_step_events = compiled["events"]
|
|
1269
|
+
_step_events_fired = 0
|
|
1270
|
+
_step_transitions = []
|
|
1271
|
+
_step_needs_settle = false
|
|
1272
|
+
_step_finish_pending = false
|
|
1273
|
+
_step_wall_exceeded = false
|
|
1274
|
+
_step_wall_start = Time.get_ticks_msec()
|
|
1275
|
+
_step_predicate = null
|
|
1276
|
+
_step_response_type = "game_time_step"
|
|
1277
|
+
_step_active = true
|
|
1278
|
+
|
|
1279
|
+
# Open the window: restore the game layer's own pause wish for the
|
|
1280
|
+
# duration. If the game's menu is holding it paused, the window still
|
|
1281
|
+
# elapses (and reports gameplay_ms ~0) — never deadlock waiting for
|
|
1282
|
+
# gameplay time that cannot come.
|
|
1283
|
+
var tree := get_tree()
|
|
1284
|
+
tree.paused = _game_paused
|
|
1285
|
+
_step_last_tree_paused = tree.paused
|
|
1286
|
+
set_physics_process(true)
|
|
1287
|
+
_update_processing()
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
func _compile_step_events(inputs: Array) -> Dictionary:
|
|
1291
|
+
# Builds the press/release timeline shared by step and step_until. start_ms
|
|
1292
|
+
# is game time from window start; returns {"error": ...} on an unknown action.
|
|
1239
1293
|
var events: Array = []
|
|
1240
1294
|
for input in inputs:
|
|
1241
1295
|
var action_name: String = input.get("action_name", "")
|
|
1242
1296
|
if action_name.is_empty():
|
|
1243
1297
|
continue
|
|
1244
1298
|
if not InputMap.has_action(action_name):
|
|
1245
|
-
|
|
1246
|
-
return
|
|
1299
|
+
return {"error": "Unknown action: %s" % action_name}
|
|
1247
1300
|
var start_ms: int = int(input.get("start_ms", 0))
|
|
1248
1301
|
var dur: int = int(input.get("duration_ms", 0))
|
|
1249
1302
|
events.append({"time": start_ms, "action": action_name, "is_press": true})
|
|
@@ -1251,30 +1304,163 @@ func _handle_game_time_step(data: Array) -> void:
|
|
|
1251
1304
|
events.sort_custom(func(a: Dictionary, b: Dictionary) -> bool:
|
|
1252
1305
|
return a.time < b.time
|
|
1253
1306
|
)
|
|
1307
|
+
return {"events": events}
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
func _build_predicate_context() -> Dictionary:
|
|
1311
|
+
# Exposes the running game to a step_until predicate: every autoload by its
|
|
1312
|
+
# own name (so `G.wave > 1` just works), plus `tree` (SceneTree) and `root`
|
|
1313
|
+
# (root Window) for tree queries like
|
|
1314
|
+
# `tree.get_nodes_in_group("enemies").size() >= 1`. Chained calls must run on
|
|
1315
|
+
# these input objects, not the Expression base instance, so they are inputs.
|
|
1316
|
+
var names: Array = []
|
|
1317
|
+
var inputs: Array = []
|
|
1318
|
+
var tree := get_tree()
|
|
1319
|
+
for prop in ProjectSettings.get_property_list():
|
|
1320
|
+
var key: String = prop.get("name", "")
|
|
1321
|
+
if not key.begins_with("autoload/"):
|
|
1322
|
+
continue
|
|
1323
|
+
var autoload_name := key.substr("autoload/".length())
|
|
1324
|
+
var node := tree.root.get_node_or_null(NodePath(autoload_name))
|
|
1325
|
+
if node == null or node == self:
|
|
1326
|
+
continue # skip the bridge's own autoload and any unresolved entry
|
|
1327
|
+
names.append(autoload_name)
|
|
1328
|
+
inputs.append(node)
|
|
1329
|
+
if not names.has("tree"):
|
|
1330
|
+
names.append("tree")
|
|
1331
|
+
inputs.append(tree)
|
|
1332
|
+
if not names.has("root"):
|
|
1333
|
+
names.append("root")
|
|
1334
|
+
inputs.append(tree.root)
|
|
1335
|
+
return {"names": PackedStringArray(names), "inputs": inputs}
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
func _sanitize_value(v: Variant) -> Variant:
|
|
1339
|
+
# Report values ride back over the debugger channel. Pass primitives through;
|
|
1340
|
+
# never try to serialize Objects/containers — a short string stand-in is
|
|
1341
|
+
# enough for the agent to see what an expression evaluated to.
|
|
1342
|
+
match typeof(v):
|
|
1343
|
+
TYPE_NIL, TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_STRING_NAME:
|
|
1344
|
+
return v
|
|
1345
|
+
_:
|
|
1346
|
+
return str(v).substr(0, 200)
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
func _compile_report(report: Array, names: PackedStringArray, inputs: Array) -> Dictionary:
|
|
1350
|
+
# Compile + validate each report expression in the predicate context. Returns
|
|
1351
|
+
# {"error": ...} if any fails up front, else {"report": [{src, expr}, ...]}.
|
|
1352
|
+
var compiled: Array = []
|
|
1353
|
+
for item in report:
|
|
1354
|
+
var s := str(item).strip_edges()
|
|
1355
|
+
if s.is_empty():
|
|
1356
|
+
continue
|
|
1357
|
+
var e := Expression.new()
|
|
1358
|
+
if e.parse(s, names) != OK:
|
|
1359
|
+
return {"error": "report expression parse error (%s): %s" % [s, e.get_error_text()]}
|
|
1360
|
+
e.execute(inputs, self)
|
|
1361
|
+
if e.has_execute_failed():
|
|
1362
|
+
return {"error": "report expression failed to evaluate (%s): %s" % [s, e.get_error_text()]}
|
|
1363
|
+
compiled.append({"src": s, "expr": e})
|
|
1364
|
+
return {"report": compiled}
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
func _evaluate_report(report_exprs: Array, inputs: Array) -> Dictionary:
|
|
1368
|
+
# Evaluate the compiled report expressions at stop time into {src: value}.
|
|
1369
|
+
var out: Dictionary = {}
|
|
1370
|
+
for item in report_exprs:
|
|
1371
|
+
var e: Expression = item["expr"]
|
|
1372
|
+
var v: Variant = e.execute(inputs, self)
|
|
1373
|
+
if e.has_execute_failed():
|
|
1374
|
+
out[item["src"]] = "<error: %s>" % e.get_error_text()
|
|
1375
|
+
else:
|
|
1376
|
+
out[item["src"]] = _sanitize_value(v)
|
|
1377
|
+
return out
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
func _handle_game_time_step_until(data: Array) -> void:
|
|
1381
|
+
var params: Dictionary = data[0] if data.size() > 0 and data[0] is Dictionary else {}
|
|
1382
|
+
if _step_active:
|
|
1383
|
+
_send_game_time_response("game_time_step_until", {"error": "Step already in progress"})
|
|
1384
|
+
return
|
|
1385
|
+
|
|
1386
|
+
var src: String = str(params.get("until", "")).strip_edges()
|
|
1387
|
+
if src.is_empty():
|
|
1388
|
+
_send_game_time_response("game_time_step_until", {"error": "step_until requires a non-empty `until` expression"})
|
|
1389
|
+
return
|
|
1390
|
+
|
|
1391
|
+
var max_ms: int = int(params.get("max_ms", STEP_MAX_MS))
|
|
1392
|
+
if max_ms <= 0:
|
|
1393
|
+
max_ms = STEP_MAX_MS
|
|
1394
|
+
max_ms = mini(max_ms, STEP_MAX_MS)
|
|
1395
|
+
|
|
1396
|
+
# Compile and validate the predicate against the live tree before committing
|
|
1397
|
+
# to a step. Expression.parse() is lenient (a malformed string can parse
|
|
1398
|
+
# clean), so a dry-run execute is what actually catches unknown identifiers
|
|
1399
|
+
# and bad member access.
|
|
1400
|
+
var ctx := _build_predicate_context()
|
|
1401
|
+
var ctx_names: PackedStringArray = ctx["names"]
|
|
1402
|
+
var ctx_inputs: Array = ctx["inputs"]
|
|
1403
|
+
var expr := Expression.new()
|
|
1404
|
+
if expr.parse(src, ctx_names) != OK:
|
|
1405
|
+
_send_game_time_response("game_time_step_until", {"error": "predicate parse error: %s" % expr.get_error_text()})
|
|
1406
|
+
return
|
|
1407
|
+
var first_value: Variant = expr.execute(ctx_inputs, self)
|
|
1408
|
+
if expr.has_execute_failed():
|
|
1409
|
+
_send_game_time_response("game_time_step_until", {"error": "predicate failed to evaluate: %s" % expr.get_error_text()})
|
|
1410
|
+
return
|
|
1411
|
+
|
|
1412
|
+
# Optional readings to return at stop time, validated up front in the same context.
|
|
1413
|
+
var report_result := _compile_report(params.get("report", []), ctx_names, ctx_inputs)
|
|
1414
|
+
if report_result.has("error"):
|
|
1415
|
+
_send_game_time_response("game_time_step_until", {"error": report_result["error"]})
|
|
1416
|
+
return
|
|
1417
|
+
var report_compiled: Array = report_result["report"]
|
|
1418
|
+
|
|
1419
|
+
var compiled := _compile_step_events(params.get("inputs", []))
|
|
1420
|
+
if compiled.has("error"):
|
|
1421
|
+
_send_game_time_response("game_time_step_until", {"error": compiled["error"]})
|
|
1422
|
+
return
|
|
1254
1423
|
|
|
1255
|
-
# Step from a running game is allowed — it freezes first, so "advance
|
|
1256
|
-
# 500ms then wait for me" is a single atomic call.
|
|
1257
1424
|
_engage_freeze()
|
|
1258
1425
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1426
|
+
# Predicate already holds: advance nothing, stay frozen, report it.
|
|
1427
|
+
if bool(first_value):
|
|
1428
|
+
var sc_result: Dictionary = {
|
|
1429
|
+
"completed": true,
|
|
1430
|
+
"frozen": true,
|
|
1431
|
+
"elapsed_ms": 0,
|
|
1432
|
+
"gameplay_ms": 0,
|
|
1433
|
+
"frames": 0,
|
|
1434
|
+
"physics_ticks": 0,
|
|
1435
|
+
"game_paused": _game_paused,
|
|
1436
|
+
"predicate_met": true,
|
|
1437
|
+
}
|
|
1438
|
+
if not report_compiled.is_empty():
|
|
1439
|
+
sc_result["report"] = _evaluate_report(report_compiled, ctx_inputs)
|
|
1440
|
+
_send_game_time_response("game_time_step_until", sc_result)
|
|
1441
|
+
return
|
|
1442
|
+
|
|
1443
|
+
_step_target_ms = float(max_ms)
|
|
1444
|
+
_step_target_frames = 0
|
|
1261
1445
|
_step_elapsed_ms = 0.0
|
|
1262
1446
|
_step_gameplay_ms = 0.0
|
|
1263
1447
|
_step_frames = 0
|
|
1264
1448
|
_step_physics_ticks = 0
|
|
1265
|
-
_step_events = events
|
|
1449
|
+
_step_events = compiled["events"]
|
|
1266
1450
|
_step_events_fired = 0
|
|
1267
1451
|
_step_transitions = []
|
|
1268
1452
|
_step_needs_settle = false
|
|
1269
1453
|
_step_finish_pending = false
|
|
1270
1454
|
_step_wall_exceeded = false
|
|
1271
1455
|
_step_wall_start = Time.get_ticks_msec()
|
|
1456
|
+
_step_predicate = expr
|
|
1457
|
+
_step_predicate_inputs = ctx_inputs
|
|
1458
|
+
_step_predicate_met = false
|
|
1459
|
+
_step_predicate_error = ""
|
|
1460
|
+
_step_report = report_compiled
|
|
1461
|
+
_step_response_type = "game_time_step_until"
|
|
1272
1462
|
_step_active = true
|
|
1273
1463
|
|
|
1274
|
-
# Open the window: restore the game layer's own pause wish for the
|
|
1275
|
-
# duration. If the game's menu is holding it paused, the window still
|
|
1276
|
-
# elapses (and reports gameplay_ms ~0) — never deadlock waiting for
|
|
1277
|
-
# gameplay time that cannot come.
|
|
1278
1464
|
var tree := get_tree()
|
|
1279
1465
|
tree.paused = _game_paused
|
|
1280
1466
|
_step_last_tree_paused = tree.paused
|
|
@@ -1325,6 +1511,19 @@ func _step_process(delta: float) -> void:
|
|
|
1325
1511
|
done = _step_frames >= _step_target_frames
|
|
1326
1512
|
else:
|
|
1327
1513
|
done = _step_elapsed_ms >= _step_target_ms
|
|
1514
|
+
|
|
1515
|
+
# step_until: re-evaluate the predicate each frame against the advancing
|
|
1516
|
+
# game. A truthy result stops the window early; a runtime failure (e.g. a
|
|
1517
|
+
# watched node was freed mid-window) ends it honestly with the error attached.
|
|
1518
|
+
if _step_predicate != null:
|
|
1519
|
+
var v: Variant = _step_predicate.execute(_step_predicate_inputs, self)
|
|
1520
|
+
if _step_predicate.has_execute_failed():
|
|
1521
|
+
_step_predicate_error = _step_predicate.get_error_text()
|
|
1522
|
+
done = true
|
|
1523
|
+
elif bool(v):
|
|
1524
|
+
_step_predicate_met = true
|
|
1525
|
+
done = true
|
|
1526
|
+
|
|
1328
1527
|
if Time.get_ticks_msec() - _step_wall_start > STEP_WALL_BUDGET_MS:
|
|
1329
1528
|
# Slow-mo, Engine.time_scale = 0, or a pause-held window can starve
|
|
1330
1529
|
# the game-time clock; the wall budget guarantees the call returns
|
|
@@ -1376,4 +1575,19 @@ func _finish_step() -> void:
|
|
|
1376
1575
|
result["pause_transitions"] = _step_transitions
|
|
1377
1576
|
if _step_wall_exceeded:
|
|
1378
1577
|
result["wall_budget_exceeded"] = true
|
|
1379
|
-
|
|
1578
|
+
if _step_predicate != null:
|
|
1579
|
+
# step_until: predicate_met is the headline. report carries the readings the
|
|
1580
|
+
# agent asked for (the "what advanced" hint, so it need not re-observe). A
|
|
1581
|
+
# non-met return means the cap or wall budget ran out first.
|
|
1582
|
+
result["predicate_met"] = _step_predicate_met
|
|
1583
|
+
if not _step_report.is_empty():
|
|
1584
|
+
result["report"] = _evaluate_report(_step_report, _step_predicate_inputs)
|
|
1585
|
+
if not _step_predicate_error.is_empty():
|
|
1586
|
+
result["predicate_error"] = _step_predicate_error
|
|
1587
|
+
|
|
1588
|
+
# Route the reply to the originating command — the relay correlates by type.
|
|
1589
|
+
var response_type := _step_response_type
|
|
1590
|
+
_step_predicate = null
|
|
1591
|
+
_step_predicate_inputs = []
|
|
1592
|
+
_step_report = []
|
|
1593
|
+
_send_game_time_response(response_type, result)
|
package/addon/plugin.cfg
CHANGED
|
@@ -27,6 +27,23 @@ describe('game_time tool', () => {
|
|
|
27
27
|
inputs: [{ action_name: 'fire', start_ms: 100, duration_ms: 200 }],
|
|
28
28
|
}).success).toBe(true);
|
|
29
29
|
});
|
|
30
|
+
it('step_until requires a non-empty until expression', () => {
|
|
31
|
+
expect(gameTime.schema.safeParse({ action: 'step_until' }).success).toBe(false);
|
|
32
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: '' }).success).toBe(false);
|
|
33
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'G.wave > 1' }).success).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it('step_until caps max_ms and accepts report expressions and an input timeline', () => {
|
|
36
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'true', max_ms: 20000 }).success).toBe(true);
|
|
37
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'true', max_ms: 20001 }).success).toBe(false);
|
|
38
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'true', max_ms: 0 }).success).toBe(false);
|
|
39
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'true', report: ['G.wave', 'G.score'] }).success).toBe(true);
|
|
40
|
+
expect(gameTime.schema.safeParse({ action: 'step_until', until: 'true', report: [''] }).success).toBe(false);
|
|
41
|
+
expect(gameTime.schema.safeParse({
|
|
42
|
+
action: 'step_until',
|
|
43
|
+
until: 'true',
|
|
44
|
+
inputs: [{ action_name: 'move_up', start_ms: 0, duration_ms: 500 }],
|
|
45
|
+
}).success).toBe(true);
|
|
46
|
+
});
|
|
30
47
|
it('freeze, thaw, and status take no extra arguments', () => {
|
|
31
48
|
expect(gameTime.schema.safeParse({ action: 'freeze' }).success).toBe(true);
|
|
32
49
|
expect(gameTime.schema.safeParse({ action: 'thaw' }).success).toBe(true);
|
|
@@ -94,6 +111,59 @@ describe('game_time tool', () => {
|
|
|
94
111
|
expect(data.gameplay_ms).toBe(120);
|
|
95
112
|
});
|
|
96
113
|
});
|
|
114
|
+
describe('step_until', () => {
|
|
115
|
+
it('forwards the predicate and report, and surfaces a met result with its readings', async () => {
|
|
116
|
+
mock.mockResponse({
|
|
117
|
+
completed: true,
|
|
118
|
+
frozen: true,
|
|
119
|
+
elapsed_ms: 4317,
|
|
120
|
+
gameplay_ms: 4317,
|
|
121
|
+
frames: 259,
|
|
122
|
+
physics_ticks: 259,
|
|
123
|
+
game_paused: false,
|
|
124
|
+
predicate_met: true,
|
|
125
|
+
report: { 'G.wave': 1 },
|
|
126
|
+
});
|
|
127
|
+
const ctx = createToolContext(mock);
|
|
128
|
+
const result = await gameTime.execute({
|
|
129
|
+
action: 'step_until',
|
|
130
|
+
until: 'tree.get_nodes_in_group("enemies").size() >= 1',
|
|
131
|
+
max_ms: 8000,
|
|
132
|
+
report: ['G.wave'],
|
|
133
|
+
}, ctx);
|
|
134
|
+
expect(mock.calls[0].command).toBe('game_time_step_until');
|
|
135
|
+
expect(mock.calls[0].params.until).toBe('tree.get_nodes_in_group("enemies").size() >= 1');
|
|
136
|
+
expect(mock.calls[0].params.max_ms).toBe(8000);
|
|
137
|
+
expect(mock.calls[0].params.report).toEqual(['G.wave']);
|
|
138
|
+
const data = structuredOf(result);
|
|
139
|
+
expect(data.predicate_met).toBe(true);
|
|
140
|
+
expect(data.report).toEqual({ 'G.wave': 1 });
|
|
141
|
+
expect(data.elapsed_ms).toBe(4317);
|
|
142
|
+
});
|
|
143
|
+
it('reports predicate_met false when the cap is hit first', async () => {
|
|
144
|
+
mock.mockResponse({
|
|
145
|
+
completed: true,
|
|
146
|
+
frozen: true,
|
|
147
|
+
elapsed_ms: 8000,
|
|
148
|
+
gameplay_ms: 8000,
|
|
149
|
+
frames: 480,
|
|
150
|
+
physics_ticks: 480,
|
|
151
|
+
game_paused: false,
|
|
152
|
+
predicate_met: false,
|
|
153
|
+
report: { 'G.wave': 3 },
|
|
154
|
+
});
|
|
155
|
+
const ctx = createToolContext(mock);
|
|
156
|
+
const result = await gameTime.execute({ action: 'step_until', until: 'G.wave > 5', max_ms: 8000, report: ['G.wave'] }, ctx);
|
|
157
|
+
const data = structuredOf(result);
|
|
158
|
+
expect(data.predicate_met).toBe(false);
|
|
159
|
+
expect(data.report).toEqual({ 'G.wave': 3 });
|
|
160
|
+
});
|
|
161
|
+
it('propagates a bridge-side predicate rejection', async () => {
|
|
162
|
+
mock.mockError(new Error('predicate failed to evaluate: Invalid named index'));
|
|
163
|
+
const ctx = createToolContext(mock);
|
|
164
|
+
await expect(gameTime.execute({ action: 'step_until', until: 'Bogus.foo > 1' }, ctx)).rejects.toThrow('predicate failed to evaluate');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
97
167
|
describe('thaw', () => {
|
|
98
168
|
it('reports the frozen duration', async () => {
|
|
99
169
|
mock.mockResponse({ frozen: false, was_frozen: true, game_paused: false, frozen_wall_ms: 42000 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"game-time.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/game-time.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,16 @@ export declare const gameTime: import("../core/types.js").ToolDefinition<z.ZodDi
|
|
|
11
11
|
start_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
12
12
|
duration_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
13
13
|
}, z.core.$strip>>>;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
action: z.ZodLiteral<"step_until">;
|
|
16
|
+
until: z.ZodString;
|
|
17
|
+
max_ms: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
report: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
|
+
inputs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
20
|
+
action_name: z.ZodString;
|
|
21
|
+
start_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
22
|
+
duration_ms: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
23
|
+
}, z.core.$strip>>>;
|
|
14
24
|
}, z.core.$strip>, z.ZodObject<{
|
|
15
25
|
action: z.ZodLiteral<"thaw">;
|
|
16
26
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-time.d.ts","sourceRoot":"","sources":["../../src/tools/game-time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"game-time.d.ts","sourceRoot":"","sources":["../../src/tools/game-time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAmG1D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;8BA0DnB,CAAC;AAEH,eAAO,MAAM,aAAa,EAAiB,iBAAiB,EAAE,CAAC"}
|
package/dist/tools/game-time.js
CHANGED
|
@@ -37,6 +37,30 @@ const GameTimeSchema = z
|
|
|
37
37
|
.optional()
|
|
38
38
|
.describe('Input timeline executed inside the window; start_ms is game time from window start. Inputs must ride inside the step — events injected while frozen miss their is_action_just_pressed edge. Holds are always released by window end.'),
|
|
39
39
|
}),
|
|
40
|
+
z.object({
|
|
41
|
+
action: z
|
|
42
|
+
.literal('step_until')
|
|
43
|
+
.describe('Advance game time until a GDScript predicate becomes true (or a safety cap is hit), then re-freeze. Freezes first if the game is running, so it is a safe first call. Use this instead of step when you do not know how long to advance to reach the state worth observing.'),
|
|
44
|
+
until: z
|
|
45
|
+
.string()
|
|
46
|
+
.min(1)
|
|
47
|
+
.describe('A GDScript boolean expression, re-evaluated against the running game every frame; stepping stops the frame it is truthy. Autoloads are in scope by name (e.g. `G.wave > 1`, `GameState.tick_count % 12 == 11`), plus `tree` (the SceneTree) and `root` (the root Window) for tree queries (e.g. `tree.get_nodes_in_group("enemies").size() >= 1`). Must parse and evaluate without error against the current state or the call is rejected up front. Expressions do NOT short-circuit (`and`/`or` evaluate both operands), so to read a node that may not exist yet, do not guard with `arr.size() > 0 and arr[0].x` — sequence two calls instead: step_until the node exists (`tree.get_nodes_in_group("boss").size() >= 1`), then step_until reading it (`tree.get_nodes_in_group("boss")[0].state == 4`).'),
|
|
48
|
+
max_ms: z
|
|
49
|
+
.number()
|
|
50
|
+
.int()
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(STEP_MAX_MS)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe(`Safety cap on game time to advance while waiting (max ${STEP_MAX_MS}, default ${STEP_MAX_MS}). If the predicate never holds within this budget (or the wall-clock budget), the call returns with predicate_met: false instead of hanging.`),
|
|
55
|
+
report: z
|
|
56
|
+
.array(z.string().min(1))
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('Optional GDScript expressions (same scope as `until`) evaluated when stepping stops and returned as a { expression: value } map — e.g. ["G.wave", "tree.get_nodes_in_group(\\"enemies\\").size()"]. Use this to read the state you care about in the same call instead of a separate observation round-trip. Each must parse and evaluate without error up front.'),
|
|
59
|
+
inputs: z
|
|
60
|
+
.array(InputActionSchema)
|
|
61
|
+
.optional()
|
|
62
|
+
.describe('Optional input timeline driven inside the window, exactly like step (e.g. hold "move forward" while waiting for an enemy to appear). Holds are released by window end.'),
|
|
63
|
+
}),
|
|
40
64
|
z.object({
|
|
41
65
|
action: z
|
|
42
66
|
.literal('thaw')
|
|
@@ -55,7 +79,7 @@ const GameTimeSchema = z
|
|
|
55
79
|
export const gameTime = defineTool({
|
|
56
80
|
name: 'godot_game_time',
|
|
57
81
|
annotations: { title: 'Game Time Control', readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
58
|
-
description: 'Make game time answer to your clock instead of racing ahead between tool calls: freeze the running game, observe it at leisure (screenshots and state digests work while frozen), then step forward a bounded slice of game time with inputs riding inside the window. The game\'s own pause menu is layered correctly: freezing over it, stepping under it, and thawing back to it all preserve the game\'s pause intent.',
|
|
82
|
+
description: 'Make game time answer to your clock instead of racing ahead between tool calls: freeze the running game, observe it at leisure (screenshots and state digests work while frozen), then step forward a bounded slice of game time (step) — or until a condition you specify holds (step_until) — with inputs riding inside the window. The game\'s own pause menu is layered correctly: freezing over it, stepping under it, and thawing back to it all preserve the game\'s pause intent.',
|
|
59
83
|
schema: GameTimeSchema,
|
|
60
84
|
async execute(args, { godot }) {
|
|
61
85
|
switch (args.action) {
|
|
@@ -73,6 +97,15 @@ export const gameTime = defineTool({
|
|
|
73
97
|
});
|
|
74
98
|
return structured(result);
|
|
75
99
|
}
|
|
100
|
+
case 'step_until': {
|
|
101
|
+
const result = await godot.sendCommand('game_time_step_until', {
|
|
102
|
+
until: args.until,
|
|
103
|
+
max_ms: args.max_ms,
|
|
104
|
+
report: args.report,
|
|
105
|
+
inputs: args.inputs,
|
|
106
|
+
});
|
|
107
|
+
return structured(result);
|
|
108
|
+
}
|
|
76
109
|
case 'thaw': {
|
|
77
110
|
const result = await godot.sendCommand('game_time_thaw');
|
|
78
111
|
if (!result.was_frozen) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-time.js","sourceRoot":"","sources":["../../src/tools/game-time.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,6EAA6E;AAC7E,4EAA4E;AAC5E,oBAAoB;AACpB,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,MAAM,cAAc,GAAG,CAAC;KACrB,kBAAkB,CAAC,QAAQ,EAAE;IAC5B,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC;aACN,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,0JAA0J,CAAC;KACxK,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC;aACN,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,kIAAkI,CAAC;QAC/I,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,WAAW,CAAC;aAChB,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,WAAW,yEAAyE,CAAC;QAC9I,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,eAAe,CAAC;aACpB,QAAQ,EAAE;aACV,QAAQ,CAAC,gDAAgD,eAAe,yCAAyC,CAAC;QACrH,MAAM,EAAE,CAAC;aACN,KAAK,CAAC,iBAAiB,CAAC;aACxB,QAAQ,EAAE;aACV,QAAQ,CAAC,sOAAsO,CAAC;KACpP,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC;aACN,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,+FAA+F,CAAC;KAC7G,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC;aACN,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,uUAAuU,CAAC;KACrV,CAAC;CACH,CAAC;IACF,+EAA+E;KAC9E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;IACpH,OAAO,EAAE,oDAAoD;CAC9D,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"game-time.js","sourceRoot":"","sources":["../../src/tools/game-time.ts"],"names":[],"mappings":"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"}
|