scientify 2.1.0 → 3.1.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.
Files changed (186) hide show
  1. package/README.en.md +21 -1
  2. package/README.md +27 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -77
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/cli/research.d.ts.map +1 -1
  7. package/dist/src/cli/research.js +47 -23
  8. package/dist/src/cli/research.js.map +1 -1
  9. package/dist/src/commands/metabolism-status.d.ts.map +1 -1
  10. package/dist/src/commands/metabolism-status.js +5 -25
  11. package/dist/src/commands/metabolism-status.js.map +1 -1
  12. package/dist/src/commands.d.ts +8 -8
  13. package/dist/src/commands.d.ts.map +1 -1
  14. package/dist/src/commands.js +230 -243
  15. package/dist/src/commands.js.map +1 -1
  16. package/dist/src/release-gate.d.ts +14 -0
  17. package/dist/src/release-gate.d.ts.map +1 -0
  18. package/dist/src/release-gate.js +124 -0
  19. package/dist/src/release-gate.js.map +1 -0
  20. package/dist/src/templates/bootstrap.d.ts.map +1 -1
  21. package/dist/src/templates/bootstrap.js +157 -94
  22. package/dist/src/templates/bootstrap.js.map +1 -1
  23. package/dist/src/types.d.ts +2 -10
  24. package/dist/src/types.d.ts.map +1 -1
  25. package/openclaw.plugin.json +11 -17
  26. package/package.json +2 -3
  27. package/skills/algorithm-selection/SKILL.md +103 -0
  28. package/skills/algorithm-selection/references/candidate-template.md +13 -0
  29. package/skills/algorithm-selection/references/selection-template.md +39 -0
  30. package/skills/artifact-review/SKILL.md +146 -0
  31. package/skills/artifact-review/references/release-gate-template.md +40 -0
  32. package/skills/artifact-review/references/review-checklist.md +45 -0
  33. package/skills/artifact-review/references/style-review-checklist.md +30 -0
  34. package/skills/baseline-runner/SKILL.md +103 -0
  35. package/skills/baseline-runner/references/baseline-matrix-template.md +9 -0
  36. package/skills/baseline-runner/references/baseline-report-template.md +25 -0
  37. package/skills/dataset-validate/SKILL.md +104 -0
  38. package/skills/dataset-validate/references/data-validation-template.md +38 -0
  39. package/skills/figure-standardize/SKILL.md +110 -0
  40. package/skills/figure-standardize/references/caption-template.md +12 -0
  41. package/skills/figure-standardize/references/figure-placement-template.md +30 -0
  42. package/skills/figure-standardize/references/figure-style-guide.md +36 -0
  43. package/skills/idea-generation/SKILL.md +20 -44
  44. package/skills/idea-generation/references/code-mapping.md +3 -3
  45. package/skills/idea-generation/references/idea-template.md +1 -1
  46. package/skills/idea-generation/references/reading-long-papers.md +3 -3
  47. package/skills/metabolism/SKILL.md +80 -36
  48. package/skills/paper-download/SKILL.md +61 -0
  49. package/skills/release-layout/SKILL.md +73 -0
  50. package/skills/release-layout/references/page-structure.md +14 -0
  51. package/skills/research-collect/SKILL.md +41 -111
  52. package/skills/research-experiment/SKILL.md +20 -12
  53. package/skills/research-implement/SKILL.md +10 -11
  54. package/skills/research-pipeline/SKILL.md +23 -31
  55. package/skills/research-plan/SKILL.md +7 -11
  56. package/skills/research-review/SKILL.md +21 -22
  57. package/skills/research-survey/SKILL.md +28 -25
  58. package/skills/write-paper/SKILL.md +252 -0
  59. package/skills/write-paper/references/boundary-notes-template.md +34 -0
  60. package/skills/write-paper/references/claim-inventory-template.md +32 -0
  61. package/skills/write-paper/references/evidence-contract.md +57 -0
  62. package/skills/write-paper/references/figure-callout-template.md +38 -0
  63. package/skills/write-paper/references/figures-manifest-template.md +44 -0
  64. package/skills/write-paper/references/latex/README.md +22 -0
  65. package/skills/write-paper/references/latex/build_paper.sh +41 -0
  66. package/skills/write-paper/references/latex/manuscript.tex +39 -0
  67. package/skills/write-paper/references/latex/references.bib +10 -0
  68. package/skills/write-paper/references/latex/sections/ablations.tex +3 -0
  69. package/skills/write-paper/references/latex/sections/abstract.tex +3 -0
  70. package/skills/write-paper/references/latex/sections/conclusion.tex +3 -0
  71. package/skills/write-paper/references/latex/sections/discussion_scope.tex +7 -0
  72. package/skills/write-paper/references/latex/sections/experimental_protocol.tex +3 -0
  73. package/skills/write-paper/references/latex/sections/introduction.tex +3 -0
  74. package/skills/write-paper/references/latex/sections/main_results.tex +9 -0
  75. package/skills/write-paper/references/latex/sections/method_system.tex +3 -0
  76. package/skills/write-paper/references/latex/sections/problem_setup.tex +3 -0
  77. package/skills/write-paper/references/latex/sections/related_work.tex +3 -0
  78. package/skills/write-paper/references/paper-template.md +155 -0
  79. package/skills/write-paper/references/paragraph-contract.md +139 -0
  80. package/skills/write-paper/references/paragraph-examples.md +171 -0
  81. package/skills/write-paper/references/style-banlist.md +81 -0
  82. package/skills/write-review-paper/SKILL.md +22 -16
  83. package/skills/write-review-paper/references/note-template.md +1 -1
  84. package/skills/write-review-paper/references/survey-template.md +1 -1
  85. package/dist/src/hooks/research-mode.d.ts +0 -22
  86. package/dist/src/hooks/research-mode.d.ts.map +0 -1
  87. package/dist/src/hooks/research-mode.js +0 -35
  88. package/dist/src/hooks/research-mode.js.map +0 -1
  89. package/dist/src/hooks/scientify-cron-autofill.d.ts +0 -15
  90. package/dist/src/hooks/scientify-cron-autofill.d.ts.map +0 -1
  91. package/dist/src/hooks/scientify-cron-autofill.js +0 -156
  92. package/dist/src/hooks/scientify-cron-autofill.js.map +0 -1
  93. package/dist/src/hooks/scientify-signature.d.ts +0 -21
  94. package/dist/src/hooks/scientify-signature.d.ts.map +0 -1
  95. package/dist/src/hooks/scientify-signature.js +0 -150
  96. package/dist/src/hooks/scientify-signature.js.map +0 -1
  97. package/dist/src/knowledge-state/project.d.ts +0 -13
  98. package/dist/src/knowledge-state/project.d.ts.map +0 -1
  99. package/dist/src/knowledge-state/project.js +0 -88
  100. package/dist/src/knowledge-state/project.js.map +0 -1
  101. package/dist/src/knowledge-state/render.d.ts +0 -63
  102. package/dist/src/knowledge-state/render.d.ts.map +0 -1
  103. package/dist/src/knowledge-state/render.js +0 -368
  104. package/dist/src/knowledge-state/render.js.map +0 -1
  105. package/dist/src/knowledge-state/store.d.ts +0 -19
  106. package/dist/src/knowledge-state/store.d.ts.map +0 -1
  107. package/dist/src/knowledge-state/store.js +0 -978
  108. package/dist/src/knowledge-state/store.js.map +0 -1
  109. package/dist/src/knowledge-state/types.d.ts +0 -182
  110. package/dist/src/knowledge-state/types.d.ts.map +0 -1
  111. package/dist/src/knowledge-state/types.js +0 -2
  112. package/dist/src/knowledge-state/types.js.map +0 -1
  113. package/dist/src/literature/subscription-state.d.ts +0 -112
  114. package/dist/src/literature/subscription-state.d.ts.map +0 -1
  115. package/dist/src/literature/subscription-state.js +0 -696
  116. package/dist/src/literature/subscription-state.js.map +0 -1
  117. package/dist/src/research-subscriptions/constants.d.ts +0 -16
  118. package/dist/src/research-subscriptions/constants.d.ts.map +0 -1
  119. package/dist/src/research-subscriptions/constants.js +0 -59
  120. package/dist/src/research-subscriptions/constants.js.map +0 -1
  121. package/dist/src/research-subscriptions/cron-client.d.ts +0 -8
  122. package/dist/src/research-subscriptions/cron-client.d.ts.map +0 -1
  123. package/dist/src/research-subscriptions/cron-client.js +0 -81
  124. package/dist/src/research-subscriptions/cron-client.js.map +0 -1
  125. package/dist/src/research-subscriptions/delivery.d.ts +0 -10
  126. package/dist/src/research-subscriptions/delivery.d.ts.map +0 -1
  127. package/dist/src/research-subscriptions/delivery.js +0 -82
  128. package/dist/src/research-subscriptions/delivery.js.map +0 -1
  129. package/dist/src/research-subscriptions/handlers.d.ts +0 -6
  130. package/dist/src/research-subscriptions/handlers.d.ts.map +0 -1
  131. package/dist/src/research-subscriptions/handlers.js +0 -204
  132. package/dist/src/research-subscriptions/handlers.js.map +0 -1
  133. package/dist/src/research-subscriptions/parse.d.ts +0 -11
  134. package/dist/src/research-subscriptions/parse.d.ts.map +0 -1
  135. package/dist/src/research-subscriptions/parse.js +0 -492
  136. package/dist/src/research-subscriptions/parse.js.map +0 -1
  137. package/dist/src/research-subscriptions/prompt.d.ts +0 -5
  138. package/dist/src/research-subscriptions/prompt.d.ts.map +0 -1
  139. package/dist/src/research-subscriptions/prompt.js +0 -347
  140. package/dist/src/research-subscriptions/prompt.js.map +0 -1
  141. package/dist/src/research-subscriptions/types.d.ts +0 -66
  142. package/dist/src/research-subscriptions/types.d.ts.map +0 -1
  143. package/dist/src/research-subscriptions/types.js +0 -2
  144. package/dist/src/research-subscriptions/types.js.map +0 -1
  145. package/dist/src/research-subscriptions.d.ts +0 -2
  146. package/dist/src/research-subscriptions.d.ts.map +0 -1
  147. package/dist/src/research-subscriptions.js +0 -2
  148. package/dist/src/research-subscriptions.js.map +0 -1
  149. package/dist/src/services/auto-updater.d.ts +0 -15
  150. package/dist/src/services/auto-updater.d.ts.map +0 -1
  151. package/dist/src/services/auto-updater.js +0 -188
  152. package/dist/src/services/auto-updater.js.map +0 -1
  153. package/dist/src/tools/arxiv-download.d.ts +0 -24
  154. package/dist/src/tools/arxiv-download.d.ts.map +0 -1
  155. package/dist/src/tools/arxiv-download.js +0 -177
  156. package/dist/src/tools/arxiv-download.js.map +0 -1
  157. package/dist/src/tools/github-search-tool.d.ts +0 -25
  158. package/dist/src/tools/github-search-tool.d.ts.map +0 -1
  159. package/dist/src/tools/github-search-tool.js +0 -114
  160. package/dist/src/tools/github-search-tool.js.map +0 -1
  161. package/dist/src/tools/openreview-lookup.d.ts +0 -31
  162. package/dist/src/tools/openreview-lookup.d.ts.map +0 -1
  163. package/dist/src/tools/openreview-lookup.js +0 -414
  164. package/dist/src/tools/openreview-lookup.js.map +0 -1
  165. package/dist/src/tools/paper-browser.d.ts +0 -23
  166. package/dist/src/tools/paper-browser.d.ts.map +0 -1
  167. package/dist/src/tools/paper-browser.js +0 -121
  168. package/dist/src/tools/paper-browser.js.map +0 -1
  169. package/dist/src/tools/scientify-cron.d.ts +0 -63
  170. package/dist/src/tools/scientify-cron.d.ts.map +0 -1
  171. package/dist/src/tools/scientify-cron.js +0 -265
  172. package/dist/src/tools/scientify-cron.js.map +0 -1
  173. package/dist/src/tools/scientify-literature-state.d.ts +0 -303
  174. package/dist/src/tools/scientify-literature-state.d.ts.map +0 -1
  175. package/dist/src/tools/scientify-literature-state.js +0 -957
  176. package/dist/src/tools/scientify-literature-state.js.map +0 -1
  177. package/dist/src/tools/unpaywall-download.d.ts +0 -21
  178. package/dist/src/tools/unpaywall-download.d.ts.map +0 -1
  179. package/dist/src/tools/unpaywall-download.js +0 -169
  180. package/dist/src/tools/unpaywall-download.js.map +0 -1
  181. package/dist/src/tools/workspace.d.ts +0 -32
  182. package/dist/src/tools/workspace.d.ts.map +0 -1
  183. package/dist/src/tools/workspace.js +0 -69
  184. package/dist/src/tools/workspace.js.map +0 -1
  185. package/skills/metabolism-init/SKILL.md +0 -80
  186. package/skills/research-subscription/SKILL.md +0 -119
