scientify 1.11.0 → 1.12.1

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 (72) hide show
  1. package/README.md +2 -2
  2. package/README.zh.md +2 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +16 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/cli/research.d.ts +10 -0
  7. package/dist/src/cli/research.d.ts.map +1 -0
  8. package/dist/src/cli/research.js +283 -0
  9. package/dist/src/cli/research.js.map +1 -0
  10. package/dist/src/commands/metabolism-status.d.ts +6 -0
  11. package/dist/src/commands/metabolism-status.d.ts.map +1 -0
  12. package/dist/src/commands/metabolism-status.js +100 -0
  13. package/dist/src/commands/metabolism-status.js.map +1 -0
  14. package/dist/src/hooks/cron-skill-inject.d.ts +21 -0
  15. package/dist/src/hooks/cron-skill-inject.d.ts.map +1 -0
  16. package/dist/src/hooks/cron-skill-inject.js +53 -0
  17. package/dist/src/hooks/cron-skill-inject.js.map +1 -0
  18. package/dist/src/hooks/research-mode.d.ts +1 -1
  19. package/dist/src/hooks/research-mode.d.ts.map +1 -1
  20. package/dist/src/hooks/research-mode.js +28 -2
  21. package/dist/src/hooks/research-mode.js.map +1 -1
  22. package/dist/src/knowledge-state/render.d.ts +8 -1
  23. package/dist/src/knowledge-state/render.d.ts.map +1 -1
  24. package/dist/src/knowledge-state/render.js +31 -0
  25. package/dist/src/knowledge-state/render.js.map +1 -1
  26. package/dist/src/knowledge-state/store.d.ts.map +1 -1
  27. package/dist/src/knowledge-state/store.js +340 -6
  28. package/dist/src/knowledge-state/store.js.map +1 -1
  29. package/dist/src/knowledge-state/types.d.ts +19 -0
  30. package/dist/src/knowledge-state/types.d.ts.map +1 -1
  31. package/dist/src/literature/subscription-state.d.ts +2 -0
  32. package/dist/src/literature/subscription-state.d.ts.map +1 -1
  33. package/dist/src/literature/subscription-state.js +7 -0
  34. package/dist/src/literature/subscription-state.js.map +1 -1
  35. package/dist/src/research-subscriptions/prompt.d.ts.map +1 -1
  36. package/dist/src/research-subscriptions/prompt.js +44 -16
  37. package/dist/src/research-subscriptions/prompt.js.map +1 -1
  38. package/dist/src/templates/bootstrap.d.ts +8 -0
  39. package/dist/src/templates/bootstrap.d.ts.map +1 -0
  40. package/dist/src/templates/bootstrap.js +153 -0
  41. package/dist/src/templates/bootstrap.js.map +1 -0
  42. package/dist/src/tools/arxiv-download.d.ts +2 -2
  43. package/dist/src/tools/arxiv-download.d.ts.map +1 -1
  44. package/dist/src/tools/arxiv-download.js +9 -11
  45. package/dist/src/tools/arxiv-download.js.map +1 -1
  46. package/dist/src/tools/scientify-cron.d.ts +2 -0
  47. package/dist/src/tools/scientify-cron.d.ts.map +1 -1
  48. package/dist/src/tools/scientify-cron.js +33 -1
  49. package/dist/src/tools/scientify-cron.js.map +1 -1
  50. package/dist/src/tools/scientify-literature-state.d.ts +4 -0
  51. package/dist/src/tools/scientify-literature-state.d.ts.map +1 -1
  52. package/dist/src/tools/scientify-literature-state.js +45 -0
  53. package/dist/src/tools/scientify-literature-state.js.map +1 -1
  54. package/dist/src/tools/unpaywall-download.d.ts +2 -2
  55. package/dist/src/tools/unpaywall-download.js +4 -4
  56. package/dist/src/tools/unpaywall-download.js.map +1 -1
  57. package/openclaw.plugin.json +4 -2
  58. package/package.json +1 -1
  59. package/skills/idea-generation/SKILL.md +24 -29
  60. package/skills/metabolism/SKILL.md +118 -0
  61. package/skills/metabolism-init/SKILL.md +80 -0
  62. package/skills/{literature-survey → research-collect}/SKILL.md +23 -33
  63. package/skills/research-experiment/SKILL.md +1 -1
  64. package/skills/research-implement/SKILL.md +1 -1
  65. package/skills/research-pipeline/SKILL.md +6 -11
  66. package/skills/research-plan/SKILL.md +3 -3
  67. package/skills/research-review/SKILL.md +1 -1
  68. package/skills/research-subscription/SKILL.md +16 -0
  69. package/skills/research-survey/SKILL.md +6 -6
  70. package/skills/write-review-paper/SKILL.md +14 -14
  71. package/skills/_shared/workspace-spec.md +0 -164
  72. package/skills/install-scientify/SKILL.md +0 -106
