opencode-prompt-recorder 1.4.0 → 1.6.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/dist/index.js +26 -76
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,6 +4,9 @@ import { join, dirname } from "path";
|
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
var __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
6
|
async function debugLog(directory, msg) {
|
|
7
|
+
if (process.env.PROMPT_RECORDER_DEBUG !== "1" && process.env.PROMPT_RECORDER_DEBUG !== "true") {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
7
10
|
const time = (/* @__PURE__ */ new Date()).toISOString();
|
|
8
11
|
const logLine = `[${time}] ${msg}
|
|
9
12
|
`;
|
|
@@ -64,9 +67,7 @@ async function findExistingFile(directory, sessionId) {
|
|
|
64
67
|
return null;
|
|
65
68
|
}
|
|
66
69
|
var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
67
|
-
let lastUserMessage = "";
|
|
68
70
|
let versionFileWritten = false;
|
|
69
|
-
let lastProcessedMessageCount = 0;
|
|
70
71
|
const messageRoleMap = /* @__PURE__ */ new Map();
|
|
71
72
|
const processedMessageKeys = /* @__PURE__ */ new Set();
|
|
72
73
|
return {
|
|
@@ -80,12 +81,10 @@ var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
|
80
81
|
}
|
|
81
82
|
if (event.type === "message.part.updated") {
|
|
82
83
|
const part = event.properties.part;
|
|
83
|
-
const props = event.properties;
|
|
84
|
-
await debugLog(directory, `[prompt-recorder] message.part.updated: type=${part?.type}, messageID=${part?.messageID}, sessionID=${part?.sessionID}, info.role=${props.info?.role}, info.message.role=${props.info?.message?.role}`);
|
|
85
84
|
if (part?.type === "text" && part?.text) {
|
|
86
85
|
const sessionID = part.sessionID;
|
|
87
86
|
const messageID = part.messageID;
|
|
88
|
-
const
|
|
87
|
+
const text = part.text;
|
|
89
88
|
let role = messageRoleMap.get(messageID);
|
|
90
89
|
if (!role) {
|
|
91
90
|
role = part.message?.role;
|
|
@@ -96,50 +95,40 @@ var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
|
96
95
|
if (!role) {
|
|
97
96
|
role = event.properties.info?.message?.role;
|
|
98
97
|
}
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
} else if (role === "user" && text2 && sessionID) {
|
|
102
|
-
const dedupeKey = `${messageID}:${text2}`;
|
|
98
|
+
if (role === "user" && text && sessionID) {
|
|
99
|
+
const dedupeKey = `${messageID}:${text}`;
|
|
103
100
|
if (processedMessageKeys.has(dedupeKey)) {
|
|
104
101
|
return;
|
|
105
102
|
}
|
|
106
103
|
processedMessageKeys.add(dedupeKey);
|
|
107
|
-
await debugLog(directory, `[prompt-recorder] event=${event.type}, role=${role}, sessionID=${sessionID}, textLength=${
|
|
108
|
-
const
|
|
109
|
-
const { yyyy
|
|
110
|
-
const
|
|
111
|
-
await mkdir(
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
104
|
+
await debugLog(directory, `[prompt-recorder] event=${event.type}, role=${role}, sessionID=${sessionID}, textLength=${text.length}, textPreview=${text.substring(0, 50)}`);
|
|
105
|
+
const now = /* @__PURE__ */ new Date();
|
|
106
|
+
const { yyyy, MM, dd, HH, mm } = formatDate(now);
|
|
107
|
+
const promptDir = join(directory, ".agent", "prompts", yyyy, MM, dd);
|
|
108
|
+
await mkdir(promptDir, { recursive: true });
|
|
109
|
+
const existingFile = await findExistingFile(directory, sessionID);
|
|
110
|
+
const time = formatTime(now);
|
|
111
|
+
const dateStr = `${yyyy}${MM}${dd}`;
|
|
112
|
+
const timeTitle = `============ ${time} ============`;
|
|
113
|
+
const fileContent = existingFile ? `
|
|
117
114
|
|
|
118
|
-
${
|
|
115
|
+
${timeTitle}
|
|
119
116
|
|
|
120
|
-
${
|
|
117
|
+
${text}` : `${timeTitle}
|
|
121
118
|
|
|
122
|
-
${
|
|
123
|
-
if (
|
|
124
|
-
await appendFile(
|
|
119
|
+
${text}`;
|
|
120
|
+
if (existingFile) {
|
|
121
|
+
await appendFile(existingFile, fileContent);
|
|
125
122
|
} else {
|
|
126
|
-
const
|
|
127
|
-
const filename = `${
|
|
128
|
-
const filepath = join(
|
|
129
|
-
await appendFile(filepath,
|
|
123
|
+
const topic = sanitizeFilename(text);
|
|
124
|
+
const filename = `${dateStr}-${HH}${mm}-${sessionID}-${topic}.md`;
|
|
125
|
+
const filepath = join(promptDir, filename);
|
|
126
|
+
await appendFile(filepath, fileContent);
|
|
130
127
|
}
|
|
131
128
|
}
|
|
132
129
|
}
|
|
133
130
|
}
|
|
134
|
-
if (event.type
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const sessionInfo = event.properties.info;
|
|
138
|
-
const sessionId = sessionInfo?.id;
|
|
139
|
-
const messages = sessionInfo?.messages || [];
|
|
140
|
-
const messageCount = messages.length;
|
|
141
|
-
await debugLog(directory, `[prompt-recorder] session.updated: sessionId=${sessionId}, messageCount=${messageCount}, lastProcessed=${lastProcessedMessageCount}`);
|
|
142
|
-
if (!versionFileWritten) {
|
|
131
|
+
if (event.type === "session.updated" && !versionFileWritten) {
|
|
143
132
|
try {
|
|
144
133
|
const version = await getVersion();
|
|
145
134
|
const readmeDir = join(directory, ".agent");
|
|
@@ -165,45 +154,6 @@ ${text2}`;
|
|
|
165
154
|
} catch (e) {
|
|
166
155
|
}
|
|
167
156
|
}
|
|
168
|
-
if (messageCount <= lastProcessedMessageCount) {
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
const latestMessage = messages[messages.length - 1];
|
|
172
|
-
if (latestMessage?.role !== "user") {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
const text = latestMessage.parts.map((p) => p.type === "text" ? p.text : "").join("");
|
|
176
|
-
if (!text || !sessionId) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (text === lastUserMessage) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const now = /* @__PURE__ */ new Date();
|
|
183
|
-
const { yyyy, MM, dd, HH, mm } = formatDate(now);
|
|
184
|
-
const topic = sanitizeFilename(text);
|
|
185
|
-
const promptDir = join(directory, ".agent", "prompts", yyyy, MM, dd);
|
|
186
|
-
await mkdir(promptDir, { recursive: true });
|
|
187
|
-
const existingFile = await findExistingFile(directory, sessionId);
|
|
188
|
-
const time = formatTime(now);
|
|
189
|
-
const dateStr = `${yyyy}${MM}${dd}`;
|
|
190
|
-
const timeTitle = `============ ${time} ============`;
|
|
191
|
-
const fileContent = existingFile ? `
|
|
192
|
-
|
|
193
|
-
${timeTitle}
|
|
194
|
-
|
|
195
|
-
${text}` : `${timeTitle}
|
|
196
|
-
|
|
197
|
-
${text}`;
|
|
198
|
-
if (existingFile) {
|
|
199
|
-
await appendFile(existingFile, fileContent);
|
|
200
|
-
} else {
|
|
201
|
-
const filename = `${dateStr}-${HH}${mm}-${sessionId}-${topic}.md`;
|
|
202
|
-
const filepath = join(promptDir, filename);
|
|
203
|
-
await appendFile(filepath, fileContent);
|
|
204
|
-
}
|
|
205
|
-
lastUserMessage = text;
|
|
206
|
-
lastProcessedMessageCount = messageCount;
|
|
207
157
|
}
|
|
208
158
|
};
|
|
209
159
|
};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-prompt-recorder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "OpenCode plugin for recording user prompts. Automatically saves user messages to a local file system with organized directory structure.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-prompt-recorder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "OpenCode plugin for recording user prompts. Automatically saves user messages to a local file system with organized directory structure.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|