@@ -0,0 +1,81 @@
1
+ # Style Banlist
2
+
3
+ This is not a universal forbidden-word list.
4
+
5
+ Use it as a risk map: the higher the claim pressure, the more these words need explicit support nearby.
6
+
7
+ ## High-Risk Praise Words
8
+
9
+ These often create fake confidence when they are not tied to evidence in the same sentence or the next sentence:
10
+
11
+ - `significant`
12
+ - `substantial`
13
+ - `strong`
14
+ - `robust`
15
+ - `effective`
16
+ - `promising`
17
+ - `remarkable`
18
+ - `novel`
19
+ - `comprehensive`
20
+ - `state-of-the-art`
21
+
22
+ ## High-Risk Hedge Words
23
+
24
+ These are useful for interpretation, but risky when they blur what is actually observed:
25
+
26
+ - `may`
27
+ - `can`
28
+ - `could`
29
+ - `potentially`
30
+ - `suggests`
31
+ - `appears to`
32
+ - `likely`
33
+ - `in general`
34
+ - `overall`
35
+
36
+ ## Vague Result Phrases
37
+
38
+ These usually need to be rewritten into metric- or evidence-based language:
39
+
40
+ - `shows advantages`
41
+ - `performs well`
42
+ - `works effectively`
43
+ - `achieves competitive results`
44
+ - `delivers better performance`
45
+ - `improves overall quality`
46
+ - `demonstrates robustness`
47
+ - `has broad applicability`
48
+
49
+ ## Rewrite Moves
50
+
51
+ When a sentence sounds too soft, too grand, or too vague, prefer one of these moves:
52
+
53
+ - add a metric
54
+ - add a baseline
55
+ - add a protocol or guardrail
56
+ - add a source anchor such as `claim_id`, figure, or table
57
+ - add a scope or evidence boundary
58
+ - split observation from interpretation
59
+
60
+ Examples:
61
+
62
+ - `strong improvement` -> `17.53% mean TTFT gain vs INT4-FIFO`
63
+ - `robust behavior` -> `maintains quality_penalty_mean <= 0.02 under the stated protocol`
64
+ - `promising result` -> `improves bytes/request under simulator evaluation, but lacks runtime validation`
65
+
66
+ ## Usage Rules
67
+
68
+ - If one of the high-risk praise words appears in a result sentence, the same sentence or the next sentence should also contain a metric, baseline, or explicit evidence anchor.
69
+ - Hedge words are acceptable when they clearly mark interpretation, uncertainty, or future-facing reasoning.
70
+ - Do not use hedge words to hide whether a result is actually observed or merely inferred.
71
+ - If a sentence can be made more precise by adding a number, comparison target, or boundary, do that instead of adding emphasis.
72
+
73
+ ## Surface-Aware Notes
74
+
75
+ Different writing surfaces tolerate different kinds of language:
76
+
77
+ - high-pressure surfaces such as abstracts, headline result sentences, captions, and opening-page summaries need the strictest wording
78
+ - medium-pressure surfaces such as result discussion and comparison paragraphs can carry some interpretation, but still need explicit evidence anchors
79
+ - lower-pressure surfaces such as discussion, scope notes, and future-work paragraphs can use more hedging, as long as they do not rewrite observed results into broader claims
80
+
81
+ The key question is not “what section am I in?” but “how much claim pressure does this sentence carry?”
@@ -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
- **Workspace:** `$W` = working directory provided in task parameter. Outputs go to `$W/review/`.
19
+ Outputs go to `review/`.
20
20
 
