From 4c2618ec59de3f386ae9271149e84cb3621ca316 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Wed, 28 Oct 2026 02:41:29 +0800 Subject: [PATCH] Start Endor purpose discussion with object operation comparison --- apps/docs/public/figures/endor-purpose.svg | 320 +++++++++++++++++++++ apps/docs/src/lib/navigation.ts | 7 + content/docs/04-endor-purpose-draft.md | 42 +++ design/verification/purpose/comparison.png | Bin 0 -> 97293 bytes tools/figures/src/endor_figures/cli.py | 5 + tools/figures/src/endor_figures/purpose.py | 146 ++++++++++ 6 files changed, 520 insertions(+) create mode 100644 apps/docs/public/figures/endor-purpose.svg create mode 100644 content/docs/04-endor-purpose-draft.md create mode 100644 design/verification/purpose/comparison.png create mode 100644 tools/figures/src/endor_figures/purpose.py diff --git a/apps/docs/public/figures/endor-purpose.svg b/apps/docs/public/figures/endor-purpose.svg new file mode 100644 index 0000000..3909302 --- /dev/null +++ b/apps/docs/public/figures/endor-purpose.svg @@ -0,0 +1,320 @@ + + + + +Endor 的意义:从访问程序到操作对象的对比示意 + +ENDOR / WHY OBJECTS +从程序入口,到对象的操作权 +一对概念图:改变用户与 AI 接触系统的基本单位。 +01 +以程序为入口 +OS +进程区 · 圆圈为进程中的对象 +程序 +用户入口 + + + + + + + + + +OS + + + + +2 个进程 + + + + + + + + + + + + + + + + + + + +程序 A + + + + +4 个进程 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +程序 B + + + + +3 个进程 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +程序 C + + + + + +用户 +界面 / Web / API +用户通过程序提供的入口访问功能;对象的组织与操作通常藏在程序内部。 +02 +以对象为操作单位 + + +Endor OS +OS +少量进程 + + + + + + + + + +OS + + + + +进程 + + + + +进程 + + + + +进程 + + + + +Endorphin +对象运行与操作空间 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +对象 +可引用 · 可组合 +按权限操作 + + +用户 + + + + + + +AI + + + + + + + + + + + + + + +选择对象 · 发起操作 +进程数量仅作概念对比,不代表性能测量或固定部署要求。 +圆圈 = 对象 细线 = 对象关系 贝塞尔曲线 = 用户 / AI 对选定对象的操作 +讨论草案 + \ No newline at end of file diff --git a/apps/docs/src/lib/navigation.ts b/apps/docs/src/lib/navigation.ts index 6f2d298..a37681f 100644 --- a/apps/docs/src/lib/navigation.ts +++ b/apps/docs/src/lib/navigation.ts @@ -5,6 +5,13 @@ export type Section = { symbol: string; }; export function sectionFor(slug: string): Section { + if (slug.includes("endor-purpose")) + return { + group: "项目讨论", + label: "讨论草案", + symbol: "○", + description: "逐步讨论 Endor 的意义:从程序入口走向用户与 AI 的对象操作。", + }; if (slug.includes("endor-concepts")) return { group: "架构设计", diff --git a/content/docs/04-endor-purpose-draft.md b/content/docs/04-endor-purpose-draft.md new file mode 100644 index 0000000..7484f25 --- /dev/null +++ b/content/docs/04-endor-purpose-draft.md @@ -0,0 +1,42 @@ +# Endor 的意义:从程序入口到对象操作 + +这篇文档用来逐步整理我们为什么要做 Endor。先记录一个切入点:**把对象的操作权交还给用户与 AI**。后续讨论可以在这里补充、修正,暂不把它写成一份已经定稿的项目宣言。 + +> **讨论草案**:以下是希望探索的系统组织方式。图中进程和对象的数量、对象关系与操作路径都是示意,不表示当前实现或性能测量。 + +## 一对图:我们希望改变什么 + +![从程序入口到对象操作的对比:上图中 OS 分出九个进程,按二、四、三个分为三组,对应三个程序;对象以进程内的随机小圆圈表示,用户通过程序入口访问。下图中 OS 只分出少量进程,承载 Endorphin 的对象关系网络,用户与 AI 用多条贝塞尔曲线直接指向选定对象;OS、进程区与 Endorphin 都位于 Endor OS 边界内](/figures/endor-purpose.svg) + +### 第一张图:用户面对程序 + +从 OS 出发,许多进程组成不同的程序。每个程序可以对应不同数量的进程;图中分别画了两个、四个和三个。进程区里的许多小圆圈表示对象,它们散布在各进程中。 + +用户通常通过程序提供的界面访问能力,也可能通过 Web 或 API。这里想强调的是操作入口:用户先选择程序,再在程序提供的功能中寻找自己要做的事。图中的对象仍然存在,但通常隐藏在程序的组织和入口之后。 + +这是一种用于对照的简化视角,并不是说现有程序都无法开放对象或让外部系统组合能力。 + +### 第二张图:用户与 AI 面对对象 + +仍然从 OS 出发,但这次只画少量进程,用来承载 Endorphin。接下来展开的是许多相互连接的小圆圈:对象不再只作为程序内部的实现细节出现,而成为可以被引用、选择和操作的基本单位。 + +用户与 AI 的多条曲线分别指向部分对象,表达我们希望提供的能力:**在授权范围内,直接找到所需对象,对它们执行操作,并把不同对象的能力组合起来**。图中没有把所有对象都连向用户,因为操作权应当是有范围、可控制的。 + +OS、进程区与 Endorphin 被共同框在 **Endor OS** 的边界内。这是此处对整体系统的命名;是否涉及内核层面的替换、哪些职责由底层 OS 保留,尚未在这张概念图中定义。 + +## 先记录下来的主张 + +我们希望讨论的变化,是让用户与 AI 不必总以一个个程序为唯一操作入口,而能以对象及其关系来组织工作。程序仍可以承担展示、交互和专业工作流;对象则有机会成为跨这些入口引用和组合能力的共同单位。 + +“交还操作权”不是开放任意内存访问,也不是绕过权限。它需要对象能够被明确定位,需要操作接口与授权边界,也需要让用户知道一次操作改变了什么。这些能力怎样落地,还需要后续设计。 + +## 接下来慢慢整理 + +- **对象是什么**:哪些东西应该成为可操作对象,身份和生命周期如何定义? +- **操作权是什么**:读取、修改、调用、组合与委托分别意味着什么,怎样授予和撤销? +- **AI 如何参与**:如何发现对象能力、请求授权,并让操作结果可以检查? +- **程序的位置**:Tessera、Web 与其他程序如何成为同一对象世界的不同入口? +- **运行边界**:对象跨进程、设备、自部署和平台运行时,哪些语义需要保持一致? +- **怎样验证意义**:用什么具体工作流说明这种组织方式给用户带来的变化? + +本文先保留这些问题,随讨论逐项展开。[系统架构](/docs/00-endor-concepts-draft)讨论部署与存储,[节点与对象挂载](/docs/02-mounting-draft)讨论运行位置和挂载边界;这里关注的是它们最终为什么值得做。 diff --git a/design/verification/purpose/comparison.png b/design/verification/purpose/comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..66f00b1766a9cb113452e41323f847a87573c659 GIT binary patch literal 97293 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

HMb9IY(^VRfHlm!mM$d7 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 None: @@ -41,3 +42,7 @@ def main() -> None: deployment = output.parent / "endor-deployment.svg" build_deployment(deployment) print(f"Generated {deployment.relative_to(root)}") + + purpose = output.parent / "endor-purpose.svg" + build_purpose(purpose) + print(f"Generated {purpose.relative_to(root)}") diff --git a/tools/figures/src/endor_figures/purpose.py b/tools/figures/src/endor_figures/purpose.py new file mode 100644 index 0000000..1ff315d --- /dev/null +++ b/tools/figures/src/endor_figures/purpose.py @@ -0,0 +1,146 @@ +"""Paired concept views: application entry points versus authorized object operations.""" +from pathlib import Path +import math +import random +import drawsvg as d +from .architecture import INK, GREEN, BLUE, PURPLE, MUTED, LINE, FONT + + +def build_purpose(output: Path) -> None: + svg = d.Drawing(1800, 1290) + svg.append_title('Endor 的意义:从访问程序到操作对象的对比示意') + svg.append(d.Rectangle(0,0,1800,1290,fill='#fcfdfb')) + rng = random.Random(20261028) + + def text(s,x,y,size=16,color=INK,weight='400',anchor='start'): + svg.append(d.Text(s,size,x,y,fill=color,font_family=FONT,font_weight=weight,text_anchor=anchor)) + + def box(x,y,w,h,fill='white',stroke=LINE,r=12): + svg.append(d.Rectangle(x,y,w,h,rx=r,fill=fill,stroke=stroke,stroke_width=1.3)) + + def wire(points,color=GREEN,arrow=False,dash=None,width=1.5): + p=d.Path(fill='none',stroke=color,stroke_width=width,stroke_linejoin='round',stroke_dasharray=dash) + p.M(*points[0]) + for pt in points[1:]: p.L(*pt) + svg.append(p) + if arrow: + x,y=points[-1]; px,py=points[-2]; a=math.atan2(y-py,x-px) + for sign in [-1,1]: + svg.append(d.Line(x-7*math.cos(a+sign*.48),y-7*math.sin(a+sign*.48),x,y,stroke=color,stroke_width=width)) + + def objects(x,y,w,h,count,color=GREEN,r=3.5): + points=[] + while len(points)r*3.7 for qx,qy in points): points.append((px,py)) + for px,py in points: + svg.append(d.Circle(px,py,r,fill='#eff6f1',stroke=color,stroke_width=1.2)) + return points + + def os(x,y): + for dy in [-21,-3,15]: + svg.append(d.Rectangle(x-40,y+dy,80,13,rx=3,fill='white',stroke=MUTED,stroke_width=1.6)) + svg.append(d.Circle(x-30,y+dy+6,1.5,fill=MUTED)) + svg.append(d.Line(x-17,y+dy+6,x+25,y+dy+6,stroke=MUTED,stroke_width=1.2)) + text('OS',x,y+65,24,INK,'600','middle') + + def person(x,y,ai=False): + if ai: + box(x-20,y-25,40,36,'#f5f1fa',PURPLE,8) + for dx in [-8,8]: svg.append(d.Circle(x+dx,y-8,2,fill=PURPLE)) + wire([(x-8,y+4),(x+8,y+4)],PURPLE) + wire([(x,y-25),(x,y-35)],PURPLE) + svg.append(d.Circle(x,y-38,3,fill='white',stroke=PURPLE)) + else: + svg.append(d.Circle(x,y-20,13,fill='#f1f6f3',stroke=GREEN,stroke_width=1.8)) + svg.append(d.Path(fill='none',stroke=GREEN,stroke_width=1.8).M(x-25,y+23).Q(x-25,y-1,x,y-1).Q(x+25,y-1,x+25,y+23).Z()) + text('AI' if ai else '用户',x,y+57,18,PURPLE if ai else INK,'600','middle') + + text('ENDOR / WHY OBJECTS',40,43,14,GREEN,'600') + text('从程序入口,到对象的操作权',40,90,31,INK,'600') + text('一对概念图:改变用户与 AI 接触系统的基本单位。',40,123,16,MUTED) + + # Panel one: unequal groups of processes map to application boundaries. + text('01',40,181,20,BLUE,'600') + text('以程序为入口',95,181,24,INK,'600') + text('OS',135,225,13,MUTED,'600','middle') + text('进程区 · 圆圈为进程中的对象',585,225,14,MUTED,'500','middle') + text('程序',1100,225,14,MUTED,'600','middle') + text('用户入口',1615,225,14,MUTED,'600','middle') + os(135,414) + wire([(178,414),(250,414),(250,286),(300,286)],BLUE) + wire([(250,414),(250,545),(300,545)],BLUE) + wire([(250,414),(300,414)],BLUE) + for row,(count,cy) in enumerate([(2,286),(4,414),(3,545)]): + box(300,cy-49,570,98,'#f7f9fb') + text(f'{count} 个进程',315,cy-27,11,MUTED) + pw=112 + start=585-(count*pw+(count-1)*16)/2 + for i in range(count): + px=start+i*(pw+16) + box(px,cy-15,pw,53,'white','#c6d8e7',7) + objects(px,cy-14,pw,50,6+rng.randrange(4),BLUE,r=3) + wire([(870,cy),(999,cy)],BLUE,arrow=True) + box(1000,cy-33,200,66,'white','#bdcfdc') + wire([(1013,cy-15),(1187,cy-15)],BLUE,width=1) + text(f'程序 {chr(65+row)}',1100,cy+14,20,INK,'600','middle') + wire([(1568,414),(1400,414),(1400,cy),(1202,cy)],BLUE,arrow=True) + person(1615,414) + text('界面 / Web / API',1394,611,15,BLUE,anchor='middle') + text('用户通过程序提供的入口访问功能;对象的组织与操作通常藏在程序内部。',300,640,16,MUTED) + + # Panel two: OS, a small process pool and Endorphin belong to Endor OS. + text('02',40,709,20,GREEN,'600') + text('以对象为操作单位',95,709,24,INK,'600') + box(40,742,1410,421,'#f8fbf8','#a9cbbd',18) + box(64,758,162,36,'#eaf3ec','none',5) + text('Endor OS',145,783,21,GREEN,'600','middle') + text('OS',135,837,13,MUTED,'600','middle') + text('少量进程',415,837,14,MUTED,'600','middle') + os(135,961) + wire([(178,961),(270,961),(270,886),(335,886)],GREEN) + wire([(270,961),(335,961)],GREEN) + wire([(270,961),(270,1036),(335,1036)],GREEN) + for cy in [886,961,1036]: + box(335,cy-22,160,44,'white','#bdd5c8',7) + text('进程',415,cy+6,15,MUTED,anchor='middle') + wire([(495,cy),(555,cy),(555,961),(615,961)],GREEN,arrow=True,width=1.2) + box(615,807,805,322,'white','#cbded1',14) + text('Endorphin',644,845,25,INK,'600') + text('对象运行与操作空间',644,874,14,MUTED) + # Seeded randomness gives an organic network and reproducible repository assets. + nodes=[] + for i in range(43): + while True: + px,py=rng.uniform(845,1380),rng.uniform(843,1090) + if all(math.hypot(px-qx,py-qy)>33 for qx,qy in nodes): break + nodes.append((px,py)) + edges=set() + for i,(px,py) in enumerate(nodes): + nearest=sorted((math.hypot(px-qx,py-qy),j) for j,(qx,qy) in enumerate(nodes) if j!=i) + for _,j in nearest[:2 if i%3 else 3]: edges.add(tuple(sorted((i,j)))) + for i,j in sorted(edges): wire([nodes[i],nodes[j]],'#c8dcd2',width=1) + selected=sorted(range(len(nodes)),key=lambda i:nodes[i][0],reverse=True)[:7] + for i,(px,py) in enumerate(nodes): + svg.append(d.Circle(px,py,7 if i in selected else 5, + fill='#e5f1e8' if i in selected else 'white', + stroke=GREEN,stroke_width=1.8 if i in selected else 1.2)) + text('对象',647,1000,17,GREEN,'600') + text('可引用 · 可组合',647,1028,13,MUTED) + text('按权限操作',647,1053,13,MUTED) + person(1630,888) + person(1630,1055,ai=True) + # Users/AI reach selected objects with explicit cubic Bezier curves. + for k,i in enumerate(selected): + px,py=nodes[i] + sy=888 if k<4 else 1055 + color=GREEN if k<4 else PURPLE + control_y=790+k*45 + svg.append(d.Path(fill='none',stroke=color,stroke_width=1.7,opacity=.85) + .M(1597,sy).C(1505,control_y,px+90,py-35,px,py)) + svg.append(d.Circle(px,py,10,fill='none',stroke=color,stroke_width=1,opacity=.6)) + text('选择对象 · 发起操作',1620,1196,16,GREEN,anchor='middle') + text('进程数量仅作概念对比,不代表性能测量或固定部署要求。',40,1220,13,MUTED) + text('圆圈 = 对象 细线 = 对象关系 贝塞尔曲线 = 用户 / AI 对选定对象的操作',40,1253,14,MUTED) + text('讨论草案',1730,1253,13,MUTED,anchor='end') + svg.save_svg(str(output))