grix-connector 1.0.2

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.
Files changed (211) hide show
  1. package/README.md +149 -0
  2. package/dist/adapter/acp/acp-adapter.js +13 -0
  3. package/dist/adapter/acp/index.js +1 -0
  4. package/dist/adapter/acp/usage-parser.js +1 -0
  5. package/dist/adapter/claude/activity-status-manager.js +1 -0
  6. package/dist/adapter/claude/channel-notification.js +1 -0
  7. package/dist/adapter/claude/claude-adapter.js +15 -0
  8. package/dist/adapter/claude/claude-bridge-server.js +1 -0
  9. package/dist/adapter/claude/claude-tools.js +1 -0
  10. package/dist/adapter/claude/claude-worker-client.js +1 -0
  11. package/dist/adapter/claude/index.js +1 -0
  12. package/dist/adapter/claude/interaction-protocol.js +1 -0
  13. package/dist/adapter/claude/mcp-http-launcher.js +2 -0
  14. package/dist/adapter/claude/model-list.js +1 -0
  15. package/dist/adapter/claude/protocol-contract.js +1 -0
  16. package/dist/adapter/claude/result-timeout.js +1 -0
  17. package/dist/adapter/claude/skill-scanner.js +2 -0
  18. package/dist/adapter/claude/usage-parser.js +3 -0
  19. package/dist/adapter/codewhale/codewhale-adapter.js +6 -0
  20. package/dist/adapter/codewhale/index.js +1 -0
  21. package/dist/adapter/codex/codex-bridge.js +10 -0
  22. package/dist/adapter/codex/codex-trust.js +8 -0
  23. package/dist/adapter/codex/index.js +1 -0
  24. package/dist/adapter/codex/usage-parser.js +1 -0
  25. package/dist/adapter/cursor/cursor-adapter.js +8 -0
  26. package/dist/adapter/cursor/index.js +1 -0
  27. package/dist/adapter/deepseek/deepseek-adapter.js +6 -0
  28. package/dist/adapter/deepseek/index.js +1 -0
  29. package/dist/adapter/index.js +1 -0
  30. package/dist/adapter/opencode/index.js +1 -0
  31. package/dist/adapter/opencode/opencode-adapter.js +8 -0
  32. package/dist/adapter/opencode/opencode-transport.js +5 -0
  33. package/dist/adapter/opencode/opencode-types.js +0 -0
  34. package/dist/adapter/openhuman/index.js +1 -0
  35. package/dist/adapter/openhuman/openhuman-adapter.js +7 -0
  36. package/dist/adapter/openhuman/openhuman-transport.js +1 -0
  37. package/dist/adapter/openhuman/openhuman-types.js +0 -0
  38. package/dist/adapter/pi/index.js +1 -0
  39. package/dist/adapter/pi/pi-adapter.js +10 -0
  40. package/dist/adapter/pi/pi-transport.js +4 -0
  41. package/dist/adapter/pi/pi-types.js +0 -0
  42. package/dist/adapter/pi/usage-parser.js +1 -0
  43. package/dist/adapter/qwen/index.js +1 -0
  44. package/dist/adapter/qwen/qwen-adapter.js +4 -0
  45. package/dist/adapter/types.js +1 -0
  46. package/dist/agent/index.js +1 -0
  47. package/dist/agent/process.js +2 -0
  48. package/dist/aibot/client.js +1 -0
  49. package/dist/aibot/index.js +1 -0
  50. package/dist/aibot/types.js +0 -0
  51. package/dist/bridge/adapter-pool.js +1 -0
  52. package/dist/bridge/bridge.js +10 -0
  53. package/dist/bridge/deferred-events.js +1 -0
  54. package/dist/bridge/event-queue.js +1 -0
  55. package/dist/bridge/index.js +1 -0
  56. package/dist/bridge/respawn-manager.js +1 -0
  57. package/dist/bridge/revoke-handler.js +1 -0
  58. package/dist/bridge/runtime-config.js +1 -0
  59. package/dist/bridge/send-controller.js +1 -0
  60. package/dist/bridge/session-controller.js +9 -0
  61. package/dist/bridge/tool-card-utils.js +1 -0
  62. package/dist/core/access/allowlist-gate.js +1 -0
  63. package/dist/core/access/allowlist-store.js +1 -0
  64. package/dist/core/access/index.js +1 -0
  65. package/dist/core/aibot/client.js +1 -0
  66. package/dist/core/aibot/connection-handle.js +1 -0
  67. package/dist/core/aibot/connection-manager.js +1 -0
  68. package/dist/core/aibot/event-lifecycle-types.js +0 -0
  69. package/dist/core/aibot/index.js +1 -0
  70. package/dist/core/aibot/types.js +0 -0
  71. package/dist/core/config/index.js +1 -0
  72. package/dist/core/config/paths.js +1 -0
  73. package/dist/core/context/channel-context-resolution.js +1 -0
  74. package/dist/core/context/channel-context-store.js +1 -0
  75. package/dist/core/context/index.js +1 -0
  76. package/dist/core/context/transcript-channel-context.js +1 -0
  77. package/dist/core/file-ops/handler.js +1 -0
  78. package/dist/core/file-ops/list-files.js +1 -0
  79. package/dist/core/file-ops/types.js +0 -0
  80. package/dist/core/files/create-folder.js +1 -0
  81. package/dist/core/files/index.js +1 -0
  82. package/dist/core/files/list-files.js +1 -0
  83. package/dist/core/files/list-handler.js +1 -0
  84. package/dist/core/files/types.js +0 -0
  85. package/dist/core/files/utils.js +1 -0
  86. package/dist/core/hooks/hook-signal-store.js +2 -0
  87. package/dist/core/hooks/index.js +1 -0
  88. package/dist/core/log/bridge-event-log.js +2 -0
  89. package/dist/core/log/conversation-log.js +3 -0
  90. package/dist/core/log/index.js +1 -0
  91. package/dist/core/log/logger.js +6 -0
  92. package/dist/core/log/packet-log.js +2 -0
  93. package/dist/core/log/rotation.js +2 -0
  94. package/dist/core/mcp/event-tool-executor.js +1 -0
  95. package/dist/core/mcp/index.js +1 -0
  96. package/dist/core/mcp/internal-api-server.js +1 -0
  97. package/dist/core/mcp/tool-schemas.js +1 -0
  98. package/dist/core/mcp/tools.js +1 -0
  99. package/dist/core/persistence/active-event-store.js +1 -0
  100. package/dist/core/persistence/agent-global-config-store.js +1 -0
  101. package/dist/core/persistence/elicitation-store.js +1 -0
  102. package/dist/core/persistence/event-results-store.js +1 -0
  103. package/dist/core/persistence/permission-store.js +1 -0
  104. package/dist/core/persistence/question-store.js +1 -0
  105. package/dist/core/persistence/session-binding-store.js +1 -0
  106. package/dist/core/protocol/agent-api-media.js +1 -0
  107. package/dist/core/protocol/attachment-file.js +1 -0
  108. package/dist/core/protocol/index.js +1 -0
  109. package/dist/core/protocol/interaction-parser.js +1 -0
  110. package/dist/core/protocol/message-metadata.js +2 -0
  111. package/dist/core/protocol/message-reference.js +2 -0
  112. package/dist/core/protocol/payload-parser.js +11 -0
  113. package/dist/core/protocol/protocol-descriptor.js +1 -0
  114. package/dist/core/protocol/protocol-text.js +1 -0
  115. package/dist/core/provider-quota/index.js +1 -0
  116. package/dist/core/provider-quota/kiro.js +1 -0
  117. package/dist/core/provider-quota/providers.js +1 -0
  118. package/dist/core/provider-quota/types.js +0 -0
  119. package/dist/core/runtime/health.js +1 -0
  120. package/dist/core/runtime/index.js +1 -0
  121. package/dist/core/runtime/pidfile.js +2 -0
  122. package/dist/core/runtime/spawn.js +1 -0
  123. package/dist/core/text-segmentation/index.js +1 -0
  124. package/dist/core/text-segmentation/safe-markdown-stream-segmenter.js +6 -0
  125. package/dist/core/transport/index.js +1 -0
  126. package/dist/core/transport/json-rpc.js +3 -0
  127. package/dist/core/upgrade/npm-upgrader.js +2 -0
  128. package/dist/core/upgrade/upgrade-checker.js +1 -0
  129. package/dist/core/util/client-version.js +1 -0
  130. package/dist/core/util/codex-output-policy.js +1 -0
  131. package/dist/core/util/event-buffer.js +1 -0
  132. package/dist/core/util/index.js +1 -0
  133. package/dist/core/util/json-file.js +2 -0
  134. package/dist/core/util/normalize-string.js +1 -0
  135. package/dist/core/util/quoted-message-stream.js +3 -0
  136. package/dist/grix.js +28 -0
  137. package/dist/index.js +1 -0
  138. package/dist/log.js +3 -0
  139. package/dist/main.js +31 -0
  140. package/dist/manager.js +1 -0
  141. package/dist/mcp/acp-mcp-server.js +5 -0
  142. package/dist/mcp/stdio/server.js +10 -0
  143. package/dist/mcp/stream-http/config.js +1 -0
  144. package/dist/mcp/stream-http/connection-binding.js +1 -0
  145. package/dist/mcp/stream-http/event-tool-executor.js +1 -0
  146. package/dist/mcp/stream-http/gateway.js +1 -0
  147. package/dist/mcp/stream-http/index.js +1 -0
  148. package/dist/mcp/stream-http/security.js +1 -0
  149. package/dist/mcp/stream-http/session-manager.js +1 -0
  150. package/dist/mcp/stream-http/tool-executor.js +1 -0
  151. package/dist/mcp/stream-http/tool-registry.js +1 -0
  152. package/dist/mcp/stream-http/tool-schemas.js +1 -0
  153. package/dist/protocol/acp-client.js +1 -0
  154. package/dist/protocol/event-mapper.js +5 -0
  155. package/dist/protocol/index.js +1 -0
  156. package/dist/runtime/daemon-lock.js +2 -0
  157. package/dist/runtime/service-state.js +2 -0
  158. package/dist/scripts/approve-plan-hook.js +2 -0
  159. package/dist/scripts/elicitation-hook.js +6 -0
  160. package/dist/scripts/lib/read-stdin.js +1 -0
  161. package/dist/scripts/lifecycle-hook.js +2 -0
  162. package/dist/scripts/notification-hook.js +4 -0
  163. package/dist/scripts/permission-hook.js +5 -0
  164. package/dist/scripts/status-line-forwarder.js +2 -0
  165. package/dist/scripts/user-prompt-submit-hook.js +2 -0
  166. package/dist/service/platform-adapter.js +45 -0
  167. package/dist/service/process-control.js +1 -0
  168. package/dist/service/service-install-store.js +1 -0
  169. package/dist/service/service-manager.js +1 -0
  170. package/dist/service/service-paths.js +1 -0
  171. package/dist/session/index.js +1 -0
  172. package/dist/session/manager.js +1 -0
  173. package/dist/transport/index.js +1 -0
  174. package/dist/transport/json-rpc.js +3 -0
  175. package/dist/types/events.js +1 -0
  176. package/dist/types/index.js +1 -0
  177. package/dist/types/protocol.js +0 -0
  178. package/dist/types/session-state.js +0 -0
  179. package/dist/types/usage.js +0 -0
  180. package/openclaw-plugin/index.js +11271 -0
  181. package/openclaw-plugin/skills/grix-admin/SKILL.md +202 -0
  182. package/openclaw-plugin/skills/grix-admin/references/api-contract.md +210 -0
  183. package/openclaw-plugin/skills/grix-egg/SKILL.md +81 -0
  184. package/openclaw-plugin/skills/grix-egg/references/api-contract.md +40 -0
  185. package/openclaw-plugin/skills/grix-group/SKILL.md +164 -0
  186. package/openclaw-plugin/skills/grix-group/references/api-contract.md +97 -0
  187. package/openclaw-plugin/skills/grix-query/SKILL.md +247 -0
  188. package/openclaw-plugin/skills/grix-register/SKILL.md +86 -0
  189. package/openclaw-plugin/skills/grix-register/references/api-contract.md +76 -0
  190. package/openclaw-plugin/skills/grix-register/references/grix-concepts.md +26 -0
  191. package/openclaw-plugin/skills/grix-register/references/handoff-contract.md +24 -0
  192. package/openclaw-plugin/skills/grix-register/references/openclaw-setup.md +6 -0
  193. package/openclaw-plugin/skills/grix-register/references/user-replies.md +25 -0
  194. package/openclaw-plugin/skills/grix-register/scripts/grix_auth.ts +599 -0
  195. package/openclaw-plugin/skills/grix-update/SKILL.md +310 -0
  196. package/openclaw-plugin/skills/grix-update/references/cron-setup.md +56 -0
  197. package/openclaw-plugin/skills/grix-update/references/update-contract.md +149 -0
  198. package/openclaw-plugin/skills/message-send/SKILL.md +197 -0
  199. package/openclaw-plugin/skills/message-unsend/SKILL.md +186 -0
  200. package/openclaw-plugin/skills/message-unsend/flowchart.mermaid +27 -0
  201. package/openclaw-plugin/skills/openclaw-memory-setup/SKILL.md +282 -0
  202. package/openclaw-plugin/skills/openclaw-memory-setup/references/case-study-macpro.md +52 -0
  203. package/openclaw-plugin/skills/openclaw-memory-setup/references/host-readiness.md +147 -0
  204. package/openclaw-plugin/skills/openclaw-memory-setup/scripts/bench_ollama_embeddings.ts +326 -0
  205. package/openclaw-plugin/skills/openclaw-memory-setup/scripts/set_openclaw_memory_model.ts +385 -0
  206. package/openclaw-plugin/skills/openclaw-memory-setup/scripts/survey_host_readiness.ts +294 -0
  207. package/openclaw.plugin.json +24 -0
  208. package/package.json +114 -0
  209. package/scripts/install-guardian.mjs +30 -0
  210. package/scripts/install-guardian.sh +30 -0
  211. package/scripts/upgrade-guardian.sh +98 -0
