NOTE: test-e2e runs auxiliary smoke plus fake Ollama OpenAI serving; completion still requires user-flow verification when changing runtime paths.
./scripts/e2e-smoke.sh
[e2e] NOTE: auxiliary smoke only; completion requires bin/edge.sh + bin/node.sh user-flow verification.
[e2e] shellcheck not found, skipping
[e2e] preparing honest mock smoke test (using scripted cli adapter)...
[e2e] starting smoke test (profile: mock, port: 30265, persistent: 1, has_status: 0)
[e2e] waiting for node registration (timeout: 60s)
[e2e] > /nodes
[e2e] > /capabilities
[e2e] > /transport
[e2e] > Convert this token to uppercase and reply with only the converted token: iop_smoke_alpha
[e2e] > Convert this token to uppercase and reply with only the converted token: iop_smoke_beta
[e2e] > /session session2
[e2e] > /background on
[e2e] > Convert this token to uppercase and reply with only the converted token: iop_smoke_bg
[e2e] > /background off
[e2e] > /sessions
[e2e] > /terminate-session
[e2e] > /exit
=== EDGE OUTPUT ===
[edge] config=/tmp/tmp.AzaLhvSfwm/edge.yaml
{"level":"info","ts":1779526393.3874714,"caller":"transport/server.go:83","msg":"edge listening for nodes","addr":"127.0.0.1:30265"}
IOP Edge console listening on 127.0.0.1:30265
Console target node= adapter=cli target=fake-cli session=default background=false
Start node.sh on another host, then type a message here.
Commands: /nodes, /node <id|alias>, /session <id>, /background on|off, /terminate-session, /status, /capabilities, /sessions, /transport, /exit
edge> {"level":"info","ts":1779526393.8935397,"caller":"transport/server.go:117","msg":"node connection established"}
{"level":"info","ts":1779526393.9048393,"caller":"transport/server.go:117","msg":"node connection established"}
{"level":"info","ts":1779526394.4299884,"caller":"transport/server.go:117","msg":"node connection established"}
{"level":"info","ts":1779526394.4306145,"caller":"transport/server.go:192","msg":"node registered","node_id":"test-node","alias":"test-node"}
[node0-evt] connected reason="registered"
  node0 = test-node (test-node)
edge> [node0-capabilities] target=fake-cli session=default
  adapter = cli
  max_concurrency = 4
  targets = fake-cli
edge> [node0-transport] target=fake-cli session=default
  adapter = cli
  connected = true
  node_id = test-node
  session_id = default
  target = fake-cli
edge> [edge] sent run_id=manual-1779526395530569505 node=node0 adapter=cli target=fake-cli session=default background=false
[node0-evt] start run_id=manual-1779526395530569505
[node0-msg] IOP_SMOKE_ALPHA
[node0-msg] IOP_SMOKE_ALPHA_TAIL
[node0-evt] complete run_id=manual-1779526395530569505 detail="idle-timeout"
edge> [edge] sent run_id=manual-1779526396749450422 node=node0 adapter=cli target=fake-cli session=default background=false
[node0-evt] start run_id=manual-1779526396749450422
[node0-msg] IOP_SMOKE_BETA
[node0-msg] IOP_SMOKE_BETA_TAIL
[node0-evt] complete run_id=manual-1779526396749450422 detail="idle-timeout"
edge> session → session2
edge> background → on
edge> [edge] sent run_id=manual-1779526398396557298 node=node0 adapter=cli target=fake-cli session=session2 background=true
[edge] background run dispatched, events will arrive asynchronously
edge> [node0-evt] start run_id=manual-1779526398396557298 session=session2 background=true
[node0-msg] IOP_SMOKE_BG
[node0-msg] IOP_SMOKE_BG_TAIL
[node0-evt] complete run_id=manual-1779526398396557298 detail="idle-timeout"
background → off
edge> [node0-sessions] target=fake-cli session=session2
sessions: 2
  [0] mode=persistent target=fake-cli session=default
  [1] mode=persistent target=fake-cli session=session2
