feat(client): harnesses show the considering-state around the call

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-10 15:09:45 -05:00
parent 82b2de19bb
commit c5644d381e
2 changed files with 18 additions and 1 deletions

View File

@@ -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)

View File

@@ -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)