Skip to content

Commit 81d29d0

Browse files
committed
feat: introduce io publisher for communicating events via stdio
1 parent d25122b commit 81d29d0

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

.env.tmp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
HOMEBREW_PREFIX=/opt/homebrew
2+
TERM=xterm-256color
3+
PYDEVD_DISABLE_FILE_VALIDATION=1
4+
TARS_API_KEY=
5+
CURSOR_CLI=ELECTRON_RUN_AS_NODE=1 "/Applications/Cursor.app/Contents/MacOS/Cursor" "/Applications/Cursor.app/Contents/Resources/app/out/cli.js"
6+
TMPDIR=/var/folders/0g/0d6s2wwd7xdd8qjrwn1dxk880000gn/T/
7+
ANTHROPIC_API_KEY=
8+
LC_TERMINAL=iTerm2
9+
NVM_CD_FLAGS=-q
10+
LS_COLORS=di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43
11+
VSCODE_GIT_ASKPASS_EXTRA_ARGS=
12+
LSCOLORS=Gxfxcxdxbxegedabagacad
13+
ENABLE_IDE_INTEGRATION=true
14+
ITERM_PROFILE=Default
15+
SHLVL=2
16+
STARSHIP_SHELL=zsh
17+
VSCODE_GIT_ASKPASS_MAIN=/Applications/Cursor.app/Contents/Resources/app/extensions/git/dist/askpass-main.js
18+
SECURITYSESSIONID=186af
19+
LaunchInstanceID=39A1C5AE-6C97-44A7-A1BF-0E129B1C8710
20+
TARS_URL=
21+
ASKUI_WORKSPACE_ID=
22+
TERM_SESSION_ID=w0t6p1:C9B1756F-C835-4699-9774-41ADAAD736D2
23+
NVM_INC=/Users/onur/.nvm/versions/node/v22.15.0/include/node
24+
__CF_USER_TEXT_ENCODING=0x1F5:0:2
25+
OLDPWD=/Users/onur/Workspace/vision-agent
26+
CURSOR_CLI_MODE=local
27+
FZF_DEFAULT_COMMAND=fd ~ --type f . ~
28+
GIT_ASKPASS=/Applications/Cursor.app/Contents/Resources/app/extensions/git/dist/askpass.sh
29+
USER=onur
30+
TERM_PROGRAM=vscode
31+
PWD=/Users/onur/Workspace/vision-agent
32+
ASKUI_COMPONENT_REGISTRY_FILE=/Applications/.askui-suite/DependencyCache/Suite.Installation.Cache.json
33+
STARSHIP_SESSION_KEY=1222059937035211
34+
ASKUI_INFERENCE_ENDPOINT=https://inference.askui.dev
35+
TERM_PROGRAM_VERSION=2.1.34
36+
VSCODE_GIT_IPC_HANDLE=/var/folders/0g/0d6s2wwd7xdd8qjrwn1dxk880000gn/T/vscode-git-acb06570d6.sock
37+
FZF_DEFAULT_OPTS=--highlight-line --info=inline-right --ansi --layout=reverse --border=none --color=bg+:#2d3f76 --color=bg:#1e2030 --color=border:#589ed7 --color=fg:#c8d3f5 --color=gutter:#1e2030 --color=header:#ff966c --color=hl+:#65bcff --color=hl:#65bcff --color=info:#545c7e --color=marker:#ff007c --color=pointer:#ff007c --color=prompt:#65bcff --color=query:#c8d3f5:regular --color=scrollbar:#589ed7 --color=separator:#ff966c --color=spinner:#ff007c
38+
ASKUI_INSTALLATION_DIRECTORY=/Applications/.askui-suite
39+
FZF_CTRL_T_OPTS=--bind 'enter:execute(nvim {})'
40+
LC_TERMINAL_VERSION=3.5.14
41+
COLORFGBG=15;0
42+
ASKUI__VA__TELEMETRY__ENABLED=True
43+
ASKUI__CHAT_API__allow_origins=["http://localhost:4200", "https://app.caesr.dev", "https://app.caesr.ai"]
44+
ASKUI_TOKEN=
45+
BUNDLED_DEBUGPY_PATH=/Users/onur/.cursor/extensions/ms-python.debugpy-2025.14.1-darwin-arm64/bundled/libs/debugpy
46+
ZSH=/Users/onur/.oh-my-zsh
47+
TERM_FEATURES=T3LrMSc7UUw9Ts3BFGsSyHNoSxF
48+
SHELL=/bin/zsh
49+
PATH=/Library/Frameworks/Python.framework/Versions/3.10/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/Users/onur/.local/bin:/Users/onur/Library/pnpm:/Users/onur/.nvm/versions/node/v22.15.0/bin:/Applications/iTerm.app/Contents/Resources/utilities:/Applications/.askui-suite/Tools:/Users/onur/.cursor/extensions/ms-python.debugpy-2025.14.1-darwin-arm64/bundled/scripts/noConfigScripts
50+
LANG=en_GB.UTF-8
51+
MallocNanoZone=0
52+
VSCODE_DEBUGPY_ADAPTER_ENDPOINTS=/Users/onur/.cursor/extensions/ms-python.debugpy-2025.14.1-darwin-arm64/.noConfigDebugAdapterEndpoints/endpoint-720b1a8060458e4a.txt
53+
HOMEBREW_REPOSITORY=/opt/homebrew
54+
INFOPATH=/opt/homebrew/share/info:/opt/homebrew/share/info:
55+
XPC_FLAGS=0x0
56+
HOME=/Users/onur
57+
_=/opt/homebrew/bin/op
58+
__CFBundleIdentifier=com.todesktop.230313mzl4w4u92
59+
PNPM_HOME=/Users/onur/Library/pnpm
60+
ORIGINAL_XDG_CURRENT_DESKTOP=undefined
61+
VSCODE_GIT_ASKPASS_NODE=/Applications/Cursor.app/Contents/Frameworks/Cursor Helper (Plugin).app/Contents/MacOS/Cursor Helper (Plugin)
62+
PAGER=less
63+
LESS=-R
64+
COLORTERM=truecolor
65+
CLAUDE_CODE_SSE_PORT=24679
66+
VSCODE_NONCE=e81e6f9d-bf64-44dd-bd8e-e50cac1a260a
67+
NVM_BIN=/Users/onur/.nvm/versions/node/v22.15.0/bin
68+
HOMEBREW_CELLAR=/opt/homebrew/Cellar
69+
COMMAND_MODE=unix2003
70+
LOGNAME=onur
71+
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.PkTOjWQpfr/Listeners
72+
OPEN_ROUTER_API_KEY=
73+
CURSOR_TRACE_ID=d154d744e0a94add96fead13888a6b7f
74+
XPC_SERVICE_NAME=application.com.todesktop.230313mzl4w4u92.22148485.22148491.41E3398D-0345-42F5-951F-93E5AC13F203
75+
NVM_DIR=/Users/onur/.nvm
76+
SQLITE_EXEMPT_PATH_FROM_VNODE_GUARDS=/Users/onur/Library/WebKit/Databases
77+
ITERM_SESSION_ID=w0t6p1:C9B1756F-C835-4699-9774-41ADAAD736D2
78+
TERMINFO_DIRS=/Applications/iTerm.app/Contents/Resources/terminfo:/usr/share/terminfo
79+
OSLogRateLimit=64
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""IO publisher for publishing events to stdout."""
2+
3+
import json
4+
import sys
5+
from typing import Any
6+
7+
from askui.chat.api.runs.events.events import Event
8+
9+
10+
class IOPublisher:
11+
"""Publisher that serializes events to JSON and writes to stdout."""
12+
13+
def publish(self, event: Event) -> None:
14+
"""
15+
Publish an event by serializing it to JSON and writing to stdout.
16+
17+
Args:
18+
event: The event to publish
19+
"""
20+
try:
21+
event_dict: dict[str, Any] = event.model_dump(mode="json")
22+
event_json = json.dumps(event_dict)
23+
24+
sys.stdout.write(event_json + "\n")
25+
sys.stdout.flush()
26+
except (TypeError, ValueError, AttributeError, OSError) as e:
27+
sys.stderr.write(f"Error publishing event: {e}\n")
28+
sys.stderr.flush()

src/askui/chat/api/runs/service.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from askui.chat.api.messages.chat_history_manager import ChatHistoryManager
1313
from askui.chat.api.models import RunId, ThreadId, WorkspaceId
1414
from askui.chat.api.runs.events.events import DoneEvent, ErrorEvent, Event, RunEvent
15+
from askui.chat.api.runs.events.io_publisher import IOPublisher
1516
from askui.chat.api.runs.events.service import EventService
1617
from askui.chat.api.runs.models import (
1718
Run,
@@ -43,6 +44,7 @@ def __init__(
4344
self._chat_history_manager = chat_history_manager
4445
self._settings = settings
4546
self._event_service = EventService(settings.data_dir, self)
47+
self._io_publisher = IOPublisher()
4648

4749
def _find_by_id(
4850
self, workspace_id: WorkspaceId | None, thread_id: ThreadId, run_id: RunId
@@ -136,6 +138,7 @@ async def run_runner() -> None:
136138
if isinstance(event, DoneEvent) or isinstance(
137139
event, ErrorEvent
138140
):
141+
self._io_publisher.publish(event)
139142
break
140143
except anyio.EndOfStream:
141144
break

0 commit comments

Comments
 (0)