opencode-prompt-recorder 1.4.0 → 1.5.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 +23 -76
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -64,9 +64,7 @@ async function findExistingFile(directory, sessionId) {
|
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
66
|
var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
67
|
-
let lastUserMessage = "";
|
|
68
67
|
let versionFileWritten = false;
|
|
69
|
-
let lastProcessedMessageCount = 0;
|
|
70
68
|
const messageRoleMap = /* @__PURE__ */ new Map();
|
|
71
69
|
const processedMessageKeys = /* @__PURE__ */ new Set();
|
|
72
70
|
return {
|
|
@@ -80,12 +78,10 @@ var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
|
80
78
|
}
|
|
81
79
|
if (event.type === "message.part.updated") {
|
|
82
80
|
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
81
|
if (part?.type === "text" && part?.text) {
|
|
86
82
|
const sessionID = part.sessionID;
|
|
87
83
|
const messageID = part.messageID;
|
|
88
|
-
const
|
|
84
|
+
const text = part.text;
|
|
89
85
|
let role = messageRoleMap.get(messageID);
|
|
90
86
|
if (!role) {
|
|
91
87
|
role = part.message?.role;
|
|
@@ -96,50 +92,40 @@ var OpenCodePromptRecorder = async ({ directory, client }) => {
|
|
|
96
92
|
if (!role) {
|
|
97
93
|
role = event.properties.info?.message?.role;
|
|
98
94
|
}
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
} else if (role === "user" && text2 && sessionID) {
|
|
102
|
-
const dedupeKey = `${messageID}:${text2}`;
|
|
95
|
+
if (role === "user" && text && sessionID) {
|
|
96
|
+
const dedupeKey = `${messageID}:${text}`;
|
|
103
97
|
if (processedMessageKeys.has(dedupeKey)) {
|
|
104
98
|
return;
|
|
105
99
|
}
|
|
106
100
|
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
|
|
101
|
+
await debugLog(directory, `[prompt-recorder] event=${event.type}, role=${role}, sessionID=${sessionID}, textLength=${text.length}, textPreview=${text.substring(0, 50)}`);
|
|
102
|
+
const now = /* @__PURE__ */ new Date();
|
|
103
|
+
const { yyyy, MM, dd, HH, mm } = formatDate(now);
|
|
104
|
+
const promptDir = join(directory, ".agent", "prompts", yyyy, MM, dd);
|
|
105
|
+
await mkdir(promptDir, { recursive: true });
|
|
106
|
+
const existingFile = await findExistingFile(directory, sessionID);
|
|
107
|
+
const time = formatTime(now);
|
|
108
|
+
const dateStr = `${yyyy}${MM}${dd}`;
|
|
109
|
+
const timeTitle = `============ ${time} ============`;
|
|
110
|
+
const fileContent = existingFile ? `
|
|
117
111
|
|
|
118
|
-
${
|
|
112
|
+
${timeTitle}
|
|
119
113
|
|
|
120
|
-
${
|
|
114
|
+
${text}` : `${timeTitle}
|
|
121
115
|
|
|
122
|
-
${
|
|
123
|
-
if (
|
|
124
|
-
await appendFile(
|
|
116
|
+
${text}`;
|
|
117
|
+
if (existingFile) {
|
|
118
|
+
await appendFile(existingFile, fileContent);
|
|
125
119
|
} else {
|
|
126
|
-
const
|
|
127
|
-
const filename = `${
|
|
128
|
-
const filepath = join(
|
|
129
|
-
await appendFile(filepath,
|
|
120
|
+
const topic = sanitizeFilename(text);
|
|
121
|
+
const filename = `${dateStr}-${HH}${mm}-${sessionID}-${topic}.md`;
|
|
122
|
+
const filepath = join(promptDir, filename);
|
|
123
|
+
await appendFile(filepath, fileContent);
|
|
130
124
|
}
|
|
131
125
|
}
|
|
132
126
|
}
|
|
133
127
|
}
|
|
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) {
|
|
128
|
+
if (event.type === "session.updated" && !versionFileWritten) {
|
|
143
129
|
try {
|
|
144
130
|
const version = await getVersion();
|
|
145
131
|
const readmeDir = join(directory, ".agent");
|
|
@@ -165,45 +151,6 @@ ${text2}`;
|
|
|
165
151
|
} catch (e) {
|
|
166
152
|
}
|
|
167
153
|
}
|
|
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
154
|
}
|
|
208
155
|
};
|
|
209
156
|
};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-prompt-recorder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.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.5.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",
|