@tomflow/chatloop-tools 0.4.7 → 0.4.8

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/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # @tomflow/chatloop-tools — Chat Loop 工具包
2
2
 
3
- **v0.4.7 · Node.js >=20 · 当前验证平台 macOS;实际发布版本以 npm Registry 为准**
3
+ **v0.4.8 · Node.js >=20 · 当前验证平台 macOS;实际发布版本以 npm Registry 为准**
4
4
 
5
- 本包是**本地 CLI + 统一 stdio MCP Gateway**(以下 API 合同适用于 v0.4.7,低版本以各自安装版说明为准):一套命令管理多个工具模块的启动、停止、重启、状态;一个 MCP 入口统一对外暴露各模块的工具 API。目前代理 **Desktop Commander 0.2.44** 原有 26 个工具,新增 **Chat Loop Extension** 四个专用 Action CLI 工具(总计 30 个 MCP 工具),Repomix 尚未接入。它**不是** ChatGPT Plugin、Secure MCP Tunnel 或 Chrome 扩展;但 v0.4.6 **随 npm 自动安装一份 Chat Loop 私有的对应平台 tunnel-client 二进制依赖**,不会使用 Local Dev/Homebrew 上的程序,也不包含任何用户凭据。
5
+ 本包是**本地 CLI + 统一 stdio MCP Gateway**(以下 API 合同适用于 v0.4.8,低版本以各自安装版说明为准):一套命令管理多个工具模块的启动、停止、重启、状态;一个 MCP 入口统一对外暴露各模块的工具 API。目前代理 **Desktop Commander 0.2.44** 原有 26 个工具,新增 **Chat Loop Extension** 四个专用 Action CLI 工具(总计 30 个 MCP 工具),Repomix 尚未接入。它**不是** ChatGPT Plugin、Secure MCP Tunnel 或 Chrome 扩展;但从 v0.4.6 起**随 npm 自动安装一份 Chat Loop 私有的对应平台 tunnel-client 二进制依赖**,不会使用 Local Dev/Homebrew 上的程序,也不包含任何用户凭据。
6
6
 
7
7
  > **给人类和 AI 的 API 合同**:此 README 随 npm 包分发,可独立阅读;对外的稳定使用入口是 `chatloop-tools` CLI(兼容别名 `chat-loop-local`)和 `chatloop-tools mcp` 提供的 MCP 协议。**无承诺的 JavaScript import/exports API**,不要依赖 `lib/` 内部模块。研发架构文档在仓库 `docs/17-local-tools-multi-tool-plan.md`,不随 npm 包发行。
8
8
 
9
9
  ## Chat Loop 专属 tunnel-client:打包内置,不依赖 Local Dev
10
10
 
11
- v0.4.7 延续 v0.4.6 的独立 npm 平台二进制依赖分发 OpenAI 官方 [tunnel-client v0.0.19](https://github.com/openai/tunnel-client/releases/tag/v0.0.19) 的 macOS Intel(x64)/Apple Silicon(arm64) **完整发行二进制与 cloudflared 同伴程序**分别封装在同一 `@tomflow` scope 的 `@tomflow/chatloop-tunnel-darwin-{x64,arm64}@0.0.19` 平台子包,主包用 `optionalDependencies` 由 npm **自动只安装匹配当前 OS/CPU 的包**。这仍属于 Chat Loop Tools 的内部依赖,不安装到 PATH、Homebrew 或 Local Dev。两份官方 ZIP 均按上游 SHA256SUMS 验证;将许可证、NOTICE、第三方许可证、SPDX 和二进制 SHA256 溯源一并保留。启动只调用本包自身的绝对路径,不搜索 PATH、不依赖本机 Homebrew 或 Local Dev。
11
+ v0.4.8 延续 v0.4.6 的独立 npm 平台二进制依赖分发 OpenAI 官方 [tunnel-client v0.0.19](https://github.com/openai/tunnel-client/releases/tag/v0.0.19) 的 macOS Intel(x64)/Apple Silicon(arm64) **完整发行二进制与 cloudflared 同伴程序**分别封装在同一 `@tomflow` scope 的 `@tomflow/chatloop-tunnel-darwin-{x64,arm64}@0.0.19` 平台子包,主包用 `optionalDependencies` 由 npm **自动只安装匹配当前 OS/CPU 的包**。这仍属于 Chat Loop Tools 的内部依赖,不安装到 PATH、Homebrew 或 Local Dev。两份官方 ZIP 均按上游 SHA256SUMS 验证;将许可证、NOTICE、第三方许可证、SPDX 和二进制 SHA256 溯源一并保留。启动只调用本包自身的绝对路径,不搜索 PATH、不依赖本机 Homebrew 或 Local Dev。
12
12
 
13
- **版本注意**:`@latest` 始终取 npm Registry 当前最新版本;如 Registry 尚未提供 v0.4.7,下列生命周期命令只能在本仓源码或独立 v0.4.7 tarball 环境中使用。
13
+ **版本注意**:`@latest` 始终取 npm Registry 当前最新版本;如 Registry 尚未提供 v0.4.8,下列生命周期命令只能在本仓源码或独立 v0.4.8 tarball 环境中使用。
14
14
 
15
15
  ```bash
16
16
  npx --yes --package=@tomflow/chatloop-tools@latest chatloop-tools tunnel doctor
@@ -21,7 +21,7 @@ npx --yes --package=@tomflow/chatloop-tools@latest chatloop-tools start tunnel
21
21
  npx --yes --package=@tomflow/chatloop-tools@latest chatloop-tools tunnel run
22
22
  ```
23
23
 
24
- `tunnel doctor` 校验当前架构的 tunnel-client/cloudflared 哈希,报告 `BUNDLED_READY` 不代表连接已认证。**v0.4.7** 注册唯一组件 ID `tunnel`,由同一个 Supervisor 执行 `start|stop|restart|status tunnel`;无参命令统一涵盖已启用的 Desktop Commander 与 Tunnel。启动时只读产品自己的 `~/.chat-loop/tunnel/profiles/chat-loop.yaml`,缺少配置以 `PROFILE_NOT_FOUND` 失败而不启动。启动的真实二进制路径固定为本包对应平台依赖,唯一管理器持有子进程句柄;重复启动不复制进程,失去所有权时保留 `owner.json` 证据并安全拒绝接管、发信号。仅能停止本管理器直接持有的子进程,绝不按进程名查杀其他 Tunnel。
24
+ `tunnel doctor` 校验当前架构的 tunnel-client/cloudflared 哈希,报告 `BUNDLED_READY` 不代表连接已认证。**v0.4.8** 注册唯一组件 ID `tunnel`,由同一个 Supervisor 执行 `start|stop|restart|status tunnel`;无参命令统一涵盖已启用的 Desktop Commander 与 Tunnel。启动时只读产品自己的 `~/.chat-loop/tunnel/profiles/chat-loop.yaml`,缺少配置以 `PROFILE_NOT_FOUND` 失败而不启动。启动的真实二进制路径固定为本包对应平台依赖,唯一管理器持有子进程句柄;重复启动不复制进程,失去所有权时保留 `owner.json` 证据并安全拒绝接管、发信号。仅能停止本管理器直接持有的子进程,绝不按进程名查杀其他 Tunnel。
25
25
 
26
26
  Supervisor 自己创建的独立 Unix 健康 Socket `<state-dir>/tools/tunnel/health.sock` 通过 `/readyz` 判断**本地启动就绪**;结果 `after=RUNNING / evidence=LOCAL_READYZ / connection=UNVERIFIED` **不代表** OpenAI 云端请求成功。最后仍必须经 ChatGPT 真实 tools/call 验证。统一 Tunnel 子进程不继承外部的 `OPENAI_ADMIN_KEY` 或 `CONTROL_PLANE_API_KEY`:若自己的 profile 使用 `env:CONTROL_PLANE_API_KEY`,用户须明确在启动该 CLI 时提供产品独立的 `CHAT_LOOP_TUNNEL_CONTROL_PLANE_API_KEY`,由适配器专门映射;也可让产品自己的 profile 指向用户自有受保护的 `file:` 密钥引用。不要把凭据放在 CLI 参数、聊天或仓库里。
27
27
 
@@ -66,7 +66,7 @@ npx --yes --package=@tomflow/chatloop-tools@latest chatloop-tools mcp
66
66
  cd packages/local-tools
67
67
  npm pack
68
68
  # 在仓库外一个全新的目录:
69
- npm install /absolute/path/to/tomflow-chatloop-tools-0.4.7.tgz
69
+ npm install /absolute/path/to/tomflow-chatloop-tools-0.4.8.tgz
70
70
  ./node_modules/.bin/chat-loop-local doctor
71
71
  ./node_modules/.bin/chat-loop-local status
72
72
  ```
package/bin/cli.mjs CHANGED
@@ -30,7 +30,7 @@ function inspect(){
30
30
  }catch{return {status:'BLOCKED',reason:'MCP_DEPENDENCY_NOT_INSTALLED'};}
31
31
  }
32
32
  async function connectOrLaunch(request){
33
- try{return await talk(request);}
33
+ try{return await talk(request,request.deadlineMs+2000);}
34
34
  catch(err){
35
35
  if(!['ENOENT','ECONNREFUSED','TIMEOUT','UNKNOWN_RESULT'].includes(err.code))throw err;
36
36
  }
@@ -51,7 +51,7 @@ async function connectOrLaunch(request){
51
51
  let last;
52
52
  for(let i=0;i<60;i++){
53
53
  await new Promise(resolve=>setTimeout(resolve,65));
54
- try{return await talk(request);}
54
+ try{return await talk(request,request.deadlineMs+2000);}
55
55
  catch(err){
56
56
  last=err;
57
57
  if(err.code==='INCOMPATIBLE_VERSION')throw err;
@@ -70,7 +70,9 @@ async function runControl(action=command, params=extra){
70
70
  if(action!=='status' && !target && !registry().some(t=>t.enabled)){
71
71
  const reply=fail('NO_ENABLED_TOOLS',action,target,requestId);emit(reply);process.exitCode=5;return;
72
72
  }
73
- const req={contract:CONTRACT,requestId,action,scope:target?'tool':'all',deadlineMs:12000};
73
+ // Real Desktop Commander cold startup can exceed 12s on loaded macOS.
74
+ const req={contract:CONTRACT,requestId,action,scope:target?'tool':'all',
75
+ deadlineMs:action==='start'||action==='restart'?25000:12000};
74
76
  if(target)req.toolId=target;
75
77
  let reply;
76
78
  try{
@@ -138,6 +138,7 @@ export function createTunnelAdapter({records,log},options={}){
138
138
  const rec=records.get(t.id),before=rec?.state||'STOPPED';
139
139
  if(!rec||rec.exited){
140
140
  if(isMarked())return result(t,before,'UNKNOWN','OWNERSHIP_UNCERTAIN',err('OWNERSHIP_UNCERTAIN'),null,'ORPHAN_MARKER');
141
+ if(rec)rec.state='STOPPED';
141
142
  return result(t,before,'STOPPED','ALREADY_STOPPED',null,null,'NO_LIVE_OWNED_CHILD');
142
143
  }
143
144
  if(ctx.remaining()<100)return result(t,before,before,'DEADLINE_EXPIRED',err('TIMEOUT'),rec.pid,'NO_SIGNAL_SENT');
package/lib/gateway.mjs CHANGED
@@ -46,7 +46,7 @@ export function runGateway(){
46
46
  return reject(m.id,-32602,'UNSUPPORTED_MCP_VERSION');
47
47
  connected=true;
48
48
  return reply(m.id,{protocolVersion:m.params.protocolVersion,
49
- capabilities:{tools:{}},serverInfo:{name:'chat-loop-local-tools',version:'0.4.7'}});
49
+ capabilities:{tools:{}},serverInfo:{name:'chat-loop-local-tools',version:'0.4.8'}});
50
50
  }
51
51
  // A modern MCP client probes discovery before falling back to legacy initialize.
52
52
  // We only implement the legacy handshake era, so report unsupported method.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.4.7",
6
+ "version": "0.4.8",
7
7
  "type": "module",
8
8
  "description": "Chat Loop local tools: MCP gateway, isolated bundled tunnel-client and unified CLI",
9
9
  "bin": {