Explorar o código

docs: update POLYMARKET_LINK_FORMAT.md with new examples and formatting improvements

yb hai 4 semanas
pai
achega
1c15356e23

+ 1 - 0
.obsidian/app.json

@@ -0,0 +1 @@
+{}

+ 1 - 0
.obsidian/appearance.json

@@ -0,0 +1 @@
+{}

+ 33 - 0
.obsidian/core-plugins.json

@@ -0,0 +1,33 @@
+{
+  "file-explorer": true,
+  "global-search": true,
+  "switcher": true,
+  "graph": true,
+  "backlink": true,
+  "canvas": true,
+  "outgoing-link": true,
+  "tag-pane": true,
+  "footnotes": false,
+  "properties": true,
+  "page-preview": true,
+  "daily-notes": true,
+  "templates": true,
+  "note-composer": true,
+  "command-palette": true,
+  "slash-command": false,
+  "editor-status": true,
+  "bookmarks": true,
+  "markdown-importer": false,
+  "zk-prefixer": false,
+  "random-note": false,
+  "outline": true,
+  "word-count": true,
+  "slides": false,
+  "audio-recorder": false,
+  "workspaces": false,
+  "file-recovery": true,
+  "publish": false,
+  "sync": true,
+  "bases": true,
+  "webviewer": false
+}

+ 202 - 0
.obsidian/workspace.json

@@ -0,0 +1,202 @@
+{
+  "main": {
+    "id": "ef1820be991f1d15",
+    "type": "split",
+    "children": [
+      {
+        "id": "b435809757579ea3",
+        "type": "tabs",
+        "children": [
+          {
+            "id": "f3b74f1abf7620d8",
+            "type": "leaf",
+            "state": {
+              "type": "canvas",
+              "state": {
+                "file": "tg-live-game/architecture-v1.canvas",
+                "viewState": {
+                  "x": 237.59502667408128,
+                  "y": -182.60383293028033,
+                  "zoom": -0.6266805013020833
+                }
+              },
+              "icon": "lucide-layout-dashboard",
+              "title": "architecture-v1"
+            }
+          }
+        ]
+      }
+    ],
+    "direction": "vertical"
+  },
+  "left": {
+    "id": "7f73259268161afd",
+    "type": "split",
+    "children": [
+      {
+        "id": "7d59f64e270d78a2",
+        "type": "tabs",
+        "children": [
+          {
+            "id": "cf8a89fa88ac988b",
+            "type": "leaf",
+            "state": {
+              "type": "file-explorer",
+              "state": {
+                "sortOrder": "alphabetical",
+                "autoReveal": false
+              },
+              "icon": "lucide-folder-closed",
+              "title": "文件列表"
+            }
+          },
+          {
+            "id": "76dd8b1d7b56705a",
+            "type": "leaf",
+            "state": {
+              "type": "search",
+              "state": {
+                "query": "",
+                "matchingCase": false,
+                "explainSearch": false,
+                "collapseAll": false,
+                "extraContext": false,
+                "sortOrder": "alphabetical"
+              },
+              "icon": "lucide-search",
+              "title": "搜索"
+            }
+          },
+          {
+            "id": "7f790d20791ecc44",
+            "type": "leaf",
+            "state": {
+              "type": "bookmarks",
+              "state": {},
+              "icon": "lucide-bookmark",
+              "title": "书签"
+            }
+          }
+        ]
+      }
+    ],
+    "direction": "horizontal",
+    "width": 300
+  },
+  "right": {
+    "id": "93884d0cec98b8d0",
+    "type": "split",
+    "children": [
+      {
+        "id": "4ba00e910756ca31",
+        "type": "tabs",
+        "children": [
+          {
+            "id": "503100be685f7ed9",
+            "type": "leaf",
+            "state": {
+              "type": "backlink",
+              "state": {
+                "file": "tg-live-game/architecture-v1.canvas",
+                "collapseAll": false,
+                "extraContext": false,
+                "sortOrder": "alphabetical",
+                "showSearch": false,
+                "searchQuery": "",
+                "backlinkCollapsed": false,
+                "unlinkedCollapsed": true
+              },
+              "icon": "links-coming-in",
+              "title": "architecture-v1 的反向链接列表"
+            }
+          },
+          {
+            "id": "8b0b975b1114fc67",
+            "type": "leaf",
+            "state": {
+              "type": "outgoing-link",
+              "state": {
+                "file": "tg-live-game/architecture-v1.canvas",
+                "linksCollapsed": false,
+                "unlinkedCollapsed": true
+              },
+              "icon": "links-going-out",
+              "title": "architecture-v1 的出链列表"
+            }
+          },
+          {
+            "id": "0812e2d3af287c51",
+            "type": "leaf",
+            "state": {
+              "type": "tag",
+              "state": {
+                "sortOrder": "frequency",
+                "useHierarchy": true,
+                "showSearch": false,
+                "searchQuery": ""
+              },
+              "icon": "lucide-tags",
+              "title": "标签"
+            }
+          },
+          {
+            "id": "bc60ec8ac9397603",
+            "type": "leaf",
+            "state": {
+              "type": "all-properties",
+              "state": {
+                "sortOrder": "frequency",
+                "showSearch": false,
+                "searchQuery": ""
+              },
+              "icon": "lucide-archive",
+              "title": "添加笔记属性"
+            }
+          },
+          {
+            "id": "f86acad0dd5ab15c",
+            "type": "leaf",
+            "state": {
+              "type": "outline",
+              "state": {
+                "file": "tg-live-game/architecture-v1.canvas",
+                "followCursor": false,
+                "showSearch": false,
+                "searchQuery": ""
+              },
+              "icon": "lucide-list",
+              "title": "architecture-v1 的大纲"
+            }
+          }
+        ]
+      }
+    ],
+    "direction": "horizontal",
+    "width": 300,
+    "collapsed": true
+  },
+  "left-ribbon": {
+    "hiddenItems": {
+      "switcher:打开快速切换": false,
+      "graph:查看关系图谱": false,
+      "canvas:新建白板": false,
+      "daily-notes:打开/创建今天的日记": false,
+      "templates:插入模板": false,
+      "command-palette:打开命令面板": false,
+      "bases:创建新数据库": false
+    }
+  },
+  "active": "f3b74f1abf7620d8",
+  "lastOpenFiles": [
+    "tg-live-game/rtsp-cloudflare-stream.canvas",
+    "tg-live-game/discuss-2024-12-31.md",
+    "tg-live-game/architecture-v1.canvas",
+    "tg-live-game",
+    "architecture.canvas",
+    "CODE_OF_CONDUCT.md",
+    "CONTRIBUTING.md",
+    "README.md",
+    "AGENTS.md",
+    "GEMINI.md"
+  ]
+}

