@cteno/sdk-linux-x64 2.11.1 → 2.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cteno-host-cli +2 -2
- package/bin/cteno-wiki +0 -0
- package/bin/secret-exec +0 -0
- package/manifest.json +1 -1
- package/package.json +3 -3
- package/plugins/agent-secrets/.cteno-plugin/plugin.json +5 -1
- package/plugins/agent-secrets/bin/linux-x64/secret-exec +0 -0
- package/plugins/agent-secrets/skills/secret/SKILL.md +2 -0
- package/plugins/cteno.browser/.cteno-plugin/plugin.json +1 -0
- package/plugins/cteno.browser/skills/browser/SKILL.md +2 -1
- package/plugins/cteno.inbox/.cteno-plugin/plugin.json +1 -0
- package/plugins/cteno.memory/.cteno-plugin/plugin.json +1 -0
- package/plugins/cteno.memory/bin/linux-x64/cteno-wiki +0 -0
- package/skills/cteno-host-cli/SKILL.md +6 -1
- package/skills/skill-create/SKILL.md +4 -2
package/bin/cteno-host-cli
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/bin/cteno-host-cli
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 36963832 bytes
|
|
4
|
+
sha256: fa4ad0d991da60af69ceaed41b22657b84d821ce733b9b5a6d354ee4260d8658
|
package/bin/cteno-wiki
CHANGED
|
Binary file
|
package/bin/secret-exec
CHANGED
|
Binary file
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cteno/sdk-linux-x64",
|
|
3
|
-
"version": "2.11.
|
|
4
|
-
"description": "Bundled Cteno daemon (cteno-host-cli 2.11.
|
|
3
|
+
"version": "2.11.3",
|
|
4
|
+
"description": "Bundled Cteno daemon (cteno-host-cli 2.11.3) for @cteno/sdk on linux-x64",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.daemon",
|
|
6
6
|
"homepage": "https://github.com/zalan159/cteno-sdk#readme",
|
|
7
7
|
"repository": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"preferUnplugged": true,
|
|
28
28
|
"cteno": {
|
|
29
|
-
"daemonVersion": "2.11.
|
|
29
|
+
"daemonVersion": "2.11.3"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"access": "public",
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"id": "agent-secrets",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.7",
|
|
5
|
+
"platforms": ["darwin-aarch64", "darwin-x64", "linux-x64", "linux-aarch64", "windows-x64", "android-aarch64"],
|
|
5
6
|
"title": "Agent Secrets",
|
|
6
7
|
"icon": "lock-closed-outline",
|
|
7
8
|
"color": "#3DDC97",
|
|
@@ -31,6 +32,9 @@
|
|
|
31
32
|
"describe",
|
|
32
33
|
"platform.secureInput.begin",
|
|
33
34
|
"platform.secureInput.submit"
|
|
35
|
+
],
|
|
36
|
+
"localOwnerMethods": [
|
|
37
|
+
"import-legacy"
|
|
34
38
|
]
|
|
35
39
|
},
|
|
36
40
|
"secureInput": {
|
|
Binary file
|
|
@@ -50,6 +50,8 @@ request_secret(label: "服务器 sudo 密码", purpose: "重启 nginx", persist:
|
|
|
50
50
|
→ secret://ephemeral/<id>
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
+
**验证码硬规则:**发验证码的登录只发起**一次**。停在输码处后,不要杀掉、重启或重跑(每重来一次就会发新码、旧码作废,多试几次会触发风控锁定),用 `persist: false` 要码,再把引用填进**同一个正在等待的进程**:CLI 用 `shell pty:true` 启动,再用 `run_manager op:"write"` 写入;网页就填进同一个 browser tab。**浏览器场景**下,在点「发送验证码」、显示二维码或触发手机批准之前,先对这个 tab 执行 `browser hold`(`{"command":"hold","args":{"targetId":"<id>","minutes":30,"reason":"短信验证码"}}`)。异步的 `request_secret` 往往会让当前轮结束,tab 没 hold 的话可能连同验证码一起被回收。填完码、确认登录成功后,用 `stop:true` 释放。遇到 HTTP 423 或「too many attempts」就停下,告诉用户。
|
|
54
|
+
|
|
53
55
|
两种去向,按"这个值以后还要不要"选:
|
|
54
56
|
|
|
55
57
|
- **`persist: false`(默认,ephemeral)**——sudo 密码、验证码这类**用完就扔**的。值只在 daemon 内存里,**解析一次即销毁**,daemon 重启就没了。也**避开死锁**:写保险箱要求保险箱先解锁,而用户往往正是因为锁着才要输密码。
|
|
@@ -22,8 +22,9 @@ description: Daemon-owned CEF browser engine with the structured `browser` tool
|
|
|
22
22
|
- **登录态读数**:`browser cookies <origin> [--names a,b,c]` 回答「这个站还登录着吗、还剩多久」。它读的是引擎 profile 的 cookie jar(browser 级连接),**不导航、不需要拥有标签页**——判断是否需要访问站点这件事本身不该是一次访问。只回元数据(域/路径/过期/secure/httpOnly)与关键 cookie 里**最早**的那个 deadline,**永不返回 cookie 值**,所以可以安全地写日志、给模型、显示给用户。真要值请显式走 `cdp Network.getCookies`。不带 `--names` 是「发现模式」:只列出有什么,**不给 deadline 也不给判决**——没人指名哪个 cookie 承载会话时,整罐里最早的那个只是某个无关分析 cookie 的寿命。
|
|
23
23
|
- **token 登录看 storage**:`browser storage <origin> [--names a,b,c]`。现代 SPA 的登录**根本不在 cookie 里**(实测:已登录的 DeepSeek 控制台,4 个 cookie 全是 WAF 会话/设备指纹/缓存键,凭据是 `localStorage.userToken`),对这种站点 `cookies` 会稳定报「未登录」。web storage 按 origin 分区、拿不到无页面的读法,所以它借用 origin 开一个一次性 tab;但 document 在 `Fetch` 的 Request 阶段被本地 fulfil,**零字节到达站点**——是一次借用了 origin 身份的本地读取,不是一次访问。同样只回 key 的存在性/大小与 JWT 解出的 `exp`,**永不返回 token 值**;不透明 token 没有自带过期时回 `expiryUnknown`,那不是错误,是常态。
|
|
24
24
|
- **等网页回复**:在网页上发完消息要等对方回复时,`watch-notifications {targetId}` 把该 tab 的网页通知临时挂到本会话,然后结束本轮。对方回复会作为一条消息推进来;这时读 tab,再用 `semantic-step` 在输入框回复。挂载默认 120 分钟(`minutes` ≤1440),到期或 tab 关闭/被回收都会收到「已结束」消息,之后改为重新 `open` 该 url 查看。事情办完就 `stop:true`。不需要另外轮询;只有担心页面不发通知时,才可选设一个一次性 loop。
|
|
25
|
+
- **等人输码、扫码、批准时先 hold(硬规则)**:在点「发送验证码」、显示二维码或触发手机批准之前,先执行 `hold {targetId, minutes:30, reason}`。hold 住的 tab 不会因为空闲回收、tab 数上限或本线程结束/交回而被关闭(异步 `request_secret` 往往会让当前轮结束)。默认 30 分钟,上限 1440 分钟;`tabs`/`page-info` 会显示 `heldUntil`。把码填进同一个 tab,确认登录成功后用 `stop:true` 释放。如果命令报「held tab was lost because the browser engine restarted」,说明码已作废,先告诉用户,经同意再重新登录(重新登录会发新码)。
|
|
25
26
|
- **交还给人**:只有 agent 能交还方向盘——`driver mode=user reason=assist`(临时求助;随后结束本轮)或 `reason=done`(完工退出)。不存在第三态。交还后告诉用户去这个 session 的浏览器面板处理;如果某个已启用插件的说明提供了交接链接(例如 remote-control 的 `cteno-remote link`,可让人从手机接手),按插件说明发出那条链接。不要自己拼链接。
|
|
26
27
|
- **不用判断人在哪**:同一条接手链接,在电脑上点 = 打开 pane 到那个 tab;在手机上点 = 本机自动签发一次性 RustDesk 远程并把 Cteno 窗口/该 tab 摆到前台,agent 重新接手后自动 revoke。agent 不要主动打开 pane,也不要为浏览器接手自己跑 `cteno-remote grant`。手机端提示远程插件不可用时,再 `cteno-host-cli plugin install remote-control` + `plugin enable remote-control`。
|
|
27
28
|
- **插件开关即能力开关**:禁用本插件后 `browser-*` RPC 与 runtime browser 工具统一报 `browser_capability_unavailable`,不是 unknown method。
|
|
28
29
|
|
|
29
|
-
CLI 调试入口:`cteno-host-cli browser <command>`(与工具同一命令面,详见 `cteno-host-cli browser help`)。整机生命周期验收/运维用 `cteno-host-cli browser close-browser` 协作 drain daemon-owned
|
|
30
|
+
CLI 调试入口:`cteno-host-cli browser <command>`(与工具同一命令面,详见 `cteno-host-cli browser help`)。整机生命周期验收/运维用 `cteno-host-cli browser close-browser` 协作 drain daemon-owned 引擎;`close`/`stop` 不再是它的别名:带 `targetId` 只关那一个标签页,从 session 里不带 target 只关本 session 未 hold 的标签页,都不会停引擎;只有不带 session 的运维调用才仍按旧语义停引擎。
|
|
Binary file
|
|
@@ -3,7 +3,7 @@ id: cteno-host-cli
|
|
|
3
3
|
name: cteno-host-cli
|
|
4
4
|
description: "通过 cteno-host-cli 调用 CtenoHost 跨 session 能力,包括派出/跟进 thread、读取结果、管理 Agent、MCP、插件和远程机器"
|
|
5
5
|
when_to_use: "用户或 Agent 需要通过公共 CLI 操作跨 session Host 能力时使用"
|
|
6
|
-
version: "2.
|
|
6
|
+
version: "2.1.0"
|
|
7
7
|
tags:
|
|
8
8
|
- cteno
|
|
9
9
|
- host
|
|
@@ -71,6 +71,7 @@ cteno-host-cli <domain> <subcommand> --help
|
|
|
71
71
|
- **派活可以指定推理强度**:`dispatch_task` 顶层或每个节点带 `reasoning_effort: low|medium|high|xhigh|max`(节点不填继承顶层,都不填 = 模型默认档,与 `schedule` 同一套取值)。只对声明了推理强度的 profile 生效——`cteno-host-cli profile list` 里该行的 `supportedReasoningEfforts` 含这一档;不含就**同步拒绝**(`Nothing was dispatched`),换 profile 或去掉该字段。结果回显实际强度(`reasoning_effort` / `reasoning_efforts[]`),`list_task_threads` 每个线程也带;`send_to_thread` 续跑沿用线程原来的强度。
|
|
72
72
|
- **交回要附证据、合并要过复审**:`report_to_owner(status=done)` 带 `evidence:[{command,result,files}]`;runtime 拿命令去核子线程自己账本里的 shell 调用,无证据的交回在派活方那边第一行显示「[警告:无证据交回]」。仓库 main 上有 `REVIEW.md` 时,合并只能走 `merge_review`(op=review/status/close/merge;shell 里直接往 main `git merge` 会被拒):全新上下文的只读 `merge-reviewer` 按 Important/Nit/Pre-existing 出意见,Important 必须修掉或 op=close 写理由;第 4 轮起只审新增 diff。本仓库的 `REVIEW.md` 未声明 `high_risk`,没有「命中高风险路径需人工审」这道拦截(声明了 `high_risk` 的仓库才有)。CLI 走 `cteno-host-cli session invoke-tool <sid> merge_review --input '{"op":"status","repo":"<wt>"}'`;复审记录在 `<git common dir>/cteno-review/<branch>.json`。见 `docs/architecture/review-gates.md`。
|
|
73
73
|
- **健康检查**:`doctor [--network-only] [--json]` 一次报出配置、本机 daemon socket、Happy Server 可达性和 MCP server 状态(只读,不新增 RPC);`--network-only` 跳过 MCP 扫描只查配置与网络;有任一项 FAIL 时退出码 1。Happy Server 不通只记 warn(未登录本地模式仍可用)。只能在本机跑,不接受 `--machine`。排查「连不上」先跑它。
|
|
74
|
+
- **Skill 体检**:`skill doctor [--json] [--fix] [--verbose] [--workspace <dir>]` 扫 builtin / 用户根 / workspace / plugin 投影和不再读取的 `~/.agents/skills`,报 frontmatter、id 冲突与过期覆盖、引用文件缺失、变量写错、内嵌的激活时命令(反引号围栏后紧跟感叹号)在本平台不可用、描述过长或缺触发词;纯文件扫描,无需 daemon,不接受 `--machine`。`--fix` 只改格式(BOM、首行前空行、CRLF、未加引号的 `: `、skill.md 改名),只动用户与 workspace 自有副本,先备份到 `<用户根>/.backup/<ts>-skill-doctor/`;有 ERROR 时退出码 1。
|
|
74
75
|
- **MCP 连接共享**:`mcp_servers.yaml` 每个 server 可写 `sharing: auto|shared|private`(缺省 auto)。auto 只在握手协商出 MCP 2026-07-28 无状态协议时让多个 session 共用一个连接/进程;legacy server 默认每 session 一个进程;`shared` 是用户担保无状态的显式共享,`private` 显式不共享。见 `docs/architecture/mcp-connection-pool.md`。
|
|
75
76
|
- **远程机器**:先 `machines list`(账号级列表,本身不接受 `--machine`),再把顶层 `--machine <id|name>` 放在业务命令之前。它只切换 transport;auth/host/status/connect/webview 等本地命令不能远程执行。长任务注意远程 RPC deadline,异步派出后再查状态通常更稳妥。
|
|
76
77
|
- **跨机派发前先预检,别凭记忆写 machine id 和路径**。跨机是盲派:你看不见那台机器的磁盘,也不知道它装了哪些模型。两个**只读、不建 session**的命令回答这件事:
|
|
@@ -108,6 +109,10 @@ cteno-host-cli <domain> <subcommand> --help
|
|
|
108
109
|
- `cteno-host-cli desktop [state]`(RPC `desktop-claim-state`):当前持有者 `holders[{sessionId,label,kind:machine|app,app,sinceMs,pid}]`(含同机其他进程)与急停冷却 `cooldownUntilMs`,只读。
|
|
109
110
|
- `cteno-host-cli desktop estop`(RPC `desktop-claim-estop`):急停——释放所有 claim、抬起按键,并让所有进程 30 秒内拒绝驾驶。这是代用户按下停止键,只在用户要求或明显失控时用。
|
|
110
111
|
|
|
112
|
+
## 机器目录(workspace 域)
|
|
113
|
+
|
|
114
|
+
和 App 目录选择器同一组机器级 RPC:`workspace list [path] [--all] [--root <abs>]`(`workspace-list`;默认不显示点文件和目录 `.cteno-hidden` 里列出的内部项,`--all` 全显示)、`workspace mkdir <path> [--root <abs>]`(`workspace-mkdir`;立即建目录及父目录,路径相对 root,`..`、绝对路径和指向 root 外的软链一律拒绝)。手机机器的新项目默认放 `$HOME/Projects`。加 `--machine <id>` 操作远端机器。
|
|
115
|
+
|
|
111
116
|
## 历史证据与压缩后取回
|
|
112
117
|
|
|
113
118
|
跨 session 验收先用 `session trace --help` 和 `session messages --help` 确认公共读接口。`trace` 用于检查模型实际执行的调用与结果;仅在最终回答中出现目标文字不算取回成功,尤其不能用用户测试提示中的文字作命中证据。`trace --full` 只关闭 CLI 行截断,不恢复宿主已截断的预览;读取原始证据用 `session messages <session_id> --message-id <id>`(可重复,最多 500 个),复用公共 `get-session-messages` 的精确 ID 读取,不直读 daemon SQLite。
|
|
@@ -3,7 +3,7 @@ id: skill-create
|
|
|
3
3
|
name: skill-create
|
|
4
4
|
description: "创建自定义 Skill(SKILL.md),定义可复用的工作流程和指导"
|
|
5
5
|
when_to_use: "用户想创建新的自定义 Skill 时使用"
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.2.0"
|
|
7
7
|
tags:
|
|
8
8
|
- skill
|
|
9
9
|
- skill-creation
|
|
@@ -36,7 +36,9 @@ metadata:
|
|
|
36
36
|
|
|
37
37
|
3. **写入文件** — 用 `shell` 工具创建目录和 SKILL.md
|
|
38
38
|
|
|
39
|
-
4.
|
|
39
|
+
4. **体检** — 运行 `cteno-host-cli skill doctor --workspace {workdir}`,新 Skill 不得有 ERROR;`--fix` 可自动修格式问题
|
|
40
|
+
|
|
41
|
+
5. **确认** — 告知用户 Skill 已创建,如何激活使用
|
|
40
42
|
|
|
41
43
|
## SKILL.md 格式
|
|
42
44
|
|