package/README.md CHANGED
@@ -275,7 +275,7 @@ Or invoke a specific skill directly with a slash command:
275
275
 
276
276
  ```
277
277
  /research-pipeline
278
- /literature-survey
278
+ /research-collect
279
279
  /idea-generation
280
280
  ```
281
281
 
@@ -310,7 +310,7 @@ You can also check status anytime with:
310
310
  | Skill | Slash Command | Description |
311
311
  |-------|---------------|-------------|
312
312
  | **research-pipeline** | `/research-pipeline` | Orchestrator. Spawns sub-agents for each phase, verifies outputs between steps. |
313
- | **literature-survey** | `/literature-survey` | Search arXiv → filter → download .tex sources → cluster → generate survey report. |
313
+ | **research-collect** | `/research-collect` | Search arXiv → filter → download .tex sources → cluster → generate survey report. |
314
314
  | **research-survey** | `/research-survey` | Deep analysis of papers: extract formulas, map to code, produce method comparison table. |
315
315
  | **research-plan** | `/research-plan` | Create 4-part implementation plan (Dataset/Model/Training/Testing) from survey results. |
316
316
  | **research-implement** | `/research-implement` | Implement ML code from plan, run 2-epoch validation with `uv` venv isolation. |
package/README.zh.md CHANGED
@@ -275,7 +275,7 @@ openclaw gateway
275
275
 
276
276
  ```
277
277
  /research-pipeline
278
- /literature-survey
278
+ /research-collect
279
279
  /idea-generation
280
280
  ```
281
281
 
@@ -310,7 +310,7 @@ openclaw gateway
310
310
  | Skill | 斜杠命令 | 描述 |
311
311
  |-------|---------|------|
312
312
  | **research-pipeline** | `/research-pipeline` | 编排器。逐阶段 spawn 子 agent,验证产出后推进。 |
313
- | **literature-survey** | `/literature-survey` | 搜索 arXiv → 筛选 → 下载 .tex 源文件 → 聚类 → 生成调研报告。 |
313
+ | **research-collect** | `/research-collect` | 搜索 arXiv → 筛选 → 下载 .tex 源文件 → 聚类 → 生成调研报告。 |
314
314
  | **research-survey** | `/research-survey` | 深度分析论文:提取公式、映射代码、生成核心方法对比表。 |
315
315
  | **research-plan** | `/research-plan` | 从调研结果制定四部分实现计划(数据集/模型/训练/测试)。 |
316
316
  | **research-implement** | `/research-implement` | 按计划实现 ML 代码,`uv` 虚拟环境隔离,2 epoch 验证。 |
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqClD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,QAiItD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,QAgJtD"}
package/dist/index.js CHANGED
@@ -15,6 +15,9 @@ import { createSkillInjectionHook } from "./src/hooks/inject-skill.js";
15
15
  import { createResearchModeHook } from "./src/hooks/research-mode.js";
16
16
  import { createScientifyCronAutofillHook } from "./src/hooks/scientify-cron-autofill.js";
17
17
  import { createScientifyMessageTrackerHook, createScientifySignaturePromptHook, createScientifyUsageCleanupHook, createScientifyUsageTrackerHook, } from "./src/hooks/scientify-signature.js";
