opencode-prompt-recorder 1.8.1 → 1.8.3
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 +9 -11
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import{mkdir as
|
|
2
|
-
`;try{let
|
|
3
|
-
`)[0].trim().replace(/<[^>]*>/g,"").replace(/\s+/g," ").trim().replace(
|
|
1
|
+
import{mkdir as q,appendFile as H,writeFile as ke,readFile as De,rename as Y,readdir as Me}from"fs/promises";import{join as g,dirname as Se,basename as Pe}from"path";import{readFile as fe,rm as de}from"fs/promises";import{basename as M,dirname as w,join as U}from"path";import{fileURLToPath as pe}from"url";var le="opencode-prompt-recorder",K=!1;function Z(s,e){if(!e||K)return;K=!0;let n=new AbortController,o=setTimeout(()=>n.abort(),1e4);ge(n.signal).then(r=>{r.updated&&setTimeout(()=>{s.client.tui.showToast({body:{title:"Prompt Recorder \u66F4\u65B0",message:`${r.name} \u5DF2\u4ECE ${r.current} \u66F4\u65B0\u5230 ${r.latest}\uFF0C\u91CD\u542F OpenCode \u5B8C\u6210\u66F4\u65B0`,variant:"info"}})},5e3)}).catch(r=>{console.error("[prompt-recorder] auto-update check failed:",r)}).finally(()=>clearTimeout(o))}async function ge(s){let e=await me(le);if(!e)return{updated:!1};let n=await L(U(e,"package.json"));if(!n?.name||!n.version)return{updated:!1};let o=await $e(n.name,s);if(!o||!be(o,n.version))return{updated:!1};let r=await ye(e,n.name);if(!r)return{updated:!1};try{await de(r,{recursive:!0,force:!0})}catch{return{updated:!1,error:"remove_failed",name:n.name,current:n.version,latest:o}}return{updated:!0,name:n.name,current:n.version,latest:o}}async function me(s){let e=w(pe(import.meta.url));for(;;){if((await L(U(e,"package.json")))?.name===s)return M(e)==="dist"?w(e):e;let o=w(e);if(o===e)return;e=o}}async function ye(s,e){let n=w(s),o=M(n).startsWith("@")?w(n):n;if(M(o)!=="node_modules")return;let r=w(o),c=await L(U(r,"package.json")),u=he(r,e)??c?.dependencies?.[e];if(!(!u||!we(u)))return r}function he(s,e){if(e.startsWith("@")){let[r,c]=e.split("/");if(!r||!c||M(w(s))!==r)return;let u=`${c}@`,m=M(s);return m.startsWith(u)?m.slice(u.length):void 0}let n=`${e}@`,o=M(s);return o.startsWith(n)?o.slice(n.length):void 0}function we(s){let e=s.trim();return e?!!(e==="latest"||e==="*"||/^[~^]/.test(e)||/^(?:>=|>|<=|<)/.test(e)||/\s+(?:\|\||-|[<>=])\s+/.test(e)):!1}async function L(s){try{let e=JSON.parse(await fe(s,"utf-8"));return e&&typeof e=="object"?e:void 0}catch{return}}async function $e(s,e){try{let n=await fetch(`https://registry.npmjs.org/${encodeURIComponent(s)}/latest`,{signal:e});if(!n.ok)return;let o=await n.json();if(!o||typeof o!="object")return;let r=o.version;return typeof r=="string"?r:void 0}catch{return}}function be(s,e){let n=V(s),o=V(e);if(!n||!o)return!1;for(let r=0;r<3;r++)if(n.parts[r]!==o.parts[r])return n.parts[r]>o.parts[r];if(!n.pre.length&&o.pre.length)return!0;if(n.pre.length&&!o.pre.length)return!1;for(let r=0;r<Math.max(n.pre.length,o.pre.length);r++){let c=n.pre[r],u=o.pre[r];if(c===void 0)return!1;if(u===void 0)return!0;if(c===u)continue;let m=/^\d+$/.test(c)?Number(c):void 0,y=/^\d+$/.test(u)?Number(u):void 0;return m!==void 0&&y!==void 0?m>y:m!==void 0?!1:y!==void 0?!0:c>u}return!1}function V(s){let e=s.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+.+)?$/);if(e)return{parts:[Number(e[1]),Number(e[2]),Number(e[3])],pre:e[4]?.split(".")??[]}}async function N(s,e){if(process.env.PROMPT_RECORDER_DEBUG!=="1"&&process.env.PROMPT_RECORDER_DEBUG!=="true")return;let o=`[${new Date().toISOString()}] ${e}
|
|
2
|
+
`;try{let r=g(s,".agent","prompts-log");await q(r,{recursive:!0}),await H(g(r,"log.txt"),o)}catch(r){console.error("debugLog failed:",r)}}var Ee=/[<>:"/\\|?*\x00-\x1f\u200B-\u200F\u2028-\u202E\uFEFF]/g;function j(s){return s.split(`
|
|
3
|
+
`)[0].trim().replace(/<[^>]*>/g,"").replace(/\s+/g," ").trim().replace(Ee,"").substring(0,40).trim()||"untitled"}function Ae(s){let e=s.trimStart();return e.startsWith("<system-reminder>")||e.startsWith("<system>")}function Ie(s){let e=s.getFullYear().toString(),n=String(s.getMonth()+1).padStart(2,"0"),o=String(s.getDate()).padStart(2,"0"),r=String(s.getHours()).padStart(2,"0"),c=String(s.getMinutes()).padStart(2,"0"),u=String(s.getSeconds()).padStart(2,"0");return{yyyy:e,MM:n,dd:o,HH:r,mm:c,ss:u}}var T=".txt";async function _e(s,e){return Q(g(s,".agent","prompts"),e)}async function Q(s,e){let n;try{n=await Me(s)}catch{return}for(let o of n){let r=g(s,o);try{if((await De(r,"utf-8")).includes(`SessionID: ${e}`))return r}catch{if(o.endsWith(T))continue;let c=await Q(r,e);if(c)return c}}}var ve=async s=>{Z(s,!0);let{directory:e}=s,n=new Map,o=new Map,r=new Map,c=new Map,u=1440*60*1e3,m=200,y=2e3,S=1440*60*1e3,ee=3600*1e3,p=new Map,$=new Map,x=new Map;function te(){if(p.size<m)return;let a=Date.now();for(let[t,i]of p)a-i.time>u&&p.delete(t)}function ne(){let a=Date.now();if(r.size>y)for(let[t,i]of r)a-i>S&&r.delete(t);if(o.size>y)for(let[t,i]of o)a-i.time>S&&o.delete(t);if(c.size>y)for(let[t,i]of c)a-i>S&&c.delete(t);if(n.size>y)for(let[t,i]of n)a-i.time>S&&n.delete(t);if($.size>0)for(let[t,i]of $)a-i.time>ee&&$.delete(t)}async function P(a,t){let i=Se(a.filepath),f=Pe(a.filepath).match(/^(\d{10})-/);if(!f)return;let d=g(i,`${f[1]}-${j(t)}${T}`);if(d!==a.filepath)try{await Y(a.filepath,d),a.filepath=d}catch{let E=crypto.randomUUID().slice(0,8),A=g(i,`${f[1]}-${j(t)}-${E}${T}`);try{await Y(a.filepath,A),a.filepath=A}catch(b){console.error(`[prompt-recorder] rename failed: ${a.filepath}`,b)}}}async function re(a){let t=a.properties.info,i=t?.id,l=t?.role||t?.message?.role;i&&l==="user"&&o.set(i,{role:l,time:Date.now()})}async function ie(a){let t=a.properties.part;if(t?.type==="tool"&&t?.tool==="task"){let h=t.state?.metadata??t.metadata;if(h){let k=h.sessionId??h.sessionID;k&&(c.set(k,Date.now()),await N(e,`[prompt-recorder] tracked task session: ${k}`))}}if(t?.type!=="text"||!t?.text||t.synthetic||t.ignored)return;let i=t.sessionID,l=t.messageID,f=t.text,d=o.get(l)?.role;if(d||(d=t.message?.role),d||(d=a.properties.info?.role),d||(d=a.properties.info?.message?.role),d!=="user"||!f||!i)return;if(Ae(f)){await N(e,`[prompt-recorder] filtered system-injected: sessionID=${i}`);return}let E=l?`${l}:${f}`:`${i}:${f}`;if(r.has(E))return;r.set(E,Date.now()),ne(),await N(e,`[prompt-recorder] event=${a.type}, role=${d}, sessionID=${i}, textLength=${f.length}, textPreview=${f.substring(0,50)}`);let A=new Date,{yyyy:b,MM:I,dd:_,HH:z,mm:O,ss:ae}=Ie(A),W=g(e,".agent","prompts"),G=c.has(i)?g(W,"task",b,I,_):g(W,b,I,_);await q(G,{recursive:!0});let ce=b.slice(-2),F=`============ ${b}-${I}-${_} ${z}:${O}:${ae} ============`,C=p.get(i);if(C)C.time=Date.now(),await H(C.filepath,`
|
|
4
4
|
|
|
5
|
-
${
|
|
5
|
+
${F}
|
|
6
6
|
|
|
7
|
-
${
|
|
7
|
+
${f}`);else{let h=await _e(e,i);if(h)p.set(i,{filepath:h,time:Date.now()}),await H(h,`
|
|
8
8
|
|
|
9
|
-
${
|
|
9
|
+
${F}
|
|
10
10
|
|
|
11
|
-
${
|
|
11
|
+
${f}`);else{let X=j(n.get(i)?.title??f),D=`${ce}${I}${_}${z}${O}-${X}${T}`,v=g(G,D),R=`============ SessionID: ${i} ============`;await ke(v,`${R}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
${F}
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
\u4F5C\u8005\uFF1Aanarckk
|
|
17
|
-
\u9879\u76EE\u5730\u5740\uFF1Ahttps://github.com/anarckk/opencode-prompt-recorder`;try{if(await te(r,"utf-8")===p)return}catch{}await j(t,{recursive:!0}),await q(r,p)}catch{}}async function de(a){let t=a.properties.info;if(t?.id&&t?.title){let r=n.get(t.id)?.title;if(n.set(t.id,{title:t.title,time:Date.now()}),r!==t.title){let p=m.get(t.id);p?await S(p,t.title):h.set(t.id,{title:t.title,time:Date.now()})}}}return{event:async({event:a})=>{switch(a.type){case"message.updated":await oe(a);break;case"message.part.updated":await ae(a);break;case"session.created":await ce(a);break;case"session.updated":await de(a);break}}}},Ge=Ce;export{Ge as default};
|
|
15
|
+
${f}`),p.set(i,{filepath:v,time:Date.now()}),te();let J=$.get(i);if(J){$.delete(i);let B=p.get(i);B&&await P(B,J.title)}}let k=x.get(i);k&&clearTimeout(k);let ue=setTimeout(async()=>{x.delete(i);try{let D=(await s.client.session.get({path:{id:i}}))?.data?.title;if(!D)return;let v=n.get(i)?.title;if(D===v)return;n.set(i,{title:D,time:Date.now()});let R=p.get(i);R&&await P(R,D)}catch{}},5e3);x.set(i,ue)}}async function se(a){let t=a.properties.info;if(t?.id&&t?.title){n.set(t.id,{title:t.title,time:Date.now()});let i=p.get(t.id);i&&await P(i,t.title)}}async function oe(a){let t=a.properties.info;if(t?.id&&t?.title){let i=n.get(t.id)?.title;if(n.set(t.id,{title:t.title,time:Date.now()}),i!==t.title){let l=p.get(t.id);l?await P(l,t.title):$.set(t.id,{title:t.title,time:Date.now()})}}}return{event:async({event:a})=>{switch(a.type){case"message.updated":await re(a);break;case"message.part.updated":await ie(a);break;case"session.created":await se(a);break;case"session.updated":await oe(a);break}}}},je=ve;export{je as default};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-prompt-recorder",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.3",
|
|
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.8.
|
|
3
|
+
"version": "1.8.3",
|
|
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",
|