{"_id":"@buckeyestudio/toh-command-feedback","name":"@buckeyestudio/toh-command-feedback","dist-tags":{"next":"0.1.1-rc.2","latest":"0.1.1-rc.2"},"versions":{"0.1.1-rc.2":{"name":"@buckeyestudio/toh-command-feedback","description":"Log-only session feedback producer and human-facing slash command","version":"0.1.1-rc.2","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/dustinwloring1988/theopen-harness.git","directory":"packages/feedback/command-feedback"},"type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./src/*":"./src/*","./package.json":"./package.json"},"license":"MIT","author":{"name":"buckeyestudio"},"peerDependencies":{"@buckeyestudio/toh-commands":"^0.1.1-rc.2","@buckeyestudio/toh-session":"^0.1.1-rc.2","@buckeyestudio/toh-invariants":"^0.1.1-rc.2","@buckeyestudio/toh-anonymous-user-id":"^0.1.1-rc.2","@buckeyestudio/cordis":"^4.0.1","@buckeyestudio/toh-session-telemetry":"^0.1.1-rc.2"},"devDependencies":{"@buckeyestudio/cordis-plugin-include":"^1.0.6","@buckeyestudio/cordis-plugin-loader":"^1.0.2","@buckeyestudio/toh-commands":"^0.1.1-rc.2","@buckeyestudio/toh-llm":"^0.1.1-rc.2","@buckeyestudio/toh-invariants":"^0.1.1-rc.2","@buckeyestudio/toh-agent":"^0.1.1-rc.2","@buckeyestudio/toh-session":"^0.1.1-rc.2","@buckeyestudio/toh-anonymous-user-id":"^0.1.1-rc.2","@buckeyestudio/toh-session-telemetry":"^0.1.1-rc.2","@buckeyestudio/cordis":"^4.0.1"},"_id":"@buckeyestudio/toh-command-feedback@0.1.1-rc.2","bugs":{"url":"https://github.com/dustinwloring1988/theopen-harness/issues"},"homepage":"https://github.com/dustinwloring1988/theopen-harness#readme","_integrity":"sha512-KSz4rDCbCiOG9Jbk2A3sJd5H5qB7S0+OVaoezItyX1kadqBm1KTyVJoIy2wSQTbsolUYOrn+oMX4nEbdhMYoCQ==","_resolved":"/home/runner/work/theopen-harness/theopen-harness/dist/npm/buckeyestudio-toh-command-feedback-0.1.1-rc.2.tgz","_from":"file:/home/runner/work/theopen-harness/theopen-harness/dist/npm/buckeyestudio-toh-command-feedback-0.1.1-rc.2.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-KSz4rDCbCiOG9Jbk2A3sJd5H5qB7S0+OVaoezItyX1kadqBm1KTyVJoIy2wSQTbsolUYOrn+oMX4nEbdhMYoCQ==","shasum":"40cac2b71f84839b171df967cc87746b9ad805e1","tarball":"https://registry.npmjs.org/@buckeyestudio/toh-command-feedback/-/toh-command-feedback-0.1.1-rc.2.tgz","fileCount":9,"unpackedSize":23034,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE992HvqLZXFzihUSq/qomI8HmqCSzS+7m42aVqPeRRPAiBm/SrTGeQ6IelzSWneDcNnCk/L20605cfTigce3JaPMA=="}]},"_npmUser":{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"},"directories":{},"maintainers":[{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/toh-command-feedback_0.1.1-rc.2_1787489189835_0.8854692350561681"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T12:46:29.729Z","0.1.1-rc.2":"2026-08-23T12:46:29.964Z","modified":"2026-08-23T12:46:30.115Z"},"maintainers":[{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"}],"description":"Log-only session feedback producer and human-facing slash command","homepage":"https://github.com/dustinwloring1988/theopen-harness#readme","repository":{"type":"git","url":"git+https://github.com/dustinwloring1988/theopen-harness.git","directory":"packages/feedback/command-feedback"},"author":{"name":"buckeyestudio"},"bugs":{"url":"https://github.com/dustinwloring1988/theopen-harness/issues"},"license":"MIT","readme":"# @buckeyestudio/toh-command-feedback\n\n[English](README.md) | 中文\n\n与触发方式无关的会话反馈，以及面向用户的 `/feedback` 采集。本包导出 `recordFeedback(session, text)`；该函数会追加一个仅写入日志的 `feedback/record` 事件。该插件通过 [`ctx.commands`](../../interaction/commands/README.zh.md) 注册一个全局命令，因此每个已组合的命令适配器都能发现它；随附的 Web 客户端无需模型轮次即可执行。\n\n## 命令约定\n\n| 输入 | 结果 |\n|---|---|\n| `/feedback <text>` | 追加 `feedback/record`，并以 `Feedback recorded for session {sessionId}`、`Anonymous user: {userId}` 加会话共享披露确认。 |\n| `/feedback` | 返回一个直接用法错误。仅含空白的输入视为空输入。 |\n\n前后空白会被丢弃，但除此之外，反馈内容不会被解析：不进行截断或大小写折叠，也不识别控制词。看起来像另一个命令的文本（例如 `/feedback /plan felt slow`）就是反馈内容。重复执行命令时，每次都会产生一个事件；不会发生替换或合并。\n\n## 会话共享披露\n\n确认文本会点名接收会话的 id，并报告该会话如何被共享；该信息通过插件上下文（`ctx.get('telemetry')`，绝不是声明的注入）从已挂载的 [`telemetry`](../../session/session-telemetry/README.zh.md) 服务读取。披露是依据后端 [`SessionTelemetrySharingStatus`](../../session/session-telemetry/README.zh.md) 选择的一句话：\n\n| 披露的状态 | 确认文本中的句子 |\n|---|---|\n| `full` | `Session sharing is enabled.` |\n| `feedback-only` | `Session sharing is feedback-gated; recording feedback releases the session prefix for sharing.` |\n| `disabled` | `Session sharing is disabled.` |\n| 无服务 | `Session sharing is not configured.` |\n\n披露只陈述部署当前的共享策略，绝不承诺投递或留存：在 `full` 或 `feedback-only` 下，记录被交给后端的非阻塞入队，批处理、重试与丢失策略归 SDK 负责，因此句子不声称任何内容已到达采集端；`disabled` 也不声称未来不会重新配置。披露不新增任何事件，也绝不会进入模型 surface。\n\n## 本插件做什么、不做什么\n\n`recordFeedback(session, text)` 是不依赖命令的写入路径。它拒绝规范化后为空的文本，并追加 `feedback/record { text }`；其他 UI、钩子或 host 集成无需构造斜杠命令即可调用它。`/feedback` 处理器通过该函数写入，且不启动任何模型工作。可选的 [`toh-session-telemetry-otel`](../../session/session-telemetry-otel) 消费方会观察该事件，但不改变它的采集约定。\n\n反馈文本只出现在一个持久载荷中：`feedback/record`。[`toh-commands`](../../interaction/commands/README.zh.md) 仍会追加通用的 `command/run` / `command/done` 配对，但此定义设置了 `recordInput: false`，因此 `command/run` 会省略 `args`；配对的 `command/done` 只携带结果。三个事件都仅写入日志，不出现在有序 surface、`deriveMessages()` 以及模型请求中。这些追加会启动持久化的常规即时排空，但两个生产方都不会强制 `session/flush`，因此确认文本表示反馈已进入日志，而不表示它已经落盘。确认文本同时标明接收反馈的会话和[共享匿名用户](../../identity/anonymous-user-id/)；对于某个 harness home，首次接受反馈时可能创建 `$TOH_HOME/.anonymous-user-id`。被拒绝的空输入只会留下以 `kind: 'error'` 结算的命令配对，不会产生 `feedback/record`，也不会查找用户 id。\n\n权威记录是该事件，而不是命令记录，因为反馈可能来自 `/feedback` 之外的触发方式。让载荷不进入 `command/run`，可避免两条记录携带相同文本。\n\n## 组合\n\n生产方只注入 `commands`。自定义应用挂载注册表以及本插件：\n\n```yaml\n- id: commands\n  name: '@buckeyestudio/toh-commands'\n- id: command-feedback\n  name: '@buckeyestudio/toh-command-feedback'\n```\n\n随附的 `toh` 基础组合无条件挂载此命令；它没有配置，也不依赖持久化 goal 栈。Web 客户端通过命令适配器暴露该命令。无头模式、ACP（Agent Client Protocol）自动化和 JSON-RPC 不提供命令适配器，因此不会暴露它。\n\n## 模型体验\n\n### 用户 `/feedback` 采集\n\n#### 模型看到的内容\n\n无。斜杠输入、`feedback/record` 以及确认文本都不出现在模型请求中。反馈事件和注册表生命周期记录仅写入日志且不携带 `surfaceOp`，因此它们绝不会进入有序 surface、`deriveMessages()` 或系统提示词。在某个轮次中记录反馈不会改变该轮次剩余的请求。\n\n#### Token 影响\n\n无直接 token 影响。无论是已接受的条目还是用法错误，都不会在记录所在轮次或此后任何轮次增加模型 token。\n\n#### KV Cache 影响\n\n与模型请求路径无关。记录只追加到会话日志，不触碰已经可复用的请求前缀。本包贡献的任何内容都不会使缓存复用失效。\n\n## 已知限制与暂缓工作\n\n- **没有反馈检索或管理 surface**：可选的 OTel 插件仅将该事件用作共享触发器。本包不为 `feedback/record` 提供检索、聚合、分类或面向模型的工具。\n- **没有结构化字段**：一条条目就是一个自由文本字符串，没有类别、严重程度或关联事件链接，因此无法在不重读文本的情况下按主题过滤反馈。\n- **不支持修改或撤回**：会话日志是仅追加的，本包也不新增 tombstone，因此错误的条目会一直保留在记录中，只能由后续条目取代。\n- **没有显式持久化屏障**：确认文本紧随追加而非 flush，因此紧临崩溃前记录的条目可能与其他未 flush 的尾部一同丢失。为反馈强制同步写盘并不值得；需要该保证的消费方可自行等待 `ctx.sessions.flush(session)`。\n- **新会话上没有可见的确认**：Web 转录只在会话激活后渲染命令行，因此在仍为空白的新会话上执行 `/feedback` 会记录事件但不会显示确认行。发送首条消息后再记录反馈即可正常渲染。\n- **随附的产品入口中只有 Web 使用此命令**：无头模式、ACP（Agent Client Protocol）自动化和 JSON-RPC 不提供命令适配器，因此 `/feedback` 在那里不可用。\n","readmeFilename":"README.zh.md","_rev":"1-7e65e41c8f753b4eeacb1866aaa82283"}