21
21
  ## Prerequisites
22
22
 
23
23
  Before starting, ensure you have:
24
- 1. Papers collected in `$W/papers/`
25
- 2. Ideally, clustering done by `/research-collect` in `$W/survey/clusters.json`
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 $W/papers/
30
- ls $W/survey/ 2>/dev/null
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 `$W/review/reading_plan.md`:
47
+ Create `review/reading_plan.md`:
48
48
 
49
49
  ```markdown
50
50
  # Reading Plan
@@ -60,9 +60,11 @@ Create `$W/review/reading_plan.md`:
60
60
  - [ ] ...
61
61
  ```
62
62
 
63
+ Every entry must keep `paper_id` and the selection reason. Do not write a reading plan that only lists titles.
64
+
63
65
  ### 1.2 Reading Notes Template
64
66
 
65
- For each paper, create `$W/review/notes/{paper_id}.md` using template in `references/note-template.md`.
67
+ For each paper, create `review/notes/{paper_id}.md` using template in `references/note-template.md`.
66
68
 
67
69
  ---
68
70
 
@@ -70,20 +72,20 @@ For each paper, create `$W/review/notes/{paper_id}.md` using template in `refere
70
72
 
71
73
  ### 2.1 Build Comparison Table
72
74
 
73
- Create `$W/review/comparison.md`:
75
+ Create `review/comparison.md`:
74
76
 
75
77
  ```markdown
