minecodex 2.0.8 → 2.0.10
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 +18 -4
- package/apps/dashboard/app.js +59 -10
- package/apps/dashboard/assets/diagnostics.js +18 -0
- package/apps/dashboard/index.html +5 -0
- package/apps/dashboard/styles.css +5 -1
- package/assets/brand/README.md +2 -2
- package/features/hide-upsell-banner/src/hide-upsell-banner.mjs +2 -0
- package/features/images/src/adapters/codex/image-sources.mjs +8 -1
- package/features/images/src/adapters/codex/native-image-source.mjs +2 -2
- package/features/images/src/frontend/local-image-source.mjs +7 -0
- package/features/images/src/library-prompt-page.mjs +9 -0
- package/features/model-slider/src/adapters/codex/controller.mjs +14 -1
- package/features/model-slider/src/frontend/install.mjs +4 -1
- package/features/notes/src/frontend/entry.mjs +10 -0
- package/features/session-status/src/session-status.mjs +11 -0
- package/features/sidebar-focus/src/sidebar-focus.mjs +8 -0
- package/features/sites/src/frontend/entry.mjs +8 -0
- package/features/usage-meter/src/adapters/codex/renderer.mjs +2 -1
- package/features/usage-meter/src/usage-meter.mjs +8 -0
- package/package.json +1 -14
- package/packages/cli/src/commands.mjs +6 -1
- package/packages/cli/src/control-server.mjs +4 -1
- package/packages/cli/src/platform.mjs +10 -0
- package/packages/cli/src/runtime-manager.mjs +11 -3
- package/packages/codex-adapter/src/renderer/environment.mjs +6 -1
- package/packages/runtime-host/src/codex-injection.mjs +49 -16
- package/packages/runtime-host/src/codex-runtime.mjs +51 -0
- package/packages/runtime-host/src/feature-registry.mjs +2 -3
- package/packages/runtime-host/src/main.mjs +8 -4
- package/packages/runtime-host/src/renderer-self-check.mjs +59 -0
- package/packages/ui/src/components/composer-menu.mjs +7 -2
- package/packages/ui/src/native/theme.mjs +16 -1
- package/DESIGN.md +0 -192
- package/apps/dashboard/DESIGN.md +0 -67
- package/features/hide-upsell-banner/README.md +0 -30
- package/features/images/DESIGN.md +0 -151
- package/features/images/README.md +0 -37
- package/features/model-slider/DESIGN.md +0 -36
- package/features/model-slider/README.md +0 -45
- package/features/notes/DESIGN.md +0 -74
- package/features/notes/README.md +0 -33
- package/features/session-status/DESIGN.md +0 -45
- package/features/session-status/README.md +0 -43
- package/features/sidebar-focus/DESIGN.md +0 -17
- package/features/sites/DESIGN.md +0 -82
- package/features/sites/README.md +0 -31
- package/features/unread-inbox/DESIGN.md +0 -41
- package/features/unread-inbox/codex-feature.json +0 -23
- package/features/unread-inbox/src/adapters/codex/modules.mjs +0 -58
- package/features/unread-inbox/src/adapters/codex/renderer.mjs +0 -198
- package/features/unread-inbox/src/domain/notifications.mjs +0 -21
- package/features/unread-inbox/src/injection-source.mjs +0 -9
- package/features/unread-inbox/src/unread-inbox.mjs +0 -307
- package/features/usage-meter/DESIGN.md +0 -49
- package/features/usage-meter/README.md +0 -19
- package/packages/cli/native/README.md +0 -49
- package/packages/codex-adapter/README.md +0 -16
- package/packages/runtime-host/README.md +0 -213
- package/packages/ui/DESIGN.md +0 -38
package/features/notes/DESIGN.md
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Prompts 设计约定
|
|
2
|
-
|
|
3
|
-
通用视觉、材质、按钮、Tooltip 与原生 sidebar 层级遵循根 [DESIGN.md](../../DESIGN.md)。本文件只记录功能特有组件、布局、数据语义与通用组件选型。
|
|
4
|
-
|
|
5
|
-
## 范围与数据
|
|
6
|
-
Prompts 页面负责新增、编辑、分类、Emoji、排序和统计;Quick Prompts Popover 只浏览和插入。移除旧顶部 Notes 入口、固定摘要、Todo 和 Files 界面。沿用 `notes` 功能 ID 与 SQLite,保留已有提示词、历史 Todo / Files 数据和用户文件。
|
|
7
|
-
|
|
8
|
-
## 原生依据
|
|
9
|
-
2026-09-27 在隔离 Codex 实测导航扩展区、Library 页面及 Add files and more。
|
|
10
|
-
- Prompts 导航项位于固定扩展区末尾,顺序跟随扩展区而非硬编码 Projects。仅定位 `data-app-navigation-rail`,不匹配设置菜单。
|
|
11
|
-
- Quick Prompts 位于 Add 与 Change permissions 之间,克隆 Add 的按钮 classes 与响应式图标容器。入口采用 Lucide book-open;保留 16 / 20px 图标容器,viewBox 扩为 27,将图形缩小约 11%;non-scaling-stroke 保持 1.5px 笔画,热区仍为 28px。
|
|
12
|
-
- 页面沿用 Library 的大标题和胶囊 Tabs;分类图标取自当前 Codex 原生 SymbolBrowser / project appearance catalogue,记录于 `assets/native-prompt-icons.json`,不手绘路径。
|
|
13
|
-
|
|
14
|
-
| 角色 | Token / 权威来源 | 值或用途 |
|
|
15
|
-
| --- | --- | --- |
|
|
16
|
-
| 输入框入口热区 | 原生 Add 的 h-token-button-composer / aspect-square | 28×28px |
|
|
17
|
-
| 入口图标 | 原生 CompactSource / LeadingSource | 16 / 20px |
|
|
18
|
-
| 页面内容 | 原生 Library header | 最大 1440px,左右 48px / 窄屏 30px |
|
|
19
|
-
| Tabs | 原生 Library tablist | 36px 高,胶囊,左右 16px |
|
|
20
|
-
| Popover 圆角 | --radius-suggestion-menu,回退 --radius-2xl | 20px |
|
|
21
|
-
| Popover 内边距 | --spacing | 4px,底部保留内边距 |
|
|
22
|
-
| Popover 列表行 | --suggestion-menu-item-padding / --app-menu-item-padding / --padding-row-y、--padding-row-x | 5px 8px |
|
|
23
|
-
| 行圆角 | --suggestion-menu-item-radius / --radius-xl | 15px |
|
|
24
|
-
| Popover 位置 | Add 所属的 `[data-composer-body]` 上方 | 与输入框主体等宽,间隔 4px;外层 Root 的 diff / request stack 不参与定位 |
|
|
25
|
-
| 页面条目正文预览宽度 | `.pm-preview` 的 `max-width:65%` | 相对于条目文字区域 `.pm-info`,单行省略;标题与点击区域保持全宽 |
|
|
26
|
-
|
|
27
|
-
分类颜色复用原生选择器的亮 / 暗模式色值:blue #0285ff / #339cff、green #04b84c / #40c977、orange #fb6a22 / #ff8549、pink #ff66ad / #ff8cc1、purple #924ff7 / #ad7bf9、red #fa423e / #ff6764、yellow #ffc300 / #ffd240;black 使用原生次级文字 token。
|
|
28
|
-
|
|
29
|
-
## 页面
|
|
30
|
-
Header 为 Prompts;右侧依次为排序图标、分类调节图标、常驻搜索框、New prompt。搜索框直接采用原生 Library 的透明背景、1px outline、32px 高、胶囊圆角、12px 水平 padding 和 16px 搜索 SVG。分类管理使用原生 sliders 图标,不再放在 Tabs 行。排序菜单选择通用 Dropdown 的 menu 分支,内容密度跟随原生 Library。Tabs 仅包含 All、分类和 Other。默认分类生图、编程、文案、研究、翻译、效率、思考、学习,允许新增、改名、删除、换图标和颜色。删除分类仅解除归属,保留提示词和统计。
|
|
31
|
-
|
|
32
|
-
分类管理选择通用 Dialog 的 opaque 分支(Sites Share),宽440px;提示词编辑同一分支,宽520px。当前通过 `config.ui` 接入。分类编辑在标题前保留24px箭头返回热区,不使用文字 Back 或整页替换。挂载与焦点契约遵循根规范。
|
|
33
|
-
|
|
34
|
-
单条提示词通过图标弹出框选择 Emoji,沿用原生 Thread SymbolBrowser 的搜索和八列网格,不使用文本输入框;可恢复继承分类图标。分类选择为图标加名称的自定义菜单,不使用浏览器 select。列表显示标题、正文摘要;Manual order 和 Most used 显示累计调用次数,Recently used 在相同位置显示上次调用时间,未调用显示 Never used;点击进入编辑。手动排序采用右侧三横手柄拖拽,提示词限制组内排序;分类管理同样拖拽排序。Alt + ↑ / ↓ 提供键盘操作。另支持按调用次数、最近调用排序。搜索及统计排序期间不显示手动重排控件,避免操作含义不明确。
|
|
35
|
-
|
|
36
|
-
## Popover
|
|
37
|
-
入口 Tooltip 为 Quick Prompts,面板不重复显示标题,不包含新增、编辑、收藏、删除或管理操作。最上方显示最近实际调用的 3 条,后面按分类与组内手动顺序展示全部提示词;最近项目仍留在所属分类,避免分类内容随调用跳动。空分类隐藏。
|
|
38
|
-
|
|
39
|
-
点击提示词只插入当前输入框,保留原草稿且不发送。Escape 关闭并回到入口;点击外部关闭;方向键移动列表焦点。原生 Add 或权限面板打开时关闭。切换输入框时关闭,异步结果不得插入另一会话。沿用原生焦点与 hover,无额外进场动画。
|
|
40
|
-
|
|
41
|
-
入口通过 Codex Adapter 的 `purpose:"insertion"` 挂载到可见的原生输入框,覆盖 Chat、Work、Codex、Temporary Chat、浮动聊天,以及 side panel 全屏非聊天页面的 chat bar。多输入框并存时优先当前焦点所在输入框;插入操作显式绑定打开面板的输入框,切换后关闭旧面板,不向隐藏输入框插入。此插入契约不扩展会话指标使用的 Codex thread 契约。
|
|
42
|
-
|
|
43
|
-
原生可见的 Add 或菜单按钮展开时关闭 Popover。Session Status 的 Context 展开状态不是弹出菜单,不作为冲突条件;隐藏输入框和隐藏控件不参与锚点定位或菜单判断。
|
|
44
|
-
|
|
45
|
-
## 统计
|
|
46
|
-
成功插入后原子增加 `use_count` 并更新 `called_at`,保存于现有 SQLite。创建、编辑、复制和排序不计数。历史次数未知,从 0 开始,不从旧 `last_used_at` 推断。删除分类、切换页面、重启不清零。
|
|
47
|
-
|
|
48
|
-
本地数据只以 textContent 和表单值渲染,不执行提示词里的 HTML。页面关闭恢复底层原生视图的焦点能力;功能禁用移除所有本功能入口和视图。
|
|
49
|
-
|
|
50
|
-
## 空状态与编辑细节
|
|
51
|
-
空分类和搜索无结果沿用 Scheduled 的48px Emoji、18px medium标题、次级说明布局;空分类提供 New prompt。All 分组副标题采用 text-sm、500字重与 text-tertiary。Cancel 选择通用 ghost,保存选择 primary,Delete 选择 danger;非空分类删除前独立确认,明确提示词移到 Other,内容与调用次数保留。
|
|
52
|
-
|
|
53
|
-
导航栏 book-open 单独采用 20px 容器、27×27 viewBox,实际轮廓约 16.15px,描边折算 1.33px,与原生导航一致。Lucide 两个描边子路径合为一个 path,一次绘制半透明 currentColor,避免书脊交叠变深。选中态使用 Phosphor 官方 book-open-fill 的20px资源;授权见 vendor/phosphor-LICENSE。输入框入口尺寸不变。
|
|
54
|
-
|
|
55
|
-
拖拽排序使用等高 Drop Placeholder,拖影跟随指针并显式按源行圆角裁切,不留下矩形外边界;同组条目以 180ms ease-out 让位,落位淡入 140ms。放到范围外或取消恢复原位,不写入排序。遵循 prefers-reduced-motion。
|
|
56
|
-
|
|
57
|
-
页面选择通用 Page 的 `sidebar:"none"` 分支,自身不带常驻二级侧栏,保留原生 Home、Space、Scheduled sidebar 的悬浮叠加与导航行为。关闭页面恢复原页面位置,不改变用户的侧栏展开偏好。原生二级入口(如 Space → Images)提交导航后,通过共享 Page 的 `onNavigate` 关闭 Prompts、编辑浮层并释放底层 inert;保留用户刚选择的目标路由。仅悬浮展开侧栏不退出 Prompts。
|
|
58
|
-
|
|
59
|
-
提示词编辑沿用原生 Project 的复合标题输入:40px 图标段位于标题前,细分隔线,共用圆角边框与 focus-within 状态。图标选择入口不再单独占一行;Title 通过 aria-label 标识。
|
|
60
|
-
|
|
61
|
-
Prompts 导航状态调用通用 `ui.navigationRail`:未选中/hover使用outline,选中使用filled,打开页面时取消原生视觉选中,关闭或卸载恢复。原生图标资源读取与选中属性恢复由通用层维护;Navbar Tooltip 使用通用右侧定位与原生延迟。
|
|
62
|
-
|
|
63
|
-
Category 下拉面板与触发栏等宽、左右对齐,宽度包含内边距;每次打开按当前触发栏尺寸计算。
|
|
64
|
-
|
|
65
|
-
## 语言
|
|
66
|
-
界面名称、操作、Tooltip、无障碍标签、空状态、错误提示与图标/颜色名称按 Codex 的语言显示中英文;日期按对应 locale 格式化。用户保存的提示词与分类名称原样展示,不随界面语言改写。
|
|
67
|
-
|
|
68
|
-
## 内置提示词与 Tooltip
|
|
69
|
-
|
|
70
|
-
内置 24 条来自 dsh-prompt 0.1.13 的 MIT 提示词,正文保持原样,按思考、学习、编程、效率分类并配 Emoji。来源与许可保存在 assets/dsh-prompt-LICENSE.txt。首次启动或旧库升级时单次导入;随后允许编辑和删除,重启不还原,也不重建被删除的分类。用户个人内容只保留在本机数据库,不纳入默认资源。
|
|
71
|
-
|
|
72
|
-
简短悬浮提示调用共享 Tooltip;具体文案由本功能维护。Quick Prompts 通过通用 ComposerMenu 使用原生浮动建议列表材质和输入框主体锚点。排序、分类与图标菜单显式选择 Dropdown。
|
|
73
|
-
|
|
74
|
-
Categories 管理弹窗的 New category 是有实际功能的次级操作,使用共享 Button 的 `secondary`(outline)分支;分类编辑的 Save 保留主按钮。
|
package/features/notes/README.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Prompts
|
|
2
|
-
|
|
3
|
-
导航栏扩展区最后的 **Prompts** 页面管理提示词;输入框 Add 与权限按钮之间的 **Quick Prompts** 只浏览和调用。
|
|
4
|
-
|
|
5
|
-
Quick Prompts 以当前可见 Codex 输入框定位;打开原生 Add、权限或模型菜单时关闭,Session Status 的展开状态不会关闭提示词列表。离开聊天后移除输入框入口与 Popover。
|
|
6
|
-
|
|
7
|
-
## 管理页面
|
|
8
|
-
- All 与分类 Tabs,搜索、新增、编辑、删除。
|
|
9
|
-
- 默认分类:生图、编程、文案、研究、翻译、效率、思考、学习;支持新增、改名、删除与排序。
|
|
10
|
-
- 分类图标和颜色复用 Codex 原生 SymbolBrowser 的资源。单条提示词可设置一个 Emoji,否则继承分类图标。
|
|
11
|
-
- 使用右侧三横手柄拖拽调整组内顺序,也可按调用次数、最近调用排序。
|
|
12
|
-
- 删除分类会将提示词移至其他,保留正文、Emoji 和统计。
|
|
13
|
-
|
|
14
|
-
## 快速调用
|
|
15
|
-
- Tooltip 为 Quick Prompts;面板不显示重复标题或管理操作。
|
|
16
|
-
- 最近实际调用的 3 条排在最上面,然后按分类和手动顺序显示全部提示词。最近项目仍保留在所属分类;空分类隐藏。
|
|
17
|
-
- 点击只插入当前输入框,保留草稿,不发送消息。
|
|
18
|
-
- Escape、点击外部、切换会话或打开原生 Add 面板会关闭;方向键移动焦点。
|
|
19
|
-
|
|
20
|
-
## 统计与存储
|
|
21
|
-
只有成功插入输入框后才增加一次调用计数,并更新最近调用时间。浏览、编辑、创建、复制和排序不增加计数。SQLite 持久保存 `use_count` 与 `called_at`;历史次数未知,从 0 开始,不从旧的更新时间推算。切换页面和重启不会清零。
|
|
22
|
-
|
|
23
|
-
功能 ID 仍为 `notes`,沿用已有配置开关、CodexNotes 数据库和提示词。新增分类、Emoji、排序和统计字段;保留历史 Todo / Files 数据,不删除用户文件。原有收藏标记保留,但不参与新界面排序。
|
|
24
|
-
|
|
25
|
-
运行入口为 `src/main.mjs` → `quick-prompts-server.mjs`,仅开放提示词、分类、排序、调用记录及健康检查。页面经已认证 Runtime Host binding 访问固定允许的接口。旧 HTTP 服务、网页、Todo / Files 操作及文件清理代码已删除。`prompt-schema.mjs` 只负责向前迁移;`product.mjs` 负责提示词、分类和统计的事务读写。历史 Todo / Files 表保持原样。
|
|
26
|
-
|
|
27
|
-
服务仅监听 loopback,默认端口 47832。沿用 CODEX_NOTES_PORT、CODEX_NOTES_DATA_DIR、CODEX_NOTES_DATABASE。设计依据见 [DESIGN.md](./DESIGN.md)。未选中入口采用 Lucide book-open,选中导航入口采用 Phosphor book-open-fill(MIT,许可见 [phosphor-LICENSE](./vendor/phosphor-LICENSE)),拖拽手柄采用 Lucide menu。分类 SVG 来自当前 Codex 原生图标目录,未手绘替代路径。
|
|
28
|
-
|
|
29
|
-
内置 24 条已分类、带 Emoji 的快捷提示词,来自 MIT 授权的 dsh-prompt 0.1.13。首次启动或升级仅导入一次,后续编辑与删除不会被覆盖。个人提示词不随包发布。来源和完整许可见 [dsh-prompt-LICENSE.txt](./assets/dsh-prompt-LICENSE.txt)。
|
|
30
|
-
|
|
31
|
-
弹窗与浮层统一调用 UI 组件库提供的 `config.ui`(由 Runtime Host 注入),共享主题材质、标题、Close 和表单操作区;插件只维护内容及交互。
|
|
32
|
-
|
|
33
|
-
Quick Prompts 与原生 Add 一样定位到 `data-composer-body` 上沿;`data-codex-composer-root` 仅用于会话识别和控件检测。diff、request stack 等上方组件不抬高浮窗,层级沿用原生 z-index 50。
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Session Status 设计约定
|
|
2
|
-
|
|
3
|
-
通用视觉、材质、按钮、Tooltip 与原生 sidebar 层级遵循根 [DESIGN.md](../../DESIGN.md)。本文件只记录功能特有组件、布局、数据语义与通用组件选型。
|
|
4
|
-
|
|
5
|
-
## 意图
|
|
6
|
-
|
|
7
|
-
状态行紧随 Codex 原生输入框,帮助用户在长任务中快速判断回合、模型步骤、输出速度和 token 用量。视觉上作为输入框的附属信息,不争夺发送按钮与模型选择器的层级。
|
|
8
|
-
|
|
9
|
-
## Token 与布局
|
|
10
|
-
|
|
11
|
-
状态栏实例跟随可见正式会话的原生 Composer root,不跟随 contenteditable 编辑节点。发送时编辑区暂时不可交互或重建,同一外壳、同一会话的状态栏继续显示并保留展开选择和统计;不以延时隐藏掩盖变化。真正切换会话时清除旧统计,进入 home、隐藏外壳或迁入浮动输入框时移除实例。宿主读取身份与 Renderer 使用同一个 `composerSurface` 契约。
|
|
12
|
-
|
|
13
|
-
| 角色 | Codex token | 用途 |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| 次要文字 | `--color-text-tertiary` | 状态行文字与分隔符 |
|
|
16
|
-
| 主要文字 | `--color-text-primary` | 弹层标题和数值 |
|
|
17
|
-
| 分类进度 | Codex `--app-block-accent-purple`、`--app-block-accent-blue`、`--app-block-accent-green`,以及 `--color-token-border-default` | 各弹层的分类比例与未分类段 |
|
|
18
|
-
|
|
19
|
-
状态行和输入框共用内容宽度,单行高度为 24px,顶部留 2px 内边距;每个状态按钮高 22px,内边距为上下 3px、左右 6px。按钮之间 gap 为 4px,两组可见内容间距为 16px(6 + 4 + 6);按钮内图标与文字 gap 为 6px。状态行展开且可见时,在包含它的原生 `[data-thread-scroll-footer="true"]` 容器上将 `--thread-composer-bottom-inset` 设为 4px;默认主聊天底部 padding 从 16px 收为 4px,收起、隐藏或卸载后自动恢复。原生 panel 的 `pb-3` 与 compact 分支不消费该变量,保留其独立留白。展开的状态行使用 -4px 顶部外边距,将输入框下方原生 8px gap 的实际距离收为4px,收起时恢复。宽度不足时自然换行,不覆盖输入框或悬浮控件。统计图标采用 Lucide Gauge,用量图标采用 Phosphor Database 单路径版本,两者以 14px 绘制;上下文使用与 Codex 原生相同参数的 12px 百分环。弹层由按钮锚定,键盘可聚焦,Escape 和点击外部关闭。遵守系统减少动态效果设置,不添加持续动画。
|
|
20
|
-
|
|
21
|
-
挂载依据:2026-10-02,Codex 26.930.21537 的主聊天实测 DOM 与 `thread-scroll-layout` / `app-primary` 源码。状态行仍作为 `[data-codex-composer-root]` 的紧邻后续节点;中间的 `display:contents` 包装不改变它与输入框在外层 flex 中的顺序和宽度。折叠入口放在 reasoning 控件最接近 `items-center` 控制组的包装节点之前;原生 Context 环仍为带 `aria-label`、`role=img` 的 span,包含 SVG circle。新版默认 footer 使用 `pb-(--thread-composer-bottom-inset)`,不再匹配旧 `.pb-4` 规则。panel/compact 分支来自源码,未据此宣称侧边聊天的手动验收已完成。
|
|
22
|
-
|
|
23
|
-
状态行以当前输入框所在的会话为准,不依赖侧栏中可能因项目折叠而卸载的 Thread 行。新聊天没有会话 ID 时隐藏旧数据;首条消息建立会话后默认展开详细状态行;若用户曾收起,则沿用其选择。尚未取得的指标用 `—` 占位,不等待日志或 Token 用量;切换会话时立即清空旧数值,详情展开状态保持不变。
|
|
24
|
-
|
|
25
|
-
## 数据呈现
|
|
26
|
-
|
|
27
|
-
界面文案跟随 Codex 的 `html[lang]`:中文语言使用简体中文,其他语言使用英文;运行中切换语言时同步更新状态行和已打开的明细浮窗。MineCodex Web 使用同样的中英文规则提供本功能开关。
|
|
28
|
-
|
|
29
|
-
TPS 根据 Codex 会话事件计算有效样本的会话平均约值,以 `N tok/s` 呈现;分母仅扣除完整落在同一响应计时范围内、且不与已观测模型输出重叠的工具区间(含迟到事件,重叠区间仅扣一次);跨响应运行或与生成并行的后台工具不扣时,模型输出缺少结束时间时保守保留该样本的观测时长,不将其视为实时解码速度;缺少有效计时样本时显示 `—`。累计 token 与缓存比例来自 Codex 用量记录。上下文使用原生 Codex 桌面版的口径:最近请求 `last.totalTokens / modelContextWindow`,直接订阅原生会话的 `latestTokenUsageInfo`(`thread/tokenUsage/updated` 更新),压缩后与原生同步刷新,不依赖日志轮询;原生数据不可用时显示占位;状态栏显示百分环和数字,弹层显示用量、窗口容量和压缩次数。二级浮窗的 token 数按十进制换算为 K/M,省略 `tok` 后缀;TPS 仍保留 `tok/s`。日志可见历史只列有数据的指令、消息、工具交互三个短标签,估算值以 `~` 开头;工具结果同时接受字符串与内容数组,压缩后的 replacement_history 采用同一文本解析。6px 进度条使用 Codex 图标选择器的紫、蓝、绿配色,标签圆点保持同色;当前页面未暴露对应变量时使用 Codex 亮/暗主题原值。剩余的原生占用以浅灰表示;若估算合计超过原生占用,按比例缩放彩色段,让进度条终点始终对应原生总占用。不显示无法取得的工具定义,也不放解释性长文案。
|
|
30
|
-
|
|
31
|
-
上下文弹层按视觉归属排列:进度条下紧接三个可见历史分段,不加分段副标题;分隔线之后列原生占用合计、窗口容量和压缩次数。合计取原生最近请求用量,不是三个估算分段的求和。
|
|
32
|
-
|
|
33
|
-
会话统计浮窗只显示回合、步骤、首字延迟和 TPS。Token 用量浮窗以 Total 为主项,紧接比例条和输出(紫)、其他输入(蓝)、缓存输入(绿)三项,顺序与上下文弹层一致;分隔线后才显示缓存命中率。其他输入为总输入减缓存输入,包含缓存写入。三项使用同一分母。
|
|
34
|
-
|
|
35
|
-
TPS 标签后放置 12px Lucide info 图标,继承标签颜色,间距 6px。悬浮或键盘聚焦时使用共享 MineCodex tooltip,说明 GPT 等模型未公开完整思考过程及逐 Token 生成时间,此处为体感响应速度参考值,不代表真实 Token 生成速度;中英文随界面语言切换。Tooltip 层级高于详情浮窗。
|
|
36
|
-
|
|
37
|
-
### 折叠入口
|
|
38
|
-
- 首次安装默认展开;用户收起后在模型选择左侧显示 12px context 环,24px 热区;原生 context 环开启时隐藏原生重复入口,卸载时恢复。
|
|
39
|
-
- Tooltip 沿用原生 context 内容:上下文窗口、使用/剩余比例、已用/容量(k tokens);样式遵循通用 Tooltip。
|
|
40
|
-
- 点击环展开输入框下方详情,右侧 chevron-up 收起。原生布局一次切换到目标状态,测量切换前后的位置,仅用 transform 衔接输入框与模型控件;状态行入场配合4px位移与透明度过渡;中途反向按当前位移衔接。展开220ms、收起160ms,曲线 `cubic-bezier(0.23,1,0.32,1)`。反向操作从当前可见位置和透明度继续,取消旧动画;退出内容临时脱离布局,结束后恢复并 display:none,不保留父级 gap。reduced-motion 立即切换,收起内容不参与键盘焦点。展开状态跨会话、主聊天和 side chat 共享并持久保存,展开时隐藏输入框内的 context 环;每个输入框订阅自己的会话上下文和统计。
|
|
41
|
-
- Cache 按原始 cachedInputTokens / inputTokens 计算:大于99%显示一位小数,其余取整数,状态栏和详情共用格式。
|
|
42
|
-
|
|
43
|
-
输入框实例仅绑定可见的 thread composer。全屏标签页中的隐藏聊天、浮动 Quick Chat(含 right-panel composer overlay)、inert 区域不注入;原生移动输入框或切换可见性时销毁实例并取消订阅,返回聊天后重建。
|
|
44
|
-
|
|
45
|
-
明细采用通用 Popover,保持本功能的定位、尺寸及内容层级。当前通过 UI 组件库的 `config.ui.surface(panel, "popover")` 选择原生 Popover;功能继续拥有定位、尺寸与内容。
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# Session Status / 会话状态
|
|
2
|
-
|
|
3
|
-
在 Codex 输入框下方显示当前任务的回合、模型响应步骤、观测 TPS、累计 token 和缓存命中。点击状态行可查看统计、用量及上下文详情。
|
|
4
|
-
|
|
5
|
-
Context 直接订阅 Codex 原生会话状态。其他统计由 Runtime Host 只读解析本机 `~/.codex/sessions` 中的 Codex 会话事件,再通过已有 CDP 连接向注入脚本发送数值快照;页面只向 Host 请求刷新,不发送对话内容,也不修改 Codex 会话日志。远程任务或缺少本机日志时,无法取得的指标显示 `—`。
|
|
6
|
-
|
|
7
|
-
同一会话可能有多个 rollout 文件,包括续聊产生的 `<thread-id>_<session-id>.jsonl` 分段。读取器每 2 秒检查分段列表;新增分段时按事件时间重建会话统计,随后按各文件独立的读取位置增量更新。回合及模型响应按 ID 去重,累计 Token 采用日志给出的会话总量,不将不同分段的累计值相加。
|
|
8
|
-
|
|
9
|
-
新聊天没有会话 ID 时隐藏;发送首条消息、原生输入框出现会话 ID 后立即显示占位并请求数据,无需等待日志落盘、回答完成或 Token 用量返回。切换聊天时立即清除旧数值,拒绝 ID 不匹配的迟到快照;折叠侧栏不影响当前会话识别。输入框会话标记的属性变化也会触发更新。
|
|
10
|
-
|
|
11
|
-
生成中依据日志的 `task_started` 与完成/中断事件,每 500ms 请求统计;空闲时由 Runtime 每 2 秒刷新兜底,页面不重复轮询。首次找不到日志按 500ms、1s、2s、随后 10s 重试;持续缺失时不会高频扫描目录。并发请求按页面合并,统计刷新不占用图片等用户操作的串行队列。页面卸载或功能关闭会取消定时器、观察器与原生状态订阅。
|
|
12
|
-
|
|
13
|
-
统计读取当前会话 ID、推送快照的 CDP 请求分别有 3 秒超时;超时会清理待处理请求、忽略迟到响应,并关闭失效连接,由 Runtime 重新连接。共享 CDP 请求默认上限为 30 秒、连接握手为 10 秒,页面发现 HTTP 请求为 3 秒;超时本身不会自动重放发送消息、附件等操作。
|
|
14
|
-
|
|
15
|
-
## 口径
|
|
16
|
-
|
|
17
|
-
- 回合:唯一 `task_started` / `turn_context` 的 `turn_id`。
|
|
18
|
-
- 步骤:有 `token_usage_record` 的唯一 `response_id`,即已记录的模型响应次数。
|
|
19
|
-
- Token:优先采用逐响应记录的 `thread_token_usage`,旧日志缺少该记录时回退到 `token_count.total_token_usage`;缓存命中为 `cached_input_tokens / input_tokens`。未缓存输入为总输入减缓存读与缓存写。
|
|
20
|
-
- TPS:仅对可配对模型输出条目起点与逐次用量记录终点的响应,计算 `Σ output_tokens / Σ(观测时长 − 其中工具执行时长)`;重叠工具区间只扣一次,迟到的工具完成事件会回补已有样本,中断或结束回合会清空未配对计时。它是有效样本的会话平均约值,显示为 `N tok/s`,不是实时解码速度。缺少有效计时样本时显示 `—`。
|
|
21
|
-
- Token 构成:Total 下的比例条按输出(紫)、其他输入(蓝)、缓存输入(绿)显示三项在会话总用量中的占比;缓存命中率独立放在末尾,仍以总输入为分母。其他输入为总输入减缓存输入,包含缓存写入。
|
|
22
|
-
- 上下文:与当前 Codex 桌面版原生百分环相同,采用原生状态的 `last.totalTokens / modelContextWindow`,裁切至 0–100%。即使关闭原生百分环,本功能仍订阅其用量数据。二级浮窗在进度条下显示日志可见历史的指令、消息、工具交互本地估算,随后显示原生占用合计、窗口容量和压缩次数;`~` 表示估算,合计并非估算分段之和。进度条采用 Codex 原生配色,以紫、蓝、绿分别表示三类,未分类的占用为浅灰;彩色段按需缩放,整条终点对应原生总占用。工具定义因未写入日志而不显示。
|
|
23
|
-
- 压缩次数:读取会话日志中的 `compacted` 记录及其 `window_number`,兼容旧版 `context_compacted` 和 `ContextCompaction` 完成事件;同一次压缩的多种记录只计一次。若 `compacted` 含 `replacement_history`,分段估算以它替换压缩前历史,再累计后续记录。
|
|
24
|
-
|
|
25
|
-
统计图标使用 Lucide Static v1.31.0 的 Gauge;用量图标使用 Phosphor Icons 的 Database,单路径填充避免半透明色在路径交叠处加深。许可见 [`vendor/lucide-LICENSE`](vendor/lucide-LICENSE) 和 [`vendor/phosphor-LICENSE`](vendor/phosphor-LICENSE)。
|
|
26
|
-
|
|
27
|
-
会话统计浮窗的 TPS 标签带有同色 Lucide info 图标(Lucide 0.577.0 官方资源);悬浮或键盘聚焦可查看说明:GPT 等模型不公开完整思考过程及逐 Token 生成时间,TPS 仅为基于可观测事件估算的体感响应速度参考,不代表模型真实的 Token 生成速度。
|
|
28
|
-
|
|
29
|
-
## 上下文分类的可行性
|
|
30
|
-
|
|
31
|
-
当前桌面版原生百分环只需要 `last.totalTokens` 和 `modelContextWindow`。Codex 的会话用量事件还提供输入、缓存、输出和推理输出,但没有系统提示词、工具定义、对话消息各自的 token 数。日志中的 `session_meta.base_instructions`、`response_item` 角色与类型、`compacted.replacement_history` 可以形成有边界的活跃历史分段:基础与开发者指令、消息(包含压缩摘要)、工具调用与结果。参考 Codex 自身的粗估口径,将 UTF-8 可见文本按约 4 字节/token 计,图片按固定大小估算;全程本地运算,不调用模型。加密摘要参考 Codex 对编码长度的换算。
|
|
32
|
-
|
|
33
|
-
这些分段与准确的最近请求用量是两套口径:日志缺少完整工具定义和实际请求封装,且最新追加的条目可能尚未进入下一次请求,因此分段值不强求与总占用相加相等。旧日志没有 `replacement_history` 时只估算压缩后的可见后缀,不把压缩前历史继续累加。弹层保持简短,通过分组标题和 `~` 标记区分估算。二级浮窗所有 token 数按十进制(1K = 1,000,1M = 1,000,000)显示数量级,不附加 `tok`;速度继续使用 `tok/s`。
|
|
34
|
-
|
|
35
|
-
若将来 Codex 的事件或 App Server 增加分类用量,可用原生数据替换本地估算。
|
|
36
|
-
|
|
37
|
-
相关实现调研:[`picoSols/codex-usage-statusline`](https://github.com/picoSols/codex-usage-statusline) 也用 Codex `token_count` 计算总占用;[`auditt98/context-viewer`](https://github.com/auditt98/context-viewer) 用 `tiktoken` 给可见日志文本估算分类,但其 Codex 解析不能还原每次实际请求中的完整提示词和工具定义。[`HarnessDesk` 的 DSH 接入](https://github.com/HarnessDesk/HarnessDesk/blob/main/docs/context-usage.md) 从 DSH 自己的 token meter 接收分类投影,其 Codex 接入没有这项投影。[Codex App Server 用量协议](https://github.com/openai/codex/blob/main/codex-rs/app-server-protocol/schema/json/v2/ThreadTokenUsageUpdatedNotification.json) 只提供输入、缓存、输出、推理等用量种类和上下文窗口,没有按提示词、工具和消息拆分的字段。
|
|
38
|
-
|
|
39
|
-
会话 JSONL 和 Codex DOM 均属版本相关接口,升级 Codex 后需用隔离窗口重新验证。关闭本功能会移除注入节点和观察器。
|
|
40
|
-
|
|
41
|
-
Context 直接订阅原生会话的 `latestTokenUsageInfo`,与原生指示器共用 `thread/tokenUsage/updated` 数据源;压缩完成后随原生状态刷新,不等待日志轮询。切换会话时取消旧订阅,原生接口或用量不可用时显示 `—`,日志快照不覆盖原生占用。日志仍提供累计统计、压缩次数和历史分段估算;日志读取器也接受压缩后的最新重新计数。
|
|
42
|
-
|
|
43
|
-
首次安装默认展开输入框下方的会话统计,之后记住用户的展开或收起选择。详情最右侧箭头可收起,收起后点击模型选择左侧的 context 环重新展开;展开时隐藏输入框内的环,展开状态跨会话及 side chat 共享并记住;收起后不保留布局占位。悬浮显示原生同口径的上下文用量。Cache 超过99%时显示一位小数。
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Sidebar Focus
|
|
2
|
-
|
|
3
|
-
通用视觉、材质、按钮、Tooltip 与原生 sidebar 层级遵循根 [DESIGN.md](../../DESIGN.md)。本文件只记录功能特有组件、布局、数据语义与通用组件选型。
|
|
4
|
-
|
|
5
|
-
保留当前任务所在分类与 Project,收起其他分支。再次点击恢复进入聚焦前的展开状态;聚焦期间切换任务跟随路径。用户手动调整分支时退出聚焦并保留手动布局,无撤销浮层。
|
|
6
|
-
|
|
7
|
-
- 入口:展开侧栏的 Activity 与 Search 之间,随原生侧栏一起隐藏。
|
|
8
|
-
- 图标:整理操作使用 Lucide list-chevrons-down-up;可恢复布局时切换为 list-chevrons-up-down。16px,24px viewBox,描边 1.575 units(实际 1.05px)。
|
|
9
|
-
- 控件:继承原生 Activity 的 Button 类与 28px 热区。两种状态均使用 secondary / ghost,以图标表达下一步动作,不显示蓝色模式选中态;aria-pressed 保留可恢复状态的可访问语义。
|
|
10
|
-
- 中英文标题:Focus current task / 聚焦当前任务;Restore layout / 恢复布局。
|
|
11
|
-
- 折叠通过原生回调执行;React 元数据仅用于读取稳定分类、项目和会话身份。
|
|
12
|
-
- 无可识别当前路径时禁用;Activity 列表展示期间暂停整理。
|
|
13
|
-
- 状态仅作用于当前窗口;卸载不额外改变用户布局。
|
|
14
|
-
|
|
15
|
-
显式使用中性 data-color 与 data-variant,直接复用原生语义 token 适配明暗模式,不写死颜色或背景色。Activity 开启时按钮原生 disabled,暂停聚焦操作,关闭后恢复可用性。
|
|
16
|
-
|
|
17
|
-
Tooltip 由共享组件库通过 `data-minecodex-tooltip` 管理;插件只提供随聚焦状态变化的文案,不维护独立材质、定位或显示事件。克隆入口时移除原控件的 `title` 与 `aria-describedby`。
|
package/features/sites/DESIGN.md
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# Sites 扩展设计约定
|
|
2
|
-
|
|
3
|
-
通用视觉、材质、按钮、Tooltip 与原生 sidebar 层级遵循根 [DESIGN.md](../../DESIGN.md)。本文件只记录功能特有组件、布局、数据语义与通用组件选型。
|
|
4
|
-
|
|
5
|
-
状态:原生 Sites 增强,沿用宿主当前主题。开发来源与托管位置分开。
|
|
6
|
-
|
|
7
|
-
## 用户路径
|
|
8
|
-
|
|
9
|
-
Sites 标题工具区增加次要操作 Add site,保留官方 New。添加弹窗默认展示 Codex 本地项目中的网页入口候选(含未启动网站),不显示重复的项目分组标题,项目名称仅在候选次级文本呈现;候选使用 checkbox 多选,点击整行切换勾选;已收录项不再出现在候选列表中。两个模式底部统一提供 Cancel / Add,项目模式未选择时禁用 Add,点击后才批量收录;取消不保存选择。候选不自动收录;扫描不启动服务。打开已收录的未启动站点时,使用支持的启动方式按需启动。弹窗使用「Project / Custom」分段按钮切换;切换保留已填写的网址;项目模式自动扫描并直接展示候选,不显示搜索框、说明行或刷新按钮。「自定义网址」只提供网址和名称,默认作为外部网址收录,在无项目聊天中打开;不显示开发来源及说明。网址与名称均必填;名称不能仅含空白且最多160字符,网址须为不含嵌入凭证的有效 HTTP(S) 地址。不符合时禁用 Add,输入变化后实时更新。项目关联自动来自扫描,不在编辑弹窗暴露。
|
|
10
|
-
|
|
11
|
-
通过 MineCodex 添加的条目直接追加在 Space → Sites 的原生列表/网格中,保留官方条目,共用原生搜索与列表/网格切换,不提供额外筛选 tabs。标题下只显示主机地址与端口;访问列用图标 + Local address / External site,沿用原生 16px 图标、主文字色、text-sm 与 gap-1.5。Local 和 External 同时展示,访问列区分地址类型。操作列复用原生外部箭头,在默认浏览器打开;Project 条目菜单只提供移除,Custom URL 可编辑网址与名称,沿用添加校验。移除只移除入口。
|
|
12
|
-
|
|
13
|
-
## 原生 token 与组件
|
|
14
|
-
|
|
15
|
-
- 列表:复用原生 row 的 grid/subgrid、82px 最小高度、16px 内边距、rounded-xl 与 primary-ghost-hover。
|
|
16
|
-
- 网格:原生 210px 卡片,148px 预览与62px信息区;rounded-2xl、border-subtle、surface-card、shadow-sm。
|
|
17
|
-
- 按钮:复用原生 `_Button` 与 `_ButtonInner` 类以及 data-color / data-variant / data-size 状态接口。Add site 为 secondary outline;确认沿用 primary solid。
|
|
18
|
-
- 弹窗:选择通用 Dialog 的 opaque 分支(Sites Share),最大宽560px,不加独立操作区分隔线;当前通过 `config.ui` 接入。通用容器、遮罩、标题、Close及焦点契约遵循根规范。
|
|
19
|
-
- 分段按钮:使用原生 segmented-control 的统一底板、等宽选项及选中块,复用 gap/gutter/background/font-weight/thumb-background/thumb-shadow/option-highlight token;控件尺寸为 control-size-md,支持方向键切换与选中状态语义。
|
|
20
|
-
- 图标:从原生 Space 下的 Sites、New、行菜单节点克隆 SVG;不重画。扫描结果和添加后的条目异步获取真实网页截图,本地缓存;完成后替换占位。没有截图时保留原生 Sites 图标,不阻塞选择和添加。
|
|
21
|
-
|
|
22
|
-
## 打开与布局
|
|
23
|
-
|
|
24
|
-
通过原生 router 的项目 state、本地执行模式(prefillLocalExecution / prefillComposerMode)新建项目草稿,或定位无项目 thread,随后打开原生浏览器。保留原生已有未发送草稿,不发送消息。源关联失效时提示从可用项目重新添加,不静默变成外部来源。
|
|
25
|
-
|
|
26
|
-
浏览器就绪后收起聊天侧栏,调用原生 Enter full view,使当前网页占据完整工作区,并保留原生 Chat/网页标签及底部聊天输入框。已在 full view 时不反向切换;官方站点沿用原生打开路径,同样进入 full view。
|
|
27
|
-
|
|
28
|
-
## 验证
|
|
29
|
-
|
|
30
|
-
隔离 profile 验证发现、添加、路由、列表/网格、搜索、明暗主题、移除、服务停止后的保留;日常安装不注入开发实现。原生内部选择器变化时显示明确错误,不写死聊天宽度。
|
|
31
|
-
|
|
32
|
-
自定义网址的添加与编辑使用相同的两项表单,不提供来源选择浮层。关闭调用共享外壳的原生 Close;项目网页直接展示扫描结果,不重复显示项目分组标题。添加网址仅在分段面板中填写,不再提供底部重复入口或二级返回跳转。
|
|
33
|
-
|
|
34
|
-
More 菜单复用原生 Sites menu/menuitem/leadingIcon 类与 token:220px 最小宽度、4px gutter、菜单项 5px × 8px 内边距、16px 图标、6px 内容间距;文案为 Edit / Remove。Edit 复用原生 SVG,Remove 使用 Lucide trash-2,随主题继承文字色,悬停/聚焦时图标由75%到100%不透明度。
|
|
35
|
-
|
|
36
|
-
预览图加载使用主题文字色与 surface 混合的6%/16%渐变、1.6s单向扫光与 reduced-motion 规则;图片解码成功后替换骨架,失败才显示图标占位。Project websites 缩略图固定96×60(8:5),各加载状态不改变布局。外部箭头通过 electronBridge.sendMessageFromView 发送 open-in-browser,不使用普通 window.postMessage。
|
|
37
|
-
|
|
38
|
-
图标占位沿用预览区域的横幅比例和尺寸,不退回方形。使用 --color-background-primary-soft 浅灰底与 --color-text-primary 图标色(浅色模式黑色,深色模式对应主题色)。
|
|
39
|
-
|
|
40
|
-
预览区域描边复用原生 Sites 的 inset 0 0 0 1px var(--color-border),覆盖于图片/骨架/占位之上,不增加布局尺寸。项目站点副文本显示项目名;确认运行时附加全角括号中的端口号,例如 VonDoc(49706),未运行仅显示 VonDoc。不在界面展示历史时间。无项目归属的 Custom URL 继续显示地址。
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
### 添加弹窗按钮(共享表单外壳)
|
|
44
|
-
|
|
45
|
-
Add / Save 选择通用 primary(solid),Cancel 选择 ghost;有实质功能的次级操作选择 secondary(outline)。项目模式未选择候选、自定义模式表单无效时禁用确认。页面工具区按钮继续复用原生 `_Button`。
|
|
46
|
-
|
|
47
|
-
模式选择使用真正的 segmented button:两项等宽,统一底板,选中块使用原生 thumb 背景及阴影;不再使用 Sites ownership tabs 的独立胶囊外观。尺寸与颜色引用原生 control / segmented-control token,随明暗主题变化。
|
|
48
|
-
|
|
49
|
-
扫描等待使用三行结果骨架:96×60横幅、标题及项目名短条,复用预览图的原生 shimmer token,逐行错开动画相位。仅辅助技术读出查找状态,结果区标记 aria-busy;无虚构进度,扫描完成直接替换,沿用 reduced-motion 静态降级。
|
|
50
|
-
|
|
51
|
-
未选中分段选项使用 secondary-solid 配色:底板 background-secondary-solid,文字 text-secondary-solid,悬浮和按下分别使用 secondary-solid-hover / active;不再单独混合透明色。选中块保持原生 thumb 样式。
|
|
52
|
-
|
|
53
|
-
预览加载骨架绝对铺满图片区域,以窄斜向扫光带呈现明确运动,避免宽缓渐变看起来像静态灰块;图片解码完成才替换,失败才显示图标占位。
|
|
54
|
-
|
|
55
|
-
Custom 地址分类:localhost/回环、IPv4私有网段及链路本地、IPv6私有及链路本地、.local 使用 Local address;公网IP及普通域名使用 External site,不推断访问权限。普通域名不做DNS推断,故内网自定义域名可能归为外部。已有条目读取时同步重新分类。
|
|
56
|
-
|
|
57
|
-
打开 Project 网页前等待新草稿的 ComposerScope focusComposerNonce 与本次导航一致,避免仅检查输入框存在而误用旧聊天。浏览器打开消息同时携带站点目录(无目录时取项目根目录)作为 cwd。
|
|
58
|
-
|
|
59
|
-
新版 Sites 位于 `/space/sites`;注入与离开页面的布局判断使用该路由,移除旧 `/sites` 判断。
|
|
60
|
-
标题区通过 New 的语义定位创建入口;按钮容器复用原生 lg secondary Button,不再假设 New 提供 data-variant。
|
|
61
|
-
|
|
62
|
-
2026-10-02 隔离原生页面验证:新版已移除 Site ownership 筛选组;注入不依赖该组,也不隐藏官方条目。仅在原生列表为空且存在匹配的本地站点时隐藏原生空状态,保留头部与工具区;搜索无匹配或卸载时恢复。空状态定位排除本插件节点。
|
|
63
|
-
|
|
64
|
-
添加候选行使用 flex 横排:96×60 预览、可收缩的标题/项目名、16px checkbox,间距12px;表单 label 的块布局不应用于候选行。New 的 SVG 带桌面隐藏类,克隆为 Add site 图标时移除该显示限制。
|
|
65
|
-
|
|
66
|
-
## 添加候选筛选
|
|
67
|
-
|
|
68
|
-
Project 模式保持单一完整列表,按标题首字母排序(忽略大小写、数字自然顺序),同名按项目名与路径稳定排序;不设推荐、数量上限、筛选 tabs 或版本展开。
|
|
69
|
-
|
|
70
|
-
同一项目、相同归一目录的迭代仅展示一个入口:识别目录段或后缀中的 v/ver/version/rev/revision 数字版本,以及 final/latest/copy/backup/old 副本标记,也识别 name-1.2.0 形式的发布目录。明确版本号最高者优先;无版本号或版本相同时按入口文件修改时间选取。修改时间只用于内部选择,不作为运行或访问时间。不同目录和项目不因标题相同而合并。此规则作用于当前已支持的站点入口,不额外枚举任意 HTML 文件。
|
|
71
|
-
|
|
72
|
-
排除明确自测/证据目录(test/tests、__tests__、fixtures、test-results、playwright-report、coverage、agent-tests/checks/notes/reports、self-test)及 docs/research、internal-notes、implementation-notes;明确自测报告/实现说明标题同样排除。带 SKILL.md 的技能目录下 demo/example/examples/preview 属于技能说明示例,同样排除;普通项目的 docs、demo、prototype 保留。历史记录仅补充当前磁盘入口或在线服务,失效历史记录从发现缓存清除;不删除用户文件或已保存站点。
|
|
73
|
-
|
|
74
|
-
已添加的 entryId、相同 URL 或同一迭代组不再呈现为候选;后端仍保留完整有效入口供已保存站点启动与解析,不自动迁移用户之前保存的版本。全部已添加时显示“暂无可添加的项目网页”。批量添加部分成功时,成功项从候选中移除,失败项保留选择。
|
|
75
|
-
|
|
76
|
-
## 浏览器快捷添加
|
|
77
|
-
|
|
78
|
-
Codex 26.930.21537 隔离窗口验证:浏览器 panel 的 More(Browser options)菜单在 Downloads 下方插入 Add to Sites,复用原生菜单行样式;保持 History 等原生动作及 Escape 行为。方向键可经过注入项,Enter/Space 可激活,卸载移除入口。
|
|
79
|
-
|
|
80
|
-
通过菜单所属浏览器的原生状态读取实时 URL、标题及本地 cwd,不读取地址栏草稿,也不使用其他选中标签的缓存。仅支持无嵌入凭证的 HTTP(S) 页面。点击后预填添加弹窗,沿用 Project / Custom 分段选择与网址、名称校验。已确认本地项目归属的本地地址默认 Project;其余默认 Custom。有本地项目上下文时可切换 Project,无归属时禁用该项。远程浏览器路径不映射为本机项目。
|
|
81
|
-
|
|
82
|
-
保存 Project 使用已确认项目身份,Custom 使用独立网址身份;复用既有重复检测。保存或取消后仍留在浏览器,不跳转 Sites,不发送聊天消息。原生 browserState、菜单动作及关闭协议仅由 Sites Adapter 解释,后端负责校验 URL 和本机项目目录归属。
|
package/features/sites/README.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Local & Self-hosted Sites
|
|
2
|
-
|
|
3
|
-
Extends the native Sites page. **Add site** discovers website entries from local Codex project files, including stopped sites, and supplements them with running HTML services. Candidates form one alphabetical list: recognized iterations show only the latest, already-added sites are omitted, and clear agent test/report artifacts and invalid discovery history are excluded. Select candidates with checkboxes and confirm with Add, or use Custom URL to enter an HTTP/HTTPS URL and name. Both modes provide Cancel / Add; Add stays disabled until the selection or required fields are valid.
|
|
4
|
-
|
|
5
|
-
**Browser shortcut:** open the browser panel’s More menu and choose **Add to Sites** below Downloads. URL and name are prefilled from that browser tab. Choose Project (when local project context is available) or Custom and confirm; the browser stays open. Local addresses with a confirmed project default to Project; other pages default to Custom. Only HTTP(S) URLs without embedded credentials are accepted.
|
|
6
|
-
|
|
7
|
-
- Project: opens a native new draft in that project.
|
|
8
|
-
- Projectless chat: reopens the original conversation.
|
|
9
|
-
- External: opens a native projectless draft.
|
|
10
|
-
|
|
11
|
-
Existing unsent drafts are preserved; opening a site never sends a message. Saved entries remain when the service stops. Missing projects/chats prompt removal and addition from an available project. Project entries have no Edit site action; Custom URL editing only exposes URL and name. Remove from Sites only deletes the local shortcut.
|
|
12
|
-
|
|
13
|
-
Opening a saved or official site collapses the chat sidebar and uses the native splitter's maximum browser width once. It does not save a new resize preference or continuously override manual dragging.
|
|
14
|
-
|
|
15
|
-
## Storage and discovery
|
|
16
|
-
|
|
17
|
-
Project entry identity uses project + directory rather than port. `project-history.json` stores actual MineCodex launch times (`lastStartedAt`) and observed online times (`lastSeenAt`). The UI displays the project name and adds the port in parentheses only when confirmed running. Custom URLs without a project display their address. Historical timestamps are not shown or inferred from file timestamps.
|
|
18
|
-
|
|
19
|
-
Local records: `sites/sites.json` under the MineCodex application support directory. `MINECODEX_SITES_DATA_DIR` can isolate the store for development. Native OpenAI site records and sharing permissions are not modified.
|
|
20
|
-
|
|
21
|
-
macOS discovery associates listening processes' working directories with Codex local project roots, then checks HTML responses with bounded time and size. APIs, unrelated processes and redirects are excluded. Simulator preview bridges (`serve-sim` and `swiftui-preview-browser`) are excluded by full process command before any HTTP request: their homepages may execute `simctl` and trigger Xcode installation. Processes whose full command is unavailable are also skipped; manual addition remains available. Windows uses listening-process command lines when they contain a known project path; Windows does not expose the same cwd metadata, so services with relative-only command lines require manual addition. Project file discovery is deterministic code: it recognizes simple Vite / Next dev / Astro dev scripts and package-free directories containing index.html. It traverses up to four levels with a 4,000-directory budget, skipping hidden directories, dependencies and common build outputs. It does not execute config files or use an LLM. External worktrees and remote hosts are not yet included; complex scripts and arbitrary subpath routes remain outside automatic detection. Manual URLs can include paths or self-hosted domains.
|
|
22
|
-
|
|
23
|
-
Discovery never starts services. Opening a saved stopped site can start a supported, already-installed framework or a loopback-only static server; dependencies are not installed and arbitrary npm scripts are not executed. MineCodex stops only its own launched services when its runtime stops. No external network ranges are scanned, and no pages or thumbnails are uploaded. Discovery candidates and saved custom sites request background screenshots through an isolated headless Chrome/Edge profile. Previews are cached locally by URL in `previews/`, outside the site records, and reused after restart. Capture does not block Add/Remove. Browser absence, unavailable pages, simulator bridges, or capture failure leave the native placeholder; private browser login sessions are not reused. Screenshots currently capture a 960×600 viewport after a bounded render wait, and are not live previews.
|
|
24
|
-
|
|
25
|
-
## Native UI boundary
|
|
26
|
-
|
|
27
|
-
The renderer owns `data-mcx-sites` elements. Saved local sites join the native Space → Sites list/grid and search without additional filter tabs. Native empty states are suppressed only while matching local results are displayed and restored on cleanup. It uses native Sites layout classes, current semantic theme tokens, and the existing Prompts dialog/menu patterns. The route-state and resize adapters depend on native renderer internals and must be verified against app updates. Icon sources: native Sites controls, existing Prompts resources, and the Lucide monitor icon; Lucide license is included in `vendor/`.
|
|
28
|
-
|
|
29
|
-
弹窗与浮层统一调用 UI 组件库提供的 `config.ui`(由 Runtime Host 注入),共享主题材质、标题、Close 和表单操作区;插件只维护内容及交互。
|
|
30
|
-
|
|
31
|
-
Iteration selection uses explicit numeric version directory names/suffixes (v/ver/version/rev/revision), then entry-file modification time for equal or unnumbered copies (final/latest/copy/backup/old). Titles alone never merge independent sites. This applies to discovered entries, not arbitrary HTML files. Semver release directories such as name-1.2.0 are also recognized. Demo/example/preview folders owned by a SKILL.md are treated as agent skill documentation; ordinary project documentation sites, demos and prototypes remain eligible. Saved entries keep their existing target; discovery filtering does not rewrite the library. Invalid history is pruned only when no current file entry or live service supports it.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# 任务切换:会话通知
|
|
2
|
-
|
|
3
|
-
状态(2026-10-03):暂停接入,等待重新设计注入场景。manifest 标记 disabled,Runtime Host 不发现或组装此功能;CLI 和控制台不提供启用入口,旧启用配置被移除。以下保留设计与源码供后续评估,不代表当前可用功能。
|
|
4
|
-
|
|
5
|
-
通用视觉、材质、按钮、Tooltip 与原生 sidebar 层级遵循根 [DESIGN.md](../../DESIGN.md)。本文件记录通知条的触发、布局和状态规则。
|
|
6
|
-
|
|
7
|
-
## 触发与原生边界
|
|
8
|
-
|
|
9
|
-
会话侧栏不可见时,左上方自动显示通知堆栈,包括 Home 折叠状态,以及 Space、Projects 等没有会话侧栏的页面。判断真实会话导航内容的可见性,不把“侧栏展开偏好”当作当前页面具有会话侧栏的证据。Home 为当前导航且侧栏展开时,按原生 trigger 的 aria-expanded 立即隐藏通知,不等待会话列表挂载、布局或每秒刷新;原生状态 CSS 约束同步隐藏卡片、装饰和展开按钮,Adapter 同时检查全部可见会话列表。Home 临时侧栏或其他原生侧栏 peeking 展开期间隐藏通知;离开后恢复,原生悬浮侧栏保持可进入、可点击。
|
|
10
|
-
|
|
11
|
-
不创建额外入口,不改 Chat 标题的属性、热区和窗口拖拽行为,不替换 Sidebar.left 图标,也不修改 Home 原生蓝点。不点击 Activity、不切换原生筛选或展开偏好。旧入口在 Runtime Host 替换插件时由旧实例 cleanup 恢复。
|
|
12
|
-
|
|
13
|
-
## 通知条
|
|
14
|
-
|
|
15
|
-
堆栈以 Navbar 右侧8px、原生标题栏下沿8px为左上角原点;无标题栏内容时取 Navbar 顶缘。位置不依赖可点击的会话标题。宽320px,窄窗口缩小,右侧/底部保留12px。每条是独立的共享 opaque Popover,圆角16px,间距8px;没有列表标题、整块菜单底板或页面遮罩。堆栈位于页面和常驻二级侧栏之上、原生菜单和模态浮层之下(当前角色实现层级45);原生侧栏 peeking 时暂停呈现。空白区域不拦截点击,溢出可滚动。默认仅显示前三条通知;超过三条时,第三条下方露出两层逐级缩进的卡片边缘,并显示“X more notifications”按钮,X 为总数减三。点击后展开全部,使用窗口剩余高度;只有展开内容超出该高度时才启用底部半条左右的渐隐,不再显示遮挡数量文字。滚动到底部解除渐隐。展开状态仅限当前页面;原生内存路由 pathname 变化(包括会话跳转)后恢复三条,并回到堆栈顶部。同页通知刷新、滚动及临时侧栏隐藏不重置。跨页收拢使用320ms缓出高度过渡,多余卡片淡出,层叠与按钮跟随收拢显现;尊重 reduced-motion。通知清空、账号切换或插件重载也重置。
|
|
16
|
-
|
|
17
|
-
条目保持现有信息结构:13px/18px标题、可用时的12px/16px原生回答摘要(最多两行,超出截断;短摘要不强占两行)、11px/16px项目名与12px原生项目图标。远程图标紧随标题;状态显示需要回复/等待批准标签、相对时间。未读且已结束的条目在时间右侧显示蓝点。内容 padding 四周统一使用功能 spacing token `--mcx-notification-padding:14px`,行间4px。状态文字和无障碍标签随宿主语言,用户标题和摘要不翻译。
|
|
18
|
-
|
|
19
|
-
新条目与堆栈推移采用320ms ease-out(cubic-bezier(.22,1,.36,1)),从当前视觉位置接续被打断的移动;状态解除以180ms淡出并收拢空位。内容更新保留卡片和点击目标,采用180ms淡入,不重播整卡入场;倒计时只更新标签内的数字与进度,不重建标签。尊重 reduced-motion。键盘可聚焦并点击条目;右上角外沿关闭按钮在 hover/focus 时显示,关闭仅影响本窗口通知,不标记原生已读。
|
|
20
|
-
|
|
21
|
-
## 状态与生命周期
|
|
22
|
-
|
|
23
|
-
- 范围沿用原有 Codex 会话类别:需要回复、等待批准、已结束且未读;排除单纯 Loading 和没有这些状态的最近访问会话。
|
|
24
|
-
- 每个 Thread key 只保留一条;按状态事件发生顺序倒序,而非按状态优先级。首次载入按原生消息时间排序。
|
|
25
|
-
- 需要回复/批准与已结束未读之间的变化产生新事件;未读状态下消息时间变化也产生新事件。Loading 不产生通知;普通摘要刷新和重绘不改变顺序。
|
|
26
|
-
- 当前可见会话、已解决/已读或重新进入 Loading、从原生目录移除的会话自动移除。身份消失不沿用 sidebar 残留选中项。
|
|
27
|
-
- 通知不自动超时消失;可点击跳转、关闭单条,或等原生状态消除。关闭后同一事件不重复弹出,新事件可以再次提醒。
|
|
28
|
-
- 侧栏显示时暂停呈现,保持状态跟踪;重新折叠时显示仍有效的通知。账号变化清空本窗口关闭记录。
|
|
29
|
-
- Needs input 的倒计时读取原生自动处理请求:pendingRequest 的 userInputRequestId 必须匹配 resolution 的 requestId,且 resolutionState.status 为 scheduled。标签同步剩余秒数及进度,暂停或延期跟随原生数据。归零不自行推断 Working;原生 attention 清除并恢复 Loading 后才退出。当前安装版本 Awaiting approval 没有倒计时契约,不伪造计时或自动批准。
|
|
30
|
-
- 不持久化通知正文,不发送消息、不执行批准操作。订阅原生 store 变化,并保留每秒刷新以更新相对时间与倒计时;DOM/窗口布局变化也触发刷新;不为通知发送网络请求。首次连接读取安装包 JS 以解析原生角色。
|
|
31
|
-
|
|
32
|
-
## 数据适配与验证边界
|
|
33
|
-
|
|
34
|
-
Codex 26.930.21537,2026-10-03:隔离 Renderer 确认侧栏只挂载7条,而原生 `allSidebarThreadKeys` 目录含72条。Adapter 从 Navbar 当前 React scope 读取原生目录、需要回复/批准、工作与未读 selector,并复用原生会话导航函数。不会因项目折叠或 Space 页面隐藏 Home 列表而只剩可见条目。项目归属来自原生项目目录;标题使用原生实时标题 selector。摘要沿用 View Activity 的数据与转换契约:从原生 turns selector 倒序查找最近的 agentMessage,调用同一原生文本转换函数,不再从侧栏行 DOM 读取。原生 scope.watch 订阅目录、项目、标题、状态、未读及回复数据,更新时刷新原卡片;摘要晚到不改变通知事件、排序或关闭记录。未读/待输入/待批准时机仍由原生状态决定,不为了等待摘要而延迟提醒;原生没有可用回复时不编造文字。项目图标仍在相应原生行已挂载时读取。
|
|
35
|
-
|
|
36
|
-
压缩符号及导出名通过语义调用关系动态解析;文件名哈希不作为契约。缺失模块/scope/状态契约时隐藏通知并通过 `nativeCapabilities()` 报告,不使用旧账号或旧会话快照假装成功。尚未创建的任务占位不显示,原有非 Codex 的 ChatGPT 会话不因本次改版新增覆盖范围。
|
|
37
|
-
|
|
38
|
-
验证覆盖队列去重、状态新旧、已读/当前/移除、关闭与再次提醒、源码序列化、原生角色契约、侧栏可见性和卸载。真实等待批准/输入事件需要实际发生才能完成端到端验收;受控样例只证明呈现与交互,不冒充真实通知到达。
|
|
39
|
-
|
|
40
|
-
- 等待批准沿用原生绿色标签,通过共享主题映射读取 chart-green;远程任务保留标题旁的原生远程设备图标。
|
|
41
|
-
- 关闭按钮使用原生 SVG 在圆形容器内居中;常态与 hover 均保留不透明底色,避免露出通知边框。
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"id": "unread-inbox",
|
|
4
|
-
"disabled": true,
|
|
5
|
-
"version": "0.1.0",
|
|
6
|
-
"label": {
|
|
7
|
-
"en": "Task Switcher",
|
|
8
|
-
"zh-CN": "任务切换"
|
|
9
|
-
},
|
|
10
|
-
"description": {
|
|
11
|
-
"en": "Get chat notifications when the sidebar is hidden.",
|
|
12
|
-
"zh-CN": "收起侧栏时接收会话通知,点击返回聊天。"
|
|
13
|
-
},
|
|
14
|
-
"entry": {
|
|
15
|
-
"kind": "page-script",
|
|
16
|
-
"script": "src/unread-inbox.mjs",
|
|
17
|
-
"sourceFactory": "src/injection-source.mjs"
|
|
18
|
-
},
|
|
19
|
-
"icon": {"viewBox": "0 0 24 24", "markup": "<path d=\"M10.268 21a2 2 0 0 0 3.464 0\" />\n <path d=\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\" />"},
|
|
20
|
-
"placement": {
|
|
21
|
-
"order": 70
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
// 从原生调用关系解析角色;构建哈希和压缩变量名不作为契约。
|
|
2
|
-
export function discoverThreadBindings(source) {
|
|
3
|
-
const requireMatch = (pattern, text = source) => {
|
|
4
|
-
const value = text.match(pattern)?.[1];
|
|
5
|
-
if (!value) throw new Error("Native task notification contract changed");
|
|
6
|
-
return value;
|
|
7
|
-
};
|
|
8
|
-
const rowStart = source.lastIndexOf("function ", source.indexOf("codex.localTaskRow.needsInput"));
|
|
9
|
-
const row = source.slice(rowStart, source.indexOf("var ", rowStart));
|
|
10
|
-
const attentionValue = requireMatch(/([\w$]+)===`approval`\|\|[\w$]+\?\{id:`awaiting-approval`/, row);
|
|
11
|
-
const statusValue = requireMatch(/[;,][\w$]+=([\w$]+);\([\w$]+===`response`/, row);
|
|
12
|
-
const escape = value => value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");
|
|
13
|
-
const selectorFor = local => requireMatch(new RegExp(`${escape(local)}=[\\w$]+\\(([\\w$]+),`),row);
|
|
14
|
-
const resolutionValue = requireMatch(/([\w$]+)\?\.requestId===[\w$]+\.userInputRequestId/, row);
|
|
15
|
-
const pendingValue = requireMatch(/=([\w$]+)\?\.pendingRequest/, row);
|
|
16
|
-
const durationName = requireMatch(/durationMs:([\w$]+)/, row);
|
|
17
|
-
const durationMs = Number(requireMatch(new RegExp(`${escape(durationName)}=([0-9.eE+]+)`)));
|
|
18
|
-
const previewIndex=source.search(/\.type===`agentMessage`/);
|
|
19
|
-
const preview=source.slice(source.lastIndexOf("=>{",previewIndex),source.indexOf("return null})",previewIndex));
|
|
20
|
-
const previewHelper=requireMatch(/let [\w$]+=([\w$]+)\([\w$]+\.text\)/,preview);
|
|
21
|
-
const roles = {
|
|
22
|
-
activityTurns:requireMatch(/let [\w$]+=[\w$]+\(([\w$]+),[\w$]+\);if\([\w$]+==null\)return null;for/,preview),
|
|
23
|
-
previewText:requireMatch(new RegExp(`function ${escape(previewHelper)}\\([\\w$]+\\)\\{let [\\w$]+=([\\w$]+)\\(`)),
|
|
24
|
-
title:requireMatch(/=[\w$]+\(([\w$]+),\{hostId:[^}]+,threadId:[\w$]+\}\)\?\?[\w$]+\?\.title/,row),
|
|
25
|
-
resolution: selectorFor(resolutionValue),
|
|
26
|
-
pending: selectorFor(pendingValue),
|
|
27
|
-
catalog: requireMatch(/allSidebarThreadKeys:[\w$]+,pinnedThreadKeys:[\w$]+\}=[\w$]+\(([\w$]+)\)/),
|
|
28
|
-
thread: requireMatch(/let [\w$]+=[\w$]+\(([\w$]+),[\w$]+\);return [\w$]+==null\?\[\]:\[\{task:/),
|
|
29
|
-
projects: requireMatch(/([\w$]+)=[\w$]+\([\w$]+,\([\w$]+,\{get:[\w$]+,scope:[\w$]+\}\)=>\{let [\w$]+=[\w$]+!==`chatgpt`/),
|
|
30
|
-
attention: selectorFor(attentionValue),
|
|
31
|
-
status: selectorFor(statusValue),
|
|
32
|
-
unread: requireMatch(/let [\w$]+=[\w$]+\(([\w$]+),[\w$]+\),[\w$]+=[\w$]+\.roomId/,row),
|
|
33
|
-
navigate: requireMatch(/\.navigate\([\w$]+\([\w$]+\)\):([\w$]+)\(/,row),
|
|
34
|
-
};
|
|
35
|
-
const exports = source.slice(source.lastIndexOf("export{"));
|
|
36
|
-
return {countdownDuration:{value:durationMs}, ...Object.fromEntries(Object.entries(roles).map(([role,local]) => {
|
|
37
|
-
const name = exports.match(new RegExp(`(?:\\{|,)${escape(local)} as ([\\w$]+)(?:,|\\})`))?.[1];
|
|
38
|
-
if (name) return [role,{name}];
|
|
39
|
-
for (const match of source.matchAll(/import\{([^}]+)\}from["']([^"']+)["']/g)) {
|
|
40
|
-
const binding=match[1].split(",").map(s=>s.trim().split(/\s+as\s+/)).find(parts=>parts.at(-1)===local);
|
|
41
|
-
if (binding) return [role,{name:binding[0],file:match[2]}];
|
|
42
|
-
}
|
|
43
|
-
throw new Error(`Native task notification role unavailable: ${role}`);
|
|
44
|
-
}))};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export async function loadThreadBindings() {
|
|
48
|
-
const url=[...document.querySelectorAll('link[rel="modulepreload"],script[src]')].map(e=>e.href||e.src).find(url=>/\/app-initial-[^/]+\.js/.test(url));
|
|
49
|
-
if (!url) throw new Error("Native task notification module unavailable");
|
|
50
|
-
const source=await (await fetch(url)).text();
|
|
51
|
-
const bindings=discoverThreadBindings(source);
|
|
52
|
-
return Object.fromEntries(await Promise.all(Object.entries(bindings).map(async ([role,binding])=>{
|
|
53
|
-
if ("value" in binding) return [role,binding.value];
|
|
54
|
-
const value=(await import(binding.file ? new URL(binding.file,url).href : url))[binding.name];
|
|
55
|
-
if (value == null) throw new Error(`Native task notification role unavailable: ${role}`);
|
|
56
|
-
return [role,value];
|
|
57
|
-
})));
|
|
58
|
-
}
|