@ computesdk/ loops (帮助)
不居住在终点站的人的循环:a loops CLI 和本地主机网站 UI, 两者的客户端
@computesdk/pi-loops。扩展是基础——它拥有环路、记录和每一个
能力。 这个软件包没有这些,它驱动引擎.
loops status # what ran here, read straight from the records (no pi process, no tokens)
loops doctor --live # can a round work here? boots serve, runs check, asks the judge to read an image
loops run "<goal>" # a round — the one verb that costs tokens
loops clean | apply | take | rule | questions | answer
loops serve # one browser app for this VM; choose workspaces in the UI
从 npm 安装它是一个命令, 并且这是一个给某人:
npx @computesdk/loops serve
这是一个 真实的 Pi 会话的客户端,而不是重新实施。 聊天状态使用 RPC 和 SSE 而不是
投票或另一个数据库:会议是持久的记录 .pi/loops/ 是一个可以重建的指数 加上它的工作树.
命令、提供者和聊天模式
工作空间是整个应用程序上方的持久水平标签,包括循环检查员.
聊天边栏属于所选的工作空间;当许多工程打开时,标签会独立滚动.
紧凑的对话头打开了完整的仓库细节. 命令(包括模式/提供者行动)
打开通过 /, Ctrl/Cmd K,或紧凑 / 作曲按钮;没有独立的命令或聊天模式按钮.
提供商的设置也可以在第一次聊天之前通过工作空间登入,并通过循环设置提供.
工作空间条,聊天边栏,和谈话在光和暗的主题中使用了明显的中性表面.
使用紧凑 编号 : 控制或按键 计算机/计算机 K键入 / 在作曲中打开相同的键盘可导航菜单.
命令使用一个调色板框架和一个近控. 其他形式和循环设置使用本地模式
对话框/ 工作表; Cmd/ Ctrl K 不将命令堆放在上面, 或取消一个活动提供者连接 .
使用 页:1 浏览和 输入 选择。 模型/提供者表格在准备就绪时重点控制;
enter确认选定的模型。 Pi 选择表
也支持QQ/QQ( 加上 Home/ End), 然后是 Enter/ Space 回答 。 单独浏览从不提交选择.
如果您已经开始新的未提交的草案,即将作出的决定将保持重点.
Pi发现聊天的扩展命令,即时模板,以及技能;其确切名称和出处被显示.
选择一个将它插入作曲者——审查其论点并明确发送。 未知的斜线命令为
拒绝,没有将他们送到模型。 这不是模仿Pi的完整终端接口.
| 应用动作 | 行为 |
|---|---|
/new | 在选中的工作空间创建新应用程序聊天; 保留旧聊天及其草稿 |
/model | 从此作者可用的目录中选择确切的提供者/ 模式 |
/compact | 确认潜在的付费收缩; 显示 Pi 的进步/ 结果而不自动重试 |
/login | 使用 Pi 的 OAuth/ API 键流连接提供者 |
发现的Pi名字赢得了碰撞. 对应的应用程序动作移动到可用的 app: 显示的别名
在菜单中,而不是默默地跟踪扩展名、模板或技能。 模式选择更改父
只聊天;不重写循环角色/尝试配置或全局默认. 模型变化和收缩需要闲置
父且没有运行中的背景循环 。 操作既不取代 Pi 会话,也不创建另一个写入器.
连接提供者 也可以在选择聊天前工作。 Pi 的公有供应商元数据决定了可用的 登录方法。 OAuth 支持浏览器授权、远程 VM 的手动调用/ 代码提示以及设备编码 提供者提供时的流动。 在对话框中完成提供者的指示; 在远程 VM 上, 一个本地主机 重定向可能会在您的笔记本上失败,在这种情况下,将它的完整回调 URL 复制到 Pi 的手动提示中. 闭幕 对话框取消其待定流量 。 过期、取消和服务器关机 清理回调收听器 . 注销不能取消已经承诺的证书或撤销账户赠款.
API 密钥和授权回复只在 JSON 中与被绑起的被绑起的服务器连接. 它们不是用于聊天、URL、日志或浏览器存储的。 Pi拥有证书持久性和OAuth刷新; uI 不复制或执行提供者令牌存储 。 提交密钥需要后续提示 : 已连接 说明Pi确认的持久性,而不是支付费用的核查请求成功. 刚刚打开 对话框列表中存储存在元数据,而不执行已配置的证书命令或签名. 每个服务器有一个有边框的内嵌登录流量;只有在对话框打开/待用时才会对其状态进行民意调查.
登录后,闲置的作家刷新了Pi的公用型号运行时间,没有模型请求或自动型号开关. 捆绑的 SHA 绑定的 RPC 适配器添加了此元数据刷新; 自定义 Pi 可执行文件而不显示重新启动 警告,并且永远不会自动重新启动。 启动延期决定仍然分开,必须答复 在作者的命令/模型可用之前。 循环设置保留角色配置和检查,同时 现在打开共享提供者对话框.
| 内审显示的 | 从何而来 |
|---|---|
| 记录稿 | get_messages 从聊天的 pi --mode rpc 儿童 |
| 一个循环,它的回合,它的分数 | 页:1 loops-state 简介和 loops-round 输入该会话的扩展附件 |
| 当前赢家/ 应用承诺 | 最新的 loops-state 简况( a)best, (中文(简体) ), winner, (中文(简体) ), baseCommit(中文(简体) ) |
| 飞行中一轮 | 页:1 loops-progress 条目在工作时附加( 喉咙; 相位变化总是) |
| 问你的问题 | loops-question 编号 : loops-answer 条目 - 仅附加,所以没有重写 |
| 简短/核准卡 | 扩展名 ctx.ui.select,作为一个 extension_ui_request |
| diffs、截图、工作表 | 仅读取运行的路由和存档镜头 .pi/loops/ |
视觉预览等待实际截图文件,而不是将已配置的输出路径作为图像处理. 无法获取或失败的图像显示一个明确的状态并重试;重试一个图像不会重跑循环. 尝试细节显示存档抓取,而不需要实时服务器或应用候选人. 使用捕获选择器进行实际的桌面/移动截图,并打开截图检查全部大小. 活页仅在真正活的 URL 存在时才使用沙盒 Iframe.
结果问题属于它们的准确运行和回合。 后来执行可以取代它们(包括记录) 相同回合的重试); 过期/ 叠加的卡片会离开需要您, 但需要您继续用它们的理由交谈 . 这来源于Pi的条目,包括现有的历史,从来没有人造答案. 一般询问 在答复或过期前一直开放。 Stale 答题请求被拒绝; 单独停止不回答卡片 .
已完成的结果将衡量标准、候选人检查、更改文件以及下一步合并为一个标题.
循环缩略图占用自己在工作空间下的独立滚动列,并停止控制,旁边
谈话和作曲 并不是浮起的 电话保留了内流水平条.
“应用的跟踪编辑”要求记录引擎 best.applied 执行; 回答应用问题
没有证明成功。 没有这个事实的旧记录仍然未经证实。 已添加/ 删除的文件称为
因为引擎的履带文件应用不包括它们。 应用留在谈话中.
“最佳版本对原文”及其文件列表继续比较第一轮记录的叉子承诺
胜出候选人,甚至在申请、恢复或退职后。 这是历史证据,不是
声明添加/删除的文件已降落在您的离职。 没有原始主播的遗产记录
记录执行- 基准比较; 服务器不会从后一轮中猜出正本或承诺父版本 .
聊天目录来自 Pi 本身: 每个会话头记录其 cwd。 。 。 .
服务器恢复该目录中的确切会话文件; 选择工作空间不能移动聊天 .
Pi仍然是唯一的会话写作机,每个打开的聊天有一个RPC孩子,由它的浏览器订阅者共享.
没有第二笔录店,也没有全工作空间的编辑锁.
workspaces.json 索引会话和持续的工作空间ID,会话位置,以及哪些标签是打开的 .
关闭标签会保留其工作空间、聊天约束和会话 。 恢复可以从会话标题中重建绑定
如果注册簿丢失, 但完整注册簿的封存标签会在整个重启期间关闭.
每个 VM 一个服务器
服务器默认为 127.0.0.1远程监听需要一个无记名符号(在需要时自动生成);
此进程可以提示一个代理 bash 访问,所以保护符作为VM的密码.
SSH隧道是另一个选项(ssh -L 8001:127.0.0.1:8001 …) (中文(简体) ).
后面一个 正在认证反向代理,保持听众的回放,并明确命名其公共来源:
loops serve --public-origin https://my-vm.exe.xyz,https://my-vm.exe.xyz:8001 --no-open
这完全信任那些主机/欧里金的名字,而不是任意的 X-Forwarded-* 头.
代理必须限制谁可以访问应用程序;此旗帜不会添加认证.
不要用它来暴露 一个未经认证的代理人。 见 deploy/loops.service.example
接受监督的离职部署。 重建 并重新启动服务器 更新后; 仅重建SPA
可以让新客户端与旧后端交谈.
运行它
开始一次机器,然后打开工作空间发射器的目录:
npx @computesdk/loops serve # from npm — one server, independent of launch directory
# from a checkout:
loops serve # or: node server/index.ts --port 8001
# optionally seed a workspace:
loops serve --cwd ~/code/some-repo
它作为一个捆绑的服务器以及已建成的SPA来运送,所以在另一端没有建造步骤. 这个 pi-loops 扩展
和 Pi 运行时作为运行时的依赖性安装. 聊天者默认使用捆绑的 Pi RPC 跑道;
--pi <executable> 明确选择另一个 Pi 安装.
它打印地址并打开它:
open http://127.0.0.1:8001
loopback only
--no-open (或 LOOPS_UI_OPEN=0)在不启动浏览器的情况下打印地址。 当 URL 带有一个符号时——关闭
回放——打开的地址是附件表, /?server=…&token=…。应用程序通过它一次,并移除了符号
从地址栏和当前历史条目。 一个非机密的外部服务器地址会留在导航链接中.
一个回路需要引擎,所以靴子说当它缺失时,而不是让你在第一个提示上发现:
如果选中的 Pi 可执行文件或一个 --extensions 路径不存在, 它打印出什么是错的, 并显示在 !! a loop cannot run here yet,以及 /api/health 报告 ok: false 名单相同。 该应用程序仍然服务——您可以添加
重新整理和读取已经运行.
A 类 工作空间是连接 VM 上的目录与其聊天,运行,和 .pi/loops.json。 。 。 .
+ 打开发射装置:选择最近的工作空间,浏览VM目录,或粘贴绝对路径(~/ 工作) (中文(简体) ).
导航链接
工作空间、聊天和循环视图都有可书签的 URL :
/workspaces
/workspaces/<workspace-id>
/workspaces/<workspace-id>/chats/<chat-id>
/workspaces/<workspace-id>/chats/<chat-id>/loops/<run-id>
/workspaces/<workspace-id>/chats/<chat-id>/loops/<run-id>?round=2&attempt=R2-safe
ID和尝试名称是 URL 编码的,持久的标识符,而不是显示标题. 链接支持复制链接,
新建标签、重新装入和浏览器后/前置。 明确的联系优先于记忆中的选择;
惟留下的遗产是赤裸的 / 条目恢复上一个选择,并取而代之的是其具体的 URL.
打开链接从不创建聊天或重新组合其目录 。 已知的封闭工作空间随
同样的身份证。 未知、不可用或不匹配的目标显示错误和恢复链接,而不是另一个
聊天的内容或动作. 回合/尝试焦点根据该聊天的实际循环历史来验证.
当附加到另一个后端时,链接包括 ?server=… (除任何圆/试参数外),
绝不然,绝不然, 接收者需要自己进入服务器 只有服务器链接不能
转发另一个后端保存了证书; 同一来源的认证链接在重新装入时保留了它们的符号 .
一个没有服务器参数的明确链接是指服务UI的出处,而不是 stale add-server的偏好.
Home, Up, breadcrumbs, and Show 隐藏导航服务器的文件系统,而不是浏览器的计算机.
采取者显示 Git 是否有承诺; 打开目录从不初始化 Git 或编辑工程 .
打开目录从不创建聊天. 一个新的工作空间从它的聊天列表开始,没有Pi孩子.
选择已有的聊天或明确创建其中的聊天 新建聊天 在工作空间。 活动全路径保持可见.
返回工作区会恢复其上次选中的聊天( 必要时恢复该作者) ,
为每个连接的服务器分别记住. × 只关闭一个标签: 它不停止它的代理,
删除历史,或更改会话目录。 从最近的工作空间重新打开它.
第一次发射没有隐含的项目; --cwd 可选种子一。 所有标签都可以关闭.
Canonical paths deduducle symmlink 化名,同名目录保留明显的稳定ID,并缺失
目录因无法使用而仍然可见,而不是悄悄地回到另一个工作空间.
如果 Pi 退出, 聊天会保持其诊断性, 而不是在每次阅读时重新启动孩子 . 重试代理 明确在问题解决后重新启动同一会话. 启动扩展决定(包括exe.dev首个运行的LLM设置)可以在浏览器中直接回答. 默认跑者使用 Pi 1. 4.0 的自有 CLI 并带有狭义的内嵌相容性修补: 附加 RPC 输入读取器 在等待启动扩展之前,立即处理他们的答案,并持有普通命令直到设置完成. 它在应用定点前验证被绑定的版本和准确的上游源;没有修改全球Pi文件. Pi仍然拥有会话,扩展,模型配置,以及所有决定.
捆绑的循环扩展是一个倒置: 如果启用了 Pi, 信任的软件包已经提供了
@computesdk/pi-loops,默认的跑取器使用该安装而不是加载第二个副本.
其他扩展仍然有效,真正的冲突仍然失败。 这个选择也是 SHA 所标注的
到 Pi 1. 4.0 资源加载器; 明确 --extensions 或者说 --pi 保留正常的 Pi 加载语义 .
失败的解答提交件仍然可见,但存在可重试错误;循环永远不会接受或拒绝您的集成.
明确 --pi 绕过此兼容运行, 因此可执行文件必须支持启动对话框本身 .
服务器元数据在 ~/.pi/loops-ui;浏览器导航状态和未发送的草稿保存在本地存储中.
草稿和失败的消息被扩展到连接的服务器和聊天. 寄件者保留其草稿直至确认;
错误保留信件以供审查和重试,包括切换聊天或重新加载后.
loops serve 是一个前景服务器命令,而不是附加命令:启动一次(或作为服务对其进行监督),
然后对每个工作空间使用该 URL。 在同一端口再次运行它不会取代或附加第一个进程.
旗 (每个有: LOOPS_UI_* 环境变量 :
| 旗帜 | 默认 | 含义 |
|---|---|---|
--port | 8001 | 应用程序听 |
--cwd | 未设定 | 可选择种子一个工作空间; 发射目录不相关 |
--pi | 捆绑 Pi RPC 跑道 | 明确覆盖 Pi 执行器每个聊天产物 |
--extensions | ../pi-loops/extensions/loop.ts | 逗号分隔 -e 儿童的道路 |
--data | ~/.pi/loops-ui | workspaces.json 和每回波的聊天 |
--host | 127.0.0.1 | 关闭后监听需要一个无记名符号 |
--public-origin | 未设定 | 以逗号分隔的可信认证反向代理的精确来源 |
--model | 皮的默认值 | 每个聊天开始的模型 |
--no-open | 关 | 不打开浏览器而打印 URL ()LOOPS_UI_OPEN=0(中文(简体) ) |
--dev | 关 | 代理 SPA 到 Vite 上 :5173 (单位:千美元)npm run dev(中文(简体) ) |
附着在另一台机器上的服务器
SPA是客户端. 默认情况下,它与服务于它的过程交谈;它可以指另一个过程:
# on the box that owns the repos — off-loopback listening needs a token
node server/index.ts --port 3000 --host 0.0.0.0 --token # prints the URL + token once
# anywhere else: either open the served UI at box:3000, or attach this one to it
http://box:3000/?server=http://box:3000&token=<printed>
这个 server编号 :token 双取一并取出地址栏;之后,边栏页脚取出
服务器。 在一个日志中着陆的 URL 不是一个问题,因为符号生活在
localStorage 之后,但把它当作密码: ~/.pi/loops-ui/token,模式0600, --token 旋转.
API是产品. 任何想要自己的聊天UI,自己的循环画布,或自己的需要 - 您的收件箱应该
用它而不是这个 SPA: 看 API.md 每条路线和循环生命周期,以及 client.ts
对于一个可以直接导入到另一个应用程序的已输入客户端(没有依赖性).
路线是合同,而不是SPA: GET /api/workspaces, (中文(简体) ), /api/chats?ws=, (中文(简体) ), /api/state?chat=, (中文(简体) ), /api/config?chat=, (中文(简体) ),
POST /api/chat|prompt|steer|answer|ui|config|live,以及 每个聊天一个事件流数字 :
GET /api/chats/:id/events Accept: text/event-stream
id: <session entry id> ← the cursor; send it back as Last-Event-ID after a drop
event: state ← the same snapshot /api/state returns
event: ping ← keep-alive every 20s
SSE 结束 fetch (无) EventSource)所以信使可以在信头中行走,所以从光标中恢复连接
而不是开始盲目.
循环回放的服务器只回答它自己的源头( N)127.0.0.1, (中文(简体) ), localhost, (中文(简体) ), [::1] 并且只在这些港口下
名称 Host 页眉 — 下半部分是将自己的主机名指向 127.0.0.1 财务报告和审定财务报表
成为同一起源。 循环服务器对此不需要任何令牌,因为边界就是名称. 一旦该端口
可从机器上取出代号是授权,任何来源都可以附加; --allow-origin a,b 缩小它.
它的构成
server/
index.ts Hono: /api/state, /api/prompt, /api/ui, /api/steer, /api/shot, /api/diff, /ws, static
chats.ts one Chat per session: spawns `pi --mode rpc`, folds its events into one snapshot
pi-rpc.ts the RPC client: JSONL framing, id correlation, extension dialogs
runs.ts the durable session entries first, the `.pi/loops` index as fallback -> the shapes the canvas draws
workspaces.ts the repos this process may touch; chats are bound to one
directories.ts bounded, authenticated directory browsing on the server
config.ts settings with provenance, agent-write proposals, and the doctor checks
live.ts one live server for the winner, on demand
src/
shared/ the wire types both halves use
client/ the SPA (React 19 + Tailwind v4), ported from the POC at ~/factory/mock
为什么一个事件流 而不是民意调查
循环运行 一、导 言 皮语: loop 工具在回合开始后立即返回,回合卡到达
后为谕. 在一个很好终点站——状态线和卡已经足够了. 画布需要更多 所以
扩展附件 a loops-progress 输入(每1.5秒最多一个,总是在阶段变化)和呼叫 setStatus,哪个
到达我们作为一个 extension_ui_request中, 服务器会用光标重新读取会话
(单位:千美元)get_entries?since=) (中文(简体) ). 一个事件,最多一个便宜的读出, 一个重新装入中回合的浏览器重建同样的
图片从单条目.
法官看到照片的证据
一个从未收到过影像的裁判
reasons: "Image unavailable" 旁边是5比5的"Tie" 两种机制使得无法错过:
- 先检查申报的能力. 法官(或小组成员),其模型不声称图像输入是 在尝试运行前被拒绝, 设置要改变 。 没有模特,没有圆.
- 每个有判断力的截图 右上角都有密码. 法官必须读回来
(单位:千美元)
"tokens": {"<label>": "<code>"}); 将一个编辑分解为一个错误读取的计数,其他的都完全不计数. A 类 未读回代码的候选人是unseen: 它会得到 无分数,圆是标记 无结论 (决不是"甚至"),并被提出一个问题——重试,调换法官,或保持当前最好的.
代码仅活于像素中,因此无法从快取回. lib/shot.ts 标记
(单位:千美元)stamp, (中文(简体) ), canaryImage, (中文(简体) ), lib/judge.ts 比较sameCode),以及 probeVision() 可以解决模型的
能力离线——不是在工具呼叫中,在启动一个会话时等待转弯的运行时间.
直播:一个服务器,按要求
一个截图是一个已经运行的应用程序的静态—— lib/shot.ts 开始 serve 在工作树上
这个. Run it 让同一个服务器为赢家活着:一个插槽,当您问起,当您停止时杀死
10分钟后,或者当这个过程退出。 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}只有回扣已经付了 serve 内
.pi/loops.jsoniframe 获得不透明来源(sandbox,没有 allow-same-origin因为里面的代码是
由尝试编写.
判断发生在儿童过程中
会期 prompt(text, { images }) 不提供图片在这个 Pi 上
提供方请求不会,所以需要查看截图的法官会通过 pi --print (同一个二进制,
模型和认证,与 @file 参数,其中包含图像。 两条管线规则都很重要,而且都花了很多钱
每个: 关闭 stdin (ignore)或(或) --print 等待永远的EOF, 和剖析 仅退出 (pi在stderr上发出警告).
退票不是试图触摸
尝试已经崩溃并继承了 repo 的绝对路径, 这样它就可以编辑或承诺您的退出, 而不是它的退出
工作树。 因此,每轮检查,在尝试之后:头部是否移动,工作树是否得到改变,而
每一个尝试 自己的工作树 停留在基地? 如果是这样的话,则回合无结果(他们无一例外)
比较一下,你的树被放回去,卡片上写着发生了什么——循环的保证是,你的退票是
未触及至 loop_apply。 。 。 .
清理
工作树是刮痕的复制品:承诺者生活在收割地和树枝上 loops/<run>/rN-<style>因此删除一个
工作树只损失了 尝试没有承诺. clean up (或 /loop clean [run|all])移除尝试'
工作树 掉掉掉的树枝和跑道 git worktree prune保持胜利者的工作树 持久会议
快照,JSON索引,会话和存档截图. loop_apply 尽快为失败者做
胜利者着陆.
在您下面更改的设置
.pi/loops.json 决定哪个模型判断,什么是检查和多少运行。 服务器看它和应用程序
显示变化( e)models judge exe/… → particle/…) 当它打开时——代理编辑配置是一个真实的事件,而不是
一个细节.
行动
按钮对着引擎,而不是对一个模型: /loop take, (中文(简体) ), /loop apply, (中文(简体) ), /loop stop, (中文(简体) ), /loop rule, (中文(简体) ), /loop talk, (中文(简体) ),
/loop answer需要判断的任何东西("再两回合","按此方式")都会作为信息发送给特工,
因为这是代理商的决定.
停止响应 中止当前聊天的父回合 . 停止循环 只取消命名的背景运行, 即使同时 父母忙碌;其工作树木会留下。 控制器只在目标活跃时出现 除了作曲家, 循环活动,或检查员(包括移动)。 每个目标在按钮移动时都会有一个持续控制器 在视图之间,通过调整大小和检查导航来保存待决状态和出错. 他们保护重复的请求并显示错误。 识别按钮未标记已停止的工作:已流出 语句状态必须确认。 缺少信号、判断不全和预算/超时失败没有标注完成 . 所有运行动作都保留精确的所选运行ID;尝试选择发送其持久名称,而不是其A/B显示字母.
无效的监视 .pi/loops.json 不再终止服务器。 被拒绝的文本保存在配置旁边,
如果可能,最后一个被接受的设置会被恢复,一个工作空间范围错误解释了如何恢复.
均等
npm run shots 写入 ./shots/ 1440、1024和430宽。 此端口的通过条件是 POC 的屏幕
~/factory/mock 显示同一密度;见 PARITY.md 用于逐州比较.
发展
npm run dev # Hono on :8001 proxying the SPA to Vite on :5173
npm run check # typecheck the server and the client separately
npm test # offline engine/API tests, including workspace restart and routing regressions
npm run test:browser # build first; real Chromium workspace navigation, with a fake Pi (no model calls)
npm run shots # headless-chrome screenshots of every state