scientify 2.0.0 → 3.0.0
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.
- package/README.en.md +21 -0
- package/README.md +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -76
- package/dist/index.js.map +1 -1
- package/dist/src/cli/research.d.ts.map +1 -1
- package/dist/src/cli/research.js +6 -23
- package/dist/src/cli/research.js.map +1 -1
- package/dist/src/commands/metabolism-status.d.ts.map +1 -1
- package/dist/src/commands/metabolism-status.js +5 -25
- package/dist/src/commands/metabolism-status.js.map +1 -1
- package/dist/src/commands.d.ts +8 -8
- package/dist/src/commands.d.ts.map +1 -1
- package/dist/src/commands.js +91 -262
- package/dist/src/commands.js.map +1 -1
- package/dist/src/templates/bootstrap.d.ts.map +1 -1
- package/dist/src/templates/bootstrap.js +45 -59
- package/dist/src/templates/bootstrap.js.map +1 -1
- package/dist/src/types.d.ts +2 -10
- package/dist/src/types.d.ts.map +1 -1
- package/openclaw.plugin.json +3 -16
- package/package.json +2 -3
- package/skills/idea-generation/SKILL.md +20 -44
- package/skills/idea-generation/references/code-mapping.md +3 -3
- package/skills/idea-generation/references/idea-template.md +1 -1
- package/skills/idea-generation/references/reading-long-papers.md +3 -3
- package/skills/metabolism/SKILL.md +80 -36
- package/skills/paper-download/SKILL.md +61 -0
- package/skills/research-collect/SKILL.md +41 -111
- package/skills/research-experiment/SKILL.md +11 -12
- package/skills/research-implement/SKILL.md +10 -11
- package/skills/research-pipeline/SKILL.md +23 -31
- package/skills/research-plan/SKILL.md +7 -11
- package/skills/research-review/SKILL.md +21 -22
- package/skills/research-survey/SKILL.md +11 -25
- package/skills/write-review-paper/SKILL.md +12 -12
- package/skills/write-review-paper/references/note-template.md +1 -1
- package/skills/write-review-paper/references/survey-template.md +1 -1
- package/dist/src/hooks/research-mode.d.ts +0 -22
- package/dist/src/hooks/research-mode.d.ts.map +0 -1
- package/dist/src/hooks/research-mode.js +0 -35
- package/dist/src/hooks/research-mode.js.map +0 -1
- package/dist/src/hooks/scientify-cron-autofill.d.ts +0 -15
- package/dist/src/hooks/scientify-cron-autofill.d.ts.map +0 -1
- package/dist/src/hooks/scientify-cron-autofill.js +0 -156
- package/dist/src/hooks/scientify-cron-autofill.js.map +0 -1
- package/dist/src/hooks/scientify-signature.d.ts +0 -21
- package/dist/src/hooks/scientify-signature.d.ts.map +0 -1
- package/dist/src/hooks/scientify-signature.js +0 -150
- package/dist/src/hooks/scientify-signature.js.map +0 -1
- package/dist/src/knowledge-state/project.d.ts +0 -13
- package/dist/src/knowledge-state/project.d.ts.map +0 -1
- package/dist/src/knowledge-state/project.js +0 -88
- package/dist/src/knowledge-state/project.js.map +0 -1
- package/dist/src/knowledge-state/render.d.ts +0 -63
- package/dist/src/knowledge-state/render.d.ts.map +0 -1
- package/dist/src/knowledge-state/render.js +0 -368
- package/dist/src/knowledge-state/render.js.map +0 -1
- package/dist/src/knowledge-state/store.d.ts +0 -19
- package/dist/src/knowledge-state/store.d.ts.map +0 -1
- package/dist/src/knowledge-state/store.js +0 -978
- package/dist/src/knowledge-state/store.js.map +0 -1
- package/dist/src/knowledge-state/types.d.ts +0 -182
- package/dist/src/knowledge-state/types.d.ts.map +0 -1
- package/dist/src/knowledge-state/types.js +0 -2
- package/dist/src/knowledge-state/types.js.map +0 -1
- package/dist/src/literature/subscription-state.d.ts +0 -112
- package/dist/src/literature/subscription-state.d.ts.map +0 -1
- package/dist/src/literature/subscription-state.js +0 -696
- package/dist/src/literature/subscription-state.js.map +0 -1
- package/dist/src/research-subscriptions/constants.d.ts +0 -16
- package/dist/src/research-subscriptions/constants.d.ts.map +0 -1
- package/dist/src/research-subscriptions/constants.js +0 -59
- package/dist/src/research-subscriptions/constants.js.map +0 -1
- package/dist/src/research-subscriptions/cron-client.d.ts +0 -8
- package/dist/src/research-subscriptions/cron-client.d.ts.map +0 -1
- package/dist/src/research-subscriptions/cron-client.js +0 -81
- package/dist/src/research-subscriptions/cron-client.js.map +0 -1
- package/dist/src/research-subscriptions/delivery.d.ts +0 -10
- package/dist/src/research-subscriptions/delivery.d.ts.map +0 -1
- package/dist/src/research-subscriptions/delivery.js +0 -82
- package/dist/src/research-subscriptions/delivery.js.map +0 -1
- package/dist/src/research-subscriptions/handlers.d.ts +0 -6
- package/dist/src/research-subscriptions/handlers.d.ts.map +0 -1
- package/dist/src/research-subscriptions/handlers.js +0 -204
- package/dist/src/research-subscriptions/handlers.js.map +0 -1
- package/dist/src/research-subscriptions/parse.d.ts +0 -11
- package/dist/src/research-subscriptions/parse.d.ts.map +0 -1
- package/dist/src/research-subscriptions/parse.js +0 -492
- package/dist/src/research-subscriptions/parse.js.map +0 -1
- package/dist/src/research-subscriptions/prompt.d.ts +0 -5
- package/dist/src/research-subscriptions/prompt.d.ts.map +0 -1
- package/dist/src/research-subscriptions/prompt.js +0 -347
- package/dist/src/research-subscriptions/prompt.js.map +0 -1
- package/dist/src/research-subscriptions/types.d.ts +0 -66
- package/dist/src/research-subscriptions/types.d.ts.map +0 -1
- package/dist/src/research-subscriptions/types.js +0 -2
- package/dist/src/research-subscriptions/types.js.map +0 -1
- package/dist/src/research-subscriptions.d.ts +0 -2
- package/dist/src/research-subscriptions.d.ts.map +0 -1
- package/dist/src/research-subscriptions.js +0 -2
- package/dist/src/research-subscriptions.js.map +0 -1
- package/dist/src/services/auto-updater.d.ts +0 -15
- package/dist/src/services/auto-updater.d.ts.map +0 -1
- package/dist/src/services/auto-updater.js +0 -188
- package/dist/src/services/auto-updater.js.map +0 -1
- package/dist/src/tools/arxiv-download.d.ts +0 -24
- package/dist/src/tools/arxiv-download.d.ts.map +0 -1
- package/dist/src/tools/arxiv-download.js +0 -177
- package/dist/src/tools/arxiv-download.js.map +0 -1
- package/dist/src/tools/github-search-tool.d.ts +0 -25
- package/dist/src/tools/github-search-tool.d.ts.map +0 -1
- package/dist/src/tools/github-search-tool.js +0 -114
- package/dist/src/tools/github-search-tool.js.map +0 -1
- package/dist/src/tools/openreview-lookup.d.ts +0 -31
- package/dist/src/tools/openreview-lookup.d.ts.map +0 -1
- package/dist/src/tools/openreview-lookup.js +0 -414
- package/dist/src/tools/openreview-lookup.js.map +0 -1
- package/dist/src/tools/paper-browser.d.ts +0 -23
- package/dist/src/tools/paper-browser.d.ts.map +0 -1
- package/dist/src/tools/paper-browser.js +0 -121
- package/dist/src/tools/paper-browser.js.map +0 -1
- package/dist/src/tools/scientify-cron.d.ts +0 -63
- package/dist/src/tools/scientify-cron.d.ts.map +0 -1
- package/dist/src/tools/scientify-cron.js +0 -265
- package/dist/src/tools/scientify-cron.js.map +0 -1
- package/dist/src/tools/scientify-literature-state.d.ts +0 -303
- package/dist/src/tools/scientify-literature-state.d.ts.map +0 -1
- package/dist/src/tools/scientify-literature-state.js +0 -957
- package/dist/src/tools/scientify-literature-state.js.map +0 -1
- package/dist/src/tools/unpaywall-download.d.ts +0 -21
- package/dist/src/tools/unpaywall-download.d.ts.map +0 -1
- package/dist/src/tools/unpaywall-download.js +0 -169
- package/dist/src/tools/unpaywall-download.js.map +0 -1
- package/dist/src/tools/workspace.d.ts +0 -32
- package/dist/src/tools/workspace.d.ts.map +0 -1
- package/dist/src/tools/workspace.js +0 -69
- package/dist/src/tools/workspace.js.map +0 -1
- package/skills/metabolism-init/SKILL.md +0 -80
- package/skills/research-subscription/SKILL.md +0 -119
|
@@ -14,29 +14,22 @@ metadata:
|
|
|
14
14
|
|
|
15
15
|
**Don't ask permission. Just do it.**
|
|
16
16
|
|
|
17
|
-
**Workspace:** `$W` = working directory provided in task parameter.
|
|
18
|
-
|
|
19
17
|
## Prerequisites
|
|
20
18
|
|
|
21
19
|
Read and verify these files exist before starting:
|
|
22
20
|
|
|
23
21
|
| File | Source |
|
|
24
22
|
|------|--------|
|
|
25
|
-
|
|
|
26
|
-
| `$W/papers/_downloads/` or `$W/papers/{direction}/` | /research-collect |
|
|
27
|
-
| `$W/repos/` | /research-collect Phase 3 |
|
|
28
|
-
| `$W/prepare_res.md` | /research-collect Phase 3 |
|
|
23
|
+
| `papers/` | /research-collect 或 /metabolism |
|
|
29
24
|
|
|
30
25
|
**If papers are missing, STOP:** "需要先运行 /research-collect 完成论文下载"
|
|
31
26
|
|
|
32
|
-
**Note:** 如果 `prepare_res.md` 中注明"无可用参考仓库",代码映射步骤可跳过,但需在 survey_res.md 中标注。
|
|
33
|
-
|
|
34
27
|
## Output
|
|
35
28
|
|
|
36
29
|
| File | Content |
|
|
37
30
|
|------|---------|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
31
|
+
| `knowledge/paper_{id}.md` | Per-paper structured notes |
|
|
32
|
+
| `survey_res.md` | Synthesis report |
|
|
40
33
|
|
|
41
34
|
---
|
|
42
35
|
|
|
@@ -45,30 +38,23 @@ Read and verify these files exist before starting:
|
|
|
45
38
|
### Step 1: 收集论文列表
|
|
46
39
|
|
|
47
40
|
```bash
|
|
48
|
-
ls
|
|
41
|
+
ls papers/
|
|
49
42
|
```
|
|
50
43
|
|
|
51
|
-
|
|
44
|
+
列出所有论文目录(arXiv 源文件)和 PDF 文件。
|
|
52
45
|
|
|
53
46
|
### Step 2: 逐篇深度分析
|
|
54
47
|
|
|
55
|
-
|
|
48
|
+
**对每篇论文:**
|
|
56
49
|
|
|
57
50
|
#### 2.1 读 .tex 源码
|
|
58
51
|
|
|
59
|
-
找到论文的 .tex 文件(在 `
|
|
52
|
+
找到论文的 .tex 文件(在 `papers/{arxiv_id}/` 下),重点读取:
|
|
60
53
|
- **Method / Approach** section
|
|
61
54
|
- **Model Architecture** section
|
|
62
55
|
- 数学公式定义
|
|
63
56
|
|
|
64
|
-
**对于大型论文**(>2000
|
|
65
|
-
```javascript
|
|
66
|
-
// 先读前 100 行找到 section 位置
|
|
67
|
-
paper_browser({ file_path: "$W/papers/{arxiv_id}/{file}.tex", start_line: 1, num_lines: 100 })
|
|
68
|
-
|
|
69
|
-
// 找到 Method section 后,跳转到该位置
|
|
70
|
-
paper_browser({ file_path: "$W/papers/{arxiv_id}/{file}.tex", start_line: 450, num_lines: 150 })
|
|
71
|
-
```
|
|
57
|
+
**对于大型论文**(>2000 行),分段读取关键 section,避免上下文溢出。
|
|
72
58
|
|
|
73
59
|
如果没有 .tex(只有 PDF),基于 abstract 分析。
|
|
74
60
|
|
|
@@ -83,14 +69,14 @@ paper_browser({ file_path: "$W/papers/{arxiv_id}/{file}.tex", start_line: 450, n
|
|
|
83
69
|
|
|
84
70
|
**⚠️ 强制性步骤(当 repos/ 存在时)** — 代码映射是下游 plan 和 implement 的关键输入。
|
|
85
71
|
|
|
86
|
-
读取
|
|
72
|
+
读取 `prepare_res.md` 中的仓库列表,对每个公式/核心概念:
|
|
87
73
|
1. 在对应仓库中搜索实现代码(用 grep 关键类名/函数名)
|
|
88
74
|
2. 记录**文件路径、行号、代码片段**
|
|
89
75
|
3. 如果多个仓库有不同实现,记录差异
|
|
90
76
|
|
|
91
77
|
#### 2.4 写入笔记
|
|
92
78
|
|
|
93
|
-
写入
|
|
79
|
+
写入 `knowledge/paper_{id}.md`:
|
|
94
80
|
|
|
95
81
|
```markdown
|
|
96
82
|
# {Paper Title}
|
|
@@ -120,7 +106,7 @@ $$
|
|
|
120
106
|
|
|
121
107
|
### Step 3: 综合报告
|
|
122
108
|
|
|
123
|
-
读取所有 `
|
|
109
|
+
读取所有 `knowledge/paper_*.md`,写入 `survey_res.md`:
|
|
124
110
|
|
|
125
111
|
```markdown
|
|
126
112
|
# Survey Synthesis
|
|
@@ -16,18 +16,18 @@ metadata:
|
|
|
16
16
|
|
|
17
17
|
Guide for writing a structured literature review or survey paper from papers you've already collected. This skill helps with reading strategy, note organization, and academic writing.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Outputs go to `review/`.
|
|
20
20
|
|
|
21
21
|
## Prerequisites
|
|
22
22
|
|
|
23
23
|
Before starting, ensure you have:
|
|
24
|
-
1. Papers collected in
|
|
25
|
-
2. Ideally,
|
|
24
|
+
1. Papers collected in `papers/`
|
|
25
|
+
2. Ideally, knowledge base built in `knowledge/`
|
|
26
26
|
|
|
27
27
|
Check workspace:
|
|
28
28
|
```bash
|
|
29
|
-
ls
|
|
30
|
-
ls
|
|
29
|
+
ls papers/
|
|
30
|
+
ls knowledge/ 2>/dev/null
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
---
|
|
@@ -44,7 +44,7 @@ Based on clusters from survey, prioritize reading:
|
|
|
44
44
|
| P2 (重要) | 主要方法论、重要实验结果 | 读摘要+方法+实验 |
|
|
45
45
|
| P3 (参考) | 辅助材料、边缘相关 | 仅读摘要 |
|
|
46
46
|
|
|
47
|
-
Create
|
|
47
|
+
Create `review/reading_plan.md`:
|
|
48
48
|
|
|
49
49
|
```markdown
|
|
50
50
|
# Reading Plan
|
|
@@ -62,7 +62,7 @@ Create `$W/review/reading_plan.md`:
|
|
|
62
62
|
|
|
63
63
|
### 1.2 Reading Notes Template
|
|
64
64
|
|
|
65
|
-
For each paper, create
|
|
65
|
+
For each paper, create `review/notes/{paper_id}.md` using template in `references/note-template.md`.
|
|
66
66
|
|
|
67
67
|
---
|
|
68
68
|
|
|
@@ -70,7 +70,7 @@ For each paper, create `$W/review/notes/{paper_id}.md` using template in `refere
|
|
|
70
70
|
|
|
71
71
|
### 2.1 Build Comparison Table
|
|
72
72
|
|
|
73
|
-
Create
|
|
73
|
+
Create `review/comparison.md`:
|
|
74
74
|
|
|
75
75
|
```markdown
|
|
76
76
|
# Method Comparison
|
|
@@ -83,7 +83,7 @@ Create `$W/review/comparison.md`:
|
|
|
83
83
|
|
|
84
84
|
### 2.2 Timeline Analysis
|
|
85
85
|
|
|
86
|
-
Create
|
|
86
|
+
Create `review/timeline.md`:
|
|
87
87
|
|
|
88
88
|
```markdown
|
|
89
89
|
# Research Timeline
|
|
@@ -106,7 +106,7 @@ Create `$W/review/timeline.md`:
|
|
|
106
106
|
|
|
107
107
|
### 2.3 Taxonomy Design
|
|
108
108
|
|
|
109
|
-
Create
|
|
109
|
+
Create `review/taxonomy.md`:
|
|
110
110
|
|
|
111
111
|
```markdown
|
|
112
112
|
# Taxonomy of Approaches
|
|
@@ -140,7 +140,7 @@ Create `$W/review/taxonomy.md`:
|
|
|
140
140
|
|
|
141
141
|
### 3.1 Survey Paper Template
|
|
142
142
|
|
|
143
|
-
Create
|
|
143
|
+
Create `review/draft.md` using template in `references/survey-template.md`.
|
|
144
144
|
|
|
145
145
|
Key sections: Abstract → Introduction → Background → Taxonomy → Comparison → Datasets → Future Directions → Conclusion
|
|
146
146
|
|
|
@@ -198,7 +198,7 @@ For a thesis chapter:
|
|
|
198
198
|
## Output Files
|
|
199
199
|
|
|
200
200
|
```
|
|
201
|
-
|
|
201
|
+
review/
|
|
202
202
|
├── reading_plan.md # 阅读计划
|
|
203
203
|
├── notes/ # 阅读笔记
|
|
204
204
|
│ ├── {paper_id}.md
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook types (simplified for plugin use)
|
|
3
|
-
*/
|
|
4
|
-
type HookEvent = {
|
|
5
|
-
prompt: string;
|
|
6
|
-
messages?: unknown[];
|
|
7
|
-
};
|
|
8
|
-
type HookContext = {
|
|
9
|
-
agentId?: string;
|
|
10
|
-
sessionKey?: string;
|
|
11
|
-
workspaceDir?: string;
|
|
12
|
-
};
|
|
13
|
-
type HookResult = {
|
|
14
|
-
prependContext?: string;
|
|
15
|
-
systemPrompt?: string;
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Injects on every prompt build (survives compaction).
|
|
19
|
-
*/
|
|
20
|
-
export declare function createResearchModeHook(): (_event: HookEvent, _context: HookContext) => HookResult;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=research-mode.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Research mode prompt injected into every conversation.
|
|
3
|
-
*/
|
|
4
|
-
const RESEARCH_MODE_PROMPT = `[Scientify]
|
|
5
|
-
Skills: match research tasks to <available_skills>; read SKILL.md before acting.
|
|
6
|
-
Workspace: $W/projects/<topic>/. Check /research-status before writing. Active project in $W/projects/.active.
|
|
7
|
-
survey/ — search_terms.json, raw_results.json, filtered_papers.json, clusters.json, report.md (literature-survey)
|
|
8
|
-
papers/ — organized by cluster direction, each with paper_list.md + {arxiv_id}/ .tex sources (literature-survey)
|
|
9
|
-
notes/ — per-paper deep analysis paper_{id}.md (research-survey). survey_res.md = method comparison table.
|
|
10
|
-
ideas/ — gaps.md, idea_1..5.md, selected_idea.md, summary.md (idea-generation)
|
|
11
|
-
review/ — reading_plan.md, notes/{id}.md, comparison.md, taxonomy.md, draft.md, bibliography.bib (write-review-paper)
|
|
12
|
-
plan_res.md (research-plan) → project/ + ml_res.md (research-implement) → iterations/judge_v*.md (research-review) → experiment_res.md (research-experiment)
|
|
13
|
-
Scheduling: if user asks for recurring or delayed push delivery (e.g. tomorrow at 08:00, daily digest), use research-subscription skill and call scientify_cron_job to create a real schedule.
|
|
14
|
-
If it is a plain reminder (not research), set scientify_cron_job.message and do not default to the literature pipeline.
|
|
15
|
-
For recurring research pushes, use scientify_literature_state to prepare dedupe context and record both pushed paper IDs and structured knowledge_state (changes, updates, hypotheses, run_log).
|
|
16
|
-
Full-text-first policy: for papers used as core evidence, read full text when possible and mark full_text_read=true; if not fully read, you must explicitly mark full_text_read=false with unread_reason.
|
|
17
|
-
Structured paper record policy: for each core paper, populate domain/subdomains/cross-domain links/research goal/approach/methodology design/key contributions/practical insights/must-understand points/limitations/evidence anchors.
|
|
18
|
-
Use temporary local directory for full-text files (e.g. /tmp/scientify-fulltext/<run-id>) and delete it after record; write cleanup status to run_log.temp_cleanup_status.
|
|
19
|
-
Quality targets for research runs: core full-text coverage >=80%; evidence-binding rate >=90% (key conclusions must bind to section+locator+quote); citation error rate <2%. If full text is missing, do not keep high-confidence conclusions.
|
|
20
|
-
For research records, include project_id when available so state can persist under project knowledge_state/.
|
|
21
|
-
When user gives preference feedback (e.g. "more like this", "skip this direction", "prefer arxiv"), quietly persist it via scientify_literature_state action=feedback when scope/topic are inferable.
|
|
22
|
-
Preference memory is backend-only: use it to rerank future pushes, do not expose memory internals unless user explicitly asks.
|
|
23
|
-
Do not stop at explanation when user explicitly asks to set a schedule.
|
|
24
|
-
Rules: file exists = step done (skip). Outputs immutable unless user asks. project/ mutable during review loop.
|
|
25
|
-
Execution: always use \`python3\` (not \`python\`) for shell commands in this environment.
|
|
26
|
-
Rigor: read first, think second, answer third. Never fabricate references or results. Every claim needs a source. Say "I don't know" when uncertain. Read actual papers, not just abstracts. Ground ideas in real papers.`;
|
|
27
|
-
/**
|
|
28
|
-
* Injects on every prompt build (survives compaction).
|
|
29
|
-
*/
|
|
30
|
-
export function createResearchModeHook() {
|
|
31
|
-
return (_event, _context) => {
|
|
32
|
-
return { prependContext: RESEARCH_MODE_PROMPT };
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=research-mode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"research-mode.js","sourceRoot":"","sources":["../../../src/hooks/research-mode.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;0NAsB6L,CAAC;AAE3N;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,MAAiB,EAAE,QAAqB,EAAc,EAAE;QAC9D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
type BeforeToolCallEvent = {
|
|
2
|
-
toolName: string;
|
|
3
|
-
params?: Record<string, unknown>;
|
|
4
|
-
};
|
|
5
|
-
type BeforeToolCallContext = {
|
|
6
|
-
sessionKey?: string;
|
|
7
|
-
agentId?: string;
|
|
8
|
-
channel?: string;
|
|
9
|
-
senderId?: string;
|
|
10
|
-
};
|
|
11
|
-
export declare function createScientifyCronAutofillHook(): (event: BeforeToolCallEvent, context: BeforeToolCallContext) => {
|
|
12
|
-
params: Record<string, unknown>;
|
|
13
|
-
} | void;
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=scientify-cron-autofill.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scientify-cron-autofill.d.ts","sourceRoot":"","sources":["../../../src/hooks/scientify-cron-autofill.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAoIF,wBAAgB,+BAA+B,KAE3C,OAAO,mBAAmB,EAC1B,SAAS,qBAAqB,KAC7B;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAiD9C"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
const CHANNELS_WITH_TARGET = new Set([
|
|
2
|
-
"telegram",
|
|
3
|
-
"whatsapp",
|
|
4
|
-
"discord",
|
|
5
|
-
"irc",
|
|
6
|
-
"googlechat",
|
|
7
|
-
"slack",
|
|
8
|
-
"signal",
|
|
9
|
-
"imessage",
|
|
10
|
-
"feishu",
|
|
11
|
-
"nostr",
|
|
12
|
-
"msteams",
|
|
13
|
-
"mattermost",
|
|
14
|
-
"nextcloud-talk",
|
|
15
|
-
"matrix",
|
|
16
|
-
"bluebubbles",
|
|
17
|
-
"line",
|
|
18
|
-
"zalo",
|
|
19
|
-
"zalouser",
|
|
20
|
-
"synology-chat",
|
|
21
|
-
"tlon",
|
|
22
|
-
]);
|
|
23
|
-
function readString(value) {
|
|
24
|
-
if (typeof value !== "string")
|
|
25
|
-
return undefined;
|
|
26
|
-
const trimmed = value.trim();
|
|
27
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
28
|
-
}
|
|
29
|
-
function readLowerString(value) {
|
|
30
|
-
const raw = readString(value);
|
|
31
|
-
return raw ? raw.toLowerCase() : undefined;
|
|
32
|
-
}
|
|
33
|
-
function splitSessionKeyParts(sessionKey) {
|
|
34
|
-
// OpenClaw may append thread suffix: ...:thread:<id>
|
|
35
|
-
// Strip that suffix first to avoid treating thread id as peer id.
|
|
36
|
-
const lower = sessionKey.toLowerCase();
|
|
37
|
-
const threadIndex = lower.lastIndexOf(":thread:");
|
|
38
|
-
const base = threadIndex >= 0 ? sessionKey.slice(0, threadIndex) : sessionKey;
|
|
39
|
-
return base.split(":").filter((part) => part.length > 0);
|
|
40
|
-
}
|
|
41
|
-
function joinParts(parts, start) {
|
|
42
|
-
const joined = parts.slice(start).join(":").trim();
|
|
43
|
-
return joined.length > 0 ? joined : undefined;
|
|
44
|
-
}
|
|
45
|
-
function deriveFromSessionKey(sessionKey) {
|
|
46
|
-
const raw = readString(sessionKey);
|
|
47
|
-
if (!raw)
|
|
48
|
-
return {};
|
|
49
|
-
// Canonical OpenClaw patterns:
|
|
50
|
-
// - agent:<agentId>:<channel>:direct:<peerId>
|
|
51
|
-
// - agent:<agentId>:<channel>:<accountId>:direct:<peerId>
|
|
52
|
-
// - agent:<agentId>:<channel>:group:<peerId>
|
|
53
|
-
// - agent:<agentId>:direct:<peerId>
|
|
54
|
-
const parts = splitSessionKeyParts(raw);
|
|
55
|
-
if (parts.length < 3 || parts[0].toLowerCase() !== "agent")
|
|
56
|
-
return {};
|
|
57
|
-
const rest = parts.slice(2);
|
|
58
|
-
if (rest.length === 0)
|
|
59
|
-
return {};
|
|
60
|
-
const token0 = rest[0]?.toLowerCase();
|
|
61
|
-
const token1 = rest[1]?.toLowerCase();
|
|
62
|
-
const token2 = rest[2]?.toLowerCase();
|
|
63
|
-
// agent:<agentId>:direct:<peerId>
|
|
64
|
-
if (token0 === "direct" || token0 === "dm") {
|
|
65
|
-
return { senderId: joinParts(rest, 1) };
|
|
66
|
-
}
|
|
67
|
-
// agent:<agentId>:<channel>:direct:<peerId>
|
|
68
|
-
if (token1 === "direct" || token1 === "dm") {
|
|
69
|
-
return {
|
|
70
|
-
channel: token0,
|
|
71
|
-
senderId: joinParts(rest, 2),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
// agent:<agentId>:<channel>:<accountId>:direct:<peerId>
|
|
75
|
-
if (token2 === "direct" || token2 === "dm") {
|
|
76
|
-
return {
|
|
77
|
-
channel: token0,
|
|
78
|
-
senderId: joinParts(rest, 3),
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// Non-direct session (group/channel/thread), peer id is still a valid delivery target.
|
|
82
|
-
if (rest.length >= 3) {
|
|
83
|
-
return {
|
|
84
|
-
channel: token0,
|
|
85
|
-
senderId: joinParts(rest, 2),
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
return { channel: token0 };
|
|
89
|
-
}
|
|
90
|
-
function deriveOrigin(context) {
|
|
91
|
-
const fromContext = {
|
|
92
|
-
channel: readLowerString(context.channel),
|
|
93
|
-
senderId: readString(context.senderId),
|
|
94
|
-
};
|
|
95
|
-
if (fromContext.channel && fromContext.senderId) {
|
|
96
|
-
return fromContext;
|
|
97
|
-
}
|
|
98
|
-
const fromSession = deriveFromSessionKey(context.sessionKey);
|
|
99
|
-
return {
|
|
100
|
-
channel: fromContext.channel ?? fromSession.channel,
|
|
101
|
-
senderId: fromContext.senderId ?? fromSession.senderId,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function sanitizeScopePart(value) {
|
|
105
|
-
const cleaned = value
|
|
106
|
-
.toLowerCase()
|
|
107
|
-
.replace(/[^a-z0-9_-]+/g, "-")
|
|
108
|
-
.replace(/-+/g, "-")
|
|
109
|
-
.replace(/^-|-$/g, "");
|
|
110
|
-
return cleaned || "unknown";
|
|
111
|
-
}
|
|
112
|
-
export function createScientifyCronAutofillHook() {
|
|
113
|
-
return (event, context) => {
|
|
114
|
-
if (event.toolName !== "scientify_cron_job")
|
|
115
|
-
return;
|
|
116
|
-
const params = event.params ?? {};
|
|
117
|
-
const action = readLowerString(params.action);
|
|
118
|
-
if (action !== "upsert")
|
|
119
|
-
return;
|
|
120
|
-
if (params.no_deliver === true)
|
|
121
|
-
return;
|
|
122
|
-
const explicitChannel = readLowerString(params.channel);
|
|
123
|
-
const explicitTo = readString(params.to);
|
|
124
|
-
const explicitScope = readString(params.scope);
|
|
125
|
-
const origin = deriveOrigin(context);
|
|
126
|
-
const originChannel = readLowerString(origin.channel);
|
|
127
|
-
const originSender = readString(origin.senderId);
|
|
128
|
-
let nextChannel = explicitChannel;
|
|
129
|
-
let nextTo = explicitTo;
|
|
130
|
-
let nextScope = explicitScope;
|
|
131
|
-
if (!nextChannel && originChannel && CHANNELS_WITH_TARGET.has(originChannel)) {
|
|
132
|
-
nextChannel = originChannel;
|
|
133
|
-
}
|
|
134
|
-
if (!nextTo && nextChannel && nextChannel !== "last" && originSender) {
|
|
135
|
-
if (!originChannel || originChannel === nextChannel) {
|
|
136
|
-
nextTo = originSender;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// Avoid global scope collisions across users when tool calls omit scope.
|
|
140
|
-
if (!nextScope && nextChannel && nextTo) {
|
|
141
|
-
nextScope = `${sanitizeScopePart(nextChannel)}-${sanitizeScopePart(nextTo)}`;
|
|
142
|
-
}
|
|
143
|
-
if (nextChannel === explicitChannel && nextTo === explicitTo && nextScope === explicitScope) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
params: {
|
|
148
|
-
...params,
|
|
149
|
-
...(nextChannel ? { channel: nextChannel } : {}),
|
|
150
|
-
...(nextTo ? { to: nextTo } : {}),
|
|
151
|
-
...(nextScope ? { scope: nextScope } : {}),
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=scientify-cron-autofill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scientify-cron-autofill.js","sourceRoot":"","sources":["../../../src/hooks/scientify-cron-autofill.ts"],"names":[],"mappings":"AAYA,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,UAAU;IACV,UAAU;IACV,SAAS;IACT,KAAK;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,OAAO;IACP,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,QAAQ;IACR,aAAa;IACb,MAAM;IACN,MAAM;IACN,UAAU;IACV,eAAe;IACf,MAAM;CACP,CAAC,CAAC;AAOH,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,qDAAqD;IACrD,kEAAkE;IAClE,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,KAAe,EAAE,KAAa;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAmB;IAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,8CAA8C;IAC9C,0DAA0D;IAC1D,6CAA6C;IAC7C,oCAAoC;IACpC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAEtE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAEtC,kCAAkC;IAClC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,OAA8B;IAClD,MAAM,WAAW,GAAW;QAC1B,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;QACzC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;KACvC,CAAC;IAEF,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO;QACnD,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,KAAK;SAClB,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,CACL,KAA0B,EAC1B,OAA8B,EACc,EAAE;QAC9C,IAAI,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YAAE,OAAO;QAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO;QAEhC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO;QAEvC,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjD,IAAI,WAAW,GAAG,eAAe,CAAC;QAClC,IAAI,MAAM,GAAG,UAAU,CAAC;QACxB,IAAI,SAAS,GAAG,aAAa,CAAC;QAE9B,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7E,WAAW,GAAG,aAAa,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,WAAW,IAAI,WAAW,KAAK,MAAM,IAAI,YAAY,EAAE,CAAC;YACrE,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;gBACpD,MAAM,GAAG,YAAY,CAAC;YACxB,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,CAAC,SAAS,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YACxC,SAAS,GAAG,GAAG,iBAAiB,CAAC,WAAW,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/E,CAAC;QAED,IAAI,WAAW,KAAK,eAAe,IAAI,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAC5F,OAAO;QACT,CAAC;QAED,OAAO;YACL,MAAM,EAAE;gBACN,GAAG,MAAM;gBACT,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3C;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
type BaseHookContext = Record<string, unknown> & {
|
|
2
|
-
sessionKey?: string;
|
|
3
|
-
agentId?: string;
|
|
4
|
-
};
|
|
5
|
-
type BeforeToolCallEvent = {
|
|
6
|
-
toolName: string;
|
|
7
|
-
params?: Record<string, unknown>;
|
|
8
|
-
};
|
|
9
|
-
type BeforePromptBuildEvent = {
|
|
10
|
-
prompt?: string;
|
|
11
|
-
messages?: unknown[];
|
|
12
|
-
};
|
|
13
|
-
type PromptHookResult = {
|
|
14
|
-
prependContext?: string;
|
|
15
|
-
};
|
|
16
|
-
export declare function createScientifyUsageTrackerHook(): (event: BeforeToolCallEvent, context: BaseHookContext) => void;
|
|
17
|
-
export declare function createScientifyMessageTrackerHook(): (event: unknown, context: BaseHookContext) => void;
|
|
18
|
-
export declare function createScientifySignaturePromptHook(): (event: BeforePromptBuildEvent, context: BaseHookContext) => PromptHookResult | void;
|
|
19
|
-
export declare function createScientifyUsageCleanupHook(): (event: unknown, context: BaseHookContext) => void;
|
|
20
|
-
export {};
|
|
21
|
-
//# sourceMappingURL=scientify-signature.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scientify-signature.d.ts","sourceRoot":"","sources":["../../../src/hooks/scientify-signature.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAgGF,wBAAgB,+BAA+B,KACrC,OAAO,mBAAmB,EAAE,SAAS,eAAe,KAAG,IAAI,CAKpE;AAED,wBAAgB,iCAAiC,KACvC,OAAO,OAAO,EAAE,SAAS,eAAe,KAAG,IAAI,CAmBxD;AAED,wBAAgB,kCAAkC,KACxC,OAAO,sBAAsB,EAAE,SAAS,eAAe,KAAG,gBAAgB,GAAG,IAAI,CAoB1F;AAED,wBAAgB,+BAA+B,KACrC,OAAO,OAAO,EAAE,SAAS,eAAe,KAAG,IAAI,CAKxD"}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
const SCIENTIFY_TOOLS = new Set([
|
|
2
|
-
"arxiv_search",
|
|
3
|
-
"arxiv_download",
|
|
4
|
-
"github_search",
|
|
5
|
-
"paper_browser",
|
|
6
|
-
"openalex_search",
|
|
7
|
-
"unpaywall_download",
|
|
8
|
-
"scientify_cron_job",
|
|
9
|
-
"scientify_literature_state",
|
|
10
|
-
]);
|
|
11
|
-
const SCIENTIFY_SKILLS = new Set([
|
|
12
|
-
"idea-generation",
|
|
13
|
-
"research-pipeline",
|
|
14
|
-
"research-survey",
|
|
15
|
-
"research-plan",
|
|
16
|
-
"research-implement",
|
|
17
|
-
"research-review",
|
|
18
|
-
"research-experiment",
|
|
19
|
-
"literature-survey",
|
|
20
|
-
"write-review-paper",
|
|
21
|
-
"research-subscription",
|
|
22
|
-
]);
|
|
23
|
-
const SCIENTIFY_SKILL_COMMAND_RE = /(?:^|\s)\/(idea-generation|research-pipeline|research-survey|research-plan|research-implement|research-review|research-experiment|literature-survey|write-review-paper|research-subscription)(?:\s|$)/i;
|
|
24
|
-
const SIGNATURE_PROMPT = `[Scientify Signature]
|
|
25
|
-
If this response is based on Scientify workflow execution (Scientify skills/tools), append this exact footer at the end of your reply:
|
|
26
|
-
---
|
|
27
|
-
🐍Scientify
|
|
28
|
-
Do not add any text after the footer.`;
|
|
29
|
-
// Track sessions that actually used Scientify workflow elements.
|
|
30
|
-
const scientifyActiveSessions = new Set();
|
|
31
|
-
function getTrackingKey(event, context) {
|
|
32
|
-
if (context.sessionKey)
|
|
33
|
-
return context.sessionKey;
|
|
34
|
-
if (context.agentId)
|
|
35
|
-
return context.agentId;
|
|
36
|
-
if (event && typeof event === "object") {
|
|
37
|
-
const record = event;
|
|
38
|
-
if (typeof record.sessionKey === "string")
|
|
39
|
-
return record.sessionKey;
|
|
40
|
-
if (typeof record.agentId === "string")
|
|
41
|
-
return record.agentId;
|
|
42
|
-
}
|
|
43
|
-
return undefined;
|
|
44
|
-
}
|
|
45
|
-
function readSkillFromTask(task) {
|
|
46
|
-
if (typeof task !== "string")
|
|
47
|
-
return undefined;
|
|
48
|
-
const match = task.match(/^\/([a-z][\w-]*)/);
|
|
49
|
-
return match?.[1];
|
|
50
|
-
}
|
|
51
|
-
function extractText(value) {
|
|
52
|
-
if (typeof value === "string")
|
|
53
|
-
return value;
|
|
54
|
-
if (Array.isArray(value)) {
|
|
55
|
-
return value
|
|
56
|
-
.map((item) => extractText(item))
|
|
57
|
-
.filter((part) => part.length > 0)
|
|
58
|
-
.join("\n");
|
|
59
|
-
}
|
|
60
|
-
if (value && typeof value === "object") {
|
|
61
|
-
const record = value;
|
|
62
|
-
if (typeof record.text === "string")
|
|
63
|
-
return record.text;
|
|
64
|
-
if (typeof record.content === "string")
|
|
65
|
-
return record.content;
|
|
66
|
-
}
|
|
67
|
-
return "";
|
|
68
|
-
}
|
|
69
|
-
function extractLastUserMessageText(messages) {
|
|
70
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
71
|
-
const item = messages[i];
|
|
72
|
-
if (!item || typeof item !== "object")
|
|
73
|
-
continue;
|
|
74
|
-
const record = item;
|
|
75
|
-
const role = typeof record.role === "string" ? record.role.toLowerCase() : "";
|
|
76
|
-
if (role !== "user")
|
|
77
|
-
continue;
|
|
78
|
-
return extractText(record.content);
|
|
79
|
-
}
|
|
80
|
-
return "";
|
|
81
|
-
}
|
|
82
|
-
function markScientifyUsageFromToolCall(event, trackingKey) {
|
|
83
|
-
if (SCIENTIFY_TOOLS.has(event.toolName)) {
|
|
84
|
-
scientifyActiveSessions.add(trackingKey);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (event.toolName !== "sessions_spawn")
|
|
88
|
-
return;
|
|
89
|
-
const skill = readSkillFromTask(event.params?.task);
|
|
90
|
-
if (skill && SCIENTIFY_SKILLS.has(skill)) {
|
|
91
|
-
scientifyActiveSessions.add(trackingKey);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
export function createScientifyUsageTrackerHook() {
|
|
95
|
-
return (event, context) => {
|
|
96
|
-
const trackingKey = getTrackingKey(event, context);
|
|
97
|
-
if (!trackingKey)
|
|
98
|
-
return;
|
|
99
|
-
markScientifyUsageFromToolCall(event, trackingKey);
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
export function createScientifyMessageTrackerHook() {
|
|
103
|
-
return (event, context) => {
|
|
104
|
-
const trackingKey = getTrackingKey(event, context);
|
|
105
|
-
if (!trackingKey)
|
|
106
|
-
return;
|
|
107
|
-
if (!event || typeof event !== "object")
|
|
108
|
-
return;
|
|
109
|
-
const record = event;
|
|
110
|
-
const text = [
|
|
111
|
-
extractText(record.text),
|
|
112
|
-
extractText(record.content),
|
|
113
|
-
extractText(record.commandBody),
|
|
114
|
-
extractText(record.message),
|
|
115
|
-
]
|
|
116
|
-
.filter((part) => part.length > 0)
|
|
117
|
-
.join("\n");
|
|
118
|
-
if (SCIENTIFY_SKILL_COMMAND_RE.test(text)) {
|
|
119
|
-
scientifyActiveSessions.add(trackingKey);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
export function createScientifySignaturePromptHook() {
|
|
124
|
-
return (event, context) => {
|
|
125
|
-
const trackingKey = getTrackingKey(event, context);
|
|
126
|
-
if (trackingKey && scientifyActiveSessions.has(trackingKey)) {
|
|
127
|
-
return { prependContext: SIGNATURE_PROMPT };
|
|
128
|
-
}
|
|
129
|
-
// Heuristic fallback: user explicitly invoked a Scientify skill command.
|
|
130
|
-
const promptText = typeof event.prompt === "string" ? event.prompt : "";
|
|
131
|
-
const lastUserText = Array.isArray(event.messages) ? extractLastUserMessageText(event.messages) : "";
|
|
132
|
-
const combined = `${promptText}\n${lastUserText}`;
|
|
133
|
-
if (SCIENTIFY_SKILL_COMMAND_RE.test(combined)) {
|
|
134
|
-
if (trackingKey) {
|
|
135
|
-
scientifyActiveSessions.add(trackingKey);
|
|
136
|
-
}
|
|
137
|
-
return { prependContext: SIGNATURE_PROMPT };
|
|
138
|
-
}
|
|
139
|
-
return;
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
export function createScientifyUsageCleanupHook() {
|
|
143
|
-
return (event, context) => {
|
|
144
|
-
const trackingKey = getTrackingKey(event, context);
|
|
145
|
-
if (!trackingKey)
|
|
146
|
-
return;
|
|
147
|
-
scientifyActiveSessions.delete(trackingKey);
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=scientify-signature.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scientify-signature.js","sourceRoot":"","sources":["../../../src/hooks/scientify-signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type ProjectContext = {
|
|
2
|
-
projectId: string;
|
|
3
|
-
projectPath: string;
|
|
4
|
-
created: boolean;
|
|
5
|
-
};
|
|
6
|
-
export declare function resolveProjectContext(args: {
|
|
7
|
-
projectId?: string;
|
|
8
|
-
scope: string;
|
|
9
|
-
topic: string;
|
|
10
|
-
autoCreate?: boolean;
|
|
11
|
-
}): Promise<ProjectContext>;
|
|
12
|
-
export declare function getProjectRootPath(): string;
|
|
13
|
-
//# sourceMappingURL=project.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/knowledge-state/project.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AA4FF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|