@@ -0,0 +1,310 @@
1
+ ---
2
+ name: grix-update
3
+ description: 负责 Grix 插件的后续版本维护。适用于检查是否有新版本、执行插件升级、在升级后完成校验与重启,并按规则静默或通知主 agent;不负责首次安装、账号注册、本地绑定或安装私聊流程。
4
+ ---
5
+
6
+ # Grix Update
7
+
8
+ 这个技能只负责 **Grix 插件的版本维护**。
9
+ 目标是让 `grix-connector` 在已经装进 OpenClaw 之后,能按固定规则完成检查更新、升级验收和失败告警。
10
+
11
+ ## 角色边界
12
+
13
+ 1. 本技能只做插件更新相关动作:检查、升级、校验、重启、通知。
14
+ 2. 本技能不做首次安装、不做账号注册、不做 agent 绑定。
15
+ 3. 本技能不接管安装私聊;如果当前上下文仍处在 egg 安装流程中,停止并交回 `grix-egg` / `grix-admin`。
16
+ 4. 只走 OpenClaw 官方 CLI,不手改 `openclaw.json`,不写临时脚本改插件安装目录。
17
+
18
+ ## 适用场景
19
+
20
+ 1. 用户要求“检查 grix 是否有新版本”。
21
+ 2. 用户要求“升级 grix 插件”。
22
+ 3. 需要给后续自动化提供一个单独的维护技能。
23
+ 4. 定时任务想要静默检查,只有失败时才通知主 agent。
24
+
25
+ ## 输入参数
26
+
27
+ ### 通用参数
28
+
29
+ 1. `mode`(必填)
30
+ - `check-only`
31
+ - `apply-update`
32
+ - `check-and-apply`
33
+ 2. `plugin_id`(可选)
34
+ - 默认值:`grix`
35
+ 3. `notify_on`(可选)
36
+ - `failure`(默认)
37
+ - `always`
38
+ - `never`
39
+ 4. `main_agent`(可选)
40
+ - 主要用于 cron 的 `--agent <main_agent>` 或上层工作流标记“谁负责本机维护”
41
+ - 它本身不是可直接发送 Grix 消息的 `to` / `session_id` 目标;如果没有明确的可投递会话,不要因为拿到了 `main_agent` 就自行猜通知目标
42
+ 5. `allow_restart`(可选)
43
+ - 默认值:`true`
44
+
45
+ ### 推荐默认输入
46
+
47
+ ```json
48
+ {
49
+ "mode": "check-and-apply",
50
+ "plugin_id": "grix",
51
+ "notify_on": "failure",
52
+ "allow_restart": true
53
+ }
54
+ ```
55
+
56
+ ## 完成标准
57
+
58
+ 只有同时满足下面条件,才算完成:
59
+
60
+ 1. 已确认目标插件是否存在。
61
+ 2. 已确认当前安装方式是否支持自动更新。
62
+ 3. 已执行检查动作,并给出明确结果:无更新 / 已升级 / 失败 / 不支持。
63
+ 4. 若执行了升级,已完成:
64
+ - `openclaw plugins doctor`
65
+ - `openclaw gateway restart`(仅在 `allow_restart=true` 时)
66
+ - `openclaw health`
67
+ 5. 若配置了通知规则,已按规则完成通知或静默结束。
68
+
69
+ ## 执行规则
70
+
71
+ ### 0. 先做上下文守卫
72
+
73
+ 1. 如果当前明显是 egg 安装私聊,或上下文里有 `install_id`、`egg`、`install.route` 这类安装字段,不要执行更新,直接说明当前场景不适合升级插件并停止。
74
+ 2. 不要在正在进行的安装对话里触发插件升级。
75
+
76
+ ### 1. 先确认插件存在
77
+
78
+ 优先执行:
79
+
80
+ ```bash
81
+ openclaw plugins info <plugin_id> --json
82
+ ```
83
+
84
+ 规则:
85
+
86
+ 1. 若插件不存在,返回 `failed/not_installed` 并停止。
87
+ 2. 若命令失败,返回失败原因,不要继续猜测。
88
+
89
+ ### 2. 再确认当前是否支持自动更新
90
+
91
+ 先执行:
92
+
93
+ ```bash
94
+ openclaw plugins update <plugin_id> --dry-run
95
+ ```
96
+
97
+ 规则:
98
+
99
+ 1. 如果 dry-run 明确表示当前插件不可更新、未被跟踪、不是 npm 安装,返回 `unsupported/not_npm_install` 并停止。
100
+ 2. 只有支持更新时,才能继续后续流程。
101
+ 3. 不要把本地目录安装、`--link` 安装、手工拷贝安装强行当作可自动更新。
102
+
103
+ ### 3. `check-only`
104
+
105
+ 只做检查,不做升级。
106
+
107
+ 规则:
108
+
109
+ 1. 运行 dry-run。
110
+ 2. 若没有新版本:
111
+ - 返回 `no_update`
112
+ - 默认静默结束
113
+ 3. 若发现新版本:
114
+ - 返回 `update_available`
115
+ - 不执行真正升级
116
+
117
+ ### 4. `apply-update`
118
+
119
+ 假定调用方已经决定升级,直接执行升级。
120
+
121
+ 执行顺序:
122
+
123
+ ```bash
124
+ openclaw plugins update <plugin_id>
125
+ openclaw plugins doctor
126
+ openclaw gateway restart
127
+ openclaw health
128
+ ```
129
+
130
+ 规则:
131
+
132
+ 1. 若 `allow_restart=false`,跳过 `openclaw gateway restart`,但要明确说明升级后尚未重启,运行态可能仍是旧版本。
133
+ 2. 任一步失败都要立刻停止,并返回失败点。
134
+ 3. 不要在失败后自动连续重试。
135
+
136
+ ### 5. `check-and-apply`
137
+
138
+ 这是给自动化最合适的模式。
139
+
140
+ 规则:
141
+
142
+ 1. 先跑 dry-run。
143
+ 2. 若没有新版本:
144
+ - 返回 `no_update`
145
+ - 静默结束
146
+ 3. 若发现新版本:
147
+ - 执行 `apply-update` 的完整流程
148
+
149
+ ## 校验顺序
150
+
151
+ 如果执行了升级,校验必须按这个顺序走:
152
+
153
+ 1. `openclaw plugins doctor`
154
+ 2. `openclaw gateway restart`(如果允许)
155
+ 3. `openclaw health`
156
+
157
+ 不要写完升级命令就直接宣称成功。
158
+
159
+ ## 通知规则
160
+
161
+ `notify_on` 的行为固定如下:
162
+
163
+ 1. `never`
164
+ - 永远不发送通知
165
+ 2. `failure`
166
+ - 只有失败时通知主 agent
167
+ 3. `always`
168
+ - 成功和失败都通知主 agent
169
+
170
+ 补充规则:
171
+
172
+ 1. `main_agent` 只表示维护责任主体,不自动等价于某个可发送消息的会话目标。
173
+ 2. 如果当前上下文没有明确的维护会话或可复用的通知目标,就只返回结果,由上层 cron / 调用方处理通知;不要自行猜 `to`、`session_id` 或私聊目标。
174
+ 3. cron 场景优先用 `notify_on=never`,由 cron 运行记录收口。
175
+
176
+ 默认使用 `failure`。
177
+
178
+ ## 通知内容要求
179
+
180
+ 通知必须简短,只说结果,不展开技术细节。
181
+
182
+ 建议文案风格:
183
+
184
+ 1. 成功:
185
+ - `grix 插件已升级完成,当前检查正常。`
186
+ 2. 无更新:
187
+ - `grix 插件已检查,当前没有新版本。`
188
+ 3. 失败:
189
+ - `grix 插件自动更新失败,卡在 <步骤>。`
190
+ 4. 不支持自动更新:
191
+ - `grix 当前不是可自动更新的安装方式,需改成 npm 安装后再接自动更新。`
192
+
193
+ ## 返回结果
194
+
195
+ 技能应返回清晰、稳定的结果状态,推荐收口为以下几类:
196
+
197
+ 1. `no_update`
198
+ 2. `update_available`
199
+ 3. `updated`
200
+ 4. `failed`
201
+ 5. `unsupported`
202
+
203
+ 若失败,必须说明失败点属于哪一步:
204
+
205
+ 1. `plugins info`
206
+ 2. `plugins update --dry-run`
207
+ 3. `plugins update`
208
+ 4. `plugins doctor`
209
+ 5. `gateway restart`
210
+ 6. `health`
211
+
212
+ ## Guardrails
213
+
214
+ 1. 不改首次安装相关逻辑,不替代 `grix-register`、`grix-admin`、`grix-egg`。
215
+ 2. 不在安装私聊中做插件升级。
216
+ 3. 只用官方命令:
217
+ - `openclaw plugins info`
218
+ - `openclaw plugins update`
219
+ - `openclaw plugins doctor`
220
+ - `openclaw gateway restart`
221
+ - `openclaw health`
222
+ 4. 不直接修改插件目录,不手动覆盖 npm 包内容。
223
+ 5. 不为了“兼容”老安装方式去补各种旁路逻辑;不支持就是不支持。
224
+ 6. 如果升级后未重启,不得宣称运行态已经完成切换。
225
+ 7. 不自动高频重试;失败后交给下一个定时周期或人工介入。
226
+
227
+ ## 推荐自动化接法
228
+
229
+ 给定时任务使用时,优先采用:
230
+
231
+ ```json
232
+ {
233
+ "mode": "check-and-apply",
234
+ "plugin_id": "grix",
235
+ "notify_on": "failure",
236
+ "main_agent": "main",
237
+ "allow_restart": true
238
+ }
239
+ ```
240
+
241
+ 推荐频率:
242
+
243
+ 1. 每天 1 次
244
+ 2. 或每 6 小时 1 次
245
+
246
+ 默认策略:
247
+
248
+ 1. 没更新:静默
249
+ 2. 更新成功:静默
250
+ 3. 更新失败:通知主 agent
251
+
252
+ ## 推荐 Cron 挂法
253
+
254
+ 如果要在插件安装完成后自动维护,推荐直接创建一个隔离式 cron 任务,而不是把升级动作塞进主会话心跳。
255
+
256
+ 推荐命令:
257
+
258
+ ```bash
259
+ openclaw cron add \
260
+ --name "grix auto update" \
261
+ --every "6h" \
262
+ --agent <main_agent> \
263
+ --session isolated \
264
+ --light-context \
265
+ --no-deliver \
266
+ --message 'Use the grix-update skill with {"mode":"check-and-apply","plugin_id":"grix","notify_on":"never","allow_restart":true}. If there is no update or the update succeeds, reply exactly NO_REPLY. If the install is unsupported or any step fails, return one short failure summary.'
267
+ ```
268
+
269
+ 规则:
270
+
271
+ 1. `--session isolated`:不要绑主会话,避免更新和重启打断当前聊天。
272
+ 2. `--no-deliver`:成功时保持静默。
273
+ 3. `notify_on` 在 cron 场景里建议固定为 `never`,由 cron 自己的运行记录负责排查。
274
+ 4. `main_agent` 应使用负责本机维护的主 agent。
275
+ 5. 推荐频率先用 `6h`;如果你想更保守,可改成每天 1 次。
276
+
277
+ 如果已经存在同名任务,不要重复创建,改用:
278
+
279
+ ```bash
280
+ openclaw cron edit <job_id> \
281
+ --every "6h" \
282
+ --agent <main_agent> \
283
+ --session isolated \
284
+ --light-context \
285
+ --no-deliver \
286
+ --message 'Use the grix-update skill with {"mode":"check-and-apply","plugin_id":"grix","notify_on":"never","allow_restart":true}. If there is no update or the update succeeds, reply exactly NO_REPLY. If the install is unsupported or any step fails, return one short failure summary.'
287
+ ```
288
+
289
+ 创建后建议检查:
290
+
291
+ ```bash
292
+ openclaw cron list
293
+ openclaw cron status
294
+ ```
295
+
296
+ ## 与其他技能的分工
297
+
298
+ 1. `grix-register`
299
+ - 只负责云端账号和 API agent 参数
300
+ 2. `grix-admin`
301
+ - 只负责本地配置和绑定
302
+ 3. `grix-egg`
303
+ - 只负责安装私聊流程
304
+ 4. `grix-update`
305
+ - 只负责后续版本维护
306
+
307
+ ## References
308
+
309
+ 1. [references/update-contract.md](references/update-contract.md)
310
+ 2. [references/cron-setup.md](references/cron-setup.md)
@@ -0,0 +1,56 @@
1
+ # Grix Update Cron Setup
2
+
3
+ 这个文档固定插件安装完成后的自动维护接法。
4
+
5
+ ## 推荐目标
6
+
7
+ 安装完成后,应该存在一个定时 cron 任务,定期执行 `grix-update`。
8
+
9
+ 推荐要求:
10
+
11
+ 1. 使用 `isolated` 会话
12
+ 2. 默认静默执行
13
+ 3. 由负责本机维护的主 agent 执行
14
+ 4. 默认每 6 小时运行一次
15
+
16
+ ## 推荐创建命令
17
+
18
+ ```bash
19
+ openclaw cron add \
20
+ --name "grix auto update" \
21
+ --every "6h" \
22
+ --agent <main_agent> \
23
+ --session isolated \
24
+ --light-context \
25
+ --no-deliver \
26
+ --message 'Use the grix-update skill with {"mode":"check-and-apply","plugin_id":"grix","notify_on":"never","allow_restart":true}. If there is no update or the update succeeds, reply exactly NO_REPLY. If the install is unsupported or any step fails, return one short failure summary.'
27
+ ```
28
+
29
+ ## 重复安装时的处理
30
+
31
+ 如果已经存在同名任务,不要重复创建,改用 `edit`:
32
+
33
+ ```bash
34
+ openclaw cron edit <job_id> \
35
+ --every "6h" \
36
+ --agent <main_agent> \
37
+ --session isolated \
38
+ --light-context \
39
+ --no-deliver \
40
+ --message 'Use the grix-update skill with {"mode":"check-and-apply","plugin_id":"grix","notify_on":"never","allow_restart":true}. If there is no update or the update succeeds, reply exactly NO_REPLY. If the install is unsupported or any step fails, return one short failure summary.'
41
+ ```
42
+
43
+ ## 检查命令
44
+
45
+ ```bash
46
+ openclaw cron list
47
+ openclaw cron status
48
+ openclaw cron runs --id <job_id> --limit 20
49
+ ```
50
+
51
+ ## 说明
52
+
53
+ 1. `--session isolated`:避免更新和 gateway 重启打断当前主聊天。
54
+ 2. `--no-deliver`:成功时不向外发消息。
55
+ 3. `notify_on=never`:cron 场景下不让技能自己发通知,统一由 cron 运行记录收口。
56
+ 4. 如果后续要做失败告警,应在上层 cron 规则里处理,不要把通知逻辑塞回技能里。
@@ -0,0 +1,149 @@
1
+ # Grix Update Contract
2
+
3
+ 这个文档用于固定 `grix-update` 的最小执行契约,方便后续接定时任务、心跳提醒或其他维护流程时保持一致。
4
+
5
+ ## 目标
6
+
7
+ `grix-update` 只做下面 5 件事:
8
+
9
+ 1. 确认插件是否存在
10
+ 2. 确认当前安装方式是否支持自动更新
11
+ 3. 检查是否有新版本
12
+ 4. 需要时执行升级
13
+ 5. 在升级后完成校验、重启和结果通知
14
+
15
+ ## 命令阶梯
16
+
17
+ 按顺序使用这些官方命令:
18
+
19
+ ```bash
20
+ openclaw plugins info grix --json
21
+ openclaw plugins update grix --dry-run
22
+ openclaw plugins update grix
23
+ openclaw plugins doctor
24
+ openclaw gateway restart
25
+ openclaw health
26
+ ```
27
+
28
+ 规则:
29
+
30
+ 1. 先 `info`,再 `dry-run`,不要跳步。
31
+ 2. `dry-run` 没显示可更新时,不执行真正升级。
32
+ 3. 真正升级后,不要跳过 `doctor`。
33
+ 4. 允许重启时,`doctor` 后面必须接 `gateway restart` 和 `health`。
34
+
35
+ ## 模式定义
36
+
37
+ ### `check-only`
38
+
39
+ 用途:只检查,不升级。
40
+
41
+ 收口:
42
+
43
+ 1. 没新版本:`no_update`
44
+ 2. 有新版本:`update_available`
45
+ 3. 插件不存在或安装方式不支持:`failed` / `unsupported`
46
+
47
+ ### `apply-update`
48
+
49
+ 用途:直接执行升级。
50
+
51
+ 收口:
52
+
53
+ 1. 升级并验收成功:`updated`
54
+ 2. 任一步失败:`failed`
55
+
56
+ ### `check-and-apply`
57
+
58
+ 用途:自动化默认模式。
59
+
60
+ 收口:
61
+
62
+ 1. 没新版本:`no_update`
63
+ 2. 有新版本且升级成功:`updated`
64
+ 3. 任一步失败:`failed`
65
+ 4. 安装方式不支持:`unsupported`
66
+
67
+ ## 返回值语义
68
+
69
+ 建议把结果理解成下面几种业务状态:
70
+
71
+ 1. `no_update`
72
+ - 已检查,没有可升级版本
73
+ 2. `update_available`
74
+ - 已检查,发现可升级版本,但本次没有执行升级
75
+ 3. `updated`
76
+ - 已完成升级,并且升级后检查通过
77
+ 4. `failed`
78
+ - 在检查、升级、重启或验收中的某一步失败
79
+ 5. `unsupported`
80
+ - 当前安装方式不支持自动更新
81
+
82
+ ## 失败点命名
83
+
84
+ 失败时,建议把失败点固定在这些步骤里:
85
+
86
+ 1. `plugins_info`
87
+ 2. `plugins_update_dry_run`
88
+ 3. `plugins_update`
89
+ 4. `plugins_doctor`
90
+ 5. `gateway_restart`
91
+ 6. `health`
92
+
93
+ 这样后续接自动化时更容易做统计和告警。
94
+
95
+ ## 通知契约
96
+
97
+ `notify_on` 只允许这 3 个值:
98
+
99
+ 1. `never`
100
+ 2. `failure`
101
+ 3. `always`
102
+
103
+ 默认值:`failure`
104
+
105
+ 补充说明:
106
+
107
+ 1. `main_agent` 主要用于选择哪个本地 agent 负责执行维护任务,例如 cron 里的 `--agent <main_agent>`。
108
+ 2. `main_agent` 本身不是可直接发送 Grix 消息的目标;如果没有明确的通知会话,就只返回结果,由上层任务或 cron 记录处理通知。
109
+ 3. cron 默认用 `notify_on=never`,不要在技能内部再猜一条通知路径。
110
+
111
+ 建议通知文案保持一句话:
112
+
113
+ 1. 成功:`grix 插件已升级完成,当前检查正常。`
114
+ 2. 无更新:`grix 插件已检查,当前没有新版本。`
115
+ 3. 失败:`grix 插件自动更新失败,卡在 <步骤>。`
116
+ 4. 不支持:`grix 当前不是可自动更新的安装方式,需改成 npm 安装后再接自动更新。`
117
+
118
+ ## 自动化建议
119
+
120
+ 推荐给定时任务直接使用:
121
+
122
+ ```json
123
+ {
124
+ "mode": "check-and-apply",
125
+ "plugin_id": "grix",
126
+ "notify_on": "never",
127
+ "main_agent": "main",
128
+ "allow_restart": true
129
+ }
130
+ ```
131
+
132
+ 推荐频率:
133
+
134
+ 1. 每天 1 次
135
+ 2. 或每 6 小时 1 次
136
+
137
+ 默认行为:
138
+
139
+ 1. 没更新:静默结束
140
+ 2. 更新成功:静默结束
141
+ 3. 更新失败:在 cron 运行记录里保留失败结果,由维护者或上层任务统一处理
142
+
143
+ ## 禁止事项
144
+
145
+ 1. 不在 egg 安装私聊里触发升级
146
+ 2. 不直接修改插件目录
147
+ 3. 不手工覆盖 npm 包文件
148
+ 4. 不为了兼容旧安装方式写旁路逻辑
149
+ 5. 不在一次失败后做连续重试
@@ -0,0 +1,197 @@
1
+ ---
2
+ name: message-send
3
+ description: 发送消息。支持当前会话回复和跨会话发送。跨会话时使用准确的 `session_id` 或已存在的 `route.sessionKey` 作为 `to` 目标,不使用旧的 `target=agent:...` 格式。触发词:发私信、私信、发送消息、send message、notify。
4
+ ---
5
+
6
+ # 消息发送技能
7
+
8
+ 这个技能用于通过 OpenClaw 的 `message` 工具发送消息。
9
+
10
+ ## 两种发送模式
11
+
12
+ ### 1. 当前会话回复
13
+
14
+ 如果就是回复当前 Grix 会话,直接发送,不需要额外提供目标会话。
15
+
16
+ **参数**:
17
+ - `action`: "send"
18
+ - `channel`: "grix"
19
+ - `accountId`: 当前账号 ID
20
+ - `message`: 消息内容
21
+
22
+ **示例**:
23
+
24
+ ```json
25
+ {
26
+ "action": "send",
27
+ "channel": "grix",
28
+ "accountId": "{accountId}",
29
+ "message": "收到,正在处理中..."
30
+ }
31
+ ```
32
+
33
+ ### 2. 跨会话发送
34
+
35
+ 如果要发到别的私聊或群聊,使用 `to` 指向目标会话。
36
+
37
+ **参数**:
38
+ - `action`: "send"
39
+ - `channel`: "grix"
40
+ - `accountId`: 当前账号 ID
41
+ - `to`: 目标会话标识
42
+ - `message`: 消息内容
43
+
44
+ **示例**:
45
+
46
+ ```json
47
+ {
48
+ "action": "send",
49
+ "channel": "grix",
50
+ "accountId": "{accountId}",
51
+ "to": "{targetSessionId}",
52
+ "message": "需要您确认一个开发决策:..."
53
+ }
54
+ ```
55
+
56
+ ## `to` 的真实写法
57
+
58
+ 当前插件认的是下面两类目标:
59
+
60
+ 1. 准确的 Grix `session_id`(推荐,通常是 UUID)
61
+ 2. 已存在于当前运行时中的 `route.sessionKey`
62
+
63
+ 推荐直接传裸 `session_id`:
64
+
65
+ ```text
66
+ to=e72ce987-2d2e-40ed-bcc9-b336b4974512
67
+ ```
68
+
69
+ 兼容写法里,`grix:<session_id>` 或 `session:<session_id>` 也能被解析,但不要作为默认格式。
70
+
71
+ 不要使用这些旧写法:
72
+
73
+ 1. `target=agent:{agentId}:grix:direct:{sessionId}`
74
+ 2. 纯数字用户 ID / agent ID
75
+ 3. 不存在的会话别名
76
+
77
+ ## 如何获取目标会话
78
+
79
+ 1. 如果就是回复当前会话,直接省略 `to`
80
+ 2. 如果 MEMORY.md 已记录目标 `session_id`,直接复用
81
+ 3. 如果还不知道目标会话,先用 `grix_query` 的 `session_search` 找到准确 `session_id`
82
+
83
+ 示例:
84
+
85
+ ```json
86
+ {
87
+ "action": "send",
88
+ "channel": "grix",
89
+ "accountId": "{accountId}",
90
+ "to": "{groupSessionId}",
91
+ "message": "任务已完成,请查看结果"
92
+ }
93
+ ```
94
+
95
+ ## 关键参数说明
96
+
97
+ | 参数 | 必填 | 说明 |
98
+ |------|------|------|
99
+ | `action` | ✅ | 固定值 `"send"` |
100
+ | `channel` | ✅ | 固定值 `"grix"` |
101
+ | `accountId` | ✅ | 当前 Grix 账号 ID |
102
+ | `message` | ✅ | 消息内容 |
103
+ | `to` | 跨会话必填 | 准确 `session_id` 或可解析的 `route.sessionKey` |
104
+
105
+ ## 注意事项
106
+
107
+ 1. 使用 `to`,不要用 `target`
108
+ 2. `to` 优先传准确 `session_id`,不要混淆用户 ID、agent ID 和会话 ID
109
+ 3. 纯数字目标会直接失败,不会自动转成私聊
110
+ 4. 跨会话发消息前,先确认当前账号对目标会话有发送权限
111
+ 5. 消息内容支持纯文本和 markdown
112
+
113
+ ## 会话卡片消息协议
114
+
115
+ 当消息内容是在**提醒用户打开某个群聊**、**打开某个私聊对话**、**引用某个具体对话记录入口**时,如果已经拿到了准确的 `session_id`,不要发送自然语言链接,也不要发送前端内部 JSON;必须发送独立的 `grix://card/conversation` Markdown 链接,由前端统一解析并渲染为可点击的会话卡片。
116
+
117
+ ### 标准格式
118
+
119
+ 群聊:
120
+
121
+ ```text
122
+ [打开群聊](grix://card/conversation?session_id=<SESSION_ID>&session_type=group&title=<URI_ENCODED_GROUP_TITLE>)
123
+ ```
124
+
125
+ 私聊:
126
+
127
+ ```text
128
+ [打开对话](grix://card/conversation?session_id=<SESSION_ID>&session_type=private&title=<URI_ENCODED_CHAT_TITLE>&peer_id=<URI_ENCODED_PEER_ID>)
129
+ ```
130
+
131
+ ### 字段规则
132
+
133
+ - `session_id`:必填。必须是准确的目标会话 ID。
134
+ - `session_type`:必填。只能是 `group` 或 `private`。
135
+ - `title`:必填。展示给用户看的群标题或私聊标题。
136
+ - `peer_id`:仅私聊可选。用于补充私聊对象信息,但前端打开行为仍以 `session_id` 为准。
137
+
138
+ ### 编码规则
139
+
140
+ 为了避免标题、昵称、URL 等字段里的空格、换行或保留字符破坏链接,query 参数值应按 URI component 规则编码后再写入 `grix://card` 链接。
141
+
142
+ - 推荐:对 `title`、`peer_id`、以及未来可能扩展的文本字段统一做 URI component 编码
143
+ - `session_id` 和 `session_type` 如果本身只包含安全字符,可以直接原样输出
144
+ - 链接文本是给用户看的普通文案,不需要做 URI 编码
145
+
146
+ 示例:
147
+
148
+ ```text
149
+ [打开群聊](grix://card/conversation?session_id=session-9&session_type=group&title=%E4%BA%A7%E5%93%81%E8%AE%A8%E8%AE%BA%E7%BE%A4%20A)
150
+ ```
151
+
152
+ ### 使用要求
153
+
154
+ 1. 只有在**已知准确 `session_id`** 时,才允许输出会话卡片
155
+ 2. 如果没有 `session_id`,只能发送普通文本说明,不能伪造会话卡片
156
+ 3. 不要输出 `chat://...`、网页链接、或“点这里打开会话”之类的自然语言链接替代方案
157
+ 4. 不要构造前端内部 `biz_card` JSON,也不要尝试发送 Flutter/前端私有协议结构
158
+ 5. `grix://card/conversation` 链接必须单行,且必须单独作为一条消息发送
159
+ 6. 如果还要补说明,说明文字和卡片分两条消息发送;不要把说明和卡片混在同一条里
160
+ 7. 同一条消息里不要放多张卡片;需要多个跳转入口时,分多条消息发送
161
+ 8. 如果字段值包含特殊字符,先做 URI component 编码,再拼进链接
162
+
163
+ ### 示例
164
+
165
+ 示例 1:提醒用户进入群聊
166
+
167
+ ```text
168
+ [打开产品群](grix://card/conversation?session_id=9d6a4b1d-5d37-4e38-ae6a-0c12a2c4c901&session_type=group&title=%E4%BA%A7%E5%93%81%E7%BE%A4)
169
+ ```
170
+
171
+ 示例 2:提醒用户进入某个私聊
172
+
173
+ ```text
174
+ [打开 Alice 对话](grix://card/conversation?session_id=e72ce987-2d2e-40ed-bcc9-b336b4974512&session_type=private&title=Alice&peer_id=1001)
175
+ ```
176
+
177
+ 示例 3:带说明时分两条发送
178
+
179
+ ```text
180
+ 消息 1:测试群已经建好,你看下一条卡片就能直接进去。
181
+ 消息 2:[打开测试群](grix://card/conversation?session_id=0fa947bd-bb4e-46ad-8308-5526bc98e002&session_type=group&title=%E6%B5%8B%E8%AF%95%E7%BE%A4)
182
+ ```
183
+
184
+ ## 错误处理
185
+
186
+ - `to` 无法解析:确认 `session_id` 或 `route.sessionKey` 是否正确
187
+ - 权限不足:检查当前 `accountId` 是否有目标会话的发送权限
188
+ - 参数缺失:确保必填参数都已提供
189
+ - 目标格式错误:检查 `to` 是否是准确 `session_id` 或有效 `route.sessionKey`
190
+
191
+ ## 最佳实践
192
+
193
+ 1. 跨会话发送时,优先记录和复用准确 `session_id`
194
+ 2. 需要找会话时,先用 `grix_query.session_search`
195
+ 3. 消息内容保持简洁,突出重点
196
+ 4. 不要滥用主动消息,避免打扰 owner
197
+ 5. 需要跳转时优先用会话卡片,而不是发普通说明文字