grix-connector
Version:
Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.
2 lines (1 loc) • 2.12 kB
JavaScript
import{readdirSync as p,statSync as f}from"node:fs";import l from"node:path";import{resolveCodexHome as y}from"./codex-trust.js";import{log as h}from"../../core/log/index.js";import{readFirstLines as g}from"../../core/util/read-first-lines.js";function d(s,i="rollout-"){const n=[];let e;try{e=p(s,{withFileTypes:!0})}catch{return n}for(const o of e){const a=l.join(s,o.name);o.isDirectory()?n.push(...d(a,i)):o.isFile()&&o.name.startsWith(i)&&o.name.endsWith(".jsonl")&&n.push(a)}return n}const m=100;function v(s){const i=s.replace(/\[\[message_id:[^\]]+\]\]/g,"").replace(/\s+/g," ").trim();if(i)return i.length>m?i.slice(0,m)+"\u2026":i}function _(s){for(const i of s.slice(1))try{const n=JSON.parse(i);if(n.type==="event_msg"&&n.payload?.type==="user_message"){const e=n.payload.message;if(typeof e=="string"&&e.trim())return v(e)}}catch{}}function u(s){try{const i=f(s),n=g(s,131072);if(n.length===0)return null;const e=JSON.parse(n[0]);if(e.type!=="session_meta"||!e.payload?.id)return null;const o=_(n);let a=e.payload.cwd||"";if(!a)for(const c of n.slice(1,80))try{const r=JSON.parse(c);if(r.type==="turn_context"&&r.payload?.cwd){a=r.payload.cwd;break}}catch{}return{meta:{id:e.payload.id,timestamp:e.payload.timestamp,cwd:a,originator:e.payload.originator,cli_version:e.payload.cli_version},title:o,mtimeMs:Math.round(i.mtimeMs)}}catch{return null}}function M(s){const i=y(s),n=l.join(i,"sessions"),e=l.join(i,"archived_sessions"),o=[],a=d(n);for(const r of a){const t=u(r);t&&o.push({threadId:t.meta.id,cwd:t.meta.cwd||"",title:t.title,originator:t.meta.originator,cliVersion:t.meta.cli_version,createdAt:new Date(t.meta.timestamp).getTime(),updatedAt:t.mtimeMs,archived:!1,filePath:r})}const c=d(e);for(const r of c){const t=u(r);t&&o.push({threadId:t.meta.id,cwd:t.meta.cwd||"",title:t.title,originator:t.meta.originator,cliVersion:t.meta.cli_version,createdAt:new Date(t.meta.timestamp).getTime(),updatedAt:t.mtimeMs,archived:!0,filePath:r})}return o.sort((r,t)=>t.updatedAt-r.updatedAt),h.info("codex-session-scanner",`Scanned ${o.length} Codex sessions from ${i}`),o}export{M as scanCodexSessions};