scientify 1.9.0 → 1.10.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 (63) hide show
  1. package/README.md +29 -0
  2. package/README.zh.md +29 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +29 -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 +6 -0
  8. package/dist/src/hooks/research-mode.js.map +1 -1
  9. package/dist/src/hooks/scientify-cron-autofill.d.ts +15 -0
  10. package/dist/src/hooks/scientify-cron-autofill.d.ts.map +1 -0
  11. package/dist/src/hooks/scientify-cron-autofill.js +156 -0
  12. package/dist/src/hooks/scientify-cron-autofill.js.map +1 -0
  13. package/dist/src/hooks/scientify-signature.d.ts.map +1 -1
  14. package/dist/src/hooks/scientify-signature.js +4 -1
  15. package/dist/src/hooks/scientify-signature.js.map +1 -1
  16. package/dist/src/literature/subscription-state.d.ts +90 -0
  17. package/dist/src/literature/subscription-state.d.ts.map +1 -0
  18. package/dist/src/literature/subscription-state.js +521 -0
  19. package/dist/src/literature/subscription-state.js.map +1 -0
  20. package/dist/src/research-subscriptions/constants.d.ts +16 -0
  21. package/dist/src/research-subscriptions/constants.d.ts.map +1 -0
  22. package/dist/src/research-subscriptions/constants.js +59 -0
  23. package/dist/src/research-subscriptions/constants.js.map +1 -0
  24. package/dist/src/research-subscriptions/cron-client.d.ts +8 -0
  25. package/dist/src/research-subscriptions/cron-client.d.ts.map +1 -0
  26. package/dist/src/research-subscriptions/cron-client.js +81 -0
  27. package/dist/src/research-subscriptions/cron-client.js.map +1 -0
  28. package/dist/src/research-subscriptions/delivery.d.ts +10 -0
  29. package/dist/src/research-subscriptions/delivery.d.ts.map +1 -0
  30. package/dist/src/research-subscriptions/delivery.js +82 -0
  31. package/dist/src/research-subscriptions/delivery.js.map +1 -0
  32. package/dist/src/research-subscriptions/handlers.d.ts +6 -0
  33. package/dist/src/research-subscriptions/handlers.d.ts.map +1 -0
  34. package/dist/src/research-subscriptions/handlers.js +200 -0
  35. package/dist/src/research-subscriptions/handlers.js.map +1 -0
  36. package/dist/src/research-subscriptions/parse.d.ts +11 -0
  37. package/dist/src/research-subscriptions/parse.d.ts.map +1 -0
  38. package/dist/src/research-subscriptions/parse.js +478 -0
  39. package/dist/src/research-subscriptions/parse.js.map +1 -0
  40. package/dist/src/research-subscriptions/prompt.d.ts +5 -0
  41. package/dist/src/research-subscriptions/prompt.d.ts.map +1 -0
  42. package/dist/src/research-subscriptions/prompt.js +161 -0
  43. package/dist/src/research-subscriptions/prompt.js.map +1 -0
  44. package/dist/src/research-subscriptions/types.d.ts +65 -0
  45. package/dist/src/research-subscriptions/types.d.ts.map +1 -0
  46. package/dist/src/research-subscriptions/types.js +2 -0
  47. package/dist/src/research-subscriptions/types.js.map +1 -0
  48. package/dist/src/research-subscriptions.d.ts +2 -0
  49. package/dist/src/research-subscriptions.d.ts.map +1 -0
  50. package/dist/src/research-subscriptions.js +2 -0
  51. package/dist/src/research-subscriptions.js.map +1 -0
  52. package/dist/src/tools/scientify-cron.d.ts +62 -0
  53. package/dist/src/tools/scientify-cron.d.ts.map +1 -0
  54. package/dist/src/tools/scientify-cron.js +224 -0
  55. package/dist/src/tools/scientify-cron.js.map +1 -0
  56. package/dist/src/tools/scientify-literature-state.d.ts +70 -0
  57. package/dist/src/tools/scientify-literature-state.d.ts.map +1 -0
  58. package/dist/src/tools/scientify-literature-state.js +312 -0
  59. package/dist/src/tools/scientify-literature-state.js.map +1 -0
  60. package/openclaw.plugin.json +2 -1
  61. package/package.json +1 -1
  62. package/skills/_shared/workspace-spec.md +13 -0
  63. package/skills/research-subscription/SKILL.md +102 -0
@@ -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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"}
@@ -28,6 +28,7 @@
28
28
  "skills/research-review",
29
29
  "skills/research-experiment",
30
30
  "skills/literature-survey",
31
- "skills/write-review-paper"
31
+ "skills/write-review-paper",
32
+ "skills/research-subscription"
32
33
  ]
33
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scientify",
3
- "version": "1.9.0",
3
+ "version": "1.10.1",
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",
@@ -124,6 +124,18 @@ echo "battery-rul-prediction" > ~/.openclaw/workspace/projects/.active
124
124
  WORKSPACE=~/.openclaw/workspace/projects/$(cat ~/.openclaw/workspace/projects/.active)
