@redigg/redigg 0.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.
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/dist/agent/ResearchAgent.d.ts +35 -0
- package/dist/agent/ResearchAgent.js +818 -0
- package/dist/agent/ResearchAgent.js.map +1 -0
- package/dist/agent/subagent/SubAgent.d.ts +23 -0
- package/dist/agent/subagent/SubAgent.js +87 -0
- package/dist/agent/subagent/SubAgent.js.map +1 -0
- package/dist/agent/subagent/SubAgentManager.d.ts +19 -0
- package/dist/agent/subagent/SubAgentManager.js +40 -0
- package/dist/agent/subagent/SubAgentManager.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +34 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +179 -0
- package/dist/cli.js.map +1 -0
- package/dist/events/EventManager.d.ts +39 -0
- package/dist/events/EventManager.js +20 -0
- package/dist/events/EventManager.js.map +1 -0
- package/dist/gateway/index.d.ts +9 -0
- package/dist/gateway/index.js +474 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/LLMClient.d.ts +30 -0
- package/dist/llm/LLMClient.js +21 -0
- package/dist/llm/LLMClient.js.map +1 -0
- package/dist/llm/OpenAIClient.d.ts +16 -0
- package/dist/llm/OpenAIClient.js +58 -0
- package/dist/llm/OpenAIClient.js.map +1 -0
- package/dist/memory/MemoryManager.d.ts +41 -0
- package/dist/memory/MemoryManager.js +221 -0
- package/dist/memory/MemoryManager.js.map +1 -0
- package/dist/memory/evolution/MemoryEvolutionSystem.d.ts +17 -0
- package/dist/memory/evolution/MemoryEvolutionSystem.js +71 -0
- package/dist/memory/evolution/MemoryEvolutionSystem.js.map +1 -0
- package/dist/memory/search/BM25Search.d.ts +22 -0
- package/dist/memory/search/BM25Search.js +61 -0
- package/dist/memory/search/BM25Search.js.map +1 -0
- package/dist/memory/structure/PageIndex.d.ts +26 -0
- package/dist/memory/structure/PageIndex.js +156 -0
- package/dist/memory/structure/PageIndex.js.map +1 -0
- package/dist/quality/QualityManager.d.ts +12 -0
- package/dist/quality/QualityManager.js +61 -0
- package/dist/quality/QualityManager.js.map +1 -0
- package/dist/scheduling/CronManager.d.ts +21 -0
- package/dist/scheduling/CronManager.js +66 -0
- package/dist/scheduling/CronManager.js.map +1 -0
- package/dist/session/SessionManager.d.ts +37 -0
- package/dist/session/SessionManager.js +238 -0
- package/dist/session/SessionManager.js.map +1 -0
- package/dist/skills/SkillManager.d.ts +31 -0
- package/dist/skills/SkillManager.js +254 -0
- package/dist/skills/SkillManager.js.map +1 -0
- package/dist/skills/agent/PACK.md +13 -0
- package/dist/skills/agent/agent-orchestration/SKILL.md +37 -0
- package/dist/skills/agent/agent-orchestration/index.d.ts +9 -0
- package/dist/skills/agent/agent-orchestration/index.js +70 -0
- package/dist/skills/agent/agent-orchestration/index.js.map +1 -0
- package/dist/skills/agent/evolution/SKILL.md +25 -0
- package/dist/skills/agent/evolution/index.d.ts +9 -0
- package/dist/skills/agent/evolution/index.js +57 -0
- package/dist/skills/agent/evolution/index.js.map +1 -0
- package/dist/skills/agent/heartbeat/index.d.ts +8 -0
- package/dist/skills/agent/heartbeat/index.js +44 -0
- package/dist/skills/agent/heartbeat/index.js.map +1 -0
- package/dist/skills/agent/memory-management/SKILL.md +40 -0
- package/dist/skills/agent/memory-management/index.d.ts +8 -0
- package/dist/skills/agent/memory-management/index.js +44 -0
- package/dist/skills/agent/memory-management/index.js.map +1 -0
- package/dist/skills/agent/scheduling/SKILL.md +33 -0
- package/dist/skills/agent/scheduling/index.d.ts +13 -0
- package/dist/skills/agent/scheduling/index.js +80 -0
- package/dist/skills/agent/scheduling/index.js.map +1 -0
- package/dist/skills/agent/session-management/SKILL.md +35 -0
- package/dist/skills/agent/session-management/index.d.ts +11 -0
- package/dist/skills/agent/session-management/index.js +54 -0
- package/dist/skills/agent/session-management/index.js.map +1 -0
- package/dist/skills/agent/skill-management/SKILL.md +31 -0
- package/dist/skills/agent/skill-management/index.d.ts +8 -0
- package/dist/skills/agent/skill-management/index.js +25 -0
- package/dist/skills/agent/skill-management/index.js.map +1 -0
- package/dist/skills/evolution/SkillEvolutionSystem.d.ts +12 -0
- package/dist/skills/evolution/SkillEvolutionSystem.js +157 -0
- package/dist/skills/evolution/SkillEvolutionSystem.js.map +1 -0
- package/dist/skills/lib/ScholarTool.d.ts +14 -0
- package/dist/skills/lib/ScholarTool.js +71 -0
- package/dist/skills/lib/ScholarTool.js.map +1 -0
- package/dist/skills/research/PACK.md +7 -0
- package/dist/skills/research/academic-survey-self-improve/SKILL.md +17 -0
- package/dist/skills/research/academic-survey-self-improve/index.d.ts +10 -0
- package/dist/skills/research/academic-survey-self-improve/index.js +75 -0
- package/dist/skills/research/academic-survey-self-improve/index.js.map +1 -0
- package/dist/skills/research/concept-explainer/SKILL.md +3 -0
- package/dist/skills/research/concept-explainer/index.d.ts +8 -0
- package/dist/skills/research/concept-explainer/index.js +37 -0
- package/dist/skills/research/concept-explainer/index.js.map +1 -0
- package/dist/skills/research/literature-review/SKILL.md +25 -0
- package/dist/skills/research/literature-review/index.d.ts +9 -0
- package/dist/skills/research/literature-review/index.js +132 -0
- package/dist/skills/research/literature-review/index.js.map +1 -0
- package/dist/skills/research/paper-analysis/SKILL.md +3 -0
- package/dist/skills/research/paper-analysis/index.d.ts +9 -0
- package/dist/skills/research/paper-analysis/index.js +64 -0
- package/dist/skills/research/paper-analysis/index.js.map +1 -0
- package/dist/skills/research/pdf-generator/SKILL.md +16 -0
- package/dist/skills/research/pdf-generator/index.d.ts +10 -0
- package/dist/skills/research/pdf-generator/index.js +88 -0
- package/dist/skills/research/pdf-generator/index.js.map +1 -0
- package/dist/skills/system/PACK.md +8 -0
- package/dist/skills/system/code-analysis/SKILL.md +43 -0
- package/dist/skills/system/code-analysis/index.d.ts +12 -0
- package/dist/skills/system/code-analysis/index.js +172 -0
- package/dist/skills/system/code-analysis/index.js.map +1 -0
- package/dist/skills/system/local-file-ops/SKILL.md +55 -0
- package/dist/skills/system/local-file-ops/index.d.ts +9 -0
- package/dist/skills/system/local-file-ops/index.js +111 -0
- package/dist/skills/system/local-file-ops/index.js.map +1 -0
- package/dist/skills/types.d.ts +41 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/vendor/PACK.md +11 -0
- package/dist/skills/vendor/agent-browser/CONTRIBUTING.md +63 -0
- package/dist/skills/vendor/agent-browser/SKILL.md +328 -0
- package/dist/skills/vendor/find-skills/SKILL.md +133 -0
- package/dist/skills/vendor/proactive-agent/SKILL-v2.3-backup.md +554 -0
- package/dist/skills/vendor/proactive-agent/SKILL-v3-draft.md +499 -0
- package/dist/skills/vendor/proactive-agent/SKILL.md +632 -0
- package/dist/skills/vendor/proactive-agent/assets/AGENTS.md +155 -0
- package/dist/skills/vendor/proactive-agent/assets/HEARTBEAT.md +128 -0
- package/dist/skills/vendor/proactive-agent/assets/MEMORY.md +47 -0
- package/dist/skills/vendor/proactive-agent/assets/ONBOARDING.md +103 -0
- package/dist/skills/vendor/proactive-agent/assets/SOUL.md +40 -0
- package/dist/skills/vendor/proactive-agent/assets/TOOLS.md +55 -0
- package/dist/skills/vendor/proactive-agent/assets/USER.md +36 -0
- package/dist/skills/vendor/proactive-agent/references/onboarding-flow.md +158 -0
- package/dist/skills/vendor/proactive-agent/references/security-patterns.md +109 -0
- package/dist/skills/vendor/searxng/CHANGELOG.md +38 -0
- package/dist/skills/vendor/searxng/PUBLISH.md +147 -0
- package/dist/skills/vendor/searxng/PUBLISHING_CHECKLIST.md +111 -0
- package/dist/skills/vendor/searxng/README.md +168 -0
- package/dist/skills/vendor/searxng/SKILL.md +69 -0
- package/dist/skills/vendor/self-improving-agent/.learnings/ERRORS.md +5 -0
- package/dist/skills/vendor/self-improving-agent/.learnings/FEATURE_REQUESTS.md +5 -0
- package/dist/skills/vendor/self-improving-agent/.learnings/LEARNINGS.md +5 -0
- package/dist/skills/vendor/self-improving-agent/SKILL.md +647 -0
- package/dist/skills/vendor/self-improving-agent/assets/LEARNINGS.md +45 -0
- package/dist/skills/vendor/self-improving-agent/assets/SKILL-TEMPLATE.md +177 -0
- package/dist/skills/vendor/self-improving-agent/hooks/openclaw/HOOK.md +23 -0
- package/dist/skills/vendor/self-improving-agent/hooks/openclaw/handler.d.ts +9 -0
- package/dist/skills/vendor/self-improving-agent/hooks/openclaw/handler.js +54 -0
- package/dist/skills/vendor/self-improving-agent/hooks/openclaw/handler.js.map +1 -0
- package/dist/skills/vendor/self-improving-agent/references/examples.md +374 -0
- package/dist/skills/vendor/self-improving-agent/references/hooks-setup.md +223 -0
- package/dist/skills/vendor/self-improving-agent/references/openclaw-integration.md +248 -0
- package/dist/skills/vendor/skill-vetter/SKILL.md +138 -0
- package/dist/src/agent/ResearchAgent.d.ts +35 -0
- package/dist/src/agent/ResearchAgent.js +818 -0
- package/dist/src/agent/ResearchAgent.js.map +1 -0
- package/dist/src/agent/subagent/SubAgent.d.ts +23 -0
- package/dist/src/agent/subagent/SubAgent.js +87 -0
- package/dist/src/agent/subagent/SubAgent.js.map +1 -0
- package/dist/src/agent/subagent/SubAgentManager.d.ts +19 -0
- package/dist/src/agent/subagent/SubAgentManager.js +40 -0
- package/dist/src/agent/subagent/SubAgentManager.js.map +1 -0
- package/dist/src/bin.d.ts +2 -0
- package/dist/src/bin.js +34 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +179 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/events/EventManager.d.ts +39 -0
- package/dist/src/events/EventManager.js +20 -0
- package/dist/src/events/EventManager.js.map +1 -0
- package/dist/src/gateway/index.d.ts +9 -0
- package/dist/src/gateway/index.js +474 -0
- package/dist/src/gateway/index.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +105 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/LLMClient.d.ts +30 -0
- package/dist/src/llm/LLMClient.js +21 -0
- package/dist/src/llm/LLMClient.js.map +1 -0
- package/dist/src/llm/OpenAIClient.d.ts +16 -0
- package/dist/src/llm/OpenAIClient.js +58 -0
- package/dist/src/llm/OpenAIClient.js.map +1 -0
- package/dist/src/memory/MemoryManager.d.ts +41 -0
- package/dist/src/memory/MemoryManager.js +221 -0
- package/dist/src/memory/MemoryManager.js.map +1 -0
- package/dist/src/memory/evolution/MemoryEvolutionSystem.d.ts +17 -0
- package/dist/src/memory/evolution/MemoryEvolutionSystem.js +71 -0
- package/dist/src/memory/evolution/MemoryEvolutionSystem.js.map +1 -0
- package/dist/src/memory/search/BM25Search.d.ts +22 -0
- package/dist/src/memory/search/BM25Search.js +61 -0
- package/dist/src/memory/search/BM25Search.js.map +1 -0
- package/dist/src/memory/structure/PageIndex.d.ts +26 -0
- package/dist/src/memory/structure/PageIndex.js +156 -0
- package/dist/src/memory/structure/PageIndex.js.map +1 -0
- package/dist/src/quality/QualityManager.d.ts +12 -0
- package/dist/src/quality/QualityManager.js +61 -0
- package/dist/src/quality/QualityManager.js.map +1 -0
- package/dist/src/scheduling/CronManager.d.ts +21 -0
- package/dist/src/scheduling/CronManager.js +66 -0
- package/dist/src/scheduling/CronManager.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +37 -0
- package/dist/src/session/SessionManager.js +238 -0
- package/dist/src/session/SessionManager.js.map +1 -0
- package/dist/src/skills/SkillManager.d.ts +33 -0
- package/dist/src/skills/SkillManager.js +260 -0
- package/dist/src/skills/SkillManager.js.map +1 -0
- package/dist/src/skills/evolution/SkillEvolutionSystem.d.ts +12 -0
- package/dist/src/skills/evolution/SkillEvolutionSystem.js +157 -0
- package/dist/src/skills/evolution/SkillEvolutionSystem.js.map +1 -0
- package/dist/src/skills/lib/ScholarTool.d.ts +14 -0
- package/dist/src/skills/lib/ScholarTool.js +71 -0
- package/dist/src/skills/lib/ScholarTool.js.map +1 -0
- package/dist/src/skills/types.d.ts +41 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/storage/sqlite.d.ts +8 -0
- package/dist/src/storage/sqlite.js +73 -0
- package/dist/src/storage/sqlite.js.map +1 -0
- package/dist/src/utils/logger.d.ts +12 -0
- package/dist/src/utils/logger.js +53 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/storage/sqlite.d.ts +8 -0
- package/dist/storage/sqlite.js +73 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/skills/agent/PACK.md +13 -0
- package/skills/agent/agent-orchestration/SKILL.md +37 -0
- package/skills/agent/agent-orchestration/index.ts +84 -0
- package/skills/agent/evolution/SKILL.md +25 -0
- package/skills/agent/evolution/index.ts +67 -0
- package/skills/agent/heartbeat/index.ts +48 -0
- package/skills/agent/memory-management/SKILL.md +40 -0
- package/skills/agent/memory-management/index.ts +48 -0
- package/skills/agent/scheduling/SKILL.md +33 -0
- package/skills/agent/scheduling/index.ts +97 -0
- package/skills/agent/session-management/SKILL.md +35 -0
- package/skills/agent/session-management/index.ts +65 -0
- package/skills/agent/skill-management/SKILL.md +31 -0
- package/skills/agent/skill-management/index.ts +32 -0
- package/skills/research/PACK.md +7 -0
- package/skills/research/academic-survey-self-improve/SKILL.md +17 -0
- package/skills/research/academic-survey-self-improve/index.ts +87 -0
- package/skills/research/concept-explainer/SKILL.md +3 -0
- package/skills/research/concept-explainer/index.ts +42 -0
- package/skills/research/literature-review/SKILL.md +25 -0
- package/skills/research/literature-review/index.ts +168 -0
- package/skills/research/paper-analysis/SKILL.md +3 -0
- package/skills/research/paper-analysis/index.ts +73 -0
- package/skills/research/pdf-generator/SKILL.md +16 -0
- package/skills/research/pdf-generator/index.d.ts +10 -0
- package/skills/research/pdf-generator/index.js +114 -0
- package/skills/research/pdf-generator/index.js.map +1 -0
- package/skills/research/pdf-generator/index.ts +97 -0
- package/skills/system/PACK.md +8 -0
- package/skills/system/code-analysis/SKILL.md +43 -0
- package/skills/system/code-analysis/index.ts +180 -0
- package/skills/system/local-file-ops/SKILL.md +55 -0
- package/skills/system/local-file-ops/index.ts +123 -0
- package/skills/vendor/PACK.md +11 -0
- package/skills/vendor/agent-browser/.clawhub/origin.json +7 -0
- package/skills/vendor/agent-browser/CONTRIBUTING.md +63 -0
- package/skills/vendor/agent-browser/SKILL.md +328 -0
- package/skills/vendor/agent-browser/_meta.json +6 -0
- package/skills/vendor/find-skills/.clawhub/origin.json +7 -0
- package/skills/vendor/find-skills/SKILL.md +133 -0
- package/skills/vendor/find-skills/_meta.json +6 -0
- package/skills/vendor/proactive-agent/.clawhub/origin.json +7 -0
- package/skills/vendor/proactive-agent/SKILL-v2.3-backup.md +554 -0
- package/skills/vendor/proactive-agent/SKILL-v3-draft.md +499 -0
- package/skills/vendor/proactive-agent/SKILL.md +632 -0
- package/skills/vendor/proactive-agent/_meta.json +6 -0
- package/skills/vendor/proactive-agent/assets/AGENTS.md +155 -0
- package/skills/vendor/proactive-agent/assets/HEARTBEAT.md +128 -0
- package/skills/vendor/proactive-agent/assets/MEMORY.md +47 -0
- package/skills/vendor/proactive-agent/assets/ONBOARDING.md +103 -0
- package/skills/vendor/proactive-agent/assets/SOUL.md +40 -0
- package/skills/vendor/proactive-agent/assets/TOOLS.md +55 -0
- package/skills/vendor/proactive-agent/assets/USER.md +36 -0
- package/skills/vendor/proactive-agent/references/onboarding-flow.md +158 -0
- package/skills/vendor/proactive-agent/references/security-patterns.md +109 -0
- package/skills/vendor/proactive-agent/scripts/security-audit.sh +149 -0
- package/skills/vendor/searxng/.clawdhub/origin.json +7 -0
- package/skills/vendor/searxng/CHANGELOG.md +38 -0
- package/skills/vendor/searxng/PUBLISH.md +147 -0
- package/skills/vendor/searxng/PUBLISHING_CHECKLIST.md +111 -0
- package/skills/vendor/searxng/README.md +168 -0
- package/skills/vendor/searxng/SKILL.md +69 -0
- package/skills/vendor/searxng/_meta.json +6 -0
- package/skills/vendor/searxng/config/settings.yml +36 -0
- package/skills/vendor/searxng/run-searxng.sh +48 -0
- package/skills/vendor/searxng/scripts/searxng.py +211 -0
- package/skills/vendor/self-improving-agent/.clawhub/origin.json +7 -0
- package/skills/vendor/self-improving-agent/.learnings/ERRORS.md +5 -0
- package/skills/vendor/self-improving-agent/.learnings/FEATURE_REQUESTS.md +5 -0
- package/skills/vendor/self-improving-agent/.learnings/LEARNINGS.md +5 -0
- package/skills/vendor/self-improving-agent/SKILL.md +647 -0
- package/skills/vendor/self-improving-agent/_meta.json +6 -0
- package/skills/vendor/self-improving-agent/assets/LEARNINGS.md +45 -0
- package/skills/vendor/self-improving-agent/assets/SKILL-TEMPLATE.md +177 -0
- package/skills/vendor/self-improving-agent/hooks/openclaw/HOOK.md +23 -0
- package/skills/vendor/self-improving-agent/hooks/openclaw/handler.js +56 -0
- package/skills/vendor/self-improving-agent/hooks/openclaw/handler.ts +62 -0
- package/skills/vendor/self-improving-agent/references/examples.md +374 -0
- package/skills/vendor/self-improving-agent/references/hooks-setup.md +223 -0
- package/skills/vendor/self-improving-agent/references/openclaw-integration.md +248 -0
- package/skills/vendor/self-improving-agent/scripts/activator.sh +20 -0
- package/skills/vendor/self-improving-agent/scripts/error-detector.sh +55 -0
- package/skills/vendor/self-improving-agent/scripts/extract-skill.sh +221 -0
- package/skills/vendor/skill-vetter/.clawhub/origin.json +7 -0
- package/skills/vendor/skill-vetter/SKILL.md +138 -0
- package/skills/vendor/skill-vetter/_meta.json +6 -0
- package/web/README.md +73 -0
- package/web/package.json +65 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Academic Survey Self-Improve
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
Conducts a comprehensive academic survey on a given topic using arXiv and LLM-based analysis. It iteratively refines the search based on initial findings to improve the quality of the survey.
|
|
5
|
+
|
|
6
|
+
## Author
|
|
7
|
+
vixuowis
|
|
8
|
+
|
|
9
|
+
## Version
|
|
10
|
+
0.1.0
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
- `topic`: The research topic to survey.
|
|
14
|
+
- `depth`: (Optional) Depth of the survey (default: "brief").
|
|
15
|
+
|
|
16
|
+
## Tags
|
|
17
|
+
research, survey, academic, self-improve
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class AcademicSurveySelfImproveSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
execute(context: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
8
|
+
private refineQuery;
|
|
9
|
+
private summarizePapers;
|
|
10
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ScholarTool } from '../../../src/skills/lib/ScholarTool.js';
|
|
2
|
+
export default class AcademicSurveySelfImproveSkill {
|
|
3
|
+
id = 'academic_survey_self_improve';
|
|
4
|
+
name = 'Academic Survey (Self-Improve)';
|
|
5
|
+
description = 'Conducts an academic survey and iteratively refines it.';
|
|
6
|
+
tags = ['research', 'survey', 'academic'];
|
|
7
|
+
async execute(context, params) {
|
|
8
|
+
const { topic, depth = 'brief' } = params;
|
|
9
|
+
context.log('thinking', `Starting academic survey on: ${topic}`);
|
|
10
|
+
if (context.updateProgress) {
|
|
11
|
+
await context.updateProgress(10, 'Initializing search', { topic });
|
|
12
|
+
}
|
|
13
|
+
const scholar = new ScholarTool();
|
|
14
|
+
let papers = await scholar.searchPapers(topic, 5);
|
|
15
|
+
if (papers.length === 0) {
|
|
16
|
+
context.log('thinking', 'No papers found. Attempting to broaden search...');
|
|
17
|
+
if (context.updateProgress) {
|
|
18
|
+
await context.updateProgress(30, 'No results found, refining query...', { originalTopic: topic });
|
|
19
|
+
}
|
|
20
|
+
const betterQuery = await this.refineQuery(context, topic);
|
|
21
|
+
if (betterQuery !== topic) {
|
|
22
|
+
context.log('thinking', `Refined query to: ${betterQuery}`);
|
|
23
|
+
if (context.updateProgress) {
|
|
24
|
+
await context.updateProgress(40, `Searching with refined query: ${betterQuery}`);
|
|
25
|
+
}
|
|
26
|
+
papers = await scholar.searchPapers(betterQuery, 5);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (papers.length === 0) {
|
|
30
|
+
if (context.updateProgress) {
|
|
31
|
+
await context.updateProgress(100, 'Survey failed: No papers found');
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
message: 'No papers found even after refinement.',
|
|
36
|
+
papers: []
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
context.log('thinking', `Found ${papers.length} papers. Analyzing...`);
|
|
40
|
+
if (context.updateProgress) {
|
|
41
|
+
await context.updateProgress(60, `Analyzing ${papers.length} papers`, { papers });
|
|
42
|
+
}
|
|
43
|
+
// Summarize
|
|
44
|
+
const summary = await this.summarizePapers(context, topic, papers);
|
|
45
|
+
if (context.updateProgress) {
|
|
46
|
+
await context.updateProgress(100, 'Survey complete');
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
summary,
|
|
51
|
+
papers,
|
|
52
|
+
formatted_output: summary
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async refineQuery(context, originalQuery) {
|
|
56
|
+
const prompt = `The user searched for "${originalQuery}" on arXiv but found no results. Suggest a broader or more effective search query for the same intent. Return ONLY the new query string.`;
|
|
57
|
+
const response = await context.llm.chat([{ role: 'user', content: prompt }]);
|
|
58
|
+
return response.content.trim().replace(/^"|"$/g, '');
|
|
59
|
+
}
|
|
60
|
+
async summarizePapers(context, topic, papers) {
|
|
61
|
+
const papersText = papers.map((p, i) => `[${i + 1}] ${p.title} (${p.year})\nSummary: ${p.summary}`).join('\n\n');
|
|
62
|
+
const prompt = `
|
|
63
|
+
Perform a literature survey on the topic: "${topic}".
|
|
64
|
+
Based on the following papers found:
|
|
65
|
+
|
|
66
|
+
${papersText}
|
|
67
|
+
|
|
68
|
+
Synthesize a coherent summary of the state of research. Highlight key trends, methodologies, and findings.
|
|
69
|
+
Format as Markdown.
|
|
70
|
+
`;
|
|
71
|
+
const response = await context.llm.chat([{ role: 'user', content: prompt }]);
|
|
72
|
+
return response.content;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../skills/research/academic-survey-self-improve/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class ConceptExplainerSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
execute(ctx: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export default class ConceptExplainerSkill {
|
|
2
|
+
id = 'concept_explainer';
|
|
3
|
+
name = 'Concept Explainer';
|
|
4
|
+
description = 'Explain a complex scientific concept';
|
|
5
|
+
tags = ['research', 'education', 'explanation'];
|
|
6
|
+
async execute(ctx, params) {
|
|
7
|
+
const concept = params.concept || params.topic || params.query;
|
|
8
|
+
if (!concept) {
|
|
9
|
+
throw new Error('Concept is required');
|
|
10
|
+
}
|
|
11
|
+
ctx.log('thinking', `Explaining concept: ${concept}`);
|
|
12
|
+
if (ctx.updateProgress)
|
|
13
|
+
await ctx.updateProgress(10, `Researching concept: ${concept}`);
|
|
14
|
+
const prompt = `
|
|
15
|
+
You are an expert science communicator (like Feynman).
|
|
16
|
+
Explain the following concept in a clear, engaging, and depth-first manner: "${concept}"
|
|
17
|
+
|
|
18
|
+
Structure:
|
|
19
|
+
1. **Definition**: Simple, one-sentence definition.
|
|
20
|
+
2. **The "Why"**: Why is this concept important?
|
|
21
|
+
3. **Deep Dive**: How does it work? (Use analogies).
|
|
22
|
+
4. **History**: Who discovered it and when?
|
|
23
|
+
5. **Applications**: Real-world examples.
|
|
24
|
+
6. **Related Concepts**: What else should I know?
|
|
25
|
+
`;
|
|
26
|
+
const response = await ctx.llm.complete(prompt);
|
|
27
|
+
const explanation = response.content;
|
|
28
|
+
if (ctx.updateProgress)
|
|
29
|
+
await ctx.updateProgress(100, `Explanation ready.`);
|
|
30
|
+
return {
|
|
31
|
+
concept,
|
|
32
|
+
explanation,
|
|
33
|
+
formatted_output: `### Concept: ${concept}\n\n${explanation}`
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../skills/research/concept-explainer/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,EAAE,GAAG,mBAAmB,CAAC;IACzB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,WAAW,GAAG,sCAAsC,CAAC;IACrD,IAAI,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAEhD,KAAK,CAAC,OAAO,CAAC,GAAiB,EAAE,MAAmB;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,uBAAuB,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,wBAAwB,OAAO,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG;;qFAEkE,OAAO;;;;;;;;;KASvF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;QAErC,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAE5E,OAAO;YACL,OAAO;YACP,WAAW;YACX,gBAAgB,EAAE,gBAAgB,OAAO,OAAO,WAAW,EAAE;SAC9D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: literature-review
|
|
3
|
+
description: Search for papers and generate a literature review
|
|
4
|
+
tags: [research, literature, review]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Literature Review
|
|
8
|
+
|
|
9
|
+
This skill performs an automated literature review on a given topic.
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
1. **Search**: Queries academic databases (e.g. arXiv, Semantic Scholar) for relevant papers.
|
|
14
|
+
2. **Filter**: Selects the most relevant papers based on the topic.
|
|
15
|
+
3. **Analyze**: Extracts key insights, methodologies, and findings.
|
|
16
|
+
4. **Synthesize**: Generates a comprehensive review summary.
|
|
17
|
+
|
|
18
|
+
## Parameters
|
|
19
|
+
|
|
20
|
+
- `topic` (required): The research topic or question.
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
- "Do a literature review on Large Language Model reasoning"
|
|
25
|
+
- "Survey recent advances in multimodal agents"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class LiteratureReviewSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
private scholar;
|
|
8
|
+
execute(ctx: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ScholarTool } from '../../../src/skills/lib/ScholarTool.js';
|
|
2
|
+
export default class LiteratureReviewSkill {
|
|
3
|
+
id = 'literature_review';
|
|
4
|
+
name = 'Literature Review';
|
|
5
|
+
description = 'Search for papers and generate a literature review';
|
|
6
|
+
tags = ['research', 'literature', 'review'];
|
|
7
|
+
scholar = new ScholarTool();
|
|
8
|
+
async execute(ctx, params) {
|
|
9
|
+
const topic = params.topic;
|
|
10
|
+
if (!topic) {
|
|
11
|
+
throw new Error('Topic is required');
|
|
12
|
+
}
|
|
13
|
+
ctx.log('thinking', `Starting literature review on topic: ${topic}`);
|
|
14
|
+
if (ctx.updateProgress) {
|
|
15
|
+
await ctx.updateProgress(10, `Starting literature review on ${topic}`);
|
|
16
|
+
}
|
|
17
|
+
// 1. Search Papers
|
|
18
|
+
ctx.log('action', 'Initializing academic search');
|
|
19
|
+
ctx.log('tool_call', 'Searching for papers', {
|
|
20
|
+
tool_name: 'ScholarSearch',
|
|
21
|
+
tool_args: { topic, limit: 5 }
|
|
22
|
+
});
|
|
23
|
+
const papers = await this.scholar.searchPapers(topic, 5);
|
|
24
|
+
ctx.log('tool_result', `Found ${papers.length} relevant papers`, {
|
|
25
|
+
tool_name: 'ScholarSearch',
|
|
26
|
+
papers_count: papers.length
|
|
27
|
+
});
|
|
28
|
+
if (ctx.updateProgress) {
|
|
29
|
+
await ctx.updateProgress(50, `Found ${papers.length} papers, analyzing...`);
|
|
30
|
+
}
|
|
31
|
+
// 2. Add to Memory (Memory Injection)
|
|
32
|
+
for (const paper of papers) {
|
|
33
|
+
// Simulate memory addition (in a real scenario, this would persist the paper as a memory)
|
|
34
|
+
// Actually, we can use ctx.memory.addPaper() if available, but SkillContext might not have it directly exposed as `addPaper` if it's generic
|
|
35
|
+
// But we have `memory` which is `MemoryManager`, so we can call it.
|
|
36
|
+
if (ctx.memory && typeof ctx.memory.addPaper === 'function') {
|
|
37
|
+
await ctx.memory.addPaper(ctx.userId, paper.title, paper.authors, paper.url, paper.summary);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// 3. Generate Summary
|
|
41
|
+
ctx.log('thinking', 'Synthesizing literature review');
|
|
42
|
+
if (ctx.updateProgress) {
|
|
43
|
+
await ctx.updateProgress(75, 'Synthesizing literature review...');
|
|
44
|
+
}
|
|
45
|
+
const prompt = `
|
|
46
|
+
You are a rigorous academic researcher.
|
|
47
|
+
Write a literature review summary based on the following papers about "${topic}".
|
|
48
|
+
|
|
49
|
+
CRITICAL INSTRUCTIONS:
|
|
50
|
+
1. ONLY cite papers that are directly relevant to the user's topic.
|
|
51
|
+
2. If a paper in the list below is irrelevant, ignore it completely.
|
|
52
|
+
3. At the end of your summary, provide a "Selected Sources" list containing ONLY the papers you actually used/cited in the text.
|
|
53
|
+
4. Do not include a "Sources" list if you didn't use any.
|
|
54
|
+
|
|
55
|
+
Available Papers:
|
|
56
|
+
${papers.map((p, i) => `[${i + 1}] ${p.title} (${p.year}): ${p.summary}`).join('\n')}
|
|
57
|
+
|
|
58
|
+
Output Format:
|
|
59
|
+
<Summary text with inline citations like [1]>
|
|
60
|
+
|
|
61
|
+
**Selected Sources:**
|
|
62
|
+
[1] Title (Year)
|
|
63
|
+
...
|
|
64
|
+
`;
|
|
65
|
+
const summaryResponse = await ctx.llm.complete(prompt);
|
|
66
|
+
const summary = summaryResponse.content;
|
|
67
|
+
// Parse the LLM response to extract the actually used papers
|
|
68
|
+
// This is a heuristic: we trust the LLM's "Selected Sources" list or we could parse inline citations.
|
|
69
|
+
// For now, let's rely on the LLM's output for the summary, but we need to filter the `papers` array returned in result
|
|
70
|
+
// to match what the user sees.
|
|
71
|
+
// Actually, the `ResearchAgent.ts` constructs the final response string using `result.papers`.
|
|
72
|
+
// So we should update `result.papers` to only include relevant ones.
|
|
73
|
+
// Let's ask the LLM to output a JSON list of indices of used papers to be precise.
|
|
74
|
+
const promptRefinement = `
|
|
75
|
+
Based on the summary you just wrote, which of the provided papers (by index 1-${papers.length}) were actually relevant and cited?
|
|
76
|
+
Return ONLY a JSON array of numbers, e.g., [1, 3, 5]. If none, return [].
|
|
77
|
+
`;
|
|
78
|
+
// This second call might be expensive. Alternatively, we can just ask for the filtered list in the first prompt
|
|
79
|
+
// and parse it. Let's try a single prompt approach with structured output if possible,
|
|
80
|
+
// or just strict formatting.
|
|
81
|
+
// Let's stick to the prompt update above, but we need to parse the "Selected Sources" section
|
|
82
|
+
// to filter the `papers` array returned to the agent.
|
|
83
|
+
// Simple parsing: check if paper title appears in the "Selected Sources" section of the response.
|
|
84
|
+
const relevantPapers = papers.filter(p => summary.includes(p.title));
|
|
85
|
+
// If the heuristic fails (LLM changes title format), we fall back to all papers
|
|
86
|
+
// OR we can just return the summary as is (which includes the sources list)
|
|
87
|
+
// and pass an empty array for papers so the Agent doesn't duplicate the list.
|
|
88
|
+
// ResearchAgent.ts does:
|
|
89
|
+
// const response = ... result.summary ... \n\n**Sources:**\n${result.papers.map(...)}
|
|
90
|
+
// So if we include sources in the summary, we should return empty papers to Agent,
|
|
91
|
+
// OR we strip sources from summary and return filtered papers.
|
|
92
|
+
// Let's strip the "Selected Sources" from the LLM output and return the filtered list.
|
|
93
|
+
let finalSummary = summary;
|
|
94
|
+
let finalPapers = papers;
|
|
95
|
+
if (summary.includes('**Selected Sources:**')) {
|
|
96
|
+
const parts = summary.split('**Selected Sources:**');
|
|
97
|
+
finalSummary = parts[0].trim();
|
|
98
|
+
const sourcesText = parts[1];
|
|
99
|
+
// Filter papers based on what's in sourcesText
|
|
100
|
+
finalPapers = papers.filter(p => sourcesText.includes(p.title) || sourcesText.includes(p.summary.slice(0, 20)));
|
|
101
|
+
}
|
|
102
|
+
else if (summary.includes('Selected Sources:')) {
|
|
103
|
+
const parts = summary.split('Selected Sources:');
|
|
104
|
+
finalSummary = parts[0].trim();
|
|
105
|
+
const sourcesText = parts[1];
|
|
106
|
+
finalPapers = papers.filter(p => sourcesText.includes(p.title) || sourcesText.includes(p.summary.slice(0, 20)));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Fallback: if no explicit sources section, try to filter by inline citations or titles in text
|
|
110
|
+
// This is safer than returning all papers if the user specifically asked to filter.
|
|
111
|
+
// But if LLM didn't follow format, we might lose all sources.
|
|
112
|
+
// Let's keep all papers if format wasn't followed, or maybe try to match titles in summary.
|
|
113
|
+
const papersInText = papers.filter(p => summary.includes(p.title));
|
|
114
|
+
if (papersInText.length > 0) {
|
|
115
|
+
finalPapers = papersInText;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (ctx.updateProgress) {
|
|
119
|
+
await ctx.updateProgress(100, `Completed analysis. Selected ${finalPapers.length} relevant sources.`);
|
|
120
|
+
}
|
|
121
|
+
ctx.log('result', `Completed literature review on ${topic}`, {
|
|
122
|
+
papers_count: finalPapers.length,
|
|
123
|
+
summary_length: finalSummary.length
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
topic,
|
|
127
|
+
summary: finalSummary,
|
|
128
|
+
papers: finalPapers
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../skills/research/literature-review/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class PaperAnalysisSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
private scholar;
|
|
8
|
+
execute(ctx: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ScholarTool } from '../../../src/skills/lib/ScholarTool.js';
|
|
2
|
+
export default class PaperAnalysisSkill {
|
|
3
|
+
id = 'paper_analysis';
|
|
4
|
+
name = 'Paper Analysis';
|
|
5
|
+
description = 'Analyze a scientific paper in depth';
|
|
6
|
+
tags = ['research', 'analysis', 'critique'];
|
|
7
|
+
scholar = new ScholarTool();
|
|
8
|
+
async execute(ctx, params) {
|
|
9
|
+
const paperTitle = params.paper_title || params.title || params.query;
|
|
10
|
+
if (!paperTitle) {
|
|
11
|
+
throw new Error('Paper title is required');
|
|
12
|
+
}
|
|
13
|
+
ctx.log('thinking', `Analyzing paper: ${paperTitle}`);
|
|
14
|
+
if (ctx.updateProgress)
|
|
15
|
+
await ctx.updateProgress(10, `Searching for paper: ${paperTitle}`);
|
|
16
|
+
// 1. Search for the paper to get metadata/summary if we don't have full text
|
|
17
|
+
// In a real system, we might download the PDF here.
|
|
18
|
+
ctx.log('action', 'Searching for paper details...');
|
|
19
|
+
const papers = await this.scholar.searchPapers(paperTitle, 1);
|
|
20
|
+
if (papers.length === 0) {
|
|
21
|
+
throw new Error(`Paper not found: ${paperTitle}`);
|
|
22
|
+
}
|
|
23
|
+
const paper = papers[0];
|
|
24
|
+
ctx.log('thinking', `Found paper: ${paper.title} (${paper.year})`);
|
|
25
|
+
if (ctx.updateProgress)
|
|
26
|
+
await ctx.updateProgress(40, `Found paper: ${paper.title}`);
|
|
27
|
+
// 2. Analyze using LLM
|
|
28
|
+
// Since we can't read the full PDF yet (ScholarTool just gets metadata/abstract),
|
|
29
|
+
// we will ask the LLM to analyze based on its internal knowledge + the abstract.
|
|
30
|
+
// If we had PDF reading capability, we'd feed the text here.
|
|
31
|
+
const prompt = `
|
|
32
|
+
You are an expert research scientist.
|
|
33
|
+
Please perform a deep analysis of the following paper:
|
|
34
|
+
|
|
35
|
+
Title: ${paper.title}
|
|
36
|
+
Authors: ${paper.authors.join(', ')}
|
|
37
|
+
Year: ${paper.year}
|
|
38
|
+
Abstract: ${paper.summary}
|
|
39
|
+
URL: ${paper.url || 'N/A'}
|
|
40
|
+
|
|
41
|
+
If you have internal knowledge about this specific paper (based on title/authors), please use it to enrich the analysis.
|
|
42
|
+
|
|
43
|
+
Structure your response as follows:
|
|
44
|
+
1. **Executive Summary**: 2-3 sentences.
|
|
45
|
+
2. **Key Contributions**: Bullet points.
|
|
46
|
+
3. **Methodology**: How did they do it?
|
|
47
|
+
4. **Results**: What did they find?
|
|
48
|
+
5. **Critique & Limitations**: What are the weaknesses?
|
|
49
|
+
6. **Relevance**: Why does this matter?
|
|
50
|
+
`;
|
|
51
|
+
if (ctx.updateProgress)
|
|
52
|
+
await ctx.updateProgress(60, `Analyzing content...`);
|
|
53
|
+
const response = await ctx.llm.complete(prompt);
|
|
54
|
+
const analysis = response.content;
|
|
55
|
+
if (ctx.updateProgress)
|
|
56
|
+
await ctx.updateProgress(100, `Analysis complete.`);
|
|
57
|
+
return {
|
|
58
|
+
paper: paper,
|
|
59
|
+
analysis: analysis,
|
|
60
|
+
formatted_output: `### Paper Analysis: ${paper.title}\n\n${analysis}\n\n[View Paper](${paper.url})`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../skills/research/paper-analysis/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC,EAAE,GAAG,gBAAgB,CAAC;IACtB,IAAI,GAAG,gBAAgB,CAAC;IACxB,WAAW,GAAG,qCAAqC,CAAC;IACpD,IAAI,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAEpC,KAAK,CAAC,OAAO,CAAC,GAAiB,EAAE,MAAmB;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;QACtE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,oBAAoB,UAAU,EAAE,CAAC,CAAC;QACtD,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,wBAAwB,UAAU,EAAE,CAAC,CAAC;QAE3F,6EAA6E;QAC7E,oDAAoD;QACpD,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,gCAAgC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACnE,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpF,uBAAuB;QACvB,kFAAkF;QAClF,iFAAiF;QACjF,6DAA6D;QAE7D,MAAM,MAAM,GAAG;;;;eAIJ,KAAK,CAAC,KAAK;iBACT,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;cAC3B,KAAK,CAAC,IAAI;kBACN,KAAK,CAAC,OAAO;aAClB,KAAK,CAAC,GAAG,IAAI,KAAK;;;;;;;;;;;KAW1B,CAAC;QAEF,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAE7E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;QAElC,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAE5E,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,uBAAuB,KAAK,CAAC,KAAK,OAAO,QAAQ,oBAAoB,KAAK,CAAC,GAAG,GAAG;SACpG,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# PDF Generator (LaTeX)
|
|
2
|
+
|
|
3
|
+
Generate high-quality PDF documents from text or markdown using LaTeX.
|
|
4
|
+
This skill creates a `.tex` file and compiles it to PDF.
|
|
5
|
+
|
|
6
|
+
## Dependencies
|
|
7
|
+
- `pdflatex` must be installed on the system (e.g., via TeX Live or MacTeX).
|
|
8
|
+
- Node.js `child_process` to run the command.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
Provide the `content` (markdown or plain text) and a `title`.
|
|
12
|
+
The skill will:
|
|
13
|
+
1. Convert the content to LaTeX format (using a template).
|
|
14
|
+
2. Write the `.tex` file.
|
|
15
|
+
3. Run `pdflatex` to generate the PDF.
|
|
16
|
+
4. Return the path to the generated PDF.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class PdfGeneratorSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
private workspaceDir;
|
|
8
|
+
constructor();
|
|
9
|
+
execute(ctx: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
import PDFDocument from 'pdfkit';
|
|
5
|
+
export default class PdfGeneratorSkill {
|
|
6
|
+
id = 'pdf_generator';
|
|
7
|
+
name = 'PDF Generator';
|
|
8
|
+
description = 'Generate a PDF from text/markdown using PDFKit';
|
|
9
|
+
tags = ['research', 'document', 'pdf'];
|
|
10
|
+
workspaceDir;
|
|
11
|
+
constructor() {
|
|
12
|
+
// Ensure output directory exists
|
|
13
|
+
this.workspaceDir = path.resolve(process.cwd(), 'workspace/output/pdfs');
|
|
14
|
+
}
|
|
15
|
+
async execute(ctx, params) {
|
|
16
|
+
const { title, content, author = 'Redigg AI' } = params;
|
|
17
|
+
if (!content) {
|
|
18
|
+
throw new Error('Content is required to generate PDF');
|
|
19
|
+
}
|
|
20
|
+
// Ensure output directory exists
|
|
21
|
+
if (!fs.existsSync(this.workspaceDir)) {
|
|
22
|
+
fs.mkdirSync(this.workspaceDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
ctx.log('thinking', `Generating PDF for "${title || 'Untitled'}"`);
|
|
25
|
+
if (ctx.updateProgress)
|
|
26
|
+
await ctx.updateProgress(10, `Initializing PDF document...`);
|
|
27
|
+
const filename = (title || 'document').replace(/[^a-z0-9]/gi, '_').toLowerCase() + '_' + uuidv4().slice(0, 8);
|
|
28
|
+
const pdfPath = path.join(this.workspaceDir, `${filename}.pdf`);
|
|
29
|
+
// Create a document
|
|
30
|
+
const doc = new PDFDocument({ margin: 50 });
|
|
31
|
+
const stream = fs.createWriteStream(pdfPath);
|
|
32
|
+
doc.pipe(stream);
|
|
33
|
+
// Title Page
|
|
34
|
+
doc.fontSize(24).text(title || 'Research Report', { align: 'center' });
|
|
35
|
+
doc.moveDown();
|
|
36
|
+
doc.fontSize(14).text(`Author: ${author}`, { align: 'center' });
|
|
37
|
+
doc.fontSize(12).text(`Date: ${new Date().toLocaleDateString()}`, { align: 'center' });
|
|
38
|
+
doc.moveDown(2);
|
|
39
|
+
// Content Rendering (Simple Markdown Parser)
|
|
40
|
+
const lines = content.split('\n');
|
|
41
|
+
let inList = false;
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (trimmed.startsWith('# ')) {
|
|
45
|
+
doc.addPage(); // New page for main chapters? Maybe just space
|
|
46
|
+
doc.fontSize(20).text(trimmed.substring(2), { underline: true });
|
|
47
|
+
doc.moveDown(0.5);
|
|
48
|
+
}
|
|
49
|
+
else if (trimmed.startsWith('## ')) {
|
|
50
|
+
doc.fontSize(16).text(trimmed.substring(3));
|
|
51
|
+
doc.moveDown(0.5);
|
|
52
|
+
}
|
|
53
|
+
else if (trimmed.startsWith('### ')) {
|
|
54
|
+
doc.fontSize(14).text(trimmed.substring(4));
|
|
55
|
+
doc.moveDown(0.5);
|
|
56
|
+
}
|
|
57
|
+
else if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {
|
|
58
|
+
doc.fontSize(12).text(`• ${trimmed.substring(2)}`, { indent: 20 });
|
|
59
|
+
}
|
|
60
|
+
else if (trimmed.match(/^\d+\./)) {
|
|
61
|
+
doc.fontSize(12).text(trimmed, { indent: 20 });
|
|
62
|
+
}
|
|
63
|
+
else if (trimmed === '') {
|
|
64
|
+
doc.moveDown(0.5);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Normal paragraph
|
|
68
|
+
// Handle bold **text** (simple regex replace won't work easily with pdfkit text flow without mixed fonts)
|
|
69
|
+
// For now, just render plain text
|
|
70
|
+
doc.fontSize(12).text(line, { align: 'justify' });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Finalize PDF file
|
|
74
|
+
doc.end();
|
|
75
|
+
if (ctx.updateProgress)
|
|
76
|
+
await ctx.updateProgress(100, `PDF Generated.`);
|
|
77
|
+
// Return relative path for frontend to access (assuming static serve)
|
|
78
|
+
// We need to make sure the workspace/output is served by express.
|
|
79
|
+
const relativeUrl = `/files/pdfs/${filename}.pdf`;
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
file_path: pdfPath,
|
|
83
|
+
url: relativeUrl,
|
|
84
|
+
formatted_output: `### PDF Generated\n\n[Download PDF](${relativeUrl})`
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../skills/research/pdf-generator/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,WAAW,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,EAAE,GAAG,eAAe,CAAC;IACrB,IAAI,GAAG,eAAe,CAAC;IACvB,WAAW,GAAG,gDAAgD,CAAC;IAC/D,IAAI,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAE/B,YAAY,CAAS;IAE7B;QACE,iCAAiC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAiB,EAAE,MAAmB;QAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,uBAAuB,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC;QACnE,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAErF,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;QAEhE,oBAAoB;QACpB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjB,aAAa;QACb,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACf,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEhB,6CAA6C;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,+CAA+C;gBAC9D,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9D,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACJ,mBAAmB;gBACnB,0GAA0G;gBAC1G,kCAAkC;gBAClC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,GAAG,CAAC,GAAG,EAAE,CAAC;QAEV,IAAI,GAAG,CAAC,cAAc;YAAE,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAExE,sEAAsE;QACtE,kEAAkE;QAClE,MAAM,WAAW,GAAG,eAAe,QAAQ,MAAM,CAAC;QAElD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO;YAClB,GAAG,EAAE,WAAW;YAChB,gBAAgB,EAAE,uCAAuC,WAAW,GAAG;SACxE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-analysis
|
|
3
|
+
description: Analyze project structure, scan codebase stats, and summarize code files
|
|
4
|
+
tags: [code, analysis, summary, scan]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Code Analysis
|
|
8
|
+
|
|
9
|
+
This skill provides capabilities to analyze the codebase structure, scan for overall statistics, and summarize individual files.
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
Use this skill when the user asks to:
|
|
14
|
+
- Understand the project structure
|
|
15
|
+
- Get an overview of the codebase (size, languages, key files)
|
|
16
|
+
- Summarize what a specific file does
|
|
17
|
+
- Analyze code statistics (SLOC, imports, exports)
|
|
18
|
+
|
|
19
|
+
## Actions
|
|
20
|
+
|
|
21
|
+
### structure
|
|
22
|
+
Recursively lists the file structure of the project, ignoring `node_modules` and hidden files.
|
|
23
|
+
|
|
24
|
+
**Parameters:**
|
|
25
|
+
- `path` (optional): The root directory to analyze. Defaults to current working directory.
|
|
26
|
+
|
|
27
|
+
### scan
|
|
28
|
+
Scans the codebase to provide a high-level summary including total files, directories, size, SLOC, and language breakdown.
|
|
29
|
+
|
|
30
|
+
**Parameters:**
|
|
31
|
+
- `path` (optional): The root directory to scan. Defaults to current working directory.
|
|
32
|
+
|
|
33
|
+
### summarize
|
|
34
|
+
Provides a summary of a specific code file or directory. For files, it may use LLM to generate a description.
|
|
35
|
+
|
|
36
|
+
**Parameters:**
|
|
37
|
+
- `path` (required): The path to the file or directory to summarize.
|
|
38
|
+
|
|
39
|
+
## Examples
|
|
40
|
+
|
|
41
|
+
- "Show me the project structure" -> `structure`
|
|
42
|
+
- "Scan the codebase" -> `scan`
|
|
43
|
+
- "Analyze src/index.ts" -> `summarize(path="src/index.ts")`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Skill, SkillContext, SkillParams, SkillResult } from '../../../src/skills/types.js';
|
|
2
|
+
export default class CodeAnalysisSkill implements Skill {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
execute(ctx: SkillContext, params: SkillParams): Promise<SkillResult>;
|
|
8
|
+
private getProjectStructure;
|
|
9
|
+
private scanCodebase;
|
|
10
|
+
private traverse;
|
|
11
|
+
private summarizeCode;
|
|
12
|
+
}
|