From c5644d381e62e948bd2b336694ab17d018d1efbc Mon Sep 17 00:00:00 2001 From: Phillip Tarrant Date: Fri, 10 Jul 2026 15:09:45 -0500 Subject: [PATCH] feat(client): harnesses show the considering-state around the call Co-Authored-By: Claude Opus 4.8 (1M context) --- client/scripts/harness/narrate_harness.gd | 8 +++++++- client/scripts/harness/npc_harness.gd | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/client/scripts/harness/narrate_harness.gd b/client/scripts/harness/narrate_harness.gd index 1ac97d9..0a6c862 100644 --- a/client/scripts/harness/narrate_harness.gd +++ b/client/scripts/harness/narrate_harness.gd @@ -7,12 +7,14 @@ extends Control const DmService = preload("res://scripts/net/dm_service.gd") const HttpTransport = preload("res://scripts/net/http_transport.gd") const FallbackLibrary = preload("res://scripts/net/fallback_library.gd") +const ConsideringIndicator = preload("res://scripts/ui/considering_indicator.gd") var _service: DmService var _log: CanonLog var _label: RichTextLabel var _status: Label var _button: Button +var _indicator: ConsideringIndicator func _ready() -> void: @@ -39,11 +41,15 @@ func _ready() -> void: _status = Label.new() vbox.add_child(_status) + _indicator = ConsideringIndicator.new() + add_child(_indicator) + func _on_narrate_pressed() -> void: _button.disabled = true - _status.text = "…narrating…" + _indicator.start(_status) var r := await _service.narrate(_log) + _indicator.stop() _label.text = r.display_text for f in r.facts: _log.add_fact(f) diff --git a/client/scripts/harness/npc_harness.gd b/client/scripts/harness/npc_harness.gd index 0162c67..2166bd2 100644 --- a/client/scripts/harness/npc_harness.gd +++ b/client/scripts/harness/npc_harness.gd @@ -10,6 +10,7 @@ const MoveApplier = preload("res://scripts/npc/move_applier.gd") const ContentDB = preload("res://scripts/content/content_db.gd") const HttpTransport = preload("res://scripts/net/http_transport.gd") const FallbackLibrary = preload("res://scripts/net/fallback_library.gd") +const ConsideringIndicator = preload("res://scripts/ui/considering_indicator.gd") const NPC_ID := "fenn" @@ -20,6 +21,8 @@ var _canon_log: CanonLog var _output: RichTextLabel var _entry: LineEdit var _speak_btn: Button +var _status: Label +var _indicator: ConsideringIndicator func _ready() -> void: @@ -60,6 +63,12 @@ func _ready() -> void: _speak_btn.pressed.connect(_on_speak) vbox.add_child(_speak_btn) + _status = Label.new() + vbox.add_child(_status) + + _indicator = ConsideringIndicator.new() + add_child(_indicator) + func _on_speak() -> void: var utterance := _entry.text @@ -72,8 +81,10 @@ func _on_speak() -> void: var disposition := int(_game_state.npc_dispositions.get(NPC_ID, 0)) var available := NpcContent.available_moves(_content.npc(NPC_ID), _game_state, _canon_log) + _indicator.start(_status) var r: NpcResult = await _service.speak( NPC_ID, utterance, _canon_log, disposition, available) + _indicator.stop() # Apply state explicitly (§2) — the service applied nothing. MoveApplier.apply(r.valid_moves, _game_state, _canon_log, _content, NPC_ID)