+ 32 - 0
architecture.canvas

@@ -0,0 +1,32 @@
+{
+	"nodes":[
+		{"id":"entry_main","type":"text","text":"**vibe-coding-cn**\n/\n\nVibe编程中文知识库\n\n入口文件:\n- README.md\n- AGENTS.md\n- GEMINI.md","x":0,"y":-400,"width":280,"height":160,"color":"1"},
+		{"id":"config_agents","type":"text","text":"**AI配置层**\n/AGENTS.md, /GEMINI.md\n\nAI Agent行为准则\n\n包含:\n- 认知架构\n- Canvas驱动规范\n- 协作协议","x":-350,"y":-180,"width":260,"height":140,"color":"2"},
+		{"id":"i18n_hub","type":"text","text":"**多语言中心**\n/i18n/\n\n27种语言支持\n\n包含:\n- zh/ (中文主站)\n- en/ (英文)\n- ja/, ko/, fr/...","x":350,"y":-180,"width":260,"height":140,"color":"2"},
+		{"id":"docs_hub","type":"text","text":"**文档层**\n/i18n/zh/documents/\n\n方法论与指南\n\n包含:\n- 00-基础指南/\n- 01-AI编程工具/\n- 02-方法论/\n- 03-实战/","x":-500,"y":80,"width":280,"height":160,"color":"3"},
+		{"id":"prompts_hub","type":"text","text":"**提示词库**\n/i18n/zh/prompts/\n\n2000+提示词资产\n\n包含:\n- 00-元提示词/\n- 01-系统提示词/\n- 02-编程提示词/\n- 03-用户提示词/","x":-150,"y":80,"width":280,"height":160,"color":"3"},
+		{"id":"skills_hub","type":"text","text":"**技能模块**\n/i18n/zh/skills/\n\nAI技能定义\n\n包含:\n- 代码审查\n- 重构建议\n- 测试生成","x":200,"y":80,"width":260,"height":140,"color":"3"},
+		{"id":"workflow_hub","type":"text","text":"**工作流**\n/i18n/zh/workflow/\n\n自动化流程\n\n包含:\n- 开发流程\n- 协作规范","x":500,"y":80,"width":240,"height":130,"color":"3"},
+		{"id":"method_canvas","type":"text","text":"**Canvas白板驱动开发**\n/documents/02-方法论/\n\n核心方法论\n\n理念:\n- 图形是第一公民\n- 代码是白板的序列化","x":-500,"y":320,"width":280,"height":140,"color":"4"},
+		{"id":"system_prompts","type":"text","text":"**系统提示词**\n/prompts/01-系统提示词/\n\nAGENTS.md 12个版本\n\n关键:\n- v12 = Canvas驱动版\n- 外部AI工具提示词","x":-150,"y":320,"width":280,"height":140,"color":"4"},
+		{"id":"coding_prompts","type":"text","text":"**编程提示词**\n/prompts/02-编程提示词/\n\n任务级提示词 41+个\n\n场景:\n- 代码生成\n- Bug修复\n- 重构优化","x":200,"y":320,"width":260,"height":140,"color":"4"},
+		{"id":"libs","type":"text","text":"**外部库**\n/libs/\n\n第三方资源\n\n包含:\n- 引用的外部工具\n- 依赖资源","x":500,"y":320,"width":220,"height":120,"color":"5"},
+		{"id":"github_actions","type":"text","text":"**GitHub Actions**\n/.github/\n\nCI/CD自动化\n\n包含:\n- 构建流程\n- 部署脚本","x":0,"y":520,"width":240,"height":120,"color":"6"}
+	],
+	"edges":[
+		{"id":"edge_main_agents","fromNode":"entry_main","fromSide":"left","toNode":"config_agents","toSide":"top","label":"AI行为配置"},
+		{"id":"edge_main_i18n","fromNode":"entry_main","fromSide":"right","toNode":"i18n_hub","toSide":"top","label":"多语言路由"},
+		{"id":"edge_agents_docs","fromNode":"config_agents","fromSide":"bottom","toNode":"docs_hub","toSide":"top","label":"指导文档编写"},
+		{"id":"edge_agents_prompts","fromNode":"config_agents","fromSide":"bottom","toNode":"prompts_hub","toSide":"top","label":"定义提示词规范"},
+		{"id":"edge_i18n_docs","fromNode":"i18n_hub","fromSide":"bottom","toNode":"docs_hub","toSide":"right","label":"文档本地化"},
+		{"id":"edge_i18n_prompts","fromNode":"i18n_hub","fromSide":"bottom","toNode":"prompts_hub","toSide":"right","label":"提示词本地化"},
+		{"id":"edge_i18n_skills","fromNode":"i18n_hub","fromSide":"bottom","toNode":"skills_hub","toSide":"top","label":"技能本地化"},
+		{"id":"edge_i18n_workflow","fromNode":"i18n_hub","fromSide":"bottom","toNode":"workflow_hub","toSide":"top","label":"工作流本地化"},
+		{"id":"edge_docs_canvas","fromNode":"docs_hub","fromSide":"bottom","toNode":"method_canvas","toSide":"top","label":"核心方法论"},
+		{"id":"edge_prompts_system","fromNode":"prompts_hub","fromSide":"bottom","toNode":"system_prompts","toSide":"top","label":"系统级"},
+		{"id":"edge_prompts_coding","fromNode":"prompts_hub","fromSide":"bottom","toNode":"coding_prompts","toSide":"top","label":"任务级"},
+		{"id":"edge_skills_libs","fromNode":"skills_hub","fromSide":"bottom","toNode":"libs","toSide":"top","label":"引用依赖"},
+		{"id":"edge_workflow_github","fromNode":"workflow_hub","fromSide":"bottom","toNode":"github_actions","toSide":"right","label":"触发CI/CD"},
+		{"id":"edge_canvas_system","fromNode":"method_canvas","fromSide":"right","toNode":"system_prompts","toSide":"left","label":"驱动v12提示词"}
+	]
+}

