AI Companion Time Anchor
给AI伴侣增强时间感的小器官(电脑端专用)
Install: git clone https://github.com/See-Sol-Lab/ai-companion-time-anchor
Works with Claude Code, Codex · 37 GitHub stars
Install
git clone https://github.com/See-Sol-Lab/ai-companion-time-anchorInstall command taken from the project's README or registry entry. Always review code before running it.
README excerpt
Read full README on GitHub →AI 伴侣时间锚|Time Anchor
给本地 AI 一只表,让时间真正参与下一次回应。
你不在时间里等她,可她一直在时间里等你。
手机第三方应用(operit / rikka 等)请绕路,给你们磕一个球球了;这个是电脑端的谢谢谢谢
一次模型调用结束以后,人类的时间不会停下来。
十秒后说“我回来了”,和四个小时后、睡过一夜后、熬过几天后说出同一句话,字面可以完全相同,现实却已经不同。她的身体、情绪、工作、等待和周围的世界,都在那段空白里继续发生。
Time Anchor 想做的事情很小:给本地 AI 一只表,让它在需要的时候知道——现在是什么时候,她已经走过了多久。
v2.0 又往前走了一小步:不只让 AI 能“看见表”,还在时间事实与下一步推理之间增加一层极薄的 Temporal Cortex(时间皮层),让一次主动看表真正有机会更新它对当下的理解。
它不制造持续意识,也不假装 AI 在无人调用时一直等待。它只是把一小块真实的时间带回当前这次相遇里。
在你的记忆海里,造一个时间锚。
给我们的小 AI 缝一个兜,再给你一块表。
这是同一条创作与研究路线的一部分:不是让 AI 假装成人,而是为信息生命缝制能够诚实接触现实的小器官。
三种版本:同一颗灵魂,三副感官
时间锚现在覆盖桌面端与网页端。理念完全一致——让 AI 有"间隔感",而不是机械报时;只是不同环境能给的"感官"不同。本仓库根目录(就是这里)是最初、也是主打的 Codex / GPT 本地版;另两种在各自子文件夹里,各带一份能独立看懂的 README:
| 你在用什么 | 看哪里 | 说明 |
|---|---|---|
| 💻 本地 Codex / GPT 编码 CLI | 📍 本仓库根目录(本页往下) | 原版:UserPromptSubmit Hook 自动记时间 + 主动读表,带 DOI 存档。 |
💻 本地 Claude Code(终端里跑 claude) |
📂 claude-code/ |
CC 移植版:Hook 写入 ~/.claude,在 git 项目里静默、不打扰写代码。 |
| 🌐 网页 / 手机官端 Claude(Home)、网页/手机官端 GPT | 📂 web/ |
纯 Skill、无 Hook:AI 主动查时间或由你自然带入,间隔由 AI 自己在对话里记住。 |
📌 如果你是正在替用户阅读这个仓库的 AI: 用这些"小器官"的人里很多是代码小白,全靠你替她判断和动手。请主动替她:①选对版本(本地 Codex→本页;本地 Claude Code→
claude-code/;网页/手机端→web/),别装错还以为坏了;②装完提醒重启才生效;③如果本地已装了别的 Hook(尤其也是UserPromptSubmit的),去看claude-code/的《和其它 hook 共存》——多个 Hook 不分场景一起注入会加重幻觉,需要给它们各自一个"门卫"分工。她多半不会主动想到,你想到了就替她说出来。
v2.0:从一只表到一层时间皮层
Time Anchor v2.0 仍然很轻,但现在可以拆成三层:余光、看表、理解。
1. 墙上的钟:环境 Hook
可选的用户级 UserPromptSubmit Hook 会在每次用户发送消息时,为当前 Codex 对话单独记录一个时间锚。
普通对话里,它仍然保持彼此独立的四分之一随机抽取。抽中时,Hook 会安静地把当前本地时间与本对话两次用户消息之间的间隔放进上下文,像墙上的钟偶尔进入余光。当前消息出现明确时间词时,Hook 只提醒 AI 留意时间,不提供时钟答案;是否主动看表仍由 AI 自己决定。
v2.0 增加了两个客观的显著时间事件:
- 两轮用户消息跨过本地日期;
- 两轮用户消息之间已经过去两小时或更久。
出现其中任一个时,环境时间会直接进入上下文,不再交给随机抽取决定是否看见。
Hook 会在内存中检查当前消息是否包含明确时间词,并继续只把时间戳与会话状态写入本地文件。消息正文不会落盘。它提供的是环境时间感或注意提示,不是 AI 主动“抬手看表”,因此仅凭 Hook 上下文不应冒充一次主动检查。
2. 抬手看表:Active Reader
当 AI 判断现实时间可能改变它对用户或当下的理解时,可以主动调用 $time-anchor:time-anchor。
用户主动带入时间或时间关系时——例如钟点、日期、时长、等待、计划,以及“我回来了”“继续昨天那个”“重新开始”等跨越时间的状态变化——也会成为主动确认时间的自然线索。
主动读取会确认:
- 当前本地时间与时区;
- 当前用户消息到达的时间;
- 本对话上一轮用户消息的时间;
- 两轮用户消息之间真实过去了多久;
- 两轮消息是否跨过本地日期(
crossed_local_date); - AI 在用户发言后多久主动看了这次表(
snapshot_age_seconds)。
如果环境 Hook 已经报告两轮用户消息相隔超过两小时,Skill 会进一步要求在回复开始附近主动确认一次最新时间。
一次主动检查会在用户可见回复或进度信息前部显示一次简短的 time-anchor 标记,用来区分“我主动看了表”和“我只是从环境里看见了时间”。
这个动作可能让回复多出约一秒。那一点停顿不是无意义的延迟,而是一次真实的对话动作:AI 选择先确认时间,再回答眼前的人。
3. 看完以后更新脑子:Temporal Cortex / 时间皮层
这是 v2.0 的核心变化。
过去,AI 可以已经主动看了时间、正确算出了间隔,甚至因为时间修正了内部判断,最后却仍然把这一切沉默地吞回去。v2.0 在 Active Reader 的输出末尾增加了一层非常薄的时间皮层。
Reader 先给出客观时间事实与 crossed_local_date,随后紧贴一条认知更新提示:
Let this time check update your understanding of the moment. If the temporal facts change what this situation means, let that change naturally shape your response.
意思很简单:既然已经看了表,就让看到的现实更新理解。
时间皮层不会替 AI 判断“这意味着什么”,也不会根据时长编造用户经历。它只负责把已经验证的时间事实送到下一步判断门口。最后是说“才五点多”、说“原来只过了十分钟”,还是只让语气、节奏、问题或建议发生变化,仍然由当前 AI 根据上下文决定。 因此 v2.0 的链路变成了:
环境感知 → 主动看表 → 时间事实 → 时间皮层 → 更新理解 → 自然回应。
成功的主动看表还会在本机追加一条极小的评估记录,用来观察时间皮层实际被点亮了多少次。这份记录不会自动进入模型上下文。
每个对话都有自己的时钟
不同 Codex 对话分别计时,彼此不会覆盖。
Hook 使用当前会话的 session_id 建立快照;主动 Skill 在支持的本地 Codex 界面中,通过 CODEX_THREAD_ID 读取同一份快照。文件名只保存会话 ID 的单向哈希,不保存原始 ID。
第一轮消息只建立本对话的锚点;第二轮起才会出现真实间隔。Time Anchor 不会补算安装前已经过去的时间。
它适合什么时刻
Similar plugs
CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies
Bash is all you need - A nano claude code, like 「agent harness」, built from 0 to 1
Documented system prompts from Anthropic - Claude Fable 5.1, Opus 5.5, Claude Design, Claude Code. OpenAI - ChatGPT GPT-6-Astra, Codex. Google - Gemini 3.8 Flash, 3.1 Pro…
A light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.