From 486b17e5b97af90a16719700991d94dda4d01001 Mon Sep 17 00:00:00 2001 From: M09Ic Date: Sat, 1 Aug 2026 18:51:39 +0800 Subject: [PATCH 1/8] feat: unify frontend protocol types on protobuf AOP --- README.md | 2 +- package.json | 6 + packages/agent-protocol/fixtures/events.jsonl | 15 - .../agent-protocol/schema/aop.schema.json | 67 -- .../schema/events/error.schema.json | 13 - .../schema/events/message.delta.schema.json | 14 - .../schema/events/message.schema.json | 39 - .../schema/events/session.end.schema.json | 11 - .../schema/events/session.start.schema.json | 12 - .../schema/events/status.schema.json | 11 - .../schema/events/tool.call.schema.json | 14 - .../schema/events/tool.result.schema.json | 17 - .../schema/events/turn.end.schema.json | 14 - .../schema/events/turn.start.schema.json | 9 - .../schema/events/usage.schema.json | 16 - .../agent-protocol/schema/ext/aop.schema.json | 40 - .../schema/ext/compact.schema.json | 13 - .../schema/ext/delegation.schema.json | 15 - .../schema/ext/eval.schema.json | 29 - .../agent-protocol/schema/ext/ioa.schema.json | 21 - packages/agent-protocol/src/builders.ts | 72 -- packages/agent-protocol/src/index.ts | 48 - packages/agent-protocol/src/parse.ts | 47 - packages/agent-protocol/src/types.ts | 167 --- packages/agent-protocol/tsconfig.json | 14 - packages/aop/README.md | 28 + packages/aop/SPEC.md | 86 ++ packages/aop/buf.gen.yaml | 7 + packages/aop/buf.yaml | 11 + packages/aop/fixtures/interop.json | 30 + packages/{agent-protocol => aop}/package.json | 12 +- packages/aop/proto/aop/chat.proto | 126 ++ packages/aop/proto/aop/content.proto | 83 ++ packages/aop/proto/aop/event.proto | 130 ++ packages/aop/proto/aop/value.proto | 15 + .../aop/src/gen/aiscan/chat/session_pb.ts | 602 ++++++++++ packages/aop/src/gen/aiscan/scan/scan_pb.ts | 640 ++++++++++ .../src/gen/aiscan/transport/terminal_pb.ts | 195 +++ packages/aop/src/gen/aop/chat_pb.ts | 565 +++++++++ packages/aop/src/gen/aop/content_pb.ts | 375 ++++++ packages/aop/src/gen/aop/event_pb.ts | 596 ++++++++++ packages/aop/src/gen/aop/value_pb.ts | 62 + packages/aop/src/index.ts | 14 + packages/aop/tsconfig.json | 7 + packages/terminal/package.json | 2 + packages/terminal/src/index.tsx | 165 +-- packages/viewer/package.json | 3 +- .../src/components/chat/AOPChatPanel.tsx | 4 +- packages/viewer/src/index.ts | 22 +- packages/viewer/src/lib/aop-reducer.test.ts | 447 +------ packages/viewer/src/lib/aop-reducer.ts | 691 +++-------- packages/viewer/src/types/protocol.ts | 30 +- pnpm-lock.yaml | 1049 +++++++++-------- 53 files changed, 4409 insertions(+), 2314 deletions(-) delete mode 100644 packages/agent-protocol/fixtures/events.jsonl delete mode 100644 packages/agent-protocol/schema/aop.schema.json delete mode 100644 packages/agent-protocol/schema/events/error.schema.json delete mode 100644 packages/agent-protocol/schema/events/message.delta.schema.json delete mode 100644 packages/agent-protocol/schema/events/message.schema.json delete mode 100644 packages/agent-protocol/schema/events/session.end.schema.json delete mode 100644 packages/agent-protocol/schema/events/session.start.schema.json delete mode 100644 packages/agent-protocol/schema/events/status.schema.json delete mode 100644 packages/agent-protocol/schema/events/tool.call.schema.json delete mode 100644 packages/agent-protocol/schema/events/tool.result.schema.json delete mode 100644 packages/agent-protocol/schema/events/turn.end.schema.json delete mode 100644 packages/agent-protocol/schema/events/turn.start.schema.json delete mode 100644 packages/agent-protocol/schema/events/usage.schema.json delete mode 100644 packages/agent-protocol/schema/ext/aop.schema.json delete mode 100644 packages/agent-protocol/schema/ext/compact.schema.json delete mode 100644 packages/agent-protocol/schema/ext/delegation.schema.json delete mode 100644 packages/agent-protocol/schema/ext/eval.schema.json delete mode 100644 packages/agent-protocol/schema/ext/ioa.schema.json delete mode 100644 packages/agent-protocol/src/builders.ts delete mode 100644 packages/agent-protocol/src/index.ts delete mode 100644 packages/agent-protocol/src/parse.ts delete mode 100644 packages/agent-protocol/src/types.ts delete mode 100644 packages/agent-protocol/tsconfig.json create mode 100644 packages/aop/README.md create mode 100644 packages/aop/SPEC.md create mode 100644 packages/aop/buf.gen.yaml create mode 100644 packages/aop/buf.yaml create mode 100644 packages/aop/fixtures/interop.json rename packages/{agent-protocol => aop}/package.json (53%) create mode 100644 packages/aop/proto/aop/chat.proto create mode 100644 packages/aop/proto/aop/content.proto create mode 100644 packages/aop/proto/aop/event.proto create mode 100644 packages/aop/proto/aop/value.proto create mode 100644 packages/aop/src/gen/aiscan/chat/session_pb.ts create mode 100644 packages/aop/src/gen/aiscan/scan/scan_pb.ts create mode 100644 packages/aop/src/gen/aiscan/transport/terminal_pb.ts create mode 100644 packages/aop/src/gen/aop/chat_pb.ts create mode 100644 packages/aop/src/gen/aop/content_pb.ts create mode 100644 packages/aop/src/gen/aop/event_pb.ts create mode 100644 packages/aop/src/gen/aop/value_pb.ts create mode 100644 packages/aop/src/index.ts create mode 100644 packages/aop/tsconfig.json diff --git a/README.md b/README.md index dc6f8b2..7d4e8ae 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ CSTX 协议驱动的共享前端组件库。为 CyberHub、Cairn Platform 等产 | [`@cyber/markdown`](packages/markdown) | Markdown 渲染 — MarkdownContent、CodeBlock(行号 + 复制) | | [`@cyber/terminal`](packages/terminal) | 终端会话 — WebSocketTerminal、TerminalView(xterm.js)、SessionNavigator、PTY 会话管理工具函数 | | [`@cyber/file-manager`](packages/file-manager) | 文件管理器 — 目录树、列表/网格、右键文件操作、路径跳转与 localStorage 近期路径历史 | -| [`@cyber/agent-protocol`](packages/agent-protocol) | Agent 事件协议 — AOP 事件类型、解析、校验与构造工具 | +| [`@cyber/aop`](packages/aop) | 中立 AOP protobuf 规范、生成类型与标准 JSON 编解码 | | [`@cyber/viewer`](packages/viewer) | APG 任务查看器 — LiveGraphView、ChatPanel、ExecutionTimeline、WebSocket 实时通信 | | [`@cyber/realtime`](packages/realtime) | 实时通信 — Gateway WebSocket 客户端、SSE 流 | | [`@cyber/ioa`](packages/ioa) | IOA 协作 — ForumView、ThreadList、CheckpointCard、GraphPanel、消息渲染注册表 | diff --git a/package.json b/package.json index aa014a1..0e656ba 100644 --- a/package.json +++ b/package.json @@ -9,5 +9,11 @@ }, "devDependencies": { "turbo": "^2.0.0" + }, + "pnpm": { + "overrides": { + "@types/react": "18.3.31", + "@types/react-dom": "18.3.7" + } } } diff --git a/packages/agent-protocol/fixtures/events.jsonl b/packages/agent-protocol/fixtures/events.jsonl deleted file mode 100644 index a7bb8b3..0000000 --- a/packages/agent-protocol/fixtures/events.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"type":"session.start","ts":"2026-07-19T00:00:00Z","session_id":"session-1","agent":"aiscan","seq":1,"data":{"model":"test"}} -{"type":"message","ts":"2026-07-19T00:00:01Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":2,"data":{"message_id":"m-1","role":"user","parts":[{"type":"text","text":"inspect the target"}]}} -{"type":"turn.start","ts":"2026-07-19T00:00:02Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":3,"data":{}} -{"type":"message.delta","ts":"2026-07-19T00:00:03Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":4,"data":{"message_id":"m-2","part_index":0,"part_type":"reasoning","delta":"inspect target"}} -{"type":"message.delta","ts":"2026-07-19T00:00:04Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":5,"data":{"message_id":"m-2","part_index":1,"part_type":"text","delta":"checking now"}} -{"type":"message","ts":"2026-07-19T00:00:05Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":6,"data":{"message_id":"m-2","role":"assistant","parts":[{"type":"reasoning","text":"inspect target"},{"type":"text","text":"checking now"}]},"ext":{"aop":{"agent_id":"agent-1","metadata":{"preserved":true}}}} -{"type":"tool.call","ts":"2026-07-19T00:00:06Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":7,"data":{"tool_call_id":"tc-1","tool_name":"bash","args":{"command":"whoami"},"work_dir":"/workspace"}} -{"type":"tool.result","ts":"2026-07-19T00:00:07Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":8,"data":{"tool_call_id":"tc-1","tool_name":"bash","content":"john","details":{"exit_code":0},"duration_ms":42,"terminate":false}} -{"type":"usage","ts":"2026-07-19T00:00:08Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":9,"data":{"input_tokens":100,"output_tokens":20,"total_tokens":120}} -{"type":"status","ts":"2026-07-19T00:00:09Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":10,"data":{"state":"eval_end"},"ext":{"eval":{"round":1,"max_rounds":2,"pass":true,"reason":"verified"}}} -{"type":"session.start","ts":"2026-07-19T00:00:10Z","session_id":"session-2","agent":"aiscan","seq":1,"data":{"model":"test","parent_session_id":"session-1","parent_tool_call_id":"tc-2"},"ext":{"delegation":{"agent_id":"agent-2","agent_name":"worker","agent_type":"general","task":"verify finding","context_mode":"fork","run_mode":"background"}}} -{"type":"session.end","ts":"2026-07-19T00:00:11Z","session_id":"session-2","agent":"aiscan","seq":2,"data":{"reason":"completed"}} -{"type":"turn.end","ts":"2026-07-19T00:00:12Z","session_id":"session-1","turn_id":"turn-1","agent":"aiscan","seq":11,"data":{"stop":"completed","context_tokens":120,"usage":{"input_tokens":100,"output_tokens":20,"total_tokens":120}}} -{"type":"session.end","ts":"2026-07-19T00:00:13Z","session_id":"session-1","agent":"aiscan","seq":12,"data":{"reason":"completed"}} -{"type":"future.event","ts":"2026-07-19T00:00:14Z","session_id":"session-1","agent":"aiscan","seq":13,"data":{"nested":{"value":1}}} diff --git a/packages/agent-protocol/schema/aop.schema.json b/packages/agent-protocol/schema/aop.schema.json deleted file mode 100644 index db1447b..0000000 --- a/packages/agent-protocol/schema/aop.schema.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/aop.schema.json", - "title": "Agent Output Protocol Event", - "type": "object", - "required": ["type", "ts", "session_id", "agent", "data"], - "properties": { - "type": { "type": "string", "minLength": 1 }, - "ts": { "type": "string", "format": "date-time" }, - "session_id": { "type": "string", "minLength": 1 }, - "turn_id": { "type": "string", "minLength": 1 }, - "agent": { "type": "string", "minLength": 1 }, - "seq": { "type": "integer", "minimum": 1 }, - "data": { "type": "object" }, - "ext": { - "type": "object", - "additionalProperties": { "type": "object" } - } - }, - "additionalProperties": false, - "allOf": [ - { - "if": { "properties": { "type": { "const": "session.start" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/session.start.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "session.end" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/session.end.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "message" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/message.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "message.delta" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/message.delta.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "tool.call" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/tool.call.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "tool.result" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/tool.result.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "usage" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/usage.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "turn.start" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/turn.start.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "turn.end" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/turn.end.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "error" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/error.schema.json" } } } - }, - { - "if": { "properties": { "type": { "const": "status" } }, "required": ["type"] }, - "then": { "properties": { "data": { "$ref": "events/status.schema.json" } } } - } - ] -} diff --git a/packages/agent-protocol/schema/events/error.schema.json b/packages/agent-protocol/schema/events/error.schema.json deleted file mode 100644 index 0485db8..0000000 --- a/packages/agent-protocol/schema/events/error.schema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/error.schema.json", - "title": "ErrorData", - "type": "object", - "required": ["message"], - "properties": { - "message": { "type": "string" }, - "code": { "type": "string", "goJSONSchema": { "pointer": false } }, - "retryable": { "type": "boolean", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/message.delta.schema.json b/packages/agent-protocol/schema/events/message.delta.schema.json deleted file mode 100644 index 536ba25..0000000 --- a/packages/agent-protocol/schema/events/message.delta.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/message.delta.schema.json", - "title": "MessageDeltaData", - "type": "object", - "required": ["message_id", "part_index", "part_type", "delta"], - "properties": { - "message_id": { "type": "string", "minLength": 1 }, - "part_index": { "type": "integer", "minimum": 0 }, - "part_type": { "type": "string", "minLength": 1 }, - "delta": { "type": "string" } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/message.schema.json b/packages/agent-protocol/schema/events/message.schema.json deleted file mode 100644 index 12e3728..0000000 --- a/packages/agent-protocol/schema/events/message.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/message.schema.json", - "title": "MessageData", - "type": "object", - "required": ["message_id", "role", "parts"], - "properties": { - "message_id": { "type": "string", "minLength": 1 }, - "role": { "type": "string", "minLength": 1 }, - "parts": { - "type": "array", - "items": { "$ref": "#/$defs/message_part" } - } - }, - "additionalProperties": false, - "$defs": { - "image_source": { - "title": "ImageSource", - "type": "object", - "properties": { - "base64": { "type": "string", "goJSONSchema": { "pointer": false } }, - "media_type": { "type": "string", "goJSONSchema": { "pointer": false } }, - "path": { "type": "string", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false - }, - "message_part": { - "title": "MessagePart", - "type": "object", - "required": ["type"], - "properties": { - "type": { "type": "string", "minLength": 1 }, - "text": { "type": "string", "goJSONSchema": { "pointer": false } }, - "image": { "$ref": "#/$defs/image_source" } - }, - "additionalProperties": false - } - } -} diff --git a/packages/agent-protocol/schema/events/session.end.schema.json b/packages/agent-protocol/schema/events/session.end.schema.json deleted file mode 100644 index 39e0b80..0000000 --- a/packages/agent-protocol/schema/events/session.end.schema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/session.end.schema.json", - "title": "SessionEndData", - "type": "object", - "required": ["reason"], - "properties": { - "reason": { "type": "string", "minLength": 1 } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/session.start.schema.json b/packages/agent-protocol/schema/events/session.start.schema.json deleted file mode 100644 index 6f4f80c..0000000 --- a/packages/agent-protocol/schema/events/session.start.schema.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/session.start.schema.json", - "title": "SessionStartData", - "type": "object", - "properties": { - "model": { "type": "string", "goJSONSchema": { "pointer": false } }, - "parent_session_id": { "type": "string", "goJSONSchema": { "pointer": false } }, - "parent_tool_call_id": { "type": "string", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/status.schema.json b/packages/agent-protocol/schema/events/status.schema.json deleted file mode 100644 index bc99a18..0000000 --- a/packages/agent-protocol/schema/events/status.schema.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/status.schema.json", - "title": "StatusData", - "type": "object", - "required": ["state"], - "properties": { - "state": { "type": "string", "minLength": 1 } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/tool.call.schema.json b/packages/agent-protocol/schema/events/tool.call.schema.json deleted file mode 100644 index 4463aee..0000000 --- a/packages/agent-protocol/schema/events/tool.call.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/tool.call.schema.json", - "title": "ToolCallData", - "type": "object", - "required": ["tool_call_id", "tool_name", "args"], - "properties": { - "tool_call_id": { "type": "string", "minLength": 1 }, - "tool_name": { "type": "string", "minLength": 1 }, - "args": { "goJSONSchema": { "type": "any" } }, - "work_dir": { "type": "string", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/tool.result.schema.json b/packages/agent-protocol/schema/events/tool.result.schema.json deleted file mode 100644 index 2c5971c..0000000 --- a/packages/agent-protocol/schema/events/tool.result.schema.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/tool.result.schema.json", - "title": "ToolResultData", - "type": "object", - "required": ["tool_call_id", "content"], - "properties": { - "tool_call_id": { "type": "string", "minLength": 1 }, - "tool_name": { "type": "string", "goJSONSchema": { "pointer": false } }, - "content": { "goJSONSchema": { "type": "any" } }, - "details": { "goJSONSchema": { "type": "any", "pointer": false } }, - "is_error": { "type": "boolean", "goJSONSchema": { "pointer": false } }, - "duration_ms": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "terminate": { "type": "boolean", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/turn.end.schema.json b/packages/agent-protocol/schema/events/turn.end.schema.json deleted file mode 100644 index da4a9c8..0000000 --- a/packages/agent-protocol/schema/events/turn.end.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/turn.end.schema.json", - "title": "TurnEndData", - "type": "object", - "required": ["stop"], - "properties": { - "stop": { "type": "string", "minLength": 1 }, - "error": { "type": "string", "goJSONSchema": { "pointer": false } }, - "context_tokens": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "usage": { "$ref": "usage.schema.json" } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/turn.start.schema.json b/packages/agent-protocol/schema/events/turn.start.schema.json deleted file mode 100644 index b47e32e..0000000 --- a/packages/agent-protocol/schema/events/turn.start.schema.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/turn.start.schema.json", - "title": "TurnStartData", - "type": "object", - "goJSONSchema": { "type": "struct{}" }, - "properties": {}, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/events/usage.schema.json b/packages/agent-protocol/schema/events/usage.schema.json deleted file mode 100644 index ebdf3d3..0000000 --- a/packages/agent-protocol/schema/events/usage.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/events/usage.schema.json", - "title": "UsageData", - "type": "object", - "required": ["input_tokens", "output_tokens", "total_tokens"], - "properties": { - "input_tokens": { "type": "integer", "minimum": 0 }, - "output_tokens": { "type": "integer", "minimum": 0 }, - "total_tokens": { "type": "integer", "minimum": 0 }, - "cache_read_tokens": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "cache_write_tokens": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "model": { "type": "string", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/ext/aop.schema.json b/packages/agent-protocol/schema/ext/aop.schema.json deleted file mode 100644 index 24727ad..0000000 --- a/packages/agent-protocol/schema/ext/aop.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/ext/aop.schema.json", - "$defs": { - "budget_warning": { - "title": "BudgetWarning", - "type": "object", - "required": ["context_tokens", "token_budget"], - "properties": { - "context_tokens": { "type": "integer", "minimum": 0 }, - "token_budget": { "type": "integer", "minimum": 0 } - }, - "additionalProperties": false - }, - "llm_request": { - "title": "LLMRequest", - "type": "object", - "required": ["model", "messages", "max_tokens", "stream"], - "properties": { - "model": { "type": "string" }, - "messages": { "type": "integer", "minimum": 0 }, - "max_tokens": { "type": "integer", "minimum": 0 }, - "stream": { "type": "boolean" } - }, - "additionalProperties": false - }, - "message_meta": { - "title": "MessageMeta", - "type": "object", - "properties": { - "agent_id": { "type": "string", "goJSONSchema": { "pointer": false } }, - "metadata": { - "type": "object", - "additionalProperties": true - } - }, - "additionalProperties": false - } - } -} diff --git a/packages/agent-protocol/schema/ext/compact.schema.json b/packages/agent-protocol/schema/ext/compact.schema.json deleted file mode 100644 index b8e44e4..0000000 --- a/packages/agent-protocol/schema/ext/compact.schema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/ext/compact.schema.json", - "title": "Detail", - "type": "object", - "properties": { - "error": { "type": "string", "goJSONSchema": { "pointer": false } }, - "kept_messages": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "tokens_before": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } }, - "tokens_after": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/ext/delegation.schema.json b/packages/agent-protocol/schema/ext/delegation.schema.json deleted file mode 100644 index 7122766..0000000 --- a/packages/agent-protocol/schema/ext/delegation.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/ext/delegation.schema.json", - "title": "DelegationDetail", - "type": "object", - "properties": { - "agent_id": { "type": "string", "goJSONSchema": { "pointer": false } }, - "agent_name": { "type": "string", "goJSONSchema": { "pointer": false } }, - "agent_type": { "type": "string", "goJSONSchema": { "pointer": false } }, - "task": { "type": "string", "goJSONSchema": { "pointer": false } }, - "context_mode": { "type": "string", "enum": ["fork", "fresh"], "goJSONSchema": { "pointer": false } }, - "run_mode": { "type": "string", "enum": ["foreground", "background"], "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false -} diff --git a/packages/agent-protocol/schema/ext/eval.schema.json b/packages/agent-protocol/schema/ext/eval.schema.json deleted file mode 100644 index cea6fc6..0000000 --- a/packages/agent-protocol/schema/ext/eval.schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/ext/eval.schema.json", - "$defs": { - "control": { - "title": "Control", - "type": "object", - "required": ["criteria"], - "properties": { - "criteria": { "type": "string" }, - "max_rounds": { "type": "integer", "minimum": 0, "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false - }, - "detail": { - "title": "Detail", - "type": "object", - "required": ["round", "max_rounds"], - "properties": { - "round": { "type": "integer", "minimum": 0 }, - "max_rounds": { "type": "integer", "minimum": 0 }, - "pass": { "type": "boolean", "goJSONSchema": { "pointer": false } }, - "reason": { "type": "string", "goJSONSchema": { "pointer": false } }, - "error": { "type": "string", "goJSONSchema": { "pointer": false } } - }, - "additionalProperties": false - } - } -} diff --git a/packages/agent-protocol/schema/ext/ioa.schema.json b/packages/agent-protocol/schema/ext/ioa.schema.json deleted file mode 100644 index 179121b..0000000 --- a/packages/agent-protocol/schema/ext/ioa.schema.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://github.com/chainreactors/cyber-ui/packages/agent-protocol/schema/ext/ioa.schema.json", - "title": "HandoffDetail", - "type": "object", - "properties": { - "mode": { "type": "string" }, - "model": { "type": "string" }, - "name": { "type": "string" }, - "parent_session_id": { "type": "string" }, - "phase": { "type": "string" }, - "refs": { - "type": "array", - "items": { "type": "string" } - }, - "session_id": { "type": "string" }, - "status": { "type": "string" }, - "type": { "type": "string" } - }, - "additionalProperties": true -} diff --git a/packages/agent-protocol/src/builders.ts b/packages/agent-protocol/src/builders.ts deleted file mode 100644 index 53371b9..0000000 --- a/packages/agent-protocol/src/builders.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** Convenience builders for constructing AOP events. */ - -import type { - AOPEvent, - AOPData, - AOPEventType, - SessionStartData, - SessionEndData, - MessageData, - MessageDeltaData, - ToolCallData, - ToolResultData, - UsageData, - TurnStartData, - TurnEndData, - ErrorData, - StatusData, -} from './types' - -interface EventEnvelope { - agent: string - session_id: string - turn_id?: string - seq?: number - ext?: Record> -} - -function makeEvent(type: AOPEventType, env: EventEnvelope, data: T): AOPEvent { - return { - type, - ts: new Date().toISOString(), - session_id: env.session_id, - ...(env.turn_id !== undefined ? { turn_id: env.turn_id } : {}), - agent: env.agent, - ...(env.seq !== undefined ? { seq: env.seq } : {}), - data, - ...(env.ext ? { ext: env.ext } : {}), - } -} - -export const sessionStartEvent = (env: EventEnvelope, data: SessionStartData = {}) => - makeEvent('session.start', env, data) - -export const sessionEndEvent = (env: EventEnvelope, data: SessionEndData) => - makeEvent('session.end', env, data) - -export const messageEvent = (env: EventEnvelope, data: MessageData) => - makeEvent('message', env, data) - -export const messageDeltaEvent = (env: EventEnvelope, data: MessageDeltaData) => - makeEvent('message.delta', env, data) - -export const toolCallEvent = (env: EventEnvelope, data: ToolCallData) => - makeEvent('tool.call', env, data) - -export const toolResultEvent = (env: EventEnvelope, data: ToolResultData) => - makeEvent('tool.result', env, data) - -export const usageEvent = (env: EventEnvelope, data: UsageData) => - makeEvent('usage', env, data) - -export const turnStartEvent = (env: EventEnvelope, data: TurnStartData = {}) => - makeEvent('turn.start', env, data) - -export const turnEndEvent = (env: EventEnvelope, data: TurnEndData) => - makeEvent('turn.end', env, data) - -export const errorEvent = (env: EventEnvelope, data: ErrorData) => - makeEvent('error', env, data) - -export const statusEvent = (env: EventEnvelope, data: StatusData) => - makeEvent('status', env, data) diff --git a/packages/agent-protocol/src/index.ts b/packages/agent-protocol/src/index.ts deleted file mode 100644 index 9a9b304..0000000 --- a/packages/agent-protocol/src/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -export type { - AOPEvent, - AOPEventType, - AOPCoreType, - AOPOptionalType, - AOPData, - MessagePartType, - ImageSource, - MessagePart, - SessionStartData, - SessionEndData, - MessageData, - MessageDeltaData, - ToolCallData, - ToolResultData, - UsageData, - TurnStartData, - TurnEndData, - ErrorData, - StatusData, - SessionStartEvent, - SessionEndEvent, - MessageEvent, - MessageDeltaEvent, - ToolCallEvent, - ToolResultEvent, - UsageEvent, - TurnStartEvent, - TurnEndEvent, - ErrorEvent, - StatusEvent, -} from './types' - -export { parseLine, parseLines, isAOPEvent } from './parse' - -export { - sessionStartEvent, - sessionEndEvent, - messageEvent, - messageDeltaEvent, - toolCallEvent, - toolResultEvent, - usageEvent, - turnStartEvent, - turnEndEvent, - errorEvent, - statusEvent, -} from './builders' diff --git a/packages/agent-protocol/src/parse.ts b/packages/agent-protocol/src/parse.ts deleted file mode 100644 index 2517707..0000000 --- a/packages/agent-protocol/src/parse.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * JSONL parsing utilities for AOP events. - */ - -import type { AOPEvent } from './types' - -/** - * Parse a single JSONL line into an AOPEvent, or null if invalid. - */ -export function parseLine(line: string): AOPEvent | null { - const trimmed = line.trim() - if (!trimmed || trimmed[0] !== '{') return null - try { - const obj: unknown = JSON.parse(trimmed) - return isAOPEvent(obj) ? obj : null - } catch { - return null - } -} - -/** - * Check whether a parsed object looks like a valid AOP event. - */ -export function isAOPEvent(obj: unknown): obj is AOPEvent { - if (typeof obj !== 'object' || obj === null) return false - const e = obj as Record - return ( - typeof e.type === 'string' && - typeof e.ts === 'string' && - typeof e.session_id === 'string' && - typeof e.agent === 'string' && - typeof e.data === 'object' && - e.data !== null - ) -} - -/** - * Yield AOP events from an async line iterator (e.g. ReadableStream). - */ -export async function* parseLines( - lines: AsyncIterable, -): AsyncGenerator { - for await (const line of lines) { - const event = parseLine(line) - if (event) yield event - } -} diff --git a/packages/agent-protocol/src/types.ts b/packages/agent-protocol/src/types.ts deleted file mode 100644 index 73ee508..0000000 --- a/packages/agent-protocol/src/types.ts +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Agent Output Protocol (AOP) - * - * A language-neutral JSONL event protocol for AI coding agents. - * Every agent outputs these events; every orchestrator consumes them without - * per-agent transport translation. - */ - -// Envelope - -export interface AOPEvent { - /** Dot-separated event type. */ - type: AOPEventType - /** RFC 3339 timestamp. */ - ts: string - /** Stable session identifier. */ - session_id: string - /** Stable identifier for the run within a session. */ - turn_id?: string - /** Agent name that emitted this event. */ - agent: string - /** Monotonically increasing sequence number within the session. */ - seq?: number - /** Type-specific payload. */ - data: T - /** Extension payloads keyed by namespace. */ - ext?: Record> -} - -// Event types - -export type AOPCoreType = - | 'session.start' - | 'session.end' - | 'message' - | 'message.delta' - | 'tool.call' - | 'tool.result' - | 'usage' - -export type AOPOptionalType = - | 'turn.start' - | 'turn.end' - | 'error' - | 'status' - -/** Known event types plus a forward-compatible string type. */ -export type AOPEventType = AOPCoreType | AOPOptionalType | (string & {}) - -// Message parts - -export type MessagePartType = 'text' | 'reasoning' | 'image' - -export interface ImageSource { - /** Local image path, mutually exclusive with base64. */ - path?: string - /** Base64-encoded image bytes, mutually exclusive with path. */ - base64?: string - /** MIME type for base64 image data. */ - media_type?: string -} - -export interface MessagePart { - type: MessagePartType | (string & {}) - /** Content for text and reasoning parts. */ - text?: string - /** Content for image parts. */ - image?: ImageSource -} - -// Data payloads - -export interface SessionStartData { - model?: string - parent_session_id?: string - parent_tool_call_id?: string -} - -export interface SessionEndData { - reason: string -} - -export interface MessageData { - message_id: string - role: string - parts: MessagePart[] -} - -export interface MessageDeltaData { - message_id: string - part_index: number - part_type: string - delta: string -} - -export interface ToolCallData { - tool_call_id: string - tool_name: string - args: unknown - work_dir?: string -} - -export interface ToolResultData { - tool_call_id: string - tool_name?: string - content: unknown - details?: unknown - is_error?: boolean - duration_ms?: number - terminate?: boolean -} - -export interface UsageData { - input_tokens: number - output_tokens: number - total_tokens: number - cache_read_tokens?: number - cache_write_tokens?: number - model?: string -} - -export type TurnStartData = Record - -export interface TurnEndData { - stop: string - error?: string - context_tokens?: number - usage?: UsageData -} - -export interface ErrorData { - message: string - code?: string - retryable?: boolean -} - -export interface StatusData { - state: string -} - -export type AOPData = - | SessionStartData - | SessionEndData - | MessageData - | MessageDeltaData - | ToolCallData - | ToolResultData - | UsageData - | TurnStartData - | TurnEndData - | ErrorData - | StatusData - | Record - -// Typed event aliases - -export type SessionStartEvent = AOPEvent & { type: 'session.start' } -export type SessionEndEvent = AOPEvent & { type: 'session.end' } -export type MessageEvent = AOPEvent & { type: 'message' } -export type MessageDeltaEvent = AOPEvent & { type: 'message.delta' } -export type ToolCallEvent = AOPEvent & { type: 'tool.call' } -export type ToolResultEvent = AOPEvent & { type: 'tool.result' } -export type UsageEvent = AOPEvent & { type: 'usage' } -export type TurnStartEvent = AOPEvent & { type: 'turn.start' } -export type TurnEndEvent = AOPEvent & { type: 'turn.end' } -export type ErrorEvent = AOPEvent & { type: 'error' } -export type StatusEvent = AOPEvent & { type: 'status' } diff --git a/packages/agent-protocol/tsconfig.json b/packages/agent-protocol/tsconfig.json deleted file mode 100644 index e594658..0000000 --- a/packages/agent-protocol/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "noEmit": true, - "declaration": true, - "jsx": "react-jsx", - "skipLibCheck": true, - "esModuleInterop": true - }, - "include": ["src"] -} diff --git a/packages/aop/README.md b/packages/aop/README.md new file mode 100644 index 0000000..23d7f0e --- /dev/null +++ b/packages/aop/README.md @@ -0,0 +1,28 @@ +# @cyber/aop + +Provider-neutral Agent Orchestration Protocol types and gRPC services. +Protobuf is the source of truth; generated TypeScript is the public package. + +`fixtures/interop.json` is the shared Go/Python/TypeScript binary + protobuf JSON +fixture and includes lossless OpenAI/Anthropic raw payload samples. + +```ts +import { EventSchema } from '@cyber/aop' +import { fromJson } from '@bufbuild/protobuf' + +const event = fromJson(EventSchema, JSON.parse(sseData)) +if (event.payload.case === 'message') { + console.log(event.payload.value.content) +} +``` + +Validate and regenerate: + +```powershell +pnpm install +pnpm --filter @cyber/aop generate +pnpm --filter @cyber/aop lint +pnpm --filter @cyber/aop typecheck +``` + +See [SPEC.md](SPEC.md) for lifecycle and compatibility requirements. diff --git a/packages/aop/SPEC.md b/packages/aop/SPEC.md new file mode 100644 index 0000000..c58154a --- /dev/null +++ b/packages/aop/SPEC.md @@ -0,0 +1,86 @@ +# Agent Orchestration Protocol + +This document is normative. The words MUST, MUST NOT, SHOULD, and MAY are used +as defined by RFC 2119. + +## Scope + +AOP defines provider-neutral chat orchestration semantics. It does not define +deployment topology, agent registration, filesystems, terminals, process +execution, persistence engines, or product telemetry. + +Protobuf under `proto/aop` is the only schema. Protobuf binary and standard +Protobuf JSON are encodings of the same messages, not separate protocols. + +## Identity and ordering + +- Client-supplied request, session, turn, message, and tool-call IDs MUST remain + unchanged across transports. +- Every mutating request MUST carry a non-empty `request_id`. Replay outcomes + MUST survive a server restart; an in-memory cache alone is insufficient. +- `Event.seq` MUST start at 1 and increase strictly within one session. Relays + MUST preserve it. An event with a zero sequence is not a published AOP event. +- A service that must synthesize a terminal event after losing the participant + MUST continue the last observed session sequence and MUST suppress a later + duplicate terminal event for the same turn. +- A delivery cursor is an opaque store position and MUST NOT be interpreted as + `Event.seq`. +- Retrying a request with the same `request_id` MUST return the same acceptance + outcome and MUST NOT create another logical operation. +- Reusing a `request_id` with a different method or request body MUST be + rejected as a conflict. + +## Lifecycle + +- An accepted session MUST emit exactly one `session_started` and eventually + exactly one `session_ended`. +- An accepted turn MUST emit exactly one `turn_started` and eventually exactly + one `turn_ended`. +- A rejected run MUST NOT create a turn or emit turn events. +- Cancellation, timeout, provider failure, and disconnect MUST still converge + an accepted turn on `turn_ended`. +- Disconnecting an event watcher MUST NOT cancel the session or turn it watches. +- A complete `message` is authoritative. Deltas are transient projections and + MAY be discarded after the complete message is stored. +- Deltas and their complete message or tool call MUST share the same ID. +- Canonical message roles are `system`, `user`, `assistant`, and `tool`. + Implementations MUST preserve an unknown non-empty role rather than coercing + it to a canonical role. +- A tool result MUST reference an earlier tool call through `call_id`. Exactly + one terminal tool result is permitted for each accepted tool call. + +## RPC and delivery + +- An accepted RPC response acknowledges ownership of the operation; generated + events carry its progress and result. +- Validation and policy failures use the response `rejected` outcome. gRPC + status errors are reserved for authentication, transport, or unavailable + service failures where no application outcome can be produced. +- `WatchEvents.after_cursor` and `ListEvents.after_cursor` are exclusive. + Deliveries after reconnect MUST retain their original event and cursor. +- Protobuf binary is used by gRPC. JSON transports and stores MUST use the + standard protobuf JSON mapping without handwritten envelopes or field aliases. +- In protobuf JSON, `bytes` are base64 strings, enum names are symbolic, and + oneof members use their generated JSON field names. + +## Extensions and providers + +- Shared additions SHOULD use a stable reverse-DNS extension namespace. +- A message MUST NOT contain the same extension namespace more than once. +- Extension values containing another protobuf message MUST use that message's + standard protobuf JSON bytes and identify it with `media_type`. +- Unknown content SHOULD use `OpaqueContent`; unknown event semantics SHOULD + use `ExtensionEvent`. +- A provider bridge claiming lossless support MUST emit every exact provider + request/response frame as `ProviderFrame`, without parse/reserialize and in + wire order. +- Capturing or persisting provider frames MUST be policy-controlled because + frames can include credentials, user data, or opaque reasoning. +- Authentication headers and credentials MUST NOT be copied into provider frame + metadata. A raw payload MUST NOT be parsed and reserialized before capture. + +## Compatibility + +Field numbers MUST NOT be reused. Removed fields MUST be reserved. Additive +changes preserve field numbers and published meaning. Removed fields MUST be +reserved permanently. diff --git a/packages/aop/buf.gen.yaml b/packages/aop/buf.gen.yaml new file mode 100644 index 0000000..6c5d93e --- /dev/null +++ b/packages/aop/buf.gen.yaml @@ -0,0 +1,7 @@ +version: v2 +plugins: + - local: protoc-gen-es + out: src/gen + opt: + - target=ts + - import_extension=js diff --git a/packages/aop/buf.yaml b/packages/aop/buf.yaml new file mode 100644 index 0000000..bd5236d --- /dev/null +++ b/packages/aop/buf.yaml @@ -0,0 +1,11 @@ +version: v2 +modules: + - path: proto +lint: + use: + - STANDARD + except: + - PACKAGE_VERSION_SUFFIX +breaking: + use: + - FILE diff --git a/packages/aop/fixtures/interop.json b/packages/aop/fixtures/interop.json new file mode 100644 index 0000000..6c02ff5 --- /dev/null +++ b/packages/aop/fixtures/interop.json @@ -0,0 +1,30 @@ +{ + "event": { + "id": "fixture-event-1", + "emittedAt": "2026-08-01T00:00:00Z", + "sessionId": "fixture-session", + "turnId": "fixture-turn", + "emitter": "fixture-agent", + "seq": "7", + "providerFrame": { + "provider": "openai", + "protocol": "openai", + "eventType": "response.completed", + "direction": "DIRECTION_RESPONSE", + "transport": "http", + "payload": "eyJpZCI6ImNoYXRjbXBsLWZpeHR1cmUiLCJjaG9pY2VzIjpbeyJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjoiaGVsbG8ifSwiZmluaXNoX3JlYXNvbiI6InN0b3AifV0sInVzYWdlIjp7InByb21wdF90b2tlbnMiOjMsImNvbXBsZXRpb25fdG9rZW5zIjoyLCJ0b3RhbF90b2tlbnMiOjV9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=", + "mediaType": "application/json", + "metadata": [ + { + "name": "request-id", + "value": "Zml4dHVyZS1yZXF1ZXN0" + } + ] + } + }, + "binaryBase64": "Cg9maXh0dXJlLWV2ZW50LTESBgiA7rTTBhoPZml4dHVyZS1zZXNzaW9uIgxmaXh0dXJlLXR1cm4qDWZpeHR1cmUtYWdlbnQwB7oBtAIKBm9wZW5haRIGb3BlbmFpGhJyZXNwb25zZS5jb21wbGV0ZWQgAioEaHR0cDLUAXsiaWQiOiJjaGF0Y21wbC1maXh0dXJlIiwiY2hvaWNlcyI6W3sibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6ImhlbGxvIn0sImZpbmlzaF9yZWFzb24iOiJzdG9wIn1dLCJ1c2FnZSI6eyJwcm9tcHRfdG9rZW5zIjozLCJjb21wbGV0aW9uX3Rva2VucyI6MiwidG90YWxfdG9rZW5zIjo1fSwidW5rbm93biI6eyJuZXN0ZWQiOlsxLHRydWUsIngiXX19OhBhcHBsaWNhdGlvbi9qc29uQh0KCnJlcXVlc3QtaWQSD2ZpeHR1cmUtcmVxdWVzdA==", + "providerPayloads": { + "openaiBase64": "eyJpZCI6ImNoYXRjbXBsLWZpeHR1cmUiLCJjaG9pY2VzIjpbeyJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjoiaGVsbG8ifSwiZmluaXNoX3JlYXNvbiI6InN0b3AifV0sInVzYWdlIjp7InByb21wdF90b2tlbnMiOjMsImNvbXBsZXRpb25fdG9rZW5zIjoyLCJ0b3RhbF90b2tlbnMiOjV9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=", + "anthropicBase64": "eyJpZCI6Im1zZ19maXh0dXJlIiwidHlwZSI6Im1lc3NhZ2UiLCJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiJyYXctdGhvdWdodCJ9LHsidHlwZSI6InRleHQiLCJ0ZXh0IjoiaGVsbG8ifV0sInN0b3BfcmVhc29uIjoiZW5kX3R1cm4iLCJ1c2FnZSI6eyJpbnB1dF90b2tlbnMiOjMsIm91dHB1dF90b2tlbnMiOjJ9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=" + } +} diff --git a/packages/agent-protocol/package.json b/packages/aop/package.json similarity index 53% rename from packages/agent-protocol/package.json rename to packages/aop/package.json index 7b070b1..519d9ec 100644 --- a/packages/agent-protocol/package.json +++ b/packages/aop/package.json @@ -1,5 +1,5 @@ { - "name": "@cyber/agent-protocol", + "name": "@cyber/aop", "version": "0.1.0", "type": "module", "main": "./src/index.ts", @@ -9,12 +9,18 @@ "import": "./src/index.ts", "types": "./src/index.ts" }, - "./schema/aop.schema.json": "./schema/aop.schema.json" + "./proto/*": "./proto/*" }, "scripts": { + "generate": "buf generate", + "lint": "buf lint && buf build", "typecheck": "tsc --noEmit" }, + "dependencies": { + "@bufbuild/protobuf": "^2.9.0" + }, "devDependencies": { - "typescript": "^5.3.0" + "@bufbuild/protoc-gen-es": "^2.9.0", + "typescript": "^5.7.2" } } diff --git a/packages/aop/proto/aop/chat.proto b/packages/aop/proto/aop/chat.proto new file mode 100644 index 0000000..95e3abd --- /dev/null +++ b/packages/aop/proto/aop/chat.proto @@ -0,0 +1,126 @@ +syntax = "proto3"; + +package aop; + +import "aop/content.proto"; +import "aop/event.proto"; +import "aop/value.proto"; + +message Rejection { + string code = 1; + string message = 2; + bool retryable = 3; + EncodedValue detail = 4; +} + +message Session { + string id = 1; + string state = 2; + string participant = 3; + string title = 4; +} + +message OpenSessionRequest { + string request_id = 1; + string session_id = 2; + string participant = 3; + string title = 4; + string parent_session_id = 5; + string parent_tool_call_id = 6; + repeated Extension extensions = 7; +} + +message OpenSessionResponse { + string request_id = 1; + oneof outcome { + Session accepted = 2; + Rejection rejected = 3; + } +} + +message RunTurnRequest { + string request_id = 1; + string session_id = 2; + string turn_id = 3; + Message input = 4; + bool continue_session = 5; + uint32 max_turns = 6; + repeated Extension extensions = 7; +} + +message TurnReceipt { + string session_id = 1; + string turn_id = 2; + string state = 3; +} + +message RunTurnResponse { + string request_id = 1; + oneof outcome { + TurnReceipt accepted = 2; + Rejection rejected = 3; + } +} + +message CancelTurnRequest { + string request_id = 1; + string session_id = 2; + string turn_id = 3; + string reason = 4; +} + +message CancelTurnResponse { + string request_id = 1; + oneof outcome { + TurnReceipt accepted = 2; + Rejection rejected = 3; + } +} + +message CloseSessionRequest { + string request_id = 1; + string session_id = 2; + string reason = 3; +} + +message CloseSessionResponse { + string request_id = 1; + oneof outcome { + Session accepted = 2; + Rejection rejected = 3; + } +} + +message WatchEventsRequest { + string session_id = 1; + string after_cursor = 2; +} + +message EventDelivery { + string cursor = 1; + Event event = 2; +} + +message WatchEventsResponse { + EventDelivery delivery = 1; +} + +message ListEventsRequest { + string session_id = 1; + string after_cursor = 2; + uint32 limit = 3; +} + +message ListEventsResponse { + repeated EventDelivery events = 1; + string next_cursor = 2; +} + +service ChatService { + rpc OpenSession(OpenSessionRequest) returns (OpenSessionResponse); + rpc RunTurn(RunTurnRequest) returns (RunTurnResponse); + rpc CancelTurn(CancelTurnRequest) returns (CancelTurnResponse); + rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); + rpc WatchEvents(WatchEventsRequest) returns (stream WatchEventsResponse); + rpc ListEvents(ListEventsRequest) returns (ListEventsResponse); +} diff --git a/packages/aop/proto/aop/content.proto b/packages/aop/proto/aop/content.proto new file mode 100644 index 0000000..d711248 --- /dev/null +++ b/packages/aop/proto/aop/content.proto @@ -0,0 +1,83 @@ +syntax = "proto3"; + +package aop; + +import "aop/value.proto"; + +message Resource { + oneof source { + bytes data = 1; + string uri = 2; + } + string media_type = 3; + string filename = 4; +} + +message Annotation { + string type = 1; + uint64 start = 2; + uint64 end = 3; + string title = 4; + string uri = 5; + EncodedValue detail = 6; +} + +message TextContent { + string text = 1; + repeated Annotation annotations = 2; +} + +message ReasoningContent { + string text = 1; + bytes opaque = 2; + string opaque_type = 3; +} + +message MediaContent { + string kind = 1; + Resource resource = 2; + string transcript = 3; + EncodedValue detail = 4; +} + +message ToolCall { + string id = 1; + string name = 2; + string kind = 3; + EncodedValue arguments = 4; + string working_directory = 5; +} + +message ToolResult { + string call_id = 1; + repeated Content output = 2; + bool is_error = 3; + EncodedValue detail = 4; + string name = 5; + uint64 duration_ms = 6; + bool terminate = 7; +} + +message OpaqueContent { + string type = 1; + EncodedValue value = 2; +} + +message Content { + oneof value { + TextContent text = 1; + ReasoningContent reasoning = 2; + string refusal = 3; + MediaContent media = 4; + ToolCall tool_call = 5; + ToolResult tool_result = 6; + OpaqueContent opaque = 7; + } +} + +message Message { + string id = 1; + string role = 2; + string name = 3; + repeated Content content = 4; +} diff --git a/packages/aop/proto/aop/event.proto b/packages/aop/proto/aop/event.proto new file mode 100644 index 0000000..a56df21 --- /dev/null +++ b/packages/aop/proto/aop/event.proto @@ -0,0 +1,130 @@ +syntax = "proto3"; + +package aop; + +import "aop/content.proto"; +import "aop/value.proto"; +import "google/protobuf/timestamp.proto"; + +message SessionStarted { + string model = 1; + string parent_session_id = 2; + string parent_tool_call_id = 3; +} + +message SessionEnded { + string reason = 1; +} + +message TurnStarted {} + +message ProtocolError { + string code = 1; + string message = 2; + bool retryable = 3; + EncodedValue detail = 4; +} + +message TokenUsage { + uint64 input_tokens = 1; + uint64 output_tokens = 2; + uint64 total_tokens = 3; + string model = 4; + map detail = 5; +} + +message TurnEnded { + string stop_reason = 1; + ProtocolError error = 2; + TokenUsage usage = 3; + uint64 context_tokens = 4; +} + +enum DeltaOperation { + DELTA_OPERATION_UNSPECIFIED = 0; + DELTA_OPERATION_START = 1; + DELTA_OPERATION_APPEND = 2; + DELTA_OPERATION_REPLACE = 3; + DELTA_OPERATION_END = 4; +} + +message MessageDelta { + string message_id = 1; + uint32 content_index = 2; + DeltaOperation operation = 3; + oneof value { + string text = 4; + string reasoning = 5; + string refusal = 6; + bytes data = 7; + string tool_arguments = 8; + Content content = 9; + } +} + +message ToolCallDelta { + string call_id = 1; + uint32 index = 2; + string name = 3; + bytes arguments = 4; +} + +message Status { + string state = 1; + EncodedValue detail = 2; +} + +message ExtensionEvent { + string type = 1; + EncodedValue value = 2; +} + +enum Direction { + DIRECTION_UNSPECIFIED = 0; + DIRECTION_REQUEST = 1; + DIRECTION_RESPONSE = 2; +} + +message ProviderMetadata { + string name = 1; + bytes value = 2; +} + +// ProviderFrame preserves one exact provider body or stream frame. +message ProviderFrame { + string provider = 1; + string protocol = 2; + string event_type = 3; + Direction direction = 4; + string transport = 5; + bytes payload = 6; + string media_type = 7; + repeated ProviderMetadata metadata = 8; +} + +message Event { + string id = 1; + google.protobuf.Timestamp emitted_at = 2; + string session_id = 3; + string turn_id = 4; + string emitter = 5; + uint64 seq = 6; + repeated Extension extensions = 7; + + oneof payload { + SessionStarted session_started = 10; + SessionEnded session_ended = 11; + TurnStarted turn_started = 12; + TurnEnded turn_ended = 13; + Message message = 14; + MessageDelta message_delta = 15; + ToolCall tool_call = 16; + ToolCallDelta tool_call_delta = 17; + ToolResult tool_result = 18; + TokenUsage usage = 19; + ProtocolError error = 20; + Status status = 21; + ExtensionEvent extension = 22; + ProviderFrame provider_frame = 23; + } +} diff --git a/packages/aop/proto/aop/value.proto b/packages/aop/proto/aop/value.proto new file mode 100644 index 0000000..dfd8ceb --- /dev/null +++ b/packages/aop/proto/aop/value.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package aop; + +// EncodedValue preserves structured or binary data without JSON coercion. +message EncodedValue { + bytes data = 1; + string media_type = 2; +} + +// Extension carries namespaced semantics outside the stable AOP core. +message Extension { + string namespace = 1; + EncodedValue value = 2; +} diff --git a/packages/aop/src/gen/aiscan/chat/session_pb.ts b/packages/aop/src/gen/aiscan/chat/session_pb.ts new file mode 100644 index 0000000..1a587dc --- /dev/null +++ b/packages/aop/src/gen/aiscan/chat/session_pb.ts @@ -0,0 +1,602 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aiscan/chat/session.proto (package aiscan.chat, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Rejection, Session } from "../../aop/chat_pb.js"; +import { file_aop_chat } from "../../aop/chat_pb.js"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aiscan/chat/session.proto. + */ +export const file_aiscan_chat_session: GenFile = /*@__PURE__*/ + fileDesc("ChlhaXNjYW4vY2hhdC9zZXNzaW9uLnByb3RvEgthaXNjYW4uY2hhdCK0AQoNU2Vzc2lvblJlY29yZBIdCgdzZXNzaW9uGAEgASgLMgwuYW9wLlNlc3Npb24SEgoKYWdlbnRfbmFtZRgCIAEoCRIQCghzY2FuX2lkcxgDIAMoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJSChNMaXN0U2Vzc2lvbnNSZXF1ZXN0EhQKDGFmdGVyX2N1cnNvchgBIAEoCRINCgVsaW1pdBgCIAEoDRIWCg5pbmNsdWRlX2Nsb3NlZBgDIAEoCCJZChRMaXN0U2Vzc2lvbnNSZXNwb25zZRIsCghzZXNzaW9ucxgBIAMoCzIaLmFpc2Nhbi5jaGF0LlNlc3Npb25SZWNvcmQSEwoLbmV4dF9jdXJzb3IYAiABKAkiJwoRR2V0U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSJBChJHZXRTZXNzaW9uUmVzcG9uc2USKwoHc2Vzc2lvbhgBIAEoCzIaLmFpc2Nhbi5jaGF0LlNlc3Npb25SZWNvcmQiZAoTUmVzZXRTZXNzaW9uUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSFgoObmV3X3Nlc3Npb25faWQYAyABKAkSDQoFdGl0bGUYBCABKAkiYgoTUmVzZXRTZXNzaW9uUmVjZWlwdBIeCghwcmV2aW91cxgBIAEoCzIMLmFvcC5TZXNzaW9uEisKB2N1cnJlbnQYAiABKAsyGi5haXNjYW4uY2hhdC5TZXNzaW9uUmVjb3JkIo8BChRSZXNldFNlc3Npb25SZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEjQKCGFjY2VwdGVkGAIgASgLMiAuYWlzY2FuLmNoYXQuUmVzZXRTZXNzaW9uUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiPgoURGVsZXRlU2Vzc2lvblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJInwKFURlbGV0ZVNlc3Npb25SZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEiAKCGFjY2VwdGVkGAIgASgLMgwuYW9wLlNlc3Npb25IABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lIlAKC0NvbW1hbmRTcGVjEgwKBG5hbWUYASABKAkSDwoHYWxpYXNlcxgCIAMoCRINCgV1c2FnZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSIpChNMaXN0Q29tbWFuZHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiQgoUTGlzdENvbW1hbmRzUmVzcG9uc2USKgoIY29tbWFuZHMYASADKAsyGC5haXNjYW4uY2hhdC5Db21tYW5kU3BlYyJNChVFeGVjdXRlQ29tbWFuZFJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEgwKBGxpbmUYAyABKAkiSQoOQ29tbWFuZFJlY2VpcHQSFAoMb3BlcmF0aW9uX2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDQoFc3RhdGUYAyABKAkijAEKFkV4ZWN1dGVDb21tYW5kUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIvCghhY2NlcHRlZBgCIAEoCzIbLmFpc2Nhbi5jaGF0LkNvbW1hbmRSZWNlaXB0SAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSJ2ChhVcGxvYWRTZXNzaW9uRmlsZVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEhAKCGZpbGVuYW1lGAMgASgJEhIKCm1lZGlhX3R5cGUYBCABKAkSDAoEZGF0YRgFIAEoDCJQCgxVcGxvYWRlZEZpbGUSEAoIZmlsZW5hbWUYASABKAkSDAoEcGF0aBgCIAEoCRIMCgRzaXplGAMgASgDEhIKCm1lZGlhX3R5cGUYBCABKAkijQEKGVVwbG9hZFNlc3Npb25GaWxlUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRItCghhY2NlcHRlZBgCIAEoCzIZLmFpc2Nhbi5jaGF0LlVwbG9hZGVkRmlsZUgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUy9QQKDlNlc3Npb25TZXJ2aWNlElMKDExpc3RTZXNzaW9ucxIgLmFpc2Nhbi5jaGF0Lkxpc3RTZXNzaW9uc1JlcXVlc3QaIS5haXNjYW4uY2hhdC5MaXN0U2Vzc2lvbnNSZXNwb25zZRJNCgpHZXRTZXNzaW9uEh4uYWlzY2FuLmNoYXQuR2V0U2Vzc2lvblJlcXVlc3QaHy5haXNjYW4uY2hhdC5HZXRTZXNzaW9uUmVzcG9uc2USUwoMUmVzZXRTZXNzaW9uEiAuYWlzY2FuLmNoYXQuUmVzZXRTZXNzaW9uUmVxdWVzdBohLmFpc2Nhbi5jaGF0LlJlc2V0U2Vzc2lvblJlc3BvbnNlElYKDURlbGV0ZVNlc3Npb24SIS5haXNjYW4uY2hhdC5EZWxldGVTZXNzaW9uUmVxdWVzdBoiLmFpc2Nhbi5jaGF0LkRlbGV0ZVNlc3Npb25SZXNwb25zZRJTCgxMaXN0Q29tbWFuZHMSIC5haXNjYW4uY2hhdC5MaXN0Q29tbWFuZHNSZXF1ZXN0GiEuYWlzY2FuLmNoYXQuTGlzdENvbW1hbmRzUmVzcG9uc2USWQoORXhlY3V0ZUNvbW1hbmQSIi5haXNjYW4uY2hhdC5FeGVjdXRlQ29tbWFuZFJlcXVlc3QaIy5haXNjYW4uY2hhdC5FeGVjdXRlQ29tbWFuZFJlc3BvbnNlEmIKEVVwbG9hZFNlc3Npb25GaWxlEiUuYWlzY2FuLmNoYXQuVXBsb2FkU2Vzc2lvbkZpbGVSZXF1ZXN0GiYuYWlzY2FuLmNoYXQuVXBsb2FkU2Vzc2lvbkZpbGVSZXNwb25zZUI2WjRnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vY2hhdDtjaGF0YgZwcm90bzM", [file_aop_chat, file_google_protobuf_timestamp]); + +/** + * @generated from message aiscan.chat.SessionRecord + */ +export type SessionRecord = Message<"aiscan.chat.SessionRecord"> & { + /** + * @generated from field: aop.Session session = 1; + */ + session?: Session | undefined; + + /** + * @generated from field: string agent_name = 2; + */ + agentName: string; + + /** + * @generated from field: repeated string scan_ids = 3; + */ + scanIds: string[]; + + /** + * @generated from field: google.protobuf.Timestamp created_at = 4; + */ + createdAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp updated_at = 5; + */ + updatedAt?: Timestamp | undefined; +}; + +/** + * Describes the message aiscan.chat.SessionRecord. + * Use `create(SessionRecordSchema)` to create a new message. + */ +export const SessionRecordSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 0); + +/** + * @generated from message aiscan.chat.ListSessionsRequest + */ +export type ListSessionsRequest = Message<"aiscan.chat.ListSessionsRequest"> & { + /** + * @generated from field: string after_cursor = 1; + */ + afterCursor: string; + + /** + * @generated from field: uint32 limit = 2; + */ + limit: number; + + /** + * @generated from field: bool include_closed = 3; + */ + includeClosed: boolean; +}; + +/** + * Describes the message aiscan.chat.ListSessionsRequest. + * Use `create(ListSessionsRequestSchema)` to create a new message. + */ +export const ListSessionsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 1); + +/** + * @generated from message aiscan.chat.ListSessionsResponse + */ +export type ListSessionsResponse = Message<"aiscan.chat.ListSessionsResponse"> & { + /** + * @generated from field: repeated aiscan.chat.SessionRecord sessions = 1; + */ + sessions: SessionRecord[]; + + /** + * @generated from field: string next_cursor = 2; + */ + nextCursor: string; +}; + +/** + * Describes the message aiscan.chat.ListSessionsResponse. + * Use `create(ListSessionsResponseSchema)` to create a new message. + */ +export const ListSessionsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 2); + +/** + * @generated from message aiscan.chat.GetSessionRequest + */ +export type GetSessionRequest = Message<"aiscan.chat.GetSessionRequest"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; +}; + +/** + * Describes the message aiscan.chat.GetSessionRequest. + * Use `create(GetSessionRequestSchema)` to create a new message. + */ +export const GetSessionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 3); + +/** + * @generated from message aiscan.chat.GetSessionResponse + */ +export type GetSessionResponse = Message<"aiscan.chat.GetSessionResponse"> & { + /** + * @generated from field: aiscan.chat.SessionRecord session = 1; + */ + session?: SessionRecord | undefined; +}; + +/** + * Describes the message aiscan.chat.GetSessionResponse. + * Use `create(GetSessionResponseSchema)` to create a new message. + */ +export const GetSessionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 4); + +/** + * @generated from message aiscan.chat.ResetSessionRequest + */ +export type ResetSessionRequest = Message<"aiscan.chat.ResetSessionRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string new_session_id = 3; + */ + newSessionId: string; + + /** + * @generated from field: string title = 4; + */ + title: string; +}; + +/** + * Describes the message aiscan.chat.ResetSessionRequest. + * Use `create(ResetSessionRequestSchema)` to create a new message. + */ +export const ResetSessionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 5); + +/** + * @generated from message aiscan.chat.ResetSessionReceipt + */ +export type ResetSessionReceipt = Message<"aiscan.chat.ResetSessionReceipt"> & { + /** + * @generated from field: aop.Session previous = 1; + */ + previous?: Session | undefined; + + /** + * @generated from field: aiscan.chat.SessionRecord current = 2; + */ + current?: SessionRecord | undefined; +}; + +/** + * Describes the message aiscan.chat.ResetSessionReceipt. + * Use `create(ResetSessionReceiptSchema)` to create a new message. + */ +export const ResetSessionReceiptSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 6); + +/** + * @generated from message aiscan.chat.ResetSessionResponse + */ +export type ResetSessionResponse = Message<"aiscan.chat.ResetSessionResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.chat.ResetSessionResponse.outcome + */ + outcome: { + /** + * @generated from field: aiscan.chat.ResetSessionReceipt accepted = 2; + */ + value: ResetSessionReceipt; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.chat.ResetSessionResponse. + * Use `create(ResetSessionResponseSchema)` to create a new message. + */ +export const ResetSessionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 7); + +/** + * @generated from message aiscan.chat.DeleteSessionRequest + */ +export type DeleteSessionRequest = Message<"aiscan.chat.DeleteSessionRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; +}; + +/** + * Describes the message aiscan.chat.DeleteSessionRequest. + * Use `create(DeleteSessionRequestSchema)` to create a new message. + */ +export const DeleteSessionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 8); + +/** + * @generated from message aiscan.chat.DeleteSessionResponse + */ +export type DeleteSessionResponse = Message<"aiscan.chat.DeleteSessionResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.chat.DeleteSessionResponse.outcome + */ + outcome: { + /** + * @generated from field: aop.Session accepted = 2; + */ + value: Session; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.chat.DeleteSessionResponse. + * Use `create(DeleteSessionResponseSchema)` to create a new message. + */ +export const DeleteSessionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 9); + +/** + * @generated from message aiscan.chat.CommandSpec + */ +export type CommandSpec = Message<"aiscan.chat.CommandSpec"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: repeated string aliases = 2; + */ + aliases: string[]; + + /** + * @generated from field: string usage = 3; + */ + usage: string; + + /** + * @generated from field: string description = 4; + */ + description: string; +}; + +/** + * Describes the message aiscan.chat.CommandSpec. + * Use `create(CommandSpecSchema)` to create a new message. + */ +export const CommandSpecSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 10); + +/** + * @generated from message aiscan.chat.ListCommandsRequest + */ +export type ListCommandsRequest = Message<"aiscan.chat.ListCommandsRequest"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; +}; + +/** + * Describes the message aiscan.chat.ListCommandsRequest. + * Use `create(ListCommandsRequestSchema)` to create a new message. + */ +export const ListCommandsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 11); + +/** + * @generated from message aiscan.chat.ListCommandsResponse + */ +export type ListCommandsResponse = Message<"aiscan.chat.ListCommandsResponse"> & { + /** + * @generated from field: repeated aiscan.chat.CommandSpec commands = 1; + */ + commands: CommandSpec[]; +}; + +/** + * Describes the message aiscan.chat.ListCommandsResponse. + * Use `create(ListCommandsResponseSchema)` to create a new message. + */ +export const ListCommandsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 12); + +/** + * @generated from message aiscan.chat.ExecuteCommandRequest + */ +export type ExecuteCommandRequest = Message<"aiscan.chat.ExecuteCommandRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string line = 3; + */ + line: string; +}; + +/** + * Describes the message aiscan.chat.ExecuteCommandRequest. + * Use `create(ExecuteCommandRequestSchema)` to create a new message. + */ +export const ExecuteCommandRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 13); + +/** + * @generated from message aiscan.chat.CommandReceipt + */ +export type CommandReceipt = Message<"aiscan.chat.CommandReceipt"> & { + /** + * @generated from field: string operation_id = 1; + */ + operationId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string state = 3; + */ + state: string; +}; + +/** + * Describes the message aiscan.chat.CommandReceipt. + * Use `create(CommandReceiptSchema)` to create a new message. + */ +export const CommandReceiptSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 14); + +/** + * @generated from message aiscan.chat.ExecuteCommandResponse + */ +export type ExecuteCommandResponse = Message<"aiscan.chat.ExecuteCommandResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.chat.ExecuteCommandResponse.outcome + */ + outcome: { + /** + * @generated from field: aiscan.chat.CommandReceipt accepted = 2; + */ + value: CommandReceipt; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.chat.ExecuteCommandResponse. + * Use `create(ExecuteCommandResponseSchema)` to create a new message. + */ +export const ExecuteCommandResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 15); + +/** + * @generated from message aiscan.chat.UploadSessionFileRequest + */ +export type UploadSessionFileRequest = Message<"aiscan.chat.UploadSessionFileRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string filename = 3; + */ + filename: string; + + /** + * @generated from field: string media_type = 4; + */ + mediaType: string; + + /** + * @generated from field: bytes data = 5; + */ + data: Uint8Array; +}; + +/** + * Describes the message aiscan.chat.UploadSessionFileRequest. + * Use `create(UploadSessionFileRequestSchema)` to create a new message. + */ +export const UploadSessionFileRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 16); + +/** + * @generated from message aiscan.chat.UploadedFile + */ +export type UploadedFile = Message<"aiscan.chat.UploadedFile"> & { + /** + * @generated from field: string filename = 1; + */ + filename: string; + + /** + * @generated from field: string path = 2; + */ + path: string; + + /** + * @generated from field: int64 size = 3; + */ + size: bigint; + + /** + * @generated from field: string media_type = 4; + */ + mediaType: string; +}; + +/** + * Describes the message aiscan.chat.UploadedFile. + * Use `create(UploadedFileSchema)` to create a new message. + */ +export const UploadedFileSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 17); + +/** + * @generated from message aiscan.chat.UploadSessionFileResponse + */ +export type UploadSessionFileResponse = Message<"aiscan.chat.UploadSessionFileResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.chat.UploadSessionFileResponse.outcome + */ + outcome: { + /** + * @generated from field: aiscan.chat.UploadedFile accepted = 2; + */ + value: UploadedFile; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.chat.UploadSessionFileResponse. + * Use `create(UploadSessionFileResponseSchema)` to create a new message. + */ +export const UploadSessionFileResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_chat_session, 18); + +/** + * @generated from service aiscan.chat.SessionService + */ +export const SessionService: GenService<{ + /** + * @generated from rpc aiscan.chat.SessionService.ListSessions + */ + listSessions: { + methodKind: "unary"; + input: typeof ListSessionsRequestSchema; + output: typeof ListSessionsResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.GetSession + */ + getSession: { + methodKind: "unary"; + input: typeof GetSessionRequestSchema; + output: typeof GetSessionResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.ResetSession + */ + resetSession: { + methodKind: "unary"; + input: typeof ResetSessionRequestSchema; + output: typeof ResetSessionResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.DeleteSession + */ + deleteSession: { + methodKind: "unary"; + input: typeof DeleteSessionRequestSchema; + output: typeof DeleteSessionResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.ListCommands + */ + listCommands: { + methodKind: "unary"; + input: typeof ListCommandsRequestSchema; + output: typeof ListCommandsResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.ExecuteCommand + */ + executeCommand: { + methodKind: "unary"; + input: typeof ExecuteCommandRequestSchema; + output: typeof ExecuteCommandResponseSchema; + }, + /** + * @generated from rpc aiscan.chat.SessionService.UploadSessionFile + */ + uploadSessionFile: { + methodKind: "unary"; + input: typeof UploadSessionFileRequestSchema; + output: typeof UploadSessionFileResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_aiscan_chat_session, 0); + diff --git a/packages/aop/src/gen/aiscan/scan/scan_pb.ts b/packages/aop/src/gen/aiscan/scan/scan_pb.ts new file mode 100644 index 0000000..ccb125e --- /dev/null +++ b/packages/aop/src/gen/aiscan/scan/scan_pb.ts @@ -0,0 +1,640 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aiscan/scan/scan.proto (package aiscan.scan, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Rejection } from "../../aop/chat_pb.js"; +import { file_aop_chat } from "../../aop/chat_pb.js"; +import type { EncodedValue } from "../../aop/value_pb.js"; +import { file_aop_value } from "../../aop/value_pb.js"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aiscan/scan/scan.proto. + */ +export const file_aiscan_scan_scan: GenFile = /*@__PURE__*/ + fileDesc("ChZhaXNjYW4vc2Nhbi9zY2FuLnByb3RvEgthaXNjYW4uc2NhbiI7CgtTY2FuT3B0aW9ucxIOCgZ2ZXJpZnkYASABKAgSDgoGc25pcGVyGAIgASgIEgwKBGRlZXAYAyABKAgiuAIKBFNjYW4SCgoCaWQYASABKAkSDgoGdGFyZ2V0GAIgASgJEgwKBG1vZGUYAyABKAkSKQoHb3B0aW9ucxgEIAEoCzIYLmFpc2Nhbi5zY2FuLlNjYW5PcHRpb25zEicKBnN0YXR1cxgFIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXMSEAoIcHJvZ3Jlc3MYBiABKAkSDgoGcmVwb3J0GAcgASgJEiEKBnJlc3VsdBgIIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUSDQoFZXJyb3IYCSABKAkSLgoKY3JlYXRlZF9hdBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAicAoRU3VibWl0U2NhblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRIOCgZ0YXJnZXQYAiABKAkSDAoEbW9kZRgDIAEoCRIpCgdvcHRpb25zGAQgASgLMhguYWlzY2FuLnNjYW4uU2Nhbk9wdGlvbnMifgoSU3VibWl0U2NhblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJQoIYWNjZXB0ZWQYAiABKAsyES5haXNjYW4uc2Nhbi5TY2FuSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSIhCg5HZXRTY2FuUmVxdWVzdBIPCgdzY2FuX2lkGAEgASgJIjIKD0dldFNjYW5SZXNwb25zZRIfCgRzY2FuGAEgASgLMhEuYWlzY2FuLnNjYW4uU2NhbiISChBMaXN0U2NhbnNSZXF1ZXN0IjUKEUxpc3RTY2Fuc1Jlc3BvbnNlEiAKBXNjYW5zGAEgAygLMhEuYWlzY2FuLnNjYW4uU2NhbiI4ChFDYW5jZWxTY2FuUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3NjYW5faWQYAiABKAkifgoSQ2FuY2VsU2NhblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJQoIYWNjZXB0ZWQYAiABKAsyES5haXNjYW4uc2Nhbi5TY2FuSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSIpChZXYXRjaFNjYW5FdmVudHNSZXF1ZXN0Eg8KB3NjYW5faWQYASABKAkiHAoMU2NhblByb2dyZXNzEgwKBGRhdGEYASABKAkibgoJU2NhblN0YXRzEjIKBnZhbHVlcxgBIAMoCzIiLmFpc2Nhbi5zY2FuLlNjYW5TdGF0cy5WYWx1ZXNFbnRyeRotCgtWYWx1ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAQ6AjgBIjIKDVNjYW5Db21wbGV0ZWQSIQoGcmVzdWx0GAEgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSIvCgpTY2FuRmFpbGVkEg8KB21lc3NhZ2UYASABKAkSEAoIY2FuY2VsZWQYAiABKAgiTAoQU2Vzc2lvblNjYW5FdmVudBIPCgdzY2FuX2lkGAEgASgJEicKBnN0YXR1cxgCIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXMi7wIKCVNjYW5FdmVudBIPCgdzY2FuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEi4KCmVtaXR0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKCHNuYXBzaG90GAogASgLMhEuYWlzY2FuLnNjYW4uU2NhbkgAEikKBnN0YXR1cxgLIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXNIABItCghwcm9ncmVzcxgMIAEoCzIZLmFpc2Nhbi5zY2FuLlNjYW5Qcm9ncmVzc0gAEicKBXN0YXRzGA0gASgLMhYuYWlzY2FuLnNjYW4uU2NhblN0YXRzSAASLwoJY29tcGxldGVkGA4gASgLMhouYWlzY2FuLnNjYW4uU2NhbkNvbXBsZXRlZEgAEikKBmZhaWxlZBgPIAEoCzIXLmFpc2Nhbi5zY2FuLlNjYW5GYWlsZWRIAEIJCgdwYXlsb2FkIkAKF1dhdGNoU2NhbkV2ZW50c1Jlc3BvbnNlEiUKBWV2ZW50GAEgASgLMhYuYWlzY2FuLnNjYW4uU2NhbkV2ZW50IjkKFEdldFNjYW5SZXBvcnRSZXF1ZXN0Eg8KB3NjYW5faWQYASABKAkSEAoIbGFuZ3VhZ2UYAiABKAkiPQoVR2V0U2NhblJlcG9ydFJlc3BvbnNlEhAKCG1hcmtkb3duGAEgASgJEhIKCm1lZGlhX3R5cGUYAiABKAkqpwEKClNjYW5TdGF0dXMSGwoXU0NBTl9TVEFUVVNfVU5TUEVDSUZJRUQQABIWChJTQ0FOX1NUQVRVU19RVUVVRUQQARIXChNTQ0FOX1NUQVRVU19SVU5OSU5HEAISGQoVU0NBTl9TVEFUVVNfQ09NUExFVEVEEAMSFgoSU0NBTl9TVEFUVVNfRkFJTEVEEAQSGAoUU0NBTl9TVEFUVVNfQ0FOQ0VMRUQQBTL1AwoLU2NhblNlcnZpY2USTQoKU3VibWl0U2NhbhIeLmFpc2Nhbi5zY2FuLlN1Ym1pdFNjYW5SZXF1ZXN0Gh8uYWlzY2FuLnNjYW4uU3VibWl0U2NhblJlc3BvbnNlEkQKB0dldFNjYW4SGy5haXNjYW4uc2Nhbi5HZXRTY2FuUmVxdWVzdBocLmFpc2Nhbi5zY2FuLkdldFNjYW5SZXNwb25zZRJKCglMaXN0U2NhbnMSHS5haXNjYW4uc2Nhbi5MaXN0U2NhbnNSZXF1ZXN0Gh4uYWlzY2FuLnNjYW4uTGlzdFNjYW5zUmVzcG9uc2USTQoKQ2FuY2VsU2NhbhIeLmFpc2Nhbi5zY2FuLkNhbmNlbFNjYW5SZXF1ZXN0Gh8uYWlzY2FuLnNjYW4uQ2FuY2VsU2NhblJlc3BvbnNlEl4KD1dhdGNoU2NhbkV2ZW50cxIjLmFpc2Nhbi5zY2FuLldhdGNoU2NhbkV2ZW50c1JlcXVlc3QaJC5haXNjYW4uc2Nhbi5XYXRjaFNjYW5FdmVudHNSZXNwb25zZTABElYKDUdldFNjYW5SZXBvcnQSIS5haXNjYW4uc2Nhbi5HZXRTY2FuUmVwb3J0UmVxdWVzdBoiLmFpc2Nhbi5zY2FuLkdldFNjYW5SZXBvcnRSZXNwb25zZUI2WjRnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vc2NhbjtzY2FuYgZwcm90bzM", [file_aop_chat, file_aop_value, file_google_protobuf_timestamp]); + +/** + * @generated from message aiscan.scan.ScanOptions + */ +export type ScanOptions = Message<"aiscan.scan.ScanOptions"> & { + /** + * @generated from field: bool verify = 1; + */ + verify: boolean; + + /** + * @generated from field: bool sniper = 2; + */ + sniper: boolean; + + /** + * @generated from field: bool deep = 3; + */ + deep: boolean; +}; + +/** + * Describes the message aiscan.scan.ScanOptions. + * Use `create(ScanOptionsSchema)` to create a new message. + */ +export const ScanOptionsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 0); + +/** + * @generated from message aiscan.scan.Scan + */ +export type Scan = Message<"aiscan.scan.Scan"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string target = 2; + */ + target: string; + + /** + * @generated from field: string mode = 3; + */ + mode: string; + + /** + * @generated from field: aiscan.scan.ScanOptions options = 4; + */ + options?: ScanOptions | undefined; + + /** + * @generated from field: aiscan.scan.ScanStatus status = 5; + */ + status: ScanStatus; + + /** + * @generated from field: string progress = 6; + */ + progress: string; + + /** + * @generated from field: string report = 7; + */ + report: string; + + /** + * @generated from field: aop.EncodedValue result = 8; + */ + result?: EncodedValue | undefined; + + /** + * @generated from field: string error = 9; + */ + error: string; + + /** + * @generated from field: google.protobuf.Timestamp created_at = 10; + */ + createdAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp updated_at = 11; + */ + updatedAt?: Timestamp | undefined; +}; + +/** + * Describes the message aiscan.scan.Scan. + * Use `create(ScanSchema)` to create a new message. + */ +export const ScanSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 1); + +/** + * @generated from message aiscan.scan.SubmitScanRequest + */ +export type SubmitScanRequest = Message<"aiscan.scan.SubmitScanRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string target = 2; + */ + target: string; + + /** + * @generated from field: string mode = 3; + */ + mode: string; + + /** + * @generated from field: aiscan.scan.ScanOptions options = 4; + */ + options?: ScanOptions | undefined; +}; + +/** + * Describes the message aiscan.scan.SubmitScanRequest. + * Use `create(SubmitScanRequestSchema)` to create a new message. + */ +export const SubmitScanRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 2); + +/** + * @generated from message aiscan.scan.SubmitScanResponse + */ +export type SubmitScanResponse = Message<"aiscan.scan.SubmitScanResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.scan.SubmitScanResponse.outcome + */ + outcome: { + /** + * @generated from field: aiscan.scan.Scan accepted = 2; + */ + value: Scan; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.scan.SubmitScanResponse. + * Use `create(SubmitScanResponseSchema)` to create a new message. + */ +export const SubmitScanResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 3); + +/** + * @generated from message aiscan.scan.GetScanRequest + */ +export type GetScanRequest = Message<"aiscan.scan.GetScanRequest"> & { + /** + * @generated from field: string scan_id = 1; + */ + scanId: string; +}; + +/** + * Describes the message aiscan.scan.GetScanRequest. + * Use `create(GetScanRequestSchema)` to create a new message. + */ +export const GetScanRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 4); + +/** + * @generated from message aiscan.scan.GetScanResponse + */ +export type GetScanResponse = Message<"aiscan.scan.GetScanResponse"> & { + /** + * @generated from field: aiscan.scan.Scan scan = 1; + */ + scan?: Scan | undefined; +}; + +/** + * Describes the message aiscan.scan.GetScanResponse. + * Use `create(GetScanResponseSchema)` to create a new message. + */ +export const GetScanResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 5); + +/** + * @generated from message aiscan.scan.ListScansRequest + */ +export type ListScansRequest = Message<"aiscan.scan.ListScansRequest"> & { +}; + +/** + * Describes the message aiscan.scan.ListScansRequest. + * Use `create(ListScansRequestSchema)` to create a new message. + */ +export const ListScansRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 6); + +/** + * @generated from message aiscan.scan.ListScansResponse + */ +export type ListScansResponse = Message<"aiscan.scan.ListScansResponse"> & { + /** + * @generated from field: repeated aiscan.scan.Scan scans = 1; + */ + scans: Scan[]; +}; + +/** + * Describes the message aiscan.scan.ListScansResponse. + * Use `create(ListScansResponseSchema)` to create a new message. + */ +export const ListScansResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 7); + +/** + * @generated from message aiscan.scan.CancelScanRequest + */ +export type CancelScanRequest = Message<"aiscan.scan.CancelScanRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string scan_id = 2; + */ + scanId: string; +}; + +/** + * Describes the message aiscan.scan.CancelScanRequest. + * Use `create(CancelScanRequestSchema)` to create a new message. + */ +export const CancelScanRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 8); + +/** + * @generated from message aiscan.scan.CancelScanResponse + */ +export type CancelScanResponse = Message<"aiscan.scan.CancelScanResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aiscan.scan.CancelScanResponse.outcome + */ + outcome: { + /** + * @generated from field: aiscan.scan.Scan accepted = 2; + */ + value: Scan; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.scan.CancelScanResponse. + * Use `create(CancelScanResponseSchema)` to create a new message. + */ +export const CancelScanResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 9); + +/** + * @generated from message aiscan.scan.WatchScanEventsRequest + */ +export type WatchScanEventsRequest = Message<"aiscan.scan.WatchScanEventsRequest"> & { + /** + * @generated from field: string scan_id = 1; + */ + scanId: string; +}; + +/** + * Describes the message aiscan.scan.WatchScanEventsRequest. + * Use `create(WatchScanEventsRequestSchema)` to create a new message. + */ +export const WatchScanEventsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 10); + +/** + * @generated from message aiscan.scan.ScanProgress + */ +export type ScanProgress = Message<"aiscan.scan.ScanProgress"> & { + /** + * @generated from field: string data = 1; + */ + data: string; +}; + +/** + * Describes the message aiscan.scan.ScanProgress. + * Use `create(ScanProgressSchema)` to create a new message. + */ +export const ScanProgressSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 11); + +/** + * @generated from message aiscan.scan.ScanStats + */ +export type ScanStats = Message<"aiscan.scan.ScanStats"> & { + /** + * @generated from field: map values = 1; + */ + values: { [key: string]: bigint }; +}; + +/** + * Describes the message aiscan.scan.ScanStats. + * Use `create(ScanStatsSchema)` to create a new message. + */ +export const ScanStatsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 12); + +/** + * @generated from message aiscan.scan.ScanCompleted + */ +export type ScanCompleted = Message<"aiscan.scan.ScanCompleted"> & { + /** + * @generated from field: aop.EncodedValue result = 1; + */ + result?: EncodedValue | undefined; +}; + +/** + * Describes the message aiscan.scan.ScanCompleted. + * Use `create(ScanCompletedSchema)` to create a new message. + */ +export const ScanCompletedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 13); + +/** + * @generated from message aiscan.scan.ScanFailed + */ +export type ScanFailed = Message<"aiscan.scan.ScanFailed"> & { + /** + * @generated from field: string message = 1; + */ + message: string; + + /** + * @generated from field: bool canceled = 2; + */ + canceled: boolean; +}; + +/** + * Describes the message aiscan.scan.ScanFailed. + * Use `create(ScanFailedSchema)` to create a new message. + */ +export const ScanFailedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 14); + +/** + * SessionScanEvent links a completed scan into an AOP session timeline without + * reintroducing a parallel web-only domain event envelope. + * + * @generated from message aiscan.scan.SessionScanEvent + */ +export type SessionScanEvent = Message<"aiscan.scan.SessionScanEvent"> & { + /** + * @generated from field: string scan_id = 1; + */ + scanId: string; + + /** + * @generated from field: aiscan.scan.ScanStatus status = 2; + */ + status: ScanStatus; +}; + +/** + * Describes the message aiscan.scan.SessionScanEvent. + * Use `create(SessionScanEventSchema)` to create a new message. + */ +export const SessionScanEventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 15); + +/** + * @generated from message aiscan.scan.ScanEvent + */ +export type ScanEvent = Message<"aiscan.scan.ScanEvent"> & { + /** + * @generated from field: string scan_id = 1; + */ + scanId: string; + + /** + * @generated from field: uint64 sequence = 2; + */ + sequence: bigint; + + /** + * @generated from field: google.protobuf.Timestamp emitted_at = 3; + */ + emittedAt?: Timestamp | undefined; + + /** + * @generated from oneof aiscan.scan.ScanEvent.payload + */ + payload: { + /** + * @generated from field: aiscan.scan.Scan snapshot = 10; + */ + value: Scan; + case: "snapshot"; + } | { + /** + * @generated from field: aiscan.scan.ScanStatus status = 11; + */ + value: ScanStatus; + case: "status"; + } | { + /** + * @generated from field: aiscan.scan.ScanProgress progress = 12; + */ + value: ScanProgress; + case: "progress"; + } | { + /** + * @generated from field: aiscan.scan.ScanStats stats = 13; + */ + value: ScanStats; + case: "stats"; + } | { + /** + * @generated from field: aiscan.scan.ScanCompleted completed = 14; + */ + value: ScanCompleted; + case: "completed"; + } | { + /** + * @generated from field: aiscan.scan.ScanFailed failed = 15; + */ + value: ScanFailed; + case: "failed"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aiscan.scan.ScanEvent. + * Use `create(ScanEventSchema)` to create a new message. + */ +export const ScanEventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 16); + +/** + * @generated from message aiscan.scan.WatchScanEventsResponse + */ +export type WatchScanEventsResponse = Message<"aiscan.scan.WatchScanEventsResponse"> & { + /** + * @generated from field: aiscan.scan.ScanEvent event = 1; + */ + event?: ScanEvent | undefined; +}; + +/** + * Describes the message aiscan.scan.WatchScanEventsResponse. + * Use `create(WatchScanEventsResponseSchema)` to create a new message. + */ +export const WatchScanEventsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 17); + +/** + * @generated from message aiscan.scan.GetScanReportRequest + */ +export type GetScanReportRequest = Message<"aiscan.scan.GetScanReportRequest"> & { + /** + * @generated from field: string scan_id = 1; + */ + scanId: string; + + /** + * @generated from field: string language = 2; + */ + language: string; +}; + +/** + * Describes the message aiscan.scan.GetScanReportRequest. + * Use `create(GetScanReportRequestSchema)` to create a new message. + */ +export const GetScanReportRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 18); + +/** + * @generated from message aiscan.scan.GetScanReportResponse + */ +export type GetScanReportResponse = Message<"aiscan.scan.GetScanReportResponse"> & { + /** + * @generated from field: string markdown = 1; + */ + markdown: string; + + /** + * @generated from field: string media_type = 2; + */ + mediaType: string; +}; + +/** + * Describes the message aiscan.scan.GetScanReportResponse. + * Use `create(GetScanReportResponseSchema)` to create a new message. + */ +export const GetScanReportResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_scan_scan, 19); + +/** + * @generated from enum aiscan.scan.ScanStatus + */ +export enum ScanStatus { + /** + * @generated from enum value: SCAN_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: SCAN_STATUS_QUEUED = 1; + */ + QUEUED = 1, + + /** + * @generated from enum value: SCAN_STATUS_RUNNING = 2; + */ + RUNNING = 2, + + /** + * @generated from enum value: SCAN_STATUS_COMPLETED = 3; + */ + COMPLETED = 3, + + /** + * @generated from enum value: SCAN_STATUS_FAILED = 4; + */ + FAILED = 4, + + /** + * @generated from enum value: SCAN_STATUS_CANCELED = 5; + */ + CANCELED = 5, +} + +/** + * Describes the enum aiscan.scan.ScanStatus. + */ +export const ScanStatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_aiscan_scan_scan, 0); + +/** + * @generated from service aiscan.scan.ScanService + */ +export const ScanService: GenService<{ + /** + * @generated from rpc aiscan.scan.ScanService.SubmitScan + */ + submitScan: { + methodKind: "unary"; + input: typeof SubmitScanRequestSchema; + output: typeof SubmitScanResponseSchema; + }, + /** + * @generated from rpc aiscan.scan.ScanService.GetScan + */ + getScan: { + methodKind: "unary"; + input: typeof GetScanRequestSchema; + output: typeof GetScanResponseSchema; + }, + /** + * @generated from rpc aiscan.scan.ScanService.ListScans + */ + listScans: { + methodKind: "unary"; + input: typeof ListScansRequestSchema; + output: typeof ListScansResponseSchema; + }, + /** + * @generated from rpc aiscan.scan.ScanService.CancelScan + */ + cancelScan: { + methodKind: "unary"; + input: typeof CancelScanRequestSchema; + output: typeof CancelScanResponseSchema; + }, + /** + * @generated from rpc aiscan.scan.ScanService.WatchScanEvents + */ + watchScanEvents: { + methodKind: "server_streaming"; + input: typeof WatchScanEventsRequestSchema; + output: typeof WatchScanEventsResponseSchema; + }, + /** + * @generated from rpc aiscan.scan.ScanService.GetScanReport + */ + getScanReport: { + methodKind: "unary"; + input: typeof GetScanReportRequestSchema; + output: typeof GetScanReportResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_aiscan_scan_scan, 0); + diff --git a/packages/aop/src/gen/aiscan/transport/terminal_pb.ts b/packages/aop/src/gen/aiscan/transport/terminal_pb.ts new file mode 100644 index 0000000..f15eadb --- /dev/null +++ b/packages/aop/src/gen/aiscan/transport/terminal_pb.ts @@ -0,0 +1,195 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aiscan/transport/terminal.proto (package aiscan.transport, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aiscan/transport/terminal.proto. + */ +export const file_aiscan_transport_terminal: GenFile = /*@__PURE__*/ + fileDesc("Ch9haXNjYW4vdHJhbnNwb3J0L3Rlcm1pbmFsLnByb3RvEhBhaXNjYW4udHJhbnNwb3J0IsoCCgxUZXJtaW5hbEluZm8SCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEg8KB2NvbW1hbmQYBCABKAkSCwoDcGlkGAUgASgFEi4KCnN0YXJ0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKEGxhc3RfYWN0aXZpdHlfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIUCgxhY3Rpdml0eV9zZXEYCSABKAMSFAoMb3V0cHV0X2J5dGVzGAogASgDEhEKCWV4aXRfY29kZRgLIAEoBRINCgVzdGF0ZRgMIAEoCRISCgpraWxsX2NhdXNlGA0gASgJIu8CCg1UZXJtaW5hbEZyYW1lEgwKBHR5cGUYASABKAkSEQoJc3RyZWFtX2lkGAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkSDAoEa2luZBgEIAEoCRIMCgRuYW1lGAUgASgJEg8KB2NvbW1hbmQYBiABKAkSDAoEYXJncxgHIAMoCRIMCgRkYXRhGAggASgMEgwKBGNvbHMYCSABKAUSDAoEcm93cxgKIAEoBRINCgVieXRlcxgLIAEoBRIOCgZvZmZzZXQYDCABKAMSEQoJc2luZ2xldG9uGA0gASgIEg0KBWVycm9yGA4gASgJEg0KBXN0YXRlGA8gASgJEhEKCWV4aXRfY29kZRgQIAEoBRIvCgdzZXNzaW9uGBEgASgLMh4uYWlzY2FuLnRyYW5zcG9ydC5UZXJtaW5hbEluZm8SMAoIc2Vzc2lvbnMYEiADKAsyHi5haXNjYW4udHJhbnNwb3J0LlRlcm1pbmFsSW5mb0JAWj5naXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vdHJhbnNwb3J0O3RyYW5zcG9ydGIGcHJvdG8z", [file_google_protobuf_timestamp]); + +/** + * @generated from message aiscan.transport.TerminalInfo + */ +export type TerminalInfo = Message<"aiscan.transport.TerminalInfo"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string kind = 2; + */ + kind: string; + + /** + * @generated from field: string name = 3; + */ + name: string; + + /** + * @generated from field: string command = 4; + */ + command: string; + + /** + * @generated from field: int32 pid = 5; + */ + pid: number; + + /** + * @generated from field: google.protobuf.Timestamp started_at = 6; + */ + startedAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp last_activity_at = 7; + */ + lastActivityAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp ended_at = 8; + */ + endedAt?: Timestamp | undefined; + + /** + * @generated from field: int64 activity_seq = 9; + */ + activitySeq: bigint; + + /** + * @generated from field: int64 output_bytes = 10; + */ + outputBytes: bigint; + + /** + * @generated from field: int32 exit_code = 11; + */ + exitCode: number; + + /** + * @generated from field: string state = 12; + */ + state: string; + + /** + * @generated from field: string kill_cause = 13; + */ + killCause: string; +}; + +/** + * Describes the message aiscan.transport.TerminalInfo. + * Use `create(TerminalInfoSchema)` to create a new message. + */ +export const TerminalInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_transport_terminal, 0); + +/** + * @generated from message aiscan.transport.TerminalFrame + */ +export type TerminalFrame = Message<"aiscan.transport.TerminalFrame"> & { + /** + * @generated from field: string type = 1; + */ + type: string; + + /** + * @generated from field: string stream_id = 2; + */ + streamId: string; + + /** + * @generated from field: string session_id = 3; + */ + sessionId: string; + + /** + * @generated from field: string kind = 4; + */ + kind: string; + + /** + * @generated from field: string name = 5; + */ + name: string; + + /** + * @generated from field: string command = 6; + */ + command: string; + + /** + * @generated from field: repeated string args = 7; + */ + args: string[]; + + /** + * @generated from field: bytes data = 8; + */ + data: Uint8Array; + + /** + * @generated from field: int32 cols = 9; + */ + cols: number; + + /** + * @generated from field: int32 rows = 10; + */ + rows: number; + + /** + * @generated from field: int32 bytes = 11; + */ + bytes: number; + + /** + * @generated from field: int64 offset = 12; + */ + offset: bigint; + + /** + * @generated from field: bool singleton = 13; + */ + singleton: boolean; + + /** + * @generated from field: string error = 14; + */ + error: string; + + /** + * @generated from field: string state = 15; + */ + state: string; + + /** + * @generated from field: int32 exit_code = 16; + */ + exitCode: number; + + /** + * @generated from field: aiscan.transport.TerminalInfo session = 17; + */ + session?: TerminalInfo | undefined; + + /** + * @generated from field: repeated aiscan.transport.TerminalInfo sessions = 18; + */ + sessions: TerminalInfo[]; +}; + +/** + * Describes the message aiscan.transport.TerminalFrame. + * Use `create(TerminalFrameSchema)` to create a new message. + */ +export const TerminalFrameSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aiscan_transport_terminal, 1); + diff --git a/packages/aop/src/gen/aop/chat_pb.ts b/packages/aop/src/gen/aop/chat_pb.ts new file mode 100644 index 0000000..918c127 --- /dev/null +++ b/packages/aop/src/gen/aop/chat_pb.ts @@ -0,0 +1,565 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/chat.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message as Message$1 } from "./content_pb.js"; +import { file_aop_content } from "./content_pb.js"; +import type { Event } from "./event_pb.js"; +import { file_aop_event } from "./event_pb.js"; +import type { EncodedValue, Extension } from "./value_pb.js"; +import { file_aop_value } from "./value_pb.js"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/chat.proto. + */ +export const file_aop_chat: GenFile = /*@__PURE__*/ + fileDesc("Cg5hb3AvY2hhdC5wcm90bxIDYW9wImAKCVJlamVjdGlvbhIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiSAoHU2Vzc2lvbhIKCgJpZBgBIAEoCRINCgVzdGF0ZRgCIAEoCRITCgtwYXJ0aWNpcGFudBgDIAEoCRINCgV0aXRsZRgEIAEoCSK8AQoST3BlblNlc3Npb25SZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRITCgtwYXJ0aWNpcGFudBgDIAEoCRINCgV0aXRsZRgEIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgFIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAYgASgJEiIKCmV4dGVuc2lvbnMYByADKAsyDi5hb3AuRXh0ZW5zaW9uInoKE09wZW5TZXNzaW9uUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIgCghhY2NlcHRlZBgCIAEoCzIMLmFvcC5TZXNzaW9uSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSK3AQoOUnVuVHVyblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEg8KB3R1cm5faWQYAyABKAkSGwoFaW5wdXQYBCABKAsyDC5hb3AuTWVzc2FnZRIYChBjb250aW51ZV9zZXNzaW9uGAUgASgIEhEKCW1heF90dXJucxgGIAEoDRIiCgpleHRlbnNpb25zGAcgAygLMg4uYW9wLkV4dGVuc2lvbiJBCgtUdXJuUmVjZWlwdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSDQoFc3RhdGUYAyABKAkiegoPUnVuVHVyblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJAoIYWNjZXB0ZWQYAiABKAsyEC5hb3AuVHVyblJlY2VpcHRIABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lIlwKEUNhbmNlbFR1cm5SZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEg4KBnJlYXNvbhgEIAEoCSJ9ChJDYW5jZWxUdXJuUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIkCghhY2NlcHRlZBgCIAEoCzIQLmFvcC5UdXJuUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiTQoTQ2xvc2VTZXNzaW9uUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDgoGcmVhc29uGAMgASgJInsKFENsb3NlU2Vzc2lvblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSIAoIYWNjZXB0ZWQYAiABKAsyDC5hb3AuU2Vzc2lvbkgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiPgoSV2F0Y2hFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJIjoKDUV2ZW50RGVsaXZlcnkSDgoGY3Vyc29yGAEgASgJEhkKBWV2ZW50GAIgASgLMgouYW9wLkV2ZW50IjsKE1dhdGNoRXZlbnRzUmVzcG9uc2USJAoIZGVsaXZlcnkYASABKAsyEi5hb3AuRXZlbnREZWxpdmVyeSJMChFMaXN0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEhQKDGFmdGVyX2N1cnNvchgCIAEoCRINCgVsaW1pdBgDIAEoDSJNChJMaXN0RXZlbnRzUmVzcG9uc2USIgoGZXZlbnRzGAEgAygLMhIuYW9wLkV2ZW50RGVsaXZlcnkSEwoLbmV4dF9jdXJzb3IYAiABKAkyjAMKC0NoYXRTZXJ2aWNlEkAKC09wZW5TZXNzaW9uEhcuYW9wLk9wZW5TZXNzaW9uUmVxdWVzdBoYLmFvcC5PcGVuU2Vzc2lvblJlc3BvbnNlEjQKB1J1blR1cm4SEy5hb3AuUnVuVHVyblJlcXVlc3QaFC5hb3AuUnVuVHVyblJlc3BvbnNlEj0KCkNhbmNlbFR1cm4SFi5hb3AuQ2FuY2VsVHVyblJlcXVlc3QaFy5hb3AuQ2FuY2VsVHVyblJlc3BvbnNlEkMKDENsb3NlU2Vzc2lvbhIYLmFvcC5DbG9zZVNlc3Npb25SZXF1ZXN0GhkuYW9wLkNsb3NlU2Vzc2lvblJlc3BvbnNlEkIKC1dhdGNoRXZlbnRzEhcuYW9wLldhdGNoRXZlbnRzUmVxdWVzdBoYLmFvcC5XYXRjaEV2ZW50c1Jlc3BvbnNlMAESPQoKTGlzdEV2ZW50cxIWLmFvcC5MaXN0RXZlbnRzUmVxdWVzdBoXLmFvcC5MaXN0RXZlbnRzUmVzcG9uc2ViBnByb3RvMw", [file_aop_content, file_aop_event, file_aop_value]); + +/** + * @generated from message aop.Rejection + */ +export type Rejection = Message<"aop.Rejection"> & { + /** + * @generated from field: string code = 1; + */ + code: string; + + /** + * @generated from field: string message = 2; + */ + message: string; + + /** + * @generated from field: bool retryable = 3; + */ + retryable: boolean; + + /** + * @generated from field: aop.EncodedValue detail = 4; + */ + detail?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.Rejection. + * Use `create(RejectionSchema)` to create a new message. + */ +export const RejectionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 0); + +/** + * @generated from message aop.Session + */ +export type Session = Message<"aop.Session"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string state = 2; + */ + state: string; + + /** + * @generated from field: string participant = 3; + */ + participant: string; + + /** + * @generated from field: string title = 4; + */ + title: string; +}; + +/** + * Describes the message aop.Session. + * Use `create(SessionSchema)` to create a new message. + */ +export const SessionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 1); + +/** + * @generated from message aop.OpenSessionRequest + */ +export type OpenSessionRequest = Message<"aop.OpenSessionRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string participant = 3; + */ + participant: string; + + /** + * @generated from field: string title = 4; + */ + title: string; + + /** + * @generated from field: string parent_session_id = 5; + */ + parentSessionId: string; + + /** + * @generated from field: string parent_tool_call_id = 6; + */ + parentToolCallId: string; + + /** + * @generated from field: repeated aop.Extension extensions = 7; + */ + extensions: Extension[]; +}; + +/** + * Describes the message aop.OpenSessionRequest. + * Use `create(OpenSessionRequestSchema)` to create a new message. + */ +export const OpenSessionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 2); + +/** + * @generated from message aop.OpenSessionResponse + */ +export type OpenSessionResponse = Message<"aop.OpenSessionResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aop.OpenSessionResponse.outcome + */ + outcome: { + /** + * @generated from field: aop.Session accepted = 2; + */ + value: Session; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.OpenSessionResponse. + * Use `create(OpenSessionResponseSchema)` to create a new message. + */ +export const OpenSessionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 3); + +/** + * @generated from message aop.RunTurnRequest + */ +export type RunTurnRequest = Message<"aop.RunTurnRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string turn_id = 3; + */ + turnId: string; + + /** + * @generated from field: aop.Message input = 4; + */ + input?: Message$1 | undefined; + + /** + * @generated from field: bool continue_session = 5; + */ + continueSession: boolean; + + /** + * @generated from field: uint32 max_turns = 6; + */ + maxTurns: number; + + /** + * @generated from field: repeated aop.Extension extensions = 7; + */ + extensions: Extension[]; +}; + +/** + * Describes the message aop.RunTurnRequest. + * Use `create(RunTurnRequestSchema)` to create a new message. + */ +export const RunTurnRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 4); + +/** + * @generated from message aop.TurnReceipt + */ +export type TurnReceipt = Message<"aop.TurnReceipt"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; + + /** + * @generated from field: string turn_id = 2; + */ + turnId: string; + + /** + * @generated from field: string state = 3; + */ + state: string; +}; + +/** + * Describes the message aop.TurnReceipt. + * Use `create(TurnReceiptSchema)` to create a new message. + */ +export const TurnReceiptSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 5); + +/** + * @generated from message aop.RunTurnResponse + */ +export type RunTurnResponse = Message<"aop.RunTurnResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aop.RunTurnResponse.outcome + */ + outcome: { + /** + * @generated from field: aop.TurnReceipt accepted = 2; + */ + value: TurnReceipt; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.RunTurnResponse. + * Use `create(RunTurnResponseSchema)` to create a new message. + */ +export const RunTurnResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 6); + +/** + * @generated from message aop.CancelTurnRequest + */ +export type CancelTurnRequest = Message<"aop.CancelTurnRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string turn_id = 3; + */ + turnId: string; + + /** + * @generated from field: string reason = 4; + */ + reason: string; +}; + +/** + * Describes the message aop.CancelTurnRequest. + * Use `create(CancelTurnRequestSchema)` to create a new message. + */ +export const CancelTurnRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 7); + +/** + * @generated from message aop.CancelTurnResponse + */ +export type CancelTurnResponse = Message<"aop.CancelTurnResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aop.CancelTurnResponse.outcome + */ + outcome: { + /** + * @generated from field: aop.TurnReceipt accepted = 2; + */ + value: TurnReceipt; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.CancelTurnResponse. + * Use `create(CancelTurnResponseSchema)` to create a new message. + */ +export const CancelTurnResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 8); + +/** + * @generated from message aop.CloseSessionRequest + */ +export type CloseSessionRequest = Message<"aop.CloseSessionRequest"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: string reason = 3; + */ + reason: string; +}; + +/** + * Describes the message aop.CloseSessionRequest. + * Use `create(CloseSessionRequestSchema)` to create a new message. + */ +export const CloseSessionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 9); + +/** + * @generated from message aop.CloseSessionResponse + */ +export type CloseSessionResponse = Message<"aop.CloseSessionResponse"> & { + /** + * @generated from field: string request_id = 1; + */ + requestId: string; + + /** + * @generated from oneof aop.CloseSessionResponse.outcome + */ + outcome: { + /** + * @generated from field: aop.Session accepted = 2; + */ + value: Session; + case: "accepted"; + } | { + /** + * @generated from field: aop.Rejection rejected = 3; + */ + value: Rejection; + case: "rejected"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.CloseSessionResponse. + * Use `create(CloseSessionResponseSchema)` to create a new message. + */ +export const CloseSessionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 10); + +/** + * @generated from message aop.WatchEventsRequest + */ +export type WatchEventsRequest = Message<"aop.WatchEventsRequest"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; + + /** + * @generated from field: string after_cursor = 2; + */ + afterCursor: string; +}; + +/** + * Describes the message aop.WatchEventsRequest. + * Use `create(WatchEventsRequestSchema)` to create a new message. + */ +export const WatchEventsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 11); + +/** + * @generated from message aop.EventDelivery + */ +export type EventDelivery = Message<"aop.EventDelivery"> & { + /** + * @generated from field: string cursor = 1; + */ + cursor: string; + + /** + * @generated from field: aop.Event event = 2; + */ + event?: Event | undefined; +}; + +/** + * Describes the message aop.EventDelivery. + * Use `create(EventDeliverySchema)` to create a new message. + */ +export const EventDeliverySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 12); + +/** + * @generated from message aop.WatchEventsResponse + */ +export type WatchEventsResponse = Message<"aop.WatchEventsResponse"> & { + /** + * @generated from field: aop.EventDelivery delivery = 1; + */ + delivery?: EventDelivery | undefined; +}; + +/** + * Describes the message aop.WatchEventsResponse. + * Use `create(WatchEventsResponseSchema)` to create a new message. + */ +export const WatchEventsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 13); + +/** + * @generated from message aop.ListEventsRequest + */ +export type ListEventsRequest = Message<"aop.ListEventsRequest"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; + + /** + * @generated from field: string after_cursor = 2; + */ + afterCursor: string; + + /** + * @generated from field: uint32 limit = 3; + */ + limit: number; +}; + +/** + * Describes the message aop.ListEventsRequest. + * Use `create(ListEventsRequestSchema)` to create a new message. + */ +export const ListEventsRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 14); + +/** + * @generated from message aop.ListEventsResponse + */ +export type ListEventsResponse = Message<"aop.ListEventsResponse"> & { + /** + * @generated from field: repeated aop.EventDelivery events = 1; + */ + events: EventDelivery[]; + + /** + * @generated from field: string next_cursor = 2; + */ + nextCursor: string; +}; + +/** + * Describes the message aop.ListEventsResponse. + * Use `create(ListEventsResponseSchema)` to create a new message. + */ +export const ListEventsResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_chat, 15); + +/** + * @generated from service aop.ChatService + */ +export const ChatService: GenService<{ + /** + * @generated from rpc aop.ChatService.OpenSession + */ + openSession: { + methodKind: "unary"; + input: typeof OpenSessionRequestSchema; + output: typeof OpenSessionResponseSchema; + }, + /** + * @generated from rpc aop.ChatService.RunTurn + */ + runTurn: { + methodKind: "unary"; + input: typeof RunTurnRequestSchema; + output: typeof RunTurnResponseSchema; + }, + /** + * @generated from rpc aop.ChatService.CancelTurn + */ + cancelTurn: { + methodKind: "unary"; + input: typeof CancelTurnRequestSchema; + output: typeof CancelTurnResponseSchema; + }, + /** + * @generated from rpc aop.ChatService.CloseSession + */ + closeSession: { + methodKind: "unary"; + input: typeof CloseSessionRequestSchema; + output: typeof CloseSessionResponseSchema; + }, + /** + * @generated from rpc aop.ChatService.WatchEvents + */ + watchEvents: { + methodKind: "server_streaming"; + input: typeof WatchEventsRequestSchema; + output: typeof WatchEventsResponseSchema; + }, + /** + * @generated from rpc aop.ChatService.ListEvents + */ + listEvents: { + methodKind: "unary"; + input: typeof ListEventsRequestSchema; + output: typeof ListEventsResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_aop_chat, 0); + diff --git a/packages/aop/src/gen/aop/content_pb.ts b/packages/aop/src/gen/aop/content_pb.ts new file mode 100644 index 0000000..a1fabb7 --- /dev/null +++ b/packages/aop/src/gen/aop/content_pb.ts @@ -0,0 +1,375 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/content.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { EncodedValue } from "./value_pb.js"; +import { file_aop_value } from "./value_pb.js"; +import type { Message as Message$1 } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/content.proto. + */ +export const file_aop_content: GenFile = /*@__PURE__*/ + fileDesc("ChFhb3AvY29udGVudC5wcm90bxIDYW9wIlkKCFJlc291cmNlEg4KBGRhdGEYASABKAxIABINCgN1cmkYAiABKAlIABISCgptZWRpYV90eXBlGAMgASgJEhAKCGZpbGVuYW1lGAQgASgJQggKBnNvdXJjZSJ1CgpBbm5vdGF0aW9uEgwKBHR5cGUYASABKAkSDQoFc3RhcnQYAiABKAQSCwoDZW5kGAMgASgEEg0KBXRpdGxlGAQgASgJEgsKA3VyaRgFIAEoCRIhCgZkZXRhaWwYBiABKAsyES5hb3AuRW5jb2RlZFZhbHVlIkEKC1RleHRDb250ZW50EgwKBHRleHQYASABKAkSJAoLYW5ub3RhdGlvbnMYAiADKAsyDy5hb3AuQW5ub3RhdGlvbiJFChBSZWFzb25pbmdDb250ZW50EgwKBHRleHQYASABKAkSDgoGb3BhcXVlGAIgASgMEhMKC29wYXF1ZV90eXBlGAMgASgJInQKDE1lZGlhQ29udGVudBIMCgRraW5kGAEgASgJEh8KCHJlc291cmNlGAIgASgLMg0uYW9wLlJlc291cmNlEhIKCnRyYW5zY3JpcHQYAyABKAkSIQoGZGV0YWlsGAQgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSJzCghUb29sQ2FsbBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSJAoJYXJndW1lbnRzGAQgASgLMhEuYW9wLkVuY29kZWRWYWx1ZRIZChF3b3JraW5nX2RpcmVjdG9yeRgFIAEoCSKmAQoKVG9vbFJlc3VsdBIPCgdjYWxsX2lkGAEgASgJEhwKBm91dHB1dBgCIAMoCzIMLmFvcC5Db250ZW50EhAKCGlzX2Vycm9yGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUSDAoEbmFtZRgFIAEoCRITCgtkdXJhdGlvbl9tcxgGIAEoBBIRCgl0ZXJtaW5hdGUYByABKAgiPwoNT3BhcXVlQ29udGVudBIMCgR0eXBlGAEgASgJEiAKBXZhbHVlGAIgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSKJAgoHQ29udGVudBIgCgR0ZXh0GAEgASgLMhAuYW9wLlRleHRDb250ZW50SAASKgoJcmVhc29uaW5nGAIgASgLMhUuYW9wLlJlYXNvbmluZ0NvbnRlbnRIABIRCgdyZWZ1c2FsGAMgASgJSAASIgoFbWVkaWEYBCABKAsyES5hb3AuTWVkaWFDb250ZW50SAASIgoJdG9vbF9jYWxsGAUgASgLMg0uYW9wLlRvb2xDYWxsSAASJgoLdG9vbF9yZXN1bHQYBiABKAsyDy5hb3AuVG9vbFJlc3VsdEgAEiQKBm9wYXF1ZRgHIAEoCzISLmFvcC5PcGFxdWVDb250ZW50SABCBwoFdmFsdWUiUAoHTWVzc2FnZRIKCgJpZBgBIAEoCRIMCgRyb2xlGAIgASgJEgwKBG5hbWUYAyABKAkSHQoHY29udGVudBgEIAMoCzIMLmFvcC5Db250ZW50YgZwcm90bzM", [file_aop_value]); + +/** + * @generated from message aop.Resource + */ +export type Resource = Message$1<"aop.Resource"> & { + /** + * @generated from oneof aop.Resource.source + */ + source: { + /** + * @generated from field: bytes data = 1; + */ + value: Uint8Array; + case: "data"; + } | { + /** + * @generated from field: string uri = 2; + */ + value: string; + case: "uri"; + } | { case: undefined; value?: undefined }; + + /** + * @generated from field: string media_type = 3; + */ + mediaType: string; + + /** + * @generated from field: string filename = 4; + */ + filename: string; +}; + +/** + * Describes the message aop.Resource. + * Use `create(ResourceSchema)` to create a new message. + */ +export const ResourceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 0); + +/** + * @generated from message aop.Annotation + */ +export type Annotation = Message$1<"aop.Annotation"> & { + /** + * @generated from field: string type = 1; + */ + type: string; + + /** + * @generated from field: uint64 start = 2; + */ + start: bigint; + + /** + * @generated from field: uint64 end = 3; + */ + end: bigint; + + /** + * @generated from field: string title = 4; + */ + title: string; + + /** + * @generated from field: string uri = 5; + */ + uri: string; + + /** + * @generated from field: aop.EncodedValue detail = 6; + */ + detail?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.Annotation. + * Use `create(AnnotationSchema)` to create a new message. + */ +export const AnnotationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 1); + +/** + * @generated from message aop.TextContent + */ +export type TextContent = Message$1<"aop.TextContent"> & { + /** + * @generated from field: string text = 1; + */ + text: string; + + /** + * @generated from field: repeated aop.Annotation annotations = 2; + */ + annotations: Annotation[]; +}; + +/** + * Describes the message aop.TextContent. + * Use `create(TextContentSchema)` to create a new message. + */ +export const TextContentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 2); + +/** + * @generated from message aop.ReasoningContent + */ +export type ReasoningContent = Message$1<"aop.ReasoningContent"> & { + /** + * @generated from field: string text = 1; + */ + text: string; + + /** + * @generated from field: bytes opaque = 2; + */ + opaque: Uint8Array; + + /** + * @generated from field: string opaque_type = 3; + */ + opaqueType: string; +}; + +/** + * Describes the message aop.ReasoningContent. + * Use `create(ReasoningContentSchema)` to create a new message. + */ +export const ReasoningContentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 3); + +/** + * @generated from message aop.MediaContent + */ +export type MediaContent = Message$1<"aop.MediaContent"> & { + /** + * @generated from field: string kind = 1; + */ + kind: string; + + /** + * @generated from field: aop.Resource resource = 2; + */ + resource?: Resource | undefined; + + /** + * @generated from field: string transcript = 3; + */ + transcript: string; + + /** + * @generated from field: aop.EncodedValue detail = 4; + */ + detail?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.MediaContent. + * Use `create(MediaContentSchema)` to create a new message. + */ +export const MediaContentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 4); + +/** + * @generated from message aop.ToolCall + */ +export type ToolCall = Message$1<"aop.ToolCall"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string name = 2; + */ + name: string; + + /** + * @generated from field: string kind = 3; + */ + kind: string; + + /** + * @generated from field: aop.EncodedValue arguments = 4; + */ + arguments?: EncodedValue | undefined; + + /** + * @generated from field: string working_directory = 5; + */ + workingDirectory: string; +}; + +/** + * Describes the message aop.ToolCall. + * Use `create(ToolCallSchema)` to create a new message. + */ +export const ToolCallSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 5); + +/** + * @generated from message aop.ToolResult + */ +export type ToolResult = Message$1<"aop.ToolResult"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + + /** + * @generated from field: repeated aop.Content output = 2; + */ + output: Content[]; + + /** + * @generated from field: bool is_error = 3; + */ + isError: boolean; + + /** + * @generated from field: aop.EncodedValue detail = 4; + */ + detail?: EncodedValue | undefined; + + /** + * @generated from field: string name = 5; + */ + name: string; + + /** + * @generated from field: uint64 duration_ms = 6; + */ + durationMs: bigint; + + /** + * @generated from field: bool terminate = 7; + */ + terminate: boolean; +}; + +/** + * Describes the message aop.ToolResult. + * Use `create(ToolResultSchema)` to create a new message. + */ +export const ToolResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 6); + +/** + * @generated from message aop.OpaqueContent + */ +export type OpaqueContent = Message$1<"aop.OpaqueContent"> & { + /** + * @generated from field: string type = 1; + */ + type: string; + + /** + * @generated from field: aop.EncodedValue value = 2; + */ + value?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.OpaqueContent. + * Use `create(OpaqueContentSchema)` to create a new message. + */ +export const OpaqueContentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 7); + +/** + * @generated from message aop.Content + */ +export type Content = Message$1<"aop.Content"> & { + /** + * @generated from oneof aop.Content.value + */ + value: { + /** + * @generated from field: aop.TextContent text = 1; + */ + value: TextContent; + case: "text"; + } | { + /** + * @generated from field: aop.ReasoningContent reasoning = 2; + */ + value: ReasoningContent; + case: "reasoning"; + } | { + /** + * @generated from field: string refusal = 3; + */ + value: string; + case: "refusal"; + } | { + /** + * @generated from field: aop.MediaContent media = 4; + */ + value: MediaContent; + case: "media"; + } | { + /** + * @generated from field: aop.ToolCall tool_call = 5; + */ + value: ToolCall; + case: "toolCall"; + } | { + /** + * @generated from field: aop.ToolResult tool_result = 6; + */ + value: ToolResult; + case: "toolResult"; + } | { + /** + * @generated from field: aop.OpaqueContent opaque = 7; + */ + value: OpaqueContent; + case: "opaque"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.Content. + * Use `create(ContentSchema)` to create a new message. + */ +export const ContentSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 8); + +/** + * @generated from message aop.Message + */ +export type Message = Message$1<"aop.Message"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string role = 2; + */ + role: string; + + /** + * @generated from field: string name = 3; + */ + name: string; + + /** + * @generated from field: repeated aop.Content content = 4; + */ + content: Content[]; +}; + +/** + * Describes the message aop.Message. + * Use `create(MessageSchema)` to create a new message. + */ +export const MessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_content, 9); + diff --git a/packages/aop/src/gen/aop/event_pb.ts b/packages/aop/src/gen/aop/event_pb.ts new file mode 100644 index 0000000..88d3ef4 --- /dev/null +++ b/packages/aop/src/gen/aop/event_pb.ts @@ -0,0 +1,596 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/event.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Content, Message as Message$1, ToolCall, ToolResult } from "./content_pb.js"; +import { file_aop_content } from "./content_pb.js"; +import type { EncodedValue, Extension } from "./value_pb.js"; +import { file_aop_value } from "./value_pb.js"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/event.proto. + */ +export const file_aop_event: GenFile = /*@__PURE__*/ + fileDesc("Cg9hb3AvZXZlbnQucHJvdG8SA2FvcCJXCg5TZXNzaW9uU3RhcnRlZBINCgVtb2RlbBgBIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgCIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAMgASgJIh4KDFNlc3Npb25FbmRlZBIOCgZyZWFzb24YASABKAkiDQoLVHVyblN0YXJ0ZWQiZAoNUHJvdG9jb2xFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiugEKClRva2VuVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSFAoMdG90YWxfdG9rZW5zGAMgASgEEg0KBW1vZGVsGAQgASgJEisKBmRldGFpbBgFIAMoCzIbLmFvcC5Ub2tlblVzYWdlLkRldGFpbEVudHJ5Gi0KC0RldGFpbEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEiewoJVHVybkVuZGVkEhMKC3N0b3BfcmVhc29uGAEgASgJEiEKBWVycm9yGAIgASgLMhIuYW9wLlByb3RvY29sRXJyb3ISHgoFdXNhZ2UYAyABKAsyDy5hb3AuVG9rZW5Vc2FnZRIWCg5jb250ZXh0X3Rva2VucxgEIAEoBCLtAQoMTWVzc2FnZURlbHRhEhIKCm1lc3NhZ2VfaWQYASABKAkSFQoNY29udGVudF9pbmRleBgCIAEoDRImCglvcGVyYXRpb24YAyABKA4yEy5hb3AuRGVsdGFPcGVyYXRpb24SDgoEdGV4dBgEIAEoCUgAEhMKCXJlYXNvbmluZxgFIAEoCUgAEhEKB3JlZnVzYWwYBiABKAlIABIOCgRkYXRhGAcgASgMSAASGAoOdG9vbF9hcmd1bWVudHMYCCABKAlIABIfCgdjb250ZW50GAkgASgLMgwuYW9wLkNvbnRlbnRIAEIHCgV2YWx1ZSJQCg1Ub29sQ2FsbERlbHRhEg8KB2NhbGxfaWQYASABKAkSDQoFaW5kZXgYAiABKA0SDAoEbmFtZRgDIAEoCRIRCglhcmd1bWVudHMYBCABKAwiOgoGU3RhdHVzEg0KBXN0YXRlGAEgASgJEiEKBmRldGFpbBgCIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiQAoORXh0ZW5zaW9uRXZlbnQSDAoEdHlwZRgBIAEoCRIgCgV2YWx1ZRgCIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiLwoQUHJvdmlkZXJNZXRhZGF0YRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgMIssBCg1Qcm92aWRlckZyYW1lEhAKCHByb3ZpZGVyGAEgASgJEhAKCHByb3RvY29sGAIgASgJEhIKCmV2ZW50X3R5cGUYAyABKAkSIQoJZGlyZWN0aW9uGAQgASgOMg4uYW9wLkRpcmVjdGlvbhIRCgl0cmFuc3BvcnQYBSABKAkSDwoHcGF5bG9hZBgGIAEoDBISCgptZWRpYV90eXBlGAcgASgJEicKCG1ldGFkYXRhGAggAygLMhUuYW9wLlByb3ZpZGVyTWV0YWRhdGEi5wUKBUV2ZW50EgoKAmlkGAEgASgJEi4KCmVtaXR0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCnNlc3Npb25faWQYAyABKAkSDwoHdHVybl9pZBgEIAEoCRIPCgdlbWl0dGVyGAUgASgJEgsKA3NlcRgGIAEoBBIiCgpleHRlbnNpb25zGAcgAygLMg4uYW9wLkV4dGVuc2lvbhIuCg9zZXNzaW9uX3N0YXJ0ZWQYCiABKAsyEy5hb3AuU2Vzc2lvblN0YXJ0ZWRIABIqCg1zZXNzaW9uX2VuZGVkGAsgASgLMhEuYW9wLlNlc3Npb25FbmRlZEgAEigKDHR1cm5fc3RhcnRlZBgMIAEoCzIQLmFvcC5UdXJuU3RhcnRlZEgAEiQKCnR1cm5fZW5kZWQYDSABKAsyDi5hb3AuVHVybkVuZGVkSAASHwoHbWVzc2FnZRgOIAEoCzIMLmFvcC5NZXNzYWdlSAASKgoNbWVzc2FnZV9kZWx0YRgPIAEoCzIRLmFvcC5NZXNzYWdlRGVsdGFIABIiCgl0b29sX2NhbGwYECABKAsyDS5hb3AuVG9vbENhbGxIABItCg90b29sX2NhbGxfZGVsdGEYESABKAsyEi5hb3AuVG9vbENhbGxEZWx0YUgAEiYKC3Rvb2xfcmVzdWx0GBIgASgLMg8uYW9wLlRvb2xSZXN1bHRIABIgCgV1c2FnZRgTIAEoCzIPLmFvcC5Ub2tlblVzYWdlSAASIwoFZXJyb3IYFCABKAsyEi5hb3AuUHJvdG9jb2xFcnJvckgAEh0KBnN0YXR1cxgVIAEoCzILLmFvcC5TdGF0dXNIABIoCglleHRlbnNpb24YFiABKAsyEy5hb3AuRXh0ZW5zaW9uRXZlbnRIABIsCg5wcm92aWRlcl9mcmFtZRgXIAEoCzISLmFvcC5Qcm92aWRlckZyYW1lSABCCQoHcGF5bG9hZCqeAQoORGVsdGFPcGVyYXRpb24SHwobREVMVEFfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASGQoVREVMVEFfT1BFUkFUSU9OX1NUQVJUEAESGgoWREVMVEFfT1BFUkFUSU9OX0FQUEVORBACEhsKF0RFTFRBX09QRVJBVElPTl9SRVBMQUNFEAMSFwoTREVMVEFfT1BFUkFUSU9OX0VORBAEKlUKCURpcmVjdGlvbhIZChVESVJFQ1RJT05fVU5TUEVDSUZJRUQQABIVChFESVJFQ1RJT05fUkVRVUVTVBABEhYKEkRJUkVDVElPTl9SRVNQT05TRRACYgZwcm90bzM", [file_aop_content, file_aop_value, file_google_protobuf_timestamp]); + +/** + * @generated from message aop.SessionStarted + */ +export type SessionStarted = Message<"aop.SessionStarted"> & { + /** + * @generated from field: string model = 1; + */ + model: string; + + /** + * @generated from field: string parent_session_id = 2; + */ + parentSessionId: string; + + /** + * @generated from field: string parent_tool_call_id = 3; + */ + parentToolCallId: string; +}; + +/** + * Describes the message aop.SessionStarted. + * Use `create(SessionStartedSchema)` to create a new message. + */ +export const SessionStartedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 0); + +/** + * @generated from message aop.SessionEnded + */ +export type SessionEnded = Message<"aop.SessionEnded"> & { + /** + * @generated from field: string reason = 1; + */ + reason: string; +}; + +/** + * Describes the message aop.SessionEnded. + * Use `create(SessionEndedSchema)` to create a new message. + */ +export const SessionEndedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 1); + +/** + * @generated from message aop.TurnStarted + */ +export type TurnStarted = Message<"aop.TurnStarted"> & { +}; + +/** + * Describes the message aop.TurnStarted. + * Use `create(TurnStartedSchema)` to create a new message. + */ +export const TurnStartedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 2); + +/** + * @generated from message aop.ProtocolError + */ +export type ProtocolError = Message<"aop.ProtocolError"> & { + /** + * @generated from field: string code = 1; + */ + code: string; + + /** + * @generated from field: string message = 2; + */ + message: string; + + /** + * @generated from field: bool retryable = 3; + */ + retryable: boolean; + + /** + * @generated from field: aop.EncodedValue detail = 4; + */ + detail?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.ProtocolError. + * Use `create(ProtocolErrorSchema)` to create a new message. + */ +export const ProtocolErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 3); + +/** + * @generated from message aop.TokenUsage + */ +export type TokenUsage = Message<"aop.TokenUsage"> & { + /** + * @generated from field: uint64 input_tokens = 1; + */ + inputTokens: bigint; + + /** + * @generated from field: uint64 output_tokens = 2; + */ + outputTokens: bigint; + + /** + * @generated from field: uint64 total_tokens = 3; + */ + totalTokens: bigint; + + /** + * @generated from field: string model = 4; + */ + model: string; + + /** + * @generated from field: map detail = 5; + */ + detail: { [key: string]: bigint }; +}; + +/** + * Describes the message aop.TokenUsage. + * Use `create(TokenUsageSchema)` to create a new message. + */ +export const TokenUsageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 4); + +/** + * @generated from message aop.TurnEnded + */ +export type TurnEnded = Message<"aop.TurnEnded"> & { + /** + * @generated from field: string stop_reason = 1; + */ + stopReason: string; + + /** + * @generated from field: aop.ProtocolError error = 2; + */ + error?: ProtocolError | undefined; + + /** + * @generated from field: aop.TokenUsage usage = 3; + */ + usage?: TokenUsage | undefined; + + /** + * @generated from field: uint64 context_tokens = 4; + */ + contextTokens: bigint; +}; + +/** + * Describes the message aop.TurnEnded. + * Use `create(TurnEndedSchema)` to create a new message. + */ +export const TurnEndedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 5); + +/** + * @generated from message aop.MessageDelta + */ +export type MessageDelta = Message<"aop.MessageDelta"> & { + /** + * @generated from field: string message_id = 1; + */ + messageId: string; + + /** + * @generated from field: uint32 content_index = 2; + */ + contentIndex: number; + + /** + * @generated from field: aop.DeltaOperation operation = 3; + */ + operation: DeltaOperation; + + /** + * @generated from oneof aop.MessageDelta.value + */ + value: { + /** + * @generated from field: string text = 4; + */ + value: string; + case: "text"; + } | { + /** + * @generated from field: string reasoning = 5; + */ + value: string; + case: "reasoning"; + } | { + /** + * @generated from field: string refusal = 6; + */ + value: string; + case: "refusal"; + } | { + /** + * @generated from field: bytes data = 7; + */ + value: Uint8Array; + case: "data"; + } | { + /** + * @generated from field: string tool_arguments = 8; + */ + value: string; + case: "toolArguments"; + } | { + /** + * @generated from field: aop.Content content = 9; + */ + value: Content; + case: "content"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.MessageDelta. + * Use `create(MessageDeltaSchema)` to create a new message. + */ +export const MessageDeltaSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 6); + +/** + * @generated from message aop.ToolCallDelta + */ +export type ToolCallDelta = Message<"aop.ToolCallDelta"> & { + /** + * @generated from field: string call_id = 1; + */ + callId: string; + + /** + * @generated from field: uint32 index = 2; + */ + index: number; + + /** + * @generated from field: string name = 3; + */ + name: string; + + /** + * @generated from field: bytes arguments = 4; + */ + arguments: Uint8Array; +}; + +/** + * Describes the message aop.ToolCallDelta. + * Use `create(ToolCallDeltaSchema)` to create a new message. + */ +export const ToolCallDeltaSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 7); + +/** + * @generated from message aop.Status + */ +export type Status = Message<"aop.Status"> & { + /** + * @generated from field: string state = 1; + */ + state: string; + + /** + * @generated from field: aop.EncodedValue detail = 2; + */ + detail?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.Status. + * Use `create(StatusSchema)` to create a new message. + */ +export const StatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 8); + +/** + * @generated from message aop.ExtensionEvent + */ +export type ExtensionEvent = Message<"aop.ExtensionEvent"> & { + /** + * @generated from field: string type = 1; + */ + type: string; + + /** + * @generated from field: aop.EncodedValue value = 2; + */ + value?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.ExtensionEvent. + * Use `create(ExtensionEventSchema)` to create a new message. + */ +export const ExtensionEventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 9); + +/** + * @generated from message aop.ProviderMetadata + */ +export type ProviderMetadata = Message<"aop.ProviderMetadata"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: bytes value = 2; + */ + value: Uint8Array; +}; + +/** + * Describes the message aop.ProviderMetadata. + * Use `create(ProviderMetadataSchema)` to create a new message. + */ +export const ProviderMetadataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 10); + +/** + * ProviderFrame preserves one exact provider body or stream frame. + * + * @generated from message aop.ProviderFrame + */ +export type ProviderFrame = Message<"aop.ProviderFrame"> & { + /** + * @generated from field: string provider = 1; + */ + provider: string; + + /** + * @generated from field: string protocol = 2; + */ + protocol: string; + + /** + * @generated from field: string event_type = 3; + */ + eventType: string; + + /** + * @generated from field: aop.Direction direction = 4; + */ + direction: Direction; + + /** + * @generated from field: string transport = 5; + */ + transport: string; + + /** + * @generated from field: bytes payload = 6; + */ + payload: Uint8Array; + + /** + * @generated from field: string media_type = 7; + */ + mediaType: string; + + /** + * @generated from field: repeated aop.ProviderMetadata metadata = 8; + */ + metadata: ProviderMetadata[]; +}; + +/** + * Describes the message aop.ProviderFrame. + * Use `create(ProviderFrameSchema)` to create a new message. + */ +export const ProviderFrameSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 11); + +/** + * @generated from message aop.Event + */ +export type Event = Message<"aop.Event"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: google.protobuf.Timestamp emitted_at = 2; + */ + emittedAt?: Timestamp | undefined; + + /** + * @generated from field: string session_id = 3; + */ + sessionId: string; + + /** + * @generated from field: string turn_id = 4; + */ + turnId: string; + + /** + * @generated from field: string emitter = 5; + */ + emitter: string; + + /** + * @generated from field: uint64 seq = 6; + */ + seq: bigint; + + /** + * @generated from field: repeated aop.Extension extensions = 7; + */ + extensions: Extension[]; + + /** + * @generated from oneof aop.Event.payload + */ + payload: { + /** + * @generated from field: aop.SessionStarted session_started = 10; + */ + value: SessionStarted; + case: "sessionStarted"; + } | { + /** + * @generated from field: aop.SessionEnded session_ended = 11; + */ + value: SessionEnded; + case: "sessionEnded"; + } | { + /** + * @generated from field: aop.TurnStarted turn_started = 12; + */ + value: TurnStarted; + case: "turnStarted"; + } | { + /** + * @generated from field: aop.TurnEnded turn_ended = 13; + */ + value: TurnEnded; + case: "turnEnded"; + } | { + /** + * @generated from field: aop.Message message = 14; + */ + value: Message$1; + case: "message"; + } | { + /** + * @generated from field: aop.MessageDelta message_delta = 15; + */ + value: MessageDelta; + case: "messageDelta"; + } | { + /** + * @generated from field: aop.ToolCall tool_call = 16; + */ + value: ToolCall; + case: "toolCall"; + } | { + /** + * @generated from field: aop.ToolCallDelta tool_call_delta = 17; + */ + value: ToolCallDelta; + case: "toolCallDelta"; + } | { + /** + * @generated from field: aop.ToolResult tool_result = 18; + */ + value: ToolResult; + case: "toolResult"; + } | { + /** + * @generated from field: aop.TokenUsage usage = 19; + */ + value: TokenUsage; + case: "usage"; + } | { + /** + * @generated from field: aop.ProtocolError error = 20; + */ + value: ProtocolError; + case: "error"; + } | { + /** + * @generated from field: aop.Status status = 21; + */ + value: Status; + case: "status"; + } | { + /** + * @generated from field: aop.ExtensionEvent extension = 22; + */ + value: ExtensionEvent; + case: "extension"; + } | { + /** + * @generated from field: aop.ProviderFrame provider_frame = 23; + */ + value: ProviderFrame; + case: "providerFrame"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.Event. + * Use `create(EventSchema)` to create a new message. + */ +export const EventSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_event, 12); + +/** + * @generated from enum aop.DeltaOperation + */ +export enum DeltaOperation { + /** + * @generated from enum value: DELTA_OPERATION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: DELTA_OPERATION_START = 1; + */ + START = 1, + + /** + * @generated from enum value: DELTA_OPERATION_APPEND = 2; + */ + APPEND = 2, + + /** + * @generated from enum value: DELTA_OPERATION_REPLACE = 3; + */ + REPLACE = 3, + + /** + * @generated from enum value: DELTA_OPERATION_END = 4; + */ + END = 4, +} + +/** + * Describes the enum aop.DeltaOperation. + */ +export const DeltaOperationSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_aop_event, 0); + +/** + * @generated from enum aop.Direction + */ +export enum Direction { + /** + * @generated from enum value: DIRECTION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: DIRECTION_REQUEST = 1; + */ + REQUEST = 1, + + /** + * @generated from enum value: DIRECTION_RESPONSE = 2; + */ + RESPONSE = 2, +} + +/** + * Describes the enum aop.Direction. + */ +export const DirectionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_aop_event, 1); + diff --git a/packages/aop/src/gen/aop/value_pb.ts b/packages/aop/src/gen/aop/value_pb.ts new file mode 100644 index 0000000..e028194 --- /dev/null +++ b/packages/aop/src/gen/aop/value_pb.ts @@ -0,0 +1,62 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/value.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/value.proto. + */ +export const file_aop_value: GenFile = /*@__PURE__*/ + fileDesc("Cg9hb3AvdmFsdWUucHJvdG8SA2FvcCIwCgxFbmNvZGVkVmFsdWUSDAoEZGF0YRgBIAEoDBISCgptZWRpYV90eXBlGAIgASgJIkAKCUV4dGVuc2lvbhIRCgluYW1lc3BhY2UYASABKAkSIAoFdmFsdWUYAiABKAsyES5hb3AuRW5jb2RlZFZhbHVlYgZwcm90bzM"); + +/** + * EncodedValue preserves structured or binary data without JSON coercion. + * + * @generated from message aop.EncodedValue + */ +export type EncodedValue = Message<"aop.EncodedValue"> & { + /** + * @generated from field: bytes data = 1; + */ + data: Uint8Array; + + /** + * @generated from field: string media_type = 2; + */ + mediaType: string; +}; + +/** + * Describes the message aop.EncodedValue. + * Use `create(EncodedValueSchema)` to create a new message. + */ +export const EncodedValueSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_value, 0); + +/** + * Extension carries namespaced semantics outside the stable AOP core. + * + * @generated from message aop.Extension + */ +export type Extension = Message<"aop.Extension"> & { + /** + * @generated from field: string namespace = 1; + */ + namespace: string; + + /** + * @generated from field: aop.EncodedValue value = 2; + */ + value?: EncodedValue | undefined; +}; + +/** + * Describes the message aop.Extension. + * Use `create(ExtensionSchema)` to create a new message. + */ +export const ExtensionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_value, 1); + diff --git a/packages/aop/src/index.ts b/packages/aop/src/index.ts new file mode 100644 index 0000000..c0f2bc8 --- /dev/null +++ b/packages/aop/src/index.ts @@ -0,0 +1,14 @@ +export * from './gen/aop/value_pb.js' +export * from './gen/aop/content_pb.js' +export * from './gen/aop/event_pb.js' +export * from './gen/aop/chat_pb.js' +export * from './gen/aiscan/chat/session_pb.js' +export * from './gen/aiscan/scan/scan_pb.js' +export * from './gen/aiscan/transport/terminal_pb.js' + +import { fromJson, type JsonValue } from '@bufbuild/protobuf' +import { EventSchema, type Event } from './gen/aop/event_pb.js' + +export function eventFromJson(value: unknown): Event { + return fromJson(EventSchema, value as JsonValue) +} diff --git a/packages/aop/tsconfig.json b/packages/aop/tsconfig.json new file mode 100644 index 0000000..32a1de5 --- /dev/null +++ b/packages/aop/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src"] +} diff --git a/packages/terminal/package.json b/packages/terminal/package.json index b7887fa..e5926a2 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -18,6 +18,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@bufbuild/protobuf": "^2.9.0", + "@cyber/aop": "workspace:*", "@cyber/theme": "workspace:*", "@xterm/addon-fit": "^0.11.0", "@xterm/xterm": "^6.0.0", diff --git a/packages/terminal/src/index.tsx b/packages/terminal/src/index.tsx index 8b5d1dc..ce2ddb4 100644 --- a/packages/terminal/src/index.tsx +++ b/packages/terminal/src/index.tsx @@ -4,6 +4,14 @@ import { Terminal as XTerm, type ILink } from '@xterm/xterm' import '@xterm/xterm/css/xterm.css' import { Monitor as LucideMonitor, X as LucideX } from 'lucide-react' import { cn } from '@cyber/theme' +import { create, fromJson, toJson, type JsonValue, type MessageInitShape } from '@bufbuild/protobuf' +import { + TerminalFrameSchema, + TerminalInfoSchema, + type TerminalFrame, + type TerminalInfo, +} from '@cyber/aop' +import type { Timestamp } from '@bufbuild/protobuf/wkt' const Monitor = LucideMonitor as unknown as ComponentType> const X = LucideX as unknown as ComponentType> @@ -26,43 +34,9 @@ export type PTYFrameType = | 'closed' | 'error' -export interface PTYFrame { - type: PTYFrameType - stream_id?: string - session_id?: string - kind?: string - name?: string - command?: string - args?: string[] - data?: string - cols?: number - rows?: number - bytes?: number - offset?: number - singleton?: boolean - error?: string - state?: string - exit_code?: number - session?: PTYSession - sessions?: PTYSession[] -} - -export interface PTYSession { - id: string - name?: string - kind?: string - command?: string - state?: string - pid?: number - started_at?: string - last_activity_at?: string - ended_at?: string - exit_code?: number - kill_cause?: string - output_bytes?: number - activity_seq?: number - [key: string]: unknown -} +export type PTYFrame = TerminalFrame +export type PTYFrameInit = MessageInitShape +export type PTYSession = TerminalInfo export interface TerminalLink { text: string @@ -256,18 +230,18 @@ export function WebSocketTerminal({ let activeSession = '' let initializedSession = '' - const send = (message: Record) => { - if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(message)) + const send = (message: PTYFrameInit) => { + if (socket?.readyState === WebSocket.OPEN) socket.send(serializePTYFrame(message)) } const size = () => ({ cols: terminal.cols, rows: terminal.rows }) const dataDisposable = terminal.onData((data) => { if (!activeSession) return - send({ type: 'input', session_id: activeSession, data: encodeTerminalData(data) }) + send({ type: 'input', sessionId: activeSession, data: encodeTerminalData(data) }) if (/\r|\n/.test(data)) window.setTimeout(() => commandCompleteRef.current?.(), 400) }) const resizeDisposable = terminal.onResize(({ cols, rows }) => { - if (activeSession) send({ type: 'resize', session_id: activeSession, cols, rows }) + if (activeSession) send({ type: 'resize', sessionId: activeSession, cols, rows }) }) const linkProvider = terminal.registerLinkProvider({ provideLinks(lineNumber, callback) { @@ -308,7 +282,7 @@ export function WebSocketTerminal({ case 'opened': case 'attached': { const session = sessionFromFrame(message) - activeSession = message.session_id || session?.id || '' + activeSession = message.sessionId || session?.id || '' setSessionTitle(session?.name || activeSession) sessionChangeRef.current?.(session) updateStatus('connected') @@ -316,7 +290,7 @@ export function WebSocketTerminal({ initializedSession = activeSession send({ type: 'input', - session_id: activeSession, + sessionId: activeSession, data: encodeTerminalData(initialInput), }) } @@ -363,9 +337,9 @@ export function WebSocketTerminal({ if (reconnectTimer) window.clearTimeout(reconnectTimer) if (socket?.readyState === WebSocket.OPEN) { if (killOnUnmount && activeSession) { - socket.send(JSON.stringify({ type: 'kill', session_id: activeSession })) + socket.send(serializePTYFrame({ type: 'kill', sessionId: activeSession })) } - socket.send(JSON.stringify({ type: 'detach', session_id: activeSession || undefined })) + socket.send(serializePTYFrame({ type: 'detach', sessionId: activeSession })) } socket?.close() dataDisposable.dispose() @@ -530,18 +504,19 @@ export function DetailRow({ label, mono, value }: { label: string; mono?: boolea export function parsePTYFrame(value: string): PTYFrame | null { try { - const parsed = JSON.parse(value) - return parsed && typeof parsed === 'object' && isPTYFrameType(parsed.type) ? parsed as PTYFrame : null + const parsed = fromJson(TerminalFrameSchema, JSON.parse(value) as JsonValue) + return isPTYFrameType(parsed.type) ? parsed : null } catch { return null } } -export function encodeTerminalData(value: string): string { - const bytes = new TextEncoder().encode(value) - let binary = '' - for (const byte of bytes) binary += String.fromCharCode(byte) - return btoa(binary) +export function serializePTYFrame(value: PTYFrameInit): string { + return JSON.stringify(toJson(TerminalFrameSchema, create(TerminalFrameSchema, value))) +} + +export function encodeTerminalData(value: string): Uint8Array { + return new TextEncoder().encode(value) } export function writeTerminalData(terminal: XTerm, frame: PTYFrame) { @@ -549,21 +524,27 @@ export function writeTerminalData(terminal: XTerm, frame: PTYFrame) { } export function sessionsFromFrame(frame: PTYFrame): PTYSession[] { - const sessions = Array.isArray(frame.sessions) ? frame.sessions : [] - return sessions.map(normalizeSession).filter((session): session is PTYSession => !!session) + return frame.sessions.filter((session) => !!session.id) } export function sessionFromFrame(frame: PTYFrame): PTYSession | null { - const session = normalizeSession(frame.session) - if (session) return session - return normalizeSession(frame) + if (frame.session?.id) return frame.session + if (!frame.sessionId) return null + return create(TerminalInfoSchema, { + id: frame.sessionId, + kind: frame.kind, + name: frame.name, + command: frame.command, + state: frame.state, + exitCode: frame.exitCode, + }) } export function mergeSession(items: PTYSession[], session: PTYSession): PTYSession[] { const index = items.findIndex((item) => item.id === session.id) if (index < 0) return [...items, session] const next = [...items] - next[index] = { ...next[index], ...session } + next[index] = create(TerminalInfoSchema, { ...next[index], ...session }) return next } @@ -578,12 +559,12 @@ export function compareSessionsByActivity(a: PTYSession, b: PTYSession): number // observed, so mixing it with epoch-millisecond timestamps in one subtraction // produced an incoherent, churning order (finished tasks jumped rank every // 350ms broadcast). activity_seq stays reserved for unread detection only. - return timestampValue(b.last_activity_at) - timestampValue(a.last_activity_at) - || timestampValue(b.started_at) - timestampValue(a.started_at) + return timestampValue(b.lastActivityAt) - timestampValue(a.lastActivityAt) + || timestampValue(b.startedAt) - timestampValue(a.startedAt) } export function activitySeq(session: PTYSession): number { - return positiveNumber(session.activity_seq) || timestampValue(session.last_activity_at) || timestampValue(session.started_at) + return positiveNumber(session.activitySeq) || timestampValue(session.lastActivityAt) || timestampValue(session.startedAt) } export function sessionTitle(session: PTYSession): string { @@ -600,8 +581,8 @@ export function sessionDetails(session: PTYSession): string { session.state ? `state: ${stateLabel(session.state)}` : '', session.command ? `command: ${session.command}` : '', session.pid ? `pid: ${session.pid}` : '', - session.started_at ? `started: ${formatDateTime(session.started_at)}` : '', - session.last_activity_at ? `activity: ${formatDateTime(session.last_activity_at)}` : '', + session.startedAt ? `started: ${formatDateTime(session.startedAt)}` : '', + session.lastActivityAt ? `activity: ${formatDateTime(session.lastActivityAt)}` : '', ].filter(Boolean).join('\n') } @@ -634,14 +615,16 @@ export function terminalStatusColor(status: TerminalStatus): string { } } -export function formatDateTime(value?: string): string | undefined { +export function formatDateTime(value?: Timestamp | string): string | undefined { if (!value) return undefined - const date = new Date(value) - if (Number.isNaN(date.getTime())) return value + const date = typeof value === 'string' + ? new Date(value) + : new Date(Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000)) + if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : undefined return date.toLocaleString() } -export function formatBytes(value?: number): string | undefined { +export function formatBytes(value?: number | bigint): string | undefined { const n = positiveNumber(value) if (!n) return undefined if (n < 1024) return `${n} B` @@ -650,11 +633,12 @@ export function formatBytes(value?: number): string | undefined { } export function positiveNumber(value: unknown): number | undefined { + if (typeof value === 'bigint') return value > 0n ? Number(value) : undefined return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined } function sessionMeta(session: PTYSession): string { - return [session.kind, session.pid ? `pid ${session.pid}` : '', formatDateTime(session.last_activity_at)].filter(Boolean).join(' / ') + return [session.kind, session.pid ? `pid ${session.pid}` : '', formatDateTime(session.lastActivityAt)].filter(Boolean).join(' / ') } function stateColor(state?: string): string { @@ -683,38 +667,8 @@ function stateTextColor(state?: string): string { } } -function normalizeSession(value: unknown): PTYSession | null { - if (!value || typeof value !== 'object') return null - const record = value as Record - const id = stringValue(record.id) || stringValue(record.session_id) - if (!id) return null - return { - ...record, - id, - name: stringValue(record.name), - kind: stringValue(record.kind), - command: stringValue(record.command), - state: stringValue(record.state), - pid: numberValue(record.pid), - started_at: stringValue(record.started_at), - last_activity_at: stringValue(record.last_activity_at), - ended_at: stringValue(record.ended_at), - exit_code: numberValue(record.exit_code), - kill_cause: stringValue(record.kill_cause), - output_bytes: numberValue(record.output_bytes), - activity_seq: numberValue(record.activity_seq), - } -} - function frameData(frame: PTYFrame): string { - if (!frame.data) return '' - try { - const binary = atob(frame.data) - const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0)) - return new TextDecoder().decode(bytes) - } catch { - return '' - } + return frame.data.length ? new TextDecoder().decode(frame.data) : '' } function isPTYFrameType(value: unknown): value is PTYFrameType { @@ -724,16 +678,7 @@ function isPTYFrameType(value: unknown): value is PTYFrameType { ].includes(value) } -function stringValue(value: unknown): string | undefined { - return typeof value === 'string' && value ? value : undefined -} - -function numberValue(value: unknown): number | undefined { - return typeof value === 'number' && Number.isFinite(value) ? value : undefined -} - -function timestampValue(value?: string): number { +function timestampValue(value?: Timestamp): number { if (!value) return 0 - const timestamp = new Date(value).getTime() - return Number.isNaN(timestamp) ? 0 : timestamp + return Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000) } diff --git a/packages/viewer/package.json b/packages/viewer/package.json index 1208012..18dcf63 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -20,7 +20,7 @@ "test": "vitest run" }, "dependencies": { - "@cyber/agent-protocol": "workspace:*", + "@cyber/aop": "workspace:*", "@cyber/theme": "workspace:*", "@cyber/ui": "workspace:*", "@cyber/markdown": "workspace:*", @@ -35,6 +35,7 @@ "@xyflow/react": "^12.0.0" }, "devDependencies": { + "@bufbuild/protobuf": "^2.9.0", "@types/react": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", "typescript": "^5.7.0", diff --git a/packages/viewer/src/components/chat/AOPChatPanel.tsx b/packages/viewer/src/components/chat/AOPChatPanel.tsx index 1a39968..caba67a 100644 --- a/packages/viewer/src/components/chat/AOPChatPanel.tsx +++ b/packages/viewer/src/components/chat/AOPChatPanel.tsx @@ -1,11 +1,11 @@ import React, { useMemo } from 'react' -import type { AOPEvent } from '@cyber/agent-protocol' +import type { Event } from '@cyber/aop' import { reduceAOPToTimeline, type ReduceAOPOptions } from '../../lib/aop-reducer' import { ChatPanel } from './ChatPanel' import type { ChatPanelProps, ChatPanelTimelineProps } from './ChatPanel' export interface AOPChatPanelProps extends Omit { - events: readonly AOPEvent[] + events: readonly Event[] streaming?: boolean lifecycle?: ReduceAOPOptions['lifecycle'] timelineProps?: ChatPanelTimelineProps diff --git a/packages/viewer/src/index.ts b/packages/viewer/src/index.ts index b016cb9..22d2468 100644 --- a/packages/viewer/src/index.ts +++ b/packages/viewer/src/index.ts @@ -91,26 +91,8 @@ export type { export type { APGEvent, WireEvent } from './types/protocol' export type { ReduceAOPOptions } from './lib/aop-reducer' export type { AOPChatPanelProps } from './components/chat/AOPChatPanel' -export type { - AOPEvent, - AOPEventType, - AOPData, - ImageSource, - MessagePart, - MessagePartType, - SessionStartData, - SessionEndData, - MessageData, - MessageDeltaData, - ToolCallData, - ToolResultData, - UsageData, - TurnStartData, - TurnEndData, - ErrorData as AOPErrorData, - StatusData, -} from '@cyber/agent-protocol' -export { isAOPEvent } from '@cyber/agent-protocol' +export type { Event as AOPEvent, Content as AOPContent } from '@cyber/aop' +export { EventSchema as AOPEventSchema, eventFromJson } from '@cyber/aop' export { isAgentEvent, eventType, eventTimestamp, eventAgent } from './types/protocol' export type { TimelineItem, diff --git a/packages/viewer/src/lib/aop-reducer.test.ts b/packages/viewer/src/lib/aop-reducer.test.ts index f19ef97..1c6bf00 100644 --- a/packages/viewer/src/lib/aop-reducer.test.ts +++ b/packages/viewer/src/lib/aop-reducer.test.ts @@ -1,425 +1,52 @@ +import { create } from '@bufbuild/protobuf' +import { + ContentSchema, + EventSchema, + MessageDeltaSchema, + MessageSchema, + TextContentSchema, + ToolCallSchema, + ToolResultSchema, + type Event, +} from '@cyber/aop' import { describe, expect, it } from 'vitest' - -import type { AOPEvent } from '@cyber/agent-protocol' import { reduceAOPToTimeline } from './aop-reducer' -import type { AssistantResponseTimelineItem, MessageTimelineItem } from '../types/timeline' - -const TS = '2026-07-19T00:00:00Z' -function ev(seq: number, type: string, data: unknown, extra?: Partial): AOPEvent { - return { - type: type as AOPEvent['type'], - ts: TS, - session_id: 's1', - agent: 'aiscan', - seq, - data, - ...extra, - } as AOPEvent -} - -function messages(items: ReturnType): MessageTimelineItem[] { - return items.filter((i): i is MessageTimelineItem => i.kind === 'message') +function event(seq: number, payload: Event['payload']): Event { + return create(EventSchema, { + id: `event-${seq}`, + sessionId: 'session-1', + turnId: 'turn-1', + emitter: 'agent-1', + seq: BigInt(seq), + payload, + }) } -function responses(items: ReturnType): AssistantResponseTimelineItem[] { - return items.filter((i): i is AssistantResponseTimelineItem => i.kind === 'assistant_response') +function text(value: string) { + return create(ContentSchema, { value: { case: 'text', value: create(TextContentSchema, { text: value }) } }) } describe('reduceAOPToTimeline', () => { - it('brackets a run with session dividers', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'session.end', { reason: 'completed' }), - ]) - expect(items.map((i) => i.kind)).toEqual(['divider', 'divider']) - expect(items[0]).toMatchObject({ variant: 'info' }) - expect(items[1]).toMatchObject({ variant: 'success', label: 'Session ended' }) - }) - - it('labels a child run as a sub-session', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', { parent_session_id: 'root-session' }, { session_id: 'child-session' }), - ]) - expect(items[0]).toMatchObject({ - kind: 'divider', - label: 'aiscan sub-session started', - }) - }) - - it('marks a non-routine session end reason as a warning', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.end', { reason: 'canceled' }), - ]) - expect(items[0]).toMatchObject({ kind: 'divider', variant: 'warning', label: 'Session ended: canceled' }) - }) - - it('folds thinking and response deltas into one assistant card', () => { - const items = reduceAOPToTimeline([ - ev(1, 'message.delta', { message_id: 'm-1', part_type: 'reasoning', part_index: 0, delta: 'think-' }), - ev(2, 'message.delta', { message_id: 'm-1', part_type: 'reasoning', part_index: 0, delta: 'hard' }), - ev(3, 'message.delta', { message_id: 'm-1', part_type: 'text', part_index: 1, delta: 'ans-' }), - ev(4, 'message.delta', { message_id: 'm-1', part_type: 'text', part_index: 1, delta: 'wer' }), - ev(5, 'message', { - message_id: 'm-1', - role: 'assistant', - parts: [ - { type: 'reasoning', text: 'think-hard' }, - { type: 'text', text: 'ans-wer' }, - ], - }), - ]) - const cards = responses(items) - expect(cards).toHaveLength(1) - expect(cards[0]).toMatchObject({ - thinking: 'think-hard', - response: { content: 'ans-wer' }, - streaming: false, - }) - }) - - it('replays idempotently: seq duplicates are suppressed, final message upserts', () => { - const stream = [ - ev(1, 'message.delta', { message_id: 'm-1', part_type: 'text', part_index: 0, delta: 'hel' }), - ev(2, 'message', { message_id: 'm-1', role: 'assistant', parts: [{ type: 'text', text: 'hello' }] }), + it('uses deltas for streaming and the complete message as authority', () => { + const events = [ + event(1, { case: 'messageDelta', value: create(MessageDeltaSchema, { messageId: 'm1', value: { case: 'text', value: 'hel' } }) }), + event(2, { case: 'messageDelta', value: create(MessageDeltaSchema, { messageId: 'm1', value: { case: 'text', value: 'lo' } }) }), + event(3, { case: 'message', value: create(MessageSchema, { id: 'm1', role: 'assistant', content: [text('hello')] }) }), ] - const once = reduceAOPToTimeline(stream) - const twice = reduceAOPToTimeline([...stream, ...stream]) - expect(responses(twice)).toHaveLength(responses(once).length) - expect(responses(twice)[0].response?.content).toBe('hello') - }) - - it('drops a redelivered seqless user echo instead of rendering it twice', () => { - // The hub echoes each user message as an AOP `message` with seq omitted - // (0 → omitempty), so the seq-based replay guard can't suppress a double - // delivery. Deduping by the message's stable id must, or the operator sees - // their own message twice. - const echo = { - type: 'message', - ts: TS, - session_id: 's1', - agent: 'aiscan.web', - data: { message_id: 'user-echo-1', role: 'user', parts: [{ type: 'text', text: '帮我测试' }] }, - } as AOPEvent - const items = reduceAOPToTimeline([echo, echo]) - expect(messages(items)).toHaveLength(1) - expect(messages(items)[0]).toMatchObject({ role: 'user', content: '帮我测试' }) - }) - - it('pairs tool.call with tool.result inside one assistant card', () => { - const items = reduceAOPToTimeline([ - ev(1, 'tool.call', { tool_call_id: 'tc-1', tool_name: 'bash', args: { command: 'ls' } }), - ev(2, 'tool.result', { tool_call_id: 'tc-1', tool_name: 'bash', content: 'ok' }), - ]) - expect(items).toHaveLength(1) - const card = items[0] as AssistantResponseTimelineItem - expect(card.kind).toBe('assistant_response') - expect(card.tools[0]).toMatchObject({ id: 'tc-1', toolName: 'bash', pending: false, result: 'ok' }) - }) - - it('keeps user messages and assistant cards in stream order and attaches usage', () => { - const items = reduceAOPToTimeline([ - ev(1, 'message', { message_id: 'u-1', role: 'user', parts: [{ type: 'text', text: 'hi' }] }), - ev(2, 'message', { message_id: 'a-1', role: 'assistant', parts: [{ type: 'text', text: 'yo' }] }), - ev(3, 'usage', { input_tokens: 10, output_tokens: 5, total_tokens: 15, model: 'm' }), - ]) - expect(items.map((item) => item.kind)).toEqual(['message', 'assistant_response']) - expect(messages(items)[0].role).toBe('user') - expect((responses(items)[0].response?.metadata?.usage as Record)?.total_tokens).toBe(15) - }) - - it('groups thinking, response, and tools by AOP turn boundaries', () => { - const items = reduceAOPToTimeline([ - ev(1, 'turn.start', {}, { turn_id: 'run-3' }), - ev(2, 'message.delta', { message_id: 'm-3', part_type: 'reasoning', part_index: 0, delta: 'inspect' }, { turn_id: 'run-3' }), - ev(3, 'message', { - message_id: 'm-3', - role: 'assistant', - parts: [ - { type: 'reasoning', text: 'inspect target' }, - { type: 'text', text: 'running check' }, - ], - }, { turn_id: 'run-3' }), - ev(4, 'tool.call', { tool_call_id: 'tc-3', tool_name: 'bash', args: { command: 'whoami' } }, { turn_id: 'run-3' }), - ev(5, 'tool.result', { tool_call_id: 'tc-3', tool_name: 'bash', content: 'john' }, { turn_id: 'run-3' }), - ev(6, 'turn.end', { stop: 'completed' }, { turn_id: 'run-3' }), - ]) - - expect(items).toHaveLength(1) - expect(responses(items)[0]).toMatchObject({ - id: 'aop:s1:aiscan:turn:run-3:response', - thinking: 'inspect target', - response: { content: 'running check' }, - tools: [{ id: 'tc-3', toolName: 'bash', result: 'john', pending: false }], - streaming: false, - }) - }) - - it('keeps canonical turn ids isolated within one long-lived session', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'turn.start', {}, { turn_id: 'run-1' }), - ev(3, 'message', { - message_id: 'm-1', role: 'assistant', parts: [{ type: 'text', text: 'first' }], - }, { turn_id: 'run-1' }), - ev(4, 'turn.end', { stop: 'completed' }, { turn_id: 'run-1' }), - ev(5, 'turn.start', {}, { turn_id: 'run-2' }), - ev(6, 'message', { - message_id: 'm-2', role: 'assistant', parts: [{ type: 'text', text: 'second' }], - }, { turn_id: 'run-2' }), - ev(7, 'turn.end', { stop: 'completed' }, { turn_id: 'run-2' }), - ev(8, 'session.end', { reason: 'completed' }), - ], { lifecycle: 'none' }) - - expect(responses(items).map((card) => ({ - id: card.id, - content: card.response?.content, - streaming: card.streaming, - }))).toEqual([ - { id: 'aop:s1:aiscan:turn:run-1:response', content: 'first', streaming: false }, - { id: 'aop:s1:aiscan:turn:run-2:response', content: 'second', streaming: false }, - ]) - }) - - it('does not let a late turn end close the newer active turn', () => { - const items = reduceAOPToTimeline([ - ev(1, 'turn.start', {}, { turn_id: 'run-1' }), - ev(2, 'message.delta', { - message_id: 'm-1', part_type: 'reasoning', part_index: 0, delta: 'first', - }, { turn_id: 'run-1' }), - ev(3, 'turn.start', {}, { turn_id: 'run-2' }), - ev(4, 'message.delta', { - message_id: 'm-2', part_type: 'reasoning', part_index: 0, delta: 'second', - }, { turn_id: 'run-2' }), - ev(5, 'turn.end', { stop: 'completed' }, { turn_id: 'run-1' }), - ], { streaming: true, lifecycle: 'none' }) - - expect(responses(items)).toHaveLength(2) - expect(responses(items)[0]).toMatchObject({ thinking: 'first', streaming: false }) - expect(responses(items)[1]).toMatchObject({ thinking: 'second', streaming: true }) - }) - - it('aggregates consecutive tool and answer turns into one response card', () => { - const items = reduceAOPToTimeline([ - ev(0, 'session.start', {}), - ev(1, 'turn.start', { turn: 1 }), - ev(2, 'message', { message_id: 'tool-turn', role: 'assistant', parts: [{ type: 'reasoning', text: 'use a tool' }] }), - ev(3, 'tool.call', { tool_call_id: 'tc-1', tool_name: 'bash', args: { command: 'echo ok' } }), - ev(4, 'tool.result', { tool_call_id: 'tc-1', tool_name: 'bash', content: 'ok' }), - ev(5, 'turn.end', { turn: 1 }), - ev(6, 'turn.start', { turn: 2 }), - ev(7, 'message', { - message_id: 'answer-turn', - role: 'assistant', - parts: [ - { type: 'reasoning', text: 'report the result' }, - { type: 'text', text: 'done' }, - ], - }), - ev(8, 'turn.end', { turn: 2 }), - ev(9, 'session.end', { stop: 'completed', turns: 2 }), - ]) - - expect(responses(items)).toHaveLength(1) - expect(responses(items)[0]).toMatchObject({ - thinking: 'use a tool\n\nreport the result', - response: { content: 'done' }, - tools: [{ id: 'tc-1', result: 'ok', pending: false }], - streaming: false, + expect(reduceAOPToTimeline(events)[0]).toMatchObject({ + kind: 'assistant_response', streaming: false, response: { content: 'hello' }, }) }) - it('keeps reused message ids isolated across session runs', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'turn.start', { turn: 1 }), - ev(3, 'message', { message_id: 'stable', role: 'assistant', parts: [{ type: 'text', text: 'first' }] }), - ev(4, 'turn.end', { turn: 1 }), - ev(5, 'session.end', { stop: 'completed', turns: 1 }), - ev(6, 'session.start', {}), - ev(7, 'turn.start', { turn: 1 }), - ev(8, 'message', { message_id: 'stable', role: 'assistant', parts: [{ type: 'text', text: 'second' }] }), - ev(9, 'turn.end', { turn: 1 }), - ev(10, 'session.end', { stop: 'completed', turns: 1 }), - ]) - - expect(responses(items).map((card) => card.response?.content)).toEqual(['first', 'second']) - }) - - it('keeps every IOA card when each chat request resets seq', () => { - const titles = ['资产盘点完成', '高危入口验证任务', '验证进度更新', '最终复核结论'] - const stream = titles.flatMap((title, index) => { - const ts = `2026-07-19T00:0${index}:00Z` - return [ - ev(0, 'session.start', {}, { ts }), - ev(1, 'turn.start', { turn: 1 }, { ts }), - ev(2, 'tool.call', { - tool_call_id: `ioa-${index}`, - tool_name: 'bash', - args: { command: `ioa_send --content '{"title":"${title}","content":"detail"}'` }, - }, { ts }), - ev(3, 'tool.result', { - tool_call_id: `ioa-${index}`, - tool_name: 'bash', - content: JSON.stringify({ - id: `message-${index}`, - space_id: 'space-1', - content: { type: 'note', title, content: 'detail' }, - }), - }, { ts }), - ev(4, 'message', { - message_id: 'stable-answer-id', - role: 'assistant', - parts: [{ type: 'text', text: `done ${index}` }], - }, { ts }), - ev(5, 'turn.end', { turn: 1 }, { ts }), - ev(6, 'session.end', { stop: 'completed', turns: 1 }, { ts }), - ] - }) - - const once = responses(reduceAOPToTimeline(stream)) - const replayed = responses(reduceAOPToTimeline([...stream, ...stream])) - - expect(once).toHaveLength(4) - expect(replayed).toHaveLength(4) - expect(new Set(once.map((card) => card.id)).size).toBe(4) - expect(once.map((card) => JSON.parse(card.tools[0].result || '{}').content.title)).toEqual(titles) - }) - - it('renders image parts as markdown', () => { - const items = reduceAOPToTimeline([ - ev(1, 'message', { - message_id: 'u-1', - role: 'user', - parts: [ - { type: 'text', text: 'look' }, - { type: 'image', image: { base64: 'AAAA', media_type: 'image/png' } }, - ], - }), - ]) - expect(messages(items)[0].content).toBe('look\n![image](data:image/png;base64,AAAA)') - }) - - it('surfaces AOP errors as system messages without closing the stream', () => { - const items = reduceAOPToTimeline([ - ev(1, 'error', { code: 'rate_limit', message: 'slow down', retryable: true }, { - ext: { 'aiscan.web': { params: { error: 'quota exceeded' } } }, - }), - ev(2, 'message', { message_id: 'a-1', role: 'assistant', parts: [{ type: 'text', text: 'recovered' }] }), - ]) - const msgs = messages(items) - const cards = responses(items) - expect(msgs[0]).toMatchObject({ role: 'system', content: 'slow down' }) - expect(msgs[0].metadata).toMatchObject({ - code: 'rate_limit', - retryable: true, - ext: { 'aiscan.web': { params: { error: 'quota exceeded' } } }, - }) - expect(cards[0]).toMatchObject({ response: { content: 'recovered' } }) - }) - - it('maps namespaced status extensions to extension items', () => { - const items = reduceAOPToTimeline([ - ev(1, 'status', { state: 'eval_end' }, { - ext: { eval: { round: 1, max_rounds: 3, pass: true, reason: 'criteria met' } }, - }), - ev(2, 'status', { state: 'compact_end' }, { - ext: { compact: { tokens_before: 100, tokens_after: 40, kept_messages: 3 } }, - }), - ev(3, 'status', { state: 'token_budget_warning' }, { - ext: { aop: { context_tokens: 90, token_budget: 100 } }, - }), - ]) - expect(items.map((i) => i.kind)).toEqual(['extension', 'extension', 'extension']) - expect(items[0]).toMatchObject({ - extensionType: 'eval', - data: { round: 1, pass: true, reason: 'criteria met' }, - }) - expect(items[1]).toMatchObject({ extensionType: 'compact', data: { tokens_before: 100, tokens_after: 40, kept_messages: 3 } }) - expect(items[2]).toMatchObject({ extensionType: 'token_budget', data: { context_tokens: 90, token_budget: 100 } }) - }) - - it('normalizes legacy eval status extensions to one-based rounds', () => { - const items = reduceAOPToTimeline([ - ev(1, 'status', { state: 'eval_end' }, { - ext: { aiscan: { eval_round: 0, eval_pass: true, eval_reason: 'legacy pass' } }, - }), - ev(2, 'status', { state: 'eval_error' }, { - ext: { aiscan: { eval_round: 1, eval_error: 'legacy error' } }, - }), - ]) - expect(items[0]).toMatchObject({ - extensionType: 'eval', - data: { round: 1, pass: true, reason: 'legacy pass' }, - }) - expect(items[1]).toMatchObject({ - extensionType: 'eval', - data: { round: 2, pass: false, reason: 'legacy error' }, - }) - }) - - it('separates interleaved sessions by stream key', () => { - const items = reduceAOPToTimeline([ - ev(1, 'message', { message_id: 'm-1', role: 'assistant', parts: [{ type: 'text', text: 'from s1' }] }), - ev(2, 'message', { message_id: 'm-1', role: 'assistant', parts: [{ type: 'text', text: 'from s2' }] }, { session_id: 's2' }), - ]) - const cards = responses(items) - expect(cards).toHaveLength(2) - expect(cards.map((card) => card.response?.content)).toEqual(['from s1', 'from s2']) - }) - - it('marks the last assistant card as streaming when requested', () => { - const items = reduceAOPToTimeline( - [ev(1, 'message', { message_id: 'a-1', role: 'assistant', parts: [{ type: 'text', text: 'hi' }] })], - { streaming: true }, - ) - expect(responses(items)[0].streaming).toBe(true) - }) - - it('keeps completed history closed while another session is busy', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'message', { message_id: 'a-1', role: 'assistant', parts: [{ type: 'text', text: 'done' }] }), - ev(3, 'session.end', { stop: 'completed', turns: 1 }), - ], { streaming: true }) - expect(responses(items)[0].streaming).toBe(false) - }) - - it('can hide routine lifecycle while preserving failed session ends', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'session.end', { stop: 'error', error: 'boom' }), - ], { lifecycle: 'errors' }) - expect(items).toHaveLength(1) - expect(items[0]).toMatchObject({ kind: 'divider', variant: 'warning', label: 'Session ended: boom' }) - }) - - it('keeps a result-before-call tool complete and carries its error state', () => { - const items = reduceAOPToTimeline([ - ev(1, 'tool.result', { tool_call_id: 'tc-1', tool_name: 'bash', content: 'failed', is_error: true }), - ev(2, 'tool.call', { tool_call_id: 'tc-1', tool_name: 'bash', args: { command: 'exit 1' } }), - ]) - expect(responses(items)[0].tools[0]).toMatchObject({ - id: 'tc-1', result: 'failed', pending: false, error: true, + it('joins a tool result to its generated tool call ID', () => { + const events = [ + event(1, { case: 'toolCall', value: create(ToolCallSchema, { id: 'call-1', name: 'search' }) }), + event(2, { case: 'toolResult', value: create(ToolResultSchema, { callId: 'call-1', name: 'search', output: [text('done')] }) }), + ] + expect(reduceAOPToTimeline(events)[0]).toMatchObject({ + kind: 'assistant_response', + tools: [{ id: 'call-1', toolName: 'search', result: 'done', pending: false }], }) }) - - it('drops an empty turn when its session ends', () => { - const items = reduceAOPToTimeline([ - ev(1, 'session.start', {}), - ev(2, 'turn.start', { turn: 1 }), - ev(3, 'turn.end', { turn: 1 }), - ev(4, 'session.end', { stop: 'completed', turns: 1 }), - ], { lifecycle: 'none' }) - expect(items).toEqual([]) - }) - - it('caps large tool results before they reach the renderer', () => { - const items = reduceAOPToTimeline([ - ev(1, 'tool.result', { tool_call_id: 'tc-large', tool_name: 'read', content: 'x'.repeat(120_000) }), - ]) - const result = responses(items)[0].tools[0].result || '' - expect(result.length).toBeLessThan(101_000) - expect(result).toContain('characters omitted') - }) }) diff --git a/packages/viewer/src/lib/aop-reducer.ts b/packages/viewer/src/lib/aop-reducer.ts index cee36ed..df7bd54 100644 --- a/packages/viewer/src/lib/aop-reducer.ts +++ b/packages/viewer/src/lib/aop-reducer.ts @@ -1,12 +1,4 @@ -import type { - AOPEvent, - MessageData, - MessageDeltaData, - MessagePart, - ToolCallData, - ToolResultData, - UsageData, -} from '@cyber/agent-protocol' +import type { Content, EncodedValue, Event, TokenUsage } from '@cyber/aop' import type { AssistantResponseTimelineItem, MessageTimelineItem, @@ -15,616 +7,249 @@ import type { } from '../types/timeline' export interface ReduceAOPOptions { - /** Keep the most recent active assistant response card streaming. */ streaming?: boolean - /** Control whether routine AOP lifecycle events appear in the chat timeline. */ lifecycle?: 'all' | 'errors' | 'none' } +const decoder = new TextDecoder() const MAX_TOOL_ARGS_CHARS = 32_000 const MAX_TOOL_RESULT_CHARS = 100_000 -function timestampOf(ts: string): number { - const value = Date.parse(ts) - return Number.isFinite(value) ? value : 0 +function timestamp(event: Event): number { + if (!event.emittedAt) return 0 + return Number(event.emittedAt.seconds) * 1000 + event.emittedAt.nanos / 1_000_000 } -function stringify(value: unknown, maxChars = MAX_TOOL_RESULT_CHARS): string { - let text: string - if (typeof value === 'string') text = value - else if (value === undefined) text = '' - else { - try { - text = JSON.stringify(value, null, 2) - } catch { - text = String(value) - } +function encoded(value?: EncodedValue): unknown { + if (!value) return undefined + if (value.mediaType === 'application/json' || value.mediaType === 'application/protobuf+json') { + try { return JSON.parse(decoder.decode(value.data)) } + catch { return undefined } } - if (text.length <= maxChars) return text - return `${text.slice(0, maxChars)}\n... (${text.length - maxChars} characters omitted)` -} - -function eventId(event: AOPEvent, index: number, suffix = '', scope?: string): string { - const position = event.seq === undefined ? index : event.seq - return `${scope ?? `aop:${event.session_id}:${event.agent}`}:${position}${suffix}` + return value.data } -function mergeUsage( - previous: Record | undefined, - usage: UsageData, -): Record { - const current = (previous?.usage ?? {}) as Partial - return { - ...previous, - usage: { - input_tokens: (current.input_tokens ?? 0) + usage.input_tokens, - output_tokens: (current.output_tokens ?? 0) + usage.output_tokens, - total_tokens: (current.total_tokens ?? 0) + usage.total_tokens, - cache_read_tokens: (current.cache_read_tokens ?? 0) + (usage.cache_read_tokens ?? 0), - cache_write_tokens: (current.cache_write_tokens ?? 0) + (usage.cache_write_tokens ?? 0), - model: usage.model ?? current.model, - }, +function stringify(value: unknown, limit: number): string { + let text = '' + if (typeof value === 'string') text = value + else if (value instanceof Uint8Array) text = decoder.decode(value) + else if (value !== undefined) { + try { text = JSON.stringify(value, null, 2) } + catch { text = String(value) } } + return text.length <= limit ? text : `${text.slice(0, limit)}\n... (${text.length - limit} characters omitted)` } -/** Join the text of all parts of one type (text or reasoning). */ -function partText(parts: MessagePart[], type: string): string { - return parts - .filter((part) => part.type === type && part.text) - .map((part) => part.text as string) - .join('\n') -} - -/** Render image parts as markdown: base64 becomes a data URI, a path a link. */ -function partImagesMarkdown(parts: MessagePart[]): string { - const blocks: string[] = [] +function contentText(parts: readonly Content[], kind: 'text' | 'reasoning' | 'refusal' = 'text'): string { + const values: string[] = [] for (const part of parts) { - if (part.type !== 'image' || !part.image) continue - if (part.image.base64 && part.image.media_type) { - blocks.push(`![image](data:${part.image.media_type};base64,${part.image.base64})`) - } else if (part.image.path) { - blocks.push(`[image: ${part.image.path}]`) - } + if (kind === 'text' && part.value.case === 'text') values.push(part.value.value.text) + if (kind === 'reasoning' && part.value.case === 'reasoning') values.push(part.value.value.text) + if (kind === 'refusal' && part.value.case === 'refusal') values.push(part.value.value) } - return blocks.join('\n') + return values.filter(Boolean).join('\n') } -/** Named ext namespace, falling back to the legacy single extension block. */ -function extBlock(event: AOPEvent, namespace?: string): Record { - if (!event.ext) return {} - if (namespace) { - const value = event.ext[namespace] - if (value && typeof value === 'object') return value as Record - } - for (const value of Object.values(event.ext)) { - if (value && typeof value === 'object') return value as Record +function contentMedia(parts: readonly Content[]): string { + const values: string[] = [] + for (const part of parts) { + if (part.value.case !== 'media') continue + const media = part.value.value + const resource = media.resource + if (resource?.source.case === 'uri') values.push(`[${media.kind || 'media'}](${resource.source.value})`) + else if (resource?.filename) values.push(`[${media.kind || 'media'}: ${resource.filename}]`) } - return {} -} - -function extNumber(ext: Record, key: string): number | undefined { - const value = ext[key] - return typeof value === 'number' && Number.isFinite(value) ? value : undefined + return values.join('\n') } -function extString(ext: Record, ...keys: string[]): string | undefined { - for (const key of keys) { - if (typeof ext[key] === 'string') return ext[key] as string +function usageMetadata(usage: TokenUsage): Record { + return { + usage: { + input_tokens: Number(usage.inputTokens), + output_tokens: Number(usage.outputTokens), + total_tokens: Number(usage.totalTokens), + model: usage.model, + ...Object.fromEntries(Object.entries(usage.detail).map(([key, value]) => [key, Number(value)])), + }, } - return undefined -} - -function evalRound(ext: Record): number | undefined { - const round = extNumber(ext, 'round') - if (round !== undefined) return round - const legacyRound = extNumber(ext, 'eval_round') - return legacyRound === undefined ? undefined : legacyRound + 1 -} - -// Message metadata = the emitting agent's ext `metadata` sub-object flattened to -// the top level (so consumers find e.g. an i18n `code` where the pre-AOP message -// model put it), with the raw ext kept under `ext` for namespace-specific reads. -function messageMetadata(event: AOPEvent): Record | undefined { - const ext = extBlock(event) - const inner = ext.metadata - const flattened: Record = - inner && typeof inner === 'object' ? { ...(inner as Record) } : {} - if (event.ext) flattened.ext = event.ext - return Object.keys(flattened).length > 0 ? flattened : undefined } -/** - * Reduce raw AOP events directly into cyber-ui timeline items. - * - * Input order is authoritative. Sequence numbers are used for duplicate - * suppression, not global sorting, because several AOP sessions may be merged - * into one platform stream. Assistant streaming arrives as `message.delta` - * fragments keyed by message_id; the complete `message` event is the - * authoritative state and replaces whatever the deltas accumulated. - * - * AOP exposes thinking, text, and tool activity as separate events. The chat - * surface intentionally folds those events back into one assistant response - * per turn so protocol granularity does not leak into the conversation UI. - */ export function reduceAOPToTimeline( - events: readonly AOPEvent[], + events: readonly Event[], options: ReduceAOPOptions = {}, ): TimelineItem[] { const items: TimelineItem[] = [] const seen = new Set() - // A stream can have only one active model turn, but several streams may be - // interleaved in a merged timeline. Message/tool indexes make final events - // idempotently update the card opened by their earlier delta/call event. - const activeResponses = new Map() - const activeTurnIDs = new Map() - const activeRunIDs = new Map() - const runIDsByStart = new Map() - const responsesByMessage = new Map() - const thinkingByMessage = new Map() - const responsesByTool = new Map() - const lastResponses = new Map() + const responses = new Map() + const responseByMessage = new Map() + const responseByTool = new Map() const lifecycle = options.lifecycle ?? 'all' - const streamKey = (event: AOPEvent) => `${event.session_id}:${event.agent}` - const turnScope = (event: AOPEvent, turnID: string) => ( - `aop:${event.session_id}:${event.agent}:turn:${turnID}` - ) - const eventScope = (event: AOPEvent) => { - const turnID = event.turn_id ?? activeTurnIDs.get(streamKey(event)) - if (turnID) return turnScope(event, turnID) - return activeRunIDs.get(streamKey(event)) ?? `aop:${event.session_id}:${event.agent}` - } - const scopedEventId = (event: AOPEvent, index: number, suffix = '') => ( - eventId(event, index, suffix, eventScope(event)) - ) - const messageKey = (event: AOPEvent, messageId: string) => `${eventScope(event)}:message:${messageId}` - const toolKey = (event: AOPEvent, callId: string) => `${eventScope(event)}:tool:${callId}` - const responseID = (event: AOPEvent, fallback: string) => { - const turnID = event.turn_id ?? activeTurnIDs.get(streamKey(event)) - if (turnID) return `${turnScope(event, turnID)}:response` - const runID = activeRunIDs.get(streamKey(event)) - return runID ? `${runID}:response` : fallback - } - - const finishResponse = (key: string) => { - const response = activeResponses.get(key) - if (!response) return - response.streaming = false - activeResponses.delete(key) - if (!response.thinking?.trim() && !response.response?.content.trim() && response.tools.length === 0) { - const itemIndex = items.indexOf(response) - if (itemIndex >= 0) items.splice(itemIndex, 1) - if (lastResponses.get(key) === response) lastResponses.delete(key) - } - for (const [mkey, owner] of responsesByMessage) { - if (owner === response) { - responsesByMessage.delete(mkey) - thinkingByMessage.delete(mkey) - } - } - for (const [tkey, owner] of responsesByTool) { - if (owner === response) responsesByTool.delete(tkey) - } - } - - const ensureResponse = ( - event: AOPEvent, - index: number, - timestamp: number, - preferredId?: string, - ): AssistantResponseTimelineItem => { - const key = streamKey(event) - const existing = activeResponses.get(key) - if (existing) return existing - - const replayed = preferredId - ? items.find((item): item is AssistantResponseTimelineItem => ( - item.kind === 'assistant_response' && item.id === preferredId - )) - : undefined - if (replayed) { - replayed.streaming = true - activeResponses.set(key, replayed) - lastResponses.set(key, replayed) - return replayed - } - - const item: AssistantResponseTimelineItem = { - id: preferredId ?? scopedEventId(event, index, ':response'), + const streamKey = (event: Event) => `${event.sessionId}:${event.emitter}` + const scope = (event: Event) => `${streamKey(event)}:${event.turnId || 'session'}` + const eventKey = (event: Event, index: number) => event.id || `${scope(event)}:${event.seq || BigInt(index + 1)}` + const responseID = (event: Event) => `${scope(event)}:response` + + const ensureResponse = (event: Event): AssistantResponseTimelineItem => { + const key = scope(event) + const current = responses.get(key) + if (current) return current + const response: AssistantResponseTimelineItem = { + id: responseID(event), kind: 'assistant_response', - timestamp, - actorName: event.agent, + timestamp: timestamp(event), + actorName: event.emitter, tools: [], streaming: true, } - items.push(item) - activeResponses.set(key, item) - lastResponses.set(key, item) - return item + items.push(response) + responses.set(key, response) + return response } - const startTurn = (event: AOPEvent, index: number, timestamp: number) => { - const key = streamKey(event) - const active = activeResponses.get(key) - if (active) { - active.streaming = true - return - } - const data = event.data as { turn?: number } - const legacyTurn = typeof data.turn === 'number' ? data.turn : undefined - const fallbackID = event.turn_id - ? `${turnScope(event, event.turn_id)}:response` - : legacyTurn === undefined - ? scopedEventId(event, index, ':response') - : `aop:${event.session_id}:${event.agent}:turn:${legacyTurn}` - ensureResponse(event, index, timestamp, responseID(event, fallbackID)) - } - - const pauseResponse = (key: string) => { - const response = activeResponses.get(key) + const finish = (event: Event) => { + const response = responses.get(scope(event)) if (response) response.streaming = false } - const updateThinking = (response: AssistantResponseTimelineItem, mkey: string, content: string) => { - thinkingByMessage.set(mkey, content) - const seenThinking = new Set() - response.thinking = [...responsesByMessage.entries()] - .filter(([, owner]) => owner === response) - .map(([messageKey]) => thinkingByMessage.get(messageKey)?.trim() ?? '') - .filter((thinking) => { - if (!thinking || seenThinking.has(thinking)) return false - seenThinking.add(thinking) - return true - }) - .join('\n\n') || undefined - } - const appendTool = (response: AssistantResponseTimelineItem, tool: ToolCallEntry) => { - const existing = response.tools.find((candidate) => candidate.id === tool.id) - if (existing) { - Object.assign(existing, tool) - } else { - response.tools.push(tool) - } + const current = response.tools.find((entry) => entry.id === tool.id) + if (current) Object.assign(current, tool) + else response.tools.push(tool) } events.forEach((event, index) => { - if (!event.type || !event.session_id) return - const key = streamKey(event) - - // turn_id is the canonical run boundary. Close any previous response when - // a new run appears, including streams where turn.start was not replayed. - if (event.turn_id) { - const activeTurnID = activeTurnIDs.get(key) - const staleTurnEnd = event.type === 'turn.end' - && activeTurnID !== undefined - && activeTurnID !== event.turn_id - if (!staleTurnEnd) { - if (activeTurnID && activeTurnID !== event.turn_id) finishResponse(key) - activeTurnIDs.set(key, event.turn_id) - } - } - - // A platform chat session may contain many agent runs. Each run restarts - // AOP seq at zero, so seq is only unique inside session.start → session.end. - // Replayed history repeats the exact start frame; reuse its prior run id so - // the replay remains idempotent while a genuinely new start gets a new scope. - if (event.type === 'session.start') { - const startIdentity = `${key}:${event.seq ?? index}:${event.ts}` - let runID = runIDsByStart.get(startIdentity) - if (!runID) { - runID = `aop:${event.session_id}:${event.agent}:run:${event.ts}:${event.seq ?? index}` - runIDsByStart.set(startIdentity, runID) - } - activeRunIDs.set(key, runID) - } - - if (event.seq !== undefined) { - const seenKey = `${eventScope(event)}:seq:${event.seq}` - if (seen.has(seenKey)) { - if (event.type === 'session.end') activeRunIDs.delete(key) - return - } - seen.add(seenKey) - } - - const timestamp = timestampOf(event.ts) - - switch (event.type) { - case 'session.start': { - finishResponse(key) - const start = event.data as { parent_session_id?: string } - const sessionKind = start.parent_session_id ? 'sub-session' : 'session' - const sessionLabel = sessionKind === 'sub-session' ? 'Sub-session started' : 'Session started' - if (lifecycle === 'all') { - items.push({ - id: scopedEventId(event, index, ':start'), - kind: 'divider', - timestamp, - actorName: event.agent, - label: event.agent ? `${event.agent} ${sessionKind} started` : sessionLabel, - variant: 'info', - }) - } + if (!event.sessionId || !event.payload.case) return + const unique = eventKey(event, index) + if (seen.has(unique)) return + seen.add(unique) + + switch (event.payload.case) { + case 'sessionStarted': + if (lifecycle === 'all') items.push({ + id: `${unique}:start`, kind: 'divider', timestamp: timestamp(event), actorName: event.emitter, + label: event.payload.value.parentSessionId ? 'Sub-session started' : 'Session started', variant: 'info', + }) break - } - case 'session.end': { - finishResponse(key) - const data = event.data as Record - const reason = typeof data.reason === 'string' ? data.reason : undefined - const routineReasons = new Set(['completed', 'closed', 'runtime_closed']) - const failed = data.stop === 'error' - || Boolean(data.error) - || Boolean(reason && !routineReasons.has(reason)) - const detail = data.error ?? reason ?? data.stop - if (lifecycle === 'all' || (lifecycle === 'errors' && failed)) { - items.push({ - id: scopedEventId(event, index, ':end'), - kind: 'divider', - timestamp, - actorName: event.agent, - label: failed ? `Session ended: ${String(detail)}` : 'Session ended', - variant: failed ? 'warning' : 'success', - }) - } - activeTurnIDs.delete(key) - activeRunIDs.delete(key) + case 'sessionEnded': + finish(event) + if (lifecycle === 'all') items.push({ + id: `${unique}:end`, kind: 'divider', timestamp: timestamp(event), actorName: event.emitter, + label: event.payload.value.reason ? `Session ended: ${event.payload.value.reason}` : 'Session ended', variant: 'success', + }) break - } - case 'turn.start': - startTurn(event, index, timestamp) + case 'turnStarted': + ensureResponse(event) break - case 'turn.end': - if (event.turn_id) { - if (activeTurnIDs.get(key) === event.turn_id) { - finishResponse(key) - activeTurnIDs.delete(key) - } - } else { - // Legacy turn numbers represented internal model cycles, so several - // of them could still belong to one user-facing response. - pauseResponse(key) + case 'turnEnded': { + finish(event) + const ended = event.payload.value + const failure = ended.error?.message + if (failure && lifecycle !== 'none') items.push({ + id: `${unique}:error`, kind: 'divider', timestamp: timestamp(event), actorName: event.emitter, + label: failure, variant: 'warning', + }) + const response = responses.get(scope(event)) + if (response && ended.usage) response.response = { + content: response.response?.content ?? '', + metadata: { ...response.response?.metadata, ...usageMetadata(ended.usage) }, } break + } - case 'message.delta': { - const data = event.data as MessageDeltaData - if (!data.message_id || !data.delta) break - const mkey = messageKey(event, data.message_id) - const response = responsesByMessage.get(mkey) ?? ensureResponse( - event, - index, - timestamp, - responseID(event, `aop:${event.session_id}:${event.agent}:response:${data.message_id}`), - ) - responsesByMessage.set(mkey, response) + case 'messageDelta': { + const delta = event.payload.value + const key = `${scope(event)}:message:${delta.messageId}` + const response = responseByMessage.get(key) ?? ensureResponse(event) + responseByMessage.set(key, response) response.streaming = true - - if (data.part_type === 'reasoning') { - updateThinking(response, mkey, (thinkingByMessage.get(mkey) ?? '') + data.delta) - break + if (delta.value.case === 'reasoning') response.thinking = `${response.thinking ?? ''}${delta.value.value}` + else if (delta.value.case === 'text') response.response = { + ...response.response, + content: `${response.response?.content ?? ''}${delta.value.value}`, } - - const current = response.response ?? { content: '', metadata: messageMetadata(event) } - response.response = { ...current, content: current.content + data.delta } break } case 'message': { - const data = event.data as MessageData - if (!data.message_id) break - const mkey = messageKey(event, data.message_id) - const role = data.role === 'user' || data.role === 'system' ? data.role : 'assistant' - const text = partText(data.parts, 'text') - const reasoning = partText(data.parts, 'reasoning') - const images = partImagesMarkdown(data.parts) - const content = [text, images].filter(Boolean).join('\n') - - if (role === 'assistant') { - if (!content && !reasoning) break - const response = responsesByMessage.get(mkey) ?? ensureResponse( - event, - index, - timestamp, - responseID(event, `aop:${event.session_id}:${event.agent}:response:${data.message_id}`), - ) - responsesByMessage.set(mkey, response) - if (reasoning) updateThinking(response, mkey, reasoning) - if (content) response.response = { content, metadata: messageMetadata(event) } + const message = event.payload.value + const text = [contentText(message.content), contentText(message.content, 'refusal'), contentMedia(message.content)].filter(Boolean).join('\n') + const reasoning = contentText(message.content, 'reasoning') + if (message.role === 'assistant') { + const key = `${scope(event)}:message:${message.id}` + const response = responseByMessage.get(key) ?? ensureResponse(event) + responseByMessage.set(key, response) + if (reasoning) response.thinking = reasoning + if (text) response.response = { ...response.response, content: text } response.streaming = false - lastResponses.set(key, response) break } - - finishResponse(key) - if (!content) break - // User/system messages carry no per-run seq to dedup on: the hub echoes a - // user message with seq omitted (0 → omitempty), so the seq guard above - // can't suppress a redelivered copy. Key by the message's stable id and - // drop repeats — otherwise a double-delivered echo renders as a second - // identical bubble the platform-side content match can't always collapse. - const messageID = `${eventScope(event)}:msg:${data.message_id}` - if (seen.has(messageID)) break - seen.add(messageID) - const message: MessageTimelineItem = { - id: messageID, - kind: 'message', - timestamp, - actorName: event.agent, - role, - content, - streaming: false, - metadata: messageMetadata(event), + if (!text) break + const item: MessageTimelineItem = { + id: message.id || unique, + kind: 'message', timestamp: timestamp(event), actorName: event.emitter, + role: message.role === 'system' ? 'system' : 'user', content: text, streaming: false, } - items.push(message) + items.push(item) break } - case 'tool.call': { - const data = event.data as ToolCallData - if (!data.tool_call_id) break - const response = ensureResponse( - event, - index, - timestamp, - responseID(event, `aop:${event.session_id}:${event.agent}:response:tool:${data.tool_call_id}`), - ) - const existing = response.tools.find((candidate) => candidate.id === data.tool_call_id) - const tool: ToolCallEntry = { - id: data.tool_call_id, - toolName: data.tool_name, - toolArgs: stringify(data.args, MAX_TOOL_ARGS_CHARS), - result: existing?.result, - pending: existing?.result === undefined, - error: existing?.error, - } - appendTool(response, tool) - response.streaming = true - responsesByTool.set(toolKey(event, data.tool_call_id), response) + case 'toolCall': { + const call = event.payload.value + const response = ensureResponse(event) + appendTool(response, { + id: call.id, toolName: call.name, + toolArgs: stringify(encoded(call.arguments), MAX_TOOL_ARGS_CHARS), pending: true, + }) + responseByTool.set(`${scope(event)}:tool:${call.id}`, response) break } - case 'tool.result': { - const data = event.data as ToolResultData - if (!data.tool_call_id) break - const tkey = toolKey(event, data.tool_call_id) - const response = responsesByTool.get(tkey) ?? ensureResponse( - event, - index, - timestamp, - responseID(event, `aop:${event.session_id}:${event.agent}:response:tool:${data.tool_call_id}`), - ) - const existing = response.tools.find((candidate) => candidate.id === data.tool_call_id) + case 'toolResult': { + const result = event.payload.value + const key = `${scope(event)}:tool:${result.callId}` + const response = responseByTool.get(key) ?? ensureResponse(event) + const current = response.tools.find((entry) => entry.id === result.callId) appendTool(response, { - id: data.tool_call_id, - toolName: data.tool_name ?? existing?.toolName ?? '', - toolArgs: existing?.toolArgs ?? '', - result: stringify(data.content, MAX_TOOL_RESULT_CHARS), - pending: false, - error: Boolean(data.is_error), + id: result.callId, toolName: result.name || current?.toolName || '', toolArgs: current?.toolArgs || '', + result: stringify(contentText(result.output) || encoded(result.detail), MAX_TOOL_RESULT_CHARS), + pending: false, error: result.isError, }) - responsesByTool.set(tkey, response) + responseByTool.set(key, response) break } case 'usage': { - const response = lastResponses.get(key) - if (response?.response) { - response.response.metadata = mergeUsage(response.response.metadata, event.data as UsageData) - } - break - } - - case 'error': { - const data = event.data as Record - if (data.retryable !== true) finishResponse(key) - const message: MessageTimelineItem = { - id: scopedEventId(event, index, ':error'), - kind: 'message', - timestamp, - actorName: event.agent, - role: 'system', - content: String(data.message ?? 'Agent error'), - streaming: false, - metadata: { code: data.code, retryable: data.retryable, ext: event.ext }, + const response = responses.get(scope(event)) + if (response) response.response = { + content: response.response?.content ?? '', + metadata: { ...response.response?.metadata, ...usageMetadata(event.payload.value) }, } - items.push(message) break } - case 'status': { - const data = event.data as { state?: string } - switch (data.state) { - case 'thinking': - ensureResponse(event, index, timestamp).streaming = true - break - case 'eval_end': { - const ext = extBlock(event, 'eval') - items.push({ - id: scopedEventId(event, index, ':eval'), - kind: 'extension', - timestamp, - actorName: event.agent, - extensionType: 'eval', - data: { - round: evalRound(ext), - pass: typeof ext.pass === 'boolean' ? ext.pass : ext.eval_pass === true, - reason: extString(ext, 'reason', 'eval_reason'), - }, - }) - break - } - case 'eval_error': { - const ext = extBlock(event, 'eval') - items.push({ - id: scopedEventId(event, index, ':eval'), - kind: 'extension', - timestamp, - actorName: event.agent, - extensionType: 'eval', - data: { - round: evalRound(ext), - pass: false, - reason: extString(ext, 'error', 'eval_error'), - }, - }) - break - } - case 'compact_end': { - const ext = extBlock(event, 'compact') - items.push({ - id: scopedEventId(event, index, ':compact'), - kind: 'extension', - timestamp, - actorName: event.agent, - extensionType: 'compact', - data: { - tokens_before: extNumber(ext, 'tokens_before') ?? extNumber(ext, 'compact_tokens_before'), - tokens_after: extNumber(ext, 'tokens_after') ?? extNumber(ext, 'compact_tokens_after'), - kept_messages: extNumber(ext, 'kept_messages') ?? extNumber(ext, 'compact_kept_messages'), - }, - }) - break - } - case 'token_budget_warning': { - const ext = extBlock(event, 'aop') - items.push({ - id: scopedEventId(event, index, ':budget'), - kind: 'extension', - timestamp, - actorName: event.agent, - extensionType: 'token_budget', - data: { - context_tokens: extNumber(ext, 'context_tokens'), - token_budget: extNumber(ext, 'token_budget'), - }, - }) - break - } - } + case 'error': + if (lifecycle !== 'none') items.push({ + id: unique, kind: 'divider', timestamp: timestamp(event), actorName: event.emitter, + label: event.payload.value.message, variant: 'warning', + }) break - } - default: + case 'extension': { + const extension = event.payload.value items.push({ - id: scopedEventId(event, index, ':extension'), - kind: 'extension', - timestamp, - actorName: event.agent, - extensionType: event.type, - data: event.data as Record, + id: unique, kind: 'extension', timestamp: timestamp(event), actorName: event.emitter, + extensionType: extension.type || 'extension', + data: (encoded(extension.value) as Record) ?? {}, }) + break + } } }) - if (options.streaming) { - const activeList = [...activeResponses.values()] - const active = activeList[activeList.length - 1] - if (active) active.streaming = true - } - + if (!options.streaming) for (const response of responses.values()) response.streaming = false return items } diff --git a/packages/viewer/src/types/protocol.ts b/packages/viewer/src/types/protocol.ts index 986c74d..2cf4205 100644 --- a/packages/viewer/src/types/protocol.ts +++ b/packages/viewer/src/types/protocol.ts @@ -1,16 +1,9 @@ /** - * Wire protocol for platform events and canonical AOP events. - * - * Legacy APGEvent: {"event_type": "TextPartEvent", "timestamp": "...", "data": {...}} - * AOP: {"type": "text", "ts": "...", "agent": "...", "data": {...}} - * - * Agent output is reduced only by the AOP reducer. Platform reducers may inspect - * both event shapes where AOP usage accounting is relevant to a graph. + * Wire protocol for AIDE platform events. AOP events are generated protobuf + * Event values and are handled separately by the AOP reducer. */ -import type { AOPEvent } from '@cyber/agent-protocol' - -/** Legacy APG event format (aide's Python EventRecord). */ +/** AIDE platform event format (Python EventRecord). */ export interface APGEvent { /** Legacy event class name, e.g. "TextPartEvent", "NodeStartEvent" */ event_type: string @@ -19,33 +12,26 @@ export interface APGEvent { data: Record } -/** Either format — used as input to reducers that handle both. */ -export type WireEvent = APGEvent | AOPEvent> +export type WireEvent = APGEvent /** Detect the wire format of a raw event object. */ export function eventType(evt: WireEvent): string { - if ('event_type' in evt && typeof evt.event_type === 'string') return evt.event_type - if ('type' in evt && typeof evt.type === 'string') return evt.type as string - return '' + return evt.event_type } /** Extract timestamp from either format. */ export function eventTimestamp(evt: WireEvent): string { - if ('timestamp' in evt && typeof evt.timestamp === 'string') return evt.timestamp - if ('ts' in evt && typeof evt.ts === 'string') return evt.ts as string - return new Date().toISOString() + return evt.timestamp } /** Extract agent/actor name from either format. */ export function eventAgent(evt: WireEvent): string { const d = evt.data if (typeof d?.agent_name === 'string') return d.agent_name - if ('agent' in evt && typeof evt.agent === 'string') return evt.agent as string return '' } -/** Agent event types in both formats. */ -const LEGACY_AGENT_EVENTS = new Set([ +const PLATFORM_AGENT_EVENTS = new Set([ 'ConversationTurnStartEvent', 'ConversationTurnCompleteEvent', 'MessageStartEvent', 'ModelRequestEvent', 'ModelResponseEvent', 'ModelResponseCompleteEvent', 'SystemPromptPartEvent', 'UserPromptPartEvent', @@ -54,5 +40,5 @@ const LEGACY_AGENT_EVENTS = new Set([ /** Check whether a legacy platform event belongs to the agent category. */ export function isAgentEvent(evt: WireEvent): boolean { const t = eventType(evt) - return LEGACY_AGENT_EVENTS.has(t) + return PLATFORM_AGENT_EVENTS.has(t) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 944ae4a..b966427 100755 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,10 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 + importers: .: @@ -12,10 +16,17 @@ importers: specifier: ^2.0.0 version: 2.10.4 - packages/agent-protocol: + packages/aop: + dependencies: + '@bufbuild/protobuf': + specifier: ^2.9.0 + version: 2.13.0 devDependencies: + '@bufbuild/protoc-gen-es': + specifier: ^2.9.0 + version: 2.13.0(@bufbuild/protobuf@2.13.0) typescript: - specifier: ^5.3.0 + specifier: ^5.7.2 version: 5.9.3 packages/cstx: @@ -58,11 +69,11 @@ importers: specifier: ^2.4.4 version: 2.4.5 '@types/react': - specifier: ^19.1.2 - version: 19.2.17 + specifier: 18.3.31 + version: 18.3.31 '@types/react-dom': - specifier: ^19.1.2 - version: 19.2.3(@types/react@19.2.17) + specifier: 18.3.7 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.3.0 version: 4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) @@ -137,11 +148,11 @@ importers: specifier: ^4.1.0 version: 4.3.2(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) '@types/react': - specifier: ^19.1.0 - version: 19.2.17 + specifier: 18.3.31 + version: 18.3.31 '@types/react-dom': - specifier: ^19.1.0 - version: 19.2.3(@types/react@19.2.17) + specifier: 18.3.7 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.4.1 version: 4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) @@ -162,19 +173,19 @@ importers: dependencies: '@radix-ui/react-checkbox': specifier: ^1.3.3 - version: 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.3.8(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-context-menu': specifier: ^2.3.3 - version: 2.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-dialog': specifier: ^1.1.19 - version: 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-separator': specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@radix-ui/react-tooltip': specifier: ^1.2.12 - version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -183,7 +194,7 @@ importers: version: 0.400.0(react@19.2.1) react-arborist: specifier: ^3.4.3 - version: 3.15.1(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 3.15.1(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react-hotkeys-hook: specifier: ^4.0.3 version: 4.6.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -198,11 +209,11 @@ importers: specifier: ^4.1.0 version: 4.3.2(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) '@types/react': - specifier: ^19.2.0 - version: 19.2.17 + specifier: 18.3.31 + version: 18.3.31 '@types/react-dom': - specifier: ^19.2.0 - version: 19.2.3(@types/react@19.2.17) + specifier: 18.3.7 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.3.0 version: 4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) @@ -250,11 +261,11 @@ importers: version: 3.0.3(graphology-types@0.24.8) devDependencies: '@types/react': - specifier: ^19.1.2 - version: 19.2.17 + specifier: 18.3.31 + version: 18.3.31 '@types/react-dom': - specifier: ^19.1.2 - version: 19.2.3(@types/react@19.2.17) + specifier: 18.3.7 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.3.0 version: 4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) @@ -284,7 +295,7 @@ importers: version: link:../viewer '@xyflow/react': specifier: ^12.0.0 - version: 12.11.2(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 12.11.2(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) dagre: specifier: ^0.8.5 version: 0.8.5 @@ -302,7 +313,7 @@ importers: specifier: ^0.7.52 version: 0.7.54 '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -342,7 +353,7 @@ importers: version: 4.0.1 devDependencies: '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -382,7 +393,7 @@ importers: version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-collapsible': specifier: ^1.1.12 - version: 1.1.16(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) js-yaml: specifier: ^4.1.0 version: 4.3.0 @@ -406,7 +417,7 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -423,6 +434,12 @@ importers: packages/terminal: dependencies: + '@bufbuild/protobuf': + specifier: ^2.9.0 + version: 2.13.0 + '@cyber/aop': + specifier: workspace:* + version: link:../aop '@cyber/theme': specifier: workspace:* version: link:../theme @@ -443,7 +460,7 @@ importers: version: 19.2.7(react@19.2.7) devDependencies: '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -477,7 +494,7 @@ importers: version: 2.6.1 devDependencies: '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 typescript: specifier: ^5.7.0 @@ -508,7 +525,7 @@ importers: version: 2.1.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7) devDependencies: '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -530,37 +547,37 @@ importers: version: link:../theme '@radix-ui/react-context-menu': specifier: ^2.3.3 - version: 2.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-dialog': specifier: ^1.1.0 - version: 1.1.19(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-dropdown-menu': specifier: ^2.1.0 - version: 2.1.20(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-popover': specifier: ^1.1.0 - version: 1.1.19(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-scroll-area': specifier: ^1.2.0 - version: 1.2.14(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.2.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-select': specifier: ^2.1.0 - version: 2.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-separator': specifier: ^1.1.0 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': specifier: ^1.1.0 version: 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-switch': specifier: ^1.1.0 - version: 1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-tabs': specifier: ^1.1.0 - version: 1.1.17(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-tooltip': specifier: ^1.1.0 - version: 1.2.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -575,7 +592,7 @@ importers: version: 19.2.7(react@19.2.7) devDependencies: '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@vitejs/plugin-react': specifier: ^4.3.0 @@ -592,9 +609,9 @@ importers: packages/viewer: dependencies: - '@cyber/agent-protocol': + '@cyber/aop': specifier: workspace:* - version: link:../agent-protocol + version: link:../aop '@cyber/markdown': specifier: workspace:* version: link:../markdown @@ -606,7 +623,7 @@ importers: version: link:../ui '@xyflow/react': specifier: ^12.0.0 - version: 12.11.2(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 12.11.2(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) lucide-react: specifier: ^0.400.0 version: 0.400.0(react@19.2.7) @@ -626,8 +643,11 @@ importers: specifier: ^4.0.1 version: 4.0.1 devDependencies: + '@bufbuild/protobuf': + specifier: ^2.9.0 + version: 2.13.0 '@types/react': - specifier: ^18.3.0 + specifier: 18.3.31 version: 18.3.31 '@types/react-syntax-highlighter': specifier: ^15.5.13 @@ -737,6 +757,22 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@2.13.0': + resolution: {integrity: sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g==} + + '@bufbuild/protoc-gen-es@2.13.0': + resolution: {integrity: sha512-ylI1vrLksdnXrVZRs9xGxmrQxKGhUm6pPszv26kqBvNiO3qPTktk+hgfwbLISBY4M/reShkT2dFLGT9fbydBXg==} + engines: {node: '>=20'} + hasBin: true + peerDependencies: + '@bufbuild/protobuf': 2.13.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + + '@bufbuild/protoplugin@2.13.0': + resolution: {integrity: sha512-32eMChKaL/A8Hh5AfMmXSdnuyznN85uoEjoyWiWeRrvtQOtpqX/v1R9PDe0g9vMIgzznK9inMT3CUaal0kjLUQ==} + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -962,8 +998,8 @@ packages: '@radix-ui/react-arrow@1.1.11': resolution: {integrity: sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -975,8 +1011,8 @@ packages: '@radix-ui/react-checkbox@1.3.8': resolution: {integrity: sha512-wfN60IGuxynWK7rP4Ks2p7u9G7gqirzkAiFptuzVbsR1ot2/K+PavNUAtxiKxyRfLOvSbVfvvm9m3rFqLEXz7A==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -988,8 +1024,8 @@ packages: '@radix-ui/react-collapsible@1.1.16': resolution: {integrity: sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1001,8 +1037,8 @@ packages: '@radix-ui/react-collection@1.1.12': resolution: {integrity: sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1014,7 +1050,7 @@ packages: '@radix-ui/react-compose-refs@1.1.3': resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1023,8 +1059,8 @@ packages: '@radix-ui/react-context-menu@2.3.3': resolution: {integrity: sha512-PS+gKE0z2prJ74Y0sM+brAGK4mYOHIR7TlcV5EJgUQ6E0xMvyswkK2X4yRqyganrzsRL+WCSKAPu0NQITICRWg==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1036,7 +1072,7 @@ packages: '@radix-ui/react-context@1.2.0': resolution: {integrity: sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1045,8 +1081,8 @@ packages: '@radix-ui/react-dialog@1.1.19': resolution: {integrity: sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1058,7 +1094,7 @@ packages: '@radix-ui/react-direction@1.1.2': resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1067,8 +1103,8 @@ packages: '@radix-ui/react-dismissable-layer@1.1.15': resolution: {integrity: sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1080,8 +1116,8 @@ packages: '@radix-ui/react-dropdown-menu@2.1.20': resolution: {integrity: sha512-slfm+rRaZRuQBvHq60lXvSVUPhid0IPtjSZzIuUlWZMUs01iYZNlGS3mJgRD3ChLQVBAYlKiL/tFyWGX+dz8Xw==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1093,7 +1129,7 @@ packages: '@radix-ui/react-focus-guards@1.1.4': resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1102,8 +1138,8 @@ packages: '@radix-ui/react-focus-scope@1.1.12': resolution: {integrity: sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1115,7 +1151,7 @@ packages: '@radix-ui/react-id@1.1.2': resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1124,8 +1160,8 @@ packages: '@radix-ui/react-menu@2.1.20': resolution: {integrity: sha512-VsUrXxFe9d2ScbZF0fR/oPR1+qjyeLs5p0jzG8h90puMoA9bq4SirYlXbE+USRg9Q2qTeJSFNqjw2nts8jJe4w==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1137,8 +1173,8 @@ packages: '@radix-ui/react-popover@1.1.19': resolution: {integrity: sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1150,8 +1186,8 @@ packages: '@radix-ui/react-popper@1.3.3': resolution: {integrity: sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1163,8 +1199,8 @@ packages: '@radix-ui/react-portal@1.1.13': resolution: {integrity: sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1176,8 +1212,8 @@ packages: '@radix-ui/react-presence@1.1.7': resolution: {integrity: sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1189,8 +1225,8 @@ packages: '@radix-ui/react-presence@1.1.8': resolution: {integrity: sha512-0hhyrQdXMaATgq4ammLG9+iPqsXxzZkgTSIxdrJHdfLnXO4Uo5L7BoO3/Xf0AEaettadGZWGGJMw6ujzQvIpGA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1202,8 +1238,8 @@ packages: '@radix-ui/react-primitive@2.1.7': resolution: {integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1215,8 +1251,8 @@ packages: '@radix-ui/react-roving-focus@1.1.15': resolution: {integrity: sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1228,8 +1264,8 @@ packages: '@radix-ui/react-scroll-area@1.2.14': resolution: {integrity: sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1241,8 +1277,8 @@ packages: '@radix-ui/react-select@2.3.3': resolution: {integrity: sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1254,8 +1290,8 @@ packages: '@radix-ui/react-separator@1.1.11': resolution: {integrity: sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1267,7 +1303,7 @@ packages: '@radix-ui/react-slot@1.3.0': resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1276,8 +1312,8 @@ packages: '@radix-ui/react-switch@1.3.3': resolution: {integrity: sha512-1+mlB4/lxJfk5tgJ4g+R5mUCbRpPE1T9+UsEyeLYbGgMtwiMgmuTnfKz4Mw1nHALHjuwyxw4MLd4cSHn6pNSlQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1289,8 +1325,8 @@ packages: '@radix-ui/react-tabs@1.1.17': resolution: {integrity: sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1302,8 +1338,8 @@ packages: '@radix-ui/react-tooltip@1.2.12': resolution: {integrity: sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1315,7 +1351,7 @@ packages: '@radix-ui/react-use-callback-ref@1.1.2': resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1324,7 +1360,7 @@ packages: '@radix-ui/react-use-controllable-state@1.2.3': resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1333,7 +1369,7 @@ packages: '@radix-ui/react-use-controllable-state@1.2.4': resolution: {integrity: sha512-cx2DixxmSfjCcEoRvDvy1NLd6SWK94XFcEEOZUcharUlXbmahFQGKCfwdKZL2ub34iIwOPOEFVF80xb+yfLYiA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1342,7 +1378,7 @@ packages: '@radix-ui/react-use-effect-event@0.0.3': resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1351,7 +1387,7 @@ packages: '@radix-ui/react-use-is-hydrated@0.1.1': resolution: {integrity: sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1360,7 +1396,7 @@ packages: '@radix-ui/react-use-layout-effect@1.1.2': resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1369,7 +1405,7 @@ packages: '@radix-ui/react-use-previous@1.1.2': resolution: {integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1378,7 +1414,7 @@ packages: '@radix-ui/react-use-rect@1.1.2': resolution: {integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1387,7 +1423,7 @@ packages: '@radix-ui/react-use-size@1.1.2': resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -1396,8 +1432,8 @@ packages: '@radix-ui/react-visually-hidden@1.2.7': resolution: {integrity: sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: @@ -1812,10 +1848,10 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} peerDependencies: - '@types/react': ^19.2.0 + '@types/react': 18.3.31 '@types/react-syntax-highlighter@15.5.13': resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} @@ -1823,9 +1859,6 @@ packages: '@types/react@18.3.31': resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1835,6 +1868,11 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} + peerDependencies: + typescript: '*' + '@ungap/structured-clone@1.3.3': resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} @@ -1911,8 +1949,8 @@ packages: '@xyflow/react@12.11.2': resolution: {integrity: sha512-eLAlDWJfWnQEhJwGMjlWdAXO9eYllKpliUmPQlAmOLxz6mExXuzMVDUKLMquixgkrtmMFFtug3jGKmYYld12cA==} peerDependencies: - '@types/react': '>=17' - '@types/react-dom': '>=17' + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7 react: '>=17' react-dom: '>=17' peerDependenciesMeta: @@ -2747,7 +2785,7 @@ packages: peerDependencies: '@types/hoist-non-react-statics': '>= 3.3.1' '@types/node': '>= 12' - '@types/react': '>= 16' + '@types/react': 18.3.31 react: '>= 16.14' peerDependenciesMeta: '@types/hoist-non-react-statics': @@ -2782,7 +2820,7 @@ packages: react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: - '@types/react': '>=18' + '@types/react': 18.3.31 react: '>=18' react-refresh@0.17.0: @@ -2793,7 +2831,7 @@ packages: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': @@ -2803,7 +2841,7 @@ packages: resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -2825,7 +2863,7 @@ packages: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -3018,6 +3056,11 @@ packages: resolution: {integrity: sha512-GQpduILaKjoaGljw097ScsSyKTtZSY7cZ3bJktzfTkPMyCf3ShKLuXK2IaOEN2Plziml+ArR7WJ1m+V4VbnaKQ==} hasBin: true + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -3058,7 +3101,7 @@ packages: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -3068,7 +3111,7 @@ packages: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': '*' + '@types/react': 18.3.31 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': @@ -3198,7 +3241,7 @@ packages: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} engines: {node: '>=12.7.0'} peerDependencies: - '@types/react': '>=16.8' + '@types/react': 18.3.31 immer: '>=9.0.6' react: '>=16.8' peerDependenciesMeta: @@ -3328,6 +3371,24 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@bufbuild/protobuf@2.13.0': {} + + '@bufbuild/protoc-gen-es@2.13.0(@bufbuild/protobuf@2.13.0)': + dependencies: + '@bufbuild/protoplugin': 2.13.0 + optionalDependencies: + '@bufbuild/protobuf': 2.13.0 + transitivePeerDependencies: + - supports-color + + '@bufbuild/protoplugin@2.13.0': + dependencies: + '@bufbuild/protobuf': 2.13.0 + '@typescript/vfs': 1.6.4(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -3505,78 +3566,84 @@ snapshots: '@radix-ui/primitive@1.1.6': {} - '@radix-ui/react-arrow@1.1.11(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-arrow@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-arrow@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-arrow@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-checkbox@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-checkbox@1.3.8(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@radix-ui/primitive': 1.1.6 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-presence': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.4(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-presence': 1.1.8(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.4(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collapsible@1.1.16(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-collapsible@1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-collection@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collection@1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-collection@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-collection@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-compose-refs@1.1.3(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.1) react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-compose-refs@1.1.3(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -3584,37 +3651,37 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-context-menu@2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-menu': 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-context-menu@2.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-context-menu@2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-menu': 2.1.20(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-menu': 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-context-menu@2.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-context@1.2.0(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-menu': 2.1.20(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.1) react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-context@1.2.0(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -3622,24 +3689,40 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-context@1.2.0(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-dialog@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.1) + aria-hidden: 1.2.6 react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dialog@1.1.19(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-dialog@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) aria-hidden: 1.2.6 @@ -3648,29 +3731,13 @@ snapshots: react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dialog@1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-direction@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.1) - aria-hidden: 1.2.6 react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-direction@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -3678,52 +3745,52 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-direction@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-dismissable-layer@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dismissable-layer@1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-dismissable-layer@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) - - '@radix-ui/react-dismissable-layer@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.1) - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-dropdown-menu@2.1.20(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-dropdown-menu@2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-menu': 2.1.20(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-menu': 2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-focus-guards@1.1.4(@types/react@18.3.31)(react@19.2.1)': + dependencies: + react: 19.2.1 + optionalDependencies: + '@types/react': 18.3.31 '@radix-ui/react-focus-guards@1.1.4(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -3731,33 +3798,34 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-focus-scope@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-focus-scope@1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-focus-scope@1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-focus-scope@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-id@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-id@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -3766,29 +3834,48 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-menu@2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-collection': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.1) + aria-hidden: 1.2.6 react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menu@2.1.20(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-menu@2.1.20(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) aria-hidden: 1.2.6 @@ -3797,47 +3884,21 @@ snapshots: react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-menu@2.1.20(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.1) - aria-hidden: 1.2.6 - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-popover@1.1.19(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-popover@1.1.19(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) aria-hidden: 1.2.6 @@ -3846,15 +3907,33 @@ snapshots: react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popper@1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-popper@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-arrow': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-rect': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/rect': 1.1.2 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-popper@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@floating-ui/react-dom': 2.1.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-arrow': 1.1.11(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-arrow': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-rect': 1.1.2(@types/react@18.3.31)(react@19.2.7) @@ -3864,100 +3943,101 @@ snapshots: react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-popper@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-portal@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-arrow': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-rect': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/rect': 1.1.2 + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-portal@1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-portal@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-portal@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-presence@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-presence@1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-presence@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-presence@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-presence@1.1.8(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-presence@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-primitive@2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-primitive@2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-roving-focus@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-collection': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-roving-focus@1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-roving-focus@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@18.3.31)(react@19.2.7) @@ -3966,91 +4046,79 @@ snapshots: react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-roving-focus@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) - - '@radix-ui/react-scroll-area@1.2.14(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-scroll-area@1.2.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/number': 1.1.2 '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-select@2.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-select@2.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/number': 1.1.2 '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-focus-guards': 1.1.4(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) aria-hidden: 1.2.6 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-separator@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-separator@1.1.11(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-separator@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-separator@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-slot@1.3.0(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-slot@1.3.0(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4059,19 +4127,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - react: 19.2.1 - optionalDependencies: - '@types/react': 19.2.17 - - '@radix-ui/react-switch@1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-switch@1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-previous': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-size': 1.1.2(@types/react@18.3.31)(react@19.2.7) @@ -4079,63 +4140,69 @@ snapshots: react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tabs@1.1.17(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-tabs@1.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-direction': 1.1.2(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) + + '@radix-ui/react-tooltip@1.2.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tooltip@1.2.12(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-tooltip@1.2.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@radix-ui/primitive': 1.1.5 '@radix-ui/react-compose-refs': 1.1.3(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-context': 1.2.0(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-id': 1.1.2(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.3(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-slot': 1.3.0(@types/react@18.3.31)(react@19.2.7) '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@18.3.31)(react@19.2.7) - '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-tooltip@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@radix-ui/react-use-callback-ref@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/primitive': 1.1.5 - '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-dismissable-layer': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-popper': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-portal': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-visually-hidden': 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react': 18.3.31 '@radix-ui/react-use-callback-ref@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4143,11 +4210,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@18.3.31)(react@19.2.1)': dependencies: + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@radix-ui/react-use-controllable-state@1.2.3(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4157,22 +4226,21 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-controllable-state@1.2.4(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/primitive': 1.1.6 + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@18.3.31)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 - '@radix-ui/react-use-controllable-state@1.2.4(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-effect-event@0.0.3(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/primitive': 1.1.6 - '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.1) - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@radix-ui/react-use-effect-event@0.0.3(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4181,12 +4249,11 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4194,11 +4261,11 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@radix-ui/react-use-layout-effect@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4206,15 +4273,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-previous@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: - react: 19.2.1 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 - '@radix-ui/react-use-previous@1.1.2(@types/react@18.3.31)(react@19.2.7)': + '@radix-ui/react-use-rect@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: - react: 19.2.7 + '@radix-ui/rect': 1.1.2 + react: 19.2.1 optionalDependencies: '@types/react': 18.3.31 @@ -4225,12 +4293,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-rect@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-use-size@1.1.2(@types/react@18.3.31)(react@19.2.1)': dependencies: - '@radix-ui/rect': 1.1.2 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@18.3.31)(react@19.2.1) react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@radix-ui/react-use-size@1.1.2(@types/react@18.3.31)(react@19.2.7)': dependencies: @@ -4239,30 +4307,23 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - '@radix-ui/react-use-size@1.1.2(@types/react@19.2.17)(react@19.2.1)': + '@radix-ui/react-visually-hidden@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.1) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 + '@types/react-dom': 18.3.7(@types/react@18.3.31) - '@radix-ui/react-visually-hidden@1.2.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@radix-ui/react-visually-hidden@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) - - '@radix-ui/react-visually-hidden@1.2.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.17 - '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@types/react-dom': 18.3.7(@types/react@18.3.31) '@radix-ui/rect@1.1.2': {} @@ -4585,28 +4646,19 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.2.3(@types/react@18.3.31)': + '@types/react-dom@18.3.7(@types/react@18.3.31)': dependencies: '@types/react': 18.3.31 - optional: true - - '@types/react-dom@19.2.3(@types/react@19.2.17)': - dependencies: - '@types/react': 19.2.17 '@types/react-syntax-highlighter@15.5.13': dependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 '@types/react@18.3.31': dependencies: '@types/prop-types': 15.7.15 csstype: 3.2.3 - '@types/react@19.2.17': - dependencies: - csstype: 3.2.3 - '@types/trusted-types@2.0.7': optional: true @@ -4614,6 +4666,13 @@ snapshots: '@types/unist@3.0.3': {} + '@typescript/vfs@1.6.4(typescript@5.4.5)': + dependencies: + debug: 4.4.3 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.3.3': {} '@vitejs/plugin-react@4.7.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0))': @@ -4718,7 +4777,7 @@ snapshots: '@xterm/xterm@6.0.0': {} - '@xyflow/react@12.11.2(@types/react-dom@19.2.3(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + '@xyflow/react@12.11.2(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@xyflow/system': 0.0.79 classcat: 5.0.5 @@ -4727,7 +4786,7 @@ snapshots: zustand: 4.5.7(@types/react@18.3.31)(react@19.2.7) optionalDependencies: '@types/react': 18.3.31 - '@types/react-dom': 19.2.3(@types/react@18.3.31) + '@types/react-dom': 18.3.7(@types/react@18.3.31) transitivePeerDependencies: - immer @@ -5704,10 +5763,10 @@ snapshots: quansync@0.2.11: {} - react-arborist@3.15.1(@types/react@19.2.17)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + react-arborist@3.15.1(@types/react@18.3.31)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: react: 19.2.1 - react-dnd: 14.0.5(@types/react@19.2.17)(react@19.2.1) + react-dnd: 14.0.5(@types/react@18.3.31)(react@19.2.1) react-dnd-html5-backend: 14.1.0 react-dom: 19.2.1(react@19.2.1) react-window: 1.8.11(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -5722,7 +5781,7 @@ snapshots: dependencies: dnd-core: 14.0.1 - react-dnd@14.0.5(@types/react@19.2.17)(react@19.2.1): + react-dnd@14.0.5(@types/react@18.3.31)(react@19.2.1): dependencies: '@react-dnd/invariant': 2.0.0 '@react-dnd/shallowequal': 2.0.0 @@ -5731,7 +5790,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 react-dom@19.2.1(react@19.2.1): dependencies: @@ -5772,6 +5831,14 @@ snapshots: react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@19.2.1): + dependencies: + react: 19.2.1 + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@19.2.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 + react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@19.2.7): dependencies: react: 19.2.7 @@ -5780,13 +5847,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.1): + react-remove-scroll@2.7.2(@types/react@18.3.31)(react@19.2.1): dependencies: react: 19.2.1 - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.1) + react-remove-scroll-bar: 2.3.8(@types/react@18.3.31)(react@19.2.1) + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@19.2.1) tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.31)(react@19.2.1) + use-sidecar: 1.1.3(@types/react@18.3.31)(react@19.2.1) optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 react-remove-scroll@2.7.2(@types/react@18.3.31)(react@19.2.7): dependencies: @@ -5799,17 +5869,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.31 - react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.1): - dependencies: - react: 19.2.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.1) - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.1) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.1) - use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.17 - react-resizable-panels@2.1.9(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: react: 19.2.1 @@ -5828,21 +5887,21 @@ snapshots: react-dom: 19.2.7(react@19.2.7) react-transition-group: 4.4.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react-style-singleton@2.2.3(@types/react@18.3.31)(react@19.2.7): + react-style-singleton@2.2.3(@types/react@18.3.31)(react@19.2.1): dependencies: get-nonce: 1.0.1 - react: 19.2.7 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 18.3.31 - react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.1): + react-style-singleton@2.2.3(@types/react@18.3.31)(react@19.2.7): dependencies: get-nonce: 1.0.1 - react: 19.2.1 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 react-syntax-highlighter@16.1.1(react@19.2.7): dependencies: @@ -6076,6 +6135,8 @@ snapshots: '@turbo/windows-64': 2.10.4 '@turbo/windows-arm64': 2.10.4 + typescript@5.4.5: {} + typescript@5.9.3: {} ufo@1.6.4: {} @@ -6121,35 +6182,35 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - use-callback-ref@1.3.3(@types/react@18.3.31)(react@19.2.7): + use-callback-ref@1.3.3(@types/react@18.3.31)(react@19.2.1): dependencies: - react: 19.2.7 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 18.3.31 - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.1): + use-callback-ref@1.3.3(@types/react@18.3.31)(react@19.2.7): dependencies: - react: 19.2.1 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 - use-sidecar@1.1.3(@types/react@18.3.31)(react@19.2.7): + use-sidecar@1.1.3(@types/react@18.3.31)(react@19.2.1): dependencies: detect-node-es: 1.1.0 - react: 19.2.7 + react: 19.2.1 tslib: 2.8.1 optionalDependencies: '@types/react': 18.3.31 - use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.1): + use-sidecar@1.1.3(@types/react@18.3.31)(react@19.2.7): dependencies: detect-node-es: 1.1.0 - react: 19.2.1 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 18.3.31 use-sync-external-store@1.6.0(react@19.2.1): dependencies: From 41ac635c2d28a70089207960bf321eb4a210e3c2 Mon Sep 17 00:00:00 2001 From: M09Ic Date: Sun, 2 Aug 2026 11:57:28 +0800 Subject: [PATCH 2/8] feat(aop): adopt namespace envelope and typed extensions --- packages/aop/README.md | 5 +- packages/aop/SPEC.md | 48 +- packages/aop/fixtures/interop.json | 59 +- packages/aop/proto/aop/chat.proto | 43 +- packages/aop/proto/aop/content.proto | 21 +- packages/aop/proto/aop/envelope.proto | 16 + packages/aop/proto/aop/event.proto | 18 +- packages/aop/proto/aop/exec/protocol.proto | 37 + packages/aop/proto/aop/file/protocol.proto | 42 ++ packages/aop/proto/aop/protocol.proto | 89 +++ packages/aop/proto/aop/pty/protocol.proto | 71 ++ packages/aop/proto/aop/sco/protocol.proto | 18 + packages/aop/proto/aop/tool/protocol.proto | 29 + packages/aop/proto/aop/value.proto | 11 +- packages/aop/src/client.ts | 219 ++++++ .../aop/src/gen/aiscan/chat/session_pb.ts | 602 ---------------- packages/aop/src/gen/aiscan/scan/scan_pb.ts | 640 ------------------ .../src/gen/aiscan/transport/terminal_pb.ts | 195 ------ packages/aop/src/gen/aop/chat_pb.ts | 147 +--- packages/aop/src/gen/aop/content_pb.ts | 60 +- packages/aop/src/gen/aop/envelope_pb.ts | 51 ++ packages/aop/src/gen/aop/event_pb.ts | 62 +- packages/aop/src/gen/aop/exec/protocol_pb.ts | 156 +++++ packages/aop/src/gen/aop/file/protocol_pb.ts | 241 +++++++ packages/aop/src/gen/aop/protocol_pb.ts | 376 ++++++++++ packages/aop/src/gen/aop/pty/protocol_pb.ts | 593 ++++++++++++++++ packages/aop/src/gen/aop/sco/protocol_pb.ts | 62 ++ packages/aop/src/gen/aop/tool/protocol_pb.ts | 106 +++ packages/aop/src/gen/aop/value_pb.ts | 29 +- packages/aop/src/index.ts | 41 +- 30 files changed, 2313 insertions(+), 1774 deletions(-) create mode 100644 packages/aop/proto/aop/envelope.proto create mode 100644 packages/aop/proto/aop/exec/protocol.proto create mode 100644 packages/aop/proto/aop/file/protocol.proto create mode 100644 packages/aop/proto/aop/protocol.proto create mode 100644 packages/aop/proto/aop/pty/protocol.proto create mode 100644 packages/aop/proto/aop/sco/protocol.proto create mode 100644 packages/aop/proto/aop/tool/protocol.proto create mode 100644 packages/aop/src/client.ts delete mode 100644 packages/aop/src/gen/aiscan/chat/session_pb.ts delete mode 100644 packages/aop/src/gen/aiscan/scan/scan_pb.ts delete mode 100644 packages/aop/src/gen/aiscan/transport/terminal_pb.ts create mode 100644 packages/aop/src/gen/aop/envelope_pb.ts create mode 100644 packages/aop/src/gen/aop/exec/protocol_pb.ts create mode 100644 packages/aop/src/gen/aop/file/protocol_pb.ts create mode 100644 packages/aop/src/gen/aop/protocol_pb.ts create mode 100644 packages/aop/src/gen/aop/pty/protocol_pb.ts create mode 100644 packages/aop/src/gen/aop/sco/protocol_pb.ts create mode 100644 packages/aop/src/gen/aop/tool/protocol_pb.ts diff --git a/packages/aop/README.md b/packages/aop/README.md index 23d7f0e..036e06e 100644 --- a/packages/aop/README.md +++ b/packages/aop/README.md @@ -1,10 +1,11 @@ # @cyber/aop -Provider-neutral Agent Orchestration Protocol types and gRPC services. +Provider-neutral Agent Orchestration Protocol types and namespace codecs. Protobuf is the source of truth; generated TypeScript is the public package. `fixtures/interop.json` is the shared Go/Python/TypeScript binary + protobuf JSON -fixture and includes lossless OpenAI/Anthropic raw payload samples. +fixture. It covers `Envelope -> Any -> Event -> typed Any` +and includes lossless OpenAI/Anthropic raw payload samples. ```ts import { EventSchema } from '@cyber/aop' diff --git a/packages/aop/SPEC.md b/packages/aop/SPEC.md index c58154a..b5b5b3d 100644 --- a/packages/aop/SPEC.md +++ b/packages/aop/SPEC.md @@ -5,9 +5,10 @@ as defined by RFC 2119. ## Scope -AOP defines provider-neutral chat orchestration semantics. It does not define -deployment topology, agent registration, filesystems, terminals, process -execution, persistence engines, or product telemetry. +AOP defines provider-neutral Agent orchestration semantics, including Agent +registration, Session/Turn lifecycle, Event, File, Exec, PTY, Tool progress and +SCO transport. It does not define product management RPCs, persistence engines, +or product-specific DTOs. Protobuf under `proto/aop` is the only schema. Protobuf binary and standard Protobuf JSON are encodings of the same messages, not separate protocols. @@ -16,18 +17,18 @@ Protobuf JSON are encodings of the same messages, not separate protocols. - Client-supplied request, session, turn, message, and tool-call IDs MUST remain unchanged across transports. -- Every mutating request MUST carry a non-empty `request_id`. Replay outcomes - MUST survive a server restart; an in-memory cache alone is insufficient. +- AOP operations use `Envelope.id` as their request and correlation identity. + Product management RPCs MAY define their own `request_id` for idempotency. - `Event.seq` MUST start at 1 and increase strictly within one session. Relays MUST preserve it. An event with a zero sequence is not a published AOP event. -- A service that must synthesize a terminal event after losing the participant +- A service that must synthesize a terminal event after losing the bound node MUST continue the last observed session sequence and MUST suppress a later duplicate terminal event for the same turn. - A delivery cursor is an opaque store position and MUST NOT be interpreted as `Event.seq`. -- Retrying a request with the same `request_id` MUST return the same acceptance +- Retrying an AOP request with the same `Envelope.id` MUST return the same acceptance outcome and MUST NOT create another logical operation. -- Reusing a `request_id` with a different method or request body MUST be +- Reusing an `Envelope.id` with a different message or body MUST be rejected as a conflict. ## Lifecycle @@ -65,12 +66,20 @@ Protobuf JSON are encodings of the same messages, not separate protocols. ## Extensions and providers -- Shared additions SHOULD use a stable reverse-DNS extension namespace. -- A message MUST NOT contain the same extension namespace more than once. -- Extension values containing another protobuf message MUST use that message's - standard protobuf JSON bytes and identify it with `media_type`. -- Unknown content SHOULD use `OpaqueContent`; unknown event semantics SHOULD - use `ExtensionEvent`. +- Protobuf package names are namespaces. `Any.type_url` is the only type + identity; a separate namespace/type string MUST NOT be added. +- Independently routed namespaces MUST expose one `.ProtocolMessage` + and travel in `Envelope.payload`. +- AOP core extension slots MUST use `google.protobuf.Any` containing a concrete, + generated namespace-owned protobuf message. +- `Event.extensions` is metadata attached to a core Event. `Event.extension` is + the primary product-defined Event payload. They MUST NOT be conflated. +- One extension collection MUST NOT contain the same concrete `type_url` more + than once. Collection order has no business meaning. +- Known protobuf messages MUST NOT be encoded as JSON bytes or `EncodedValue`. +- Unknown Any values MUST survive persistence, replay and relay unchanged. +- `EncodedValue` is limited to non-protobuf JSON such as Tool arguments and + Tool JSON Schema. - A provider bridge claiming lossless support MUST emit every exact provider request/response frame as `ProviderFrame`, without parse/reserialize and in wire order. @@ -84,3 +93,14 @@ Protobuf JSON are encodings of the same messages, not separate protocols. Field numbers MUST NOT be reused. Removed fields MUST be reserved. Additive changes preserve field numbers and published meaning. Removed fields MUST be reserved permanently. + +## Namespace registration + +- Applications MUST register supported top-level namespaces during assembly. +- Registration maps one protobuf full name to one local handler; it is not a + global schema registry and owns no connection or operation lifecycle. +- Adding a business namespace MUST NOT modify `Envelope` or the AOP core oneof. +- Duplicate registration MUST fail. Unknown namespaces MUST produce an explicit + protocol error and MUST NOT use JSON-shape fallback. +- Go and TypeScript implementations MAY use different local APIs, but MUST use + the same protobuf full name and wire fixtures. diff --git a/packages/aop/fixtures/interop.json b/packages/aop/fixtures/interop.json index 6c02ff5..8682b2f 100644 --- a/packages/aop/fixtures/interop.json +++ b/packages/aop/fixtures/interop.json @@ -1,28 +1,45 @@ { - "event": { - "id": "fixture-event-1", - "emittedAt": "2026-08-01T00:00:00Z", - "sessionId": "fixture-session", - "turnId": "fixture-turn", - "emitter": "fixture-agent", - "seq": "7", - "providerFrame": { - "provider": "openai", - "protocol": "openai", - "eventType": "response.completed", - "direction": "DIRECTION_RESPONSE", - "transport": "http", - "payload": "eyJpZCI6ImNoYXRjbXBsLWZpeHR1cmUiLCJjaG9pY2VzIjpbeyJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjoiaGVsbG8ifSwiZmluaXNoX3JlYXNvbiI6InN0b3AifV0sInVzYWdlIjp7InByb21wdF90b2tlbnMiOjMsImNvbXBsZXRpb25fdG9rZW5zIjoyLCJ0b3RhbF90b2tlbnMiOjV9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=", - "mediaType": "application/json", - "metadata": [ - { - "name": "request-id", - "value": "Zml4dHVyZS1yZXF1ZXN0" + "envelope": { + "id": "fixture-envelope-1", + "replyTo": "fixture-request-1", + "deliveryCursor": "cursor-7", + "payload": { + "@type": "type.googleapis.com/aop.ProtocolMessage", + "event": { + "id": "fixture-event-1", + "emittedAt": "2026-08-01T00:00:00Z", + "sessionId": "fixture-session", + "turnId": "fixture-turn", + "emitter": "fixture-agent", + "seq": "7", + "extensions": [ + { + "@type": "type.googleapis.com/aop.tool.Progress", + "tool": "fixture-tool", + "target": "https://example.com", + "timestamp": "2026-08-01T00:00:01Z", + "text": "fixture progress" + } + ], + "providerFrame": { + "provider": "openai", + "protocol": "openai", + "eventType": "response.completed", + "direction": "DIRECTION_RESPONSE", + "transport": "http", + "payload": "eyJpZCI6ImNoYXRjbXBsLWZpeHR1cmUiLCJjaG9pY2VzIjpbeyJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjoiaGVsbG8ifSwiZmluaXNoX3JlYXNvbiI6InN0b3AifV0sInVzYWdlIjp7InByb21wdF90b2tlbnMiOjMsImNvbXBsZXRpb25fdG9rZW5zIjoyLCJ0b3RhbF90b2tlbnMiOjV9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=", + "mediaType": "application/json", + "metadata": [ + { + "name": "request-id", + "value": "Zml4dHVyZS1yZXF1ZXN0" + } + ] } - ] + } } }, - "binaryBase64": "Cg9maXh0dXJlLWV2ZW50LTESBgiA7rTTBhoPZml4dHVyZS1zZXNzaW9uIgxmaXh0dXJlLXR1cm4qDWZpeHR1cmUtYWdlbnQwB7oBtAIKBm9wZW5haRIGb3BlbmFpGhJyZXNwb25zZS5jb21wbGV0ZWQgAioEaHR0cDLUAXsiaWQiOiJjaGF0Y21wbC1maXh0dXJlIiwiY2hvaWNlcyI6W3sibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6ImhlbGxvIn0sImZpbmlzaF9yZWFzb24iOiJzdG9wIn1dLCJ1c2FnZSI6eyJwcm9tcHRfdG9rZW5zIjozLCJjb21wbGV0aW9uX3Rva2VucyI6MiwidG90YWxfdG9rZW5zIjo1fSwidW5rbm93biI6eyJuZXN0ZWQiOlsxLHRydWUsIngiXX19OhBhcHBsaWNhdGlvbi9qc29uQh0KCnJlcXVlc3QtaWQSD2ZpeHR1cmUtcmVxdWVzdA==", + "binaryBase64": "ChJmaXh0dXJlLWVudmVsb3BlLTESEWZpeHR1cmUtcmVxdWVzdC0xGghjdXJzb3ItNyKZBAondHlwZS5nb29nbGVhcGlzLmNvbS9hb3AuUHJvdG9jb2xNZXNzYWdlEu0D+gHpAwoPZml4dHVyZS1ldmVudC0xEgYIgO600wYaD2ZpeHR1cmUtc2Vzc2lvbiIMZml4dHVyZS10dXJuKg1maXh0dXJlLWFnZW50MAdCZgoldHlwZS5nb29nbGVhcGlzLmNvbS9hb3AudG9vbC5Qcm9ncmVzcxI9CgxmaXh0dXJlLXRvb2waE2h0dHBzOi8vZXhhbXBsZS5jb20qBgiB7rTTBjIQZml4dHVyZSBwcm9ncmVzc7oBtAIKBm9wZW5haRIGb3BlbmFpGhJyZXNwb25zZS5jb21wbGV0ZWQgAioEaHR0cDLUAXsiaWQiOiJjaGF0Y21wbC1maXh0dXJlIiwiY2hvaWNlcyI6W3sibWVzc2FnZSI6eyJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6ImhlbGxvIn0sImZpbmlzaF9yZWFzb24iOiJzdG9wIn1dLCJ1c2FnZSI6eyJwcm9tcHRfdG9rZW5zIjozLCJjb21wbGV0aW9uX3Rva2VucyI6MiwidG90YWxfdG9rZW5zIjo1fSwidW5rbm93biI6eyJuZXN0ZWQiOlsxLHRydWUsIngiXX19OhBhcHBsaWNhdGlvbi9qc29uQh0KCnJlcXVlc3QtaWQSD2ZpeHR1cmUtcmVxdWVzdA==", "providerPayloads": { "openaiBase64": "eyJpZCI6ImNoYXRjbXBsLWZpeHR1cmUiLCJjaG9pY2VzIjpbeyJtZXNzYWdlIjp7InJvbGUiOiJhc3Npc3RhbnQiLCJjb250ZW50IjoiaGVsbG8ifSwiZmluaXNoX3JlYXNvbiI6InN0b3AifV0sInVzYWdlIjp7InByb21wdF90b2tlbnMiOjMsImNvbXBsZXRpb25fdG9rZW5zIjoyLCJ0b3RhbF90b2tlbnMiOjV9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=", "anthropicBase64": "eyJpZCI6Im1zZ19maXh0dXJlIiwidHlwZSI6Im1lc3NhZ2UiLCJyb2xlIjoiYXNzaXN0YW50IiwiY29udGVudCI6W3sidHlwZSI6InRoaW5raW5nIiwidGhpbmtpbmciOiJyYXctdGhvdWdodCJ9LHsidHlwZSI6InRleHQiLCJ0ZXh0IjoiaGVsbG8ifV0sInN0b3BfcmVhc29uIjoiZW5kX3R1cm4iLCJ1c2FnZSI6eyJpbnB1dF90b2tlbnMiOjMsIm91dHB1dF90b2tlbnMiOjJ9LCJ1bmtub3duIjp7Im5lc3RlZCI6WzEsdHJ1ZSwieCJdfX0=" diff --git a/packages/aop/proto/aop/chat.proto b/packages/aop/proto/aop/chat.proto index 95e3abd..3bc425b 100644 --- a/packages/aop/proto/aop/chat.proto +++ b/packages/aop/proto/aop/chat.proto @@ -4,34 +4,36 @@ package aop; import "aop/content.proto"; import "aop/event.proto"; -import "aop/value.proto"; +import "google/protobuf/any.proto"; + +option go_package = "github.com/chainreactors/aiscan/aop"; message Rejection { string code = 1; string message = 2; bool retryable = 3; - EncodedValue detail = 4; + reserved 4; } message Session { string id = 1; string state = 2; - string participant = 3; + string node_uri = 3; string title = 4; } message OpenSessionRequest { - string request_id = 1; + reserved 1, 7; string session_id = 2; - string participant = 3; + string node_uri = 3; string title = 4; string parent_session_id = 5; string parent_tool_call_id = 6; - repeated Extension extensions = 7; + repeated google.protobuf.Any extensions = 8; } message OpenSessionResponse { - string request_id = 1; + reserved 1; oneof outcome { Session accepted = 2; Rejection rejected = 3; @@ -39,13 +41,13 @@ message OpenSessionResponse { } message RunTurnRequest { - string request_id = 1; + reserved 1, 7; string session_id = 2; string turn_id = 3; Message input = 4; bool continue_session = 5; uint32 max_turns = 6; - repeated Extension extensions = 7; + repeated google.protobuf.Any extensions = 8; } message TurnReceipt { @@ -55,7 +57,7 @@ message TurnReceipt { } message RunTurnResponse { - string request_id = 1; + reserved 1; oneof outcome { TurnReceipt accepted = 2; Rejection rejected = 3; @@ -63,14 +65,14 @@ message RunTurnResponse { } message CancelTurnRequest { - string request_id = 1; + reserved 1; string session_id = 2; string turn_id = 3; string reason = 4; } message CancelTurnResponse { - string request_id = 1; + reserved 1; oneof outcome { TurnReceipt accepted = 2; Rejection rejected = 3; @@ -78,13 +80,13 @@ message CancelTurnResponse { } message CloseSessionRequest { - string request_id = 1; + reserved 1; string session_id = 2; string reason = 3; } message CloseSessionResponse { - string request_id = 1; + reserved 1; oneof outcome { Session accepted = 2; Rejection rejected = 3; @@ -101,10 +103,6 @@ message EventDelivery { Event event = 2; } -message WatchEventsResponse { - EventDelivery delivery = 1; -} - message ListEventsRequest { string session_id = 1; string after_cursor = 2; @@ -115,12 +113,3 @@ message ListEventsResponse { repeated EventDelivery events = 1; string next_cursor = 2; } - -service ChatService { - rpc OpenSession(OpenSessionRequest) returns (OpenSessionResponse); - rpc RunTurn(RunTurnRequest) returns (RunTurnResponse); - rpc CancelTurn(CancelTurnRequest) returns (CancelTurnResponse); - rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse); - rpc WatchEvents(WatchEventsRequest) returns (stream WatchEventsResponse); - rpc ListEvents(ListEventsRequest) returns (ListEventsResponse); -} diff --git a/packages/aop/proto/aop/content.proto b/packages/aop/proto/aop/content.proto index d711248..c6a80f6 100644 --- a/packages/aop/proto/aop/content.proto +++ b/packages/aop/proto/aop/content.proto @@ -4,6 +4,8 @@ package aop; import "aop/value.proto"; +option go_package = "github.com/chainreactors/aiscan/aop"; + message Resource { oneof source { bytes data = 1; @@ -19,7 +21,7 @@ message Annotation { uint64 end = 3; string title = 4; string uri = 5; - EncodedValue detail = 6; + reserved 6; } message TextContent { @@ -29,15 +31,14 @@ message TextContent { message ReasoningContent { string text = 1; - bytes opaque = 2; - string opaque_type = 3; + reserved 2, 3; } message MediaContent { string kind = 1; Resource resource = 2; string transcript = 3; - EncodedValue detail = 4; + reserved 4; } message ToolCall { @@ -52,18 +53,23 @@ message ToolResult { string call_id = 1; repeated Content output = 2; bool is_error = 3; - EncodedValue detail = 4; + reserved 4; string name = 5; uint64 duration_ms = 6; bool terminate = 7; } -message OpaqueContent { +// ToolDefinition is the provider-neutral function/tool contract advertised by +// an Agent. Provider adapters translate this schema at their wire boundary. +message ToolDefinition { string type = 1; - EncodedValue value = 2; + string name = 2; + string description = 3; + EncodedValue input_schema = 4; } message Content { + reserved 7; oneof value { TextContent text = 1; ReasoningContent reasoning = 2; @@ -71,7 +77,6 @@ message Content { MediaContent media = 4; ToolCall tool_call = 5; ToolResult tool_result = 6; - OpaqueContent opaque = 7; } } diff --git a/packages/aop/proto/aop/envelope.proto b/packages/aop/proto/aop/envelope.proto new file mode 100644 index 0000000..c442f3c --- /dev/null +++ b/packages/aop/proto/aop/envelope.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package aop; + +import "google/protobuf/any.proto"; + +option go_package = "github.com/chainreactors/aiscan/aop"; + +// Envelope is the only AOP wire envelope. Business namespaces are carried by +// Any and never extend this message with a global oneof. +message Envelope { + string id = 1; + string reply_to = 2; + string delivery_cursor = 3; + google.protobuf.Any payload = 4; +} diff --git a/packages/aop/proto/aop/event.proto b/packages/aop/proto/aop/event.proto index a56df21..dad9b86 100644 --- a/packages/aop/proto/aop/event.proto +++ b/packages/aop/proto/aop/event.proto @@ -3,9 +3,11 @@ syntax = "proto3"; package aop; import "aop/content.proto"; -import "aop/value.proto"; +import "google/protobuf/any.proto"; import "google/protobuf/timestamp.proto"; +option go_package = "github.com/chainreactors/aiscan/aop"; + message SessionStarted { string model = 1; string parent_session_id = 2; @@ -22,7 +24,7 @@ message ProtocolError { string code = 1; string message = 2; bool retryable = 3; - EncodedValue detail = 4; + reserved 4; } message TokenUsage { @@ -71,12 +73,7 @@ message ToolCallDelta { message Status { string state = 1; - EncodedValue detail = 2; -} - -message ExtensionEvent { - string type = 1; - EncodedValue value = 2; + reserved 2; } enum Direction { @@ -103,13 +100,14 @@ message ProviderFrame { } message Event { + reserved 7, 22; string id = 1; google.protobuf.Timestamp emitted_at = 2; string session_id = 3; string turn_id = 4; string emitter = 5; uint64 seq = 6; - repeated Extension extensions = 7; + repeated google.protobuf.Any extensions = 8; oneof payload { SessionStarted session_started = 10; @@ -124,7 +122,7 @@ message Event { TokenUsage usage = 19; ProtocolError error = 20; Status status = 21; - ExtensionEvent extension = 22; ProviderFrame provider_frame = 23; + google.protobuf.Any extension = 24; } } diff --git a/packages/aop/proto/aop/exec/protocol.proto b/packages/aop/proto/aop/exec/protocol.proto new file mode 100644 index 0000000..9e50f4f --- /dev/null +++ b/packages/aop/proto/aop/exec/protocol.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +package aop.exec; + +option go_package = "github.com/chainreactors/aiscan/aop/exec;exec"; + +enum Stream { + STREAM_UNSPECIFIED = 0; + STREAM_STDOUT = 1; + STREAM_STDERR = 2; +} + +message Request { + string command = 1; + string cwd = 2; + uint32 timeout_seconds = 3; + map env = 4; +} + +message Output { + Stream stream = 1; + bytes data = 2; +} + +message Result { + int32 exit_code = 1; + string state = 2; + string kill_cause = 3; +} + +message ProtocolMessage { + oneof message { + Request request = 10; + Output output = 11; + Result result = 12; + } +} diff --git a/packages/aop/proto/aop/file/protocol.proto b/packages/aop/proto/aop/file/protocol.proto new file mode 100644 index 0000000..0d3f878 --- /dev/null +++ b/packages/aop/proto/aop/file/protocol.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; + +package aop.file; + +option go_package = "github.com/chainreactors/aiscan/aop/file;file"; + +message ReadRequest { string path = 1; } +message WriteRequest { string path = 1; bytes data = 2; } +message ListRequest { string path = 1; } +message MkdirRequest { string path = 1; } +message UploadRequest { + string session_id = 1; + string filename = 2; + string media_type = 3; + bytes data = 4; +} + +message Entry { + string name = 1; + bool is_directory = 2; + int64 size = 3; +} + +message Result { + string path = 1; + string filename = 2; + int64 size = 3; + bytes data = 4; + repeated Entry entries = 5; + string media_type = 6; +} + +message ProtocolMessage { + oneof message { + ReadRequest read_request = 10; + WriteRequest write_request = 11; + ListRequest list_request = 12; + MkdirRequest mkdir_request = 13; + UploadRequest upload_request = 14; + Result result = 20; + } +} diff --git a/packages/aop/proto/aop/protocol.proto b/packages/aop/proto/aop/protocol.proto new file mode 100644 index 0000000..f8118b0 --- /dev/null +++ b/packages/aop/proto/aop/protocol.proto @@ -0,0 +1,89 @@ +syntax = "proto3"; + +package aop; + +import "aop/chat.proto"; +import "aop/content.proto"; +import "aop/event.proto"; +import "google/protobuf/struct.proto"; + +option go_package = "github.com/chainreactors/aiscan/aop"; + +message AgentRuntimeInfo { + string hostname = 1; + string username = 2; + string working_dir = 3; + string os = 4; + string arch = 5; + int32 pid = 6; + google.protobuf.Struct metadata = 7; +} + +message AgentHello { + string agent_id = 1; + string name = 2; + string authority = 3; + repeated string capabilities = 4; + reserved 5; + repeated ToolDefinition tools = 6; + AgentRuntimeInfo runtime = 7; +} + +message AgentAccepted { + string agent_id = 1; + repeated string capabilities = 2; +} + +message AgentStatus { + string provider = 1; + string model = 2; + string space = 3; + bool bound = 4; + reserved 5; + string config_error = 6; +} + +message AgentStats { + uint64 turns = 1; + uint64 tool_calls = 2; + uint64 running_tools = 3; + uint64 input_tokens = 4; + uint64 output_tokens = 5; + uint64 total_tokens = 6; + uint64 cache_read_tokens = 7; + uint64 cache_write_tokens = 8; + reserved 9, 10; + string last_event = 11; +} + +message CancelOperation { + string target_id = 1; + string reason = 2; +} + +// ProtocolMessage is the typed union for the AOP core namespace. Extension +// packages define their own ProtocolMessage and do not modify this one. +message ProtocolMessage { + oneof message { + AgentHello agent_hello = 10; + AgentAccepted agent_accepted = 11; + AgentStatus agent_status = 12; + AgentStats agent_stats = 13; + + OpenSessionRequest open_session_request = 20; + OpenSessionResponse open_session_response = 21; + RunTurnRequest run_turn_request = 22; + RunTurnResponse run_turn_response = 23; + CancelTurnRequest cancel_turn_request = 24; + CancelTurnResponse cancel_turn_response = 25; + CloseSessionRequest close_session_request = 26; + CloseSessionResponse close_session_response = 27; + WatchEventsRequest watch_events_request = 28; + ListEventsRequest list_events_request = 29; + ListEventsResponse list_events_response = 30; + Event event = 31; + + CancelOperation cancel_operation = 40; + ProtocolError protocol_error = 41; + } +} diff --git a/packages/aop/proto/aop/pty/protocol.proto b/packages/aop/proto/aop/pty/protocol.proto new file mode 100644 index 0000000..3a6f68d --- /dev/null +++ b/packages/aop/proto/aop/pty/protocol.proto @@ -0,0 +1,71 @@ +syntax = "proto3"; + +package aop.pty; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/chainreactors/aiscan/aop/pty;pty"; + +message Session { + string id = 1; + string kind = 2; + string name = 3; + string command = 4; + int32 pid = 5; + google.protobuf.Timestamp started_at = 6; + google.protobuf.Timestamp last_activity_at = 7; + google.protobuf.Timestamp ended_at = 8; + int64 activity_seq = 9; + int64 output_bytes = 10; + int32 exit_code = 11; + string state = 12; + string kill_cause = 13; +} + +message Open { + string stream_id = 1; + string node_uri = 2; + string kind = 3; + string name = 4; + string command = 5; + repeated string args = 6; + int32 cols = 7; + int32 rows = 8; + bool singleton = 9; +} +message Opened { string stream_id = 1; Session session = 2; } +message Input { string stream_id = 1; bytes data = 2; } +message Output { string stream_id = 1; bytes data = 2; int64 offset = 3; } +message Resize { string stream_id = 1; int32 cols = 2; int32 rows = 3; } +message List { string stream_id = 1; string node_uri = 2; } +message Sessions { string stream_id = 1; repeated Session sessions = 2; } +message Attach { string stream_id = 1; string session_id = 2; int32 cols = 3; int32 rows = 4; } +message Attached { string stream_id = 1; Session session = 2; } +message Detach { string stream_id = 1; } +message Detached { string stream_id = 1; } +message Kill { string stream_id = 1; } +message Close { string stream_id = 1; } +message Closed { string stream_id = 1; Session session = 2; } +message State { string stream_id = 1; Session session = 2; } +message Error { string stream_id = 1; string message = 2; } + +message ProtocolMessage { + oneof message { + Open open = 10; + Input input = 11; + Output output = 12; + Resize resize = 13; + List list = 14; + Sessions sessions = 15; + Attach attach = 16; + Detach detach = 17; + Close close = 18; + State state = 19; + Error error = 20; + Opened opened = 21; + Attached attached = 22; + Detached detached = 23; + Kill kill = 24; + Closed closed = 25; + } +} diff --git a/packages/aop/proto/aop/sco/protocol.proto b/packages/aop/proto/aop/sco/protocol.proto new file mode 100644 index 0000000..fb6ff96 --- /dev/null +++ b/packages/aop/proto/aop/sco/protocol.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +package aop.sco; + +option go_package = "github.com/chainreactors/aiscan/aop/sco;sco"; + +// Nodes carries libcstx-owned node documents without copying the libcstx +// schema into AOP. Each entry uses the declared media type. +message Nodes { + repeated bytes nodes = 1; + string media_type = 2; +} + +message ProtocolMessage { + oneof message { + Nodes nodes = 10; + } +} diff --git a/packages/aop/proto/aop/tool/protocol.proto b/packages/aop/proto/aop/tool/protocol.proto new file mode 100644 index 0000000..63f3843 --- /dev/null +++ b/packages/aop/proto/aop/tool/protocol.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package aop.tool; + +import "aop/content.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/chainreactors/aiscan/aop/tool;tool"; + +message Call { + string session_id = 1; + string turn_id = 2; + aop.ToolCall call = 3; +} + +message Progress { + string tool = 1; + reserved 2, 4; + string target = 3; + google.protobuf.Timestamp timestamp = 5; + string text = 6; +} + +message ProtocolMessage { + oneof message { + Progress progress = 10; + Call call = 11; + } +} diff --git a/packages/aop/proto/aop/value.proto b/packages/aop/proto/aop/value.proto index dfd8ceb..b92a958 100644 --- a/packages/aop/proto/aop/value.proto +++ b/packages/aop/proto/aop/value.proto @@ -2,14 +2,11 @@ syntax = "proto3"; package aop; -// EncodedValue preserves structured or binary data without JSON coercion. +option go_package = "github.com/chainreactors/aiscan/aop"; + +// EncodedValue carries genuinely opaque data whose schema is not protobuf, +// notably provider/tool JSON arguments and JSON Schema documents. message EncodedValue { bytes data = 1; string media_type = 2; } - -// Extension carries namespaced semantics outside the stable AOP core. -message Extension { - string namespace = 1; - EncodedValue value = 2; -} diff --git a/packages/aop/src/client.ts b/packages/aop/src/client.ts new file mode 100644 index 0000000..52f8479 --- /dev/null +++ b/packages/aop/src/client.ts @@ -0,0 +1,219 @@ +import { + create, + fromBinary, + toBinary, + type DescMessage, + type Message, + type MessageShape, +} from '@bufbuild/protobuf' +import { anyPack, anyUnpack } from '@bufbuild/protobuf/wkt' +import { EnvelopeSchema, type Envelope } from './gen/aop/envelope_pb.js' +import { ProtocolMessageSchema as CoreSchema, type ProtocolMessage as CoreMessage } from './gen/aop/protocol_pb.js' +import { ProtocolMessageSchema as FileSchema, type ProtocolMessage as FileMessage } from './gen/aop/file/protocol_pb.js' +import { ProtocolMessageSchema as ExecSchema, type ProtocolMessage as ExecMessage } from './gen/aop/exec/protocol_pb.js' +import { ProtocolMessageSchema as PtySchema, type ProtocolMessage as PtyMessage } from './gen/aop/pty/protocol_pb.js' +import { ProtocolMessageSchema as ToolSchema, type ProtocolMessage as ToolMessage } from './gen/aop/tool/protocol_pb.js' +import { ProtocolMessageSchema as SCOSchema, type ProtocolMessage as SCOMessage } from './gen/aop/sco/protocol_pb.js' + +export type AOPPayload = Message + +type Pending = { resolve: (value: AOPPayload) => void; reject: (error: Error) => void } +type Subscription = { + schema: DescMessage + value: Message + receive: (payload: AOPPayload, envelope: Envelope) => void + durable: boolean + cursor: string + resume?: (cursor: string) => Message +} + +const officialSchemas = [CoreSchema, FileSchema, ExecSchema, PtySchema, ToolSchema, SCOSchema] as const + +export class AOPClient { + private socket?: WebSocket + private connecting?: Promise + private closed = false + private reconnectDelay = 250 + private readonly outbound: Envelope[] = [] + private readonly pending = new Map() + private readonly subscriptions = new Map() + private readonly restoreSubscriptions = new Set() + private readonly payloadSchemas = new Map() + + constructor(private readonly url = defaultAOPURL()) { + for (const schema of officialSchemas) this.register(schema) + } + + register(schema: Desc): this { + if (this.payloadSchemas.has(schema.typeName)) throw new Error(`AOP namespace ${schema.typeName} is already registered`) + this.payloadSchemas.set(schema.typeName, schema) + return this + } + + async connect(): Promise { + if (this.socket?.readyState === WebSocket.OPEN) return + if (this.connecting) return this.connecting + this.closed = false + this.connecting = new Promise((resolve, reject) => { + const socket = new WebSocket(this.url) + socket.binaryType = 'arraybuffer' + socket.onopen = () => { + this.socket = socket + this.connecting = undefined + this.reconnectDelay = 250 + this.flush() + for (const id of this.restoreSubscriptions) { + const subscription = this.subscriptions.get(id) + if (!subscription) continue + const value = subscription.resume?.(subscription.cursor) ?? subscription.value + this.write(this.envelope(id, subscription.schema, value)) + } + this.restoreSubscriptions.clear() + resolve() + } + socket.onmessage = (event) => this.receive(event.data) + socket.onerror = () => { + if (socket.readyState !== WebSocket.OPEN) reject(new Error('AOP WebSocket connection failed')) + } + socket.onclose = () => this.disconnected(socket) + }) + return this.connecting + } + + send(schema: Desc, value: MessageShape, options?: { id?: string; replyTo?: string }): string { + const id = options?.id || newID() + this.write(this.envelope(id, schema, value, options?.replyTo)) + return id + } + + request(schema: Desc, value: MessageShape, options?: { id?: string }): Promise { + const id = options?.id || newID() + return new Promise((resolve, reject) => { + this.pending.set(id, { resolve, reject }) + this.write(this.envelope(id, schema, value)) + }) + } + + subscribe( + schema: Desc, + value: MessageShape, + receive: (payload: AOPPayload, envelope: Envelope) => void, + options?: { id?: string; durable?: boolean; resume?: (cursor: string) => MessageShape }, + ): () => void { + const id = options?.id || newID() + // Replacing a subscription while disconnected queues its fresh request; it + // must not also be restored from the previous connection. + this.restoreSubscriptions.delete(id) + this.subscriptions.set(id, { + schema, + value: value as Message, + receive, + durable: options?.durable === true, + cursor: '', + resume: options?.resume as ((cursor: string) => Message) | undefined, + }) + this.write(this.envelope(id, schema, value)) + return () => { + this.subscriptions.delete(id) + const cancel = create(CoreSchema, { message: { case: 'cancelOperation', value: { targetId: id } } }) + this.send(CoreSchema, cancel) + } + } + + close(): void { + this.closed = true + this.connecting = undefined + this.socket?.close() + this.socket = undefined + const error = new Error('AOP client closed') + for (const pending of this.pending.values()) pending.reject(error) + this.pending.clear() + this.subscriptions.clear() + this.restoreSubscriptions.clear() + this.outbound.length = 0 + } + + private envelope(id: string, schema: Desc, value: MessageShape, replyTo = ''): Envelope { + return create(EnvelopeSchema, { id, replyTo, payload: anyPack(schema, value) }) + } + + private write(envelope: Envelope): void { + if (this.socket?.readyState === WebSocket.OPEN) { + this.socket.send(toBinary(EnvelopeSchema, envelope)) + return + } + this.outbound.push(envelope) + void this.connect().catch(() => {}) + } + + private flush(): void { + while (this.outbound.length > 0 && this.socket?.readyState === WebSocket.OPEN) { + this.socket.send(toBinary(EnvelopeSchema, this.outbound.shift()!)) + } + } + + private receive(raw: unknown): void { + if (!(raw instanceof ArrayBuffer)) return + const envelope = fromBinary(EnvelopeSchema, new Uint8Array(raw)) + const payload = this.decodePayload(envelope) + if (!payload) return + const subscription = this.subscriptions.get(envelope.replyTo) + if (subscription) { + if (envelope.deliveryCursor) subscription.cursor = envelope.deliveryCursor + subscription.receive(payload, envelope) + return + } + const pending = this.pending.get(envelope.replyTo) + if (pending) { + this.pending.delete(envelope.replyTo) + pending.resolve(payload) + } + } + + private disconnected(socket: WebSocket): void { + const wasConnected = this.socket === socket + if (wasConnected) this.socket = undefined + this.connecting = undefined + if (wasConnected) { + const queued = new Set(this.outbound.map((envelope) => envelope.id)) + const dropped = new Set() + const error = new Error('AOP WebSocket disconnected') + for (const [id, pending] of this.pending) { + pending.reject(error) + dropped.add(id) + } + this.pending.clear() + for (const [id, subscription] of this.subscriptions) { + if (subscription.durable) { + if (!queued.has(id)) this.restoreSubscriptions.add(id) + continue + } + this.subscriptions.delete(id) + dropped.add(id) + } + for (let index = this.outbound.length - 1; index >= 0; index--) { + if (dropped.has(this.outbound[index].id)) this.outbound.splice(index, 1) + } + } + if (this.closed) return + const delay = this.reconnectDelay + this.reconnectDelay = Math.min(this.reconnectDelay * 2, 5000) + globalThis.setTimeout(() => void this.connect().catch(() => {}), delay) + } + + private decodePayload(envelope: Envelope): AOPPayload | undefined { + if (!envelope.payload) return undefined + const typeName = envelope.payload.typeUrl.slice(envelope.payload.typeUrl.lastIndexOf('/') + 1) + const schema = this.payloadSchemas.get(typeName) + return schema ? anyUnpack(envelope.payload, schema) : undefined + } +} + +function defaultAOPURL(): string { + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:' + return `${protocol}//${window.location.host}/api/aop/ws` +} + +function newID(): string { + return globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}` +} diff --git a/packages/aop/src/gen/aiscan/chat/session_pb.ts b/packages/aop/src/gen/aiscan/chat/session_pb.ts deleted file mode 100644 index 1a587dc..0000000 --- a/packages/aop/src/gen/aiscan/chat/session_pb.ts +++ /dev/null @@ -1,602 +0,0 @@ -// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" -// @generated from file aiscan/chat/session.proto (package aiscan.chat, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Rejection, Session } from "../../aop/chat_pb.js"; -import { file_aop_chat } from "../../aop/chat_pb.js"; -import type { Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file aiscan/chat/session.proto. - */ -export const file_aiscan_chat_session: GenFile = /*@__PURE__*/ - fileDesc("ChlhaXNjYW4vY2hhdC9zZXNzaW9uLnByb3RvEgthaXNjYW4uY2hhdCK0AQoNU2Vzc2lvblJlY29yZBIdCgdzZXNzaW9uGAEgASgLMgwuYW9wLlNlc3Npb24SEgoKYWdlbnRfbmFtZRgCIAEoCRIQCghzY2FuX2lkcxgDIAMoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJSChNMaXN0U2Vzc2lvbnNSZXF1ZXN0EhQKDGFmdGVyX2N1cnNvchgBIAEoCRINCgVsaW1pdBgCIAEoDRIWCg5pbmNsdWRlX2Nsb3NlZBgDIAEoCCJZChRMaXN0U2Vzc2lvbnNSZXNwb25zZRIsCghzZXNzaW9ucxgBIAMoCzIaLmFpc2Nhbi5jaGF0LlNlc3Npb25SZWNvcmQSEwoLbmV4dF9jdXJzb3IYAiABKAkiJwoRR2V0U2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCSJBChJHZXRTZXNzaW9uUmVzcG9uc2USKwoHc2Vzc2lvbhgBIAEoCzIaLmFpc2Nhbi5jaGF0LlNlc3Npb25SZWNvcmQiZAoTUmVzZXRTZXNzaW9uUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSFgoObmV3X3Nlc3Npb25faWQYAyABKAkSDQoFdGl0bGUYBCABKAkiYgoTUmVzZXRTZXNzaW9uUmVjZWlwdBIeCghwcmV2aW91cxgBIAEoCzIMLmFvcC5TZXNzaW9uEisKB2N1cnJlbnQYAiABKAsyGi5haXNjYW4uY2hhdC5TZXNzaW9uUmVjb3JkIo8BChRSZXNldFNlc3Npb25SZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEjQKCGFjY2VwdGVkGAIgASgLMiAuYWlzY2FuLmNoYXQuUmVzZXRTZXNzaW9uUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiPgoURGVsZXRlU2Vzc2lvblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJInwKFURlbGV0ZVNlc3Npb25SZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEiAKCGFjY2VwdGVkGAIgASgLMgwuYW9wLlNlc3Npb25IABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lIlAKC0NvbW1hbmRTcGVjEgwKBG5hbWUYASABKAkSDwoHYWxpYXNlcxgCIAMoCRINCgV1c2FnZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSIpChNMaXN0Q29tbWFuZHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkiQgoUTGlzdENvbW1hbmRzUmVzcG9uc2USKgoIY29tbWFuZHMYASADKAsyGC5haXNjYW4uY2hhdC5Db21tYW5kU3BlYyJNChVFeGVjdXRlQ29tbWFuZFJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEgwKBGxpbmUYAyABKAkiSQoOQ29tbWFuZFJlY2VpcHQSFAoMb3BlcmF0aW9uX2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDQoFc3RhdGUYAyABKAkijAEKFkV4ZWN1dGVDb21tYW5kUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIvCghhY2NlcHRlZBgCIAEoCzIbLmFpc2Nhbi5jaGF0LkNvbW1hbmRSZWNlaXB0SAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSJ2ChhVcGxvYWRTZXNzaW9uRmlsZVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEhAKCGZpbGVuYW1lGAMgASgJEhIKCm1lZGlhX3R5cGUYBCABKAkSDAoEZGF0YRgFIAEoDCJQCgxVcGxvYWRlZEZpbGUSEAoIZmlsZW5hbWUYASABKAkSDAoEcGF0aBgCIAEoCRIMCgRzaXplGAMgASgDEhIKCm1lZGlhX3R5cGUYBCABKAkijQEKGVVwbG9hZFNlc3Npb25GaWxlUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRItCghhY2NlcHRlZBgCIAEoCzIZLmFpc2Nhbi5jaGF0LlVwbG9hZGVkRmlsZUgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUy9QQKDlNlc3Npb25TZXJ2aWNlElMKDExpc3RTZXNzaW9ucxIgLmFpc2Nhbi5jaGF0Lkxpc3RTZXNzaW9uc1JlcXVlc3QaIS5haXNjYW4uY2hhdC5MaXN0U2Vzc2lvbnNSZXNwb25zZRJNCgpHZXRTZXNzaW9uEh4uYWlzY2FuLmNoYXQuR2V0U2Vzc2lvblJlcXVlc3QaHy5haXNjYW4uY2hhdC5HZXRTZXNzaW9uUmVzcG9uc2USUwoMUmVzZXRTZXNzaW9uEiAuYWlzY2FuLmNoYXQuUmVzZXRTZXNzaW9uUmVxdWVzdBohLmFpc2Nhbi5jaGF0LlJlc2V0U2Vzc2lvblJlc3BvbnNlElYKDURlbGV0ZVNlc3Npb24SIS5haXNjYW4uY2hhdC5EZWxldGVTZXNzaW9uUmVxdWVzdBoiLmFpc2Nhbi5jaGF0LkRlbGV0ZVNlc3Npb25SZXNwb25zZRJTCgxMaXN0Q29tbWFuZHMSIC5haXNjYW4uY2hhdC5MaXN0Q29tbWFuZHNSZXF1ZXN0GiEuYWlzY2FuLmNoYXQuTGlzdENvbW1hbmRzUmVzcG9uc2USWQoORXhlY3V0ZUNvbW1hbmQSIi5haXNjYW4uY2hhdC5FeGVjdXRlQ29tbWFuZFJlcXVlc3QaIy5haXNjYW4uY2hhdC5FeGVjdXRlQ29tbWFuZFJlc3BvbnNlEmIKEVVwbG9hZFNlc3Npb25GaWxlEiUuYWlzY2FuLmNoYXQuVXBsb2FkU2Vzc2lvbkZpbGVSZXF1ZXN0GiYuYWlzY2FuLmNoYXQuVXBsb2FkU2Vzc2lvbkZpbGVSZXNwb25zZUI2WjRnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vY2hhdDtjaGF0YgZwcm90bzM", [file_aop_chat, file_google_protobuf_timestamp]); - -/** - * @generated from message aiscan.chat.SessionRecord - */ -export type SessionRecord = Message<"aiscan.chat.SessionRecord"> & { - /** - * @generated from field: aop.Session session = 1; - */ - session?: Session | undefined; - - /** - * @generated from field: string agent_name = 2; - */ - agentName: string; - - /** - * @generated from field: repeated string scan_ids = 3; - */ - scanIds: string[]; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 4; - */ - createdAt?: Timestamp | undefined; - - /** - * @generated from field: google.protobuf.Timestamp updated_at = 5; - */ - updatedAt?: Timestamp | undefined; -}; - -/** - * Describes the message aiscan.chat.SessionRecord. - * Use `create(SessionRecordSchema)` to create a new message. - */ -export const SessionRecordSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 0); - -/** - * @generated from message aiscan.chat.ListSessionsRequest - */ -export type ListSessionsRequest = Message<"aiscan.chat.ListSessionsRequest"> & { - /** - * @generated from field: string after_cursor = 1; - */ - afterCursor: string; - - /** - * @generated from field: uint32 limit = 2; - */ - limit: number; - - /** - * @generated from field: bool include_closed = 3; - */ - includeClosed: boolean; -}; - -/** - * Describes the message aiscan.chat.ListSessionsRequest. - * Use `create(ListSessionsRequestSchema)` to create a new message. - */ -export const ListSessionsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 1); - -/** - * @generated from message aiscan.chat.ListSessionsResponse - */ -export type ListSessionsResponse = Message<"aiscan.chat.ListSessionsResponse"> & { - /** - * @generated from field: repeated aiscan.chat.SessionRecord sessions = 1; - */ - sessions: SessionRecord[]; - - /** - * @generated from field: string next_cursor = 2; - */ - nextCursor: string; -}; - -/** - * Describes the message aiscan.chat.ListSessionsResponse. - * Use `create(ListSessionsResponseSchema)` to create a new message. - */ -export const ListSessionsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 2); - -/** - * @generated from message aiscan.chat.GetSessionRequest - */ -export type GetSessionRequest = Message<"aiscan.chat.GetSessionRequest"> & { - /** - * @generated from field: string session_id = 1; - */ - sessionId: string; -}; - -/** - * Describes the message aiscan.chat.GetSessionRequest. - * Use `create(GetSessionRequestSchema)` to create a new message. - */ -export const GetSessionRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 3); - -/** - * @generated from message aiscan.chat.GetSessionResponse - */ -export type GetSessionResponse = Message<"aiscan.chat.GetSessionResponse"> & { - /** - * @generated from field: aiscan.chat.SessionRecord session = 1; - */ - session?: SessionRecord | undefined; -}; - -/** - * Describes the message aiscan.chat.GetSessionResponse. - * Use `create(GetSessionResponseSchema)` to create a new message. - */ -export const GetSessionResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 4); - -/** - * @generated from message aiscan.chat.ResetSessionRequest - */ -export type ResetSessionRequest = Message<"aiscan.chat.ResetSessionRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string session_id = 2; - */ - sessionId: string; - - /** - * @generated from field: string new_session_id = 3; - */ - newSessionId: string; - - /** - * @generated from field: string title = 4; - */ - title: string; -}; - -/** - * Describes the message aiscan.chat.ResetSessionRequest. - * Use `create(ResetSessionRequestSchema)` to create a new message. - */ -export const ResetSessionRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 5); - -/** - * @generated from message aiscan.chat.ResetSessionReceipt - */ -export type ResetSessionReceipt = Message<"aiscan.chat.ResetSessionReceipt"> & { - /** - * @generated from field: aop.Session previous = 1; - */ - previous?: Session | undefined; - - /** - * @generated from field: aiscan.chat.SessionRecord current = 2; - */ - current?: SessionRecord | undefined; -}; - -/** - * Describes the message aiscan.chat.ResetSessionReceipt. - * Use `create(ResetSessionReceiptSchema)` to create a new message. - */ -export const ResetSessionReceiptSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 6); - -/** - * @generated from message aiscan.chat.ResetSessionResponse - */ -export type ResetSessionResponse = Message<"aiscan.chat.ResetSessionResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.chat.ResetSessionResponse.outcome - */ - outcome: { - /** - * @generated from field: aiscan.chat.ResetSessionReceipt accepted = 2; - */ - value: ResetSessionReceipt; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.chat.ResetSessionResponse. - * Use `create(ResetSessionResponseSchema)` to create a new message. - */ -export const ResetSessionResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 7); - -/** - * @generated from message aiscan.chat.DeleteSessionRequest - */ -export type DeleteSessionRequest = Message<"aiscan.chat.DeleteSessionRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string session_id = 2; - */ - sessionId: string; -}; - -/** - * Describes the message aiscan.chat.DeleteSessionRequest. - * Use `create(DeleteSessionRequestSchema)` to create a new message. - */ -export const DeleteSessionRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 8); - -/** - * @generated from message aiscan.chat.DeleteSessionResponse - */ -export type DeleteSessionResponse = Message<"aiscan.chat.DeleteSessionResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.chat.DeleteSessionResponse.outcome - */ - outcome: { - /** - * @generated from field: aop.Session accepted = 2; - */ - value: Session; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.chat.DeleteSessionResponse. - * Use `create(DeleteSessionResponseSchema)` to create a new message. - */ -export const DeleteSessionResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 9); - -/** - * @generated from message aiscan.chat.CommandSpec - */ -export type CommandSpec = Message<"aiscan.chat.CommandSpec"> & { - /** - * @generated from field: string name = 1; - */ - name: string; - - /** - * @generated from field: repeated string aliases = 2; - */ - aliases: string[]; - - /** - * @generated from field: string usage = 3; - */ - usage: string; - - /** - * @generated from field: string description = 4; - */ - description: string; -}; - -/** - * Describes the message aiscan.chat.CommandSpec. - * Use `create(CommandSpecSchema)` to create a new message. - */ -export const CommandSpecSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 10); - -/** - * @generated from message aiscan.chat.ListCommandsRequest - */ -export type ListCommandsRequest = Message<"aiscan.chat.ListCommandsRequest"> & { - /** - * @generated from field: string session_id = 1; - */ - sessionId: string; -}; - -/** - * Describes the message aiscan.chat.ListCommandsRequest. - * Use `create(ListCommandsRequestSchema)` to create a new message. - */ -export const ListCommandsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 11); - -/** - * @generated from message aiscan.chat.ListCommandsResponse - */ -export type ListCommandsResponse = Message<"aiscan.chat.ListCommandsResponse"> & { - /** - * @generated from field: repeated aiscan.chat.CommandSpec commands = 1; - */ - commands: CommandSpec[]; -}; - -/** - * Describes the message aiscan.chat.ListCommandsResponse. - * Use `create(ListCommandsResponseSchema)` to create a new message. - */ -export const ListCommandsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 12); - -/** - * @generated from message aiscan.chat.ExecuteCommandRequest - */ -export type ExecuteCommandRequest = Message<"aiscan.chat.ExecuteCommandRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string session_id = 2; - */ - sessionId: string; - - /** - * @generated from field: string line = 3; - */ - line: string; -}; - -/** - * Describes the message aiscan.chat.ExecuteCommandRequest. - * Use `create(ExecuteCommandRequestSchema)` to create a new message. - */ -export const ExecuteCommandRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 13); - -/** - * @generated from message aiscan.chat.CommandReceipt - */ -export type CommandReceipt = Message<"aiscan.chat.CommandReceipt"> & { - /** - * @generated from field: string operation_id = 1; - */ - operationId: string; - - /** - * @generated from field: string session_id = 2; - */ - sessionId: string; - - /** - * @generated from field: string state = 3; - */ - state: string; -}; - -/** - * Describes the message aiscan.chat.CommandReceipt. - * Use `create(CommandReceiptSchema)` to create a new message. - */ -export const CommandReceiptSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 14); - -/** - * @generated from message aiscan.chat.ExecuteCommandResponse - */ -export type ExecuteCommandResponse = Message<"aiscan.chat.ExecuteCommandResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.chat.ExecuteCommandResponse.outcome - */ - outcome: { - /** - * @generated from field: aiscan.chat.CommandReceipt accepted = 2; - */ - value: CommandReceipt; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.chat.ExecuteCommandResponse. - * Use `create(ExecuteCommandResponseSchema)` to create a new message. - */ -export const ExecuteCommandResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 15); - -/** - * @generated from message aiscan.chat.UploadSessionFileRequest - */ -export type UploadSessionFileRequest = Message<"aiscan.chat.UploadSessionFileRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string session_id = 2; - */ - sessionId: string; - - /** - * @generated from field: string filename = 3; - */ - filename: string; - - /** - * @generated from field: string media_type = 4; - */ - mediaType: string; - - /** - * @generated from field: bytes data = 5; - */ - data: Uint8Array; -}; - -/** - * Describes the message aiscan.chat.UploadSessionFileRequest. - * Use `create(UploadSessionFileRequestSchema)` to create a new message. - */ -export const UploadSessionFileRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 16); - -/** - * @generated from message aiscan.chat.UploadedFile - */ -export type UploadedFile = Message<"aiscan.chat.UploadedFile"> & { - /** - * @generated from field: string filename = 1; - */ - filename: string; - - /** - * @generated from field: string path = 2; - */ - path: string; - - /** - * @generated from field: int64 size = 3; - */ - size: bigint; - - /** - * @generated from field: string media_type = 4; - */ - mediaType: string; -}; - -/** - * Describes the message aiscan.chat.UploadedFile. - * Use `create(UploadedFileSchema)` to create a new message. - */ -export const UploadedFileSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 17); - -/** - * @generated from message aiscan.chat.UploadSessionFileResponse - */ -export type UploadSessionFileResponse = Message<"aiscan.chat.UploadSessionFileResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.chat.UploadSessionFileResponse.outcome - */ - outcome: { - /** - * @generated from field: aiscan.chat.UploadedFile accepted = 2; - */ - value: UploadedFile; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.chat.UploadSessionFileResponse. - * Use `create(UploadSessionFileResponseSchema)` to create a new message. - */ -export const UploadSessionFileResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_chat_session, 18); - -/** - * @generated from service aiscan.chat.SessionService - */ -export const SessionService: GenService<{ - /** - * @generated from rpc aiscan.chat.SessionService.ListSessions - */ - listSessions: { - methodKind: "unary"; - input: typeof ListSessionsRequestSchema; - output: typeof ListSessionsResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.GetSession - */ - getSession: { - methodKind: "unary"; - input: typeof GetSessionRequestSchema; - output: typeof GetSessionResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.ResetSession - */ - resetSession: { - methodKind: "unary"; - input: typeof ResetSessionRequestSchema; - output: typeof ResetSessionResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.DeleteSession - */ - deleteSession: { - methodKind: "unary"; - input: typeof DeleteSessionRequestSchema; - output: typeof DeleteSessionResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.ListCommands - */ - listCommands: { - methodKind: "unary"; - input: typeof ListCommandsRequestSchema; - output: typeof ListCommandsResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.ExecuteCommand - */ - executeCommand: { - methodKind: "unary"; - input: typeof ExecuteCommandRequestSchema; - output: typeof ExecuteCommandResponseSchema; - }, - /** - * @generated from rpc aiscan.chat.SessionService.UploadSessionFile - */ - uploadSessionFile: { - methodKind: "unary"; - input: typeof UploadSessionFileRequestSchema; - output: typeof UploadSessionFileResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_aiscan_chat_session, 0); - diff --git a/packages/aop/src/gen/aiscan/scan/scan_pb.ts b/packages/aop/src/gen/aiscan/scan/scan_pb.ts deleted file mode 100644 index ccb125e..0000000 --- a/packages/aop/src/gen/aiscan/scan/scan_pb.ts +++ /dev/null @@ -1,640 +0,0 @@ -// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" -// @generated from file aiscan/scan/scan.proto (package aiscan.scan, syntax proto3) -/* eslint-disable */ - -import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Rejection } from "../../aop/chat_pb.js"; -import { file_aop_chat } from "../../aop/chat_pb.js"; -import type { EncodedValue } from "../../aop/value_pb.js"; -import { file_aop_value } from "../../aop/value_pb.js"; -import type { Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file aiscan/scan/scan.proto. - */ -export const file_aiscan_scan_scan: GenFile = /*@__PURE__*/ - fileDesc("ChZhaXNjYW4vc2Nhbi9zY2FuLnByb3RvEgthaXNjYW4uc2NhbiI7CgtTY2FuT3B0aW9ucxIOCgZ2ZXJpZnkYASABKAgSDgoGc25pcGVyGAIgASgIEgwKBGRlZXAYAyABKAgiuAIKBFNjYW4SCgoCaWQYASABKAkSDgoGdGFyZ2V0GAIgASgJEgwKBG1vZGUYAyABKAkSKQoHb3B0aW9ucxgEIAEoCzIYLmFpc2Nhbi5zY2FuLlNjYW5PcHRpb25zEicKBnN0YXR1cxgFIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXMSEAoIcHJvZ3Jlc3MYBiABKAkSDgoGcmVwb3J0GAcgASgJEiEKBnJlc3VsdBgIIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUSDQoFZXJyb3IYCSABKAkSLgoKY3JlYXRlZF9hdBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAicAoRU3VibWl0U2NhblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRIOCgZ0YXJnZXQYAiABKAkSDAoEbW9kZRgDIAEoCRIpCgdvcHRpb25zGAQgASgLMhguYWlzY2FuLnNjYW4uU2Nhbk9wdGlvbnMifgoSU3VibWl0U2NhblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJQoIYWNjZXB0ZWQYAiABKAsyES5haXNjYW4uc2Nhbi5TY2FuSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSIhCg5HZXRTY2FuUmVxdWVzdBIPCgdzY2FuX2lkGAEgASgJIjIKD0dldFNjYW5SZXNwb25zZRIfCgRzY2FuGAEgASgLMhEuYWlzY2FuLnNjYW4uU2NhbiISChBMaXN0U2NhbnNSZXF1ZXN0IjUKEUxpc3RTY2Fuc1Jlc3BvbnNlEiAKBXNjYW5zGAEgAygLMhEuYWlzY2FuLnNjYW4uU2NhbiI4ChFDYW5jZWxTY2FuUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEg8KB3NjYW5faWQYAiABKAkifgoSQ2FuY2VsU2NhblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJQoIYWNjZXB0ZWQYAiABKAsyES5haXNjYW4uc2Nhbi5TY2FuSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSIpChZXYXRjaFNjYW5FdmVudHNSZXF1ZXN0Eg8KB3NjYW5faWQYASABKAkiHAoMU2NhblByb2dyZXNzEgwKBGRhdGEYASABKAkibgoJU2NhblN0YXRzEjIKBnZhbHVlcxgBIAMoCzIiLmFpc2Nhbi5zY2FuLlNjYW5TdGF0cy5WYWx1ZXNFbnRyeRotCgtWYWx1ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAQ6AjgBIjIKDVNjYW5Db21wbGV0ZWQSIQoGcmVzdWx0GAEgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSIvCgpTY2FuRmFpbGVkEg8KB21lc3NhZ2UYASABKAkSEAoIY2FuY2VsZWQYAiABKAgiTAoQU2Vzc2lvblNjYW5FdmVudBIPCgdzY2FuX2lkGAEgASgJEicKBnN0YXR1cxgCIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXMi7wIKCVNjYW5FdmVudBIPCgdzY2FuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEi4KCmVtaXR0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiUKCHNuYXBzaG90GAogASgLMhEuYWlzY2FuLnNjYW4uU2NhbkgAEikKBnN0YXR1cxgLIAEoDjIXLmFpc2Nhbi5zY2FuLlNjYW5TdGF0dXNIABItCghwcm9ncmVzcxgMIAEoCzIZLmFpc2Nhbi5zY2FuLlNjYW5Qcm9ncmVzc0gAEicKBXN0YXRzGA0gASgLMhYuYWlzY2FuLnNjYW4uU2NhblN0YXRzSAASLwoJY29tcGxldGVkGA4gASgLMhouYWlzY2FuLnNjYW4uU2NhbkNvbXBsZXRlZEgAEikKBmZhaWxlZBgPIAEoCzIXLmFpc2Nhbi5zY2FuLlNjYW5GYWlsZWRIAEIJCgdwYXlsb2FkIkAKF1dhdGNoU2NhbkV2ZW50c1Jlc3BvbnNlEiUKBWV2ZW50GAEgASgLMhYuYWlzY2FuLnNjYW4uU2NhbkV2ZW50IjkKFEdldFNjYW5SZXBvcnRSZXF1ZXN0Eg8KB3NjYW5faWQYASABKAkSEAoIbGFuZ3VhZ2UYAiABKAkiPQoVR2V0U2NhblJlcG9ydFJlc3BvbnNlEhAKCG1hcmtkb3duGAEgASgJEhIKCm1lZGlhX3R5cGUYAiABKAkqpwEKClNjYW5TdGF0dXMSGwoXU0NBTl9TVEFUVVNfVU5TUEVDSUZJRUQQABIWChJTQ0FOX1NUQVRVU19RVUVVRUQQARIXChNTQ0FOX1NUQVRVU19SVU5OSU5HEAISGQoVU0NBTl9TVEFUVVNfQ09NUExFVEVEEAMSFgoSU0NBTl9TVEFUVVNfRkFJTEVEEAQSGAoUU0NBTl9TVEFUVVNfQ0FOQ0VMRUQQBTL1AwoLU2NhblNlcnZpY2USTQoKU3VibWl0U2NhbhIeLmFpc2Nhbi5zY2FuLlN1Ym1pdFNjYW5SZXF1ZXN0Gh8uYWlzY2FuLnNjYW4uU3VibWl0U2NhblJlc3BvbnNlEkQKB0dldFNjYW4SGy5haXNjYW4uc2Nhbi5HZXRTY2FuUmVxdWVzdBocLmFpc2Nhbi5zY2FuLkdldFNjYW5SZXNwb25zZRJKCglMaXN0U2NhbnMSHS5haXNjYW4uc2Nhbi5MaXN0U2NhbnNSZXF1ZXN0Gh4uYWlzY2FuLnNjYW4uTGlzdFNjYW5zUmVzcG9uc2USTQoKQ2FuY2VsU2NhbhIeLmFpc2Nhbi5zY2FuLkNhbmNlbFNjYW5SZXF1ZXN0Gh8uYWlzY2FuLnNjYW4uQ2FuY2VsU2NhblJlc3BvbnNlEl4KD1dhdGNoU2NhbkV2ZW50cxIjLmFpc2Nhbi5zY2FuLldhdGNoU2NhbkV2ZW50c1JlcXVlc3QaJC5haXNjYW4uc2Nhbi5XYXRjaFNjYW5FdmVudHNSZXNwb25zZTABElYKDUdldFNjYW5SZXBvcnQSIS5haXNjYW4uc2Nhbi5HZXRTY2FuUmVwb3J0UmVxdWVzdBoiLmFpc2Nhbi5zY2FuLkdldFNjYW5SZXBvcnRSZXNwb25zZUI2WjRnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vc2NhbjtzY2FuYgZwcm90bzM", [file_aop_chat, file_aop_value, file_google_protobuf_timestamp]); - -/** - * @generated from message aiscan.scan.ScanOptions - */ -export type ScanOptions = Message<"aiscan.scan.ScanOptions"> & { - /** - * @generated from field: bool verify = 1; - */ - verify: boolean; - - /** - * @generated from field: bool sniper = 2; - */ - sniper: boolean; - - /** - * @generated from field: bool deep = 3; - */ - deep: boolean; -}; - -/** - * Describes the message aiscan.scan.ScanOptions. - * Use `create(ScanOptionsSchema)` to create a new message. - */ -export const ScanOptionsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 0); - -/** - * @generated from message aiscan.scan.Scan - */ -export type Scan = Message<"aiscan.scan.Scan"> & { - /** - * @generated from field: string id = 1; - */ - id: string; - - /** - * @generated from field: string target = 2; - */ - target: string; - - /** - * @generated from field: string mode = 3; - */ - mode: string; - - /** - * @generated from field: aiscan.scan.ScanOptions options = 4; - */ - options?: ScanOptions | undefined; - - /** - * @generated from field: aiscan.scan.ScanStatus status = 5; - */ - status: ScanStatus; - - /** - * @generated from field: string progress = 6; - */ - progress: string; - - /** - * @generated from field: string report = 7; - */ - report: string; - - /** - * @generated from field: aop.EncodedValue result = 8; - */ - result?: EncodedValue | undefined; - - /** - * @generated from field: string error = 9; - */ - error: string; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 10; - */ - createdAt?: Timestamp | undefined; - - /** - * @generated from field: google.protobuf.Timestamp updated_at = 11; - */ - updatedAt?: Timestamp | undefined; -}; - -/** - * Describes the message aiscan.scan.Scan. - * Use `create(ScanSchema)` to create a new message. - */ -export const ScanSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 1); - -/** - * @generated from message aiscan.scan.SubmitScanRequest - */ -export type SubmitScanRequest = Message<"aiscan.scan.SubmitScanRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string target = 2; - */ - target: string; - - /** - * @generated from field: string mode = 3; - */ - mode: string; - - /** - * @generated from field: aiscan.scan.ScanOptions options = 4; - */ - options?: ScanOptions | undefined; -}; - -/** - * Describes the message aiscan.scan.SubmitScanRequest. - * Use `create(SubmitScanRequestSchema)` to create a new message. - */ -export const SubmitScanRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 2); - -/** - * @generated from message aiscan.scan.SubmitScanResponse - */ -export type SubmitScanResponse = Message<"aiscan.scan.SubmitScanResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.scan.SubmitScanResponse.outcome - */ - outcome: { - /** - * @generated from field: aiscan.scan.Scan accepted = 2; - */ - value: Scan; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.scan.SubmitScanResponse. - * Use `create(SubmitScanResponseSchema)` to create a new message. - */ -export const SubmitScanResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 3); - -/** - * @generated from message aiscan.scan.GetScanRequest - */ -export type GetScanRequest = Message<"aiscan.scan.GetScanRequest"> & { - /** - * @generated from field: string scan_id = 1; - */ - scanId: string; -}; - -/** - * Describes the message aiscan.scan.GetScanRequest. - * Use `create(GetScanRequestSchema)` to create a new message. - */ -export const GetScanRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 4); - -/** - * @generated from message aiscan.scan.GetScanResponse - */ -export type GetScanResponse = Message<"aiscan.scan.GetScanResponse"> & { - /** - * @generated from field: aiscan.scan.Scan scan = 1; - */ - scan?: Scan | undefined; -}; - -/** - * Describes the message aiscan.scan.GetScanResponse. - * Use `create(GetScanResponseSchema)` to create a new message. - */ -export const GetScanResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 5); - -/** - * @generated from message aiscan.scan.ListScansRequest - */ -export type ListScansRequest = Message<"aiscan.scan.ListScansRequest"> & { -}; - -/** - * Describes the message aiscan.scan.ListScansRequest. - * Use `create(ListScansRequestSchema)` to create a new message. - */ -export const ListScansRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 6); - -/** - * @generated from message aiscan.scan.ListScansResponse - */ -export type ListScansResponse = Message<"aiscan.scan.ListScansResponse"> & { - /** - * @generated from field: repeated aiscan.scan.Scan scans = 1; - */ - scans: Scan[]; -}; - -/** - * Describes the message aiscan.scan.ListScansResponse. - * Use `create(ListScansResponseSchema)` to create a new message. - */ -export const ListScansResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 7); - -/** - * @generated from message aiscan.scan.CancelScanRequest - */ -export type CancelScanRequest = Message<"aiscan.scan.CancelScanRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from field: string scan_id = 2; - */ - scanId: string; -}; - -/** - * Describes the message aiscan.scan.CancelScanRequest. - * Use `create(CancelScanRequestSchema)` to create a new message. - */ -export const CancelScanRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 8); - -/** - * @generated from message aiscan.scan.CancelScanResponse - */ -export type CancelScanResponse = Message<"aiscan.scan.CancelScanResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - - /** - * @generated from oneof aiscan.scan.CancelScanResponse.outcome - */ - outcome: { - /** - * @generated from field: aiscan.scan.Scan accepted = 2; - */ - value: Scan; - case: "accepted"; - } | { - /** - * @generated from field: aop.Rejection rejected = 3; - */ - value: Rejection; - case: "rejected"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.scan.CancelScanResponse. - * Use `create(CancelScanResponseSchema)` to create a new message. - */ -export const CancelScanResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 9); - -/** - * @generated from message aiscan.scan.WatchScanEventsRequest - */ -export type WatchScanEventsRequest = Message<"aiscan.scan.WatchScanEventsRequest"> & { - /** - * @generated from field: string scan_id = 1; - */ - scanId: string; -}; - -/** - * Describes the message aiscan.scan.WatchScanEventsRequest. - * Use `create(WatchScanEventsRequestSchema)` to create a new message. - */ -export const WatchScanEventsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 10); - -/** - * @generated from message aiscan.scan.ScanProgress - */ -export type ScanProgress = Message<"aiscan.scan.ScanProgress"> & { - /** - * @generated from field: string data = 1; - */ - data: string; -}; - -/** - * Describes the message aiscan.scan.ScanProgress. - * Use `create(ScanProgressSchema)` to create a new message. - */ -export const ScanProgressSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 11); - -/** - * @generated from message aiscan.scan.ScanStats - */ -export type ScanStats = Message<"aiscan.scan.ScanStats"> & { - /** - * @generated from field: map values = 1; - */ - values: { [key: string]: bigint }; -}; - -/** - * Describes the message aiscan.scan.ScanStats. - * Use `create(ScanStatsSchema)` to create a new message. - */ -export const ScanStatsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 12); - -/** - * @generated from message aiscan.scan.ScanCompleted - */ -export type ScanCompleted = Message<"aiscan.scan.ScanCompleted"> & { - /** - * @generated from field: aop.EncodedValue result = 1; - */ - result?: EncodedValue | undefined; -}; - -/** - * Describes the message aiscan.scan.ScanCompleted. - * Use `create(ScanCompletedSchema)` to create a new message. - */ -export const ScanCompletedSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 13); - -/** - * @generated from message aiscan.scan.ScanFailed - */ -export type ScanFailed = Message<"aiscan.scan.ScanFailed"> & { - /** - * @generated from field: string message = 1; - */ - message: string; - - /** - * @generated from field: bool canceled = 2; - */ - canceled: boolean; -}; - -/** - * Describes the message aiscan.scan.ScanFailed. - * Use `create(ScanFailedSchema)` to create a new message. - */ -export const ScanFailedSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 14); - -/** - * SessionScanEvent links a completed scan into an AOP session timeline without - * reintroducing a parallel web-only domain event envelope. - * - * @generated from message aiscan.scan.SessionScanEvent - */ -export type SessionScanEvent = Message<"aiscan.scan.SessionScanEvent"> & { - /** - * @generated from field: string scan_id = 1; - */ - scanId: string; - - /** - * @generated from field: aiscan.scan.ScanStatus status = 2; - */ - status: ScanStatus; -}; - -/** - * Describes the message aiscan.scan.SessionScanEvent. - * Use `create(SessionScanEventSchema)` to create a new message. - */ -export const SessionScanEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 15); - -/** - * @generated from message aiscan.scan.ScanEvent - */ -export type ScanEvent = Message<"aiscan.scan.ScanEvent"> & { - /** - * @generated from field: string scan_id = 1; - */ - scanId: string; - - /** - * @generated from field: uint64 sequence = 2; - */ - sequence: bigint; - - /** - * @generated from field: google.protobuf.Timestamp emitted_at = 3; - */ - emittedAt?: Timestamp | undefined; - - /** - * @generated from oneof aiscan.scan.ScanEvent.payload - */ - payload: { - /** - * @generated from field: aiscan.scan.Scan snapshot = 10; - */ - value: Scan; - case: "snapshot"; - } | { - /** - * @generated from field: aiscan.scan.ScanStatus status = 11; - */ - value: ScanStatus; - case: "status"; - } | { - /** - * @generated from field: aiscan.scan.ScanProgress progress = 12; - */ - value: ScanProgress; - case: "progress"; - } | { - /** - * @generated from field: aiscan.scan.ScanStats stats = 13; - */ - value: ScanStats; - case: "stats"; - } | { - /** - * @generated from field: aiscan.scan.ScanCompleted completed = 14; - */ - value: ScanCompleted; - case: "completed"; - } | { - /** - * @generated from field: aiscan.scan.ScanFailed failed = 15; - */ - value: ScanFailed; - case: "failed"; - } | { case: undefined; value?: undefined }; -}; - -/** - * Describes the message aiscan.scan.ScanEvent. - * Use `create(ScanEventSchema)` to create a new message. - */ -export const ScanEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 16); - -/** - * @generated from message aiscan.scan.WatchScanEventsResponse - */ -export type WatchScanEventsResponse = Message<"aiscan.scan.WatchScanEventsResponse"> & { - /** - * @generated from field: aiscan.scan.ScanEvent event = 1; - */ - event?: ScanEvent | undefined; -}; - -/** - * Describes the message aiscan.scan.WatchScanEventsResponse. - * Use `create(WatchScanEventsResponseSchema)` to create a new message. - */ -export const WatchScanEventsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 17); - -/** - * @generated from message aiscan.scan.GetScanReportRequest - */ -export type GetScanReportRequest = Message<"aiscan.scan.GetScanReportRequest"> & { - /** - * @generated from field: string scan_id = 1; - */ - scanId: string; - - /** - * @generated from field: string language = 2; - */ - language: string; -}; - -/** - * Describes the message aiscan.scan.GetScanReportRequest. - * Use `create(GetScanReportRequestSchema)` to create a new message. - */ -export const GetScanReportRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 18); - -/** - * @generated from message aiscan.scan.GetScanReportResponse - */ -export type GetScanReportResponse = Message<"aiscan.scan.GetScanReportResponse"> & { - /** - * @generated from field: string markdown = 1; - */ - markdown: string; - - /** - * @generated from field: string media_type = 2; - */ - mediaType: string; -}; - -/** - * Describes the message aiscan.scan.GetScanReportResponse. - * Use `create(GetScanReportResponseSchema)` to create a new message. - */ -export const GetScanReportResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_scan_scan, 19); - -/** - * @generated from enum aiscan.scan.ScanStatus - */ -export enum ScanStatus { - /** - * @generated from enum value: SCAN_STATUS_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: SCAN_STATUS_QUEUED = 1; - */ - QUEUED = 1, - - /** - * @generated from enum value: SCAN_STATUS_RUNNING = 2; - */ - RUNNING = 2, - - /** - * @generated from enum value: SCAN_STATUS_COMPLETED = 3; - */ - COMPLETED = 3, - - /** - * @generated from enum value: SCAN_STATUS_FAILED = 4; - */ - FAILED = 4, - - /** - * @generated from enum value: SCAN_STATUS_CANCELED = 5; - */ - CANCELED = 5, -} - -/** - * Describes the enum aiscan.scan.ScanStatus. - */ -export const ScanStatusSchema: GenEnum = /*@__PURE__*/ - enumDesc(file_aiscan_scan_scan, 0); - -/** - * @generated from service aiscan.scan.ScanService - */ -export const ScanService: GenService<{ - /** - * @generated from rpc aiscan.scan.ScanService.SubmitScan - */ - submitScan: { - methodKind: "unary"; - input: typeof SubmitScanRequestSchema; - output: typeof SubmitScanResponseSchema; - }, - /** - * @generated from rpc aiscan.scan.ScanService.GetScan - */ - getScan: { - methodKind: "unary"; - input: typeof GetScanRequestSchema; - output: typeof GetScanResponseSchema; - }, - /** - * @generated from rpc aiscan.scan.ScanService.ListScans - */ - listScans: { - methodKind: "unary"; - input: typeof ListScansRequestSchema; - output: typeof ListScansResponseSchema; - }, - /** - * @generated from rpc aiscan.scan.ScanService.CancelScan - */ - cancelScan: { - methodKind: "unary"; - input: typeof CancelScanRequestSchema; - output: typeof CancelScanResponseSchema; - }, - /** - * @generated from rpc aiscan.scan.ScanService.WatchScanEvents - */ - watchScanEvents: { - methodKind: "server_streaming"; - input: typeof WatchScanEventsRequestSchema; - output: typeof WatchScanEventsResponseSchema; - }, - /** - * @generated from rpc aiscan.scan.ScanService.GetScanReport - */ - getScanReport: { - methodKind: "unary"; - input: typeof GetScanReportRequestSchema; - output: typeof GetScanReportResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_aiscan_scan_scan, 0); - diff --git a/packages/aop/src/gen/aiscan/transport/terminal_pb.ts b/packages/aop/src/gen/aiscan/transport/terminal_pb.ts deleted file mode 100644 index f15eadb..0000000 --- a/packages/aop/src/gen/aiscan/transport/terminal_pb.ts +++ /dev/null @@ -1,195 +0,0 @@ -// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" -// @generated from file aiscan/transport/terminal.proto (package aiscan.transport, syntax proto3) -/* eslint-disable */ - -import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; -import type { Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; -import type { Message } from "@bufbuild/protobuf"; - -/** - * Describes the file aiscan/transport/terminal.proto. - */ -export const file_aiscan_transport_terminal: GenFile = /*@__PURE__*/ - fileDesc("Ch9haXNjYW4vdHJhbnNwb3J0L3Rlcm1pbmFsLnByb3RvEhBhaXNjYW4udHJhbnNwb3J0IsoCCgxUZXJtaW5hbEluZm8SCgoCaWQYASABKAkSDAoEa2luZBgCIAEoCRIMCgRuYW1lGAMgASgJEg8KB2NvbW1hbmQYBCABKAkSCwoDcGlkGAUgASgFEi4KCnN0YXJ0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKEGxhc3RfYWN0aXZpdHlfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIUCgxhY3Rpdml0eV9zZXEYCSABKAMSFAoMb3V0cHV0X2J5dGVzGAogASgDEhEKCWV4aXRfY29kZRgLIAEoBRINCgVzdGF0ZRgMIAEoCRISCgpraWxsX2NhdXNlGA0gASgJIu8CCg1UZXJtaW5hbEZyYW1lEgwKBHR5cGUYASABKAkSEQoJc3RyZWFtX2lkGAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkSDAoEa2luZBgEIAEoCRIMCgRuYW1lGAUgASgJEg8KB2NvbW1hbmQYBiABKAkSDAoEYXJncxgHIAMoCRIMCgRkYXRhGAggASgMEgwKBGNvbHMYCSABKAUSDAoEcm93cxgKIAEoBRINCgVieXRlcxgLIAEoBRIOCgZvZmZzZXQYDCABKAMSEQoJc2luZ2xldG9uGA0gASgIEg0KBWVycm9yGA4gASgJEg0KBXN0YXRlGA8gASgJEhEKCWV4aXRfY29kZRgQIAEoBRIvCgdzZXNzaW9uGBEgASgLMh4uYWlzY2FuLnRyYW5zcG9ydC5UZXJtaW5hbEluZm8SMAoIc2Vzc2lvbnMYEiADKAsyHi5haXNjYW4udHJhbnNwb3J0LlRlcm1pbmFsSW5mb0JAWj5naXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9haXNjYW4vdHJhbnNwb3J0O3RyYW5zcG9ydGIGcHJvdG8z", [file_google_protobuf_timestamp]); - -/** - * @generated from message aiscan.transport.TerminalInfo - */ -export type TerminalInfo = Message<"aiscan.transport.TerminalInfo"> & { - /** - * @generated from field: string id = 1; - */ - id: string; - - /** - * @generated from field: string kind = 2; - */ - kind: string; - - /** - * @generated from field: string name = 3; - */ - name: string; - - /** - * @generated from field: string command = 4; - */ - command: string; - - /** - * @generated from field: int32 pid = 5; - */ - pid: number; - - /** - * @generated from field: google.protobuf.Timestamp started_at = 6; - */ - startedAt?: Timestamp | undefined; - - /** - * @generated from field: google.protobuf.Timestamp last_activity_at = 7; - */ - lastActivityAt?: Timestamp | undefined; - - /** - * @generated from field: google.protobuf.Timestamp ended_at = 8; - */ - endedAt?: Timestamp | undefined; - - /** - * @generated from field: int64 activity_seq = 9; - */ - activitySeq: bigint; - - /** - * @generated from field: int64 output_bytes = 10; - */ - outputBytes: bigint; - - /** - * @generated from field: int32 exit_code = 11; - */ - exitCode: number; - - /** - * @generated from field: string state = 12; - */ - state: string; - - /** - * @generated from field: string kill_cause = 13; - */ - killCause: string; -}; - -/** - * Describes the message aiscan.transport.TerminalInfo. - * Use `create(TerminalInfoSchema)` to create a new message. - */ -export const TerminalInfoSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_transport_terminal, 0); - -/** - * @generated from message aiscan.transport.TerminalFrame - */ -export type TerminalFrame = Message<"aiscan.transport.TerminalFrame"> & { - /** - * @generated from field: string type = 1; - */ - type: string; - - /** - * @generated from field: string stream_id = 2; - */ - streamId: string; - - /** - * @generated from field: string session_id = 3; - */ - sessionId: string; - - /** - * @generated from field: string kind = 4; - */ - kind: string; - - /** - * @generated from field: string name = 5; - */ - name: string; - - /** - * @generated from field: string command = 6; - */ - command: string; - - /** - * @generated from field: repeated string args = 7; - */ - args: string[]; - - /** - * @generated from field: bytes data = 8; - */ - data: Uint8Array; - - /** - * @generated from field: int32 cols = 9; - */ - cols: number; - - /** - * @generated from field: int32 rows = 10; - */ - rows: number; - - /** - * @generated from field: int32 bytes = 11; - */ - bytes: number; - - /** - * @generated from field: int64 offset = 12; - */ - offset: bigint; - - /** - * @generated from field: bool singleton = 13; - */ - singleton: boolean; - - /** - * @generated from field: string error = 14; - */ - error: string; - - /** - * @generated from field: string state = 15; - */ - state: string; - - /** - * @generated from field: int32 exit_code = 16; - */ - exitCode: number; - - /** - * @generated from field: aiscan.transport.TerminalInfo session = 17; - */ - session?: TerminalInfo | undefined; - - /** - * @generated from field: repeated aiscan.transport.TerminalInfo sessions = 18; - */ - sessions: TerminalInfo[]; -}; - -/** - * Describes the message aiscan.transport.TerminalFrame. - * Use `create(TerminalFrameSchema)` to create a new message. - */ -export const TerminalFrameSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aiscan_transport_terminal, 1); - diff --git a/packages/aop/src/gen/aop/chat_pb.ts b/packages/aop/src/gen/aop/chat_pb.ts index 918c127..a58a22d 100644 --- a/packages/aop/src/gen/aop/chat_pb.ts +++ b/packages/aop/src/gen/aop/chat_pb.ts @@ -2,21 +2,21 @@ // @generated from file aop/chat.proto (package aop, syntax proto3) /* eslint-disable */ -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; import type { Message as Message$1 } from "./content_pb.js"; import { file_aop_content } from "./content_pb.js"; import type { Event } from "./event_pb.js"; import { file_aop_event } from "./event_pb.js"; -import type { EncodedValue, Extension } from "./value_pb.js"; -import { file_aop_value } from "./value_pb.js"; +import type { Any } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_any } from "@bufbuild/protobuf/wkt"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file aop/chat.proto. */ export const file_aop_chat: GenFile = /*@__PURE__*/ - fileDesc("Cg5hb3AvY2hhdC5wcm90bxIDYW9wImAKCVJlamVjdGlvbhIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiSAoHU2Vzc2lvbhIKCgJpZBgBIAEoCRINCgVzdGF0ZRgCIAEoCRITCgtwYXJ0aWNpcGFudBgDIAEoCRINCgV0aXRsZRgEIAEoCSK8AQoST3BlblNlc3Npb25SZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRITCgtwYXJ0aWNpcGFudBgDIAEoCRINCgV0aXRsZRgEIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgFIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAYgASgJEiIKCmV4dGVuc2lvbnMYByADKAsyDi5hb3AuRXh0ZW5zaW9uInoKE09wZW5TZXNzaW9uUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIgCghhY2NlcHRlZBgCIAEoCzIMLmFvcC5TZXNzaW9uSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZSK3AQoOUnVuVHVyblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEg8KB3R1cm5faWQYAyABKAkSGwoFaW5wdXQYBCABKAsyDC5hb3AuTWVzc2FnZRIYChBjb250aW51ZV9zZXNzaW9uGAUgASgIEhEKCW1heF90dXJucxgGIAEoDRIiCgpleHRlbnNpb25zGAcgAygLMg4uYW9wLkV4dGVuc2lvbiJBCgtUdXJuUmVjZWlwdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSDQoFc3RhdGUYAyABKAkiegoPUnVuVHVyblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSJAoIYWNjZXB0ZWQYAiABKAsyEC5hb3AuVHVyblJlY2VpcHRIABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lIlwKEUNhbmNlbFR1cm5SZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEg4KBnJlYXNvbhgEIAEoCSJ9ChJDYW5jZWxUdXJuUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRIkCghhY2NlcHRlZBgCIAEoCzIQLmFvcC5UdXJuUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiTQoTQ2xvc2VTZXNzaW9uUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDgoGcmVhc29uGAMgASgJInsKFENsb3NlU2Vzc2lvblJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSIAoIYWNjZXB0ZWQYAiABKAsyDC5hb3AuU2Vzc2lvbkgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWUiPgoSV2F0Y2hFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJIjoKDUV2ZW50RGVsaXZlcnkSDgoGY3Vyc29yGAEgASgJEhkKBWV2ZW50GAIgASgLMgouYW9wLkV2ZW50IjsKE1dhdGNoRXZlbnRzUmVzcG9uc2USJAoIZGVsaXZlcnkYASABKAsyEi5hb3AuRXZlbnREZWxpdmVyeSJMChFMaXN0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEhQKDGFmdGVyX2N1cnNvchgCIAEoCRINCgVsaW1pdBgDIAEoDSJNChJMaXN0RXZlbnRzUmVzcG9uc2USIgoGZXZlbnRzGAEgAygLMhIuYW9wLkV2ZW50RGVsaXZlcnkSEwoLbmV4dF9jdXJzb3IYAiABKAkyjAMKC0NoYXRTZXJ2aWNlEkAKC09wZW5TZXNzaW9uEhcuYW9wLk9wZW5TZXNzaW9uUmVxdWVzdBoYLmFvcC5PcGVuU2Vzc2lvblJlc3BvbnNlEjQKB1J1blR1cm4SEy5hb3AuUnVuVHVyblJlcXVlc3QaFC5hb3AuUnVuVHVyblJlc3BvbnNlEj0KCkNhbmNlbFR1cm4SFi5hb3AuQ2FuY2VsVHVyblJlcXVlc3QaFy5hb3AuQ2FuY2VsVHVyblJlc3BvbnNlEkMKDENsb3NlU2Vzc2lvbhIYLmFvcC5DbG9zZVNlc3Npb25SZXF1ZXN0GhkuYW9wLkNsb3NlU2Vzc2lvblJlc3BvbnNlEkIKC1dhdGNoRXZlbnRzEhcuYW9wLldhdGNoRXZlbnRzUmVxdWVzdBoYLmFvcC5XYXRjaEV2ZW50c1Jlc3BvbnNlMAESPQoKTGlzdEV2ZW50cxIWLmFvcC5MaXN0RXZlbnRzUmVxdWVzdBoXLmFvcC5MaXN0RXZlbnRzUmVzcG9uc2ViBnByb3RvMw", [file_aop_content, file_aop_event, file_aop_value]); + fileDesc("Cg5hb3AvY2hhdC5wcm90bxIDYW9wIkMKCVJlamVjdGlvbhIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgISgQIBBAFIkUKB1Nlc3Npb24SCgoCaWQYASABKAkSDQoFc3RhdGUYAiABKAkSEAoIbm9kZV91cmkYAyABKAkSDQoFdGl0bGUYBCABKAkitwEKEk9wZW5TZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAIgASgJEhAKCG5vZGVfdXJpGAMgASgJEg0KBXRpdGxlGAQgASgJEhkKEXBhcmVudF9zZXNzaW9uX2lkGAUgASgJEhsKE3BhcmVudF90b29sX2NhbGxfaWQYBiABKAkSKAoKZXh0ZW5zaW9ucxgIIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlKBAgBEAJKBAgHEAgibAoTT3BlblNlc3Npb25SZXNwb25zZRIgCghhY2NlcHRlZBgCIAEoCzIMLmFvcC5TZXNzaW9uSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZUoECAEQAiK1AQoOUnVuVHVyblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEhsKBWlucHV0GAQgASgLMgwuYW9wLk1lc3NhZ2USGAoQY29udGludWVfc2Vzc2lvbhgFIAEoCBIRCgltYXhfdHVybnMYBiABKA0SKAoKZXh0ZW5zaW9ucxgIIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlKBAgBEAJKBAgHEAgiQQoLVHVyblJlY2VpcHQSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEg0KBXN0YXRlGAMgASgJImwKD1J1blR1cm5SZXNwb25zZRIkCghhY2NlcHRlZBgCIAEoCzIQLmFvcC5UdXJuUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWVKBAgBEAIiTgoRQ2FuY2VsVHVyblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEg4KBnJlYXNvbhgEIAEoCUoECAEQAiJvChJDYW5jZWxUdXJuUmVzcG9uc2USJAoIYWNjZXB0ZWQYAiABKAsyEC5hb3AuVHVyblJlY2VpcHRIABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lSgQIARACIj8KE0Nsb3NlU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIOCgZyZWFzb24YAyABKAlKBAgBEAIibQoUQ2xvc2VTZXNzaW9uUmVzcG9uc2USIAoIYWNjZXB0ZWQYAiABKAsyDC5hb3AuU2Vzc2lvbkgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWVKBAgBEAIiPgoSV2F0Y2hFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJIjoKDUV2ZW50RGVsaXZlcnkSDgoGY3Vyc29yGAEgASgJEhkKBWV2ZW50GAIgASgLMgouYW9wLkV2ZW50IkwKEUxpc3RFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJEg0KBWxpbWl0GAMgASgNIk0KEkxpc3RFdmVudHNSZXNwb25zZRIiCgZldmVudHMYASADKAsyEi5hb3AuRXZlbnREZWxpdmVyeRITCgtuZXh0X2N1cnNvchgCIAEoCUIlWiNnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcGIGcHJvdG8z", [file_aop_content, file_aop_event, file_google_protobuf_any]); /** * @generated from message aop.Rejection @@ -36,11 +36,6 @@ export type Rejection = Message<"aop.Rejection"> & { * @generated from field: bool retryable = 3; */ retryable: boolean; - - /** - * @generated from field: aop.EncodedValue detail = 4; - */ - detail?: EncodedValue | undefined; }; /** @@ -65,9 +60,9 @@ export type Session = Message<"aop.Session"> & { state: string; /** - * @generated from field: string participant = 3; + * @generated from field: string node_uri = 3; */ - participant: string; + nodeUri: string; /** * @generated from field: string title = 4; @@ -86,20 +81,15 @@ export const SessionSchema: GenMessage = /*@__PURE__*/ * @generated from message aop.OpenSessionRequest */ export type OpenSessionRequest = Message<"aop.OpenSessionRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from field: string session_id = 2; */ sessionId: string; /** - * @generated from field: string participant = 3; + * @generated from field: string node_uri = 3; */ - participant: string; + nodeUri: string; /** * @generated from field: string title = 4; @@ -117,9 +107,9 @@ export type OpenSessionRequest = Message<"aop.OpenSessionRequest"> & { parentToolCallId: string; /** - * @generated from field: repeated aop.Extension extensions = 7; + * @generated from field: repeated google.protobuf.Any extensions = 8; */ - extensions: Extension[]; + extensions: Any[]; }; /** @@ -133,11 +123,6 @@ export const OpenSessionRequestSchema: GenMessage = /*@__PUR * @generated from message aop.OpenSessionResponse */ export type OpenSessionResponse = Message<"aop.OpenSessionResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from oneof aop.OpenSessionResponse.outcome */ @@ -167,11 +152,6 @@ export const OpenSessionResponseSchema: GenMessage = /*@__P * @generated from message aop.RunTurnRequest */ export type RunTurnRequest = Message<"aop.RunTurnRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from field: string session_id = 2; */ @@ -198,9 +178,9 @@ export type RunTurnRequest = Message<"aop.RunTurnRequest"> & { maxTurns: number; /** - * @generated from field: repeated aop.Extension extensions = 7; + * @generated from field: repeated google.protobuf.Any extensions = 8; */ - extensions: Extension[]; + extensions: Any[]; }; /** @@ -241,11 +221,6 @@ export const TurnReceiptSchema: GenMessage = /*@__PURE__*/ * @generated from message aop.RunTurnResponse */ export type RunTurnResponse = Message<"aop.RunTurnResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from oneof aop.RunTurnResponse.outcome */ @@ -275,11 +250,6 @@ export const RunTurnResponseSchema: GenMessage = /*@__PURE__*/ * @generated from message aop.CancelTurnRequest */ export type CancelTurnRequest = Message<"aop.CancelTurnRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from field: string session_id = 2; */ @@ -307,11 +277,6 @@ export const CancelTurnRequestSchema: GenMessage = /*@__PURE_ * @generated from message aop.CancelTurnResponse */ export type CancelTurnResponse = Message<"aop.CancelTurnResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from oneof aop.CancelTurnResponse.outcome */ @@ -341,11 +306,6 @@ export const CancelTurnResponseSchema: GenMessage = /*@__PUR * @generated from message aop.CloseSessionRequest */ export type CloseSessionRequest = Message<"aop.CloseSessionRequest"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from field: string session_id = 2; */ @@ -368,11 +328,6 @@ export const CloseSessionRequestSchema: GenMessage = /*@__P * @generated from message aop.CloseSessionResponse */ export type CloseSessionResponse = Message<"aop.CloseSessionResponse"> & { - /** - * @generated from field: string request_id = 1; - */ - requestId: string; - /** * @generated from oneof aop.CloseSessionResponse.outcome */ @@ -442,23 +397,6 @@ export type EventDelivery = Message<"aop.EventDelivery"> & { export const EventDeliverySchema: GenMessage = /*@__PURE__*/ messageDesc(file_aop_chat, 12); -/** - * @generated from message aop.WatchEventsResponse - */ -export type WatchEventsResponse = Message<"aop.WatchEventsResponse"> & { - /** - * @generated from field: aop.EventDelivery delivery = 1; - */ - delivery?: EventDelivery | undefined; -}; - -/** - * Describes the message aop.WatchEventsResponse. - * Use `create(WatchEventsResponseSchema)` to create a new message. - */ -export const WatchEventsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_chat, 13); - /** * @generated from message aop.ListEventsRequest */ @@ -484,7 +422,7 @@ export type ListEventsRequest = Message<"aop.ListEventsRequest"> & { * Use `create(ListEventsRequestSchema)` to create a new message. */ export const ListEventsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_chat, 14); + messageDesc(file_aop_chat, 13); /** * @generated from message aop.ListEventsResponse @@ -506,60 +444,5 @@ export type ListEventsResponse = Message<"aop.ListEventsResponse"> & { * Use `create(ListEventsResponseSchema)` to create a new message. */ export const ListEventsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_chat, 15); - -/** - * @generated from service aop.ChatService - */ -export const ChatService: GenService<{ - /** - * @generated from rpc aop.ChatService.OpenSession - */ - openSession: { - methodKind: "unary"; - input: typeof OpenSessionRequestSchema; - output: typeof OpenSessionResponseSchema; - }, - /** - * @generated from rpc aop.ChatService.RunTurn - */ - runTurn: { - methodKind: "unary"; - input: typeof RunTurnRequestSchema; - output: typeof RunTurnResponseSchema; - }, - /** - * @generated from rpc aop.ChatService.CancelTurn - */ - cancelTurn: { - methodKind: "unary"; - input: typeof CancelTurnRequestSchema; - output: typeof CancelTurnResponseSchema; - }, - /** - * @generated from rpc aop.ChatService.CloseSession - */ - closeSession: { - methodKind: "unary"; - input: typeof CloseSessionRequestSchema; - output: typeof CloseSessionResponseSchema; - }, - /** - * @generated from rpc aop.ChatService.WatchEvents - */ - watchEvents: { - methodKind: "server_streaming"; - input: typeof WatchEventsRequestSchema; - output: typeof WatchEventsResponseSchema; - }, - /** - * @generated from rpc aop.ChatService.ListEvents - */ - listEvents: { - methodKind: "unary"; - input: typeof ListEventsRequestSchema; - output: typeof ListEventsResponseSchema; - }, -}> = /*@__PURE__*/ - serviceDesc(file_aop_chat, 0); + messageDesc(file_aop_chat, 14); diff --git a/packages/aop/src/gen/aop/content_pb.ts b/packages/aop/src/gen/aop/content_pb.ts index a1fabb7..d293dc9 100644 --- a/packages/aop/src/gen/aop/content_pb.ts +++ b/packages/aop/src/gen/aop/content_pb.ts @@ -12,7 +12,7 @@ import type { Message as Message$1 } from "@bufbuild/protobuf"; * Describes the file aop/content.proto. */ export const file_aop_content: GenFile = /*@__PURE__*/ - fileDesc("ChFhb3AvY29udGVudC5wcm90bxIDYW9wIlkKCFJlc291cmNlEg4KBGRhdGEYASABKAxIABINCgN1cmkYAiABKAlIABISCgptZWRpYV90eXBlGAMgASgJEhAKCGZpbGVuYW1lGAQgASgJQggKBnNvdXJjZSJ1CgpBbm5vdGF0aW9uEgwKBHR5cGUYASABKAkSDQoFc3RhcnQYAiABKAQSCwoDZW5kGAMgASgEEg0KBXRpdGxlGAQgASgJEgsKA3VyaRgFIAEoCRIhCgZkZXRhaWwYBiABKAsyES5hb3AuRW5jb2RlZFZhbHVlIkEKC1RleHRDb250ZW50EgwKBHRleHQYASABKAkSJAoLYW5ub3RhdGlvbnMYAiADKAsyDy5hb3AuQW5ub3RhdGlvbiJFChBSZWFzb25pbmdDb250ZW50EgwKBHRleHQYASABKAkSDgoGb3BhcXVlGAIgASgMEhMKC29wYXF1ZV90eXBlGAMgASgJInQKDE1lZGlhQ29udGVudBIMCgRraW5kGAEgASgJEh8KCHJlc291cmNlGAIgASgLMg0uYW9wLlJlc291cmNlEhIKCnRyYW5zY3JpcHQYAyABKAkSIQoGZGV0YWlsGAQgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSJzCghUb29sQ2FsbBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEgwKBGtpbmQYAyABKAkSJAoJYXJndW1lbnRzGAQgASgLMhEuYW9wLkVuY29kZWRWYWx1ZRIZChF3b3JraW5nX2RpcmVjdG9yeRgFIAEoCSKmAQoKVG9vbFJlc3VsdBIPCgdjYWxsX2lkGAEgASgJEhwKBm91dHB1dBgCIAMoCzIMLmFvcC5Db250ZW50EhAKCGlzX2Vycm9yGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUSDAoEbmFtZRgFIAEoCRITCgtkdXJhdGlvbl9tcxgGIAEoBBIRCgl0ZXJtaW5hdGUYByABKAgiPwoNT3BhcXVlQ29udGVudBIMCgR0eXBlGAEgASgJEiAKBXZhbHVlGAIgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSKJAgoHQ29udGVudBIgCgR0ZXh0GAEgASgLMhAuYW9wLlRleHRDb250ZW50SAASKgoJcmVhc29uaW5nGAIgASgLMhUuYW9wLlJlYXNvbmluZ0NvbnRlbnRIABIRCgdyZWZ1c2FsGAMgASgJSAASIgoFbWVkaWEYBCABKAsyES5hb3AuTWVkaWFDb250ZW50SAASIgoJdG9vbF9jYWxsGAUgASgLMg0uYW9wLlRvb2xDYWxsSAASJgoLdG9vbF9yZXN1bHQYBiABKAsyDy5hb3AuVG9vbFJlc3VsdEgAEiQKBm9wYXF1ZRgHIAEoCzISLmFvcC5PcGFxdWVDb250ZW50SABCBwoFdmFsdWUiUAoHTWVzc2FnZRIKCgJpZBgBIAEoCRIMCgRyb2xlGAIgASgJEgwKBG5hbWUYAyABKAkSHQoHY29udGVudBgEIAMoCzIMLmFvcC5Db250ZW50YgZwcm90bzM", [file_aop_value]); + fileDesc("ChFhb3AvY29udGVudC5wcm90bxIDYW9wIlkKCFJlc291cmNlEg4KBGRhdGEYASABKAxIABINCgN1cmkYAiABKAlIABISCgptZWRpYV90eXBlGAMgASgJEhAKCGZpbGVuYW1lGAQgASgJQggKBnNvdXJjZSJYCgpBbm5vdGF0aW9uEgwKBHR5cGUYASABKAkSDQoFc3RhcnQYAiABKAQSCwoDZW5kGAMgASgEEg0KBXRpdGxlGAQgASgJEgsKA3VyaRgFIAEoCUoECAYQByJBCgtUZXh0Q29udGVudBIMCgR0ZXh0GAEgASgJEiQKC2Fubm90YXRpb25zGAIgAygLMg8uYW9wLkFubm90YXRpb24iLAoQUmVhc29uaW5nQ29udGVudBIMCgR0ZXh0GAEgASgJSgQIAhADSgQIAxAEIlcKDE1lZGlhQ29udGVudBIMCgRraW5kGAEgASgJEh8KCHJlc291cmNlGAIgASgLMg0uYW9wLlJlc291cmNlEhIKCnRyYW5zY3JpcHQYAyABKAlKBAgEEAUicwoIVG9vbENhbGwSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRraW5kGAMgASgJEiQKCWFyZ3VtZW50cxgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUSGQoRd29ya2luZ19kaXJlY3RvcnkYBSABKAkiiQEKClRvb2xSZXN1bHQSDwoHY2FsbF9pZBgBIAEoCRIcCgZvdXRwdXQYAiADKAsyDC5hb3AuQ29udGVudBIQCghpc19lcnJvchgDIAEoCBIMCgRuYW1lGAUgASgJEhMKC2R1cmF0aW9uX21zGAYgASgEEhEKCXRlcm1pbmF0ZRgHIAEoCEoECAQQBSJqCg5Ub29sRGVmaW5pdGlvbhIMCgR0eXBlGAEgASgJEgwKBG5hbWUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSJwoMaW5wdXRfc2NoZW1hGAQgASgLMhEuYW9wLkVuY29kZWRWYWx1ZSLpAQoHQ29udGVudBIgCgR0ZXh0GAEgASgLMhAuYW9wLlRleHRDb250ZW50SAASKgoJcmVhc29uaW5nGAIgASgLMhUuYW9wLlJlYXNvbmluZ0NvbnRlbnRIABIRCgdyZWZ1c2FsGAMgASgJSAASIgoFbWVkaWEYBCABKAsyES5hb3AuTWVkaWFDb250ZW50SAASIgoJdG9vbF9jYWxsGAUgASgLMg0uYW9wLlRvb2xDYWxsSAASJgoLdG9vbF9yZXN1bHQYBiABKAsyDy5hb3AuVG9vbFJlc3VsdEgAQgcKBXZhbHVlSgQIBxAIIlAKB01lc3NhZ2USCgoCaWQYASABKAkSDAoEcm9sZRgCIAEoCRIMCgRuYW1lGAMgASgJEh0KB2NvbnRlbnQYBCADKAsyDC5hb3AuQ29udGVudEIlWiNnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcGIGcHJvdG8z", [file_aop_value]); /** * @generated from message aop.Resource @@ -81,11 +81,6 @@ export type Annotation = Message$1<"aop.Annotation"> & { * @generated from field: string uri = 5; */ uri: string; - - /** - * @generated from field: aop.EncodedValue detail = 6; - */ - detail?: EncodedValue | undefined; }; /** @@ -125,16 +120,6 @@ export type ReasoningContent = Message$1<"aop.ReasoningContent"> & { * @generated from field: string text = 1; */ text: string; - - /** - * @generated from field: bytes opaque = 2; - */ - opaque: Uint8Array; - - /** - * @generated from field: string opaque_type = 3; - */ - opaqueType: string; }; /** @@ -162,11 +147,6 @@ export type MediaContent = Message$1<"aop.MediaContent"> & { * @generated from field: string transcript = 3; */ transcript: string; - - /** - * @generated from field: aop.EncodedValue detail = 4; - */ - detail?: EncodedValue | undefined; }; /** @@ -232,11 +212,6 @@ export type ToolResult = Message$1<"aop.ToolResult"> & { */ isError: boolean; - /** - * @generated from field: aop.EncodedValue detail = 4; - */ - detail?: EncodedValue | undefined; - /** * @generated from field: string name = 5; */ @@ -261,25 +236,38 @@ export const ToolResultSchema: GenMessage = /*@__PURE__*/ messageDesc(file_aop_content, 6); /** - * @generated from message aop.OpaqueContent + * ToolDefinition is the provider-neutral function/tool contract advertised by + * an Agent. Provider adapters translate this schema at their wire boundary. + * + * @generated from message aop.ToolDefinition */ -export type OpaqueContent = Message$1<"aop.OpaqueContent"> & { +export type ToolDefinition = Message$1<"aop.ToolDefinition"> & { /** * @generated from field: string type = 1; */ type: string; /** - * @generated from field: aop.EncodedValue value = 2; + * @generated from field: string name = 2; + */ + name: string; + + /** + * @generated from field: string description = 3; */ - value?: EncodedValue | undefined; + description: string; + + /** + * @generated from field: aop.EncodedValue input_schema = 4; + */ + inputSchema?: EncodedValue | undefined; }; /** - * Describes the message aop.OpaqueContent. - * Use `create(OpaqueContentSchema)` to create a new message. + * Describes the message aop.ToolDefinition. + * Use `create(ToolDefinitionSchema)` to create a new message. */ -export const OpaqueContentSchema: GenMessage = /*@__PURE__*/ +export const ToolDefinitionSchema: GenMessage = /*@__PURE__*/ messageDesc(file_aop_content, 7); /** @@ -325,12 +313,6 @@ export type Content = Message$1<"aop.Content"> & { */ value: ToolResult; case: "toolResult"; - } | { - /** - * @generated from field: aop.OpaqueContent opaque = 7; - */ - value: OpaqueContent; - case: "opaque"; } | { case: undefined; value?: undefined }; }; diff --git a/packages/aop/src/gen/aop/envelope_pb.ts b/packages/aop/src/gen/aop/envelope_pb.ts new file mode 100644 index 0000000..ef39bd1 --- /dev/null +++ b/packages/aop/src/gen/aop/envelope_pb.ts @@ -0,0 +1,51 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/envelope.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Any } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_any } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/envelope.proto. + */ +export const file_aop_envelope: GenFile = /*@__PURE__*/ + fileDesc("ChJhb3AvZW52ZWxvcGUucHJvdG8SA2FvcCJoCghFbnZlbG9wZRIKCgJpZBgBIAEoCRIQCghyZXBseV90bxgCIAEoCRIXCg9kZWxpdmVyeV9jdXJzb3IYAyABKAkSJQoHcGF5bG9hZBgEIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlCJVojZ2l0aHViLmNvbS9jaGFpbnJlYWN0b3JzL2Fpc2Nhbi9hb3BiBnByb3RvMw", [file_google_protobuf_any]); + +/** + * Envelope is the only AOP wire envelope. Business namespaces are carried by + * Any and never extend this message with a global oneof. + * + * @generated from message aop.Envelope + */ +export type Envelope = Message<"aop.Envelope"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string reply_to = 2; + */ + replyTo: string; + + /** + * @generated from field: string delivery_cursor = 3; + */ + deliveryCursor: string; + + /** + * @generated from field: google.protobuf.Any payload = 4; + */ + payload?: Any | undefined; +}; + +/** + * Describes the message aop.Envelope. + * Use `create(EnvelopeSchema)` to create a new message. + */ +export const EnvelopeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_envelope, 0); + diff --git a/packages/aop/src/gen/aop/event_pb.ts b/packages/aop/src/gen/aop/event_pb.ts index 88d3ef4..53fbaee 100644 --- a/packages/aop/src/gen/aop/event_pb.ts +++ b/packages/aop/src/gen/aop/event_pb.ts @@ -6,17 +6,15 @@ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2" import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; import type { Content, Message as Message$1, ToolCall, ToolResult } from "./content_pb.js"; import { file_aop_content } from "./content_pb.js"; -import type { EncodedValue, Extension } from "./value_pb.js"; -import { file_aop_value } from "./value_pb.js"; -import type { Timestamp } from "@bufbuild/protobuf/wkt"; -import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Any, Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_any, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file aop/event.proto. */ export const file_aop_event: GenFile = /*@__PURE__*/ - fileDesc("Cg9hb3AvZXZlbnQucHJvdG8SA2FvcCJXCg5TZXNzaW9uU3RhcnRlZBINCgVtb2RlbBgBIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgCIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAMgASgJIh4KDFNlc3Npb25FbmRlZBIOCgZyZWFzb24YASABKAkiDQoLVHVyblN0YXJ0ZWQiZAoNUHJvdG9jb2xFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgIEiEKBmRldGFpbBgEIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiugEKClRva2VuVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSFAoMdG90YWxfdG9rZW5zGAMgASgEEg0KBW1vZGVsGAQgASgJEisKBmRldGFpbBgFIAMoCzIbLmFvcC5Ub2tlblVzYWdlLkRldGFpbEVudHJ5Gi0KC0RldGFpbEVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEiewoJVHVybkVuZGVkEhMKC3N0b3BfcmVhc29uGAEgASgJEiEKBWVycm9yGAIgASgLMhIuYW9wLlByb3RvY29sRXJyb3ISHgoFdXNhZ2UYAyABKAsyDy5hb3AuVG9rZW5Vc2FnZRIWCg5jb250ZXh0X3Rva2VucxgEIAEoBCLtAQoMTWVzc2FnZURlbHRhEhIKCm1lc3NhZ2VfaWQYASABKAkSFQoNY29udGVudF9pbmRleBgCIAEoDRImCglvcGVyYXRpb24YAyABKA4yEy5hb3AuRGVsdGFPcGVyYXRpb24SDgoEdGV4dBgEIAEoCUgAEhMKCXJlYXNvbmluZxgFIAEoCUgAEhEKB3JlZnVzYWwYBiABKAlIABIOCgRkYXRhGAcgASgMSAASGAoOdG9vbF9hcmd1bWVudHMYCCABKAlIABIfCgdjb250ZW50GAkgASgLMgwuYW9wLkNvbnRlbnRIAEIHCgV2YWx1ZSJQCg1Ub29sQ2FsbERlbHRhEg8KB2NhbGxfaWQYASABKAkSDQoFaW5kZXgYAiABKA0SDAoEbmFtZRgDIAEoCRIRCglhcmd1bWVudHMYBCABKAwiOgoGU3RhdHVzEg0KBXN0YXRlGAEgASgJEiEKBmRldGFpbBgCIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiQAoORXh0ZW5zaW9uRXZlbnQSDAoEdHlwZRgBIAEoCRIgCgV2YWx1ZRgCIAEoCzIRLmFvcC5FbmNvZGVkVmFsdWUiLwoQUHJvdmlkZXJNZXRhZGF0YRIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgMIssBCg1Qcm92aWRlckZyYW1lEhAKCHByb3ZpZGVyGAEgASgJEhAKCHByb3RvY29sGAIgASgJEhIKCmV2ZW50X3R5cGUYAyABKAkSIQoJZGlyZWN0aW9uGAQgASgOMg4uYW9wLkRpcmVjdGlvbhIRCgl0cmFuc3BvcnQYBSABKAkSDwoHcGF5bG9hZBgGIAEoDBISCgptZWRpYV90eXBlGAcgASgJEicKCG1ldGFkYXRhGAggAygLMhUuYW9wLlByb3ZpZGVyTWV0YWRhdGEi5wUKBUV2ZW50EgoKAmlkGAEgASgJEi4KCmVtaXR0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCnNlc3Npb25faWQYAyABKAkSDwoHdHVybl9pZBgEIAEoCRIPCgdlbWl0dGVyGAUgASgJEgsKA3NlcRgGIAEoBBIiCgpleHRlbnNpb25zGAcgAygLMg4uYW9wLkV4dGVuc2lvbhIuCg9zZXNzaW9uX3N0YXJ0ZWQYCiABKAsyEy5hb3AuU2Vzc2lvblN0YXJ0ZWRIABIqCg1zZXNzaW9uX2VuZGVkGAsgASgLMhEuYW9wLlNlc3Npb25FbmRlZEgAEigKDHR1cm5fc3RhcnRlZBgMIAEoCzIQLmFvcC5UdXJuU3RhcnRlZEgAEiQKCnR1cm5fZW5kZWQYDSABKAsyDi5hb3AuVHVybkVuZGVkSAASHwoHbWVzc2FnZRgOIAEoCzIMLmFvcC5NZXNzYWdlSAASKgoNbWVzc2FnZV9kZWx0YRgPIAEoCzIRLmFvcC5NZXNzYWdlRGVsdGFIABIiCgl0b29sX2NhbGwYECABKAsyDS5hb3AuVG9vbENhbGxIABItCg90b29sX2NhbGxfZGVsdGEYESABKAsyEi5hb3AuVG9vbENhbGxEZWx0YUgAEiYKC3Rvb2xfcmVzdWx0GBIgASgLMg8uYW9wLlRvb2xSZXN1bHRIABIgCgV1c2FnZRgTIAEoCzIPLmFvcC5Ub2tlblVzYWdlSAASIwoFZXJyb3IYFCABKAsyEi5hb3AuUHJvdG9jb2xFcnJvckgAEh0KBnN0YXR1cxgVIAEoCzILLmFvcC5TdGF0dXNIABIoCglleHRlbnNpb24YFiABKAsyEy5hb3AuRXh0ZW5zaW9uRXZlbnRIABIsCg5wcm92aWRlcl9mcmFtZRgXIAEoCzISLmFvcC5Qcm92aWRlckZyYW1lSABCCQoHcGF5bG9hZCqeAQoORGVsdGFPcGVyYXRpb24SHwobREVMVEFfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASGQoVREVMVEFfT1BFUkFUSU9OX1NUQVJUEAESGgoWREVMVEFfT1BFUkFUSU9OX0FQUEVORBACEhsKF0RFTFRBX09QRVJBVElPTl9SRVBMQUNFEAMSFwoTREVMVEFfT1BFUkFUSU9OX0VORBAEKlUKCURpcmVjdGlvbhIZChVESVJFQ1RJT05fVU5TUEVDSUZJRUQQABIVChFESVJFQ1RJT05fUkVRVUVTVBABEhYKEkRJUkVDVElPTl9SRVNQT05TRRACYgZwcm90bzM", [file_aop_content, file_aop_value, file_google_protobuf_timestamp]); + fileDesc("Cg9hb3AvZXZlbnQucHJvdG8SA2FvcCJXCg5TZXNzaW9uU3RhcnRlZBINCgVtb2RlbBgBIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgCIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAMgASgJIh4KDFNlc3Npb25FbmRlZBIOCgZyZWFzb24YASABKAkiDQoLVHVyblN0YXJ0ZWQiRwoNUHJvdG9jb2xFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgISgQIBBAFIroBCgpUb2tlblVzYWdlEhQKDGlucHV0X3Rva2VucxgBIAEoBBIVCg1vdXRwdXRfdG9rZW5zGAIgASgEEhQKDHRvdGFsX3Rva2VucxgDIAEoBBINCgVtb2RlbBgEIAEoCRIrCgZkZXRhaWwYBSADKAsyGy5hb3AuVG9rZW5Vc2FnZS5EZXRhaWxFbnRyeRotCgtEZXRhaWxFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAQ6AjgBInsKCVR1cm5FbmRlZBITCgtzdG9wX3JlYXNvbhgBIAEoCRIhCgVlcnJvchgCIAEoCzISLmFvcC5Qcm90b2NvbEVycm9yEh4KBXVzYWdlGAMgASgLMg8uYW9wLlRva2VuVXNhZ2USFgoOY29udGV4dF90b2tlbnMYBCABKAQi7QEKDE1lc3NhZ2VEZWx0YRISCgptZXNzYWdlX2lkGAEgASgJEhUKDWNvbnRlbnRfaW5kZXgYAiABKA0SJgoJb3BlcmF0aW9uGAMgASgOMhMuYW9wLkRlbHRhT3BlcmF0aW9uEg4KBHRleHQYBCABKAlIABITCglyZWFzb25pbmcYBSABKAlIABIRCgdyZWZ1c2FsGAYgASgJSAASDgoEZGF0YRgHIAEoDEgAEhgKDnRvb2xfYXJndW1lbnRzGAggASgJSAASHwoHY29udGVudBgJIAEoCzIMLmFvcC5Db250ZW50SABCBwoFdmFsdWUiUAoNVG9vbENhbGxEZWx0YRIPCgdjYWxsX2lkGAEgASgJEg0KBWluZGV4GAIgASgNEgwKBG5hbWUYAyABKAkSEQoJYXJndW1lbnRzGAQgASgMIh0KBlN0YXR1cxINCgVzdGF0ZRgBIAEoCUoECAIQAyIvChBQcm92aWRlck1ldGFkYXRhEgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAwiywEKDVByb3ZpZGVyRnJhbWUSEAoIcHJvdmlkZXIYASABKAkSEAoIcHJvdG9jb2wYAiABKAkSEgoKZXZlbnRfdHlwZRgDIAEoCRIhCglkaXJlY3Rpb24YBCABKA4yDi5hb3AuRGlyZWN0aW9uEhEKCXRyYW5zcG9ydBgFIAEoCRIPCgdwYXlsb2FkGAYgASgMEhIKCm1lZGlhX3R5cGUYByABKAkSJwoIbWV0YWRhdGEYCCADKAsyFS5hb3AuUHJvdmlkZXJNZXRhZGF0YSL6BQoFRXZlbnQSCgoCaWQYASABKAkSLgoKZW1pdHRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKc2Vzc2lvbl9pZBgDIAEoCRIPCgd0dXJuX2lkGAQgASgJEg8KB2VtaXR0ZXIYBSABKAkSCwoDc2VxGAYgASgEEigKCmV4dGVuc2lvbnMYCCADKAsyFC5nb29nbGUucHJvdG9idWYuQW55Ei4KD3Nlc3Npb25fc3RhcnRlZBgKIAEoCzITLmFvcC5TZXNzaW9uU3RhcnRlZEgAEioKDXNlc3Npb25fZW5kZWQYCyABKAsyES5hb3AuU2Vzc2lvbkVuZGVkSAASKAoMdHVybl9zdGFydGVkGAwgASgLMhAuYW9wLlR1cm5TdGFydGVkSAASJAoKdHVybl9lbmRlZBgNIAEoCzIOLmFvcC5UdXJuRW5kZWRIABIfCgdtZXNzYWdlGA4gASgLMgwuYW9wLk1lc3NhZ2VIABIqCg1tZXNzYWdlX2RlbHRhGA8gASgLMhEuYW9wLk1lc3NhZ2VEZWx0YUgAEiIKCXRvb2xfY2FsbBgQIAEoCzINLmFvcC5Ub29sQ2FsbEgAEi0KD3Rvb2xfY2FsbF9kZWx0YRgRIAEoCzISLmFvcC5Ub29sQ2FsbERlbHRhSAASJgoLdG9vbF9yZXN1bHQYEiABKAsyDy5hb3AuVG9vbFJlc3VsdEgAEiAKBXVzYWdlGBMgASgLMg8uYW9wLlRva2VuVXNhZ2VIABIjCgVlcnJvchgUIAEoCzISLmFvcC5Qcm90b2NvbEVycm9ySAASHQoGc3RhdHVzGBUgASgLMgsuYW9wLlN0YXR1c0gAEiwKDnByb3ZpZGVyX2ZyYW1lGBcgASgLMhIuYW9wLlByb3ZpZGVyRnJhbWVIABIpCglleHRlbnNpb24YGCABKAsyFC5nb29nbGUucHJvdG9idWYuQW55SABCCQoHcGF5bG9hZEoECAcQCEoECBYQFyqeAQoORGVsdGFPcGVyYXRpb24SHwobREVMVEFfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASGQoVREVMVEFfT1BFUkFUSU9OX1NUQVJUEAESGgoWREVMVEFfT1BFUkFUSU9OX0FQUEVORBACEhsKF0RFTFRBX09QRVJBVElPTl9SRVBMQUNFEAMSFwoTREVMVEFfT1BFUkFUSU9OX0VORBAEKlUKCURpcmVjdGlvbhIZChVESVJFQ1RJT05fVU5TUEVDSUZJRUQQABIVChFESVJFQ1RJT05fUkVRVUVTVBABEhYKEkRJUkVDVElPTl9SRVNQT05TRRACQiVaI2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wYgZwcm90bzM", [file_aop_content, file_google_protobuf_any, file_google_protobuf_timestamp]); /** * @generated from message aop.SessionStarted @@ -93,11 +91,6 @@ export type ProtocolError = Message<"aop.ProtocolError"> & { * @generated from field: bool retryable = 3; */ retryable: boolean; - - /** - * @generated from field: aop.EncodedValue detail = 4; - */ - detail?: EncodedValue | undefined; }; /** @@ -284,11 +277,6 @@ export type Status = Message<"aop.Status"> & { * @generated from field: string state = 1; */ state: string; - - /** - * @generated from field: aop.EncodedValue detail = 2; - */ - detail?: EncodedValue | undefined; }; /** @@ -298,28 +286,6 @@ export type Status = Message<"aop.Status"> & { export const StatusSchema: GenMessage = /*@__PURE__*/ messageDesc(file_aop_event, 8); -/** - * @generated from message aop.ExtensionEvent - */ -export type ExtensionEvent = Message<"aop.ExtensionEvent"> & { - /** - * @generated from field: string type = 1; - */ - type: string; - - /** - * @generated from field: aop.EncodedValue value = 2; - */ - value?: EncodedValue | undefined; -}; - -/** - * Describes the message aop.ExtensionEvent. - * Use `create(ExtensionEventSchema)` to create a new message. - */ -export const ExtensionEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_event, 9); - /** * @generated from message aop.ProviderMetadata */ @@ -340,7 +306,7 @@ export type ProviderMetadata = Message<"aop.ProviderMetadata"> & { * Use `create(ProviderMetadataSchema)` to create a new message. */ export const ProviderMetadataSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_event, 10); + messageDesc(file_aop_event, 9); /** * ProviderFrame preserves one exact provider body or stream frame. @@ -394,7 +360,7 @@ export type ProviderFrame = Message<"aop.ProviderFrame"> & { * Use `create(ProviderFrameSchema)` to create a new message. */ export const ProviderFrameSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_event, 11); + messageDesc(file_aop_event, 10); /** * @generated from message aop.Event @@ -431,9 +397,9 @@ export type Event = Message<"aop.Event"> & { seq: bigint; /** - * @generated from field: repeated aop.Extension extensions = 7; + * @generated from field: repeated google.protobuf.Any extensions = 8; */ - extensions: Extension[]; + extensions: Any[]; /** * @generated from oneof aop.Event.payload @@ -510,18 +476,18 @@ export type Event = Message<"aop.Event"> & { */ value: Status; case: "status"; - } | { - /** - * @generated from field: aop.ExtensionEvent extension = 22; - */ - value: ExtensionEvent; - case: "extension"; } | { /** * @generated from field: aop.ProviderFrame provider_frame = 23; */ value: ProviderFrame; case: "providerFrame"; + } | { + /** + * @generated from field: google.protobuf.Any extension = 24; + */ + value: Any; + case: "extension"; } | { case: undefined; value?: undefined }; }; @@ -530,7 +496,7 @@ export type Event = Message<"aop.Event"> & { * Use `create(EventSchema)` to create a new message. */ export const EventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_event, 12); + messageDesc(file_aop_event, 11); /** * @generated from enum aop.DeltaOperation diff --git a/packages/aop/src/gen/aop/exec/protocol_pb.ts b/packages/aop/src/gen/aop/exec/protocol_pb.ts new file mode 100644 index 0000000..643cb89 --- /dev/null +++ b/packages/aop/src/gen/aop/exec/protocol_pb.ts @@ -0,0 +1,156 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/exec/protocol.proto (package aop.exec, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/exec/protocol.proto. + */ +export const file_aop_exec_protocol: GenFile = /*@__PURE__*/ + fileDesc("Chdhb3AvZXhlYy9wcm90b2NvbC5wcm90bxIIYW9wLmV4ZWMilQEKB1JlcXVlc3QSDwoHY29tbWFuZBgBIAEoCRILCgNjd2QYAiABKAkSFwoPdGltZW91dF9zZWNvbmRzGAMgASgNEicKA2VudhgEIAMoCzIaLmFvcC5leGVjLlJlcXVlc3QuRW52RW50cnkaKgoIRW52RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI4CgZPdXRwdXQSIAoGc3RyZWFtGAEgASgOMhAuYW9wLmV4ZWMuU3RyZWFtEgwKBGRhdGEYAiABKAwiPgoGUmVzdWx0EhEKCWV4aXRfY29kZRgBIAEoBRINCgVzdGF0ZRgCIAEoCRISCgpraWxsX2NhdXNlGAMgASgJIooBCg9Qcm90b2NvbE1lc3NhZ2USJAoHcmVxdWVzdBgKIAEoCzIRLmFvcC5leGVjLlJlcXVlc3RIABIiCgZvdXRwdXQYCyABKAsyEC5hb3AuZXhlYy5PdXRwdXRIABIiCgZyZXN1bHQYDCABKAsyEC5hb3AuZXhlYy5SZXN1bHRIAEIJCgdtZXNzYWdlKkYKBlN0cmVhbRIWChJTVFJFQU1fVU5TUEVDSUZJRUQQABIRCg1TVFJFQU1fU1RET1VUEAESEQoNU1RSRUFNX1NUREVSUhACQi9aLWdpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wL2V4ZWM7ZXhlY2IGcHJvdG8z"); + +/** + * @generated from message aop.exec.Request + */ +export type Request = Message<"aop.exec.Request"> & { + /** + * @generated from field: string command = 1; + */ + command: string; + + /** + * @generated from field: string cwd = 2; + */ + cwd: string; + + /** + * @generated from field: uint32 timeout_seconds = 3; + */ + timeoutSeconds: number; + + /** + * @generated from field: map env = 4; + */ + env: { [key: string]: string }; +}; + +/** + * Describes the message aop.exec.Request. + * Use `create(RequestSchema)` to create a new message. + */ +export const RequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_exec_protocol, 0); + +/** + * @generated from message aop.exec.Output + */ +export type Output = Message<"aop.exec.Output"> & { + /** + * @generated from field: aop.exec.Stream stream = 1; + */ + stream: Stream; + + /** + * @generated from field: bytes data = 2; + */ + data: Uint8Array; +}; + +/** + * Describes the message aop.exec.Output. + * Use `create(OutputSchema)` to create a new message. + */ +export const OutputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_exec_protocol, 1); + +/** + * @generated from message aop.exec.Result + */ +export type Result = Message<"aop.exec.Result"> & { + /** + * @generated from field: int32 exit_code = 1; + */ + exitCode: number; + + /** + * @generated from field: string state = 2; + */ + state: string; + + /** + * @generated from field: string kill_cause = 3; + */ + killCause: string; +}; + +/** + * Describes the message aop.exec.Result. + * Use `create(ResultSchema)` to create a new message. + */ +export const ResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_exec_protocol, 2); + +/** + * @generated from message aop.exec.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.exec.ProtocolMessage"> & { + /** + * @generated from oneof aop.exec.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.exec.Request request = 10; + */ + value: Request; + case: "request"; + } | { + /** + * @generated from field: aop.exec.Output output = 11; + */ + value: Output; + case: "output"; + } | { + /** + * @generated from field: aop.exec.Result result = 12; + */ + value: Result; + case: "result"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.exec.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_exec_protocol, 3); + +/** + * @generated from enum aop.exec.Stream + */ +export enum Stream { + /** + * @generated from enum value: STREAM_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: STREAM_STDOUT = 1; + */ + STDOUT = 1, + + /** + * @generated from enum value: STREAM_STDERR = 2; + */ + STDERR = 2, +} + +/** + * Describes the enum aop.exec.Stream. + */ +export const StreamSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_aop_exec_protocol, 0); + diff --git a/packages/aop/src/gen/aop/file/protocol_pb.ts b/packages/aop/src/gen/aop/file/protocol_pb.ts new file mode 100644 index 0000000..6cb5cd9 --- /dev/null +++ b/packages/aop/src/gen/aop/file/protocol_pb.ts @@ -0,0 +1,241 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/file/protocol.proto (package aop.file, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/file/protocol.proto. + */ +export const file_aop_file_protocol: GenFile = /*@__PURE__*/ + fileDesc("Chdhb3AvZmlsZS9wcm90b2NvbC5wcm90bxIIYW9wLmZpbGUiGwoLUmVhZFJlcXVlc3QSDAoEcGF0aBgBIAEoCSIqCgxXcml0ZVJlcXVlc3QSDAoEcGF0aBgBIAEoCRIMCgRkYXRhGAIgASgMIhsKC0xpc3RSZXF1ZXN0EgwKBHBhdGgYASABKAkiHAoMTWtkaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkiVwoNVXBsb2FkUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEhAKCGZpbGVuYW1lGAIgASgJEhIKCm1lZGlhX3R5cGUYAyABKAkSDAoEZGF0YRgEIAEoDCI5CgVFbnRyeRIMCgRuYW1lGAEgASgJEhQKDGlzX2RpcmVjdG9yeRgCIAEoCBIMCgRzaXplGAMgASgDInoKBlJlc3VsdBIMCgRwYXRoGAEgASgJEhAKCGZpbGVuYW1lGAIgASgJEgwKBHNpemUYAyABKAMSDAoEZGF0YRgEIAEoDBIgCgdlbnRyaWVzGAUgAygLMg8uYW9wLmZpbGUuRW50cnkSEgoKbWVkaWFfdHlwZRgGIAEoCSKzAgoPUHJvdG9jb2xNZXNzYWdlEi0KDHJlYWRfcmVxdWVzdBgKIAEoCzIVLmFvcC5maWxlLlJlYWRSZXF1ZXN0SAASLwoNd3JpdGVfcmVxdWVzdBgLIAEoCzIWLmFvcC5maWxlLldyaXRlUmVxdWVzdEgAEi0KDGxpc3RfcmVxdWVzdBgMIAEoCzIVLmFvcC5maWxlLkxpc3RSZXF1ZXN0SAASLwoNbWtkaXJfcmVxdWVzdBgNIAEoCzIWLmFvcC5maWxlLk1rZGlyUmVxdWVzdEgAEjEKDnVwbG9hZF9yZXF1ZXN0GA4gASgLMhcuYW9wLmZpbGUuVXBsb2FkUmVxdWVzdEgAEiIKBnJlc3VsdBgUIAEoCzIQLmFvcC5maWxlLlJlc3VsdEgAQgkKB21lc3NhZ2VCL1otZ2l0aHViLmNvbS9jaGFpbnJlYWN0b3JzL2Fpc2Nhbi9hb3AvZmlsZTtmaWxlYgZwcm90bzM"); + +/** + * @generated from message aop.file.ReadRequest + */ +export type ReadRequest = Message<"aop.file.ReadRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; + +/** + * Describes the message aop.file.ReadRequest. + * Use `create(ReadRequestSchema)` to create a new message. + */ +export const ReadRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 0); + +/** + * @generated from message aop.file.WriteRequest + */ +export type WriteRequest = Message<"aop.file.WriteRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + + /** + * @generated from field: bytes data = 2; + */ + data: Uint8Array; +}; + +/** + * Describes the message aop.file.WriteRequest. + * Use `create(WriteRequestSchema)` to create a new message. + */ +export const WriteRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 1); + +/** + * @generated from message aop.file.ListRequest + */ +export type ListRequest = Message<"aop.file.ListRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; + +/** + * Describes the message aop.file.ListRequest. + * Use `create(ListRequestSchema)` to create a new message. + */ +export const ListRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 2); + +/** + * @generated from message aop.file.MkdirRequest + */ +export type MkdirRequest = Message<"aop.file.MkdirRequest"> & { + /** + * @generated from field: string path = 1; + */ + path: string; +}; + +/** + * Describes the message aop.file.MkdirRequest. + * Use `create(MkdirRequestSchema)` to create a new message. + */ +export const MkdirRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 3); + +/** + * @generated from message aop.file.UploadRequest + */ +export type UploadRequest = Message<"aop.file.UploadRequest"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; + + /** + * @generated from field: string filename = 2; + */ + filename: string; + + /** + * @generated from field: string media_type = 3; + */ + mediaType: string; + + /** + * @generated from field: bytes data = 4; + */ + data: Uint8Array; +}; + +/** + * Describes the message aop.file.UploadRequest. + * Use `create(UploadRequestSchema)` to create a new message. + */ +export const UploadRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 4); + +/** + * @generated from message aop.file.Entry + */ +export type Entry = Message<"aop.file.Entry"> & { + /** + * @generated from field: string name = 1; + */ + name: string; + + /** + * @generated from field: bool is_directory = 2; + */ + isDirectory: boolean; + + /** + * @generated from field: int64 size = 3; + */ + size: bigint; +}; + +/** + * Describes the message aop.file.Entry. + * Use `create(EntrySchema)` to create a new message. + */ +export const EntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 5); + +/** + * @generated from message aop.file.Result + */ +export type Result = Message<"aop.file.Result"> & { + /** + * @generated from field: string path = 1; + */ + path: string; + + /** + * @generated from field: string filename = 2; + */ + filename: string; + + /** + * @generated from field: int64 size = 3; + */ + size: bigint; + + /** + * @generated from field: bytes data = 4; + */ + data: Uint8Array; + + /** + * @generated from field: repeated aop.file.Entry entries = 5; + */ + entries: Entry[]; + + /** + * @generated from field: string media_type = 6; + */ + mediaType: string; +}; + +/** + * Describes the message aop.file.Result. + * Use `create(ResultSchema)` to create a new message. + */ +export const ResultSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 6); + +/** + * @generated from message aop.file.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.file.ProtocolMessage"> & { + /** + * @generated from oneof aop.file.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.file.ReadRequest read_request = 10; + */ + value: ReadRequest; + case: "readRequest"; + } | { + /** + * @generated from field: aop.file.WriteRequest write_request = 11; + */ + value: WriteRequest; + case: "writeRequest"; + } | { + /** + * @generated from field: aop.file.ListRequest list_request = 12; + */ + value: ListRequest; + case: "listRequest"; + } | { + /** + * @generated from field: aop.file.MkdirRequest mkdir_request = 13; + */ + value: MkdirRequest; + case: "mkdirRequest"; + } | { + /** + * @generated from field: aop.file.UploadRequest upload_request = 14; + */ + value: UploadRequest; + case: "uploadRequest"; + } | { + /** + * @generated from field: aop.file.Result result = 20; + */ + value: Result; + case: "result"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.file.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_file_protocol, 7); + diff --git a/packages/aop/src/gen/aop/protocol_pb.ts b/packages/aop/src/gen/aop/protocol_pb.ts new file mode 100644 index 0000000..f485a61 --- /dev/null +++ b/packages/aop/src/gen/aop/protocol_pb.ts @@ -0,0 +1,376 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/protocol.proto (package aop, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { CancelTurnRequest, CancelTurnResponse, CloseSessionRequest, CloseSessionResponse, ListEventsRequest, ListEventsResponse, OpenSessionRequest, OpenSessionResponse, RunTurnRequest, RunTurnResponse, WatchEventsRequest } from "./chat_pb.js"; +import { file_aop_chat } from "./chat_pb.js"; +import type { ToolDefinition } from "./content_pb.js"; +import { file_aop_content } from "./content_pb.js"; +import type { Event, ProtocolError } from "./event_pb.js"; +import { file_aop_event } from "./event_pb.js"; +import { file_google_protobuf_struct } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/protocol.proto. + */ +export const file_aop_protocol: GenFile = /*@__PURE__*/ + fileDesc("ChJhb3AvcHJvdG9jb2wucHJvdG8SA2FvcCKdAQoQQWdlbnRSdW50aW1lSW5mbxIQCghob3N0bmFtZRgBIAEoCRIQCgh1c2VybmFtZRgCIAEoCRITCgt3b3JraW5nX2RpchgDIAEoCRIKCgJvcxgEIAEoCRIMCgRhcmNoGAUgASgJEgsKA3BpZBgGIAEoBRIpCghtZXRhZGF0YRgHIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QipwEKCkFnZW50SGVsbG8SEAoIYWdlbnRfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCglhdXRob3JpdHkYAyABKAkSFAoMY2FwYWJpbGl0aWVzGAQgAygJEiIKBXRvb2xzGAYgAygLMhMuYW9wLlRvb2xEZWZpbml0aW9uEiYKB3J1bnRpbWUYByABKAsyFS5hb3AuQWdlbnRSdW50aW1lSW5mb0oECAUQBiI3Cg1BZ2VudEFjY2VwdGVkEhAKCGFnZW50X2lkGAEgASgJEhQKDGNhcGFiaWxpdGllcxgCIAMoCSJoCgtBZ2VudFN0YXR1cxIQCghwcm92aWRlchgBIAEoCRINCgVtb2RlbBgCIAEoCRINCgVzcGFjZRgDIAEoCRINCgVib3VuZBgEIAEoCBIUCgxjb25maWdfZXJyb3IYBiABKAlKBAgFEAYi4AEKCkFnZW50U3RhdHMSDQoFdHVybnMYASABKAQSEgoKdG9vbF9jYWxscxgCIAEoBBIVCg1ydW5uaW5nX3Rvb2xzGAMgASgEEhQKDGlucHV0X3Rva2VucxgEIAEoBBIVCg1vdXRwdXRfdG9rZW5zGAUgASgEEhQKDHRvdGFsX3Rva2VucxgGIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgHIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYCCABKAQSEgoKbGFzdF9ldmVudBgLIAEoCUoECAkQCkoECAoQCyI0Cg9DYW5jZWxPcGVyYXRpb24SEQoJdGFyZ2V0X2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSKqBwoPUHJvdG9jb2xNZXNzYWdlEiYKC2FnZW50X2hlbGxvGAogASgLMg8uYW9wLkFnZW50SGVsbG9IABIsCg5hZ2VudF9hY2NlcHRlZBgLIAEoCzISLmFvcC5BZ2VudEFjY2VwdGVkSAASKAoMYWdlbnRfc3RhdHVzGAwgASgLMhAuYW9wLkFnZW50U3RhdHVzSAASJgoLYWdlbnRfc3RhdHMYDSABKAsyDy5hb3AuQWdlbnRTdGF0c0gAEjcKFG9wZW5fc2Vzc2lvbl9yZXF1ZXN0GBQgASgLMhcuYW9wLk9wZW5TZXNzaW9uUmVxdWVzdEgAEjkKFW9wZW5fc2Vzc2lvbl9yZXNwb25zZRgVIAEoCzIYLmFvcC5PcGVuU2Vzc2lvblJlc3BvbnNlSAASLwoQcnVuX3R1cm5fcmVxdWVzdBgWIAEoCzITLmFvcC5SdW5UdXJuUmVxdWVzdEgAEjEKEXJ1bl90dXJuX3Jlc3BvbnNlGBcgASgLMhQuYW9wLlJ1blR1cm5SZXNwb25zZUgAEjUKE2NhbmNlbF90dXJuX3JlcXVlc3QYGCABKAsyFi5hb3AuQ2FuY2VsVHVyblJlcXVlc3RIABI3ChRjYW5jZWxfdHVybl9yZXNwb25zZRgZIAEoCzIXLmFvcC5DYW5jZWxUdXJuUmVzcG9uc2VIABI5ChVjbG9zZV9zZXNzaW9uX3JlcXVlc3QYGiABKAsyGC5hb3AuQ2xvc2VTZXNzaW9uUmVxdWVzdEgAEjsKFmNsb3NlX3Nlc3Npb25fcmVzcG9uc2UYGyABKAsyGS5hb3AuQ2xvc2VTZXNzaW9uUmVzcG9uc2VIABI3ChR3YXRjaF9ldmVudHNfcmVxdWVzdBgcIAEoCzIXLmFvcC5XYXRjaEV2ZW50c1JlcXVlc3RIABI1ChNsaXN0X2V2ZW50c19yZXF1ZXN0GB0gASgLMhYuYW9wLkxpc3RFdmVudHNSZXF1ZXN0SAASNwoUbGlzdF9ldmVudHNfcmVzcG9uc2UYHiABKAsyFy5hb3AuTGlzdEV2ZW50c1Jlc3BvbnNlSAASGwoFZXZlbnQYHyABKAsyCi5hb3AuRXZlbnRIABIwChBjYW5jZWxfb3BlcmF0aW9uGCggASgLMhQuYW9wLkNhbmNlbE9wZXJhdGlvbkgAEiwKDnByb3RvY29sX2Vycm9yGCkgASgLMhIuYW9wLlByb3RvY29sRXJyb3JIAEIJCgdtZXNzYWdlQiVaI2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wYgZwcm90bzM", [file_aop_chat, file_aop_content, file_aop_event, file_google_protobuf_struct]); + +/** + * @generated from message aop.AgentRuntimeInfo + */ +export type AgentRuntimeInfo = Message<"aop.AgentRuntimeInfo"> & { + /** + * @generated from field: string hostname = 1; + */ + hostname: string; + + /** + * @generated from field: string username = 2; + */ + username: string; + + /** + * @generated from field: string working_dir = 3; + */ + workingDir: string; + + /** + * @generated from field: string os = 4; + */ + os: string; + + /** + * @generated from field: string arch = 5; + */ + arch: string; + + /** + * @generated from field: int32 pid = 6; + */ + pid: number; + + /** + * @generated from field: google.protobuf.Struct metadata = 7; + */ + metadata?: JsonObject | undefined; +}; + +/** + * Describes the message aop.AgentRuntimeInfo. + * Use `create(AgentRuntimeInfoSchema)` to create a new message. + */ +export const AgentRuntimeInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 0); + +/** + * @generated from message aop.AgentHello + */ +export type AgentHello = Message<"aop.AgentHello"> & { + /** + * @generated from field: string agent_id = 1; + */ + agentId: string; + + /** + * @generated from field: string name = 2; + */ + name: string; + + /** + * @generated from field: string authority = 3; + */ + authority: string; + + /** + * @generated from field: repeated string capabilities = 4; + */ + capabilities: string[]; + + /** + * @generated from field: repeated aop.ToolDefinition tools = 6; + */ + tools: ToolDefinition[]; + + /** + * @generated from field: aop.AgentRuntimeInfo runtime = 7; + */ + runtime?: AgentRuntimeInfo | undefined; +}; + +/** + * Describes the message aop.AgentHello. + * Use `create(AgentHelloSchema)` to create a new message. + */ +export const AgentHelloSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 1); + +/** + * @generated from message aop.AgentAccepted + */ +export type AgentAccepted = Message<"aop.AgentAccepted"> & { + /** + * @generated from field: string agent_id = 1; + */ + agentId: string; + + /** + * @generated from field: repeated string capabilities = 2; + */ + capabilities: string[]; +}; + +/** + * Describes the message aop.AgentAccepted. + * Use `create(AgentAcceptedSchema)` to create a new message. + */ +export const AgentAcceptedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 2); + +/** + * @generated from message aop.AgentStatus + */ +export type AgentStatus = Message<"aop.AgentStatus"> & { + /** + * @generated from field: string provider = 1; + */ + provider: string; + + /** + * @generated from field: string model = 2; + */ + model: string; + + /** + * @generated from field: string space = 3; + */ + space: string; + + /** + * @generated from field: bool bound = 4; + */ + bound: boolean; + + /** + * @generated from field: string config_error = 6; + */ + configError: string; +}; + +/** + * Describes the message aop.AgentStatus. + * Use `create(AgentStatusSchema)` to create a new message. + */ +export const AgentStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 3); + +/** + * @generated from message aop.AgentStats + */ +export type AgentStats = Message<"aop.AgentStats"> & { + /** + * @generated from field: uint64 turns = 1; + */ + turns: bigint; + + /** + * @generated from field: uint64 tool_calls = 2; + */ + toolCalls: bigint; + + /** + * @generated from field: uint64 running_tools = 3; + */ + runningTools: bigint; + + /** + * @generated from field: uint64 input_tokens = 4; + */ + inputTokens: bigint; + + /** + * @generated from field: uint64 output_tokens = 5; + */ + outputTokens: bigint; + + /** + * @generated from field: uint64 total_tokens = 6; + */ + totalTokens: bigint; + + /** + * @generated from field: uint64 cache_read_tokens = 7; + */ + cacheReadTokens: bigint; + + /** + * @generated from field: uint64 cache_write_tokens = 8; + */ + cacheWriteTokens: bigint; + + /** + * @generated from field: string last_event = 11; + */ + lastEvent: string; +}; + +/** + * Describes the message aop.AgentStats. + * Use `create(AgentStatsSchema)` to create a new message. + */ +export const AgentStatsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 4); + +/** + * @generated from message aop.CancelOperation + */ +export type CancelOperation = Message<"aop.CancelOperation"> & { + /** + * @generated from field: string target_id = 1; + */ + targetId: string; + + /** + * @generated from field: string reason = 2; + */ + reason: string; +}; + +/** + * Describes the message aop.CancelOperation. + * Use `create(CancelOperationSchema)` to create a new message. + */ +export const CancelOperationSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 5); + +/** + * ProtocolMessage is the typed union for the AOP core namespace. Extension + * packages define their own ProtocolMessage and do not modify this one. + * + * @generated from message aop.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.ProtocolMessage"> & { + /** + * @generated from oneof aop.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.AgentHello agent_hello = 10; + */ + value: AgentHello; + case: "agentHello"; + } | { + /** + * @generated from field: aop.AgentAccepted agent_accepted = 11; + */ + value: AgentAccepted; + case: "agentAccepted"; + } | { + /** + * @generated from field: aop.AgentStatus agent_status = 12; + */ + value: AgentStatus; + case: "agentStatus"; + } | { + /** + * @generated from field: aop.AgentStats agent_stats = 13; + */ + value: AgentStats; + case: "agentStats"; + } | { + /** + * @generated from field: aop.OpenSessionRequest open_session_request = 20; + */ + value: OpenSessionRequest; + case: "openSessionRequest"; + } | { + /** + * @generated from field: aop.OpenSessionResponse open_session_response = 21; + */ + value: OpenSessionResponse; + case: "openSessionResponse"; + } | { + /** + * @generated from field: aop.RunTurnRequest run_turn_request = 22; + */ + value: RunTurnRequest; + case: "runTurnRequest"; + } | { + /** + * @generated from field: aop.RunTurnResponse run_turn_response = 23; + */ + value: RunTurnResponse; + case: "runTurnResponse"; + } | { + /** + * @generated from field: aop.CancelTurnRequest cancel_turn_request = 24; + */ + value: CancelTurnRequest; + case: "cancelTurnRequest"; + } | { + /** + * @generated from field: aop.CancelTurnResponse cancel_turn_response = 25; + */ + value: CancelTurnResponse; + case: "cancelTurnResponse"; + } | { + /** + * @generated from field: aop.CloseSessionRequest close_session_request = 26; + */ + value: CloseSessionRequest; + case: "closeSessionRequest"; + } | { + /** + * @generated from field: aop.CloseSessionResponse close_session_response = 27; + */ + value: CloseSessionResponse; + case: "closeSessionResponse"; + } | { + /** + * @generated from field: aop.WatchEventsRequest watch_events_request = 28; + */ + value: WatchEventsRequest; + case: "watchEventsRequest"; + } | { + /** + * @generated from field: aop.ListEventsRequest list_events_request = 29; + */ + value: ListEventsRequest; + case: "listEventsRequest"; + } | { + /** + * @generated from field: aop.ListEventsResponse list_events_response = 30; + */ + value: ListEventsResponse; + case: "listEventsResponse"; + } | { + /** + * @generated from field: aop.Event event = 31; + */ + value: Event; + case: "event"; + } | { + /** + * @generated from field: aop.CancelOperation cancel_operation = 40; + */ + value: CancelOperation; + case: "cancelOperation"; + } | { + /** + * @generated from field: aop.ProtocolError protocol_error = 41; + */ + value: ProtocolError; + case: "protocolError"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_protocol, 6); + diff --git a/packages/aop/src/gen/aop/pty/protocol_pb.ts b/packages/aop/src/gen/aop/pty/protocol_pb.ts new file mode 100644 index 0000000..fbf25f7 --- /dev/null +++ b/packages/aop/src/gen/aop/pty/protocol_pb.ts @@ -0,0 +1,593 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/pty/protocol.proto (package aop.pty, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/pty/protocol.proto. + */ +export const file_aop_pty_protocol: GenFile = /*@__PURE__*/ + fileDesc("ChZhb3AvcHR5L3Byb3RvY29sLnByb3RvEgdhb3AucHR5IsUCCgdTZXNzaW9uEgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIPCgdjb21tYW5kGAQgASgJEgsKA3BpZBgFIAEoBRIuCgpzdGFydGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI0ChBsYXN0X2FjdGl2aXR5X2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMYWN0aXZpdHlfc2VxGAkgASgDEhQKDG91dHB1dF9ieXRlcxgKIAEoAxIRCglleGl0X2NvZGUYCyABKAUSDQoFc3RhdGUYDCABKAkSEgoKa2lsbF9jYXVzZRgNIAEoCSKVAQoET3BlbhIRCglzdHJlYW1faWQYASABKAkSEAoIbm9kZV91cmkYAiABKAkSDAoEa2luZBgDIAEoCRIMCgRuYW1lGAQgASgJEg8KB2NvbW1hbmQYBSABKAkSDAoEYXJncxgGIAMoCRIMCgRjb2xzGAcgASgFEgwKBHJvd3MYCCABKAUSEQoJc2luZ2xldG9uGAkgASgIIj4KBk9wZW5lZBIRCglzdHJlYW1faWQYASABKAkSIQoHc2Vzc2lvbhgCIAEoCzIQLmFvcC5wdHkuU2Vzc2lvbiIoCgVJbnB1dBIRCglzdHJlYW1faWQYASABKAkSDAoEZGF0YRgCIAEoDCI5CgZPdXRwdXQSEQoJc3RyZWFtX2lkGAEgASgJEgwKBGRhdGEYAiABKAwSDgoGb2Zmc2V0GAMgASgDIjcKBlJlc2l6ZRIRCglzdHJlYW1faWQYASABKAkSDAoEY29scxgCIAEoBRIMCgRyb3dzGAMgASgFIisKBExpc3QSEQoJc3RyZWFtX2lkGAEgASgJEhAKCG5vZGVfdXJpGAIgASgJIkEKCFNlc3Npb25zEhEKCXN0cmVhbV9pZBgBIAEoCRIiCghzZXNzaW9ucxgCIAMoCzIQLmFvcC5wdHkuU2Vzc2lvbiJLCgZBdHRhY2gSEQoJc3RyZWFtX2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDAoEY29scxgDIAEoBRIMCgRyb3dzGAQgASgFIkAKCEF0dGFjaGVkEhEKCXN0cmVhbV9pZBgBIAEoCRIhCgdzZXNzaW9uGAIgASgLMhAuYW9wLnB0eS5TZXNzaW9uIhsKBkRldGFjaBIRCglzdHJlYW1faWQYASABKAkiHQoIRGV0YWNoZWQSEQoJc3RyZWFtX2lkGAEgASgJIhkKBEtpbGwSEQoJc3RyZWFtX2lkGAEgASgJIhoKBUNsb3NlEhEKCXN0cmVhbV9pZBgBIAEoCSI+CgZDbG9zZWQSEQoJc3RyZWFtX2lkGAEgASgJEiEKB3Nlc3Npb24YAiABKAsyEC5hb3AucHR5LlNlc3Npb24iPQoFU3RhdGUSEQoJc3RyZWFtX2lkGAEgASgJEiEKB3Nlc3Npb24YAiABKAsyEC5hb3AucHR5LlNlc3Npb24iKwoFRXJyb3ISEQoJc3RyZWFtX2lkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkixAQKD1Byb3RvY29sTWVzc2FnZRIdCgRvcGVuGAogASgLMg0uYW9wLnB0eS5PcGVuSAASHwoFaW5wdXQYCyABKAsyDi5hb3AucHR5LklucHV0SAASIQoGb3V0cHV0GAwgASgLMg8uYW9wLnB0eS5PdXRwdXRIABIhCgZyZXNpemUYDSABKAsyDy5hb3AucHR5LlJlc2l6ZUgAEh0KBGxpc3QYDiABKAsyDS5hb3AucHR5Lkxpc3RIABIlCghzZXNzaW9ucxgPIAEoCzIRLmFvcC5wdHkuU2Vzc2lvbnNIABIhCgZhdHRhY2gYECABKAsyDy5hb3AucHR5LkF0dGFjaEgAEiEKBmRldGFjaBgRIAEoCzIPLmFvcC5wdHkuRGV0YWNoSAASHwoFY2xvc2UYEiABKAsyDi5hb3AucHR5LkNsb3NlSAASHwoFc3RhdGUYEyABKAsyDi5hb3AucHR5LlN0YXRlSAASHwoFZXJyb3IYFCABKAsyDi5hb3AucHR5LkVycm9ySAASIQoGb3BlbmVkGBUgASgLMg8uYW9wLnB0eS5PcGVuZWRIABIlCghhdHRhY2hlZBgWIAEoCzIRLmFvcC5wdHkuQXR0YWNoZWRIABIlCghkZXRhY2hlZBgXIAEoCzIRLmFvcC5wdHkuRGV0YWNoZWRIABIdCgRraWxsGBggASgLMg0uYW9wLnB0eS5LaWxsSAASIQoGY2xvc2VkGBkgASgLMg8uYW9wLnB0eS5DbG9zZWRIAEIJCgdtZXNzYWdlQi1aK2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wL3B0eTtwdHliBnByb3RvMw", [file_google_protobuf_timestamp]); + +/** + * @generated from message aop.pty.Session + */ +export type Session = Message<"aop.pty.Session"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string kind = 2; + */ + kind: string; + + /** + * @generated from field: string name = 3; + */ + name: string; + + /** + * @generated from field: string command = 4; + */ + command: string; + + /** + * @generated from field: int32 pid = 5; + */ + pid: number; + + /** + * @generated from field: google.protobuf.Timestamp started_at = 6; + */ + startedAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp last_activity_at = 7; + */ + lastActivityAt?: Timestamp | undefined; + + /** + * @generated from field: google.protobuf.Timestamp ended_at = 8; + */ + endedAt?: Timestamp | undefined; + + /** + * @generated from field: int64 activity_seq = 9; + */ + activitySeq: bigint; + + /** + * @generated from field: int64 output_bytes = 10; + */ + outputBytes: bigint; + + /** + * @generated from field: int32 exit_code = 11; + */ + exitCode: number; + + /** + * @generated from field: string state = 12; + */ + state: string; + + /** + * @generated from field: string kill_cause = 13; + */ + killCause: string; +}; + +/** + * Describes the message aop.pty.Session. + * Use `create(SessionSchema)` to create a new message. + */ +export const SessionSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 0); + +/** + * @generated from message aop.pty.Open + */ +export type Open = Message<"aop.pty.Open"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: string node_uri = 2; + */ + nodeUri: string; + + /** + * @generated from field: string kind = 3; + */ + kind: string; + + /** + * @generated from field: string name = 4; + */ + name: string; + + /** + * @generated from field: string command = 5; + */ + command: string; + + /** + * @generated from field: repeated string args = 6; + */ + args: string[]; + + /** + * @generated from field: int32 cols = 7; + */ + cols: number; + + /** + * @generated from field: int32 rows = 8; + */ + rows: number; + + /** + * @generated from field: bool singleton = 9; + */ + singleton: boolean; +}; + +/** + * Describes the message aop.pty.Open. + * Use `create(OpenSchema)` to create a new message. + */ +export const OpenSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 1); + +/** + * @generated from message aop.pty.Opened + */ +export type Opened = Message<"aop.pty.Opened"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: aop.pty.Session session = 2; + */ + session?: Session | undefined; +}; + +/** + * Describes the message aop.pty.Opened. + * Use `create(OpenedSchema)` to create a new message. + */ +export const OpenedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 2); + +/** + * @generated from message aop.pty.Input + */ +export type Input = Message<"aop.pty.Input"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: bytes data = 2; + */ + data: Uint8Array; +}; + +/** + * Describes the message aop.pty.Input. + * Use `create(InputSchema)` to create a new message. + */ +export const InputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 3); + +/** + * @generated from message aop.pty.Output + */ +export type Output = Message<"aop.pty.Output"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: bytes data = 2; + */ + data: Uint8Array; + + /** + * @generated from field: int64 offset = 3; + */ + offset: bigint; +}; + +/** + * Describes the message aop.pty.Output. + * Use `create(OutputSchema)` to create a new message. + */ +export const OutputSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 4); + +/** + * @generated from message aop.pty.Resize + */ +export type Resize = Message<"aop.pty.Resize"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: int32 cols = 2; + */ + cols: number; + + /** + * @generated from field: int32 rows = 3; + */ + rows: number; +}; + +/** + * Describes the message aop.pty.Resize. + * Use `create(ResizeSchema)` to create a new message. + */ +export const ResizeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 5); + +/** + * @generated from message aop.pty.List + */ +export type List = Message<"aop.pty.List"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: string node_uri = 2; + */ + nodeUri: string; +}; + +/** + * Describes the message aop.pty.List. + * Use `create(ListSchema)` to create a new message. + */ +export const ListSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 6); + +/** + * @generated from message aop.pty.Sessions + */ +export type Sessions = Message<"aop.pty.Sessions"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: repeated aop.pty.Session sessions = 2; + */ + sessions: Session[]; +}; + +/** + * Describes the message aop.pty.Sessions. + * Use `create(SessionsSchema)` to create a new message. + */ +export const SessionsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 7); + +/** + * @generated from message aop.pty.Attach + */ +export type Attach = Message<"aop.pty.Attach"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: string session_id = 2; + */ + sessionId: string; + + /** + * @generated from field: int32 cols = 3; + */ + cols: number; + + /** + * @generated from field: int32 rows = 4; + */ + rows: number; +}; + +/** + * Describes the message aop.pty.Attach. + * Use `create(AttachSchema)` to create a new message. + */ +export const AttachSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 8); + +/** + * @generated from message aop.pty.Attached + */ +export type Attached = Message<"aop.pty.Attached"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: aop.pty.Session session = 2; + */ + session?: Session | undefined; +}; + +/** + * Describes the message aop.pty.Attached. + * Use `create(AttachedSchema)` to create a new message. + */ +export const AttachedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 9); + +/** + * @generated from message aop.pty.Detach + */ +export type Detach = Message<"aop.pty.Detach"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; +}; + +/** + * Describes the message aop.pty.Detach. + * Use `create(DetachSchema)` to create a new message. + */ +export const DetachSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 10); + +/** + * @generated from message aop.pty.Detached + */ +export type Detached = Message<"aop.pty.Detached"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; +}; + +/** + * Describes the message aop.pty.Detached. + * Use `create(DetachedSchema)` to create a new message. + */ +export const DetachedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 11); + +/** + * @generated from message aop.pty.Kill + */ +export type Kill = Message<"aop.pty.Kill"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; +}; + +/** + * Describes the message aop.pty.Kill. + * Use `create(KillSchema)` to create a new message. + */ +export const KillSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 12); + +/** + * @generated from message aop.pty.Close + */ +export type Close = Message<"aop.pty.Close"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; +}; + +/** + * Describes the message aop.pty.Close. + * Use `create(CloseSchema)` to create a new message. + */ +export const CloseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 13); + +/** + * @generated from message aop.pty.Closed + */ +export type Closed = Message<"aop.pty.Closed"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: aop.pty.Session session = 2; + */ + session?: Session | undefined; +}; + +/** + * Describes the message aop.pty.Closed. + * Use `create(ClosedSchema)` to create a new message. + */ +export const ClosedSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 14); + +/** + * @generated from message aop.pty.State + */ +export type State = Message<"aop.pty.State"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: aop.pty.Session session = 2; + */ + session?: Session | undefined; +}; + +/** + * Describes the message aop.pty.State. + * Use `create(StateSchema)` to create a new message. + */ +export const StateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 15); + +/** + * @generated from message aop.pty.Error + */ +export type Error = Message<"aop.pty.Error"> & { + /** + * @generated from field: string stream_id = 1; + */ + streamId: string; + + /** + * @generated from field: string message = 2; + */ + message: string; +}; + +/** + * Describes the message aop.pty.Error. + * Use `create(ErrorSchema)` to create a new message. + */ +export const ErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 16); + +/** + * @generated from message aop.pty.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.pty.ProtocolMessage"> & { + /** + * @generated from oneof aop.pty.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.pty.Open open = 10; + */ + value: Open; + case: "open"; + } | { + /** + * @generated from field: aop.pty.Input input = 11; + */ + value: Input; + case: "input"; + } | { + /** + * @generated from field: aop.pty.Output output = 12; + */ + value: Output; + case: "output"; + } | { + /** + * @generated from field: aop.pty.Resize resize = 13; + */ + value: Resize; + case: "resize"; + } | { + /** + * @generated from field: aop.pty.List list = 14; + */ + value: List; + case: "list"; + } | { + /** + * @generated from field: aop.pty.Sessions sessions = 15; + */ + value: Sessions; + case: "sessions"; + } | { + /** + * @generated from field: aop.pty.Attach attach = 16; + */ + value: Attach; + case: "attach"; + } | { + /** + * @generated from field: aop.pty.Detach detach = 17; + */ + value: Detach; + case: "detach"; + } | { + /** + * @generated from field: aop.pty.Close close = 18; + */ + value: Close; + case: "close"; + } | { + /** + * @generated from field: aop.pty.State state = 19; + */ + value: State; + case: "state"; + } | { + /** + * @generated from field: aop.pty.Error error = 20; + */ + value: Error; + case: "error"; + } | { + /** + * @generated from field: aop.pty.Opened opened = 21; + */ + value: Opened; + case: "opened"; + } | { + /** + * @generated from field: aop.pty.Attached attached = 22; + */ + value: Attached; + case: "attached"; + } | { + /** + * @generated from field: aop.pty.Detached detached = 23; + */ + value: Detached; + case: "detached"; + } | { + /** + * @generated from field: aop.pty.Kill kill = 24; + */ + value: Kill; + case: "kill"; + } | { + /** + * @generated from field: aop.pty.Closed closed = 25; + */ + value: Closed; + case: "closed"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.pty.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_pty_protocol, 17); + diff --git a/packages/aop/src/gen/aop/sco/protocol_pb.ts b/packages/aop/src/gen/aop/sco/protocol_pb.ts new file mode 100644 index 0000000..d3732d1 --- /dev/null +++ b/packages/aop/src/gen/aop/sco/protocol_pb.ts @@ -0,0 +1,62 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/sco/protocol.proto (package aop.sco, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/sco/protocol.proto. + */ +export const file_aop_sco_protocol: GenFile = /*@__PURE__*/ + fileDesc("ChZhb3Avc2NvL3Byb3RvY29sLnByb3RvEgdhb3Auc2NvIioKBU5vZGVzEg0KBW5vZGVzGAEgAygMEhIKCm1lZGlhX3R5cGUYAiABKAkiPQoPUHJvdG9jb2xNZXNzYWdlEh8KBW5vZGVzGAogASgLMg4uYW9wLnNjby5Ob2Rlc0gAQgkKB21lc3NhZ2VCLVorZ2l0aHViLmNvbS9jaGFpbnJlYWN0b3JzL2Fpc2Nhbi9hb3Avc2NvO3Njb2IGcHJvdG8z"); + +/** + * Nodes carries libcstx-owned node documents without copying the libcstx + * schema into AOP. Each entry uses the declared media type. + * + * @generated from message aop.sco.Nodes + */ +export type Nodes = Message<"aop.sco.Nodes"> & { + /** + * @generated from field: repeated bytes nodes = 1; + */ + nodes: Uint8Array[]; + + /** + * @generated from field: string media_type = 2; + */ + mediaType: string; +}; + +/** + * Describes the message aop.sco.Nodes. + * Use `create(NodesSchema)` to create a new message. + */ +export const NodesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_sco_protocol, 0); + +/** + * @generated from message aop.sco.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.sco.ProtocolMessage"> & { + /** + * @generated from oneof aop.sco.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.sco.Nodes nodes = 10; + */ + value: Nodes; + case: "nodes"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.sco.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_sco_protocol, 1); + diff --git a/packages/aop/src/gen/aop/tool/protocol_pb.ts b/packages/aop/src/gen/aop/tool/protocol_pb.ts new file mode 100644 index 0000000..6763525 --- /dev/null +++ b/packages/aop/src/gen/aop/tool/protocol_pb.ts @@ -0,0 +1,106 @@ +// @generated by protoc-gen-es v2.13.0 with parameter "target=ts,import_extension=js" +// @generated from file aop/tool/protocol.proto (package aop.tool, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { ToolCall } from "../content_pb.js"; +import { file_aop_content } from "../content_pb.js"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file aop/tool/protocol.proto. + */ +export const file_aop_tool_protocol: GenFile = /*@__PURE__*/ + fileDesc("Chdhb3AvdG9vbC9wcm90b2NvbC5wcm90bxIIYW9wLnRvb2wiSAoEQ2FsbBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSGwoEY2FsbBgDIAEoCzINLmFvcC5Ub29sQ2FsbCJxCghQcm9ncmVzcxIMCgR0b29sGAEgASgJEg4KBnRhcmdldBgDIAEoCRItCgl0aW1lc3RhbXAYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBHRleHQYBiABKAlKBAgCEANKBAgEEAUiZAoPUHJvdG9jb2xNZXNzYWdlEiYKCHByb2dyZXNzGAogASgLMhIuYW9wLnRvb2wuUHJvZ3Jlc3NIABIeCgRjYWxsGAsgASgLMg4uYW9wLnRvb2wuQ2FsbEgAQgkKB21lc3NhZ2VCL1otZ2l0aHViLmNvbS9jaGFpbnJlYWN0b3JzL2Fpc2Nhbi9hb3AvdG9vbDt0b29sYgZwcm90bzM", [file_aop_content, file_google_protobuf_timestamp]); + +/** + * @generated from message aop.tool.Call + */ +export type Call = Message<"aop.tool.Call"> & { + /** + * @generated from field: string session_id = 1; + */ + sessionId: string; + + /** + * @generated from field: string turn_id = 2; + */ + turnId: string; + + /** + * @generated from field: aop.ToolCall call = 3; + */ + call?: ToolCall | undefined; +}; + +/** + * Describes the message aop.tool.Call. + * Use `create(CallSchema)` to create a new message. + */ +export const CallSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_tool_protocol, 0); + +/** + * @generated from message aop.tool.Progress + */ +export type Progress = Message<"aop.tool.Progress"> & { + /** + * @generated from field: string tool = 1; + */ + tool: string; + + /** + * @generated from field: string target = 3; + */ + target: string; + + /** + * @generated from field: google.protobuf.Timestamp timestamp = 5; + */ + timestamp?: Timestamp | undefined; + + /** + * @generated from field: string text = 6; + */ + text: string; +}; + +/** + * Describes the message aop.tool.Progress. + * Use `create(ProgressSchema)` to create a new message. + */ +export const ProgressSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_tool_protocol, 1); + +/** + * @generated from message aop.tool.ProtocolMessage + */ +export type ProtocolMessage = Message<"aop.tool.ProtocolMessage"> & { + /** + * @generated from oneof aop.tool.ProtocolMessage.message + */ + message: { + /** + * @generated from field: aop.tool.Progress progress = 10; + */ + value: Progress; + case: "progress"; + } | { + /** + * @generated from field: aop.tool.Call call = 11; + */ + value: Call; + case: "call"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message aop.tool.ProtocolMessage. + * Use `create(ProtocolMessageSchema)` to create a new message. + */ +export const ProtocolMessageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_aop_tool_protocol, 2); + diff --git a/packages/aop/src/gen/aop/value_pb.ts b/packages/aop/src/gen/aop/value_pb.ts index e028194..4faf957 100644 --- a/packages/aop/src/gen/aop/value_pb.ts +++ b/packages/aop/src/gen/aop/value_pb.ts @@ -10,10 +10,11 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file aop/value.proto. */ export const file_aop_value: GenFile = /*@__PURE__*/ - fileDesc("Cg9hb3AvdmFsdWUucHJvdG8SA2FvcCIwCgxFbmNvZGVkVmFsdWUSDAoEZGF0YRgBIAEoDBISCgptZWRpYV90eXBlGAIgASgJIkAKCUV4dGVuc2lvbhIRCgluYW1lc3BhY2UYASABKAkSIAoFdmFsdWUYAiABKAsyES5hb3AuRW5jb2RlZFZhbHVlYgZwcm90bzM"); + fileDesc("Cg9hb3AvdmFsdWUucHJvdG8SA2FvcCIwCgxFbmNvZGVkVmFsdWUSDAoEZGF0YRgBIAEoDBISCgptZWRpYV90eXBlGAIgASgJQiVaI2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wYgZwcm90bzM"); /** - * EncodedValue preserves structured or binary data without JSON coercion. + * EncodedValue carries genuinely opaque data whose schema is not protobuf, + * notably provider/tool JSON arguments and JSON Schema documents. * * @generated from message aop.EncodedValue */ @@ -36,27 +37,3 @@ export type EncodedValue = Message<"aop.EncodedValue"> & { export const EncodedValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_aop_value, 0); -/** - * Extension carries namespaced semantics outside the stable AOP core. - * - * @generated from message aop.Extension - */ -export type Extension = Message<"aop.Extension"> & { - /** - * @generated from field: string namespace = 1; - */ - namespace: string; - - /** - * @generated from field: aop.EncodedValue value = 2; - */ - value?: EncodedValue | undefined; -}; - -/** - * Describes the message aop.Extension. - * Use `create(ExtensionSchema)` to create a new message. - */ -export const ExtensionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_aop_value, 1); - diff --git a/packages/aop/src/index.ts b/packages/aop/src/index.ts index c0f2bc8..6748235 100644 --- a/packages/aop/src/index.ts +++ b/packages/aop/src/index.ts @@ -2,9 +2,44 @@ export * from './gen/aop/value_pb.js' export * from './gen/aop/content_pb.js' export * from './gen/aop/event_pb.js' export * from './gen/aop/chat_pb.js' -export * from './gen/aiscan/chat/session_pb.js' -export * from './gen/aiscan/scan/scan_pb.js' -export * from './gen/aiscan/transport/terminal_pb.js' +export * from './gen/aop/envelope_pb.js' + +export { + AgentAcceptedSchema, + AgentHelloSchema, + AgentRuntimeInfoSchema, + AgentStatsSchema, + AgentStatusSchema, + CancelOperationSchema, + ProtocolMessageSchema as AOPProtocolMessageSchema, + type ProtocolMessage as AOPProtocolMessage, +} from './gen/aop/protocol_pb.js' + +export { + ProtocolMessageSchema as FileProtocolMessageSchema, + ResultSchema as FileResultSchema, + type ProtocolMessage as FileProtocolMessage, + type Result as FileResult, +} from './gen/aop/file/protocol_pb.js' +export { + ProtocolMessageSchema as ExecProtocolMessageSchema, + type ProtocolMessage as ExecProtocolMessage, +} from './gen/aop/exec/protocol_pb.js' +export { + ProtocolMessageSchema as PtyProtocolMessageSchema, + SessionSchema as PtySessionSchema, + type ProtocolMessage as PtyProtocolMessage, + type Session as PtySession, +} from './gen/aop/pty/protocol_pb.js' +export { + ProtocolMessageSchema as ToolProtocolMessageSchema, + type ProtocolMessage as ToolProtocolMessage, +} from './gen/aop/tool/protocol_pb.js' +export { + ProtocolMessageSchema as SCOProtocolMessageSchema, + type ProtocolMessage as SCOProtocolMessage, +} from './gen/aop/sco/protocol_pb.js' +export * from './client.js' import { fromJson, type JsonValue } from '@bufbuild/protobuf' import { EventSchema, type Event } from './gen/aop/event_pb.js' From 19806f1c9a66686251ba9d9c0b6e6c68e4d7be3a Mon Sep 17 00:00:00 2001 From: M09Ic Date: Sun, 2 Aug 2026 12:00:05 +0800 Subject: [PATCH 3/8] refactor(ui): remove duplicate websocket protocol adapters --- packages/realtime/README.md | 8 +- packages/realtime/src/index.ts | 8 - packages/realtime/src/ws-client.ts | 107 --- packages/terminal/src/index.tsx | 697 ++---------------- packages/viewer/README.md | 2 +- packages/viewer/src/components/APGViewer.tsx | 2 +- .../src/components/chat/LiveChatPanel.tsx | 4 +- .../components/graph/ExecutionTimeline.tsx | 4 +- .../src/components/graph/LiveGraphView.tsx | 2 +- packages/viewer/src/index.ts | 2 +- packages/viewer/src/lib/aop-reducer.ts | 6 +- .../viewer/src/providers/APGEventProvider.tsx | 45 ++ .../src/providers/APGWebSocketProvider.tsx | 97 --- packages/viewer/src/providers/useChatState.ts | 2 +- .../viewer/src/providers/useGraphState.ts | 2 +- 15 files changed, 109 insertions(+), 879 deletions(-) delete mode 100644 packages/realtime/src/ws-client.ts create mode 100644 packages/viewer/src/providers/APGEventProvider.tsx delete mode 100644 packages/viewer/src/providers/APGWebSocketProvider.tsx diff --git a/packages/realtime/README.md b/packages/realtime/README.md index 65ced33..c66a177 100644 --- a/packages/realtime/README.md +++ b/packages/realtime/README.md @@ -1,26 +1,22 @@ # @cyber/realtime -实时通信客户端。提供 Gateway WebSocket 和 SSE 流的封装。 +SSE 工具包。应用 WebSocket 由 `@cyber/aop` 的 `AOPClient` 独占。 ## 导出 | 函数 | 说明 | |------|------| -| `createGatewayRealtimeClient(url, opts)` | 创建 Gateway WebSocket 客户端,支持自动重连、事件监听 | | `streamSse(url, opts)` | SSE 事件流消费,返回异步迭代器 | | `joinUrl(base, path)` | URL 路径拼接工具 | ## 类型 -- `GatewayRealtimeClient` — WebSocket 客户端实例 -- `GatewaySocketEvent` / `GatewaySocketListener` — 事件与监听器 -- `GatewayConnectionListener` — 连接状态监听器 - `SseEvent` / `SseEventListener` — SSE 事件 ## 使用 ```ts -import { createGatewayRealtimeClient, streamSse } from "@cyber/realtime" +import { streamSse } from "@cyber/realtime" ``` 无框架依赖,纯 JavaScript 运行时。 diff --git a/packages/realtime/src/index.ts b/packages/realtime/src/index.ts index 04f4538..c483399 100644 --- a/packages/realtime/src/index.ts +++ b/packages/realtime/src/index.ts @@ -1,11 +1,3 @@ -export { - createGatewayRealtimeClient, - type GatewayRealtimeClient, - type GatewaySocketEvent, - type GatewaySocketListener, - type GatewayConnectionListener, -} from './ws-client' - export { streamSse, joinUrl, diff --git a/packages/realtime/src/ws-client.ts b/packages/realtime/src/ws-client.ts deleted file mode 100644 index 60ffc2b..0000000 --- a/packages/realtime/src/ws-client.ts +++ /dev/null @@ -1,107 +0,0 @@ -export interface GatewaySocketEvent { - data: string - raw: MessageEvent -} - -export type GatewaySocketListener = (event: GatewaySocketEvent) => void -export type GatewayConnectionListener = (connected: boolean) => void - -export interface GatewayRealtimeClient { - connect: () => void - close: () => void - subscribe: (listener: GatewaySocketListener) => () => void - subscribeStatus: (listener: GatewayConnectionListener) => () => void - sendJson: (payload: unknown) => boolean - isConnected: () => boolean -} - -export function createGatewayRealtimeClient(baseUrl: string, reconnectMs = 2000): GatewayRealtimeClient { - const normalizedBaseUrl = normalizeBaseUrl(baseUrl) - const socketUrl = normalizedBaseUrl.replace(/^http/i, 'ws') + '/ws' - const messageListeners = new Set() - const statusListeners = new Set() - let socket: WebSocket | null = null - let reconnectTimer: ReturnType | null = null - let closed = false - let connected = false - - const emitStatus = (next: boolean) => { - if (connected === next) return - connected = next - statusListeners.forEach(listener => listener(connected)) - } - - const clearReconnect = () => { - if (!reconnectTimer) return - clearTimeout(reconnectTimer) - reconnectTimer = null - } - - const scheduleReconnect = () => { - if (closed || reconnectTimer) return - reconnectTimer = setTimeout(() => { - reconnectTimer = null - connect() - }, reconnectMs) - } - - const connect = () => { - if (closed) return - if (socket?.readyState === WebSocket.OPEN || socket?.readyState === WebSocket.CONNECTING) return - try { - const ws = new WebSocket(socketUrl) - socket = ws - ws.onopen = () => emitStatus(true) - ws.onclose = () => { - if (socket === ws) socket = null - emitStatus(false) - scheduleReconnect() - } - ws.onerror = () => ws.close() - ws.onmessage = event => { - messageListeners.forEach(listener => listener({ - data: typeof event.data === 'string' ? event.data : '', - raw: event, - })) - } - } catch { - emitStatus(false) - scheduleReconnect() - } - } - - const close = () => { - closed = true - clearReconnect() - const current = socket - socket = null - current?.close() - emitStatus(false) - } - - return { - connect, - close, - subscribe(listener) { - messageListeners.add(listener) - return () => { messageListeners.delete(listener) } - }, - subscribeStatus(listener) { - statusListeners.add(listener) - listener(connected) - return () => { statusListeners.delete(listener) } - }, - sendJson(payload) { - if (socket?.readyState !== WebSocket.OPEN) return false - socket.send(JSON.stringify(payload)) - return true - }, - isConnected() { - return connected - }, - } -} - -function normalizeBaseUrl(baseUrl: string): string { - return baseUrl.replace(/\/+$/, '') -} diff --git a/packages/terminal/src/index.tsx b/packages/terminal/src/index.tsx index ce2ddb4..ff8233c 100644 --- a/packages/terminal/src/index.tsx +++ b/packages/terminal/src/index.tsx @@ -1,684 +1,85 @@ -import { useCallback, useEffect, useRef, useState, type ComponentType, type Dispatch, type ReactNode, type SetStateAction, type SVGProps } from 'react' +import { useEffect, useRef, type ComponentType, type Dispatch, type ReactNode, type SetStateAction, type SVGProps } from 'react' import { FitAddon } from '@xterm/addon-fit' -import { Terminal as XTerm, type ILink } from '@xterm/xterm' +import { Terminal as XTerm } from '@xterm/xterm' import '@xterm/xterm/css/xterm.css' import { Monitor as LucideMonitor, X as LucideX } from 'lucide-react' import { cn } from '@cyber/theme' -import { create, fromJson, toJson, type JsonValue, type MessageInitShape } from '@bufbuild/protobuf' -import { - TerminalFrameSchema, - TerminalInfoSchema, - type TerminalFrame, - type TerminalInfo, -} from '@cyber/aop' +import { create } from '@bufbuild/protobuf' +import { PtySessionSchema, type PtyProtocolMessage, type PtySession } from '@cyber/aop' import type { Timestamp } from '@bufbuild/protobuf/wkt' const Monitor = LucideMonitor as unknown as ComponentType> const X = LucideX as unknown as ComponentType> export type TerminalStatus = 'connecting' | 'connected' | 'closed' | 'error' +export type PTYFrame = PtyProtocolMessage +export type PTYSession = PtySession -export type PTYFrameType = - | 'open' - | 'opened' - | 'attach' - | 'attached' - | 'input' - | 'output' - | 'resize' - | 'detach' - | 'detached' - | 'kill' - | 'list' - | 'sessions' - | 'closed' - | 'error' - -export type PTYFrame = TerminalFrame -export type PTYFrameInit = MessageInitShape -export type PTYSession = TerminalInfo - -export interface TerminalLink { - text: string - start: number - end: number - value?: string -} - -export interface WebSocketTerminalLabels { - readOnly: string - reconnecting: string - disconnected: string - sessionClosed: string - errorPrefix: string -} - -export interface WebSocketTerminalProps { - actions?: ReactNode - canConnect?: boolean - className?: string - connectUrl: string - initialInput?: string - kind?: string - killOnUnmount?: boolean - labels?: Partial - onCommandComplete?: () => void - onLinkActivate?: (link: TerminalLink) => void - onSessionChange?: (session: PTYSession | null) => void - onStatusChange?: (status: TerminalStatus) => void - reconnectAttempts?: number - reconnectDelayMs?: number - resolveLinks?: (line: string) => TerminalLink[] - sessionName: string - title?: string -} - -const DEFAULT_TERMINAL_LABELS: WebSocketTerminalLabels = { - readOnly: 'Read-only terminal', - reconnecting: 'PTY disconnected, reconnecting…', - disconnected: 'PTY disconnected.', - sessionClosed: '[session closed]', - errorPrefix: '[pty error]', -} - -export function TerminalView({ onReady, className }: { - onReady: (terminal: XTerm, fit: FitAddon) => void - className?: string -}) { +export function TerminalView({ onReady, className }: { onReady: (terminal: XTerm, fit: FitAddon) => void; className?: string }) { const mountRef = useRef(null) const onReadyRef = useRef(onReady) - - useEffect(() => { - onReadyRef.current = onReady - }, [onReady]) - + useEffect(() => { onReadyRef.current = onReady }, [onReady]) useEffect(() => { const mount = mountRef.current if (!mount) return - - const terminal = new XTerm({ - cursorBlink: true, - convertEol: true, - fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', - fontSize: 12, - lineHeight: 1.35, - theme: { - background: '#060a0d', - foreground: '#d7e1ea', - cursor: '#38e38b', - black: '#0b1115', - red: '#ef4444', - green: '#22c55e', - yellow: '#eab308', - blue: '#3b82f6', - magenta: '#a855f7', - cyan: '#22d3ee', - white: '#e5edf4', - }, - }) + const terminal = new XTerm({ cursorBlink: true, convertEol: true, fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace', fontSize: 12, lineHeight: 1.35, theme: { background: '#060a0d', foreground: '#d7e1ea', cursor: '#38e38b' } }) const fit = new FitAddon() terminal.loadAddon(fit) terminal.open(mount) - - const fitTerminal = () => { - try { - fit.fit() - } catch {} - } - requestAnimationFrame(fitTerminal) - const observer = new ResizeObserver(fitTerminal) + const resize = () => { try { fit.fit() } catch {} } + requestAnimationFrame(resize) + const observer = new ResizeObserver(resize) observer.observe(mount) onReadyRef.current(terminal, fit) terminal.focus() - - return () => { - observer.disconnect() - terminal.dispose() - } + return () => { observer.disconnect(); terminal.dispose() } }, []) - - return ( -
-
-
- ) -} - -export function TerminalHeader({ actions, status, title }: { - actions?: ReactNode - status: TerminalStatus - title: string -}) { - return ( -
-
- - {title} - - {status} - -
- {actions &&
{actions}
} -
- ) -} - -export function WebSocketTerminal({ - actions, - canConnect = true, - className, - connectUrl, - initialInput, - kind = 'shell', - killOnUnmount = true, - labels: labelsInput, - onCommandComplete, - onLinkActivate, - onSessionChange, - onStatusChange, - reconnectAttempts = 3, - reconnectDelayMs = 1200, - resolveLinks, - sessionName, - title = 'Terminal', -}: WebSocketTerminalProps) { - const labels = { ...DEFAULT_TERMINAL_LABELS, ...labelsInput } - const [status, setStatus] = useState('connecting') - const [sessionTitle, setSessionTitle] = useState('') - const termRef = useRef(null) - const [readySeq, setReadySeq] = useState(0) - const commandCompleteRef = useRef(onCommandComplete) - const linkActivateRef = useRef(onLinkActivate) - const linksRef = useRef(resolveLinks) - const sessionChangeRef = useRef(onSessionChange) - const statusChangeRef = useRef(onStatusChange) - - commandCompleteRef.current = onCommandComplete - linkActivateRef.current = onLinkActivate - linksRef.current = resolveLinks - sessionChangeRef.current = onSessionChange - statusChangeRef.current = onStatusChange - - const updateStatus = useCallback((next: TerminalStatus) => { - setStatus(next) - statusChangeRef.current?.(next) - }, []) - - const handleReady = useCallback((terminal: XTerm, _fit: FitAddon) => { - termRef.current = terminal - setReadySeq((value) => value + 1) - }, []) - - useEffect(() => { - if (!readySeq) return - const terminal = termRef.current - if (!terminal) return - - terminal.reset() - setSessionTitle('') - sessionChangeRef.current?.(null) - if (!canConnect) { - updateStatus('closed') - terminal.writeln(`\x1b[90m${labels.readOnly}\x1b[0m`) - return - } - - let disposed = false - let socket: WebSocket | null = null - let reconnectTimer = 0 - let reconnects = 0 - let activeSession = '' - let initializedSession = '' - - const send = (message: PTYFrameInit) => { - if (socket?.readyState === WebSocket.OPEN) socket.send(serializePTYFrame(message)) - } - const size = () => ({ cols: terminal.cols, rows: terminal.rows }) - - const dataDisposable = terminal.onData((data) => { - if (!activeSession) return - send({ type: 'input', sessionId: activeSession, data: encodeTerminalData(data) }) - if (/\r|\n/.test(data)) window.setTimeout(() => commandCompleteRef.current?.(), 400) - }) - const resizeDisposable = terminal.onResize(({ cols, rows }) => { - if (activeSession) send({ type: 'resize', sessionId: activeSession, cols, rows }) - }) - const linkProvider = terminal.registerLinkProvider({ - provideLinks(lineNumber, callback) { - const resolver = linksRef.current - if (!resolver) { - callback(undefined) - return - } - const line = terminal.buffer.active.getLine(lineNumber - 1)?.translateToString(true) ?? '' - const links: ILink[] = resolver(line).map((link) => ({ - text: link.text, - range: { - start: { x: link.start + 1, y: lineNumber }, - end: { x: link.end, y: lineNumber }, - }, - activate: () => linkActivateRef.current?.(link), - })) - callback(links.length ? links : undefined) - }, - }) - - const connect = () => { - if (disposed) return - updateStatus('connecting') - const nextSocket = new WebSocket(connectUrl) - socket = nextSocket - - nextSocket.onopen = () => { - reconnects = 0 - updateStatus('connected') - send({ type: 'open', kind, name: sessionName, ...size() }) - } - nextSocket.onmessage = (event) => { - if (typeof event.data !== 'string') return - const message = parsePTYFrame(event.data) - if (!message) return - switch (message.type) { - case 'opened': - case 'attached': { - const session = sessionFromFrame(message) - activeSession = message.sessionId || session?.id || '' - setSessionTitle(session?.name || activeSession) - sessionChangeRef.current?.(session) - updateStatus('connected') - if (activeSession && initialInput && initializedSession !== activeSession) { - initializedSession = activeSession - send({ - type: 'input', - sessionId: activeSession, - data: encodeTerminalData(initialInput), - }) - } - terminal.focus() - break - } - case 'output': - writeTerminalData(terminal, message) - break - case 'closed': - activeSession = '' - setSessionTitle('') - sessionChangeRef.current?.(null) - updateStatus('closed') - terminal.writeln(`\r\n\x1b[90m${labels.sessionClosed}\x1b[0m`) - break - case 'error': - updateStatus('error') - terminal.writeln(`\r\n\x1b[31m${labels.errorPrefix} ${message.error || 'unknown error'}\x1b[0m`) - break - } - } - nextSocket.onerror = () => updateStatus('error') - nextSocket.onclose = () => { - if (socket === nextSocket) socket = null - activeSession = '' - sessionChangeRef.current?.(null) - if (disposed) return - if (reconnects < reconnectAttempts) { - reconnects += 1 - updateStatus('connecting') - terminal.writeln(`\r\n\x1b[90m${labels.reconnecting}\x1b[0m`) - reconnectTimer = window.setTimeout(connect, reconnectDelayMs) - } else { - updateStatus('closed') - terminal.writeln(`\r\n\x1b[90m${labels.disconnected}\x1b[0m`) - } - } - } - - connect() - return () => { - disposed = true - if (reconnectTimer) window.clearTimeout(reconnectTimer) - if (socket?.readyState === WebSocket.OPEN) { - if (killOnUnmount && activeSession) { - socket.send(serializePTYFrame({ type: 'kill', sessionId: activeSession })) - } - socket.send(serializePTYFrame({ type: 'detach', sessionId: activeSession })) - } - socket?.close() - dataDisposable.dispose() - resizeDisposable.dispose() - linkProvider.dispose() - } - }, [ - canConnect, - connectUrl, - initialInput, - killOnUnmount, - kind, - labels.disconnected, - labels.errorPrefix, - labels.readOnly, - labels.reconnecting, - labels.sessionClosed, - readySeq, - reconnectAttempts, - reconnectDelayMs, - sessionName, - updateStatus, - ]) - - return ( -
- - -
- ) -} - -export function SessionNavigator({ - activeID, - emptyText = 'No sessions', - header, - listLabel = 'Sessions', - onSelect, - sessions, - summary, - unreadIDs, -}: { - activeID: string - emptyText?: string - header?: ReactNode - listLabel?: string - onSelect: (session: PTYSession) => void - sessions: PTYSession[] - summary?: string - unreadIDs?: Set -}) { - return ( - - ) -} - -export function SessionButton({ - active, - details, - meta, - onClick, - state, - title, - unread, -}: { - active?: boolean - details?: string - meta?: string - onClick: () => void - state?: string - title: string - unread?: boolean -}) { - return ( - - ) -} - -export function DetailPanel({ children, onClose, title }: { - children: ReactNode - onClose: () => void - title: string -}) { - return ( - - ) -} - -export function DetailGroup({ children, title }: { children: ReactNode; title: string }) { - return ( -
-

{title}

-
{children}
-
- ) -} - -export function DetailRow({ label, mono, value }: { label: string; mono?: boolean; value?: ReactNode }) { - if (value === undefined || value === null || value === '') return null - return ( -
- {label} - {value} -
- ) -} - -export function parsePTYFrame(value: string): PTYFrame | null { - try { - const parsed = fromJson(TerminalFrameSchema, JSON.parse(value) as JsonValue) - return isPTYFrameType(parsed.type) ? parsed : null - } catch { - return null - } + return
} -export function serializePTYFrame(value: PTYFrameInit): string { - return JSON.stringify(toJson(TerminalFrameSchema, create(TerminalFrameSchema, value))) +export function TerminalHeader({ actions, status, title }: { actions?: ReactNode; status: TerminalStatus; title: string }) { + return
{title}{status}
{actions &&
{actions}
}
} -export function encodeTerminalData(value: string): Uint8Array { - return new TextEncoder().encode(value) +export function SessionNavigator({ activeID, emptyText = 'No sessions', header, listLabel = 'Sessions', onSelect, sessions, summary, unreadIDs }: { activeID: string; emptyText?: string; header?: ReactNode; listLabel?: string; onSelect: (session: PTYSession) => void; sessions: PTYSession[]; summary?: string; unreadIDs?: Set }) { + return } -export function writeTerminalData(terminal: XTerm, frame: PTYFrame) { - terminal.write(frameData(frame)) +export function SessionButton({ active, details, meta, onClick, state, title, unread }: { active?: boolean; details?: string; meta?: string; onClick: () => void; state?: string; title: string; unread?: boolean }) { + return } -export function sessionsFromFrame(frame: PTYFrame): PTYSession[] { - return frame.sessions.filter((session) => !!session.id) +export function DetailPanel({ children, onClose, title }: { children: ReactNode; onClose: () => void; title: string }) { + return } +export function DetailGroup({ children, title }: { children: ReactNode; title: string }) { return

{title}

{children}
} +export function DetailRow({ label, mono, value }: { label: string; mono?: boolean; value?: ReactNode }) { if (value === undefined || value === null || value === '') return null; return
{label}{value}
} +export function encodeTerminalData(value: string): Uint8Array { return new TextEncoder().encode(value) } +export function writeTerminalData(terminal: XTerm, frame: PTYFrame) { if (frame.message.case === 'output') terminal.write(new TextDecoder().decode(frame.message.value.data)) } +export function sessionsFromFrame(frame: PTYFrame): PTYSession[] { return frame.message.case === 'sessions' ? frame.message.value.sessions.filter((session) => !!session.id) : [] } export function sessionFromFrame(frame: PTYFrame): PTYSession | null { - if (frame.session?.id) return frame.session - if (!frame.sessionId) return null - return create(TerminalInfoSchema, { - id: frame.sessionId, - kind: frame.kind, - name: frame.name, - command: frame.command, - state: frame.state, - exitCode: frame.exitCode, - }) -} - -export function mergeSession(items: PTYSession[], session: PTYSession): PTYSession[] { - const index = items.findIndex((item) => item.id === session.id) - if (index < 0) return [...items, session] - const next = [...items] - next[index] = create(TerminalInfoSchema, { ...next[index], ...session }) - return next -} - -export function upsertSession(setSessions: Dispatch>, session: PTYSession) { - setSessions((items) => mergeSession(items, session)) -} - -export function compareSessionsByActivity(a: PTYSession, b: PTYSession): number { - // Order strictly by timestamps (both always populated by the backend view). - // Do NOT fold in activity_seq: it is a small per-session event counter that is - // only present for sessions the *current* connection's activity tracker has - // observed, so mixing it with epoch-millisecond timestamps in one subtraction - // produced an incoherent, churning order (finished tasks jumped rank every - // 350ms broadcast). activity_seq stays reserved for unread detection only. - return timestampValue(b.lastActivityAt) - timestampValue(a.lastActivityAt) - || timestampValue(b.startedAt) - timestampValue(a.startedAt) -} - -export function activitySeq(session: PTYSession): number { - return positiveNumber(session.activitySeq) || timestampValue(session.lastActivityAt) || timestampValue(session.startedAt) -} - -export function sessionTitle(session: PTYSession): string { - if (session.name) return session.name - if (session.command) return session.command - if (session.kind === 'repl') return 'Main REPL' - return session.id || 'Session' -} - -export function sessionDetails(session: PTYSession): string { - return [ - `id: ${session.id}`, - session.kind ? `kind: ${session.kind}` : '', - session.state ? `state: ${stateLabel(session.state)}` : '', - session.command ? `command: ${session.command}` : '', - session.pid ? `pid: ${session.pid}` : '', - session.startedAt ? `started: ${formatDateTime(session.startedAt)}` : '', - session.lastActivityAt ? `activity: ${formatDateTime(session.lastActivityAt)}` : '', - ].filter(Boolean).join('\n') -} - -export function stateLabel(state?: string): string { - switch (state) { - case 'running': - return 'running' - case 'completed': - return 'done' - case 'failed': - return 'failed' - case 'killed': - return 'killed' - default: - return state || '' + switch (frame.message.case) { + case 'opened': return frame.message.value.session ?? null + case 'attached': return frame.message.value.session ?? null + case 'closed': return frame.message.value.session ?? null + case 'state': return frame.message.value.session ?? null + default: return null } } - -export function terminalStatusColor(status: TerminalStatus): string { - switch (status) { - case 'connected': - return 'bg-primary/10 text-primary' - case 'connecting': - return 'bg-yellow-400/10 text-yellow-700 dark:text-yellow-300' - case 'error': - return 'bg-destructive/10 text-destructive' - case 'closed': - default: - return 'bg-muted text-muted-foreground' - } -} - -export function formatDateTime(value?: Timestamp | string): string | undefined { - if (!value) return undefined - const date = typeof value === 'string' - ? new Date(value) - : new Date(Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000)) - if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : undefined - return date.toLocaleString() -} - -export function formatBytes(value?: number | bigint): string | undefined { - const n = positiveNumber(value) - if (!n) return undefined - if (n < 1024) return `${n} B` - if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB` - return `${(n / 1024 / 1024).toFixed(1)} MB` -} - -export function positiveNumber(value: unknown): number | undefined { - if (typeof value === 'bigint') return value > 0n ? Number(value) : undefined - return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined -} - -function sessionMeta(session: PTYSession): string { - return [session.kind, session.pid ? `pid ${session.pid}` : '', formatDateTime(session.lastActivityAt)].filter(Boolean).join(' / ') -} - -function stateColor(state?: string): string { - switch (state) { - case 'running': - return 'bg-primary' - case 'completed': - return 'bg-muted-foreground' - case 'failed': - case 'killed': - return 'bg-destructive' - default: - return 'bg-muted-foreground' - } -} - -function stateTextColor(state?: string): string { - switch (state) { - case 'running': - return 'text-primary' - case 'failed': - case 'killed': - return 'text-destructive' - default: - return 'text-muted-foreground' - } -} - -function frameData(frame: PTYFrame): string { - return frame.data.length ? new TextDecoder().decode(frame.data) : '' -} - -function isPTYFrameType(value: unknown): value is PTYFrameType { - return typeof value === 'string' && [ - 'open', 'opened', 'attach', 'attached', 'input', 'output', 'resize', - 'detach', 'detached', 'kill', 'list', 'sessions', 'closed', 'error', - ].includes(value) -} - -function timestampValue(value?: Timestamp): number { - if (!value) return 0 - return Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000) -} +export function mergeSession(items: PTYSession[], session: PTYSession): PTYSession[] { const index = items.findIndex((item) => item.id === session.id); if (index < 0) return [...items, session]; const next = [...items]; next[index] = create(PtySessionSchema, { ...next[index], ...session }); return next } +export function upsertSession(setSessions: Dispatch>, session: PTYSession) { setSessions((items) => mergeSession(items, session)) } +export function compareSessionsByActivity(a: PTYSession, b: PTYSession): number { return timestampValue(b.lastActivityAt) - timestampValue(a.lastActivityAt) || timestampValue(b.startedAt) - timestampValue(a.startedAt) } +export function activitySeq(session: PTYSession): number { return positiveNumber(session.activitySeq) || timestampValue(session.lastActivityAt) || timestampValue(session.startedAt) } +export function sessionTitle(session: PTYSession): string { return session.name || session.command || (session.kind === 'repl' ? 'Main REPL' : session.id || 'Session') } +export function sessionDetails(session: PTYSession): string { return [`id: ${session.id}`, session.kind ? `kind: ${session.kind}` : '', session.state ? `state: ${stateLabel(session.state)}` : '', session.command ? `command: ${session.command}` : '', session.pid ? `pid: ${session.pid}` : '', session.startedAt ? `started: ${formatDateTime(session.startedAt)}` : '', session.lastActivityAt ? `activity: ${formatDateTime(session.lastActivityAt)}` : ''].filter(Boolean).join('\n') } +export function stateLabel(state?: string): string { return state === 'completed' ? 'done' : state || '' } +export function terminalStatusColor(status: TerminalStatus): string { return status === 'connected' ? 'bg-primary/10 text-primary' : status === 'connecting' ? 'bg-yellow-400/10 text-yellow-700 dark:text-yellow-300' : status === 'error' ? 'bg-destructive/10 text-destructive' : 'bg-muted text-muted-foreground' } +export function formatDateTime(value?: Timestamp | string): string | undefined { if (!value) return undefined; const date = typeof value === 'string' ? new Date(value) : new Date(Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000)); return Number.isNaN(date.getTime()) ? (typeof value === 'string' ? value : undefined) : date.toLocaleString() } +export function formatBytes(value?: number | bigint): string | undefined { const n = positiveNumber(value); if (!n) return undefined; if (n < 1024) return `${n} B`; if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`; return `${(n / 1024 / 1024).toFixed(1)} MB` } +export function positiveNumber(value: unknown): number | undefined { if (typeof value === 'bigint') return value > 0n ? Number(value) : undefined; return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined } + +function sessionMeta(session: PTYSession): string { return [session.kind, session.pid ? `pid ${session.pid}` : '', formatDateTime(session.lastActivityAt)].filter(Boolean).join(' / ') } +function stateColor(state?: string): string { return state === 'running' ? 'bg-primary' : state === 'failed' || state === 'killed' ? 'bg-destructive' : 'bg-muted-foreground' } +function stateTextColor(state?: string): string { return state === 'running' ? 'text-primary' : state === 'failed' || state === 'killed' ? 'text-destructive' : 'text-muted-foreground' } +function timestampValue(value?: Timestamp): number { return value ? Number(value.seconds) * 1000 + Math.floor(value.nanos / 1_000_000) : 0 } diff --git a/packages/viewer/README.md b/packages/viewer/README.md index 11f071e..cb4a5c6 100644 --- a/packages/viewer/README.md +++ b/packages/viewer/README.md @@ -34,7 +34,7 @@ APG (Agent Process Graph) 任务查看器。提供实时图谱视图、聊天面 | 组件 | 说明 | |------|------| -| `APGWebSocketProvider` | APG WebSocket 连接管理 | +| `APGEventProvider` | 注入宿主已经解码的 APG/AOP 事件,不拥有传输连接 | | `StaticEventProvider` | 静态事件数据注入 | | `ChatSessionProvider` | 聊天会话状态管理 | | `APGViewer` | 完整的 APG 查看器(Dashboard 级) | diff --git a/packages/viewer/src/components/APGViewer.tsx b/packages/viewer/src/components/APGViewer.tsx index 0d5ebe0..5f3b4d8 100644 --- a/packages/viewer/src/components/APGViewer.tsx +++ b/packages/viewer/src/components/APGViewer.tsx @@ -1,5 +1,5 @@ import { useMemo, useState, type CSSProperties } from 'react' -import { useAPGEvents } from '../providers/APGWebSocketProvider' +import { useAPGEvents } from '../providers/APGEventProvider' import { useTheme } from '../providers/ThemeProvider' import { GitBranch, MessageSquare, Activity, Wifi, WifiOff, List, Sun, Moon } from 'lucide-react' import { reduceExecutionHistoryGraphState } from '../lib/execution-history-graph' diff --git a/packages/viewer/src/components/chat/LiveChatPanel.tsx b/packages/viewer/src/components/chat/LiveChatPanel.tsx index 82da049..8cef0c1 100644 --- a/packages/viewer/src/components/chat/LiveChatPanel.tsx +++ b/packages/viewer/src/components/chat/LiveChatPanel.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react' import { MessageSquare } from 'lucide-react' import { cn } from '@cyber/theme' import { useChatState } from '../../providers/useChatState' -import { useAPGEvents } from '../../providers/APGWebSocketProvider' +import { useAPGEvents } from '../../providers/APGEventProvider' import type { ChatMessage } from '../../lib/event-reducer' import MessageBubble from './MessageBubble' import ToolCallDisplay from './ToolCallDisplay' @@ -83,7 +83,7 @@ export default function LiveChatPanel({ ) } -/** Connected wrapper — pulls data from useChatState() hook (requires APGWebSocketProvider). */ +/** Connected wrapper — pulls data from useChatState() hook (requires APGEventProvider). */ export function ConnectedChatPanel(props: Omit) { const { messages } = useChatState() const { sendInput } = useAPGEvents() diff --git a/packages/viewer/src/components/graph/ExecutionTimeline.tsx b/packages/viewer/src/components/graph/ExecutionTimeline.tsx index ed0293b..bd9f332 100644 --- a/packages/viewer/src/components/graph/ExecutionTimeline.tsx +++ b/packages/viewer/src/components/graph/ExecutionTimeline.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useMemo, type CSSProperties } from 'react' -import { useAPGEvents } from '../../providers/APGWebSocketProvider' +import { useAPGEvents } from '../../providers/APGEventProvider' import { useResolvedTheme } from '../../lib/use-resolved-theme' import { reduceTimeline } from '../../lib/event-reducer' import type { TimelineEntry } from '../../lib/event-reducer' @@ -126,7 +126,7 @@ export default function ExecutionTimeline({ entries, isDark: isDarkProp }: Execu ) } -/** Connected wrapper — pulls data from useAPGEvents() hook (requires APGWebSocketProvider). */ +/** Connected wrapper — pulls data from useAPGEvents() hook (requires APGEventProvider). */ export function ConnectedTimeline({ isDark }: { isDark?: boolean }) { const { events } = useAPGEvents() const entries = useMemo(() => reduceTimeline(events), [events]) diff --git a/packages/viewer/src/components/graph/LiveGraphView.tsx b/packages/viewer/src/components/graph/LiveGraphView.tsx index 1566ab3..8e34304 100644 --- a/packages/viewer/src/components/graph/LiveGraphView.tsx +++ b/packages/viewer/src/components/graph/LiveGraphView.tsx @@ -122,7 +122,7 @@ export default function LiveGraphView({ ) } -/** Connected wrapper — pulls data from useGraphState() hook (requires APGWebSocketProvider). */ +/** Connected wrapper — pulls data from useGraphState() hook (requires APGEventProvider). */ export function ConnectedGraphView(props: Omit) { const { nodes, edges } = useGraphState() return diff --git a/packages/viewer/src/index.ts b/packages/viewer/src/index.ts index 22d2468..a414ee3 100644 --- a/packages/viewer/src/index.ts +++ b/packages/viewer/src/index.ts @@ -55,7 +55,7 @@ export { ConnectedChatPanel } from './components/chat/LiveChatPanel' export { ConnectedTimeline } from './components/graph/ExecutionTimeline' // Layer 2 — Providers & hooks -export { APGWebSocketProvider, StaticEventProvider, useAPGEvents } from './providers/APGWebSocketProvider' +export { APGEventProvider, StaticEventProvider, useAPGEvents, type APGEventSource } from './providers/APGEventProvider' export { ThemeProvider, useTheme } from './providers/ThemeProvider' export { useGraphState } from './providers/useGraphState' export { useChatState } from './providers/useChatState' diff --git a/packages/viewer/src/lib/aop-reducer.ts b/packages/viewer/src/lib/aop-reducer.ts index df7bd54..7305dca 100644 --- a/packages/viewer/src/lib/aop-reducer.ts +++ b/packages/viewer/src/lib/aop-reducer.ts @@ -215,7 +215,7 @@ export function reduceAOPToTimeline( const current = response.tools.find((entry) => entry.id === result.callId) appendTool(response, { id: result.callId, toolName: result.name || current?.toolName || '', toolArgs: current?.toolArgs || '', - result: stringify(contentText(result.output) || encoded(result.detail), MAX_TOOL_RESULT_CHARS), + result: stringify(contentText(result.output), MAX_TOOL_RESULT_CHARS), pending: false, error: result.isError, }) responseByTool.set(key, response) @@ -242,8 +242,8 @@ export function reduceAOPToTimeline( const extension = event.payload.value items.push({ id: unique, kind: 'extension', timestamp: timestamp(event), actorName: event.emitter, - extensionType: extension.type || 'extension', - data: (encoded(extension.value) as Record) ?? {}, + extensionType: extension.typeUrl || 'extension', + data: { typeUrl: extension.typeUrl }, }) break } diff --git a/packages/viewer/src/providers/APGEventProvider.tsx b/packages/viewer/src/providers/APGEventProvider.tsx new file mode 100644 index 0000000..4e4bd1e --- /dev/null +++ b/packages/viewer/src/providers/APGEventProvider.tsx @@ -0,0 +1,45 @@ +import React, { createContext, useContext } from 'react' +import type { APGEvent } from '../types/protocol' + +export interface APGEventSource { + events: APGEvent[] + connected: boolean + sendInput: (content: string) => void +} + +const noop = () => {} + +const APGEventContext = createContext({ + events: [], + connected: false, + sendInput: noop, +}) + +export function useAPGEvents() { + return useContext(APGEventContext) +} + +export function APGEventProvider({ + events, + connected = true, + sendInput = noop, + children, +}: { + events: APGEvent[] + connected?: boolean + sendInput?: (content: string) => void + children: React.ReactNode +}) { + return ( + + {children} + + ) +} + +export function StaticEventProvider({ events, children }: { + events: APGEvent[] + children: React.ReactNode +}) { + return {children} +} diff --git a/packages/viewer/src/providers/APGWebSocketProvider.tsx b/packages/viewer/src/providers/APGWebSocketProvider.tsx deleted file mode 100644 index b520b25..0000000 --- a/packages/viewer/src/providers/APGWebSocketProvider.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, { - createContext, - useContext, - useEffect, - useRef, - useState, - useCallback, -} from 'react' -import type { APGEvent } from '../types/protocol' - -interface APGWebSocketContextValue { - events: APGEvent[] - connected: boolean - sendInput: (content: string) => void -} - -const noop = () => {} - -const APGWebSocketContext = createContext({ - events: [], - connected: false, - sendInput: noop, -}) - -export function useAPGEvents() { - return useContext(APGWebSocketContext) -} - -interface Props { - wsUrl: string - children: React.ReactNode -} - -/** Static event provider — feeds pre-loaded events without WebSocket. */ -export function StaticEventProvider({ events, children }: { - events: APGEvent[] - children: React.ReactNode -}) { - return ( - - {children} - - ) -} - -export function APGWebSocketProvider({ wsUrl, children }: Props) { - const [events, setEvents] = useState([]) - const [connected, setConnected] = useState(false) - const wsRef = useRef(null) - const reconnectTimer = useRef>() - - const connect = useCallback(() => { - if (wsRef.current?.readyState === WebSocket.OPEN) return - - const ws = new WebSocket(wsUrl) - wsRef.current = ws - - ws.onopen = () => setConnected(true) - - ws.onmessage = (e) => { - try { - const event: APGEvent = JSON.parse(e.data) - setEvents((prev) => [...prev, event]) - } catch { - // ignore malformed messages - } - } - - ws.onclose = () => { - setConnected(false) - reconnectTimer.current = setTimeout(connect, 2000) - } - - ws.onerror = () => ws.close() - }, [wsUrl]) - - const sendInput = useCallback((content: string) => { - const ws = wsRef.current - if (ws?.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify({ type: 'user_input', content })) - } - }, []) - - useEffect(() => { - connect() - return () => { - clearTimeout(reconnectTimer.current) - wsRef.current?.close() - } - }, [connect]) - - return ( - - {children} - - ) -} diff --git a/packages/viewer/src/providers/useChatState.ts b/packages/viewer/src/providers/useChatState.ts index d097816..b12cb20 100644 --- a/packages/viewer/src/providers/useChatState.ts +++ b/packages/viewer/src/providers/useChatState.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { useAPGEvents } from './APGWebSocketProvider' +import { useAPGEvents } from './APGEventProvider' import { reduceChatState } from '../lib/event-reducer' import type { ChatState } from '../lib/event-reducer' diff --git a/packages/viewer/src/providers/useGraphState.ts b/packages/viewer/src/providers/useGraphState.ts index 7b1aefd..01c16e4 100644 --- a/packages/viewer/src/providers/useGraphState.ts +++ b/packages/viewer/src/providers/useGraphState.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { useAPGEvents } from './APGWebSocketProvider' +import { useAPGEvents } from './APGEventProvider' import { reduceGraphState } from '../lib/event-reducer' import type { GraphState } from '../lib/event-reducer' From 00f81b0e0d9b0fa72229b2526506360522ce70f6 Mon Sep 17 00:00:00 2001 From: M09Ic Date: Sun, 2 Aug 2026 12:50:44 +0800 Subject: [PATCH 4/8] refactor(aop): use canonical node IDs --- packages/aop/proto/aop/chat.proto | 4 ++-- packages/aop/proto/aop/protocol.proto | 6 +++--- packages/aop/proto/aop/pty/protocol.proto | 4 ++-- packages/aop/src/gen/aop/chat_pb.ts | 10 +++++----- packages/aop/src/gen/aop/protocol_pb.ts | 15 +++++---------- packages/aop/src/gen/aop/pty/protocol_pb.ts | 10 +++++----- 6 files changed, 22 insertions(+), 27 deletions(-) diff --git a/packages/aop/proto/aop/chat.proto b/packages/aop/proto/aop/chat.proto index 3bc425b..ea06066 100644 --- a/packages/aop/proto/aop/chat.proto +++ b/packages/aop/proto/aop/chat.proto @@ -18,14 +18,14 @@ message Rejection { message Session { string id = 1; string state = 2; - string node_uri = 3; + string node_id = 3; string title = 4; } message OpenSessionRequest { reserved 1, 7; string session_id = 2; - string node_uri = 3; + string node_id = 3; string title = 4; string parent_session_id = 5; string parent_tool_call_id = 6; diff --git a/packages/aop/proto/aop/protocol.proto b/packages/aop/proto/aop/protocol.proto index f8118b0..c2ae1c9 100644 --- a/packages/aop/proto/aop/protocol.proto +++ b/packages/aop/proto/aop/protocol.proto @@ -20,9 +20,9 @@ message AgentRuntimeInfo { } message AgentHello { - string agent_id = 1; + string node_id = 1; string name = 2; - string authority = 3; + reserved 3; repeated string capabilities = 4; reserved 5; repeated ToolDefinition tools = 6; @@ -30,7 +30,7 @@ message AgentHello { } message AgentAccepted { - string agent_id = 1; + string node_id = 1; repeated string capabilities = 2; } diff --git a/packages/aop/proto/aop/pty/protocol.proto b/packages/aop/proto/aop/pty/protocol.proto index 3a6f68d..4c8471b 100644 --- a/packages/aop/proto/aop/pty/protocol.proto +++ b/packages/aop/proto/aop/pty/protocol.proto @@ -24,7 +24,7 @@ message Session { message Open { string stream_id = 1; - string node_uri = 2; + string node_id = 2; string kind = 3; string name = 4; string command = 5; @@ -37,7 +37,7 @@ message Opened { string stream_id = 1; Session session = 2; } message Input { string stream_id = 1; bytes data = 2; } message Output { string stream_id = 1; bytes data = 2; int64 offset = 3; } message Resize { string stream_id = 1; int32 cols = 2; int32 rows = 3; } -message List { string stream_id = 1; string node_uri = 2; } +message List { string stream_id = 1; string node_id = 2; } message Sessions { string stream_id = 1; repeated Session sessions = 2; } message Attach { string stream_id = 1; string session_id = 2; int32 cols = 3; int32 rows = 4; } message Attached { string stream_id = 1; Session session = 2; } diff --git a/packages/aop/src/gen/aop/chat_pb.ts b/packages/aop/src/gen/aop/chat_pb.ts index a58a22d..d31c134 100644 --- a/packages/aop/src/gen/aop/chat_pb.ts +++ b/packages/aop/src/gen/aop/chat_pb.ts @@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file aop/chat.proto. */ export const file_aop_chat: GenFile = /*@__PURE__*/ - fileDesc("Cg5hb3AvY2hhdC5wcm90bxIDYW9wIkMKCVJlamVjdGlvbhIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgISgQIBBAFIkUKB1Nlc3Npb24SCgoCaWQYASABKAkSDQoFc3RhdGUYAiABKAkSEAoIbm9kZV91cmkYAyABKAkSDQoFdGl0bGUYBCABKAkitwEKEk9wZW5TZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAIgASgJEhAKCG5vZGVfdXJpGAMgASgJEg0KBXRpdGxlGAQgASgJEhkKEXBhcmVudF9zZXNzaW9uX2lkGAUgASgJEhsKE3BhcmVudF90b29sX2NhbGxfaWQYBiABKAkSKAoKZXh0ZW5zaW9ucxgIIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlKBAgBEAJKBAgHEAgibAoTT3BlblNlc3Npb25SZXNwb25zZRIgCghhY2NlcHRlZBgCIAEoCzIMLmFvcC5TZXNzaW9uSAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZUoECAEQAiK1AQoOUnVuVHVyblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEhsKBWlucHV0GAQgASgLMgwuYW9wLk1lc3NhZ2USGAoQY29udGludWVfc2Vzc2lvbhgFIAEoCBIRCgltYXhfdHVybnMYBiABKA0SKAoKZXh0ZW5zaW9ucxgIIAMoCzIULmdvb2dsZS5wcm90b2J1Zi5BbnlKBAgBEAJKBAgHEAgiQQoLVHVyblJlY2VpcHQSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEg0KBXN0YXRlGAMgASgJImwKD1J1blR1cm5SZXNwb25zZRIkCghhY2NlcHRlZBgCIAEoCzIQLmFvcC5UdXJuUmVjZWlwdEgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWVKBAgBEAIiTgoRQ2FuY2VsVHVyblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIPCgd0dXJuX2lkGAMgASgJEg4KBnJlYXNvbhgEIAEoCUoECAEQAiJvChJDYW5jZWxUdXJuUmVzcG9uc2USJAoIYWNjZXB0ZWQYAiABKAsyEC5hb3AuVHVyblJlY2VpcHRIABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lSgQIARACIj8KE0Nsb3NlU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgCIAEoCRIOCgZyZWFzb24YAyABKAlKBAgBEAIibQoUQ2xvc2VTZXNzaW9uUmVzcG9uc2USIAoIYWNjZXB0ZWQYAiABKAsyDC5hb3AuU2Vzc2lvbkgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWVKBAgBEAIiPgoSV2F0Y2hFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJIjoKDUV2ZW50RGVsaXZlcnkSDgoGY3Vyc29yGAEgASgJEhkKBWV2ZW50GAIgASgLMgouYW9wLkV2ZW50IkwKEUxpc3RFdmVudHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSFAoMYWZ0ZXJfY3Vyc29yGAIgASgJEg0KBWxpbWl0GAMgASgNIk0KEkxpc3RFdmVudHNSZXNwb25zZRIiCgZldmVudHMYASADKAsyEi5hb3AuRXZlbnREZWxpdmVyeRITCgtuZXh0X2N1cnNvchgCIAEoCUIlWiNnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcGIGcHJvdG8z", [file_aop_content, file_aop_event, file_google_protobuf_any]); + fileDesc("Cg5hb3AvY2hhdC5wcm90bxIDYW9wIkMKCVJlamVjdGlvbhIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJcmV0cnlhYmxlGAMgASgISgQIBBAFIkQKB1Nlc3Npb24SCgoCaWQYASABKAkSDQoFc3RhdGUYAiABKAkSDwoHbm9kZV9pZBgDIAEoCRINCgV0aXRsZRgEIAEoCSK2AQoST3BlblNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYAiABKAkSDwoHbm9kZV9pZBgDIAEoCRINCgV0aXRsZRgEIAEoCRIZChFwYXJlbnRfc2Vzc2lvbl9pZBgFIAEoCRIbChNwYXJlbnRfdG9vbF9jYWxsX2lkGAYgASgJEigKCmV4dGVuc2lvbnMYCCADKAsyFC5nb29nbGUucHJvdG9idWYuQW55SgQIARACSgQIBxAIImwKE09wZW5TZXNzaW9uUmVzcG9uc2USIAoIYWNjZXB0ZWQYAiABKAsyDC5hb3AuU2Vzc2lvbkgAEiIKCHJlamVjdGVkGAMgASgLMg4uYW9wLlJlamVjdGlvbkgAQgkKB291dGNvbWVKBAgBEAIitQEKDlJ1blR1cm5SZXF1ZXN0EhIKCnNlc3Npb25faWQYAiABKAkSDwoHdHVybl9pZBgDIAEoCRIbCgVpbnB1dBgEIAEoCzIMLmFvcC5NZXNzYWdlEhgKEGNvbnRpbnVlX3Nlc3Npb24YBSABKAgSEQoJbWF4X3R1cm5zGAYgASgNEigKCmV4dGVuc2lvbnMYCCADKAsyFC5nb29nbGUucHJvdG9idWYuQW55SgQIARACSgQIBxAIIkEKC1R1cm5SZWNlaXB0EhIKCnNlc3Npb25faWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRINCgVzdGF0ZRgDIAEoCSJsCg9SdW5UdXJuUmVzcG9uc2USJAoIYWNjZXB0ZWQYAiABKAsyEC5hb3AuVHVyblJlY2VpcHRIABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lSgQIARACIk4KEUNhbmNlbFR1cm5SZXF1ZXN0EhIKCnNlc3Npb25faWQYAiABKAkSDwoHdHVybl9pZBgDIAEoCRIOCgZyZWFzb24YBCABKAlKBAgBEAIibwoSQ2FuY2VsVHVyblJlc3BvbnNlEiQKCGFjY2VwdGVkGAIgASgLMhAuYW9wLlR1cm5SZWNlaXB0SAASIgoIcmVqZWN0ZWQYAyABKAsyDi5hb3AuUmVqZWN0aW9uSABCCQoHb3V0Y29tZUoECAEQAiI/ChNDbG9zZVNlc3Npb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYAiABKAkSDgoGcmVhc29uGAMgASgJSgQIARACIm0KFENsb3NlU2Vzc2lvblJlc3BvbnNlEiAKCGFjY2VwdGVkGAIgASgLMgwuYW9wLlNlc3Npb25IABIiCghyZWplY3RlZBgDIAEoCzIOLmFvcC5SZWplY3Rpb25IAEIJCgdvdXRjb21lSgQIARACIj4KEldhdGNoRXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEhQKDGFmdGVyX2N1cnNvchgCIAEoCSI6Cg1FdmVudERlbGl2ZXJ5Eg4KBmN1cnNvchgBIAEoCRIZCgVldmVudBgCIAEoCzIKLmFvcC5FdmVudCJMChFMaXN0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEhQKDGFmdGVyX2N1cnNvchgCIAEoCRINCgVsaW1pdBgDIAEoDSJNChJMaXN0RXZlbnRzUmVzcG9uc2USIgoGZXZlbnRzGAEgAygLMhIuYW9wLkV2ZW50RGVsaXZlcnkSEwoLbmV4dF9jdXJzb3IYAiABKAlCJVojZ2l0aHViLmNvbS9jaGFpbnJlYWN0b3JzL2Fpc2Nhbi9hb3BiBnByb3RvMw", [file_aop_content, file_aop_event, file_google_protobuf_any]); /** * @generated from message aop.Rejection @@ -60,9 +60,9 @@ export type Session = Message<"aop.Session"> & { state: string; /** - * @generated from field: string node_uri = 3; + * @generated from field: string node_id = 3; */ - nodeUri: string; + nodeId: string; /** * @generated from field: string title = 4; @@ -87,9 +87,9 @@ export type OpenSessionRequest = Message<"aop.OpenSessionRequest"> & { sessionId: string; /** - * @generated from field: string node_uri = 3; + * @generated from field: string node_id = 3; */ - nodeUri: string; + nodeId: string; /** * @generated from field: string title = 4; diff --git a/packages/aop/src/gen/aop/protocol_pb.ts b/packages/aop/src/gen/aop/protocol_pb.ts index f485a61..b8d1cf3 100644 --- a/packages/aop/src/gen/aop/protocol_pb.ts +++ b/packages/aop/src/gen/aop/protocol_pb.ts @@ -17,7 +17,7 @@ import type { JsonObject, Message } from "@bufbuild/protobuf"; * Describes the file aop/protocol.proto. */ export const file_aop_protocol: GenFile = /*@__PURE__*/ - fileDesc("ChJhb3AvcHJvdG9jb2wucHJvdG8SA2FvcCKdAQoQQWdlbnRSdW50aW1lSW5mbxIQCghob3N0bmFtZRgBIAEoCRIQCgh1c2VybmFtZRgCIAEoCRITCgt3b3JraW5nX2RpchgDIAEoCRIKCgJvcxgEIAEoCRIMCgRhcmNoGAUgASgJEgsKA3BpZBgGIAEoBRIpCghtZXRhZGF0YRgHIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QipwEKCkFnZW50SGVsbG8SEAoIYWdlbnRfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCglhdXRob3JpdHkYAyABKAkSFAoMY2FwYWJpbGl0aWVzGAQgAygJEiIKBXRvb2xzGAYgAygLMhMuYW9wLlRvb2xEZWZpbml0aW9uEiYKB3J1bnRpbWUYByABKAsyFS5hb3AuQWdlbnRSdW50aW1lSW5mb0oECAUQBiI3Cg1BZ2VudEFjY2VwdGVkEhAKCGFnZW50X2lkGAEgASgJEhQKDGNhcGFiaWxpdGllcxgCIAMoCSJoCgtBZ2VudFN0YXR1cxIQCghwcm92aWRlchgBIAEoCRINCgVtb2RlbBgCIAEoCRINCgVzcGFjZRgDIAEoCRINCgVib3VuZBgEIAEoCBIUCgxjb25maWdfZXJyb3IYBiABKAlKBAgFEAYi4AEKCkFnZW50U3RhdHMSDQoFdHVybnMYASABKAQSEgoKdG9vbF9jYWxscxgCIAEoBBIVCg1ydW5uaW5nX3Rvb2xzGAMgASgEEhQKDGlucHV0X3Rva2VucxgEIAEoBBIVCg1vdXRwdXRfdG9rZW5zGAUgASgEEhQKDHRvdGFsX3Rva2VucxgGIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgHIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYCCABKAQSEgoKbGFzdF9ldmVudBgLIAEoCUoECAkQCkoECAoQCyI0Cg9DYW5jZWxPcGVyYXRpb24SEQoJdGFyZ2V0X2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSKqBwoPUHJvdG9jb2xNZXNzYWdlEiYKC2FnZW50X2hlbGxvGAogASgLMg8uYW9wLkFnZW50SGVsbG9IABIsCg5hZ2VudF9hY2NlcHRlZBgLIAEoCzISLmFvcC5BZ2VudEFjY2VwdGVkSAASKAoMYWdlbnRfc3RhdHVzGAwgASgLMhAuYW9wLkFnZW50U3RhdHVzSAASJgoLYWdlbnRfc3RhdHMYDSABKAsyDy5hb3AuQWdlbnRTdGF0c0gAEjcKFG9wZW5fc2Vzc2lvbl9yZXF1ZXN0GBQgASgLMhcuYW9wLk9wZW5TZXNzaW9uUmVxdWVzdEgAEjkKFW9wZW5fc2Vzc2lvbl9yZXNwb25zZRgVIAEoCzIYLmFvcC5PcGVuU2Vzc2lvblJlc3BvbnNlSAASLwoQcnVuX3R1cm5fcmVxdWVzdBgWIAEoCzITLmFvcC5SdW5UdXJuUmVxdWVzdEgAEjEKEXJ1bl90dXJuX3Jlc3BvbnNlGBcgASgLMhQuYW9wLlJ1blR1cm5SZXNwb25zZUgAEjUKE2NhbmNlbF90dXJuX3JlcXVlc3QYGCABKAsyFi5hb3AuQ2FuY2VsVHVyblJlcXVlc3RIABI3ChRjYW5jZWxfdHVybl9yZXNwb25zZRgZIAEoCzIXLmFvcC5DYW5jZWxUdXJuUmVzcG9uc2VIABI5ChVjbG9zZV9zZXNzaW9uX3JlcXVlc3QYGiABKAsyGC5hb3AuQ2xvc2VTZXNzaW9uUmVxdWVzdEgAEjsKFmNsb3NlX3Nlc3Npb25fcmVzcG9uc2UYGyABKAsyGS5hb3AuQ2xvc2VTZXNzaW9uUmVzcG9uc2VIABI3ChR3YXRjaF9ldmVudHNfcmVxdWVzdBgcIAEoCzIXLmFvcC5XYXRjaEV2ZW50c1JlcXVlc3RIABI1ChNsaXN0X2V2ZW50c19yZXF1ZXN0GB0gASgLMhYuYW9wLkxpc3RFdmVudHNSZXF1ZXN0SAASNwoUbGlzdF9ldmVudHNfcmVzcG9uc2UYHiABKAsyFy5hb3AuTGlzdEV2ZW50c1Jlc3BvbnNlSAASGwoFZXZlbnQYHyABKAsyCi5hb3AuRXZlbnRIABIwChBjYW5jZWxfb3BlcmF0aW9uGCggASgLMhQuYW9wLkNhbmNlbE9wZXJhdGlvbkgAEiwKDnByb3RvY29sX2Vycm9yGCkgASgLMhIuYW9wLlByb3RvY29sRXJyb3JIAEIJCgdtZXNzYWdlQiVaI2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wYgZwcm90bzM", [file_aop_chat, file_aop_content, file_aop_event, file_google_protobuf_struct]); + fileDesc("ChJhb3AvcHJvdG9jb2wucHJvdG8SA2FvcCKdAQoQQWdlbnRSdW50aW1lSW5mbxIQCghob3N0bmFtZRgBIAEoCRIQCgh1c2VybmFtZRgCIAEoCRITCgt3b3JraW5nX2RpchgDIAEoCRIKCgJvcxgEIAEoCRIMCgRhcmNoGAUgASgJEgsKA3BpZBgGIAEoBRIpCghtZXRhZGF0YRgHIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QimQEKCkFnZW50SGVsbG8SDwoHbm9kZV9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEhQKDGNhcGFiaWxpdGllcxgEIAMoCRIiCgV0b29scxgGIAMoCzITLmFvcC5Ub29sRGVmaW5pdGlvbhImCgdydW50aW1lGAcgASgLMhUuYW9wLkFnZW50UnVudGltZUluZm9KBAgDEARKBAgFEAYiNgoNQWdlbnRBY2NlcHRlZBIPCgdub2RlX2lkGAEgASgJEhQKDGNhcGFiaWxpdGllcxgCIAMoCSJoCgtBZ2VudFN0YXR1cxIQCghwcm92aWRlchgBIAEoCRINCgVtb2RlbBgCIAEoCRINCgVzcGFjZRgDIAEoCRINCgVib3VuZBgEIAEoCBIUCgxjb25maWdfZXJyb3IYBiABKAlKBAgFEAYi4AEKCkFnZW50U3RhdHMSDQoFdHVybnMYASABKAQSEgoKdG9vbF9jYWxscxgCIAEoBBIVCg1ydW5uaW5nX3Rvb2xzGAMgASgEEhQKDGlucHV0X3Rva2VucxgEIAEoBBIVCg1vdXRwdXRfdG9rZW5zGAUgASgEEhQKDHRvdGFsX3Rva2VucxgGIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgHIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYCCABKAQSEgoKbGFzdF9ldmVudBgLIAEoCUoECAkQCkoECAoQCyI0Cg9DYW5jZWxPcGVyYXRpb24SEQoJdGFyZ2V0X2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSKqBwoPUHJvdG9jb2xNZXNzYWdlEiYKC2FnZW50X2hlbGxvGAogASgLMg8uYW9wLkFnZW50SGVsbG9IABIsCg5hZ2VudF9hY2NlcHRlZBgLIAEoCzISLmFvcC5BZ2VudEFjY2VwdGVkSAASKAoMYWdlbnRfc3RhdHVzGAwgASgLMhAuYW9wLkFnZW50U3RhdHVzSAASJgoLYWdlbnRfc3RhdHMYDSABKAsyDy5hb3AuQWdlbnRTdGF0c0gAEjcKFG9wZW5fc2Vzc2lvbl9yZXF1ZXN0GBQgASgLMhcuYW9wLk9wZW5TZXNzaW9uUmVxdWVzdEgAEjkKFW9wZW5fc2Vzc2lvbl9yZXNwb25zZRgVIAEoCzIYLmFvcC5PcGVuU2Vzc2lvblJlc3BvbnNlSAASLwoQcnVuX3R1cm5fcmVxdWVzdBgWIAEoCzITLmFvcC5SdW5UdXJuUmVxdWVzdEgAEjEKEXJ1bl90dXJuX3Jlc3BvbnNlGBcgASgLMhQuYW9wLlJ1blR1cm5SZXNwb25zZUgAEjUKE2NhbmNlbF90dXJuX3JlcXVlc3QYGCABKAsyFi5hb3AuQ2FuY2VsVHVyblJlcXVlc3RIABI3ChRjYW5jZWxfdHVybl9yZXNwb25zZRgZIAEoCzIXLmFvcC5DYW5jZWxUdXJuUmVzcG9uc2VIABI5ChVjbG9zZV9zZXNzaW9uX3JlcXVlc3QYGiABKAsyGC5hb3AuQ2xvc2VTZXNzaW9uUmVxdWVzdEgAEjsKFmNsb3NlX3Nlc3Npb25fcmVzcG9uc2UYGyABKAsyGS5hb3AuQ2xvc2VTZXNzaW9uUmVzcG9uc2VIABI3ChR3YXRjaF9ldmVudHNfcmVxdWVzdBgcIAEoCzIXLmFvcC5XYXRjaEV2ZW50c1JlcXVlc3RIABI1ChNsaXN0X2V2ZW50c19yZXF1ZXN0GB0gASgLMhYuYW9wLkxpc3RFdmVudHNSZXF1ZXN0SAASNwoUbGlzdF9ldmVudHNfcmVzcG9uc2UYHiABKAsyFy5hb3AuTGlzdEV2ZW50c1Jlc3BvbnNlSAASGwoFZXZlbnQYHyABKAsyCi5hb3AuRXZlbnRIABIwChBjYW5jZWxfb3BlcmF0aW9uGCggASgLMhQuYW9wLkNhbmNlbE9wZXJhdGlvbkgAEiwKDnByb3RvY29sX2Vycm9yGCkgASgLMhIuYW9wLlByb3RvY29sRXJyb3JIAEIJCgdtZXNzYWdlQiVaI2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wYgZwcm90bzM", [file_aop_chat, file_aop_content, file_aop_event, file_google_protobuf_struct]); /** * @generated from message aop.AgentRuntimeInfo @@ -71,20 +71,15 @@ export const AgentRuntimeInfoSchema: GenMessage = /*@__PURE__* */ export type AgentHello = Message<"aop.AgentHello"> & { /** - * @generated from field: string agent_id = 1; + * @generated from field: string node_id = 1; */ - agentId: string; + nodeId: string; /** * @generated from field: string name = 2; */ name: string; - /** - * @generated from field: string authority = 3; - */ - authority: string; - /** * @generated from field: repeated string capabilities = 4; */ @@ -113,9 +108,9 @@ export const AgentHelloSchema: GenMessage = /*@__PURE__*/ */ export type AgentAccepted = Message<"aop.AgentAccepted"> & { /** - * @generated from field: string agent_id = 1; + * @generated from field: string node_id = 1; */ - agentId: string; + nodeId: string; /** * @generated from field: repeated string capabilities = 2; diff --git a/packages/aop/src/gen/aop/pty/protocol_pb.ts b/packages/aop/src/gen/aop/pty/protocol_pb.ts index fbf25f7..232146f 100644 --- a/packages/aop/src/gen/aop/pty/protocol_pb.ts +++ b/packages/aop/src/gen/aop/pty/protocol_pb.ts @@ -12,7 +12,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file aop/pty/protocol.proto. */ export const file_aop_pty_protocol: GenFile = /*@__PURE__*/ - fileDesc("ChZhb3AvcHR5L3Byb3RvY29sLnByb3RvEgdhb3AucHR5IsUCCgdTZXNzaW9uEgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIPCgdjb21tYW5kGAQgASgJEgsKA3BpZBgFIAEoBRIuCgpzdGFydGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI0ChBsYXN0X2FjdGl2aXR5X2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMYWN0aXZpdHlfc2VxGAkgASgDEhQKDG91dHB1dF9ieXRlcxgKIAEoAxIRCglleGl0X2NvZGUYCyABKAUSDQoFc3RhdGUYDCABKAkSEgoKa2lsbF9jYXVzZRgNIAEoCSKVAQoET3BlbhIRCglzdHJlYW1faWQYASABKAkSEAoIbm9kZV91cmkYAiABKAkSDAoEa2luZBgDIAEoCRIMCgRuYW1lGAQgASgJEg8KB2NvbW1hbmQYBSABKAkSDAoEYXJncxgGIAMoCRIMCgRjb2xzGAcgASgFEgwKBHJvd3MYCCABKAUSEQoJc2luZ2xldG9uGAkgASgIIj4KBk9wZW5lZBIRCglzdHJlYW1faWQYASABKAkSIQoHc2Vzc2lvbhgCIAEoCzIQLmFvcC5wdHkuU2Vzc2lvbiIoCgVJbnB1dBIRCglzdHJlYW1faWQYASABKAkSDAoEZGF0YRgCIAEoDCI5CgZPdXRwdXQSEQoJc3RyZWFtX2lkGAEgASgJEgwKBGRhdGEYAiABKAwSDgoGb2Zmc2V0GAMgASgDIjcKBlJlc2l6ZRIRCglzdHJlYW1faWQYASABKAkSDAoEY29scxgCIAEoBRIMCgRyb3dzGAMgASgFIisKBExpc3QSEQoJc3RyZWFtX2lkGAEgASgJEhAKCG5vZGVfdXJpGAIgASgJIkEKCFNlc3Npb25zEhEKCXN0cmVhbV9pZBgBIAEoCRIiCghzZXNzaW9ucxgCIAMoCzIQLmFvcC5wdHkuU2Vzc2lvbiJLCgZBdHRhY2gSEQoJc3RyZWFtX2lkGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSDAoEY29scxgDIAEoBRIMCgRyb3dzGAQgASgFIkAKCEF0dGFjaGVkEhEKCXN0cmVhbV9pZBgBIAEoCRIhCgdzZXNzaW9uGAIgASgLMhAuYW9wLnB0eS5TZXNzaW9uIhsKBkRldGFjaBIRCglzdHJlYW1faWQYASABKAkiHQoIRGV0YWNoZWQSEQoJc3RyZWFtX2lkGAEgASgJIhkKBEtpbGwSEQoJc3RyZWFtX2lkGAEgASgJIhoKBUNsb3NlEhEKCXN0cmVhbV9pZBgBIAEoCSI+CgZDbG9zZWQSEQoJc3RyZWFtX2lkGAEgASgJEiEKB3Nlc3Npb24YAiABKAsyEC5hb3AucHR5LlNlc3Npb24iPQoFU3RhdGUSEQoJc3RyZWFtX2lkGAEgASgJEiEKB3Nlc3Npb24YAiABKAsyEC5hb3AucHR5LlNlc3Npb24iKwoFRXJyb3ISEQoJc3RyZWFtX2lkGAEgASgJEg8KB21lc3NhZ2UYAiABKAkixAQKD1Byb3RvY29sTWVzc2FnZRIdCgRvcGVuGAogASgLMg0uYW9wLnB0eS5PcGVuSAASHwoFaW5wdXQYCyABKAsyDi5hb3AucHR5LklucHV0SAASIQoGb3V0cHV0GAwgASgLMg8uYW9wLnB0eS5PdXRwdXRIABIhCgZyZXNpemUYDSABKAsyDy5hb3AucHR5LlJlc2l6ZUgAEh0KBGxpc3QYDiABKAsyDS5hb3AucHR5Lkxpc3RIABIlCghzZXNzaW9ucxgPIAEoCzIRLmFvcC5wdHkuU2Vzc2lvbnNIABIhCgZhdHRhY2gYECABKAsyDy5hb3AucHR5LkF0dGFjaEgAEiEKBmRldGFjaBgRIAEoCzIPLmFvcC5wdHkuRGV0YWNoSAASHwoFY2xvc2UYEiABKAsyDi5hb3AucHR5LkNsb3NlSAASHwoFc3RhdGUYEyABKAsyDi5hb3AucHR5LlN0YXRlSAASHwoFZXJyb3IYFCABKAsyDi5hb3AucHR5LkVycm9ySAASIQoGb3BlbmVkGBUgASgLMg8uYW9wLnB0eS5PcGVuZWRIABIlCghhdHRhY2hlZBgWIAEoCzIRLmFvcC5wdHkuQXR0YWNoZWRIABIlCghkZXRhY2hlZBgXIAEoCzIRLmFvcC5wdHkuRGV0YWNoZWRIABIdCgRraWxsGBggASgLMg0uYW9wLnB0eS5LaWxsSAASIQoGY2xvc2VkGBkgASgLMg8uYW9wLnB0eS5DbG9zZWRIAEIJCgdtZXNzYWdlQi1aK2dpdGh1Yi5jb20vY2hhaW5yZWFjdG9ycy9haXNjYW4vYW9wL3B0eTtwdHliBnByb3RvMw", [file_google_protobuf_timestamp]); + fileDesc("ChZhb3AvcHR5L3Byb3RvY29sLnByb3RvEgdhb3AucHR5IsUCCgdTZXNzaW9uEgoKAmlkGAEgASgJEgwKBGtpbmQYAiABKAkSDAoEbmFtZRgDIAEoCRIPCgdjb21tYW5kGAQgASgJEgsKA3BpZBgFIAEoBRIuCgpzdGFydGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI0ChBsYXN0X2FjdGl2aXR5X2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMYWN0aXZpdHlfc2VxGAkgASgDEhQKDG91dHB1dF9ieXRlcxgKIAEoAxIRCglleGl0X2NvZGUYCyABKAUSDQoFc3RhdGUYDCABKAkSEgoKa2lsbF9jYXVzZRgNIAEoCSKUAQoET3BlbhIRCglzdHJlYW1faWQYASABKAkSDwoHbm9kZV9pZBgCIAEoCRIMCgRraW5kGAMgASgJEgwKBG5hbWUYBCABKAkSDwoHY29tbWFuZBgFIAEoCRIMCgRhcmdzGAYgAygJEgwKBGNvbHMYByABKAUSDAoEcm93cxgIIAEoBRIRCglzaW5nbGV0b24YCSABKAgiPgoGT3BlbmVkEhEKCXN0cmVhbV9pZBgBIAEoCRIhCgdzZXNzaW9uGAIgASgLMhAuYW9wLnB0eS5TZXNzaW9uIigKBUlucHV0EhEKCXN0cmVhbV9pZBgBIAEoCRIMCgRkYXRhGAIgASgMIjkKBk91dHB1dBIRCglzdHJlYW1faWQYASABKAkSDAoEZGF0YRgCIAEoDBIOCgZvZmZzZXQYAyABKAMiNwoGUmVzaXplEhEKCXN0cmVhbV9pZBgBIAEoCRIMCgRjb2xzGAIgASgFEgwKBHJvd3MYAyABKAUiKgoETGlzdBIRCglzdHJlYW1faWQYASABKAkSDwoHbm9kZV9pZBgCIAEoCSJBCghTZXNzaW9ucxIRCglzdHJlYW1faWQYASABKAkSIgoIc2Vzc2lvbnMYAiADKAsyEC5hb3AucHR5LlNlc3Npb24iSwoGQXR0YWNoEhEKCXN0cmVhbV9pZBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEgwKBGNvbHMYAyABKAUSDAoEcm93cxgEIAEoBSJACghBdHRhY2hlZBIRCglzdHJlYW1faWQYASABKAkSIQoHc2Vzc2lvbhgCIAEoCzIQLmFvcC5wdHkuU2Vzc2lvbiIbCgZEZXRhY2gSEQoJc3RyZWFtX2lkGAEgASgJIh0KCERldGFjaGVkEhEKCXN0cmVhbV9pZBgBIAEoCSIZCgRLaWxsEhEKCXN0cmVhbV9pZBgBIAEoCSIaCgVDbG9zZRIRCglzdHJlYW1faWQYASABKAkiPgoGQ2xvc2VkEhEKCXN0cmVhbV9pZBgBIAEoCRIhCgdzZXNzaW9uGAIgASgLMhAuYW9wLnB0eS5TZXNzaW9uIj0KBVN0YXRlEhEKCXN0cmVhbV9pZBgBIAEoCRIhCgdzZXNzaW9uGAIgASgLMhAuYW9wLnB0eS5TZXNzaW9uIisKBUVycm9yEhEKCXN0cmVhbV9pZBgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIsQECg9Qcm90b2NvbE1lc3NhZ2USHQoEb3BlbhgKIAEoCzINLmFvcC5wdHkuT3BlbkgAEh8KBWlucHV0GAsgASgLMg4uYW9wLnB0eS5JbnB1dEgAEiEKBm91dHB1dBgMIAEoCzIPLmFvcC5wdHkuT3V0cHV0SAASIQoGcmVzaXplGA0gASgLMg8uYW9wLnB0eS5SZXNpemVIABIdCgRsaXN0GA4gASgLMg0uYW9wLnB0eS5MaXN0SAASJQoIc2Vzc2lvbnMYDyABKAsyES5hb3AucHR5LlNlc3Npb25zSAASIQoGYXR0YWNoGBAgASgLMg8uYW9wLnB0eS5BdHRhY2hIABIhCgZkZXRhY2gYESABKAsyDy5hb3AucHR5LkRldGFjaEgAEh8KBWNsb3NlGBIgASgLMg4uYW9wLnB0eS5DbG9zZUgAEh8KBXN0YXRlGBMgASgLMg4uYW9wLnB0eS5TdGF0ZUgAEh8KBWVycm9yGBQgASgLMg4uYW9wLnB0eS5FcnJvckgAEiEKBm9wZW5lZBgVIAEoCzIPLmFvcC5wdHkuT3BlbmVkSAASJQoIYXR0YWNoZWQYFiABKAsyES5hb3AucHR5LkF0dGFjaGVkSAASJQoIZGV0YWNoZWQYFyABKAsyES5hb3AucHR5LkRldGFjaGVkSAASHQoEa2lsbBgYIAEoCzINLmFvcC5wdHkuS2lsbEgAEiEKBmNsb3NlZBgZIAEoCzIPLmFvcC5wdHkuQ2xvc2VkSABCCQoHbWVzc2FnZUItWitnaXRodWIuY29tL2NoYWlucmVhY3RvcnMvYWlzY2FuL2FvcC9wdHk7cHR5YgZwcm90bzM", [file_google_protobuf_timestamp]); /** * @generated from message aop.pty.Session @@ -101,9 +101,9 @@ export type Open = Message<"aop.pty.Open"> & { streamId: string; /** - * @generated from field: string node_uri = 2; + * @generated from field: string node_id = 2; */ - nodeUri: string; + nodeId: string; /** * @generated from field: string kind = 3; @@ -256,9 +256,9 @@ export type List = Message<"aop.pty.List"> & { streamId: string; /** - * @generated from field: string node_uri = 2; + * @generated from field: string node_id = 2; */ - nodeUri: string; + nodeId: string; }; /** From 29dc840a431f45c60bd4bce3aad3ef0a557934fd Mon Sep 17 00:00:00 2001 From: M09Ic Date: Sun, 2 Aug 2026 20:39:24 +0800 Subject: [PATCH 5/8] feat(viewer): restore host customization contracts --- packages/ui/src/sheet.tsx | 8 +- .../src/components/chat/AssistantResponse.tsx | 6 + .../viewer/src/components/chat/ChatInput.tsx | 235 +++++++++++++----- packages/viewer/src/index.ts | 2 +- 4 files changed, 189 insertions(+), 62 deletions(-) diff --git a/packages/ui/src/sheet.tsx b/packages/ui/src/sheet.tsx index c893218..d7197ac 100644 --- a/packages/ui/src/sheet.tsx +++ b/packages/ui/src/sheet.tsx @@ -43,14 +43,16 @@ const sheetVariants = cva( interface SheetContentProps extends React.ComponentPropsWithoutRef, - VariantProps {} + VariantProps { + overlayClassName?: string +} const SheetContent = React.forwardRef< React.ElementRef, SheetContentProps ->(({ side = 'right', className, children, ...props }, ref) => ( +>(({ side = 'right', className, children, overlayClassName, ...props }, ref) => ( - + void tools?: ReactNode response?: ReactNode streaming?: boolean @@ -34,10 +36,12 @@ export default function AssistantResponse({ defaultThinkingExpanded = false, headerClassName, labels, + onThinkingToggle, response, showResponseLabel = true, streaming, thinking, + thinkingExpanded, timestamp, timeLabel, tools, @@ -60,6 +64,8 @@ export default function AssistantResponse({ diff --git a/packages/viewer/src/components/chat/ChatInput.tsx b/packages/viewer/src/components/chat/ChatInput.tsx index 4fcbac4..ac33b06 100644 --- a/packages/viewer/src/components/chat/ChatInput.tsx +++ b/packages/viewer/src/components/chat/ChatInput.tsx @@ -1,5 +1,5 @@ import { useState, useRef, useEffect, useCallback, type DragEvent, type ReactNode } from 'react' -import { AtSign, FileText, Paperclip, Send, Slash, Square, Upload, X } from 'lucide-react' +import { AtSign, FileText, Paperclip, Send, Slash, Square, Upload, Wrench, X } from 'lucide-react' import { cn } from '@cyber/theme' function formatBytes(bytes: number): string { if (bytes < 1024) return bytes + "B"; if (bytes < 1048576) return (bytes / 1024).toFixed(1) + "KB"; return (bytes / 1048576).toFixed(1) + "MB" } @@ -30,6 +30,7 @@ export interface MentionPopupApi { query: string onSelect: (targets: string[]) => void onDismiss: () => void + navigation?: PopupNavigationCommand // Present when the host composer accepts file attachments. A categorized // mention popup (e.g. a "File" entry) calls this to drop the half-typed // "@frag" and open the native file picker, funnelling the choice into the @@ -37,6 +38,13 @@ export interface MentionPopupApi { onAttach?: () => void } +export type PopupNavigationKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight' | 'Enter' + +export interface PopupNavigationCommand { + key: PopupNavigationKey + sequence: number +} + export interface ChatInputProps { onSend: (content: string, attachments?: ChatAttachment[]) => void onPause?: () => void @@ -44,6 +52,7 @@ export interface ChatInputProps { disabled?: boolean placeholder?: string commands?: CommandHint[] + toolCommands?: CommandHint[] mentionables?: Mentionable[] // Replace the default @-mention dropdown with a custom renderer (e.g. a // CSTXTable picker that supports multi-select). When provided, the built-in @@ -69,6 +78,82 @@ function isTextFile(file: File): boolean { return textExts.some((ext) => file.name.toLowerCase().endsWith(ext)) } +type SimplePopupKind = 'command' | 'tool' | 'mention' + +const popupSurfaceClass = 'absolute bottom-[calc(100%+0.5rem)] left-0 right-0 z-30 overflow-hidden rounded-xl border border-border/70 bg-popover/95 shadow-xl backdrop-blur-md animate-in fade-in slide-in-from-bottom-1 duration-150' + +function SuggestionPopup({ + kind, + options, + activeIndex, + onPick, +}: { + kind: SimplePopupKind + options: CommandHint[] + activeIndex: number + onPick: (option: CommandHint) => void +}) { + const listRef = useRef(null) + const meta = kind === 'command' + ? { prefix: '/', label: 'Commands', Icon: Slash, tone: 'text-primary bg-primary/10' } + : kind === 'tool' + ? { prefix: '!', label: 'Tools', Icon: Wrench, tone: 'text-amber-600 bg-amber-500/10 dark:text-amber-400' } + : { prefix: '@', label: 'Mentions', Icon: AtSign, tone: 'text-ai bg-ai/10' } + + useEffect(() => { + const list = listRef.current + const activeOption = list?.querySelector('[role="option"][aria-selected="true"]') + if (!list || !activeOption) return + const listRect = list.getBoundingClientRect() + const optionRect = activeOption.getBoundingClientRect() + if (optionRect.top < listRect.top) { + list.scrollTop -= listRect.top - optionRect.top + } else if (optionRect.bottom > listRect.bottom) { + list.scrollTop += optionRect.bottom - listRect.bottom + } + }, [activeIndex, kind, options.length]) + + return ( +
+
+ {meta.prefix} + {meta.label} + ← ↑ ↓ → · Enter +
+
+ {options.length === 0 && ( +
No matching suggestions
+ )} + {options.map((option, index) => ( + + ))} +
+
+ ) +} + // The asset token being typed under the caret, if any. The '@' must sit at the // start or right after whitespace (so it never fires inside an email like // user@host), and any whitespace closes the token. Returns the '@' index plus @@ -92,6 +177,7 @@ export default function ChatInput({ disabled, placeholder, commands = [], + toolCommands = [], mentionables = [], renderMentionPopup, injectText, @@ -104,6 +190,9 @@ export default function ChatInput({ }: ChatInputProps) { const [draft, setDraft] = useState('') const [showHints, setShowHints] = useState(false) + const [showToolHints, setShowToolHints] = useState(false) + const [activeOptionIndex, setActiveOptionIndex] = useState(0) + const [mentionNavigation, setMentionNavigation] = useState() const [mention, setMention] = useState<{ start: number; query: string } | null>(null) const [attachments, setAttachments] = useState([]) const [dragOver, setDragOver] = useState(false) @@ -126,6 +215,32 @@ export default function ChatInput({ ? mentionables.filter((m) => m.target.toLowerCase().includes(mention.query.toLowerCase())).slice(0, 8) : [] + const matchingCommands = draft.startsWith('/') + ? commands.filter((c) => c.cmd.startsWith(draft.split(' ')[0])) + : commands + const matchingToolCommands = draft.startsWith('!') + ? toolCommands.filter((c) => { + const token = draft.split(/\s/, 1)[0].toLowerCase() + return c.cmd.toLowerCase().startsWith(token) || c.desc.toLowerCase().includes(token.slice(1)) + }) + : toolCommands + const simplePopupKind: SimplePopupKind | null = mention + ? (!renderMentionPopup && matchingMentions.length > 0 ? 'mention' : null) + : showHints + ? 'command' + : showToolHints + ? 'tool' + : null + const simpleOptions: CommandHint[] = simplePopupKind === 'command' + ? matchingCommands + : simplePopupKind === 'tool' + ? matchingToolCommands + : matchingMentions.map((item) => ({ cmd: item.target, desc: item.source || '', usage: item.label })) + + useEffect(() => { + setActiveOptionIndex(0) + }, [simplePopupKind, draft]) + const addFiles = useCallback((files: FileList | File[]) => { const newAttachments: ChatAttachment[] = Array.from(files).map((file) => ({ file, @@ -135,6 +250,21 @@ export default function ChatInput({ setAttachments((prev) => [...prev, ...newAttachments]) }, [contextSizeLimit]) + const openFilePicker = useCallback(() => { + const input = fileInputRef.current + if (!input || disabled) return + try { + if (typeof input.showPicker === 'function') { + input.showPicker() + return + } + } catch { + // Fall through for browsers that expose showPicker but reject it for a + // hidden input. A direct click remains supported by older engines. + } + input.click() + }, [disabled]) + const removeAttachment = useCallback((index: number) => { setAttachments((prev) => prev.filter((_, i) => i !== index)) }, []) @@ -154,6 +284,7 @@ export default function ChatInput({ setDraft('') setAttachments([]) setShowHints(false) + setShowToolHints(false) setMention(null) }, [draft, attachments, disabled, onSend]) @@ -164,18 +295,27 @@ export default function ChatInput({ // handleSend closes over a draft that setDraft('') hasn't cleared yet, can fire // a second identical send off the same keypress and spawn a duplicate run. if (e.nativeEvent.isComposing || e.keyCode === 229) return - // Built-in simple list: Enter resolves a half-typed "@frag" to the top match - // instead of sending it as literal text. - if (mention && !renderMentionPopup && matchingMentions.length > 0 && e.key === 'Enter' && !e.shiftKey) { + if (mention && renderMentionPopup && ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter'].includes(e.key) && !e.shiftKey) { e.preventDefault() - insertMention(matchingMentions[0].target) + setMentionNavigation((previous) => ({ + key: e.key as PopupNavigationKey, + sequence: (previous?.sequence ?? 0) + 1, + })) return } - // A custom popup owns its own selection (click, or its own key handling). - // While it is open, swallow Enter so the message isn't sent out from under - // the picker — Escape dismisses it, and then Enter sends as usual. - if (mention && renderMentionPopup && e.key === 'Enter' && !e.shiftKey) { + if (simplePopupKind && simpleOptions.length > 0 && ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) { e.preventDefault() + const delta = e.key === 'ArrowUp' || e.key === 'ArrowLeft' ? -1 : 1 + setActiveOptionIndex((index) => (index + delta + simpleOptions.length) % simpleOptions.length) + return + } + if (simplePopupKind && e.key === 'Enter' && !e.shiftKey) { + e.preventDefault() + const option = simpleOptions[activeOptionIndex] ?? simpleOptions[0] + if (option) { + if (simplePopupKind === 'mention') insertMention(option.cmd) + else insertCommand(option.cmd) + } return } if (e.key === 'Enter' && !e.shiftKey) { @@ -184,6 +324,7 @@ export default function ChatInput({ } if (e.key === 'Escape') { setShowHints(false) + setShowToolHints(false) setMention(null) } } @@ -191,9 +332,8 @@ export default function ChatInput({ function handleChange(e: React.ChangeEvent) { const value = e.target.value setDraft(value) - if (commands.length > 0) { - setShowHints(value === '/' || (value.startsWith('/') && !value.includes(' '))) - } + setShowHints(value === '/' || (value.startsWith('/') && !value.includes(' '))) + setShowToolHints(value === '!' || (value.startsWith('!') && !value.includes(' '))) const caret = e.target.selectionStart ?? value.length setMention(mentionables.length > 0 || renderMentionPopup ? mentionAt(value, caret) : null) } @@ -210,6 +350,7 @@ export default function ChatInput({ function insertCommand(cmd: string) { setDraft(cmd + ' ') setShowHints(false) + setShowToolHints(false) textareaRef.current?.focus() } @@ -242,7 +383,7 @@ export default function ChatInput({ setDraft(draft.slice(0, mention.start) + draft.slice(caret)) } setMention(null) - fileInputRef.current?.click() + openFilePicker() } function handleDragOver(e: DragEvent) { @@ -295,10 +436,6 @@ export default function ChatInput({ }) }, [injectText]) - const matchingCommands = draft.startsWith('/') - ? commands.filter((c) => c.cmd.startsWith(draft.split(' ')[0])) - : commands - const hasCommands = commands.length > 0 const defaultPlaceholder = hasCommands ? 'Type a message... (/ for commands)' @@ -326,55 +463,30 @@ export default function ChatInput({
)} - {/* command hints popup */} - {showHints && !mention && matchingCommands.length > 0 && ( -
-
- {matchingCommands.map((c) => ( - - ))} -
-
+ {simplePopupKind && ( + { + if (simplePopupKind === 'mention') insertMention(option.cmd) + else insertCommand(option.cmd) + }} + /> )} {/* @-mention popup — custom renderer or built-in simple list */} {mention && renderMentionPopup && ( -
+
{renderMentionPopup({ query: mention.query, onSelect: insertMentions, onDismiss: () => setMention(null), onAttach: enableAttachments ? requestAttach : undefined, + navigation: mentionNavigation, })}
)} - {mention && !renderMentionPopup && matchingMentions.length > 0 && ( -
-
- {matchingMentions.map((m) => ( - - ))} -
-
- )}
{topSlot && ( @@ -432,12 +544,13 @@ export default function ChatInput({ ref={fileInputRef} type="file" multiple - className="hidden" + tabIndex={-1} + className="sr-only" onChange={(e) => { if (e.target.files?.length) { addFiles(e.target.files); e.target.value = '' } }} />