+ 26 - 0
tg-live-game/architecture-v1.canvas

@@ -0,0 +1,26 @@
+{
+	"nodes":[
+		{"id":"hono_backend","type":"text","text":"**tg-live-game-hono**\n后端API服务\n\n技术栈:Hono + Cloudflare Workers\n\n功能:\n- 视频管理 CRUD\n- 直播管理 CRUD\n- Cloudflare Stream API 封装\n\n端口:localhost:8787","x":-1190,"y":-598,"width":280,"height":200,"color":"4"},
+		{"id":"java_service","type":"text","text":"**Java进程管理**\n(待开发)\n\n功能:\n- FFmpeg进程管理\n- 多路流管理\n- Cloudflare API调用\n\n状态:❌ 待实现","x":-402,"y":200,"width":405,"height":240,"color":"1"},
+		{"id":"mac_camera","type":"text","text":"**Mac摄像头**\n\nFaceTime HD Camera\n分辨率:1280x720\n帧率:30fps\n\n状态:✅ 已验证","x":-730,"y":-798,"width":200,"height":140,"color":"3"},
+		{"id":"stream_service","type":"text","text":"**tg-live-game-stream-service**\n推流服务\n\n技术栈:Bash + FFmpeg\n\n功能:\n- Mac摄像头推流 ✅\n- Mac屏幕推流 ✅\n- RTSP输入 ❌ 待实现\n- WHIP输出 ❌ 待实现\n\n协议:RTMPS","x":-340,"y":-828,"width":280,"height":200,"color":"2"},
+		{"id":"todo_list","type":"text","text":"## 待办事项\n\n### v2 目标\n- [ ] RTSP输入支持\n- [ ] WHIP输出支持\n- [ ] Java进程管理\n\n### v3 目标\n- [ ] 多路流管理\n- [ ] 自动重连\n- [ ] 监控告警","x":-20,"y":-1140,"width":415,"height":222,"color":"1"},
+		{"id":"title","type":"text","text":"# TG Live Game 架构 v1\n\n**日期**: 2024-12-31\n**状态**: POC 验证通过\n\n✅ Mac摄像头 → RTMPS → Cloudflare → Web播放","x":-530,"y":-1140,"width":450,"height":205,"color":"6"},
+		{"id":"cloudflare_stream","type":"text","text":"**Cloudflare Stream**\n云端视频服务\n\n功能:\n- RTMPS/SRT/WHIP 接收\n- 实时转码\n- HLS/DASH/WHEP 分发\n- 全球CDN\n- 自动录制\n\n账户:5544eac7cfb260d4fec9467d49513cea","x":-340,"y":-220,"width":280,"height":200,"color":"1"},
+		{"id":"ip_camera","type":"text","text":"**IP摄像头**\n(ONVIF)\n\n协议:RTSP\n\n状态:❌ 待接入","x":-1050,"y":200,"width":350,"height":250,"color":"1"},
+		{"id":"live_input","type":"text","text":"**当前Live Input**\n\nID: 3c1ae1949e76f200feef94b8f7d093ca\n名称: weathered-limit-6442\n\nRTMPS: rtmps://live.cloudflare.com:443/live\nHLS: customer-pj89kn2ke2tcuh19...","x":260,"y":50,"width":410,"height":220,"color":"4"},
+		{"id":"browser","type":"text","text":"**浏览器播放**\n\n播放方式:\n- Cloudflare iframe ✅\n- HLS.js ✅\n- WebRTC/WHEP\n\n延迟:2-5秒 (HLS)","x":260,"y":-240,"width":410,"height":250,"color":"3"},
+		{"id":"web_frontend","type":"text","text":"**tg-live-game-web**\n前端应用\n\n技术栈:Vue 3 + TypeScript + Vite\n\n功能:\n- 摄像头管理\n- 直播管理\n- 视频播放 (HLS/iframe)\n- Stream测试页 ✅\n\n端口:localhost:3000","x":260,"y":-658,"width":410,"height":330,"color":"5"}
+	],
+	"edges":[
+		{"id":"edge_mac_stream","fromNode":"mac_camera","fromSide":"right","toNode":"stream_service","toSide":"left","label":"AVFoundation"},
+		{"id":"edge_stream_cf","fromNode":"stream_service","fromSide":"bottom","toNode":"cloudflare_stream","toSide":"top","label":"RTMPS ✅"},
+		{"id":"edge_cf_browser","fromNode":"cloudflare_stream","fromSide":"right","toNode":"browser","toSide":"left","label":"HLS ✅"},
+		{"id":"edge_hono_cf","fromNode":"hono_backend","fromSide":"bottom","toNode":"cloudflare_stream","toSide":"left","label":"API"},
+		{"id":"edge_web_hono","fromNode":"web_frontend","fromSide":"left","toNode":"hono_backend","toSide":"right","label":"/api/stream"},
+		{"id":"edge_web_browser","fromNode":"web_frontend","fromSide":"bottom","toNode":"browser","toSide":"top","label":"VideoPlayer"},
+		{"id":"edge_ip_java","fromNode":"ip_camera","fromSide":"right","toNode":"java_service","toSide":"left","color":"1","label":"RTSP (待实现)"},
+		{"id":"edge_java_cf","fromNode":"java_service","fromSide":"top","toNode":"cloudflare_stream","toSide":"bottom","color":"1","label":"WHIP (待实现)"},
+		{"id":"edge_cf_live","fromNode":"cloudflare_stream","fromSide":"right","toNode":"live_input","toSide":"left","label":"实例"}
+	]
+}