76
78
  # Method Comparison
77
79
 
78
- | Paper | Year | Category | Key Innovation | Dataset | Metric | Result |
79
- |-------|------|----------|----------------|---------|--------|--------|
80
- | [A] | 2023 | Data-driven | ... | ... | RMSE | 0.05 |
81
- | [B] | 2022 | Hybrid | ... | ... | RMSE | 0.08 |
80
+ | Paper | Year | Category | Key Innovation | Dataset | Metric | Result | Evidence / Source |
81
+ |-------|------|----------|----------------|---------|--------|--------|-------------------|
82
+ | [A] | 2023 | Data-driven | ... | ... | RMSE | 0.05 | `review/notes/{paper_id}.md` |
83
+ | [B] | 2022 | Hybrid | ... | ... | RMSE | 0.08 | `review/notes/{paper_id}.md` |
82
84
  ```
83
85
 
84
86
  ### 2.2 Timeline Analysis
85
87
 
86
- Create `$W/review/timeline.md`:
88
+ Create `review/timeline.md`:
87
89
 
88
90
  ```markdown
89
91
  # Research Timeline
@@ -106,7 +108,7 @@ Create `$W/review/timeline.md`:
106
108
 
107
109
  ### 2.3 Taxonomy Design
108
110
 
109
- Create `$W/review/taxonomy.md`:
111
+ Create `review/taxonomy.md`:
110
112
 