edge> terminated session session2 node=node0
edge> bye
{"level":"info","ts":1779526400.2420387,"caller":"transport/server.go:176","msg":"node unregistered","node_id":"test-node","transport_close_reason":"local_close","transport_close_error":"read tcp 127.0.0.1:30265->127.0.0.1:47640: use of closed network connection"}
=== NODE OUTPUT ===
[node] config=/tmp/tmp.AzaLhvSfwm/node.yaml
[node] waiting for edge at 127.0.0.1:30265 timeout=30s
[node] edge is reachable
[Fx] PROVIDE	fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE	fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE	fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] PROVIDE	*config.NodeConfig <= iop/apps/node/internal/bootstrap.Module.func1()
[Fx] PROVIDE	*zap.Logger <= iop/apps/node/internal/bootstrap.Module.func2()
[Fx] INVOKE		iop/apps/node/internal/bootstrap.Module.func3()
[Fx] RUN	provide: go.uber.org/fx.New.func1()
[Fx] RUN	provide: iop/apps/node/internal/bootstrap.Module.func1()
[Fx] RUN	provide: iop/apps/node/internal/bootstrap.Module.func2()
[Fx] HOOK OnStart		iop/apps/node/internal/bootstrap.Module.func3.1() executing (caller: iop/apps/node/internal/bootstrap.Module.func3)
{"level":"info","ts":1779526394.4310226,"caller":"transport/client.go:67","msg":"registered with edge","node_id":"test-node","alias":"test-node"}
{"level":"info","ts":1779526394.4339015,"caller":"store/store.go:62","msg":"store ready","dsn":"file:/tmp/tmp.AzaLhvSfwm/workspace/iop.db?cache=shared&mode=rwc"}
{"level":"info","ts":1779526394.434221,"caller":"cli/cli.go:150","msg":"cli adapter: persistent session started","target":"fake-cli"}
[Fx] HOOK OnStart		iop/apps/node/internal/bootstrap.Module.func3.1() called by iop/apps/node/internal/bootstrap.Module.func3 ran successfully in 4.788667ms
[Fx] RUNNING
{"level":"info","ts":1779526395.1083927,"caller":"node/node.go:179","msg":"command request","request_id":"caps-1779526395108031796","type":"NODE_COMMAND_TYPE_CAPABILITIES","adapter":"cli","target":"fake-cli"}
{"level":"info","ts":1779526395.324283,"caller":"node/node.go:179","msg":"command request","request_id":"transport-1779526395323978338","type":"NODE_COMMAND_TYPE_TRANSPORT_STATUS","adapter":"cli","target":"fake-cli"}
{"level":"info","ts":1779526395.5311089,"caller":"node/node.go:61","msg":"run request received","run_id":"manual-1779526395530569505","adapter":"cli","target":"fake-cli"}
[edge-message] Convert this token to uppercase and reply with only the converted token: iop_smoke_alpha
[node-event] start run_id=manual-1779526395530569505
[node-message] IOP_SMOKE_ALPHA
IOP_SMOKE_ALPHA_TAIL
[node-event] complete run_id=manual-1779526395530569505 detail="idle-timeout"
{"level":"info","ts":1779526396.7498045,"caller":"node/node.go:61","msg":"run request received","run_id":"manual-1779526396749450422","adapter":"cli","target":"fake-cli"}
[edge-message] Convert this token to uppercase and reply with only the converted token: iop_smoke_beta
[node-event] start run_id=manual-1779526396749450422
[node-message] IOP_SMOKE_BETA
IOP_SMOKE_BETA_TAIL
[node-event] complete run_id=manual-1779526396749450422 detail="idle-timeout"
{"level":"info","ts":1779526398.3973572,"caller":"node/node.go:61","msg":"run request received","run_id":"manual-1779526398396557298","adapter":"cli","target":"fake-cli"}
[edge-message] Convert this token to uppercase and reply with only the converted token: iop_smoke_bg
[node-event] start run_id=manual-1779526398396557298
[node-message] IOP_SMOKE_BG
IOP_SMOKE_BG_TAIL
[node-event] complete run_id=manual-1779526398396557298 detail="idle-timeout"
{"level":"info","ts":1779526399.8256485,"caller":"node/node.go:179","msg":"command request","request_id":"sessions-1779526399824985173","type":"NODE_COMMAND_TYPE_SESSION_LIST","adapter":"cli","target":"fake-cli"}
{"level":"info","ts":1779526400.0340025,"caller":"node/node.go:158","msg":"cancel request","run_id":"","action":"CANCEL_ACTION_TERMINATE_SESSION"}
{"level":"info","ts":1779526400.2421432,"caller":"transport/session.go:89","msg":"disconnected from edge","transport_close_reason":"remote_closed","transport_close_error":"EOF"}
[edge-event] disconnected reason="transport_closed" transport_close_reason="remote_closed" transport_close_error="EOF"
===================
[e2e] Auxiliary smoke test PASSED.
[e2e] Completion still requires bin/edge.sh + bin/node.sh user-flow verification.
./scripts/e2e-openai-ollama.sh
[openai-ollama] OpenAI-compatible Ollama serving test PASSED.