+ 105 - 0
tg-live-game/discuss-2024-12-31.md

@@ -0,0 +1,105 @@
+# TG Live Game 开发讨论记录
+
+## 2024-12-31
+
+### 今日目标
+快速搭建 POC 验证:Mac 摄像头 → Cloudflare Stream → Web 播放
+
+---
+
+### 项目分析
+
+#### 现有三个项目
+
+| 项目 | 路径 | 技术栈 | 功能 |
+|------|------|--------|------|
+| tg-live-game-hono | /frontend/tg-live-game/ | Hono + Cloudflare Workers | 后端 API 服务 |
+| tg-live-game-stream-service | /frontend/tg-live-game/ | Bash + FFmpeg | 推流脚本 |
+| tg-live-game-web | /frontend/tg-live-game/ | Vue 3 + TypeScript | 前端应用 |
+
+#### 最终目标架构
+```
+IP摄像头 ──RTSP──> FFmpeg ──WHIP──> Cloudflare Stream ──WHEP──> 浏览器
+                     ↑
+                Java进程管理
+```
+
+---
+
+### POC 验证步骤
+
+#### Step 1: 创建 Cloudflare Live Input ✅
+- 登录 Cloudflare Dashboard
+- 进入 Stream → 实时输入 → 创建
+- 获取推流信息:
+  - Live Input ID: `3c1ae1949e76f200feef94b8f7d093ca`
+  - 名称: `weathered-limit-6442`
+  - RTMPS URL: `rtmps://live.cloudflare.com:443/live/`
+  - Stream Key: `a6ab89289f20807d84b56bbb899f296ek3c1ae1949e76f200feef94b8f7d093ca`
+
+#### Step 2: 配置推流服务 ✅
+- 创建 `config/stream.env` 配置文件
+- 填入 RTMP_URL 和 STREAM_KEY
+
+#### Step 3: 开始推流 ✅
+```bash
+cd /Users/yibu/dev_workspace/frontend/tg-live-game/tg-live-game-stream-service
+./scripts/stream-camera.sh
+```
+- 推流成功,码率 1.6 Mbit/s,帧率 29.75 FPS
+
+#### Step 4: 验证播放 ✅
+- Cloudflare iframe 播放成功
+- 播放地址: `https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/3c1ae1949e76f200feef94b8f7d093ca/iframe`
+
+---
+
+### 讨论决策
+
+#### 1. Canvas 驱动开发
+- 使用 Obsidian Canvas 可视化项目架构
+- AI 根据 Canvas 进行编码协作
+- 每天更新一个版本
+
+#### 2. 文件组织
+Canvas 和讨论记录统一放在:
+```
+/Users/yibu/dev_workspace/vibe-coding-cn/tg-live-game/
+├── architecture-v1.canvas      # 架构图 v1
+├── rtsp-cloudflare-stream.canvas  # 方案图
+├── discuss-2024-12-31.md       # 今日讨论
+└── discuss-YYYY-MM-DD.md       # 后续讨论
+```
+
+---
+
+### 下一步计划
+
+#### 短期(v2)
+- [ ] 接入 Web 项目的 stream-test 页面
+- [ ] 启动 hono 后端服务
+- [ ] 通过 API 管理直播
+
+#### 中期(v3)
+- [ ] RTSP 输入支持(接入 IP 摄像头)
+- [ ] WHIP 输出支持(需要 FFmpeg 6.1+)
+- [ ] Java 进程管理服务
+
+#### 长期
+- [ ] 多路流管理
+- [ ] 自动重连机制
+- [ ] 监控告警系统
+
+---
+
+### 相关资源
+
+- Cloudflare 账户 ID: `5544eac7cfb260d4fec9467d49513cea`
+- 客户子域: `customer-pj89kn2ke2tcuh19.cloudflarestream.com`
+- HLS 播放地址: `https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/{video_id}/manifest/video.m3u8`
+
+---
+
+### 备注
+- POC 验证成功,整个链路已跑通
+- Web 项目登录功能需要后端服务支持,暂时用 stream-test 页面测试

