scientify 1.10.0 → 1.10.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 (58) hide show
  1. package/README.md +10 -2
  2. package/README.zh.md +10 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/hooks/research-mode.d.ts.map +1 -1
  7. package/dist/src/hooks/research-mode.js +3 -0
  8. package/dist/src/hooks/research-mode.js.map +1 -1
  9. package/dist/src/hooks/scientify-signature.d.ts.map +1 -1
  10. package/dist/src/hooks/scientify-signature.js +1 -0
  11. package/dist/src/hooks/scientify-signature.js.map +1 -1
  12. package/dist/src/literature/subscription-state.d.ts +90 -0
  13. package/dist/src/literature/subscription-state.d.ts.map +1 -0
  14. package/dist/src/literature/subscription-state.js +521 -0
  15. package/dist/src/literature/subscription-state.js.map +1 -0
  16. package/dist/src/research-subscriptions/constants.d.ts +16 -0
  17. package/dist/src/research-subscriptions/constants.d.ts.map +1 -0
  18. package/dist/src/research-subscriptions/constants.js +59 -0
  19. package/dist/src/research-subscriptions/constants.js.map +1 -0
  20. package/dist/src/research-subscriptions/cron-client.d.ts +8 -0
  21. package/dist/src/research-subscriptions/cron-client.d.ts.map +1 -0
  22. package/dist/src/research-subscriptions/cron-client.js +81 -0
  23. package/dist/src/research-subscriptions/cron-client.js.map +1 -0
  24. package/dist/src/research-subscriptions/delivery.d.ts +10 -0
  25. package/dist/src/research-subscriptions/delivery.d.ts.map +1 -0
  26. package/dist/src/research-subscriptions/delivery.js +82 -0
  27. package/dist/src/research-subscriptions/delivery.js.map +1 -0
  28. package/dist/src/research-subscriptions/handlers.d.ts +6 -0
  29. package/dist/src/research-subscriptions/handlers.d.ts.map +1 -0
  30. package/dist/src/research-subscriptions/handlers.js +203 -0
  31. package/dist/src/research-subscriptions/handlers.js.map +1 -0
  32. package/dist/src/research-subscriptions/parse.d.ts +11 -0
  33. package/dist/src/research-subscriptions/parse.d.ts.map +1 -0
  34. package/dist/src/research-subscriptions/parse.js +478 -0
  35. package/dist/src/research-subscriptions/parse.js.map +1 -0
  36. package/dist/src/research-subscriptions/prompt.d.ts +5 -0
  37. package/dist/src/research-subscriptions/prompt.d.ts.map +1 -0
  38. package/dist/src/research-subscriptions/prompt.js +189 -0
  39. package/dist/src/research-subscriptions/prompt.js.map +1 -0
  40. package/dist/src/research-subscriptions/types.d.ts +65 -0
  41. package/dist/src/research-subscriptions/types.d.ts.map +1 -0
  42. package/dist/src/research-subscriptions/types.js +2 -0
  43. package/dist/src/research-subscriptions/types.js.map +1 -0
  44. package/dist/src/research-subscriptions.d.ts +1 -9
  45. package/dist/src/research-subscriptions.d.ts.map +1 -1
  46. package/dist/src/research-subscriptions.js +1 -761
  47. package/dist/src/research-subscriptions.js.map +1 -1
  48. package/dist/src/tools/scientify-cron.d.ts +20 -0
  49. package/dist/src/tools/scientify-cron.d.ts.map +1 -1
  50. package/dist/src/tools/scientify-cron.js +104 -4
  51. package/dist/src/tools/scientify-cron.js.map +1 -1
  52. package/dist/src/tools/scientify-literature-state.d.ts +70 -0
  53. package/dist/src/tools/scientify-literature-state.d.ts.map +1 -0
  54. package/dist/src/tools/scientify-literature-state.js +312 -0
  55. package/dist/src/tools/scientify-literature-state.js.map +1 -0
  56. package/package.json +1 -1
  57. package/skills/_shared/workspace-spec.md +4 -1
  58. package/skills/research-subscription/SKILL.md +14 -1
