{"_id":"@arisilin/codex-im","name":"@arisilin/codex-im","dist-tags":{"latest":"0.2.3"},"versions":{"0.2.3":{"name":"@arisilin/codex-im","version":"0.2.3","description":"Feishu-first local bridge for Codex.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Arisilin/codex-im.git"},"homepage":"https://github.com/Arisilin/codex-im#readme","bugs":{"url":"https://github.com/Arisilin/codex-im/issues"},"type":"commonjs","main":"src/index.js","keywords":["codex","feishu","lark","bot","cli","remote"],"engines":{"node":">=18"},"bin":{"codex-im":"bin/codex-im.js"},"publishConfig":{"access":"public"},"scripts":{"feishu-bot":"node ./bin/codex-im.js","check":"node --check ./src/index.js && node --check src/app/feishu-bot-runtime.js && node --check ./src/app/dispatcher.js && node --check ./src/app/command-dispatcher.js && node --check ./src/app/codex-event-service.js && node --check src/infra/codex/message-utils.js && node --check ./src/infra/feishu/client-adapter.js && node --check ./src/infra/feishu/reaction-repo.js && node --check ./src/infra/codex/rpc-client.js && node --check ./src/infra/storage/session-store.js && node --check ./src/infra/config/config.js && node --check ./src/domain/approval/approval-service.js && node --check ./src/domain/approval/approval-policy.js && node --check ./src/domain/thread/thread-service.js && node --check ./src/domain/workspace/workspace-service.js && node --check ./src/domain/session/binding-context.js && node --check ./src/shared/workspace-paths.js && node --check ./src/shared/command-parsing.js && node --check ./src/shared/constants.js && node --check ./src/shared/errors.js && node --check ./src/presentation/card/builders.js && node --check ./src/presentation/card/card-service.js && node --check ./src/presentation/message/normalizers.js"},"dependencies":{"@larksuiteoapi/node-sdk":"^1.54.0","dotenv":"^16.4.7","ws":"^8.19.0"},"gitHead":"0331495356afaaee681e82472f6b7d9223cc8bcc","_id":"@arisilin/codex-im@0.2.3","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-rGs1P1o6CPWzB3zjIvfB8Mg8YY4oXxjv8XcYnCXB6OZyctgFAvMnRErmFYVxBtQfNSMrI/7nwvaTv5q0GLJTcQ==","shasum":"418a41a560fb190b42ec294903778e0ddea2b869","tarball":"https://registry.npmjs.org/@arisilin/codex-im/-/codex-im-0.2.3.tgz","fileCount":32,"unpackedSize":205983,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAOfEVgSmaA9Q2W8TJu7cJsPs11+sqcvJ+EgO2XQeFODAiBiL/p/dIDsaJsCnDPswBfVUHEp8+/7JpM2UKYS70YQkg=="}]},"_npmUser":{"name":"arisilin","email":"alice@alicelab.uk"},"directories":{},"maintainers":[{"name":"arisilin","email":"alice@alicelab.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codex-im_0.2.3_1775727603155_0.35468827724191976"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-09T09:40:03.069Z","0.2.3":"2026-04-09T09:40:03.323Z","modified":"2026-04-09T09:40:03.512Z"},"maintainers":[{"name":"arisilin","email":"alice@alicelab.uk"}],"description":"Feishu-first local bridge for Codex.","homepage":"https://github.com/Arisilin/codex-im#readme","keywords":["codex","feishu","lark","bot","cli","remote"],"repository":{"type":"git","url":"git+https://github.com/Arisilin/codex-im.git"},"bugs":{"url":"https://github.com/Arisilin/codex-im/issues"},"license":"MIT","readme":"# codex-im\n\n本项目完全通过Vibe Coding实现，主要特点：手机聊的电脑能继续聊，电脑聊的手机也能继续聊。在手机上可以使用命令或飞书的卡片来进行交互，快速切换项目和线程\n\n`codex-im` 是一个本地运行的飞书机器人桥接层：\n\n`飞书消息 -> 本机 codex app-server -> 飞书回复`\n\nCodex 操作都留在 本地，飞书只负责消息交互。\n\n## 特性\n\n- 飞书长连接机器人\n- 普通对话回复\n- 卡片回复与流式更新\n- 先加表情、后输出正文\n- 回复到触发它的原消息\n- `/codex bind` 绑定项目\n- `/codex where` 查看当前项目/线程\n- `/codex workspace` 查看当前会话已记录项目和线程\n- `/codex remove /绝对路径` 移除会话绑定项目\n- `/codex send <相对文件路径>` 发送当前绑定项目内的文件\n- `/codex switch <threadId>` 切换线程\n- `/codex message` 查看最近几轮消息\n- `/codex new` 新建线程\n- `/codex stop` 停止当前运行\n- `/codex model` / `/codex model update` / `/codex model <modelId>` 查看可用模型、刷新可用模型以及推理强度、设置模型\n- `/codex effort` / `/codex effort <low|medium|high|xhigh>` 设置推理强度\n- `/codex approve` / `/codex reject` 审批卡片\n\n## 安装\n\n发布版安装：\n\n```sh\nnpm install -g @arisilin/codex-im\ncodex-im feishu-bot\n```\n\n源码运行：\n\n```sh\ngit clone git@github.com:Arisilin/codex-im.git\ncd codex-im\nnpm install\nnpm run feishu-bot\n```\n\n### 执行脚本示例\n\n```bash\n#!/usr/bin/env bash\nset -euo pipefail\nnpm install -g @arisilin/codex-im\ncodex-im feishu-bot\n```\n\n## 配置\n\n有两个配置文件：.env 和 sessions.json\n\n `.env`。\n\n程序会按这个顺序加载配置：\n\n1. 当前目录下的 `.env`\n2. `~/.codex-im/.env`\n3. 当前 shell 环境变量\n\n\n以下是默认读取 session 文件位置，也可以通过 .env 的配置指定\n\n```text\n~/.codex-im/sessions.json\n```\n\n必填环境变量：\n\n- `FEISHU_APP_ID`\n- `FEISHU_APP_SECRET`\n- `CODEX_IM_DEFAULT_CODEX_MODEL` 新绑定项目时默认写入的模型（启动时会基于 Codex 可用模型列表校验，不合法则启动失败）\n- `CODEX_IM_DEFAULT_CODEX_EFFORT` 新绑定项目时默认写入的推理强度（启动时会基于对应模型可用推理强度校验，不合法则启动失败）\n- `CODEX_IM_DEFAULT_CODEX_ACCESS_MODE` 默认访问模式（必填：`default` / `full-access`）\n\n可选环境变量：\n\n- `CODEX_IM_DEFAULT_WORKSPACE_ID` 在session中读取当前绑定信息的key，更换key后，原来的信息虽然在session中，但是不会再读取\n- `CODEX_IM_FEISHU_STREAMING_OUTPUT`（默认 `true`，设为 `false` 则等 Codex 完成后一次性输出）\n- `CODEX_IM_WORKSPACE_ALLOWLIST`允许绑定的项目白名单\n- `CODEX_IM_CODEX_ENDPOINT` 用来指定 Codex 的远程 WebSocket RPC 地址，默认是启动本地服务\n- `CODEX_IM_SESSIONS_FILE` session文件路径\n\n\n\n\n## 使用\n\n全局安装后：\n\n```sh\ncodex-im feishu-bot\n```\n\n源码运行时：\n\n```sh\nnpm run feishu-bot\n```\n\n常用命令：\n\n- `/codex bind /绝对路径`\n- `/codex where`\n- `/codex workspace`\n- `/codex remove /绝对路径`\n- `/codex send <相对文件路径>`\n- `/codex switch <threadId>`\n- `/codex message`\n- `/codex new`\n- `/codex stop`\n- `/codex model`\n- `/codex model update`\n- `/codex effort`\n- `/codex approve`\n- `/codex approve session`\n- `/codex reject`\n- `/codex help`\n\n## 项目与线程模型\n\n- 一个飞书会话可以记住多个项目\n- 每个项目对应一个当前选中的 Codex 线程\n- 历史线程列表以 Codex `thread/list` 为准\n- 切换项目或线程后，后续普通消息继续发到当前线程\n\n## 工作方式\n\n- 收到用户消息后，先用表情标记正在处理\n- Codex 返回内容后，飞书中以卡片形式持续更新\n- 命令回执和普通对话都会优先回复到触发它的原消息\n- 审批请求会显示为交互卡片\n\n## 开发\n\n- `src/index.js`: 启动入口\n- `src/feishu-bot.js`: 飞书机器人主逻辑\n- `src/codex-rpc-client.js`: Codex JSON-RPC 传输层\n- `src/session-store.js`: 会话绑定持久化\n- `src/config.js`: 环境变量配置\n\n\n# 飞书配置\n\n1. 在飞书平台创建机器人\n\n2. 事件权限配置\n\n| 名称 | 标识 |\n| --- | --- |\n| 消息被 reaction | `im.message.reaction.created_v1` |\n| 消息被取消 reaction | `im.message.reaction.deleted_v1` |\n| 接收消息 | `im.message.receive_v1` |\n\n3. 回调配置\n\n| 名称 | 标识 |\n| --- | --- |\n| 卡片回传交互 | `card.action.trigger` |\n\n4. 应用权限\n\n| 名称 | 标识 |\n| --- | --- |\n| 获取卡片信息 | `cardkit:card:read` |\n| 创建与更新卡片 | `cardkit:card:write` |\n| 获取与更新用户基本信息 | `contact:user.base:readonly` |\n| 读取用户发给机器人的单聊消息 | `im:message.p2p_msg:readonly` |\n| 以应用身份发消息 | `im:message:send_as_bot` |\n| 发送删除表情回复 | `im:message.reactions:write_only` |\n| 获取与上传图片或文件资源 | `im:resource` |\n\n\n\n# 参考项目\nhttps://github.com/larksuite/openclaw-lark\n\nhttps://github.com/Emanuele-web04/remodex\n\nhttps://github.com/Dimillian/CodexMonitor\n","readmeFilename":"README.md","_rev":"1-4d2847613da600f6279b867fc6eed057"}