+ 24 - 0
tg-live-game/rtsp-cloudflare-stream.canvas

@@ -0,0 +1,24 @@
+{
+	"nodes":[
+		{"id":"title","type":"text","text":"# RTSP → Cloudflare Stream 架构\n\n**目标**:IP摄像头实时推流到Web浏览器\n**延迟**:< 1秒(WebRTC)","x":-100,"y":-450,"width":400,"height":120,"color":"6"},
+		{"id":"camera","type":"text","text":"**IP摄像头**\n(ONVIF)\n\n协议:RTSP\n格式:H.264/H.265\n\n任何支持RTSP的摄像头","x":-600,"y":-200,"width":200,"height":160,"color":"1"},
+		{"id":"ffmpeg","type":"text","text":"**FFmpeg**\n(转码器)\n\n版本要求:6.1+\n输入:RTSP\n输出:WHIP\n\n核心命令:\nffmpeg -i rtsp://... \\\n  -c:v copy \\\n  -f whip {WHIP_URL}","x":-250,"y":-220,"width":240,"height":200,"color":"2"},
+		{"id":"cloudflare","type":"text","text":"**Cloudflare Stream**\n(Live)\n\n接收:WHIP协议\n输出:WHEP协议\n\n优势:\n- 全球CDN\n- 按量付费\n- 低延迟WebRTC","x":120,"y":-220,"width":240,"height":200,"color":"4"},
+		{"id":"browser","type":"text","text":"**Web观众**\n(浏览器)\n\n协议:WHEP\n播放:WebRTC\n\n支持所有现代浏览器","x":500,"y":-200,"width":200,"height":160,"color":"5"},
+		{"id":"java_manager","type":"text","text":"**Java程序**\n(进程管理)\n\n职责:\n- 启动/停止FFmpeg进程\n- 管理多路视频流\n- 调用Cloudflare API\n- 健康检查与重启","x":-250,"y":80,"width":240,"height":160,"color":"3"},
+		{"id":"cf_api","type":"text","text":"**Cloudflare API**\n\n功能:\n- 创建Live Input\n- 获取WHIP URL\n- 管理流状态","x":120,"y":80,"width":240,"height":120,"color":"4"},
+		{"id":"todo_ffmpeg","type":"text","text":"**待解决 #1**\nFFmpeg WHIP支持\n\n需要FFmpeg 6.1+版本\n可能需要自行编译","x":-600,"y":80,"width":200,"height":120,"color":"1"},
+		{"id":"todo_api","type":"text","text":"**待解决 #2**\nCloudflare API集成\n\n动态创建Live Input\n获取WHIP端点URL","x":500,"y":80,"width":200,"height":120,"color":"1"},
+		{"id":"advantages","type":"text","text":"## 方案优势\n\n| 优势 | 说明 |\n|------|------|\n| 低延迟 | WebRTC < 1秒 |\n| 兼容性 | 任何RTSP摄像头 |\n| 可扩展 | Java管理多路流 |\n| 成本低 | 按用量付费 |","x":-100,"y":300,"width":400,"height":160,"color":"6"}
+	],
+	"edges":[
+		{"id":"edge_camera_ffmpeg","fromNode":"camera","fromSide":"right","toNode":"ffmpeg","toSide":"left","label":"RTSP"},
+		{"id":"edge_ffmpeg_cf","fromNode":"ffmpeg","fromSide":"right","toNode":"cloudflare","toSide":"left","label":"WHIP"},
+		{"id":"edge_cf_browser","fromNode":"cloudflare","fromSide":"right","toNode":"browser","toSide":"left","label":"WHEP"},
+		{"id":"edge_java_ffmpeg","fromNode":"java_manager","fromSide":"top","toNode":"ffmpeg","toSide":"bottom","label":"进程管理"},
+		{"id":"edge_java_api","fromNode":"java_manager","fromSide":"right","toNode":"cf_api","toSide":"left","label":"调用API"},
+		{"id":"edge_api_cf","fromNode":"cf_api","fromSide":"top","toNode":"cloudflare","toSide":"bottom","label":"创建Live Input"},
+		{"id":"edge_todo1_ffmpeg","fromNode":"todo_ffmpeg","fromSide":"top","toNode":"ffmpeg","toSide":"bottom","color":"1"},
+		{"id":"edge_todo2_api","fromNode":"todo_api","fromSide":"left","toNode":"cf_api","toSide":"right","color":"1"}
+	]
+}