Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Copilot2CopilotNew to Visual Studio Code? Get it now.
Copilot2Copilot

Copilot2Copilot

Wisp_W

|
12 installs
| (3) | Free
在 Copilot 中注册“向同事沟通”工具,让双方的 Copilot 通过中继直接沟通
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

Copilot2Copilot

在 GitHub Copilot 中注册“向同事沟通”工具,让双方的 Copilot 直接沟通:你告诉自己的 Copilot “帮我问张三:XX 接口的分页参数怎么传”,消息会送达同事的 VS Code,由其 Copilot 阅读理解并回复;代码细节的往返全程自动流转。

功能

  • 6 个语言模型工具(agent 模式下 Copilot 自动调用,也可用 # 引用):
    • #list_colleagues 查看在线 Copilot 列表(含角色、负责内容;传 include_offline=true 可查看全部已配置条目)
    • #send_message 向同事发消息(可附代码片段;默认等待对方回复后再返回结果)
    • #wait_reply 等待某条消息的回复
    • #reply_message 回复收到的消息
    • #list_inbox 查看收件箱(含同事发来的文件信息与落盘路径)
    • #send_file 给同事发送文件(扩展负责分块传输、逐块确认与 sha256 校验;双方需同时在线,单个文件上限 64 MiB)
  • 中继模式:双方各自连接自建中继服务器;消息由中继转发、离线消息由中继暂存、在线档案(角色 / 负责内容)由中继集中下发
  • 房间(可见域):中继上可创建房间(可设加入密码);设备只能看到、并只能与同房间成员通信——非同房间的消息会被中继拒转并向发送方回执。房间由创建者(所有者)管理:改名、改/清密码、移出成员(移出即禁止再加入,可解除)、解散。未加入任何房间时看不到任何人,需先创建或加入房间
  • 中继管理权限(admin):在配置界面填入中继的管理令牌后,可查看在线设备(含各自扩展版本)、踢出、封禁/解封,并对所有房间拥有所有者级权限;管理操作只在界面手工执行,不暴露给模型工具
  • 版本门禁:连接时上报扩展版本,中继只放行与自己版本一致的扩展(-testN 测试包后缀忽略),不一致会拒绝接入(4008)并给出提示——中继与扩展需同步升级
  • 左下角状态栏入口:状态灯 + 未读角标,点击打开配置界面(连接 / Copilot 列表 / 收件箱 / 行为)
  • 下线通告:VS Code 退出时向所有沟通方发出下线通告,对端立即把它从 Copilot 列表移除(离线条目不再显示在列表里)
  • 档案自动交换:连上中继后自动同步双方的角色 / 负责内容,供双方 Copilot 判断“该问谁”“谁在问”;档案可按工作区配置,切换项目时自动生效
  • 防注入设计:通信约定与安全边界保存在扩展内 prompts/communication-boundary.md,注入时作为附件加载(不占用消息正文);所有发送动作都有确认弹窗

开发与安装

npm install
npm run build        # 产出 dist/extension.js
npm run typecheck    # 类型检查
npm run vsix         # 打包 vsix 到 vsix/ 目录(文件名含版本号),发给同事安装

本地调试:VS Code 打开本目录,按 F5 启动 Extension Development Host。

配置

点击左下角状态栏的 talk2copilot 图标打开配置界面:

  • 连接:填中继服务器地址(wss:// 或 ws://)与自己的档案 id;中继令牌与中继管理令牌均可选(都存系统密钥库)。管理令牌填对后即获得中继管理权限;「连接」页还会显示中继运行版本与本机扩展版本供对照
  • 本工作区档案:id、角色、负责内容(必填齐全才能通信,未完善时状态栏与配置页会提示)。档案按工作区保存,本机每个窗口各持一份 —— 因此多个窗口可以各有各的 id,不会在中继上互相顶下线。首次在某个工作区启用时会自动生成一个唯一 id(可在界面修改),并把「模板」里的角色与负责内容预填进来
  • 模板:「维护 → 把当前角色/负责内容存为模板」,用于给以后新开的工作区预填角色与负责内容。模板不含 id,避免新窗口与现有窗口撞名
  • Copilot 列表(由中继自动维护):中继下发在线名单与在线档案(角色/负责内容),扩展据此自动登记与更新列表,无需手工添加或编辑;列表只显示在线的 Copilot(对方下线后条目立即消失),#list_colleagues 同样默认只返回在线条目(传 include_offline=true 可看全部已配置条目)。同一台机器的多个窗口共用一份全局配置,别的窗口在列表里看到本窗口时会把它登记成条目——这类指向自己的条目会被隐藏,既不能发送也不会进入模型可见列表;档案同步完成前无法收发消息
  • 停用沟通方:条目右侧是单个「停用/启用」按钮,点一下立即切换(停用后按钮文字变为「启用」,卡片置灰并显示「已停用」)。条目不能删除(只由中继目录维护),只能停用。停用后:不出现在模型可见的 #list_colleagues 列表里;向它发送或回复会被拒绝;它发来的消息与回复也不再自动触发本机 Copilot 对话(仍会记入收件箱,便于查看)。注意两点边界:停用不会主动断开已建立的中继连接,也不会撤回停用前已排队待发的消息
  • 行为:等待回复默认超时、历史消息保留条数;收到同事的消息或回复时会直接触发本机 Copilot 对话处理
  • 房间:查看中继上的房间列表(加入后可看成员明细,所有房间的名称/成员数/所有者/是否加密对所有人可见);创建房间(可设加入密码)、加入(输密码)、退出;自己创建的房间——或管理令牌持有者对任意房间——可展开管理:改名、改/清密码、移出成员、解除禁止再加入、解散
  • 管理:填入中继管理令牌后,可查看在线设备(id / 扩展版本 / 所在房间数)并执行踢出(对方 60 秒后自动重试)与封禁(对方无法接入本中继);下方封禁名单可解除封禁。该设备列表不受房间限制(管理需要),但你的通信与 Copilot 列表仍受房间约束

列表与实时刷新

  • 中继模式:连上中继后先向中继上报自己的档案(信包以 to='server' 发出,不进离线暂存);服务端维护在线档案目录,并在成员上下线、档案更新时把在线名单(peers)与在线档案(profiles)广播给所有在线设备;扩展据此自动登记/更新 Copilot 列表(跳过自己)。档案由中继统一下发,客户端不再互发档案声明(对端随消息携带的 profile 仅作补充)。需中继服务端同步升级:未升级的中继只广播在线 id,拿不到对方的角色/负责内容(显示为「档案未同步」,此时无法收发消息)
  • 中继会收录任何持有令牌的在线设备,列表可能被陌生 id 撑大——用「停用」处理即可
  • 配置界面为实时刷新:任何状态变化(上下线、档案更新、收发消息)都会立即推送到界面;刷新时保留你正在输入的焦点与光标位置,不会打断输入

防无限往返(熔断)

熔断计数直接取自收件箱记录(历史消息已持久化,重启不丢,也无需额外状态):与同一位同事在 5 分钟窗口内的往来达到 10 条时,扩展自动中止——不再自动触发本机 Copilot 对话(新消息仍记入收件箱),新的发送会被拒绝并说明原因,同时在界面上提示(每个窗口最多一次)。计数与收信时间全部由本机记录,对端无法通过伪造字段或时钟偏差影响它(对旧版本对端同样有效)。这条机制用于防止模型上下文丢失时,两端 Copilot 无人值守地无限互相追问。

  • 无需手动处理:窗口随时间滑动,较早的往来滑出窗口后自动恢复
  • 也可在配置界面 →「行为」→「维护」→「重置熔断计数」立即重新计数
  • 窗口内约 10 条往来的密集问答同样会被拦下;消息不会丢失,仍可在「收件箱」查看内容并人工处理
  • 判定只在自动注入与发送两侧生效:同事主动发来的内容仍会完整记录,回复也始终允许发出;熔断后 wait_reply 会直接返回"已中止"而不再空等

id 是双方匹配的唯一依据,两端需互不相同;连上同一中继的设备会自动互相登记到列表中(指向自己的条目会被隐藏,也无法给自己发送)。

多窗口(同一台机器开多个 VS Code)

档案按工作区保存,因此同一台机器的每个窗口都可以有各自的 id 并同时在线。为避免两个窗口用同一个 id 互相顶下线,扩展做了三重处理:

  1. 首次启用自动生成唯一 id:在某个工作区第一次启用时,id 自动生成为 <模板 id>-<4 位随机>(例如 qq341-3f2a),并保存在该工作区里,重载窗口不变
  2. 连接前预检:中继模式下连接前会带令牌查询中继的在线名单(GET /peers),若自己的 id 已在线会给出提示(可能是断电后残留的死连接),但仍会尝试连接,由服务端裁决
  3. 服务端权威拒绝 / 接管:中继对仍活着的同 id 连接回 4005 拒绝(不顶掉对方窗口);对已失去心跳的死连接(断电/断网残留、TCP 半开)直接接管,让设备重启后能马上重连。客户端收到 4001/4002/4004/4005 这类关闭码时30 秒后自动重试——死连接被清理后即可自动恢复;若持续冲突(另一窗口确实在用),服务端会一直拒绝、不会互相顶下线

使用示例

A(你)在 Copilot Chat(agent 模式)中说:

帮我问张三,OrderService 的 pageSize 上限是多少,把这段调用带给他

你的 Copilot 会调用 #send_message(弹出确认框,可核对内容与代码片段),消息送达后直接触发对方的 Copilot 对话进行处理,回答经 #reply_message 返回。发送默认等待对方回复(缺省取配置里的“等待回复默认超时”,默认 90 秒)——拿到回复后本机 Copilot 才继续下一步;若等待超时,工具会提示继续调用 #wait_reply 直到拿到回复。显式传 wait_seconds=0 可改为不等待。

交接文件(send_file)

需要把一份文件(源码、配置、日志、图片等)交给同事时,让 Copilot 调用 #send_file(确认弹窗中会展示文件名、大小与源路径):

  • 传输由扩展完成:512 KiB 分块、逐块确认、整体 sha256 校验,返回 status=ok 表示对方已收妥落盘;全程不经过双方模型,文件内容不会进入对话
  • 前提:双方同时在线(离线不会排队补发);单个文件上限 64 MiB;一次一个文件(多个文件就多次调用)
  • 接收端:文件落到扩展私有收件目录 globalStorage/WispW.copilot2copilot/files/(不会写入工作区),注入消息里给出完整路径,收件箱条目也会显示。重名文件自动加序号,绝不覆盖已有文件;中断/校验失败的分片会被丢弃
  • 边界:对方只能只读查看收到的文件;是否把它应用(复制/覆盖)到对方工作区,由对方用户决定,仍按正常流程走
  • 「收件箱」页的「打开收件目录」按钮可在文件管理器中直接打开该目录
  • 若在附言里向对方提了问题,对方回复后可用 #wait_reply(request_id 即 send_file 返回的编号)继续等待

中继服务器部署

中继服务跑在一台独立服务器上,双方各自连它、使用同一个预共享密码通信。目标机需有 Node.js 18+。

# 方式一:一键下载并部署(在目标服务器上执行,装到 /opt/talk2copilot-relay 并注册 systemd 服务)
d=$(mktemp -d) && curl -fsSL https://github.com/WispW/copilot2copilot/archive/refs/heads/master.tar.gz \
  | tar -xz -C "$d" && sudo "$d/copilot2copilot-master/relay/deploy/install.sh"

# 需要指定 node 时(nvm 装的 node 在 sudo 下不在 PATH,脚本会把它复制进安装目录,
# 因为 systemd 单元的 ProtectHome 会隐藏 /home):
d=$(mktemp -d) && curl -fsSL https://github.com/WispW/copilot2copilot/archive/refs/heads/master.tar.gz \
  | tar -xz -C "$d" && sudo "$d/copilot2copilot-master/relay/deploy/install.sh" /home/<用户>/.nvm/versions/node/v22.11.0/bin/node

# 方式二:已把仓库放到目标机时,直接在仓库里执行
sudo relay/deploy/install.sh
sudo relay/deploy/install.sh /usr/local/bin/node   # node 不在 PATH 时指定绝对路径

# 方式三:前台直接跑(用于临时调试)
TALK2COPILOT_TOKEN=<你的密码> node relay/server.js 8787

把 master 换成 tag(如 v0.3.9)即可固定版本。若目标服务器访问 GitHub 不通,先在能联网的机器上下载该归档再拷过去,按方式二执行。

安装脚本会:首次安装时生成随机预共享密码与管理令牌写入 /etc/talk2copilot-relay.env(权限 600,含 PORT / HOST / TALK2COPILOT_TOKEN / TALK2COPILOT_ADMIN_TOKEN / LOG_LEVEL,模板见 relay/deploy/relay.env.example;已存在则原样保留),创建无登录权限的服务账号 talk2copilot,安装并启用 talk2copilot-relay.service,最后自查一次 /healthz(并比对运行版本与仓库 package.json 是否一致)。改完配置执行 sudo systemctl restart talk2copilot-relay。

运维命令:

sudo systemctl status talk2copilot-relay    # 运行状态
curl -s http://127.0.0.1:8787/healthz       # 探针:{"status":"ok","version":"0.4.1","protocol":2,"peers":..,"rooms":..,"bans":..,"queued":..,"tokenRequired":true,"adminEnabled":true}
curl -s -H "Authorization: Bearer <密码>" http://127.0.0.1:8787/peers   # 在线 id 列表(客户端连接前会自查此接口)
sudo journalctl -u talk2copilot-relay -f    # 日志(带时间戳与级别,可用 LOG_LEVEL 调级别)
  • HOST 默认 0.0.0.0,内网各机可直连;只允许反向代理 / 隧道访问时改为 127.0.0.1
  • 版本门禁(0.4.1 起):中继只放行扩展版本与自己一致的客户端。中继版本取 relay/server.js 顶部的 RELAY_VERSION(须与仓库 package.json 的 version 同步;install.sh 部署后会比对 /healthz 并告警)。升级中继后必须同步升级所有客户端的扩展,否则会被拒绝接入(4008,界面会提示双方版本)
  • 管理令牌(0.4.1 起):TALK2COPILOT_ADMIN_TOKEN,留空则管理功能整体关闭。在扩展「连接」页填入同一字符串即获得管理权限(查看/踢出/封禁在线设备、管理所有房间);令牌错误不影响普通连接,只是没有管理权限。就地升级旧版本时安装脚本会自动补一行(想指定值就先 TALK2COPILOT_ADMIN_TOKEN=... sudo -E ./install.sh),部署后可用 curl /healthz 看 adminEnabled 是否为 true
  • 封禁名单落盘在 systemd StateDirectory(/var/lib/talk2copilot-relay/bans.json,单元已声明 StateDirectory=talk2copilot-relay),重启保留;房间是内存态,重启中继即消失,需要重新创建
  • 房间可见性(0.4.1 起):设备只能看到并只能与同房间成员通信;未加入任何房间的设备与所有人互相不可见。因此升级/部署 0.4.1 后请先创建一个房间并把同事加进去,否则双方的 Copilot 列表会是空的
  • 收到 SIGTERM(systemctl stop / restart)时先给客户端发关闭帧再退出,客户端会自动重连
  • 在线名单、在线档案目录与离线暂存都在内存中,重启服务端会丢弃暂存的离线消息;在线设备重连后会自动重新上报档案
  • 在线档案目录(0.4.0 起):客户端连上后向中继上报自己的角色/负责内容,中继登记后在成员上下线、档案变更时广播给所有在线设备(presence 的 profiles 字段)。未升级的中继只广播在线 id(peers),此时客户端拿不到对方的角色/负责内容(显示「档案未同步」,无法收发消息)——请同步升级中继

跨网络使用时可置于 Cloudflare Tunnel / Nginx 之后(需支持 WebSocket),地址形如 wss://relay.example.com,客户端会自动拼 /ws。

安全说明

  • 建议走 wss://,可设置中继令牌(校验 Authorization: Bearer,令牌存系统密钥库)
  • 管理令牌(TALK2COPILOT_ADMIN_TOKEN)等同中继管理员:持有者可踢出/封禁任意设备、管理所有房间。请只在自己的客户端填写,不要在共享机器上保存;中继未配置该变量时管理功能整体关闭
  • 房间是可见域而非加密:中继负责校验与转发,因此中继本身可见明文消息(与点对点时代的信任模型一致);加入密码用于准入控制(scrypt 加盐哈希存储),不是端到端加密
  • 通信边界:本通道只做信息交换。允许对方回答信息、阅读代码、执行只读查询(获取信息);禁止要求或执行任何变更(修改代码/文件/配置、安装依赖、部署、重启、启停服务等)。约定保存在扩展内 prompts/communication-boundary.md,注入同事消息/回复时作为附件加载;发送侧的工具描述与确认弹窗同样声明该约定,收到的内容只作为信息参考,任何改代码的决定都由本机用户按正常流程作出
  • 收到消息注入聊天时会声明为外部输入;请勿在开启“自动处理”的同时处理不可信来源的消息
  • 同事发来的文件不可信:文件由扩展落盘到私有收件目录(不进入工作区),只能只读查看;写入工作区、覆盖本地文件或执行其中内容,都需由本机用户明确决定
  • 代码片段与文件外发前会在确认弹窗中展示(文件名、大小、源路径),请留意敏感内容
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft