open-research 0.1.25 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -18
- package/builtin-skills/novelty-checker/SKILL.md +79 -0
- package/builtin-skills/paper-explainer/SKILL.md +83 -21
- package/builtin-skills/reviewer-response/SKILL.md +99 -0
- package/builtin-skills/skill-creator/SKILL.md +98 -7
- package/dist/chunk-AYB7CAO5.js +128 -0
- package/dist/cli.js +3893 -1895
- package/dist/sessions-FMB5GHSR.js +10 -0
- package/package.json +1 -1
- package/builtin-skills/literature-reviewer/SKILL.md +0 -72
- package/builtin-skills/synthesis-updater/SKILL.md +0 -43
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
// src/lib/workspace/sessions.ts
|
|
9
|
+
import fs from "fs/promises";
|
|
10
|
+
import path2 from "path";
|
|
11
|
+
|
|
12
|
+
// src/lib/fs/paths.ts
|
|
13
|
+
import os from "os";
|
|
14
|
+
import path from "path";
|
|
15
|
+
function resolveHomeDir(options) {
|
|
16
|
+
return options?.homeDir ?? os.homedir();
|
|
17
|
+
}
|
|
18
|
+
function getOpenResearchRoot(options) {
|
|
19
|
+
return path.join(resolveHomeDir(options), ".open-research");
|
|
20
|
+
}
|
|
21
|
+
function getOpenResearchAuthFile(options) {
|
|
22
|
+
return path.join(getOpenResearchRoot(options), "auth.json");
|
|
23
|
+
}
|
|
24
|
+
function getOpenResearchConfigFile(options) {
|
|
25
|
+
return path.join(getOpenResearchRoot(options), "config.json");
|
|
26
|
+
}
|
|
27
|
+
function getOpenResearchSkillsDir(options) {
|
|
28
|
+
return path.join(getOpenResearchRoot(options), "skills");
|
|
29
|
+
}
|
|
30
|
+
function getWorkspaceMetaDir(workspaceDir) {
|
|
31
|
+
return path.join(workspaceDir, ".open-research");
|
|
32
|
+
}
|
|
33
|
+
function getWorkspaceProjectFile(workspaceDir) {
|
|
34
|
+
return path.join(getWorkspaceMetaDir(workspaceDir), "project.json");
|
|
35
|
+
}
|
|
36
|
+
function getWorkspaceSessionsDir(workspaceDir) {
|
|
37
|
+
return path.join(getWorkspaceMetaDir(workspaceDir), "sessions");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/lib/workspace/sessions.ts
|
|
41
|
+
async function appendSessionEvent(workspaceDir, sessionId, event) {
|
|
42
|
+
const sessionsDir = getWorkspaceSessionsDir(workspaceDir);
|
|
43
|
+
await fs.mkdir(sessionsDir, { recursive: true });
|
|
44
|
+
const sessionFile = path2.join(sessionsDir, `${sessionId}.jsonl`);
|
|
45
|
+
await fs.appendFile(sessionFile, `${JSON.stringify(event)}
|
|
46
|
+
`, "utf8");
|
|
47
|
+
}
|
|
48
|
+
function parseEvents(raw) {
|
|
49
|
+
return raw.split("\n").filter(Boolean).map((line) => {
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(line);
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}).filter((e) => e !== null);
|
|
56
|
+
}
|
|
57
|
+
async function listSessions(workspaceDir) {
|
|
58
|
+
const sessionsDir = getWorkspaceSessionsDir(workspaceDir);
|
|
59
|
+
let files;
|
|
60
|
+
try {
|
|
61
|
+
files = await fs.readdir(sessionsDir);
|
|
62
|
+
} catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const sessions = [];
|
|
66
|
+
for (const file of files) {
|
|
67
|
+
if (!file.endsWith(".jsonl")) continue;
|
|
68
|
+
const id = file.replace(/\.jsonl$/, "");
|
|
69
|
+
const raw = await fs.readFile(path2.join(sessionsDir, file), "utf8");
|
|
70
|
+
const events = parseEvents(raw);
|
|
71
|
+
if (events.length === 0) continue;
|
|
72
|
+
const chatTurns = events.filter((e) => e.type === "chat.turn");
|
|
73
|
+
const firstTurn = chatTurns[0];
|
|
74
|
+
const preview = firstTurn ? String(firstTurn.payload.prompt ?? "").slice(0, 80) : "(empty session)";
|
|
75
|
+
sessions.push({
|
|
76
|
+
id,
|
|
77
|
+
startedAt: events[0].timestamp,
|
|
78
|
+
lastActivity: events[events.length - 1].timestamp,
|
|
79
|
+
preview,
|
|
80
|
+
turnCount: chatTurns.length
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
sessions.sort(
|
|
84
|
+
(a, b) => new Date(b.lastActivity).getTime() - new Date(a.lastActivity).getTime()
|
|
85
|
+
);
|
|
86
|
+
return sessions;
|
|
87
|
+
}
|
|
88
|
+
async function loadSessionHistory(workspaceDir, sessionId) {
|
|
89
|
+
const sessionsDir = getWorkspaceSessionsDir(workspaceDir);
|
|
90
|
+
const sessionFile = path2.join(sessionsDir, `${sessionId}.jsonl`);
|
|
91
|
+
const raw = await fs.readFile(sessionFile, "utf8");
|
|
92
|
+
const events = parseEvents(raw);
|
|
93
|
+
const messages = [];
|
|
94
|
+
const llmHistory = [];
|
|
95
|
+
for (const event of events) {
|
|
96
|
+
if (event.type === "chat.turn") {
|
|
97
|
+
const payload = event.payload;
|
|
98
|
+
const prompt = String(payload.prompt ?? "");
|
|
99
|
+
const response = String(payload.response ?? "");
|
|
100
|
+
messages.push({ role: "user", text: prompt });
|
|
101
|
+
messages.push({ role: "assistant", text: response });
|
|
102
|
+
llmHistory.push({ role: "user", content: prompt });
|
|
103
|
+
llmHistory.push({ role: "assistant", content: response });
|
|
104
|
+
}
|
|
105
|
+
if (event.type === "history.snapshot") {
|
|
106
|
+
const payload = event.payload;
|
|
107
|
+
if (payload.llmHistory) {
|
|
108
|
+
llmHistory.length = 0;
|
|
109
|
+
llmHistory.push(...payload.llmHistory);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { messages, llmHistory };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export {
|
|
117
|
+
__require,
|
|
118
|
+
getOpenResearchRoot,
|
|
119
|
+
getOpenResearchAuthFile,
|
|
120
|
+
getOpenResearchConfigFile,
|
|
121
|
+
getOpenResearchSkillsDir,
|
|
122
|
+
getWorkspaceMetaDir,
|
|
123
|
+
getWorkspaceProjectFile,
|
|
124
|
+
getWorkspaceSessionsDir,
|
|
125
|
+
appendSessionEvent,
|
|
126
|
+
listSessions,
|
|
127
|
+
loadSessionHistory
|
|
128
|
+
};
|