18
+ import { createCronSkillInjectionHook } from "./src/hooks/cron-skill-inject.js";
19
+ import { registerResearchCli } from "./src/cli/research.js";
20
+ import { handleMetabolismStatus } from "./src/commands/metabolism-status.js";
18
21
  // Default: check every hour
19
22
  const UPDATE_CHECK_INTERVAL_MS = 60 * 60 * 1000;
20
23
  export default function register(api) {
@@ -127,6 +130,18 @@ export default function register(api) {
127
130
  api.on("before_agent_start", createScientifySignaturePromptHook(), {
128
131
  priority: 90,
129
132
  });
130
- api.logger.info("Scientify plugin loaded (research mode: always active)");
133
+ // Inject SKILL.md into cron session messages (for metabolism heartbeat).
134
+ api.on("before_agent_start", createCronSkillInjectionHook());
135
+ // Register CLI commands: openclaw research init/list/status/delete
136
+ registerResearchCli(api);
137
+ // Register metabolism chat commands
138
+ api.registerCommand({
139
+ name: "metabolism-status",
140
+ description: "Show knowledge metabolism status (day, topics, hypotheses)",
141
+ acceptsArgs: false,
142
+ requireAuth: false,
143
+ handler: handleMetabolismStatus,
144
+ });
145
+ api.logger.info("Scientify plugin loaded");
131
146
  }
132
147
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Register the `openclaw research` CLI command.
3
+ */
4
+ export declare function registerResearchCli(api: {
5
+ registerCli: (registrar: unknown, opts?: {
6
+ commands?: string[];
7
+ }) => void;
8
+ source: string;
9
+ }): void;
10
+ //# sourceMappingURL=research.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../../src/cli/research.ts"],"names":[],"mappings":"AAiSA;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,QA4DnG"}
@@ -0,0 +1,283 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import { renderBootstrapMd, renderSoulMd, renderAgentsMd } from "../templates/bootstrap.js";
5
+ const OPENCLAW_HOME = path.join(os.homedir(), ".openclaw");
6
+ const OPENCLAW_CONFIG = path.join(OPENCLAW_HOME, "openclaw.json");
7
+ const CRON_JOBS_PATH = path.join(OPENCLAW_HOME, "cron", "jobs.json");
8
+ function readOpenClawConfig() {
9
+ try {
10
+ return JSON.parse(fs.readFileSync(OPENCLAW_CONFIG, "utf-8"));
11
+ }
12
+ catch {
13
+ return {};
14
+ }
15
+ }
16
+ function writeOpenClawConfig(config) {
17
+ fs.writeFileSync(OPENCLAW_CONFIG, JSON.stringify(config, null, 2) + "\n");
18
+ }
19
+ function readCronJobs() {
20
+ try {
21
+ return JSON.parse(fs.readFileSync(CRON_JOBS_PATH, "utf-8"));
22
+ }
23
+ catch {
24
+ return { version: 1, jobs: [] };
25
+ }
26
+ }
27
+ function writeCronJobs(data) {
28
+ const dir = path.dirname(CRON_JOBS_PATH);
29
+ fs.mkdirSync(dir, { recursive: true });
30
+ fs.writeFileSync(CRON_JOBS_PATH, JSON.stringify(data, null, 2) + "\n");
31
+ }
32
+ function addCronJob(agentId) {
33
+ const data = readCronJobs();
34
+ const jobId = `${agentId}-metabolism`;
35
+ // Avoid duplicates
36
+ if (data.jobs.some((j) => j.jobId === jobId))
37
+ return;
38
+ data.jobs.push({
39
+ name: `${agentId} daily metabolism`,
40
+ jobId,
41
+ schedule: { kind: "cron", expr: "0 6 * * *", tz: "Asia/Shanghai" },
42
+ sessionTarget: "isolated",
43
+ payload: {
44
+ kind: "agentTurn",
45
+ agentId,
46
+ message: "执行每日知识新陈代谢。阅读 AGENTS.md 了解工作流,然后使用 /metabolism 技能完成今日代谢。",
47
+ },
48
+ delivery: { mode: "announce" },
49
+ enabled: true,
50
+ });
51
+ writeCronJobs(data);
52
+ }
53
+ function removeCronJob(agentId) {
54
+ const data = readCronJobs();
55
+ const jobId = `${agentId}-metabolism`;
56
+ const before = data.jobs.length;
57
+ data.jobs = data.jobs.filter((j) => j.jobId !== jobId);
58
+ if (data.jobs.length < before) {
59
+ writeCronJobs(data);
60
+ }
61
+ }
62
+ function findPluginSkillsDir(entryDir) {
63
+ // Walk up to find openclaw.plugin.json
64
+ let dir = entryDir;
65
+ for (;;) {
66
+ if (fs.existsSync(path.join(dir, "openclaw.plugin.json"))) {
67
+ return path.join(dir, "skills");
68
+ }
69
+ const parent = path.dirname(dir);
70
+ if (parent === dir)
71
+ break;
72
+ dir = parent;
73
+ }
74
+ return path.join(entryDir, "skills");
75
+ }
76
+ function listResearchProjects() {
77
+ const config = readOpenClawConfig();
78
+ const agents = config.agents?.list ?? [];
79
+ const projects = [];
80
+ for (const agent of agents) {
81
+ if (!agent.id.startsWith("research-"))
82
+ continue;
83
+ const projectId = agent.id.replace("research-", "");
84
+ const workspace = agent.workspace
85
+ ? agent.workspace.replace("~", os.homedir())
86
+ : path.join(OPENCLAW_HOME, `workspace-${agent.id}`);
87
+ let currentDay = 0;
88
+ let createdAt = "";
89
+ const configPath = path.join(workspace, "metabolism", "config.json");
90
+ try {
91
+ const mc = JSON.parse(fs.readFileSync(configPath, "utf-8"));
92
+ currentDay = mc.currentDay ?? 0;
93
+ createdAt = mc.createdAt ?? "";
94
+ }
95
+ catch {
96
+ // config not yet created (pre-bootstrap)
97
+ }
98
+ projects.push({
99
+ id: projectId,
100
+ agentId: agent.id,
101
+ workspace,
102
+ currentDay,
103
+ createdAt,
104
+ });
105
+ }
106
+ return projects;
107
+ }
108
+ function initProject(id, pluginSkillsDir) {
109
+ const agentId = `research-${id}`;
110
+ const workspace = path.join(OPENCLAW_HOME, `workspace-${agentId}`);
111
+ // Check if workspace already exists
112
+ if (fs.existsSync(workspace)) {
113
+ console.error(`Error: workspace already exists at ${workspace}`);
114
+ process.exit(1);
115
+ }
116
+ // 1. Create workspace directory structure
117
+ const dirs = [
118
+ workspace,
119
+ path.join(workspace, "metabolism"),
120
+ path.join(workspace, "metabolism", "knowledge"),
121
+ path.join(workspace, "metabolism", "diffs"),
122
+ path.join(workspace, "metabolism", "hypotheses"),
123
+ path.join(workspace, "metabolism", "log"),
124
+ path.join(workspace, "skills", "metabolism"),
125
+ path.join(workspace, "survey"),
126
+ path.join(workspace, "papers"),
127
+ path.join(workspace, "ideas"),
128
+ path.join(workspace, "experiments"),
129
+ ];
130
+ for (const dir of dirs) {
131
+ fs.mkdirSync(dir, { recursive: true });
132
+ }
133
+ // 2. Write bootstrap files
134
+ fs.writeFileSync(path.join(workspace, "BOOTSTRAP.md"), renderBootstrapMd(id));
135
+ fs.writeFileSync(path.join(workspace, "SOUL.md"), renderSoulMd(id));
136
+ fs.writeFileSync(path.join(workspace, "AGENTS.md"), renderAgentsMd());
137
+ // 3. Copy metabolism SKILL.md from plugin bundled skills
138
+ const srcSkill = path.join(pluginSkillsDir, "metabolism", "SKILL.md");
139
+ const dstSkill = path.join(workspace, "skills", "metabolism", "SKILL.md");
140
+ if (fs.existsSync(srcSkill)) {
141
+ fs.copyFileSync(srcSkill, dstSkill);
142
+ }
143
+ else {
144
+ console.warn(`Warning: metabolism SKILL.md not found at ${srcSkill}`);
145
+ }
146
+ // 4. Modify openclaw.json
147
+ const config = readOpenClawConfig();
148
+ // Add agent to agents.list
149
+ if (!config.agents)
150
+ config.agents = {};
151
+ const agents = config.agents;
152
+ if (!agents.list)
153
+ agents.list = [];
154
+ // Check for duplicate
155
+ if (agents.list.some((a) => a.id === agentId)) {
156
+ console.error(`Error: agent '${agentId}' already exists in openclaw.json`);
157
+ process.exit(1);
158
+ }
159
+ agents.list.push({
160
+ id: agentId,
161
+ workspace: `~/.openclaw/workspace-${agentId}`,
162
+ });
163
+ writeOpenClawConfig(config);
164
+ // 5. Register daily metabolism cron job
165
+ addCronJob(agentId);
166
+ console.log(`\nResearch project '${id}' created successfully.\n`);
167
+ console.log(` Agent ID: ${agentId}`);
168
+ console.log(` Workspace: ${workspace}`);
169
+ console.log(` Cron: daily metabolism at 06:00 (Asia/Shanghai)\n`);
170
+ console.log("Next steps:");
171
+ console.log(" 1. Restart Gateway to load the new agent");
172
+ console.log(" 2. In Gateway web UI, create a Feishu group binding for this agent");
173
+ console.log(" 3. Send a message in the Feishu group to start the BOOTSTRAP configuration");
174
+ }
175
+ function showStatus(id) {
176
+ const projects = listResearchProjects();
177
+ const project = projects.find((p) => p.id === id);
178
+ if (!project) {
179
+ console.error(`Error: research project '${id}' not found`);
180
+ process.exit(1);
181
+ }
182
+ const knowledgeDir = path.join(project.workspace, "metabolism", "knowledge");
183
+ const hypothesesDir = path.join(project.workspace, "metabolism", "hypotheses");
184
+ const diffsDir = path.join(project.workspace, "metabolism", "diffs");
185
+ let topicCount = 0;
186
+ let hypothesisCount = 0;
187
+ let latestDiffs = [];
188
+ try {
189
+ topicCount = fs.readdirSync(knowledgeDir).filter((f) => f.startsWith("topic-")).length;
190
+ }
191
+ catch { /* empty */ }
192
+ try {
193
+ hypothesisCount = fs.readdirSync(hypothesesDir).filter((f) => f.endsWith(".md")).length;
194
+ }
195
+ catch { /* empty */ }
196
+ try {
197
+ latestDiffs = fs
198
+ .readdirSync(diffsDir)
199
+ .filter((f) => f.endsWith(".md"))
200
+ .sort()
201
+ .slice(-3);
202
+ }
203
+ catch { /* empty */ }
204
+ console.log(`\nResearch Project: ${id}`);
205
+ console.log(` Agent: ${project.agentId}`);
206
+ console.log(` Workspace: ${project.workspace}`);
207
+ console.log(` Day: ${project.currentDay}`);
208
+ console.log(` Topics: ${topicCount}`);
209
+ console.log(` Hypotheses: ${hypothesisCount}`);
210
+ if (latestDiffs.length > 0) {
211
+ console.log(` Recent diffs: ${latestDiffs.join(", ")}`);
212
+ }
213
+ if (project.createdAt) {
214
+ console.log(` Created: ${project.createdAt}`);
215
+ }
216
+ }
217
+ function deleteProject(id) {
218
+ const agentId = `research-${id}`;
219
+ const workspace = path.join(OPENCLAW_HOME, `workspace-${agentId}`);
220
+ // Remove workspace
221
+ if (fs.existsSync(workspace)) {
222
+ fs.rmSync(workspace, { recursive: true, force: true });
223
+ console.log(`Deleted workspace: ${workspace}`);
224
+ }
225
+ // Remove from openclaw.json
226
+ const config = readOpenClawConfig();
227
+ const agents = config.agents;
228
+ if (agents?.list) {
229
+ agents.list = agents.list.filter((a) => a.id !== agentId);
230
+ }
231
+ // Remove cron job
232
+ removeCronJob(agentId);
233
+ writeOpenClawConfig(config);
234
+ console.log(`Removed agent '${agentId}' from openclaw.json`);
235
+ console.log(`\nNote: If you created a Feishu group binding, remove it manually in the Gateway web UI.`);
236
+ }
237
+ /**
238
+ * Register the `openclaw research` CLI command.
239
+ */
240
+ export function registerResearchCli(api) {
241
+ const entryDir = path.dirname(api.source);
242
+ api.registerCli(({ program }) => {
243
+ const cmd = program.command("research");
244
+ cmd.description("Manage CKM research projects");
245
+ const pluginSkillsDir = findPluginSkillsDir(entryDir);
246
+ // openclaw research init <id>
247
+ const initCmd = cmd.command("init <id>");
248
+ initCmd.description("Create a new research project agent + workspace");
249
+ initCmd.action((id) => {
250
+ initProject(String(id), pluginSkillsDir);
251
+ });
252
+ // openclaw research list
253
+ const listCmd = cmd.command("list");
254
+ listCmd.description("List all research projects");
255
+ listCmd.action(() => {
256
+ const projects = listResearchProjects();
257
+ if (projects.length === 0) {
258
+ console.log("No research projects found.");
259
+ return;
260
+ }
261
+ console.log("\nResearch Projects:\n");
262
+ for (const p of projects) {
263
+ const configured = p.currentDay > 0 || p.createdAt ? "" : " (pending BOOTSTRAP)";
264
+ console.log(` ${p.id} Day ${p.currentDay}${configured}`);
265
+ console.log(` ${p.workspace}`);
266
+ }
267
+ console.log();
268
+ });
269
+ // openclaw research status <id>
270
+ const statusCmd = cmd.command("status <id>");
271
+ statusCmd.description("Show research project metabolism status");
272
+ statusCmd.action((id) => {
273
+ showStatus(String(id));
274
+ });
275
+ // openclaw research delete <id>
276
+ const deleteCmd = cmd.command("delete <id>");
277
+ deleteCmd.description("Delete a research project (agent + workspace + cron)");
278
+ deleteCmd.action((id) => {
279
+ deleteProject(String(id));
280
+ });
281
+ }, { commands: ["research"] });
282
+ }
283
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../../src/cli/research.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { PluginCommandContext, PluginCommandResult } from "openclaw";
2
+ /**
3
+ * /metabolism-status — Show knowledge metabolism status
4
+ */
5
+ export declare function handleMetabolismStatus(_ctx: PluginCommandContext): PluginCommandResult;
6
+ //# sourceMappingURL=metabolism-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metabolism-status.d.ts","sourceRoot":"","sources":["../../../src/commands/metabolism-status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA6E1E;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,mBAAmB,CA0CtF"}
@@ -0,0 +1,100 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ const OPENCLAW_HOME = path.join(os.homedir(), ".openclaw");
5
+ /**
6
+ * Find the research project workspace for the current agent context.
7
+ * In a Feishu group bound to a project agent, the workspace is at
8
+ * ~/.openclaw/workspace-research-{id}/
9
+ */
10
+ function findProjectWorkspace() {
11
+ // Read openclaw.json to find research agents
12
+ const configPath = path.join(OPENCLAW_HOME, "openclaw.json");
13
+ let config;
14
+ try {
15
+ config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ const agents = config.agents?.list ?? [];
21
+ const researchAgents = agents.filter((a) => a.id.startsWith("research-"));
22
+ // Try each research agent workspace to find one with metabolism/config.json
23
+ for (const agent of researchAgents) {
24
+ const workspace = (agent.workspace ?? `~/.openclaw/workspace-${agent.id}`).replace("~", os.homedir());
25
+ const metabolismConfig = path.join(workspace, "metabolism", "config.json");
26
+ if (fs.existsSync(metabolismConfig)) {
27
+ return { workspace, projectId: agent.id.replace("research-", "") };
28
+ }
29
+ }
30
+ // If only one research agent, use it even without config.json (pre-bootstrap)
31
+ if (researchAgents.length === 1) {
32
+ const agent = researchAgents[0];
33
+ const workspace = (agent.workspace ?? `~/.openclaw/workspace-${agent.id}`).replace("~", os.homedir());
34
+ return { workspace, projectId: agent.id.replace("research-", "") };
35
+ }
36
+ return null;
37
+ }
38
+ function readMetabolismConfig(workspace) {
39
+ try {
40
+ return JSON.parse(fs.readFileSync(path.join(workspace, "metabolism", "config.json"), "utf-8"));
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function countFiles(dirPath, filter) {
47
+ try {
48
+ const entries = fs.readdirSync(dirPath);
49
+ return filter ? entries.filter(filter).length : entries.length;
50
+ }
51
+ catch {
52
+ return 0;
53
+ }
54
+ }
55
+ function readRecentDiffs(workspace, count) {
56
+ const diffsDir = path.join(workspace, "metabolism", "diffs");
57
+ try {
58
+ return fs
59
+ .readdirSync(diffsDir)
60
+ .filter((f) => f.endsWith(".md"))
61
+ .sort()
62
+ .slice(-count);
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * /metabolism-status — Show knowledge metabolism status
70
+ */
71
+ export function handleMetabolismStatus(_ctx) {
72
+ const project = findProjectWorkspace();
73
+ if (!project) {
74
+ return { text: "No research project found. Use `openclaw research init <id>` to create one." };
75
+ }
76
+ const { workspace, projectId } = project;
77
+ const config = readMetabolismConfig(workspace);
78
+ const topicCount = countFiles(path.join(workspace, "metabolism", "knowledge"), (f) => f.startsWith("topic-"));
79
+ const hypothesisCount = countFiles(path.join(workspace, "metabolism", "hypotheses"), (f) => f.endsWith(".md"));
80
+ const recentDiffs = readRecentDiffs(workspace, 3);
81
+ let output = `**Metabolism Status — ${projectId}**\n\n`;
82
+ if (!config) {
83
+ output += "Status: Pending BOOTSTRAP configuration\n";
84
+ output += "Send a message in this group to start the configuration flow.\n";
85
+ return { text: output };
86
+ }
87
+ const heartbeatStatus = config.heartbeat?.enabled !== false ? "active" : "paused";
88
+ output += `Day: ${config.currentDay}\n`;
89
+ output += `Topics: ${topicCount}\n`;
90
+ output += `Hypotheses: ${hypothesisCount}\n`;
91
+ output += `Heartbeat: ${heartbeatStatus}\n`;
92
+ if (recentDiffs.length > 0) {
93
+ output += `\nRecent diffs:\n`;
94
+ for (const diff of recentDiffs) {
95
+ output += ` ${diff}\n`;
96
+ }
97
+ }
98
+ return { text: output };
99
+ }
100
+ //# sourceMappingURL=metabolism-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metabolism-status.js","sourceRoot":"","sources":["../../../src/commands/metabolism-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Hook for injecting SKILL.md content into cron session messages.
3
+ *
4
+ * When a cron job fires with a heartbeat message starting with `/skill-name`,
5
+ * this hook reads the matching SKILL.md from the agent's workspace and
6
+ * prepends its body to the message, so the agent receives full workflow
7
+ * instructions in the isolated cron session.
8
+ */
9
+ export declare function createCronSkillInjectionHook(): (event: {
10
+ payload?: {
11
+ message?: string;
12
+ };
13
+ [key: string]: unknown;
14
+ }, ctx: {
15
+ sessionType?: string;
16
+ agentWorkspace?: string;
17
+ [key: string]: unknown;
18
+ }) => Promise<{
19
+ payload: Record<string, unknown>;
20
+ } | void>;
21
+ //# sourceMappingURL=cron-skill-inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-skill-inject.d.ts","sourceRoot":"","sources":["../../../src/hooks/cron-skill-inject.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,KAExC,OAAO;IAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EACjE,KAAK;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KAC7E,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CA2CxD"}
@@ -0,0 +1,53 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ /**
4
+ * Hook for injecting SKILL.md content into cron session messages.
5
+ *
6
+ * When a cron job fires with a heartbeat message starting with `/skill-name`,
7
+ * this hook reads the matching SKILL.md from the agent's workspace and
8
+ * prepends its body to the message, so the agent receives full workflow
9
+ * instructions in the isolated cron session.
10
+ */
11
+ export function createCronSkillInjectionHook() {
12
+ return async (event, ctx) => {
13
+ // Only process cron sessions
14
+ if (ctx.sessionType !== "cron")
15
+ return;
16
+ const message = event.payload?.message;
17
+ if (typeof message !== "string")
18
+ return;
19
+ // Extract /skill-name from the first line
20
+ const match = message.match(/^\/([a-z][\w-]*)/);
21
+ if (!match)
22
+ return;
23
+ const skillName = match[1];
24
+ // Resolve agent workspace
25
+ const workspace = ctx.agentWorkspace;
26
+ if (typeof workspace !== "string")
27
+ return;
28
+ const skillPath = path.join(workspace, "skills", skillName, "SKILL.md");
29
+ let content;
30
+ try {
31
+ content = await fs.readFile(skillPath, "utf-8");
32
+ }
33
+ catch {
34
+ // No SKILL.md found in workspace — skip
35
+ return;
36
+ }
37
+ // Strip YAML frontmatter
38
+ const body = content.replace(/^---[\s\S]*?---\s*/, "").trim();
39
+ if (!body)
40
+ return;
41
+ // Inject skill body after the first line (/skill-name), before the rest
42
+ const firstNewline = message.indexOf("\n");
43
+ const newMessage = firstNewline === -1
44
+ ? message + "\n\n" + body
45
+ : message.slice(0, firstNewline) +
46
+ "\n\n" +
47
+ body +
48
+ "\n\n" +
49
+ message.slice(firstNewline + 1);
50
+ return { payload: { ...event.payload, message: newMessage } };
51
+ };
52
+ }
53
+ //# sourceMappingURL=cron-skill-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-skill-inject.js","sourceRoot":"","sources":["../../../src/hooks/cron-skill-inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,KAAK,EACV,KAAiE,EACjE,GAA8E,EACxB,EAAE;QACxD,6BAA6B;QAC7B,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM;YAAE,OAAO;QAEvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;QACvC,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO;QAExC,0CAA0C;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,0BAA0B;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC;QACrC,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAExE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;YACxC,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,wEAAwE;QACxE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,UAAU,GACd,YAAY,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI;YACzB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;gBAC9B,MAAM;gBACN,IAAI;gBACJ,MAAM;gBACN,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAEtC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC"}
@@ -17,6 +17,6 @@ type HookResult = {
17
17
  /**
18
18
  * Injects on every prompt build (survives compaction).
19
19
  */
20
- export declare function createResearchModeHook(): (_event: HookEvent, _context: HookContext) => HookResult;
20
+ export declare function createResearchModeHook(): (_event: HookEvent, context: HookContext) => HookResult;
21
21
  export {};
22
22
  //# sourceMappingURL=research-mode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"research-mode.d.ts","sourceRoot":"","sources":["../../../src/hooks/research-mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AA6BF;;GAEG;AACH,wBAAgB,sBAAsB,KAC5B,QAAQ,SAAS,EAAE,UAAU,WAAW,KAAG,UAAU,CAG9D"}
1
+ {"version":3,"file":"research-mode.d.ts","sourceRoot":"","sources":["../../../src/hooks/research-mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAoDF;;GAEG;AACH,wBAAgB,sBAAsB,KAC5B,QAAQ,SAAS,EAAE,SAAS,WAAW,KAAG,UAAU,CAO7D"}