@@ -0,0 +1,312 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { getIncrementalStateStatus, prepareIncrementalState, recordIncrementalPush, recordUserFeedback, } from "../literature/subscription-state.js";
3
+ import { Result } from "./result.js";
4
+ const PreferencesSchema = Type.Optional(Type.Object({
5
+ max_papers: Type.Optional(Type.Number({
6
+ description: "Maximum number of papers to push each run (1-20).",
7
+ })),
8
+ recency_days: Type.Optional(Type.Number({
9
+ description: "Optional recency preference in days for candidate retrieval.",
10
+ })),
11
+ sources: Type.Optional(Type.Array(Type.String({
12
+ description: "Preferred search sources, for example: arxiv, openalex.",
13
+ }))),
14
+ }));
15
+ const PaperSchema = Type.Object({
16
+ id: Type.Optional(Type.String({ description: "Stable paper id, such as arxiv:2501.12345 or doi:10.xxxx/..." })),
17
+ title: Type.Optional(Type.String({ description: "Paper title." })),
18
+ url: Type.Optional(Type.String({ description: "Source URL for traceability." })),
19
+ score: Type.Optional(Type.Number({
20
+ description: "Optional internal ranking score for backend logging (for example 0-100).",
21
+ })),
22
+ reason: Type.Optional(Type.String({
23
+ description: "Optional internal ranking rationale for backend logging.",
24
+ })),
25
+ });
26
+ export const ScientifyLiteratureStateToolSchema = Type.Object({
27
+ action: Type.String({
28
+ description: 'Action: "prepare" | "record" | "feedback" | "status".',
29
+ }),
30
+ scope: Type.String({
31
+ description: "Scope key used to isolate user/channel state.",
32
+ }),
33
+ topic: Type.String({
34
+ description: "Research topic text.",
35
+ }),
36
+ preferences: PreferencesSchema,
37
+ papers: Type.Optional(Type.Array(PaperSchema, {
38
+ description: "Papers to mark as pushed when action=record.",
39
+ })),
40
+ status: Type.Optional(Type.String({
41
+ description: "Run status for action=record, for example: ok, empty, error.",
42
+ })),
43
+ run_id: Type.Optional(Type.String({
44
+ description: "Optional cron run/session id for traceability.",
45
+ })),
46
+ note: Type.Optional(Type.String({
47
+ description: "Optional note for this record.",
48
+ })),
49
+ signal: Type.Optional(Type.String({
50
+ description: 'Feedback signal for action=feedback: "read" | "skip" | "star".',
51
+ })),
52
+ paper: Type.Optional(Type.Object({
53
+ id: Type.Optional(Type.String({ description: "Optional paper id for feedback context." })),
54
+ title: Type.Optional(Type.String({ description: "Optional paper title for feedback context." })),
55
+ url: Type.Optional(Type.String({ description: "Optional paper URL for feedback context." })),
56
+ })),
57
+ source: Type.Optional(Type.String({
58
+ description: "Optional source hint for feedback (e.g. arxiv/openalex/domain).",
59
+ })),
60
+ tags: Type.Optional(Type.Array(Type.String({
61
+ description: "Optional feedback tags, e.g. [\"physics simulation\", \"agent\"].",
62
+ }))),
63
+ });
64
+ function readStringParam(params, key) {
65
+ const value = params[key];
66
+ if (typeof value !== "string")
67
+ return undefined;
68
+ const trimmed = value.trim();
69
+ return trimmed.length > 0 ? trimmed : undefined;
70
+ }
71
+ function readPreferences(params) {
72
+ const raw = params.preferences;
73
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
74
+ return undefined;
75
+ const record = raw;
76
+ const maxRaw = record.max_papers;
77
+ const recencyRaw = record.recency_days;
78
+ const sourcesRaw = record.sources;
79
+ const maxPapers = typeof maxRaw === "number" && Number.isFinite(maxRaw) ? maxRaw : undefined;
80
+ const recencyDays = typeof recencyRaw === "number" && Number.isFinite(recencyRaw) ? recencyRaw : undefined;
81
+ const sources = Array.isArray(sourcesRaw) && sourcesRaw.length > 0
82
+ ? sourcesRaw
83
+ .filter((item) => typeof item === "string")
84
+ .map((item) => item.trim())
85
+ .filter((item) => item.length > 0)
86
+ : undefined;
87
+ if (maxPapers === undefined && recencyDays === undefined && (!sources || sources.length === 0)) {
88
+ return undefined;
89
+ }
90
+ return {
91
+ ...(maxPapers !== undefined ? { maxPapers } : {}),
92
+ ...(recencyDays !== undefined ? { recencyDays } : {}),
93
+ ...(sources && sources.length > 0 ? { sources } : {}),
94
+ };
95
+ }
96
+ function readPapers(params) {
97
+ const raw = params.papers;
98
+ if (!Array.isArray(raw))
99
+ return [];
100
+ const papers = [];
101
+ for (const item of raw) {
102
+ if (!item || typeof item !== "object" || Array.isArray(item))
103
+ continue;
104
+ const record = item;
105
+ const id = typeof record.id === "string" ? record.id.trim() : undefined;
106
+ const title = typeof record.title === "string" ? record.title.trim() : undefined;
107
+ const url = typeof record.url === "string" ? record.url.trim() : undefined;
108
+ const score = typeof record.score === "number" && Number.isFinite(record.score)
109
+ ? record.score
110
+ : undefined;
111
+ const reason = typeof record.reason === "string" ? record.reason.trim() : undefined;
112
+ papers.push({
113
+ ...(id ? { id } : {}),
114
+ ...(title ? { title } : {}),
115
+ ...(url ? { url } : {}),
116
+ ...(score !== undefined ? { score } : {}),
117
+ ...(reason ? { reason } : {}),
118
+ });
119
+ }
120
+ return papers;
121
+ }
122
+ function readFeedbackSignal(params) {
123
+ const raw = readStringParam(params, "signal")?.toLowerCase();
124
+ if (raw === "read" || raw === "skip" || raw === "star")
125
+ return raw;
126
+ return undefined;
127
+ }
128
+ function readFeedbackPaper(params) {
129
+ const raw = params.paper;
130
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
131
+ return undefined;
132
+ const record = raw;
133
+ const id = typeof record.id === "string" ? record.id.trim() : undefined;
134
+ const title = typeof record.title === "string" ? record.title.trim() : undefined;
135
+ const url = typeof record.url === "string" ? record.url.trim() : undefined;
136
+ if (!id && !title && !url)
137
+ return undefined;
138
+ return {
139
+ ...(id ? { id } : {}),
140
+ ...(title ? { title } : {}),
141
+ ...(url ? { url } : {}),
142
+ };
143
+ }
144
+ function readStringList(params, key) {
145
+ const raw = params[key];
146
+ if (!Array.isArray(raw))
147
+ return undefined;
148
+ const values = raw
149
+ .filter((item) => typeof item === "string")
150
+ .map((item) => item.trim())
151
+ .filter((item) => item.length > 0);
152
+ return values.length > 0 ? values : undefined;
153
+ }
154
+ export function createScientifyLiteratureStateTool() {
155
+ return {
156
+ label: "Scientify Literature State",
157
+ name: "scientify_literature_state",
158
+ description: "Manage incremental literature state for subscriptions: prepare dedupe context, record pushed papers, persist lightweight feedback memory, and query status.",
159
+ parameters: ScientifyLiteratureStateToolSchema,
160
+ execute: async (_toolCallId, rawArgs) => {
161
+ const params = (rawArgs ?? {});
162
+ const action = (readStringParam(params, "action") ?? "").toLowerCase();
163
+ const scope = readStringParam(params, "scope");
164
+ const topic = readStringParam(params, "topic");
165
+ const preferences = readPreferences(params);
166
+ if (!scope || !topic) {
167
+ return Result.err("invalid_params", "Both `scope` and `topic` are required.");
168
+ }
169
+ try {
170
+ if (action === "prepare") {
171
+ const prepared = await prepareIncrementalState({ scope, topic, preferences });
172
+ return Result.ok({
173
+ action,
174
+ scope: prepared.scope,
175
+ topic: prepared.topic,
176
+ topic_key: prepared.topicKey,
177
+ preferences: {
178
+ max_papers: prepared.preferences.maxPapers,
179
+ recency_days: prepared.preferences.recencyDays,
180
+ sources: prepared.preferences.sources,
181
+ },
182
+ memory_hints: {
183
+ preferred_keywords: prepared.memoryHints.preferredKeywords,
184
+ avoided_keywords: prepared.memoryHints.avoidedKeywords,
185
+ preferred_sources: prepared.memoryHints.preferredSources,
186
+ avoided_sources: prepared.memoryHints.avoidedSources,
187
+ feedback_counts: prepared.memoryHints.feedbackCounts,
188
+ last_feedback_at_ms: prepared.memoryHints.lastFeedbackAtMs ?? null,
189
+ },
190
+ exclude_paper_ids: prepared.excludePaperIds,
191
+ known_paper_count: prepared.knownPaperCount,
192
+ last_pushed_at_ms: prepared.lastPushedAtMs ?? null,
193
+ });
194
+ }
195
+ if (action === "record") {
196
+ const papers = readPapers(params);
197
+ const status = readStringParam(params, "status");
198
+ const runId = readStringParam(params, "run_id");
199
+ const note = readStringParam(params, "note");
200
+ const recorded = await recordIncrementalPush({
201
+ scope,
202
+ topic,
203
+ preferences,
204
+ status,
205
+ runId,
206
+ note,
207
+ papers,
208
+ });
209
+ return Result.ok({
210
+ action,
211
+ scope: recorded.scope,
212
+ topic: recorded.topic,
213
+ topic_key: recorded.topicKey,
214
+ preferences: {
215
+ max_papers: recorded.preferences.maxPapers,
216
+ recency_days: recorded.preferences.recencyDays,
217
+ sources: recorded.preferences.sources,
218
+ },
219
+ memory_hints: {
220
+ preferred_keywords: recorded.memoryHints.preferredKeywords,
221
+ avoided_keywords: recorded.memoryHints.avoidedKeywords,
222
+ preferred_sources: recorded.memoryHints.preferredSources,
223
+ avoided_sources: recorded.memoryHints.avoidedSources,
224
+ feedback_counts: recorded.memoryHints.feedbackCounts,
225
+ last_feedback_at_ms: recorded.memoryHints.lastFeedbackAtMs ?? null,
226
+ },
227
+ recorded_papers: recorded.recordedPapers,
228
+ total_known_papers: recorded.totalKnownPapers,
229
+ pushed_at_ms: recorded.pushedAtMs,
230
+ });
231
+ }
232
+ if (action === "feedback") {
233
+ const signal = readFeedbackSignal(params);
234
+ if (!signal) {
235
+ return Result.err("invalid_params", 'Action "feedback" requires `signal` as one of: read, skip, star.');
236
+ }
237
+ const runId = readStringParam(params, "run_id");
238
+ const note = readStringParam(params, "note");
239
+ const source = readStringParam(params, "source");
240
+ const tags = readStringList(params, "tags");
241
+ const paper = readFeedbackPaper(params);
242
+ const feedback = await recordUserFeedback({
243
+ scope,
244
+ topic,
245
+ preferences,
246
+ feedback: {
247
+ signal,
248
+ ...(paper ? { paper } : {}),
249
+ ...(source ? { source } : {}),
250
+ ...(tags ? { tags } : {}),
251
+ ...(note ? { note } : {}),
252
+ ...(runId ? { runId } : {}),
253
+ },
254
+ });
255
+ return Result.ok({
256
+ action,
257
+ scope: feedback.scope,
258
+ topic: feedback.topic,
259
+ topic_key: feedback.topicKey,
260
+ signal: feedback.signal,
261
+ preferences: {
262
+ max_papers: feedback.preferences.maxPapers,
263
+ recency_days: feedback.preferences.recencyDays,
264
+ sources: feedback.preferences.sources,
265
+ },
266
+ memory_hints: {
267
+ preferred_keywords: feedback.memoryHints.preferredKeywords,
268
+ avoided_keywords: feedback.memoryHints.avoidedKeywords,
269
+ preferred_sources: feedback.memoryHints.preferredSources,
270
+ avoided_sources: feedback.memoryHints.avoidedSources,
271
+ feedback_counts: feedback.memoryHints.feedbackCounts,
272
+ last_feedback_at_ms: feedback.memoryHints.lastFeedbackAtMs ?? null,
273
+ },
274
+ updated_at_ms: feedback.updatedAtMs,
275
+ });
276
+ }
277
+ if (action === "status") {
278
+ const status = await getIncrementalStateStatus({ scope, topic });
279
+ return Result.ok({
280
+ action,
281
+ scope: status.scope,
282
+ topic: status.topic,
283
+ topic_key: status.topicKey,
284
+ preferences: {
285
+ max_papers: status.preferences.maxPapers,
286
+ recency_days: status.preferences.recencyDays,
287
+ sources: status.preferences.sources,
288
+ },
289
+ memory_hints: {
290
+ preferred_keywords: status.memoryHints.preferredKeywords,
291
+ avoided_keywords: status.memoryHints.avoidedKeywords,
292
+ preferred_sources: status.memoryHints.preferredSources,
293
+ avoided_sources: status.memoryHints.avoidedSources,
294
+ feedback_counts: status.memoryHints.feedbackCounts,
295
+ last_feedback_at_ms: status.memoryHints.lastFeedbackAtMs ?? null,
296
+ },
297
+ exclude_paper_ids: status.excludePaperIds,
298
+ known_paper_count: status.knownPaperCount,
299
+ total_runs: status.totalRuns,
300
+ last_status: status.lastStatus ?? null,
301
+ last_pushed_at_ms: status.lastPushedAtMs ?? null,
302
+ });
303
+ }
304
+ return Result.err("invalid_params", 'Invalid action. Use one of: "prepare", "record", "feedback", "status".');
305
+ }
306
+ catch (error) {
307
+ return Result.err("runtime_error", `scientify_literature_state failed: ${error instanceof Error ? error.message : String(error)}`);
308
+ }
309
+ },
310
+ };
311
+ }
312
+ //# sourceMappingURL=scientify-literature-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scientify-literature-state.js","sourceRoot":"","sources":["../../../src/tools/scientify-literature-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scientify",
3
- "version": "1.10.0",
3
+ "version": "1.10.2",
4
4
  "description": "Scientify - AI-powered research workflow automation for OpenClaw. Includes idea generation, literature review, research pipeline skills, and arxiv tool.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -129,6 +129,9 @@ WORKSPACE=~/.openclaw/workspace/projects/$(cat ~/.openclaw/workspace/projects/.a