111
113
  ```markdown
112
114
  # Taxonomy of Approaches
@@ -140,10 +142,12 @@ Create `$W/review/taxonomy.md`:
140
142
 
141
143
  ### 3.1 Survey Paper Template
142
144
 
143
- Create `$W/review/draft.md` using template in `references/survey-template.md`.
145
+ Create `review/draft.md` using template in `references/survey-template.md`.
144
146
 
145
147
  Key sections: Abstract → Introduction → Background → Taxonomy → Comparison → Datasets → Future Directions → Conclusion
146
148
 
149
+ At the end of each major section, add one short summary sentence that clearly reflects the evidence already written in `review/notes/` or `review/comparison.md`.
150
+
147
151
  ### 3.2 Thesis Literature Review Template
148
152
 
149
153
  For a thesis chapter:
@@ -192,13 +196,15 @@ For a thesis chapter:
192
196
  3. **时态混乱** - 描述方法用现在时,描述实验结果用过去时
193
197
  4. **过度引用** - 不是每句话都需要引用
194
198
  5. **遗漏重要工作** - 确保覆盖领域的奠基性工作
199
+ 6. **Body text detached from notes** - Do not write conclusions into the draft unless they already appear in notes / comparison
200
+ 7. **Trend written as certainty** - When evidence is not stable, frame it as an observation or discussion rather than a firm conclusion
195
201
 
196
202
  ---
197
203
 
198
204
  ## Output Files
199
205
 
200
206
  ```