125
125
  ```
126
126
 
127
+ ### Scheduled Subscription Storage
128
+
129
+ `research-subscription` does not write project files under the workspace tree.
130
+
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`
135
+ - Use `openclaw cron list --all --json` for global inspection.
136
+ - Use `/research-subscriptions` for scope-aware inspection within Scientify.
137
+ - Use `/research-unsubscribe` to remove jobs for the current sender/channel scope.
138
+
127
139
  ## Skill Outputs Summary
128
140
 
129
141
  | Skill | Primary Outputs |
@@ -137,3 +149,4 @@ WORKSPACE=~/.openclaw/workspace/projects/$(cat ~/.openclaw/workspace/projects/.a
137
149
  | `/research-pipeline` | Orchestrator — spawns the above 5 skills in sequence |
138
150
  | `/idea-generation` | `ideas/` |
139
151
  | `/write-review-paper` | `review/` |
152
+ | `research-subscription` | No project-tree output; creates OpenClaw cron jobs and updates `~/.openclaw/workspace/scientify/` incremental state logs (including lightweight preference-memory feedback) |
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: research-subscription
3
+ description: "Use when the user asks for scheduled or recurring tasks: literature digests, delayed push notifications, or plain reminders."
4
+ metadata:
5
+ {
6
+ "openclaw":
7
+ {
8
+ "emoji": "⏰",
9
+ },
10
+ }
11
+ ---
12
+
13
+ # Research Subscription (Scheduled Push)
14
+
15
+ ## When to use
16
+
17
+ Use this skill when the user asks for:
18
+
19
+ - Scheduled literature updates
20
+ - A delayed report (for example, tomorrow morning)
21
+ - Recurring tracking and push delivery
22
+ - A normal reminder (for example, "remind me in 5 minutes to sleep")
23
+
24
+ ## Core rule
25
+
26
+ Do not stop at explanation.
27
+ Create a real cron job via `scientify_cron_job`.
28
+
29
+ ## Tool to call
30
+
31
+ `scientify_cron_job`
32
+
33
+ - `action: "upsert"`: create or update a schedule
34
+ - `action: "list"`: show current schedules
35
+ - `action: "remove"`: cancel schedules
36
+
37
+ Routing rules:
38
+
39
+ - Research digest / paper tracking request: pass `topic`, leave `message` unset.
40
+ - Plain reminder request: pass `message`, do not set `topic`.
41
+ - If request is ambiguous, ask one concise clarification question before tool call.
42
+ - For recurring research subscriptions, prefer setting lightweight preferences:
43
+ - `max_papers` (default 3)
44
+ - `recency_days` (optional)
45
+ - `sources` (optional, e.g. `["arxiv","openalex"]`)
46
+ - `candidate_pool` (optional, default around 10)
47
+ - `score_weights` (optional object with `relevance`/`novelty`/`authority`/`actionability`)
48
+
49
+ ## Scheduling format
50
+
51
+ For `action: "upsert"`, set `schedule` to one of:
52
+
53
+ - `daily 08:00 Asia/Shanghai`
54
+ - `weekly mon 09:30 Asia/Shanghai`
55
+ - `every 6h`
56
+ - `at 2m`
57
+ - `at 2026-03-04T08:00:00+08:00`
58
+ - `cron 0 9 * * * Asia/Shanghai`
59
+
60
+ ## Delivery fields
61
+
62
+ - Optional `channel`: `feishu`, `telegram`, `slack`, `discord`, `last`, and others
63
+ - Optional aliases: `webui`, `tui` (both map to `last`)
64
+ - Optional `to`: channel-specific user or chat id (required only for concrete channels like `feishu`/`telegram`, not for `last`/`webui`/`tui`)
65
+ - Optional `no_deliver: true`: run in background without push
66
+
67
+ If the user does not specify destination, leave `channel` and `to` unset to use default routing.
68
+
69
+ ## Topic field
70
+
71
+ If the user gives a clear topic, pass it as `topic` (for example, `"LLM alignment"`).
72
+ This focuses scheduled research content on that topic.
73
+ Recurring research jobs automatically use `scientify_literature_state` at runtime
74
+ to prepare dedupe context and record pushed paper IDs for traceability.
75
+ If an incremental pass returns no unseen papers, run one fallback representative pass before returning empty.
76
+ If user gives explicit preference feedback during follow-up (read/skip/star style intent, source preference, direction preference),
77
+ persist it via `scientify_literature_state` action=`feedback` (backend-only memory, not user-facing by default).
78
+
79
+ ## Message field (plain reminder)
80
+
81
+ For non-research reminders, pass `message` with the exact reminder content.
82
+
83
+ - Example: `message: "Today at noon, remember to drink coffee."`
84
+ - Do not set `topic` for plain reminders.
85
+
86
+ ## Response requirements
87
+
88
+ After tool success, reply with:
89
+
90
+ 1. Job created or updated
91
+ 2. Effective schedule (with timezone)
92
+ 3. Delivery target
93
+ 4. Next command for inspect or cancel
94
+
95
+ For plain reminders, you may add one optional follow-up line:
96
+ - "If you want, I can also set recurring literature tracking with Scientify on a topic."
97
+
98
+ The final response must end with this exact footer:
99
+ ---
100
+ 🐍Scientify
101
+
102
+ If the schedule is ambiguous, ask one concise clarification question before calling the tool.