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 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 text2 = part.text;
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 (!role) {
100
- await debugLog(directory, `[prompt-recorder] WARNING: role not found, messageID=${messageID}, sessionID=${sessionID}, textPreview=${text2.substring(0, 30)}`);
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=${text2.length}, textPreview=${text2.substring(0, 50)}`);
108
- const now2 = /* @__PURE__ */ new Date();
109
- const { yyyy: yyyy2, MM: MM2, dd: dd2, HH: HH2, mm: mm2 } = formatDate(now2);
110
- const promptDir2 = join(directory, ".agent", "prompts", yyyy2, MM2, dd2);
111
- await mkdir(promptDir2, { recursive: true });
112
- const existingFile2 = await findExistingFile(directory, sessionID);
113
- const time2 = formatTime(now2);
114
- const dateStr2 = `${yyyy2}${MM2}${dd2}`;
115
- const timeTitle2 = `============ ${time2} ============`;
116
- const fileContent2 = existingFile2 ? `
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
- ${timeTitle2}
115
+ ${timeTitle}
119
116
 
120
- ${text2}` : `${timeTitle2}
117
+ ${text}` : `${timeTitle}
121
118
 
122
- ${text2}`;
123
- if (existingFile2) {
124
- await appendFile(existingFile2, fileContent2);
119
+ ${text}`;
120
+ if (existingFile) {
121
+ await appendFile(existingFile, fileContent);
125
122
  } else {
126
- const topic2 = sanitizeFilename(text2);
127
- const filename = `${dateStr2}-${HH2}${mm2}-${sessionID}-${topic2}.md`;
128
- const filepath = join(promptDir2, filename);
129
- await appendFile(filepath, fileContent2);
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 !== "session.updated") {
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.4.0",
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.4.0",
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",