201
- $W/review/
207
+ review/
202
208
  ├── reading_plan.md # 阅读计划
203
209
  ├── notes/ # 阅读笔记
204
210
  │ ├── {paper_id}.md
@@ -1,6 +1,6 @@
1
1
  # Paper Note Template
2
2
 
3
- Use this template for each paper in `~/.openclaw/workspace/literature/notes/`.
3
+ Use this template for each paper in `knowledge/`.
4
4
 
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Survey Paper Template
2
2
 
3
- Use this template for `$WORKSPACE/review/draft.md`:
3
+ Use this template for `review/draft.md`:
4
4
 
5
5
  ```markdown
6
6
  # [Survey Title]: A Comprehensive Review
@@ -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":"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"}
@@ -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":"AAmBA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,4BAA4B;CAC7B,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,iBAAiB;IACjB,mBAAmB;IACnB,iBAAiB;IACjB,eAAe;IACf,oBAAoB;IACpB,iBAAiB;IACjB,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,uBAAuB;CACxB,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAC9B,wMAAwM,CAAC;AAE3M,MAAM,gBAAgB,GAAG;;;;sCAIa,CAAC;AAEvC,iEAAiE;AACjE,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAU,CAAC;AAElD,SAAS,cAAc,CAAC,KAAc,EAAE,OAAwB;IAC9D,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC;IAClD,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAC5C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC;QACpE,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC7C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;aAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QACxD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAmB;IACrD,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS;QAC9B,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,8BAA8B,CAAC,KAA0B,EAAE,WAAmB;IACrF,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB;QAAE,OAAO;IAChD,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,CAAC,KAA0B,EAAE,OAAwB,EAAQ,EAAE;QACpE,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,8BAA8B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,CAAC,KAAc,EAAE,OAAwB,EAAQ,EAAE;QACxD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QAChD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAAG;YACX,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;YACxB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3B,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;YAC/B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;SAC5B;aACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,OAAO,CAAC,KAA6B,EAAE,OAAwB,EAA2B,EAAE;QAC1F,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,WAAW,IAAI,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;QAC9C,CAAC;QAED,yEAAyE;QACzE,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,QAAQ,GAAG,GAAG,UAAU,KAAK,YAAY,EAAE,CAAC;QAClD,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,IAAI,WAAW,EAAE,CAAC;gBAChB,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC;QAC9C,CAAC;QAED,OAAO;IACT,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,CAAC,KAAc,EAAE,OAAwB,EAAQ,EAAE;QACxD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC"}