You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
tekla agent declares a watch command (lifecycle: start, stream) but the aware-tekla bridge implements no watch verb — real event-triggered apps still can't fire #176
#172 (PR #173, v0.49.0) landed CliInvoker::invoke_stream, so the host-agnostic streaming transport now works: a lifecycle: start source streams newline-delimited JSON through aware app run for real (not just --simulate). PR #173 explicitly scoped out the other half — "The host watch sidecars (tekla et al.) that emit the event stream remain a separate agent-binary deliverable." This issue tracks that remaining half for tekla.
The tekla agent manifest advertises a watch command, but the aware-tekla bridge binary does not implement a watch verb. So the canonical event-trigger example (tekla.watch) still cannot fire on live model events — the transport is ready, but nothing emits the stream.
Evidence (verified in aware-aeco @ 30052c828, branch main — from source)
The command is declared (stateful: true, streaming output):
aware app run <tekla-watch-app> (no --simulate) → orchestrator reaches invoke_stream → spawns aware-tekla with the watch command → bridge returns unknown verb 'watch' (exit 2) → run fails before any event is delivered.
aware app run <tekla-watch-app> --simulate → one synthesized placeholder event flows through once (topology validates), nothing real fires.
Observed: the bridge has no watch verb; a real (non-simulated) tekla.watch run fails immediately. Expected:aware-tekla watch is a long-running process that Connect()s to the active Tekla model, subscribes to the Tekla Open API event model (ModelObjectChanged, model load/unload), and writes newline-delimited JSON events ({ guid, mark, type, ... }) to stdout — which invoke_stream now consumes — staying up until the run is stopped.
What's needed (concretely)
A watch verb in cli-tekla (a lifecycle: start long-running mode): connect to the live model, subscribe to model events, and emit one JSONL line per event on stdout, honoring the filter enum from the manifest. Clean shutdown on stream stop / stdin close (the transport's stop kills the child).
floless.app ships timer routines today (a daemon fires aware app run on a schedule). The planned next step is event-triggered routines — a workflow whose first node is tekla.watch auto-runs on the event, with the floless.app daemon hosting the long-running run. With #172 done, floless.app can build/test that "On trigger" kind against any JSONL-emitting stateful agent now, but the flagship Tekla example needs this bridge verb to fire on real model events. floless.app deliberately will not build a parallel polling engine — it aligns with AWARE's event model.
Gap
#172 (PR #173, v0.49.0) landed
CliInvoker::invoke_stream, so the host-agnostic streaming transport now works: alifecycle: startsource streams newline-delimited JSON throughaware app runfor real (not just--simulate). PR #173 explicitly scoped out the other half — "The host watch sidecars (tekla et al.) that emit the event stream remain a separate agent-binary deliverable." This issue tracks that remaining half for tekla.The tekla agent manifest advertises a
watchcommand, but theaware-teklabridge binary does not implement awatchverb. So the canonical event-trigger example (tekla.watch) still cannot fire on live model events — the transport is ready, but nothing emits the stream.Evidence (verified in
aware-aeco@30052c828, branchmain— from source)The command is declared (
stateful: true, streaming output):20-agents/aeco/engineering/tekla/manifest.yaml:24—stateful: true20-agents/aeco/engineering/tekla/manifest.yaml:125-139— thewatchcommand:The bridge implements no such verb:
cli-tekla/Program.cs:123-138— the verb switch handles onlysend-status,list-instances,launch,close,exec. Any other verb hits the default case:watchexits non-zero withunknown verb 'watch'.The transport is ready and would call it:
cli/src/runtime/orchestrator.rs:220— the non---simulatebranch for alifecycle: startsource callsself.invoker.invoke_stream(agent, command, args), which (post-Implement CliInvoker::invoke_stream (streaming/stateful-agent transport) #173) spawns the agent binary and reads JSONL from stdout. For tekla that binary isaware-tekla.exe, which has nowatchverb → the stream source fails the run (correct, per Implement CliInvoker::invoke_stream (streaming/stateful-agent transport) #173's error propagation) instead of emitting events.Repro
Any app whose source node is
tekla.watch:aware app run <tekla-watch-app>(no--simulate) → orchestrator reachesinvoke_stream→ spawnsaware-teklawith thewatchcommand → bridge returnsunknown verb 'watch'(exit 2) → run fails before any event is delivered.aware app run <tekla-watch-app> --simulate→ one synthesized placeholder event flows through once (topology validates), nothing real fires.Observed: the bridge has no
watchverb; a real (non-simulated)tekla.watchrun fails immediately.Expected:
aware-tekla watchis a long-running process thatConnect()s to the active Tekla model, subscribes to the Tekla Open API event model (ModelObjectChanged, model load/unload), and writes newline-delimited JSON events ({ guid, mark, type, ... }) to stdout — whichinvoke_streamnow consumes — staying up until the run is stopped.What's needed (concretely)
watchverb incli-tekla(alifecycle: startlong-running mode): connect to the live model, subscribe to model events, and emit one JSONL line per event on stdout, honoring thefilterenum from the manifest. Clean shutdown on stream stop / stdin close (the transport'sstopkills the child).tekla.watchrun delivers ≥1 event through the provenance trace when the model changes, and exits cleanly on stop.Use case (floless.app)
floless.app ships timer routines today (a daemon fires
aware app runon a schedule). The planned next step is event-triggered routines — a workflow whose first node istekla.watchauto-runs on the event, with the floless.app daemon hosting the long-running run. With #172 done, floless.app can build/test that "On trigger" kind against any JSONL-emitting stateful agent now, but the flagship Tekla example needs this bridge verb to fire on real model events. floless.app deliberately will not build a parallel polling engine — it aligns with AWARE's event model.Cross-refs
invoke_streamtransport (the complementary half; done, PR Implement CliInvoker::invoke_stream (streaming/stateful-agent transport) #173).--device-codeJSON signal; precedent for the listening/fired machine-readable signal.