129
129
  `research-subscription` does not write project files under the workspace tree.
130
130
 
131
131
  - Scheduled jobs are stored in OpenClaw cron storage.
132
+ - Incremental dedupe state/logs are stored under `~/.openclaw/workspace/scientify/`:
133
+ - `literature-state.json`
134
+ - `literature-push-log.jsonl`
132
135
  - Use `openclaw cron list --all --json` for global inspection.
133
136
  - Use `/research-subscriptions` for scope-aware inspection within Scientify.
134
137
  - Use `/research-unsubscribe` to remove jobs for the current sender/channel scope.
@@ -146,4 +149,4 @@ WORKSPACE=~/.openclaw/workspace/projects/$(cat ~/.openclaw/workspace/projects/.a
146
149
  | `/research-pipeline` | Orchestrator — spawns the above 5 skills in sequence |
147
150
  | `/idea-generation` | `ideas/` |
148
151
  | `/write-review-paper` | `review/` |
149
- | `research-subscription` | No workspace file output; creates OpenClaw cron jobs |
152
+ | `research-subscription` | No project-tree output; creates OpenClaw cron jobs and updates `~/.openclaw/workspace/scientify/` incremental state logs (including lightweight preference-memory feedback) |
@@ -38,7 +38,14 @@ Routing rules:
38
38
 
39
39
  - Research digest / paper tracking request: pass `topic`, leave `message` unset.
40
40
  - Plain reminder request: pass `message`, do not set `topic`.
41
+ - If request mentions literature/papers/research updates, do not downgrade it to a plain reminder even when sentence contains "remind".
41
42
  - If request is ambiguous, ask one concise clarification question before tool call.
43
+ - For recurring research subscriptions, prefer setting lightweight preferences:
44
+ - `max_papers` (default 3)
45
+ - `recency_days` (optional)
46
+ - `sources` (optional, e.g. `["arxiv","openalex"]`)
47
+ - `candidate_pool` (optional, default around 10)
48
+ - `score_weights` (optional object with `relevance`/`novelty`/`authority`/`actionability`)
42
49
 
43
50
  ## Scheduling format
44
51
 
@@ -54,7 +61,8 @@ For `action: "upsert"`, set `schedule` to one of:
54
61
  ## Delivery fields
55
62
 
56
63
  - Optional `channel`: `feishu`, `telegram`, `slack`, `discord`, `last`, and others
57
- - Optional `to`: channel-specific user or chat id
64
+ - Optional aliases: `webui`, `tui` (both map to `last`)
65
+ - Optional `to`: channel-specific user or chat id (required only for concrete channels like `feishu`/`telegram`, not for `last`/`webui`/`tui`)
58
66
  - Optional `no_deliver: true`: run in background without push
59
67
 
60
68
  If the user does not specify destination, leave `channel` and `to` unset to use default routing.
@@ -63,6 +71,11 @@ If the user does not specify destination, leave `channel` and `to` unset to use
63
71
 
64
72
  If the user gives a clear topic, pass it as `topic` (for example, `"LLM alignment"`).
65
73
  This focuses scheduled research content on that topic.
74
+ Recurring research jobs automatically use `scientify_literature_state` at runtime
75
+ to prepare dedupe context and record pushed paper IDs for traceability.
76
+ If an incremental pass returns no unseen papers, run one fallback representative pass before returning empty.
77
+ If user gives explicit preference feedback during follow-up (read/skip/star style intent, source preference, direction preference),
78
+ persist it via `scientify_literature_state` action=`feedback` (backend-only memory, not user-facing by default).
66
79
 
67
80
  ## Message field (plain reminder)
68
81